/*** Autogenerated by WIDL 11.5 from include/windows.ui.notifications.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_notifications_h__
#define __windows_ui_notifications_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent ABI::Windows::UI::Notifications::IAdaptiveNotificationContent
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IAdaptiveNotificationContent;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText ABI::Windows::UI::Notifications::IAdaptiveNotificationText
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IAdaptiveNotificationText;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification ABI::Windows::UI::Notifications::IBadgeNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory ABI::Windows::UI::Notifications::IBadgeNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser ABI::Windows::UI::Notifications::IBadgeUpdateManagerForUser
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeUpdateManagerForUser;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics ABI::Windows::UI::Notifications::IBadgeUpdateManagerStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeUpdateManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2 __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2 ABI::Windows::UI::Notifications::IBadgeUpdateManagerStatics2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeUpdateManagerStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater ABI::Windows::UI::Notifications::IBadgeUpdater
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeUpdater;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics ABI::Windows::UI::Notifications::IKnownAdaptiveNotificationHintsStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IKnownAdaptiveNotificationHintsStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics ABI::Windows::UI::Notifications::IKnownAdaptiveNotificationTextStylesStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IKnownAdaptiveNotificationTextStylesStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics ABI::Windows::UI::Notifications::IKnownNotificationBindingsStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IKnownNotificationBindingsStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CINotification __x_ABI_CWindows_CUI_CNotifications_CINotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CINotification ABI::Windows::UI::Notifications::INotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface INotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding ABI::Windows::UI::Notifications::INotificationBinding
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface INotificationBinding;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationData_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationData_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CINotificationData __x_ABI_CWindows_CUI_CNotifications_CINotificationData;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData ABI::Windows::UI::Notifications::INotificationData
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface INotificationData;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory ABI::Windows::UI::Notifications::INotificationDataFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface INotificationDataFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual ABI::Windows::UI::Notifications::INotificationVisual
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface INotificationVisual;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification ABI::Windows::UI::Notifications::IScheduledTileNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledTileNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory ABI::Windows::UI::Notifications::IScheduledTileNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledTileNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification ABI::Windows::UI::Notifications::IScheduledToastNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 ABI::Windows::UI::Notifications::IScheduledToastNotification2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotification2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 ABI::Windows::UI::Notifications::IScheduledToastNotification3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotification3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4 __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4 ABI::Windows::UI::Notifications::IScheduledToastNotification4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotification4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory ABI::Windows::UI::Notifications::IScheduledToastNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs ABI::Windows::UI::Notifications::IScheduledToastNotificationShowingEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotificationShowingEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification ABI::Windows::UI::Notifications::IShownTileNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IShownTileNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification ABI::Windows::UI::Notifications::ITileFlyoutNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileFlyoutNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory ABI::Windows::UI::Notifications::ITileFlyoutNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileFlyoutNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics ABI::Windows::UI::Notifications::ITileFlyoutUpdateManagerStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileFlyoutUpdateManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater ABI::Windows::UI::Notifications::ITileFlyoutUpdater
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileFlyoutUpdater;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileNotification __x_ABI_CWindows_CUI_CNotifications_CITileNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification ABI::Windows::UI::Notifications::ITileNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory ABI::Windows::UI::Notifications::ITileNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser ABI::Windows::UI::Notifications::ITileUpdateManagerForUser
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileUpdateManagerForUser;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics ABI::Windows::UI::Notifications::ITileUpdateManagerStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileUpdateManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2 __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2 ABI::Windows::UI::Notifications::ITileUpdateManagerStatics2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileUpdateManagerStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdater __x_ABI_CWindows_CUI_CNotifications_CITileUpdater;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater ABI::Windows::UI::Notifications::ITileUpdater
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileUpdater;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 ABI::Windows::UI::Notifications::ITileUpdater2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileUpdater2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs ABI::Windows::UI::Notifications::IToastActivatedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastActivatedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2 __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2 ABI::Windows::UI::Notifications::IToastActivatedEventArgs2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastActivatedEventArgs2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastCollection_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastCollection_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastCollection __x_ABI_CWindows_CUI_CNotifications_CIToastCollection;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection ABI::Windows::UI::Notifications::IToastCollection
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastCollection;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory ABI::Windows::UI::Notifications::IToastCollectionFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastCollectionFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager ABI::Windows::UI::Notifications::IToastCollectionManager
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastCollectionManager;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs ABI::Windows::UI::Notifications::IToastDismissedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastDismissedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs ABI::Windows::UI::Notifications::IToastFailedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastFailedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification __x_ABI_CWindows_CUI_CNotifications_CIToastNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification ABI::Windows::UI::Notifications::IToastNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 ABI::Windows::UI::Notifications::IToastNotification2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotification2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 ABI::Windows::UI::Notifications::IToastNotification3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotification3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 ABI::Windows::UI::Notifications::IToastNotification4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotification4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6 ABI::Windows::UI::Notifications::IToastNotification6
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotification6;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail ABI::Windows::UI::Notifications::IToastNotificationActionTriggerDetail
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationActionTriggerDetail;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory ABI::Windows::UI::Notifications::IToastNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory ABI::Windows::UI::Notifications::IToastNotificationHistory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationHistory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2 ABI::Windows::UI::Notifications::IToastNotificationHistory2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationHistory2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail ABI::Windows::UI::Notifications::IToastNotificationHistoryChangedTriggerDetail
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationHistoryChangedTriggerDetail;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2 ABI::Windows::UI::Notifications::IToastNotificationHistoryChangedTriggerDetail2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationHistoryChangedTriggerDetail2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser ABI::Windows::UI::Notifications::IToastNotificationManagerForUser
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerForUser;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 ABI::Windows::UI::Notifications::IToastNotificationManagerForUser2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerForUser2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 ABI::Windows::UI::Notifications::IToastNotificationManagerForUser3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerForUser3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics ABI::Windows::UI::Notifications::IToastNotificationManagerStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2 ABI::Windows::UI::Notifications::IToastNotificationManagerStatics2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4 ABI::Windows::UI::Notifications::IToastNotificationManagerStatics4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerStatics4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5 ABI::Windows::UI::Notifications::IToastNotificationManagerStatics5
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerStatics5;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier ABI::Windows::UI::Notifications::IToastNotifier
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotifier;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2 ABI::Windows::UI::Notifications::IToastNotifier2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotifier2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3 __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3 ABI::Windows::UI::Notifications::IToastNotifier3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotifier3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIUserNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIUserNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIUserNotification __x_ABI_CWindows_CUI_CNotifications_CIUserNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification ABI::Windows::UI::Notifications::IUserNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IUserNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs ABI::Windows::UI::Notifications::IUserNotificationChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IUserNotificationChangedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationText_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationText_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class AdaptiveNotificationText;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationText __x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationText;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationText_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CBadgeNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CBadgeNotification_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class BadgeNotification;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CBadgeNotification __x_ABI_CWindows_CUI_CNotifications_CBadgeNotification;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CBadgeNotification_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CBadgeUpdateManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CBadgeUpdateManager_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class BadgeUpdateManager;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CBadgeUpdateManager __x_ABI_CWindows_CUI_CNotifications_CBadgeUpdateManager;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CBadgeUpdateManager_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CBadgeUpdateManagerForUser_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CBadgeUpdateManagerForUser_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class BadgeUpdateManagerForUser;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CBadgeUpdateManagerForUser __x_ABI_CWindows_CUI_CNotifications_CBadgeUpdateManagerForUser;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CBadgeUpdateManagerForUser_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CBadgeUpdater_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CBadgeUpdater_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class BadgeUpdater;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CBadgeUpdater __x_ABI_CWindows_CUI_CNotifications_CBadgeUpdater;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CBadgeUpdater_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CKnownAdaptiveNotificationHints_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CKnownAdaptiveNotificationHints_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class KnownAdaptiveNotificationHints;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CKnownAdaptiveNotificationHints __x_ABI_CWindows_CUI_CNotifications_CKnownAdaptiveNotificationHints;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CKnownAdaptiveNotificationHints_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CKnownAdaptiveNotificationTextStyles_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CKnownAdaptiveNotificationTextStyles_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class KnownAdaptiveNotificationTextStyles;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CKnownAdaptiveNotificationTextStyles __x_ABI_CWindows_CUI_CNotifications_CKnownAdaptiveNotificationTextStyles;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CKnownAdaptiveNotificationTextStyles_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CKnownNotificationBindings_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CKnownNotificationBindings_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class KnownNotificationBindings;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CKnownNotificationBindings __x_ABI_CWindows_CUI_CNotifications_CKnownNotificationBindings;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CKnownNotificationBindings_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CNotification_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class Notification;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CNotification __x_ABI_CWindows_CUI_CNotifications_CNotification;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CNotification_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CNotificationBinding_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CNotificationBinding_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class NotificationBinding;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CNotificationBinding __x_ABI_CWindows_CUI_CNotifications_CNotificationBinding;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CNotificationBinding_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CNotificationData_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CNotificationData_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class NotificationData;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CNotificationData __x_ABI_CWindows_CUI_CNotifications_CNotificationData;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CNotificationData_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CNotificationVisual_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CNotificationVisual_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class NotificationVisual;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CNotificationVisual __x_ABI_CWindows_CUI_CNotifications_CNotificationVisual;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CNotificationVisual_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CScheduledTileNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CScheduledTileNotification_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ScheduledTileNotification;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CScheduledTileNotification __x_ABI_CWindows_CUI_CNotifications_CScheduledTileNotification;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CScheduledTileNotification_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CScheduledToastNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CScheduledToastNotification_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ScheduledToastNotification;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CScheduledToastNotification __x_ABI_CWindows_CUI_CNotifications_CScheduledToastNotification;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CScheduledToastNotification_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CScheduledToastNotificationShowingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CScheduledToastNotificationShowingEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ScheduledToastNotificationShowingEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CScheduledToastNotificationShowingEventArgs __x_ABI_CWindows_CUI_CNotifications_CScheduledToastNotificationShowingEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CScheduledToastNotificationShowingEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CShownTileNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CShownTileNotification_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ShownTileNotification;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CShownTileNotification __x_ABI_CWindows_CUI_CNotifications_CShownTileNotification;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CShownTileNotification_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutNotification_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class TileFlyoutNotification;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutNotification __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutNotification;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutNotification_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutUpdateManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutUpdateManager_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class TileFlyoutUpdateManager;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutUpdateManager __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutUpdateManager;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutUpdateManager_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutUpdater_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutUpdater_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class TileFlyoutUpdater;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutUpdater __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutUpdater;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutUpdater_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CTileNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CTileNotification_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class TileNotification;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CTileNotification __x_ABI_CWindows_CUI_CNotifications_CTileNotification;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CTileNotification_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CTileUpdateManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CTileUpdateManager_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class TileUpdateManager;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CTileUpdateManager __x_ABI_CWindows_CUI_CNotifications_CTileUpdateManager;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CTileUpdateManager_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CTileUpdateManagerForUser_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CTileUpdateManagerForUser_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class TileUpdateManagerForUser;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CTileUpdateManagerForUser __x_ABI_CWindows_CUI_CNotifications_CTileUpdateManagerForUser;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CTileUpdateManagerForUser_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CTileUpdater_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CTileUpdater_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class TileUpdater;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CTileUpdater __x_ABI_CWindows_CUI_CNotifications_CTileUpdater;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CTileUpdater_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastActivatedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastActivatedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastActivatedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastActivatedEventArgs __x_ABI_CWindows_CUI_CNotifications_CToastActivatedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastActivatedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastCollection_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastCollection_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastCollection;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastCollection __x_ABI_CWindows_CUI_CNotifications_CToastCollection;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastCollection_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastCollectionManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastCollectionManager_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastCollectionManager;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastCollectionManager __x_ABI_CWindows_CUI_CNotifications_CToastCollectionManager;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastCollectionManager_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastDismissedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastDismissedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastDismissedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastDismissedEventArgs __x_ABI_CWindows_CUI_CNotifications_CToastDismissedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastDismissedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastFailedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastFailedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastFailedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastFailedEventArgs __x_ABI_CWindows_CUI_CNotifications_CToastFailedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastFailedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastNotification_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastNotification;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastNotification __x_ABI_CWindows_CUI_CNotifications_CToastNotification;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastNotification_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationActionTriggerDetail_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationActionTriggerDetail_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastNotificationActionTriggerDetail;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastNotificationActionTriggerDetail __x_ABI_CWindows_CUI_CNotifications_CToastNotificationActionTriggerDetail;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationActionTriggerDetail_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationHistory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationHistory_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastNotificationHistory;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastNotificationHistory __x_ABI_CWindows_CUI_CNotifications_CToastNotificationHistory;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationHistory_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationHistoryChangedTriggerDetail_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationHistoryChangedTriggerDetail_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastNotificationHistoryChangedTriggerDetail;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastNotificationHistoryChangedTriggerDetail __x_ABI_CWindows_CUI_CNotifications_CToastNotificationHistoryChangedTriggerDetail;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationHistoryChangedTriggerDetail_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationManager_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastNotificationManager;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastNotificationManager __x_ABI_CWindows_CUI_CNotifications_CToastNotificationManager;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationManager_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationManagerForUser_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationManagerForUser_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastNotificationManagerForUser;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastNotificationManagerForUser __x_ABI_CWindows_CUI_CNotifications_CToastNotificationManagerForUser;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationManagerForUser_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastNotifier_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastNotifier_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastNotifier;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastNotifier __x_ABI_CWindows_CUI_CNotifications_CToastNotifier;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastNotifier_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CUserNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CUserNotification_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class UserNotification;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CUserNotification __x_ABI_CWindows_CUI_CNotifications_CUserNotification;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CUserNotification_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class UserNotificationChangedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedEventArgs __x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedEventArgs_FWD_DEFINED__ */

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::AdaptiveNotificationText* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::NotificationBinding* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::ScheduledTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::ScheduledToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::ShownTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CToastCollection __FIIterable_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::ToastCollection* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CToastNotification __FIIterable_1_Windows__CUI__CNotifications__CToastNotification;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CToastNotification ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::ToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CUserNotification __FIIterable_1_Windows__CUI__CNotifications__CUserNotification;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CUserNotification ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::UserNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::AdaptiveNotificationText* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::NotificationBinding* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::ScheduledTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::ScheduledToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::ShownTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CToastCollection __FIIterator_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::ToastCollection* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CToastNotification __FIIterator_1_Windows__CUI__CNotifications__CToastNotification;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::ToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CUserNotification __FIIterator_1_Windows__CUI__CNotifications__CUserNotification;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::UserNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::AdaptiveNotificationText* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::NotificationBinding* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ScheduledTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ScheduledToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ShownTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
#define ____FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding;
#ifdef __cplusplus
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding ABI::Windows::Foundation::Collections::IVector<ABI::Windows::UI::Notifications::NotificationBinding* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
#define ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
typedef interface __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification;
#ifdef __cplusplus
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Notifications::ToastCollection* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotificationHistory* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotifier* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastCollection* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotificationHistory* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotifier* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastDismissedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastFailedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotificationManagerForUser*,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotifier*,ABI::Windows::UI::Notifications::ScheduledToastNotificationShowingEventArgs* >
#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.applicationmodel.h>
#include <windows.data.xml.dom.h>
#include <windows.system.h>

#ifdef __cplusplus
extern "C" {
#endif

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

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationContentKind_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationContentKind_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum AdaptiveNotificationContentKind {
                    AdaptiveNotificationContentKind_Text = 0
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationContentKind {
    AdaptiveNotificationContentKind_Text = 0
};
#ifdef WIDL_using_Windows_UI_Notifications
#define AdaptiveNotificationContentKind __x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationContentKind
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* ____x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationContentKind_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationContentKind __x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationContentKind;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CBadgeTemplateType_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CBadgeTemplateType_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum BadgeTemplateType {
                    BadgeTemplateType_BadgeGlyph = 0,
                    BadgeTemplateType_BadgeNumber = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CBadgeTemplateType {
    BadgeTemplateType_BadgeGlyph = 0,
    BadgeTemplateType_BadgeNumber = 1
};
#ifdef WIDL_using_Windows_UI_Notifications
#define BadgeTemplateType __x_ABI_CWindows_CUI_CNotifications_CBadgeTemplateType
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* ____x_ABI_CWindows_CUI_CNotifications_CBadgeTemplateType_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CBadgeTemplateType __x_ABI_CWindows_CUI_CNotifications_CBadgeTemplateType;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CNotificationKinds_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CNotificationKinds_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum NotificationKinds {
                    NotificationKinds_Unknown = 0x0,
                    NotificationKinds_Toast = 0x1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CNotificationKinds {
    NotificationKinds_Unknown = 0x0,
    NotificationKinds_Toast = 0x1
};
#ifdef WIDL_using_Windows_UI_Notifications
#define NotificationKinds __x_ABI_CWindows_CUI_CNotifications_CNotificationKinds
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* ____x_ABI_CWindows_CUI_CNotifications_CNotificationKinds_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CNotificationKinds __x_ABI_CWindows_CUI_CNotifications_CNotificationKinds;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum NotificationMirroring {
                    NotificationMirroring_Allowed = 0,
                    NotificationMirroring_Disabled = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring {
    NotificationMirroring_Allowed = 0,
    NotificationMirroring_Disabled = 1
};
#ifdef WIDL_using_Windows_UI_Notifications
#define NotificationMirroring __x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* ____x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring __x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CNotificationSetting_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CNotificationSetting_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum NotificationSetting {
                    NotificationSetting_Enabled = 0,
                    NotificationSetting_DisabledForApplication = 1,
                    NotificationSetting_DisabledForUser = 2,
                    NotificationSetting_DisabledByGroupPolicy = 3,
                    NotificationSetting_DisabledByManifest = 4
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CNotificationSetting {
    NotificationSetting_Enabled = 0,
    NotificationSetting_DisabledForApplication = 1,
    NotificationSetting_DisabledForUser = 2,
    NotificationSetting_DisabledByGroupPolicy = 3,
    NotificationSetting_DisabledByManifest = 4
};
#ifdef WIDL_using_Windows_UI_Notifications
#define NotificationSetting __x_ABI_CWindows_CUI_CNotifications_CNotificationSetting
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* ____x_ABI_CWindows_CUI_CNotifications_CNotificationSetting_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CNotificationSetting __x_ABI_CWindows_CUI_CNotifications_CNotificationSetting;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CNotificationUpdateResult_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CNotificationUpdateResult_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum NotificationUpdateResult {
                    NotificationUpdateResult_Succeeded = 0,
                    NotificationUpdateResult_Failed = 1,
                    NotificationUpdateResult_NotificationNotFound = 2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CNotificationUpdateResult {
    NotificationUpdateResult_Succeeded = 0,
    NotificationUpdateResult_Failed = 1,
    NotificationUpdateResult_NotificationNotFound = 2
};
#ifdef WIDL_using_Windows_UI_Notifications
#define NotificationUpdateResult __x_ABI_CWindows_CUI_CNotifications_CNotificationUpdateResult
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* ____x_ABI_CWindows_CUI_CNotifications_CNotificationUpdateResult_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CNotificationUpdateResult __x_ABI_CWindows_CUI_CNotifications_CNotificationUpdateResult;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum PeriodicUpdateRecurrence {
                    PeriodicUpdateRecurrence_HalfHour = 0,
                    PeriodicUpdateRecurrence_Hour = 1,
                    PeriodicUpdateRecurrence_SixHours = 2,
                    PeriodicUpdateRecurrence_TwelveHours = 3,
                    PeriodicUpdateRecurrence_Daily = 4
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence {
    PeriodicUpdateRecurrence_HalfHour = 0,
    PeriodicUpdateRecurrence_Hour = 1,
    PeriodicUpdateRecurrence_SixHours = 2,
    PeriodicUpdateRecurrence_TwelveHours = 3,
    PeriodicUpdateRecurrence_Daily = 4
};
#ifdef WIDL_using_Windows_UI_Notifications
#define PeriodicUpdateRecurrence __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* ____x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutTemplateType_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutTemplateType_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum TileFlyoutTemplateType {
                    TileFlyoutTemplateType_TileFlyoutTemplate01 = 0
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutTemplateType {
    TileFlyoutTemplateType_TileFlyoutTemplate01 = 0
};
#ifdef WIDL_using_Windows_UI_Notifications
#define TileFlyoutTemplateType __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutTemplateType
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutTemplateType_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutTemplateType __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutTemplateType;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CTileTemplateType_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CTileTemplateType_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum TileTemplateType {
                    TileTemplateType_TileSquareImage = 0,
                    TileTemplateType_TileSquareBlock = 1,
                    TileTemplateType_TileSquareText01 = 2,
                    TileTemplateType_TileSquareText02 = 3,
                    TileTemplateType_TileSquareText03 = 4,
                    TileTemplateType_TileSquareText04 = 5,
                    TileTemplateType_TileSquarePeekImageAndText01 = 6,
                    TileTemplateType_TileSquarePeekImageAndText02 = 7,
                    TileTemplateType_TileSquarePeekImageAndText03 = 8,
                    TileTemplateType_TileSquarePeekImageAndText04 = 9,
                    TileTemplateType_TileWideImage = 10,
                    TileTemplateType_TileWideImageCollection = 11,
                    TileTemplateType_TileWideImageAndText01 = 12,
                    TileTemplateType_TileWideImageAndText02 = 13,
                    TileTemplateType_TileWideBlockAndText01 = 14,
                    TileTemplateType_TileWideBlockAndText02 = 15,
                    TileTemplateType_TileWidePeekImageCollection01 = 16,
                    TileTemplateType_TileWidePeekImageCollection02 = 17,
                    TileTemplateType_TileWidePeekImageCollection03 = 18,
                    TileTemplateType_TileWidePeekImageCollection04 = 19,
                    TileTemplateType_TileWidePeekImageCollection05 = 20,
                    TileTemplateType_TileWidePeekImageCollection06 = 21,
                    TileTemplateType_TileWidePeekImageAndText01 = 22,
                    TileTemplateType_TileWidePeekImageAndText02 = 23,
                    TileTemplateType_TileWidePeekImage01 = 24,
                    TileTemplateType_TileWidePeekImage02 = 25,
                    TileTemplateType_TileWidePeekImage03 = 26,
                    TileTemplateType_TileWidePeekImage04 = 27,
                    TileTemplateType_TileWidePeekImage05 = 28,
                    TileTemplateType_TileWidePeekImage06 = 29,
                    TileTemplateType_TileWideSmallImageAndText01 = 30,
                    TileTemplateType_TileWideSmallImageAndText02 = 31,
                    TileTemplateType_TileWideSmallImageAndText03 = 32,
                    TileTemplateType_TileWideSmallImageAndText04 = 33,
                    TileTemplateType_TileWideSmallImageAndText05 = 34,
                    TileTemplateType_TileWideText01 = 35,
                    TileTemplateType_TileWideText02 = 36,
                    TileTemplateType_TileWideText03 = 37,
                    TileTemplateType_TileWideText04 = 38,
                    TileTemplateType_TileWideText05 = 39,
                    TileTemplateType_TileWideText06 = 40,
                    TileTemplateType_TileWideText07 = 41,
                    TileTemplateType_TileWideText08 = 42,
                    TileTemplateType_TileWideText09 = 43,
                    TileTemplateType_TileWideText10 = 44,
                    TileTemplateType_TileWideText11 = 45,
                    TileTemplateType_TileSquare150x150Image = 0,
                    TileTemplateType_TileSquare150x150Block = 1,
                    TileTemplateType_TileSquare150x150Text01 = 2,
                    TileTemplateType_TileSquare150x150Text02 = 3,
                    TileTemplateType_TileSquare150x150Text03 = 4,
                    TileTemplateType_TileSquare150x150Text04 = 5,
                    TileTemplateType_TileSquare150x150PeekImageAndText01 = 6,
                    TileTemplateType_TileSquare150x150PeekImageAndText02 = 7,
                    TileTemplateType_TileSquare150x150PeekImageAndText03 = 8,
                    TileTemplateType_TileSquare150x150PeekImageAndText04 = 9,
                    TileTemplateType_TileWide310x150Image = 10,
                    TileTemplateType_TileWide310x150ImageCollection = 11,
                    TileTemplateType_TileWide310x150ImageAndText01 = 12,
                    TileTemplateType_TileWide310x150ImageAndText02 = 13,
                    TileTemplateType_TileWide310x150BlockAndText01 = 14,
                    TileTemplateType_TileWide310x150BlockAndText02 = 15,
                    TileTemplateType_TileWide310x150PeekImageCollection01 = 16,
                    TileTemplateType_TileWide310x150PeekImageCollection02 = 17,
                    TileTemplateType_TileWide310x150PeekImageCollection03 = 18,
                    TileTemplateType_TileWide310x150PeekImageCollection04 = 19,
                    TileTemplateType_TileWide310x150PeekImageCollection05 = 20,
                    TileTemplateType_TileWide310x150PeekImageCollection06 = 21,
                    TileTemplateType_TileWide310x150PeekImageAndText01 = 22,
                    TileTemplateType_TileWide310x150PeekImageAndText02 = 23,
                    TileTemplateType_TileWide310x150PeekImage01 = 24,
                    TileTemplateType_TileWide310x150PeekImage02 = 25,
                    TileTemplateType_TileWide310x150PeekImage03 = 26,
                    TileTemplateType_TileWide310x150PeekImage04 = 27,
                    TileTemplateType_TileWide310x150PeekImage05 = 28,
                    TileTemplateType_TileWide310x150PeekImage06 = 29,
                    TileTemplateType_TileWide310x150SmallImageAndText01 = 30,
                    TileTemplateType_TileWide310x150SmallImageAndText02 = 31,
                    TileTemplateType_TileWide310x150SmallImageAndText03 = 32,
                    TileTemplateType_TileWide310x150SmallImageAndText04 = 33,
                    TileTemplateType_TileWide310x150SmallImageAndText05 = 34,
                    TileTemplateType_TileWide310x150Text01 = 35,
                    TileTemplateType_TileWide310x150Text02 = 36,
                    TileTemplateType_TileWide310x150Text03 = 37,
                    TileTemplateType_TileWide310x150Text04 = 38,
                    TileTemplateType_TileWide310x150Text05 = 39,
                    TileTemplateType_TileWide310x150Text06 = 40,
                    TileTemplateType_TileWide310x150Text07 = 41,
                    TileTemplateType_TileWide310x150Text08 = 42,
                    TileTemplateType_TileWide310x150Text09 = 43,
                    TileTemplateType_TileWide310x150Text10 = 44,
                    TileTemplateType_TileWide310x150Text11 = 45,
                    TileTemplateType_TileSquare310x310BlockAndText01 = 46,
                    TileTemplateType_TileSquare310x310BlockAndText02 = 47,
                    TileTemplateType_TileSquare310x310Image = 48,
                    TileTemplateType_TileSquare310x310ImageAndText01 = 49,
                    TileTemplateType_TileSquare310x310ImageAndText02 = 50,
                    TileTemplateType_TileSquare310x310ImageAndTextOverlay01 = 51,
                    TileTemplateType_TileSquare310x310ImageAndTextOverlay02 = 52,
                    TileTemplateType_TileSquare310x310ImageAndTextOverlay03 = 53,
                    TileTemplateType_TileSquare310x310ImageCollectionAndText01 = 54,
                    TileTemplateType_TileSquare310x310ImageCollectionAndText02 = 55,
                    TileTemplateType_TileSquare310x310ImageCollection = 56,
                    TileTemplateType_TileSquare310x310SmallImagesAndTextList01 = 57,
                    TileTemplateType_TileSquare310x310SmallImagesAndTextList02 = 58,
                    TileTemplateType_TileSquare310x310SmallImagesAndTextList03 = 59,
                    TileTemplateType_TileSquare310x310SmallImagesAndTextList04 = 60,
                    TileTemplateType_TileSquare310x310Text01 = 61,
                    TileTemplateType_TileSquare310x310Text02 = 62,
                    TileTemplateType_TileSquare310x310Text03 = 63,
                    TileTemplateType_TileSquare310x310Text04 = 64,
                    TileTemplateType_TileSquare310x310Text05 = 65,
                    TileTemplateType_TileSquare310x310Text06 = 66,
                    TileTemplateType_TileSquare310x310Text07 = 67,
                    TileTemplateType_TileSquare310x310Text08 = 68,
                    TileTemplateType_TileSquare310x310TextList01 = 69,
                    TileTemplateType_TileSquare310x310TextList02 = 70,
                    TileTemplateType_TileSquare310x310TextList03 = 71,
                    TileTemplateType_TileSquare310x310SmallImageAndText01 = 72,
                    TileTemplateType_TileSquare310x310SmallImagesAndTextList05 = 73,
                    TileTemplateType_TileSquare310x310Text09 = 74,
                    TileTemplateType_TileSquare71x71IconWithBadge = 75,
                    TileTemplateType_TileSquare150x150IconWithBadge = 76,
                    TileTemplateType_TileWide310x150IconWithBadgeAndText = 77,
                    TileTemplateType_TileSquare71x71Image = 78,
                    TileTemplateType_TileTall150x310Image = 79
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CTileTemplateType {
    TileTemplateType_TileSquareImage = 0,
    TileTemplateType_TileSquareBlock = 1,
    TileTemplateType_TileSquareText01 = 2,
    TileTemplateType_TileSquareText02 = 3,
    TileTemplateType_TileSquareText03 = 4,
    TileTemplateType_TileSquareText04 = 5,
    TileTemplateType_TileSquarePeekImageAndText01 = 6,
    TileTemplateType_TileSquarePeekImageAndText02 = 7,
    TileTemplateType_TileSquarePeekImageAndText03 = 8,
    TileTemplateType_TileSquarePeekImageAndText04 = 9,
    TileTemplateType_TileWideImage = 10,
    TileTemplateType_TileWideImageCollection = 11,
    TileTemplateType_TileWideImageAndText01 = 12,
    TileTemplateType_TileWideImageAndText02 = 13,
    TileTemplateType_TileWideBlockAndText01 = 14,
    TileTemplateType_TileWideBlockAndText02 = 15,
    TileTemplateType_TileWidePeekImageCollection01 = 16,
    TileTemplateType_TileWidePeekImageCollection02 = 17,
    TileTemplateType_TileWidePeekImageCollection03 = 18,
    TileTemplateType_TileWidePeekImageCollection04 = 19,
    TileTemplateType_TileWidePeekImageCollection05 = 20,
    TileTemplateType_TileWidePeekImageCollection06 = 21,
    TileTemplateType_TileWidePeekImageAndText01 = 22,
    TileTemplateType_TileWidePeekImageAndText02 = 23,
    TileTemplateType_TileWidePeekImage01 = 24,
    TileTemplateType_TileWidePeekImage02 = 25,
    TileTemplateType_TileWidePeekImage03 = 26,
    TileTemplateType_TileWidePeekImage04 = 27,
    TileTemplateType_TileWidePeekImage05 = 28,
    TileTemplateType_TileWidePeekImage06 = 29,
    TileTemplateType_TileWideSmallImageAndText01 = 30,
    TileTemplateType_TileWideSmallImageAndText02 = 31,
    TileTemplateType_TileWideSmallImageAndText03 = 32,
    TileTemplateType_TileWideSmallImageAndText04 = 33,
    TileTemplateType_TileWideSmallImageAndText05 = 34,
    TileTemplateType_TileWideText01 = 35,
    TileTemplateType_TileWideText02 = 36,
    TileTemplateType_TileWideText03 = 37,
    TileTemplateType_TileWideText04 = 38,
    TileTemplateType_TileWideText05 = 39,
    TileTemplateType_TileWideText06 = 40,
    TileTemplateType_TileWideText07 = 41,
    TileTemplateType_TileWideText08 = 42,
    TileTemplateType_TileWideText09 = 43,
    TileTemplateType_TileWideText10 = 44,
    TileTemplateType_TileWideText11 = 45,
    TileTemplateType_TileSquare150x150Image = 0,
    TileTemplateType_TileSquare150x150Block = 1,
    TileTemplateType_TileSquare150x150Text01 = 2,
    TileTemplateType_TileSquare150x150Text02 = 3,
    TileTemplateType_TileSquare150x150Text03 = 4,
    TileTemplateType_TileSquare150x150Text04 = 5,
    TileTemplateType_TileSquare150x150PeekImageAndText01 = 6,
    TileTemplateType_TileSquare150x150PeekImageAndText02 = 7,
    TileTemplateType_TileSquare150x150PeekImageAndText03 = 8,
    TileTemplateType_TileSquare150x150PeekImageAndText04 = 9,
    TileTemplateType_TileWide310x150Image = 10,
    TileTemplateType_TileWide310x150ImageCollection = 11,
    TileTemplateType_TileWide310x150ImageAndText01 = 12,
    TileTemplateType_TileWide310x150ImageAndText02 = 13,
    TileTemplateType_TileWide310x150BlockAndText01 = 14,
    TileTemplateType_TileWide310x150BlockAndText02 = 15,
    TileTemplateType_TileWide310x150PeekImageCollection01 = 16,
    TileTemplateType_TileWide310x150PeekImageCollection02 = 17,
    TileTemplateType_TileWide310x150PeekImageCollection03 = 18,
    TileTemplateType_TileWide310x150PeekImageCollection04 = 19,
    TileTemplateType_TileWide310x150PeekImageCollection05 = 20,
    TileTemplateType_TileWide310x150PeekImageCollection06 = 21,
    TileTemplateType_TileWide310x150PeekImageAndText01 = 22,
    TileTemplateType_TileWide310x150PeekImageAndText02 = 23,
    TileTemplateType_TileWide310x150PeekImage01 = 24,
    TileTemplateType_TileWide310x150PeekImage02 = 25,
    TileTemplateType_TileWide310x150PeekImage03 = 26,
    TileTemplateType_TileWide310x150PeekImage04 = 27,
    TileTemplateType_TileWide310x150PeekImage05 = 28,
    TileTemplateType_TileWide310x150PeekImage06 = 29,
    TileTemplateType_TileWide310x150SmallImageAndText01 = 30,
    TileTemplateType_TileWide310x150SmallImageAndText02 = 31,
    TileTemplateType_TileWide310x150SmallImageAndText03 = 32,
    TileTemplateType_TileWide310x150SmallImageAndText04 = 33,
    TileTemplateType_TileWide310x150SmallImageAndText05 = 34,
    TileTemplateType_TileWide310x150Text01 = 35,
    TileTemplateType_TileWide310x150Text02 = 36,
    TileTemplateType_TileWide310x150Text03 = 37,
    TileTemplateType_TileWide310x150Text04 = 38,
    TileTemplateType_TileWide310x150Text05 = 39,
    TileTemplateType_TileWide310x150Text06 = 40,
    TileTemplateType_TileWide310x150Text07 = 41,
    TileTemplateType_TileWide310x150Text08 = 42,
    TileTemplateType_TileWide310x150Text09 = 43,
    TileTemplateType_TileWide310x150Text10 = 44,
    TileTemplateType_TileWide310x150Text11 = 45,
    TileTemplateType_TileSquare310x310BlockAndText01 = 46,
    TileTemplateType_TileSquare310x310BlockAndText02 = 47,
    TileTemplateType_TileSquare310x310Image = 48,
    TileTemplateType_TileSquare310x310ImageAndText01 = 49,
    TileTemplateType_TileSquare310x310ImageAndText02 = 50,
    TileTemplateType_TileSquare310x310ImageAndTextOverlay01 = 51,
    TileTemplateType_TileSquare310x310ImageAndTextOverlay02 = 52,
    TileTemplateType_TileSquare310x310ImageAndTextOverlay03 = 53,
    TileTemplateType_TileSquare310x310ImageCollectionAndText01 = 54,
    TileTemplateType_TileSquare310x310ImageCollectionAndText02 = 55,
    TileTemplateType_TileSquare310x310ImageCollection = 56,
    TileTemplateType_TileSquare310x310SmallImagesAndTextList01 = 57,
    TileTemplateType_TileSquare310x310SmallImagesAndTextList02 = 58,
    TileTemplateType_TileSquare310x310SmallImagesAndTextList03 = 59,
    TileTemplateType_TileSquare310x310SmallImagesAndTextList04 = 60,
    TileTemplateType_TileSquare310x310Text01 = 61,
    TileTemplateType_TileSquare310x310Text02 = 62,
    TileTemplateType_TileSquare310x310Text03 = 63,
    TileTemplateType_TileSquare310x310Text04 = 64,
    TileTemplateType_TileSquare310x310Text05 = 65,
    TileTemplateType_TileSquare310x310Text06 = 66,
    TileTemplateType_TileSquare310x310Text07 = 67,
    TileTemplateType_TileSquare310x310Text08 = 68,
    TileTemplateType_TileSquare310x310TextList01 = 69,
    TileTemplateType_TileSquare310x310TextList02 = 70,
    TileTemplateType_TileSquare310x310TextList03 = 71,
    TileTemplateType_TileSquare310x310SmallImageAndText01 = 72,
    TileTemplateType_TileSquare310x310SmallImagesAndTextList05 = 73,
    TileTemplateType_TileSquare310x310Text09 = 74,
    TileTemplateType_TileSquare71x71IconWithBadge = 75,
    TileTemplateType_TileSquare150x150IconWithBadge = 76,
    TileTemplateType_TileWide310x150IconWithBadgeAndText = 77,
    TileTemplateType_TileSquare71x71Image = 78,
    TileTemplateType_TileTall150x310Image = 79
};
#ifdef WIDL_using_Windows_UI_Notifications
#define TileTemplateType __x_ABI_CWindows_CUI_CNotifications_CTileTemplateType
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* ____x_ABI_CWindows_CUI_CNotifications_CTileTemplateType_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CTileTemplateType __x_ABI_CWindows_CUI_CNotifications_CTileTemplateType;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastDismissalReason_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastDismissalReason_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum ToastDismissalReason {
                    ToastDismissalReason_UserCanceled = 0,
                    ToastDismissalReason_ApplicationHidden = 1,
                    ToastDismissalReason_TimedOut = 2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CToastDismissalReason {
    ToastDismissalReason_UserCanceled = 0,
    ToastDismissalReason_ApplicationHidden = 1,
    ToastDismissalReason_TimedOut = 2
};
#ifdef WIDL_using_Windows_UI_Notifications
#define ToastDismissalReason __x_ABI_CWindows_CUI_CNotifications_CToastDismissalReason
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* ____x_ABI_CWindows_CUI_CNotifications_CToastDismissalReason_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CToastDismissalReason __x_ABI_CWindows_CUI_CNotifications_CToastDismissalReason;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastHistoryChangedType_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastHistoryChangedType_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum ToastHistoryChangedType {
                    ToastHistoryChangedType_Cleared = 0,
                    ToastHistoryChangedType_Removed = 1,
                    ToastHistoryChangedType_Expired = 2,
                    ToastHistoryChangedType_Added = 3
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CToastHistoryChangedType {
    ToastHistoryChangedType_Cleared = 0,
    ToastHistoryChangedType_Removed = 1,
    ToastHistoryChangedType_Expired = 2,
    ToastHistoryChangedType_Added = 3
};
#ifdef WIDL_using_Windows_UI_Notifications
#define ToastHistoryChangedType __x_ABI_CWindows_CUI_CNotifications_CToastHistoryChangedType
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* ____x_ABI_CWindows_CUI_CNotifications_CToastHistoryChangedType_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CToastHistoryChangedType __x_ABI_CWindows_CUI_CNotifications_CToastHistoryChangedType;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xf0000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationMode_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationMode_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum ToastNotificationMode {
                    ToastNotificationMode_Unrestricted = 0,
                    ToastNotificationMode_PriorityOnly = 1,
                    ToastNotificationMode_AlarmsOnly = 2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CToastNotificationMode {
    ToastNotificationMode_Unrestricted = 0,
    ToastNotificationMode_PriorityOnly = 1,
    ToastNotificationMode_AlarmsOnly = 2
};
#ifdef WIDL_using_Windows_UI_Notifications
#define ToastNotificationMode __x_ABI_CWindows_CUI_CNotifications_CToastNotificationMode
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationMode_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xf0000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CToastNotificationMode __x_ABI_CWindows_CUI_CNotifications_CToastNotificationMode;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationPriority_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationPriority_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum ToastNotificationPriority {
                    ToastNotificationPriority_Default = 0,
                    ToastNotificationPriority_High = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CToastNotificationPriority {
    ToastNotificationPriority_Default = 0,
    ToastNotificationPriority_High = 1
};
#ifdef WIDL_using_Windows_UI_Notifications
#define ToastNotificationPriority __x_ABI_CWindows_CUI_CNotifications_CToastNotificationPriority
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationPriority_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CToastNotificationPriority __x_ABI_CWindows_CUI_CNotifications_CToastNotificationPriority;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastTemplateType_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastTemplateType_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum ToastTemplateType {
                    ToastTemplateType_ToastImageAndText01 = 0,
                    ToastTemplateType_ToastImageAndText02 = 1,
                    ToastTemplateType_ToastImageAndText03 = 2,
                    ToastTemplateType_ToastImageAndText04 = 3,
                    ToastTemplateType_ToastText01 = 4,
                    ToastTemplateType_ToastText02 = 5,
                    ToastTemplateType_ToastText03 = 6,
                    ToastTemplateType_ToastText04 = 7
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CToastTemplateType {
    ToastTemplateType_ToastImageAndText01 = 0,
    ToastTemplateType_ToastImageAndText02 = 1,
    ToastTemplateType_ToastImageAndText03 = 2,
    ToastTemplateType_ToastImageAndText04 = 3,
    ToastTemplateType_ToastText01 = 4,
    ToastTemplateType_ToastText02 = 5,
    ToastTemplateType_ToastText03 = 6,
    ToastTemplateType_ToastText04 = 7
};
#ifdef WIDL_using_Windows_UI_Notifications
#define ToastTemplateType __x_ABI_CWindows_CUI_CNotifications_CToastTemplateType
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* ____x_ABI_CWindows_CUI_CNotifications_CToastTemplateType_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CToastTemplateType __x_ABI_CWindows_CUI_CNotifications_CToastTemplateType;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedKind_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedKind_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum UserNotificationChangedKind {
                    UserNotificationChangedKind_Added = 0,
                    UserNotificationChangedKind_Removed = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedKind {
    UserNotificationChangedKind_Added = 0,
    UserNotificationChangedKind_Removed = 1
};
#ifdef WIDL_using_Windows_UI_Notifications
#define UserNotificationChangedKind __x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedKind
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* ____x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedKind_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedKind __x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedKind;
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent ABI::Windows::UI::Notifications::IAdaptiveNotificationContent
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IAdaptiveNotificationContent;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText ABI::Windows::UI::Notifications::IAdaptiveNotificationText
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IAdaptiveNotificationText;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification ABI::Windows::UI::Notifications::IBadgeNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory ABI::Windows::UI::Notifications::IBadgeNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser ABI::Windows::UI::Notifications::IBadgeUpdateManagerForUser
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeUpdateManagerForUser;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics ABI::Windows::UI::Notifications::IBadgeUpdateManagerStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeUpdateManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2 __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2 ABI::Windows::UI::Notifications::IBadgeUpdateManagerStatics2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeUpdateManagerStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater ABI::Windows::UI::Notifications::IBadgeUpdater
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeUpdater;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics ABI::Windows::UI::Notifications::IKnownAdaptiveNotificationHintsStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IKnownAdaptiveNotificationHintsStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics ABI::Windows::UI::Notifications::IKnownAdaptiveNotificationTextStylesStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IKnownAdaptiveNotificationTextStylesStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics ABI::Windows::UI::Notifications::IKnownNotificationBindingsStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IKnownNotificationBindingsStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CINotification __x_ABI_CWindows_CUI_CNotifications_CINotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CINotification ABI::Windows::UI::Notifications::INotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface INotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding ABI::Windows::UI::Notifications::INotificationBinding
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface INotificationBinding;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationData_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationData_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CINotificationData __x_ABI_CWindows_CUI_CNotifications_CINotificationData;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData ABI::Windows::UI::Notifications::INotificationData
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface INotificationData;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory ABI::Windows::UI::Notifications::INotificationDataFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface INotificationDataFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual ABI::Windows::UI::Notifications::INotificationVisual
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface INotificationVisual;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification ABI::Windows::UI::Notifications::IScheduledTileNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledTileNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory ABI::Windows::UI::Notifications::IScheduledTileNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledTileNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification ABI::Windows::UI::Notifications::IScheduledToastNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 ABI::Windows::UI::Notifications::IScheduledToastNotification2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotification2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 ABI::Windows::UI::Notifications::IScheduledToastNotification3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotification3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4 __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4 ABI::Windows::UI::Notifications::IScheduledToastNotification4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotification4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory ABI::Windows::UI::Notifications::IScheduledToastNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs ABI::Windows::UI::Notifications::IScheduledToastNotificationShowingEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotificationShowingEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification ABI::Windows::UI::Notifications::IShownTileNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IShownTileNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification ABI::Windows::UI::Notifications::ITileFlyoutNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileFlyoutNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory ABI::Windows::UI::Notifications::ITileFlyoutNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileFlyoutNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics ABI::Windows::UI::Notifications::ITileFlyoutUpdateManagerStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileFlyoutUpdateManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater ABI::Windows::UI::Notifications::ITileFlyoutUpdater
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileFlyoutUpdater;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileNotification __x_ABI_CWindows_CUI_CNotifications_CITileNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification ABI::Windows::UI::Notifications::ITileNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory ABI::Windows::UI::Notifications::ITileNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser ABI::Windows::UI::Notifications::ITileUpdateManagerForUser
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileUpdateManagerForUser;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics ABI::Windows::UI::Notifications::ITileUpdateManagerStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileUpdateManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2 __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2 ABI::Windows::UI::Notifications::ITileUpdateManagerStatics2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileUpdateManagerStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdater __x_ABI_CWindows_CUI_CNotifications_CITileUpdater;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater ABI::Windows::UI::Notifications::ITileUpdater
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileUpdater;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 ABI::Windows::UI::Notifications::ITileUpdater2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileUpdater2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs ABI::Windows::UI::Notifications::IToastActivatedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastActivatedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2 __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2 ABI::Windows::UI::Notifications::IToastActivatedEventArgs2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastActivatedEventArgs2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastCollection_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastCollection_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastCollection __x_ABI_CWindows_CUI_CNotifications_CIToastCollection;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection ABI::Windows::UI::Notifications::IToastCollection
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastCollection;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory ABI::Windows::UI::Notifications::IToastCollectionFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastCollectionFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager ABI::Windows::UI::Notifications::IToastCollectionManager
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastCollectionManager;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs ABI::Windows::UI::Notifications::IToastDismissedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastDismissedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs ABI::Windows::UI::Notifications::IToastFailedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastFailedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification __x_ABI_CWindows_CUI_CNotifications_CIToastNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification ABI::Windows::UI::Notifications::IToastNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 ABI::Windows::UI::Notifications::IToastNotification2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotification2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 ABI::Windows::UI::Notifications::IToastNotification3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotification3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 ABI::Windows::UI::Notifications::IToastNotification4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotification4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6 ABI::Windows::UI::Notifications::IToastNotification6
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotification6;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail ABI::Windows::UI::Notifications::IToastNotificationActionTriggerDetail
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationActionTriggerDetail;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory ABI::Windows::UI::Notifications::IToastNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory ABI::Windows::UI::Notifications::IToastNotificationHistory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationHistory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2 ABI::Windows::UI::Notifications::IToastNotificationHistory2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationHistory2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail ABI::Windows::UI::Notifications::IToastNotificationHistoryChangedTriggerDetail
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationHistoryChangedTriggerDetail;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2 ABI::Windows::UI::Notifications::IToastNotificationHistoryChangedTriggerDetail2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationHistoryChangedTriggerDetail2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser ABI::Windows::UI::Notifications::IToastNotificationManagerForUser
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerForUser;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 ABI::Windows::UI::Notifications::IToastNotificationManagerForUser2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerForUser2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 ABI::Windows::UI::Notifications::IToastNotificationManagerForUser3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerForUser3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics ABI::Windows::UI::Notifications::IToastNotificationManagerStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2 ABI::Windows::UI::Notifications::IToastNotificationManagerStatics2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4 ABI::Windows::UI::Notifications::IToastNotificationManagerStatics4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerStatics4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5 ABI::Windows::UI::Notifications::IToastNotificationManagerStatics5
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerStatics5;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier ABI::Windows::UI::Notifications::IToastNotifier
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotifier;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2 ABI::Windows::UI::Notifications::IToastNotifier2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotifier2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3 __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3 ABI::Windows::UI::Notifications::IToastNotifier3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotifier3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIUserNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIUserNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIUserNotification __x_ABI_CWindows_CUI_CNotifications_CIUserNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification ABI::Windows::UI::Notifications::IUserNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IUserNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs ABI::Windows::UI::Notifications::IUserNotificationChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IUserNotificationChangedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::AdaptiveNotificationText* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::NotificationBinding* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::ScheduledTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::ScheduledToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::ShownTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CToastCollection __FIIterable_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::ToastCollection* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CToastNotification __FIIterable_1_Windows__CUI__CNotifications__CToastNotification;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CToastNotification ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::ToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CUserNotification __FIIterable_1_Windows__CUI__CNotifications__CUserNotification;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CUserNotification ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::UserNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::AdaptiveNotificationText* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::NotificationBinding* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::ScheduledTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::ScheduledToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::ShownTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CToastCollection __FIIterator_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::ToastCollection* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CToastNotification __FIIterator_1_Windows__CUI__CNotifications__CToastNotification;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::ToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CUserNotification __FIIterator_1_Windows__CUI__CNotifications__CUserNotification;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::UserNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::AdaptiveNotificationText* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::NotificationBinding* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ScheduledTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ScheduledToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ShownTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
#define ____FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding;
#ifdef __cplusplus
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding ABI::Windows::Foundation::Collections::IVector<ABI::Windows::UI::Notifications::NotificationBinding* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
#define ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
typedef interface __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification;
#ifdef __cplusplus
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Notifications::ToastCollection* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotificationHistory* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotifier* >
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IAdaptiveNotificationContent interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent, 0xeb0dbe66, 0x7448, 0x448d, 0x9d,0xb8, 0xd7,0x8a,0xcd,0x2a,0xbb,0xa9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("eb0dbe66-7448-448d-9db8-d78acd2abba9")
                IAdaptiveNotificationContent : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Kind(
                        ABI::Windows::UI::Notifications::AdaptiveNotificationContentKind *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Hints(
                        ABI::Windows::Foundation::Collections::IMap<HSTRING,HSTRING > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent, 0xeb0dbe66, 0x7448, 0x448d, 0x9d,0xb8, 0xd7,0x8a,0xcd,0x2a,0xbb,0xa9)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContentVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAdaptiveNotificationContent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Kind)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent *This,
        __x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationContentKind *value);

    HRESULT (STDMETHODCALLTYPE *get_Hints)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent *This,
        __FIMap_2_HSTRING_HSTRING **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContentVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAdaptiveNotificationContent methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_get_Kind(This,value) (This)->lpVtbl->get_Kind(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_get_Hints(This,value) (This)->lpVtbl->get_Hints(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_Release(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAdaptiveNotificationContent methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_get_Kind(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent* This,__x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationContentKind *value) {
    return This->lpVtbl->get_Kind(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_get_Hints(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent* This,__FIMap_2_HSTRING_HSTRING **value) {
    return This->lpVtbl->get_Hints(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IAdaptiveNotificationContent IID___x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent
#define IAdaptiveNotificationContentVtbl __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContentVtbl
#define IAdaptiveNotificationContent __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent
#define IAdaptiveNotificationContent_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_QueryInterface
#define IAdaptiveNotificationContent_AddRef __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_AddRef
#define IAdaptiveNotificationContent_Release __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_Release
#define IAdaptiveNotificationContent_GetIids __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_GetIids
#define IAdaptiveNotificationContent_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_GetRuntimeClassName
#define IAdaptiveNotificationContent_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_GetTrustLevel
#define IAdaptiveNotificationContent_get_Kind __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_get_Kind
#define IAdaptiveNotificationContent_get_Hints __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_get_Hints
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IAdaptiveNotificationText interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText, 0x46d4a3be, 0x609a, 0x4326, 0xa4,0x0b, 0xbf,0xde,0x87,0x20,0x34,0xa3);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("46d4a3be-609a-4326-a40b-bfde872034a3")
                IAdaptiveNotificationText : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Text(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Text(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Language(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Language(
                        HSTRING value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText, 0x46d4a3be, 0x609a, 0x4326, 0xa4,0x0b, 0xbf,0xde,0x87,0x20,0x34,0xa3)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationTextVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAdaptiveNotificationText methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Text)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Text)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Language)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Language)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText *This,
        HSTRING value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationTextVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationTextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAdaptiveNotificationText methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_get_Text(This,value) (This)->lpVtbl->get_Text(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_put_Text(This,value) (This)->lpVtbl->put_Text(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_get_Language(This,value) (This)->lpVtbl->get_Language(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_put_Language(This,value) (This)->lpVtbl->put_Language(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_Release(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAdaptiveNotificationText methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_get_Text(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText* This,HSTRING *value) {
    return This->lpVtbl->get_Text(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_put_Text(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText* This,HSTRING value) {
    return This->lpVtbl->put_Text(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_get_Language(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText* This,HSTRING *value) {
    return This->lpVtbl->get_Language(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_put_Language(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText* This,HSTRING value) {
    return This->lpVtbl->put_Language(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IAdaptiveNotificationText IID___x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText
#define IAdaptiveNotificationTextVtbl __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationTextVtbl
#define IAdaptiveNotificationText __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText
#define IAdaptiveNotificationText_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_QueryInterface
#define IAdaptiveNotificationText_AddRef __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_AddRef
#define IAdaptiveNotificationText_Release __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_Release
#define IAdaptiveNotificationText_GetIids __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_GetIids
#define IAdaptiveNotificationText_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_GetRuntimeClassName
#define IAdaptiveNotificationText_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_GetTrustLevel
#define IAdaptiveNotificationText_get_Text __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_get_Text
#define IAdaptiveNotificationText_put_Text __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_put_Text
#define IAdaptiveNotificationText_get_Language __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_get_Language
#define IAdaptiveNotificationText_put_Language __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_put_Language
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IBadgeNotification interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification, 0x075cb4ca, 0xd08a, 0x4e2f, 0x92,0x33, 0x7e,0x28,0x9c,0x1f,0x77,0x22);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("075cb4ca-d08a-4e2f-9233-7e289c1f7722")
                IBadgeNotification : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Content(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification, 0x075cb4ca, 0xd08a, 0x4e2f, 0x92,0x33, 0x7e,0x28,0x9c,0x1f,0x77,0x22)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBadgeNotification methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Content)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value);

    HRESULT (STDMETHODCALLTYPE *put_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification *This,
        __FIReference_1_DateTime *value);

    HRESULT (STDMETHODCALLTYPE *get_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification *This,
        __FIReference_1_DateTime **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBadgeNotification methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_get_Content(This,value) (This)->lpVtbl->get_Content(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_put_ExpirationTime(This,value) (This)->lpVtbl->put_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_get_ExpirationTime(This,value) (This)->lpVtbl->get_ExpirationTime(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_Release(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBadgeNotification methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_get_Content(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value) {
    return This->lpVtbl->get_Content(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_put_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification* This,__FIReference_1_DateTime *value) {
    return This->lpVtbl->put_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_get_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification* This,__FIReference_1_DateTime **value) {
    return This->lpVtbl->get_ExpirationTime(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IBadgeNotification IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification
#define IBadgeNotificationVtbl __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationVtbl
#define IBadgeNotification __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification
#define IBadgeNotification_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_QueryInterface
#define IBadgeNotification_AddRef __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_AddRef
#define IBadgeNotification_Release __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_Release
#define IBadgeNotification_GetIids __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_GetIids
#define IBadgeNotification_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_GetRuntimeClassName
#define IBadgeNotification_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_GetTrustLevel
#define IBadgeNotification_get_Content __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_get_Content
#define IBadgeNotification_put_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_put_ExpirationTime
#define IBadgeNotification_get_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_get_ExpirationTime
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IBadgeNotificationFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory, 0xedf255ce, 0x0618, 0x4d59, 0x94,0x8a, 0x5a,0x61,0x04,0x0c,0x52,0xf9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("edf255ce-0618-4d59-948a-5a61040c52f9")
                IBadgeNotificationFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateBadgeNotification(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument *content,
                        ABI::Windows::UI::Notifications::IBadgeNotification **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory, 0xedf255ce, 0x0618, 0x4d59, 0x94,0x8a, 0x5a,0x61,0x04,0x0c,0x52,0xf9)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBadgeNotificationFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateBadgeNotification)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactoryVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBadgeNotificationFactory methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_CreateBadgeNotification(This,content,value) (This)->lpVtbl->CreateBadgeNotification(This,content,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_Release(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBadgeNotificationFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_CreateBadgeNotification(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification **value) {
    return This->lpVtbl->CreateBadgeNotification(This,content,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IBadgeNotificationFactory IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory
#define IBadgeNotificationFactoryVtbl __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactoryVtbl
#define IBadgeNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory
#define IBadgeNotificationFactory_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_QueryInterface
#define IBadgeNotificationFactory_AddRef __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_AddRef
#define IBadgeNotificationFactory_Release __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_Release
#define IBadgeNotificationFactory_GetIids __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_GetIids
#define IBadgeNotificationFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_GetRuntimeClassName
#define IBadgeNotificationFactory_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_GetTrustLevel
#define IBadgeNotificationFactory_CreateBadgeNotification __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_CreateBadgeNotification
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IBadgeUpdateManagerForUser interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser, 0x996b21bc, 0x0386, 0x44e5, 0xba,0x8d, 0x0c,0x10,0x77,0xa6,0x2e,0x92);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("996b21bc-0386-44e5-ba8d-0c1077a62e92")
                IBadgeUpdateManagerForUser : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateBadgeUpdaterForApplication(
                        ABI::Windows::UI::Notifications::IBadgeUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateBadgeUpdaterForApplicationWithId(
                        HSTRING application_id,
                        ABI::Windows::UI::Notifications::IBadgeUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateBadgeUpdaterForSecondaryTile(
                        HSTRING tile_id,
                        ABI::Windows::UI::Notifications::IBadgeUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_User(
                        ABI::Windows::System::IUser **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser, 0x996b21bc, 0x0386, 0x44e5, 0xba,0x8d, 0x0c,0x10,0x77,0xa6,0x2e,0x92)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUserVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBadgeUpdateManagerForUser methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateBadgeUpdaterForApplication)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser *This,
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result);

    HRESULT (STDMETHODCALLTYPE *CreateBadgeUpdaterForApplicationWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser *This,
        HSTRING application_id,
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result);

    HRESULT (STDMETHODCALLTYPE *CreateBadgeUpdaterForSecondaryTile)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser *This,
        HSTRING tile_id,
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result);

    HRESULT (STDMETHODCALLTYPE *get_User)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser *This,
        __x_ABI_CWindows_CSystem_CIUser **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUserVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUserVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBadgeUpdateManagerForUser methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_CreateBadgeUpdaterForApplication(This,result) (This)->lpVtbl->CreateBadgeUpdaterForApplication(This,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_CreateBadgeUpdaterForApplicationWithId(This,application_id,result) (This)->lpVtbl->CreateBadgeUpdaterForApplicationWithId(This,application_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_CreateBadgeUpdaterForSecondaryTile(This,tile_id,result) (This)->lpVtbl->CreateBadgeUpdaterForSecondaryTile(This,tile_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_get_User(This,value) (This)->lpVtbl->get_User(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_Release(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBadgeUpdateManagerForUser methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_CreateBadgeUpdaterForApplication(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser* This,__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result) {
    return This->lpVtbl->CreateBadgeUpdaterForApplication(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_CreateBadgeUpdaterForApplicationWithId(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser* This,HSTRING application_id,__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result) {
    return This->lpVtbl->CreateBadgeUpdaterForApplicationWithId(This,application_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_CreateBadgeUpdaterForSecondaryTile(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser* This,HSTRING tile_id,__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result) {
    return This->lpVtbl->CreateBadgeUpdaterForSecondaryTile(This,tile_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_get_User(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser* This,__x_ABI_CWindows_CSystem_CIUser **value) {
    return This->lpVtbl->get_User(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IBadgeUpdateManagerForUser IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser
#define IBadgeUpdateManagerForUserVtbl __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUserVtbl
#define IBadgeUpdateManagerForUser __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser
#define IBadgeUpdateManagerForUser_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_QueryInterface
#define IBadgeUpdateManagerForUser_AddRef __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_AddRef
#define IBadgeUpdateManagerForUser_Release __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_Release
#define IBadgeUpdateManagerForUser_GetIids __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_GetIids
#define IBadgeUpdateManagerForUser_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_GetRuntimeClassName
#define IBadgeUpdateManagerForUser_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_GetTrustLevel
#define IBadgeUpdateManagerForUser_CreateBadgeUpdaterForApplication __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_CreateBadgeUpdaterForApplication
#define IBadgeUpdateManagerForUser_CreateBadgeUpdaterForApplicationWithId __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_CreateBadgeUpdaterForApplicationWithId
#define IBadgeUpdateManagerForUser_CreateBadgeUpdaterForSecondaryTile __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_CreateBadgeUpdaterForSecondaryTile
#define IBadgeUpdateManagerForUser_get_User __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_get_User
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IBadgeUpdateManagerStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics, 0x33400faa, 0x6dd5, 0x4105, 0xae,0xbc, 0x9b,0x50,0xfc,0xa4,0x92,0xda);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("33400faa-6dd5-4105-aebc-9b50fca492da")
                IBadgeUpdateManagerStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateBadgeUpdaterForApplication(
                        ABI::Windows::UI::Notifications::IBadgeUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateBadgeUpdaterForApplicationWithId(
                        HSTRING application_id,
                        ABI::Windows::UI::Notifications::IBadgeUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateBadgeUpdaterForSecondaryTile(
                        HSTRING tile_id,
                        ABI::Windows::UI::Notifications::IBadgeUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetTemplateContent(
                        ABI::Windows::UI::Notifications::BadgeTemplateType type,
                        ABI::Windows::Data::Xml::Dom::IXmlDocument **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics, 0x33400faa, 0x6dd5, 0x4105, 0xae,0xbc, 0x9b,0x50,0xfc,0xa4,0x92,0xda)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBadgeUpdateManagerStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateBadgeUpdaterForApplication)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics *This,
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result);

    HRESULT (STDMETHODCALLTYPE *CreateBadgeUpdaterForApplicationWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics *This,
        HSTRING application_id,
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result);

    HRESULT (STDMETHODCALLTYPE *CreateBadgeUpdaterForSecondaryTile)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics *This,
        HSTRING tile_id,
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result);

    HRESULT (STDMETHODCALLTYPE *GetTemplateContent)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics *This,
        __x_ABI_CWindows_CUI_CNotifications_CBadgeTemplateType type,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStaticsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBadgeUpdateManagerStatics methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_CreateBadgeUpdaterForApplication(This,result) (This)->lpVtbl->CreateBadgeUpdaterForApplication(This,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_CreateBadgeUpdaterForApplicationWithId(This,application_id,result) (This)->lpVtbl->CreateBadgeUpdaterForApplicationWithId(This,application_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_CreateBadgeUpdaterForSecondaryTile(This,tile_id,result) (This)->lpVtbl->CreateBadgeUpdaterForSecondaryTile(This,tile_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetTemplateContent(This,type,result) (This)->lpVtbl->GetTemplateContent(This,type,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_Release(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBadgeUpdateManagerStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_CreateBadgeUpdaterForApplication(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics* This,__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result) {
    return This->lpVtbl->CreateBadgeUpdaterForApplication(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_CreateBadgeUpdaterForApplicationWithId(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics* This,HSTRING application_id,__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result) {
    return This->lpVtbl->CreateBadgeUpdaterForApplicationWithId(This,application_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_CreateBadgeUpdaterForSecondaryTile(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics* This,HSTRING tile_id,__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result) {
    return This->lpVtbl->CreateBadgeUpdaterForSecondaryTile(This,tile_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetTemplateContent(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics* This,__x_ABI_CWindows_CUI_CNotifications_CBadgeTemplateType type,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **result) {
    return This->lpVtbl->GetTemplateContent(This,type,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IBadgeUpdateManagerStatics IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics
#define IBadgeUpdateManagerStaticsVtbl __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStaticsVtbl
#define IBadgeUpdateManagerStatics __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics
#define IBadgeUpdateManagerStatics_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_QueryInterface
#define IBadgeUpdateManagerStatics_AddRef __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_AddRef
#define IBadgeUpdateManagerStatics_Release __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_Release
#define IBadgeUpdateManagerStatics_GetIids __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetIids
#define IBadgeUpdateManagerStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetRuntimeClassName
#define IBadgeUpdateManagerStatics_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetTrustLevel
#define IBadgeUpdateManagerStatics_CreateBadgeUpdaterForApplication __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_CreateBadgeUpdaterForApplication
#define IBadgeUpdateManagerStatics_CreateBadgeUpdaterForApplicationWithId __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_CreateBadgeUpdaterForApplicationWithId
#define IBadgeUpdateManagerStatics_CreateBadgeUpdaterForSecondaryTile __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_CreateBadgeUpdaterForSecondaryTile
#define IBadgeUpdateManagerStatics_GetTemplateContent __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetTemplateContent
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IBadgeUpdateManagerStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2, 0x979a35ce, 0xf940, 0x48bf, 0x94,0xe8, 0xca,0x24,0x4d,0x40,0x0b,0x41);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("979a35ce-f940-48bf-94e8-ca244d400b41")
                IBadgeUpdateManagerStatics2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetForUser(
                        ABI::Windows::System::IUser *user,
                        ABI::Windows::UI::Notifications::IBadgeUpdateManagerForUser **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2, 0x979a35ce, 0xf940, 0x48bf, 0x94,0xe8, 0xca,0x24,0x4d,0x40,0x0b,0x41)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBadgeUpdateManagerStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetForUser)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2 *This,
        __x_ABI_CWindows_CSystem_CIUser *user,
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBadgeUpdateManagerStatics2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetForUser(This,user,result) (This)->lpVtbl->GetForUser(This,user,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_Release(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBadgeUpdateManagerStatics2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetForUser(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2* This,__x_ABI_CWindows_CSystem_CIUser *user,__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser **result) {
    return This->lpVtbl->GetForUser(This,user,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IBadgeUpdateManagerStatics2 IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2
#define IBadgeUpdateManagerStatics2Vtbl __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2Vtbl
#define IBadgeUpdateManagerStatics2 __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2
#define IBadgeUpdateManagerStatics2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_QueryInterface
#define IBadgeUpdateManagerStatics2_AddRef __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_AddRef
#define IBadgeUpdateManagerStatics2_Release __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_Release
#define IBadgeUpdateManagerStatics2_GetIids __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetIids
#define IBadgeUpdateManagerStatics2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetRuntimeClassName
#define IBadgeUpdateManagerStatics2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetTrustLevel
#define IBadgeUpdateManagerStatics2_GetForUser __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetForUser
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IBadgeUpdater interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater, 0xb5fa1fd4, 0x7562, 0x4f6c, 0xbf,0xa3, 0x1b,0x6e,0xd2,0xe5,0x7f,0x2f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("b5fa1fd4-7562-4f6c-bfa3-1b6ed2e57f2f")
                IBadgeUpdater : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE Update(
                        ABI::Windows::UI::Notifications::IBadgeNotification *notification) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Clear(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StartPeriodicUpdate(
                        ABI::Windows::Foundation::IUriRuntimeClass *badge_content,
                        ABI::Windows::UI::Notifications::PeriodicUpdateRecurrence requested_interval) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StartPeriodicUpdateAtTime(
                        ABI::Windows::Foundation::IUriRuntimeClass *badge_content,
                        ABI::Windows::Foundation::DateTime start_time,
                        ABI::Windows::UI::Notifications::PeriodicUpdateRecurrence requested_interval) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StopPeriodicUpdate(
                        ) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater, 0xb5fa1fd4, 0x7562, 0x4f6c, 0xbf,0xa3, 0x1b,0x6e,0xd2,0xe5,0x7f,0x2f)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdaterVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IBadgeUpdater methods ***/
    HRESULT (STDMETHODCALLTYPE *Update)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater *This,
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification *notification);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater *This);

    HRESULT (STDMETHODCALLTYPE *StartPeriodicUpdate)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *badge_content,
        __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval);

    HRESULT (STDMETHODCALLTYPE *StartPeriodicUpdateAtTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *badge_content,
        __x_ABI_CWindows_CFoundation_CDateTime start_time,
        __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval);

    HRESULT (STDMETHODCALLTYPE *StopPeriodicUpdate)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater *This);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdaterVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdaterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBadgeUpdater methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_Update(This,notification) (This)->lpVtbl->Update(This,notification)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_Clear(This) (This)->lpVtbl->Clear(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_StartPeriodicUpdate(This,badge_content,requested_interval) (This)->lpVtbl->StartPeriodicUpdate(This,badge_content,requested_interval)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_StartPeriodicUpdateAtTime(This,badge_content,start_time,requested_interval) (This)->lpVtbl->StartPeriodicUpdateAtTime(This,badge_content,start_time,requested_interval)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_StopPeriodicUpdate(This) (This)->lpVtbl->StopPeriodicUpdate(This)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_Release(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBadgeUpdater methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_Update(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This,__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification *notification) {
    return This->lpVtbl->Update(This,notification);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_Clear(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This) {
    return This->lpVtbl->Clear(This);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_StartPeriodicUpdate(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *badge_content,__x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval) {
    return This->lpVtbl->StartPeriodicUpdate(This,badge_content,requested_interval);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_StartPeriodicUpdateAtTime(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *badge_content,__x_ABI_CWindows_CFoundation_CDateTime start_time,__x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval) {
    return This->lpVtbl->StartPeriodicUpdateAtTime(This,badge_content,start_time,requested_interval);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_StopPeriodicUpdate(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This) {
    return This->lpVtbl->StopPeriodicUpdate(This);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IBadgeUpdater IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater
#define IBadgeUpdaterVtbl __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdaterVtbl
#define IBadgeUpdater __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater
#define IBadgeUpdater_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_QueryInterface
#define IBadgeUpdater_AddRef __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_AddRef
#define IBadgeUpdater_Release __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_Release
#define IBadgeUpdater_GetIids __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_GetIids
#define IBadgeUpdater_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_GetRuntimeClassName
#define IBadgeUpdater_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_GetTrustLevel
#define IBadgeUpdater_Update __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_Update
#define IBadgeUpdater_Clear __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_Clear
#define IBadgeUpdater_StartPeriodicUpdate __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_StartPeriodicUpdate
#define IBadgeUpdater_StartPeriodicUpdateAtTime __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_StartPeriodicUpdateAtTime
#define IBadgeUpdater_StopPeriodicUpdate __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_StopPeriodicUpdate
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IKnownAdaptiveNotificationHintsStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics, 0x06206598, 0xd496, 0x497d, 0x86,0x92, 0x4f,0x7d,0x7c,0x27,0x70,0xdf);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("06206598-d496-497d-8692-4f7d7c2770df")
                IKnownAdaptiveNotificationHintsStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Style(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Wrap(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_MaxLines(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_MinLines(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_TextStacking(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Align(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics, 0x06206598, 0xd496, 0x497d, 0x86,0x92, 0x4f,0x7d,0x7c,0x27,0x70,0xdf)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IKnownAdaptiveNotificationHintsStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Style)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Wrap)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_MaxLines)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_MinLines)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_TextStacking)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Align)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStaticsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IKnownAdaptiveNotificationHintsStatics methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_Style(This,value) (This)->lpVtbl->get_Style(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_Wrap(This,value) (This)->lpVtbl->get_Wrap(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_MaxLines(This,value) (This)->lpVtbl->get_MaxLines(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_MinLines(This,value) (This)->lpVtbl->get_MinLines(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_TextStacking(This,value) (This)->lpVtbl->get_TextStacking(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_Align(This,value) (This)->lpVtbl->get_Align(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_Release(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IKnownAdaptiveNotificationHintsStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_Style(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Style(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_Wrap(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Wrap(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_MaxLines(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This,HSTRING *value) {
    return This->lpVtbl->get_MaxLines(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_MinLines(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This,HSTRING *value) {
    return This->lpVtbl->get_MinLines(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_TextStacking(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This,HSTRING *value) {
    return This->lpVtbl->get_TextStacking(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_Align(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Align(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IKnownAdaptiveNotificationHintsStatics IID___x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics
#define IKnownAdaptiveNotificationHintsStaticsVtbl __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStaticsVtbl
#define IKnownAdaptiveNotificationHintsStatics __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics
#define IKnownAdaptiveNotificationHintsStatics_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_QueryInterface
#define IKnownAdaptiveNotificationHintsStatics_AddRef __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_AddRef
#define IKnownAdaptiveNotificationHintsStatics_Release __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_Release
#define IKnownAdaptiveNotificationHintsStatics_GetIids __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_GetIids
#define IKnownAdaptiveNotificationHintsStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_GetRuntimeClassName
#define IKnownAdaptiveNotificationHintsStatics_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_GetTrustLevel
#define IKnownAdaptiveNotificationHintsStatics_get_Style __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_Style
#define IKnownAdaptiveNotificationHintsStatics_get_Wrap __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_Wrap
#define IKnownAdaptiveNotificationHintsStatics_get_MaxLines __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_MaxLines
#define IKnownAdaptiveNotificationHintsStatics_get_MinLines __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_MinLines
#define IKnownAdaptiveNotificationHintsStatics_get_TextStacking __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_TextStacking
#define IKnownAdaptiveNotificationHintsStatics_get_Align __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_Align
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IKnownAdaptiveNotificationTextStylesStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics, 0x202192d7, 0x8996, 0x45aa, 0x8b,0xa1, 0xd4,0x61,0xd7,0x2c,0x2a,0x1b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("202192d7-8996-45aa-8ba1-d461d72c2a1b")
                IKnownAdaptiveNotificationTextStylesStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Caption(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Body(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Base(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Subtitle(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Title(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Subheader(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Header(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_TitleNumeral(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SubheaderNumeral(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_HeaderNumeral(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_CaptionSubtle(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_BodySubtle(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_BaseSubtle(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SubtitleSubtle(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_TitleSubtle(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SubheaderSubtle(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SubheaderNumeralSubtle(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_HeaderSubtle(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_HeaderNumeralSubtle(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics, 0x202192d7, 0x8996, 0x45aa, 0x8b,0xa1, 0xd4,0x61,0xd7,0x2c,0x2a,0x1b)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IKnownAdaptiveNotificationTextStylesStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Caption)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Body)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Base)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Subtitle)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Title)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Subheader)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Header)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_TitleNumeral)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_SubheaderNumeral)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_HeaderNumeral)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_CaptionSubtle)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_BodySubtle)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_BaseSubtle)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_SubtitleSubtle)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_TitleSubtle)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_SubheaderSubtle)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_SubheaderNumeralSubtle)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_HeaderSubtle)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_HeaderNumeralSubtle)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStaticsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IKnownAdaptiveNotificationTextStylesStatics methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Caption(This,value) (This)->lpVtbl->get_Caption(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Body(This,value) (This)->lpVtbl->get_Body(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Base(This,value) (This)->lpVtbl->get_Base(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Subtitle(This,value) (This)->lpVtbl->get_Subtitle(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Title(This,value) (This)->lpVtbl->get_Title(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Subheader(This,value) (This)->lpVtbl->get_Subheader(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Header(This,value) (This)->lpVtbl->get_Header(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_TitleNumeral(This,value) (This)->lpVtbl->get_TitleNumeral(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubheaderNumeral(This,value) (This)->lpVtbl->get_SubheaderNumeral(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_HeaderNumeral(This,value) (This)->lpVtbl->get_HeaderNumeral(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_CaptionSubtle(This,value) (This)->lpVtbl->get_CaptionSubtle(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_BodySubtle(This,value) (This)->lpVtbl->get_BodySubtle(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_BaseSubtle(This,value) (This)->lpVtbl->get_BaseSubtle(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubtitleSubtle(This,value) (This)->lpVtbl->get_SubtitleSubtle(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_TitleSubtle(This,value) (This)->lpVtbl->get_TitleSubtle(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubheaderSubtle(This,value) (This)->lpVtbl->get_SubheaderSubtle(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubheaderNumeralSubtle(This,value) (This)->lpVtbl->get_SubheaderNumeralSubtle(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_HeaderSubtle(This,value) (This)->lpVtbl->get_HeaderSubtle(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_HeaderNumeralSubtle(This,value) (This)->lpVtbl->get_HeaderNumeralSubtle(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_Release(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IKnownAdaptiveNotificationTextStylesStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Caption(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Caption(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Body(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Body(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Base(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Base(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Subtitle(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Subtitle(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Title(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Title(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Subheader(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Subheader(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Header(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Header(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_TitleNumeral(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_TitleNumeral(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubheaderNumeral(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_SubheaderNumeral(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_HeaderNumeral(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_HeaderNumeral(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_CaptionSubtle(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_CaptionSubtle(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_BodySubtle(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_BodySubtle(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_BaseSubtle(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_BaseSubtle(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubtitleSubtle(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_SubtitleSubtle(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_TitleSubtle(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_TitleSubtle(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubheaderSubtle(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_SubheaderSubtle(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubheaderNumeralSubtle(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_SubheaderNumeralSubtle(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_HeaderSubtle(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_HeaderSubtle(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_HeaderNumeralSubtle(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_HeaderNumeralSubtle(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IKnownAdaptiveNotificationTextStylesStatics IID___x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics
#define IKnownAdaptiveNotificationTextStylesStaticsVtbl __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStaticsVtbl
#define IKnownAdaptiveNotificationTextStylesStatics __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics
#define IKnownAdaptiveNotificationTextStylesStatics_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_QueryInterface
#define IKnownAdaptiveNotificationTextStylesStatics_AddRef __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_AddRef
#define IKnownAdaptiveNotificationTextStylesStatics_Release __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_Release
#define IKnownAdaptiveNotificationTextStylesStatics_GetIids __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_GetIids
#define IKnownAdaptiveNotificationTextStylesStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_GetRuntimeClassName
#define IKnownAdaptiveNotificationTextStylesStatics_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_GetTrustLevel
#define IKnownAdaptiveNotificationTextStylesStatics_get_Caption __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Caption
#define IKnownAdaptiveNotificationTextStylesStatics_get_Body __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Body
#define IKnownAdaptiveNotificationTextStylesStatics_get_Base __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Base
#define IKnownAdaptiveNotificationTextStylesStatics_get_Subtitle __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Subtitle
#define IKnownAdaptiveNotificationTextStylesStatics_get_Title __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Title
#define IKnownAdaptiveNotificationTextStylesStatics_get_Subheader __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Subheader
#define IKnownAdaptiveNotificationTextStylesStatics_get_Header __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Header
#define IKnownAdaptiveNotificationTextStylesStatics_get_TitleNumeral __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_TitleNumeral
#define IKnownAdaptiveNotificationTextStylesStatics_get_SubheaderNumeral __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubheaderNumeral
#define IKnownAdaptiveNotificationTextStylesStatics_get_HeaderNumeral __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_HeaderNumeral
#define IKnownAdaptiveNotificationTextStylesStatics_get_CaptionSubtle __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_CaptionSubtle
#define IKnownAdaptiveNotificationTextStylesStatics_get_BodySubtle __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_BodySubtle
#define IKnownAdaptiveNotificationTextStylesStatics_get_BaseSubtle __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_BaseSubtle
#define IKnownAdaptiveNotificationTextStylesStatics_get_SubtitleSubtle __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubtitleSubtle
#define IKnownAdaptiveNotificationTextStylesStatics_get_TitleSubtle __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_TitleSubtle
#define IKnownAdaptiveNotificationTextStylesStatics_get_SubheaderSubtle __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubheaderSubtle
#define IKnownAdaptiveNotificationTextStylesStatics_get_SubheaderNumeralSubtle __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubheaderNumeralSubtle
#define IKnownAdaptiveNotificationTextStylesStatics_get_HeaderSubtle __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_HeaderSubtle
#define IKnownAdaptiveNotificationTextStylesStatics_get_HeaderNumeralSubtle __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_HeaderNumeralSubtle
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IKnownNotificationBindingsStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics, 0x79427bae, 0xa8b7, 0x4d58, 0x89,0xea, 0x76,0xa7,0xb7,0xbc,0xcd,0xed);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("79427bae-a8b7-4d58-89ea-76a7b7bccded")
                IKnownNotificationBindingsStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ToastGeneric(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics, 0x79427bae, 0xa8b7, 0x4d58, 0x89,0xea, 0x76,0xa7,0xb7,0xbc,0xcd,0xed)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IKnownNotificationBindingsStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ToastGeneric)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStaticsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IKnownNotificationBindingsStatics methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_get_ToastGeneric(This,value) (This)->lpVtbl->get_ToastGeneric(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_Release(__x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IKnownNotificationBindingsStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_get_ToastGeneric(__x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics* This,HSTRING *value) {
    return This->lpVtbl->get_ToastGeneric(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IKnownNotificationBindingsStatics IID___x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics
#define IKnownNotificationBindingsStaticsVtbl __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStaticsVtbl
#define IKnownNotificationBindingsStatics __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics
#define IKnownNotificationBindingsStatics_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_QueryInterface
#define IKnownNotificationBindingsStatics_AddRef __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_AddRef
#define IKnownNotificationBindingsStatics_Release __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_Release
#define IKnownNotificationBindingsStatics_GetIids __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_GetIids
#define IKnownNotificationBindingsStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_GetRuntimeClassName
#define IKnownNotificationBindingsStatics_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_GetTrustLevel
#define IKnownNotificationBindingsStatics_get_ToastGeneric __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_get_ToastGeneric
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * INotification interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotification_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CINotification, 0x108037fe, 0xeb76, 0x4f82, 0x97,0xbc, 0xda,0x07,0x53,0x0a,0x2e,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("108037fe-eb76-4f82-97bc-da07530a2e20")
                INotification : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Visual(
                        ABI::Windows::UI::Notifications::INotificationVisual **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Visual(
                        ABI::Windows::UI::Notifications::INotificationVisual *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CINotification, 0x108037fe, 0xeb76, 0x4f82, 0x97,0xbc, 0xda,0x07,0x53,0x0a,0x2e,0x20)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CINotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** INotification methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CINotification *This,
        __FIReference_1_DateTime **value);

    HRESULT (STDMETHODCALLTYPE *put_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CINotification *This,
        __FIReference_1_DateTime *value);

    HRESULT (STDMETHODCALLTYPE *get_Visual)(
        __x_ABI_CWindows_CUI_CNotifications_CINotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual **value);

    HRESULT (STDMETHODCALLTYPE *put_Visual)(
        __x_ABI_CWindows_CUI_CNotifications_CINotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CINotificationVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CINotification {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CINotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CINotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CINotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CINotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CINotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** INotification methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotification_get_ExpirationTime(This,value) (This)->lpVtbl->get_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotification_put_ExpirationTime(This,value) (This)->lpVtbl->put_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotification_get_Visual(This,value) (This)->lpVtbl->get_Visual(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotification_put_Visual(This,value) (This)->lpVtbl->put_Visual(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotification_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CINotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CINotification_AddRef(__x_ABI_CWindows_CUI_CNotifications_CINotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CINotification_Release(__x_ABI_CWindows_CUI_CNotifications_CINotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotification_GetIids(__x_ABI_CWindows_CUI_CNotifications_CINotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotification_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CINotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotification_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CINotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** INotification methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotification_get_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CINotification* This,__FIReference_1_DateTime **value) {
    return This->lpVtbl->get_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotification_put_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CINotification* This,__FIReference_1_DateTime *value) {
    return This->lpVtbl->put_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotification_get_Visual(__x_ABI_CWindows_CUI_CNotifications_CINotification* This,__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual **value) {
    return This->lpVtbl->get_Visual(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotification_put_Visual(__x_ABI_CWindows_CUI_CNotifications_CINotification* This,__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual *value) {
    return This->lpVtbl->put_Visual(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_INotification IID___x_ABI_CWindows_CUI_CNotifications_CINotification
#define INotificationVtbl __x_ABI_CWindows_CUI_CNotifications_CINotificationVtbl
#define INotification __x_ABI_CWindows_CUI_CNotifications_CINotification
#define INotification_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CINotification_QueryInterface
#define INotification_AddRef __x_ABI_CWindows_CUI_CNotifications_CINotification_AddRef
#define INotification_Release __x_ABI_CWindows_CUI_CNotifications_CINotification_Release
#define INotification_GetIids __x_ABI_CWindows_CUI_CNotifications_CINotification_GetIids
#define INotification_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CINotification_GetRuntimeClassName
#define INotification_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CINotification_GetTrustLevel
#define INotification_get_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CINotification_get_ExpirationTime
#define INotification_put_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CINotification_put_ExpirationTime
#define INotification_get_Visual __x_ABI_CWindows_CUI_CNotifications_CINotification_get_Visual
#define INotification_put_Visual __x_ABI_CWindows_CUI_CNotifications_CINotification_put_Visual
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CINotification_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * INotificationBinding interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CINotificationBinding, 0xf29e4b85, 0x0370, 0x4ad3, 0xb4,0xea, 0xda,0x9e,0x35,0xe7,0xea,0xbf);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("f29e4b85-0370-4ad3-b4ea-da9e35e7eabf")
                INotificationBinding : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Template(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Template(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Language(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Language(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Hints(
                        ABI::Windows::Foundation::Collections::IMap<HSTRING,HSTRING > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetTextElements(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding, 0xf29e4b85, 0x0370, 0x4ad3, 0xb4,0xea, 0xda,0x9e,0x35,0xe7,0xea,0xbf)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CINotificationBindingVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** INotificationBinding methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Template)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Template)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Language)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Language)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Hints)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *This,
        __FIMap_2_HSTRING_HSTRING **value);

    HRESULT (STDMETHODCALLTYPE *GetTextElements)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *This,
        __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CINotificationBindingVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CINotificationBindingVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** INotificationBinding methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_get_Template(This,value) (This)->lpVtbl->get_Template(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_put_Template(This,value) (This)->lpVtbl->put_Template(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_get_Language(This,value) (This)->lpVtbl->get_Language(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_put_Language(This,value) (This)->lpVtbl->put_Language(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_get_Hints(This,value) (This)->lpVtbl->get_Hints(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetTextElements(This,result) (This)->lpVtbl->GetTextElements(This,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_AddRef(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_Release(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetIids(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** INotificationBinding methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_get_Template(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This,HSTRING *value) {
    return This->lpVtbl->get_Template(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_put_Template(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This,HSTRING value) {
    return This->lpVtbl->put_Template(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_get_Language(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This,HSTRING *value) {
    return This->lpVtbl->get_Language(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_put_Language(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This,HSTRING value) {
    return This->lpVtbl->put_Language(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_get_Hints(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This,__FIMap_2_HSTRING_HSTRING **value) {
    return This->lpVtbl->get_Hints(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetTextElements(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This,__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText **result) {
    return This->lpVtbl->GetTextElements(This,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_INotificationBinding IID___x_ABI_CWindows_CUI_CNotifications_CINotificationBinding
#define INotificationBindingVtbl __x_ABI_CWindows_CUI_CNotifications_CINotificationBindingVtbl
#define INotificationBinding __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding
#define INotificationBinding_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_QueryInterface
#define INotificationBinding_AddRef __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_AddRef
#define INotificationBinding_Release __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_Release
#define INotificationBinding_GetIids __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetIids
#define INotificationBinding_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetRuntimeClassName
#define INotificationBinding_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetTrustLevel
#define INotificationBinding_get_Template __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_get_Template
#define INotificationBinding_put_Template __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_put_Template
#define INotificationBinding_get_Language __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_get_Language
#define INotificationBinding_put_Language __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_put_Language
#define INotificationBinding_get_Hints __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_get_Hints
#define INotificationBinding_GetTextElements __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetTextElements
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * INotificationData interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationData_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationData_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CINotificationData, 0x9ffd2312, 0x9d6a, 0x4aaf, 0xb6,0xac, 0xff,0x17,0xf0,0xc1,0xf2,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("9ffd2312-9d6a-4aaf-b6ac-ff17f0c1f280")
                INotificationData : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Values(
                        ABI::Windows::Foundation::Collections::IMap<HSTRING,HSTRING > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SequenceNumber(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_SequenceNumber(
                        UINT32 value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CINotificationData, 0x9ffd2312, 0x9d6a, 0x4aaf, 0xb6,0xac, 0xff,0x17,0xf0,0xc1,0xf2,0x80)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CINotificationDataVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** INotificationData methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Values)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData *This,
        __FIMap_2_HSTRING_HSTRING **value);

    HRESULT (STDMETHODCALLTYPE *get_SequenceNumber)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *put_SequenceNumber)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData *This,
        UINT32 value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CINotificationDataVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CINotificationData {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CINotificationDataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** INotificationData methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData_get_Values(This,value) (This)->lpVtbl->get_Values(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData_get_SequenceNumber(This,value) (This)->lpVtbl->get_SequenceNumber(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData_put_SequenceNumber(This,value) (This)->lpVtbl->put_SequenceNumber(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationData_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CINotificationData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CINotificationData_AddRef(__x_ABI_CWindows_CUI_CNotifications_CINotificationData* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CINotificationData_Release(__x_ABI_CWindows_CUI_CNotifications_CINotificationData* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationData_GetIids(__x_ABI_CWindows_CUI_CNotifications_CINotificationData* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationData_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CINotificationData* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationData_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CINotificationData* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** INotificationData methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationData_get_Values(__x_ABI_CWindows_CUI_CNotifications_CINotificationData* This,__FIMap_2_HSTRING_HSTRING **value) {
    return This->lpVtbl->get_Values(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationData_get_SequenceNumber(__x_ABI_CWindows_CUI_CNotifications_CINotificationData* This,UINT32 *value) {
    return This->lpVtbl->get_SequenceNumber(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationData_put_SequenceNumber(__x_ABI_CWindows_CUI_CNotifications_CINotificationData* This,UINT32 value) {
    return This->lpVtbl->put_SequenceNumber(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_INotificationData IID___x_ABI_CWindows_CUI_CNotifications_CINotificationData
#define INotificationDataVtbl __x_ABI_CWindows_CUI_CNotifications_CINotificationDataVtbl
#define INotificationData __x_ABI_CWindows_CUI_CNotifications_CINotificationData
#define INotificationData_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CINotificationData_QueryInterface
#define INotificationData_AddRef __x_ABI_CWindows_CUI_CNotifications_CINotificationData_AddRef
#define INotificationData_Release __x_ABI_CWindows_CUI_CNotifications_CINotificationData_Release
#define INotificationData_GetIids __x_ABI_CWindows_CUI_CNotifications_CINotificationData_GetIids
#define INotificationData_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CINotificationData_GetRuntimeClassName
#define INotificationData_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CINotificationData_GetTrustLevel
#define INotificationData_get_Values __x_ABI_CWindows_CUI_CNotifications_CINotificationData_get_Values
#define INotificationData_get_SequenceNumber __x_ABI_CWindows_CUI_CNotifications_CINotificationData_get_SequenceNumber
#define INotificationData_put_SequenceNumber __x_ABI_CWindows_CUI_CNotifications_CINotificationData_put_SequenceNumber
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CINotificationData_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * INotificationDataFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory, 0x23c1e33a, 0x1c10, 0x46fb, 0x80,0x40, 0xde,0xc3,0x84,0x62,0x1c,0xf8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("23c1e33a-1c10-46fb-8040-dec384621cf8")
                INotificationDataFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateNotificationDataWithValuesAndSequenceNumber(
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >* > *initial_values,
                        UINT32 sequence_number,
                        ABI::Windows::UI::Notifications::INotificationData **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateNotificationDataWithValues(
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >* > *initial_values,
                        ABI::Windows::UI::Notifications::INotificationData **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory, 0x23c1e33a, 0x1c10, 0x46fb, 0x80,0x40, 0xde,0xc3,0x84,0x62,0x1c,0xf8)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** INotificationDataFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateNotificationDataWithValuesAndSequenceNumber)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory *This,
        __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING *initial_values,
        UINT32 sequence_number,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData **value);

    HRESULT (STDMETHODCALLTYPE *CreateNotificationDataWithValues)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory *This,
        __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING *initial_values,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactoryVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** INotificationDataFactory methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_CreateNotificationDataWithValuesAndSequenceNumber(This,initial_values,sequence_number,value) (This)->lpVtbl->CreateNotificationDataWithValuesAndSequenceNumber(This,initial_values,sequence_number,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_CreateNotificationDataWithValues(This,initial_values,value) (This)->lpVtbl->CreateNotificationDataWithValues(This,initial_values,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_AddRef(__x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_Release(__x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_GetIids(__x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** INotificationDataFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_CreateNotificationDataWithValuesAndSequenceNumber(__x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory* This,__FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING *initial_values,UINT32 sequence_number,__x_ABI_CWindows_CUI_CNotifications_CINotificationData **value) {
    return This->lpVtbl->CreateNotificationDataWithValuesAndSequenceNumber(This,initial_values,sequence_number,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_CreateNotificationDataWithValues(__x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory* This,__FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING *initial_values,__x_ABI_CWindows_CUI_CNotifications_CINotificationData **value) {
    return This->lpVtbl->CreateNotificationDataWithValues(This,initial_values,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_INotificationDataFactory IID___x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory
#define INotificationDataFactoryVtbl __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactoryVtbl
#define INotificationDataFactory __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory
#define INotificationDataFactory_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_QueryInterface
#define INotificationDataFactory_AddRef __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_AddRef
#define INotificationDataFactory_Release __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_Release
#define INotificationDataFactory_GetIids __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_GetIids
#define INotificationDataFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_GetRuntimeClassName
#define INotificationDataFactory_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_GetTrustLevel
#define INotificationDataFactory_CreateNotificationDataWithValuesAndSequenceNumber __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_CreateNotificationDataWithValuesAndSequenceNumber
#define INotificationDataFactory_CreateNotificationDataWithValues __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_CreateNotificationDataWithValues
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * INotificationVisual interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CINotificationVisual, 0x68835b8e, 0xaa56, 0x4e11, 0x86,0xd3, 0x5f,0x9a,0x69,0x57,0xbc,0x5b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("68835b8e-aa56-4e11-86d3-5f9a6957bc5b")
                INotificationVisual : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Language(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Language(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Bindings(
                        ABI::Windows::Foundation::Collections::IVector<ABI::Windows::UI::Notifications::NotificationBinding* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetBinding(
                        HSTRING template_name,
                        ABI::Windows::UI::Notifications::INotificationBinding **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual, 0x68835b8e, 0xaa56, 0x4e11, 0x86,0xd3, 0x5f,0x9a,0x69,0x57,0xbc,0x5b)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CINotificationVisualVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** INotificationVisual methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Language)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Language)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Bindings)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual *This,
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding **value);

    HRESULT (STDMETHODCALLTYPE *GetBinding)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual *This,
        HSTRING template_name,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CINotificationVisualVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CINotificationVisualVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** INotificationVisual methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_get_Language(This,value) (This)->lpVtbl->get_Language(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_put_Language(This,value) (This)->lpVtbl->put_Language(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_get_Bindings(This,value) (This)->lpVtbl->get_Bindings(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetBinding(This,template_name,result) (This)->lpVtbl->GetBinding(This,template_name,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_AddRef(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_Release(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetIids(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** INotificationVisual methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_get_Language(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual* This,HSTRING *value) {
    return This->lpVtbl->get_Language(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_put_Language(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual* This,HSTRING value) {
    return This->lpVtbl->put_Language(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_get_Bindings(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual* This,__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding **value) {
    return This->lpVtbl->get_Bindings(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetBinding(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual* This,HSTRING template_name,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **result) {
    return This->lpVtbl->GetBinding(This,template_name,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_INotificationVisual IID___x_ABI_CWindows_CUI_CNotifications_CINotificationVisual
#define INotificationVisualVtbl __x_ABI_CWindows_CUI_CNotifications_CINotificationVisualVtbl
#define INotificationVisual __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual
#define INotificationVisual_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_QueryInterface
#define INotificationVisual_AddRef __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_AddRef
#define INotificationVisual_Release __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_Release
#define INotificationVisual_GetIids __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetIids
#define INotificationVisual_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetRuntimeClassName
#define INotificationVisual_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetTrustLevel
#define INotificationVisual_get_Language __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_get_Language
#define INotificationVisual_put_Language __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_put_Language
#define INotificationVisual_get_Bindings __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_get_Bindings
#define INotificationVisual_GetBinding __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetBinding
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IScheduledTileNotification interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification, 0x0abca6d5, 0x99dc, 0x4c78, 0xa1,0x1c, 0xc9,0xe7,0xf8,0x6d,0x7e,0xf7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("0abca6d5-99dc-4c78-a11c-c9e7f86d7ef7")
                IScheduledTileNotification : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Content(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_DeliveryTime(
                        ABI::Windows::Foundation::DateTime *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Tag(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Tag(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Id(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Id(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification, 0x0abca6d5, 0x99dc, 0x4c78, 0xa1,0x1c, 0xc9,0xe7,0xf8,0x6d,0x7e,0xf7)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IScheduledTileNotification methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Content)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value);

    HRESULT (STDMETHODCALLTYPE *get_DeliveryTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This,
        __x_ABI_CWindows_CFoundation_CDateTime *value);

    HRESULT (STDMETHODCALLTYPE *put_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This,
        __FIReference_1_DateTime *value);

    HRESULT (STDMETHODCALLTYPE *get_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This,
        __FIReference_1_DateTime **value);

    HRESULT (STDMETHODCALLTYPE *put_Tag)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Tag)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Id)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Id)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IScheduledTileNotification methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_Content(This,value) (This)->lpVtbl->get_Content(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_DeliveryTime(This,value) (This)->lpVtbl->get_DeliveryTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_put_ExpirationTime(This,value) (This)->lpVtbl->put_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_ExpirationTime(This,value) (This)->lpVtbl->get_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_put_Tag(This,value) (This)->lpVtbl->put_Tag(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_Tag(This,value) (This)->lpVtbl->get_Tag(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_put_Id(This,value) (This)->lpVtbl->put_Id(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_Id(This,value) (This)->lpVtbl->get_Id(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_Release(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IScheduledTileNotification methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_Content(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value) {
    return This->lpVtbl->get_Content(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_DeliveryTime(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,__x_ABI_CWindows_CFoundation_CDateTime *value) {
    return This->lpVtbl->get_DeliveryTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_put_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,__FIReference_1_DateTime *value) {
    return This->lpVtbl->put_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,__FIReference_1_DateTime **value) {
    return This->lpVtbl->get_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_put_Tag(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,HSTRING value) {
    return This->lpVtbl->put_Tag(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_Tag(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,HSTRING *value) {
    return This->lpVtbl->get_Tag(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_put_Id(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,HSTRING value) {
    return This->lpVtbl->put_Id(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_Id(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,HSTRING *value) {
    return This->lpVtbl->get_Id(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IScheduledTileNotification IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification
#define IScheduledTileNotificationVtbl __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationVtbl
#define IScheduledTileNotification __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification
#define IScheduledTileNotification_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_QueryInterface
#define IScheduledTileNotification_AddRef __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_AddRef
#define IScheduledTileNotification_Release __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_Release
#define IScheduledTileNotification_GetIids __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_GetIids
#define IScheduledTileNotification_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_GetRuntimeClassName
#define IScheduledTileNotification_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_GetTrustLevel
#define IScheduledTileNotification_get_Content __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_Content
#define IScheduledTileNotification_get_DeliveryTime __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_DeliveryTime
#define IScheduledTileNotification_put_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_put_ExpirationTime
#define IScheduledTileNotification_get_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_ExpirationTime
#define IScheduledTileNotification_put_Tag __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_put_Tag
#define IScheduledTileNotification_get_Tag __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_Tag
#define IScheduledTileNotification_put_Id __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_put_Id
#define IScheduledTileNotification_get_Id __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_Id
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IScheduledTileNotificationFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory, 0x3383138a, 0x98c0, 0x4c3b, 0xbb,0xd6, 0x4a,0x63,0x3c,0x7c,0xfc,0x29);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("3383138a-98c0-4c3b-bbd6-4a633c7cfc29")
                IScheduledTileNotificationFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateScheduledTileNotification(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument *content,
                        ABI::Windows::Foundation::DateTime delivery_time,
                        ABI::Windows::UI::Notifications::IScheduledTileNotification **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory, 0x3383138a, 0x98c0, 0x4c3b, 0xbb,0xd6, 0x4a,0x63,0x3c,0x7c,0xfc,0x29)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IScheduledTileNotificationFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateScheduledTileNotification)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,
        __x_ABI_CWindows_CFoundation_CDateTime delivery_time,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactoryVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IScheduledTileNotificationFactory methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_CreateScheduledTileNotification(This,content,delivery_time,value) (This)->lpVtbl->CreateScheduledTileNotification(This,content,delivery_time,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_Release(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IScheduledTileNotificationFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_CreateScheduledTileNotification(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,__x_ABI_CWindows_CFoundation_CDateTime delivery_time,__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification **value) {
    return This->lpVtbl->CreateScheduledTileNotification(This,content,delivery_time,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IScheduledTileNotificationFactory IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory
#define IScheduledTileNotificationFactoryVtbl __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactoryVtbl
#define IScheduledTileNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory
#define IScheduledTileNotificationFactory_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_QueryInterface
#define IScheduledTileNotificationFactory_AddRef __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_AddRef
#define IScheduledTileNotificationFactory_Release __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_Release
#define IScheduledTileNotificationFactory_GetIids __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_GetIids
#define IScheduledTileNotificationFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_GetRuntimeClassName
#define IScheduledTileNotificationFactory_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_GetTrustLevel
#define IScheduledTileNotificationFactory_CreateScheduledTileNotification __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_CreateScheduledTileNotification
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IScheduledToastNotification interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification, 0x79f577f8, 0x0de7, 0x48cd, 0x97,0x40, 0x9b,0x37,0x04,0x90,0xc8,0x38);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("79f577f8-0de7-48cd-9740-9b370490c838")
                IScheduledToastNotification : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Content(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_DeliveryTime(
                        ABI::Windows::Foundation::DateTime *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SnoozeInterval(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::TimeSpan > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_MaximumSnoozeCount(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Id(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Id(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification, 0x79f577f8, 0x0de7, 0x48cd, 0x97,0x40, 0x9b,0x37,0x04,0x90,0xc8,0x38)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IScheduledToastNotification methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Content)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value);

    HRESULT (STDMETHODCALLTYPE *get_DeliveryTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *This,
        __x_ABI_CWindows_CFoundation_CDateTime *value);

    HRESULT (STDMETHODCALLTYPE *get_SnoozeInterval)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *This,
        __FIReference_1_TimeSpan **value);

    HRESULT (STDMETHODCALLTYPE *get_MaximumSnoozeCount)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *put_Id)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Id)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IScheduledToastNotification methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_Content(This,value) (This)->lpVtbl->get_Content(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_DeliveryTime(This,value) (This)->lpVtbl->get_DeliveryTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_SnoozeInterval(This,value) (This)->lpVtbl->get_SnoozeInterval(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_MaximumSnoozeCount(This,value) (This)->lpVtbl->get_MaximumSnoozeCount(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_put_Id(This,value) (This)->lpVtbl->put_Id(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_Id(This,value) (This)->lpVtbl->get_Id(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_Release(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IScheduledToastNotification methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_Content(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value) {
    return This->lpVtbl->get_Content(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_DeliveryTime(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This,__x_ABI_CWindows_CFoundation_CDateTime *value) {
    return This->lpVtbl->get_DeliveryTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_SnoozeInterval(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This,__FIReference_1_TimeSpan **value) {
    return This->lpVtbl->get_SnoozeInterval(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_MaximumSnoozeCount(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This,UINT32 *value) {
    return This->lpVtbl->get_MaximumSnoozeCount(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_put_Id(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This,HSTRING value) {
    return This->lpVtbl->put_Id(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_Id(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This,HSTRING *value) {
    return This->lpVtbl->get_Id(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IScheduledToastNotification IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification
#define IScheduledToastNotificationVtbl __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationVtbl
#define IScheduledToastNotification __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification
#define IScheduledToastNotification_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_QueryInterface
#define IScheduledToastNotification_AddRef __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_AddRef
#define IScheduledToastNotification_Release __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_Release
#define IScheduledToastNotification_GetIids __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_GetIids
#define IScheduledToastNotification_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_GetRuntimeClassName
#define IScheduledToastNotification_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_GetTrustLevel
#define IScheduledToastNotification_get_Content __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_Content
#define IScheduledToastNotification_get_DeliveryTime __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_DeliveryTime
#define IScheduledToastNotification_get_SnoozeInterval __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_SnoozeInterval
#define IScheduledToastNotification_get_MaximumSnoozeCount __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_MaximumSnoozeCount
#define IScheduledToastNotification_put_Id __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_put_Id
#define IScheduledToastNotification_get_Id __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_Id
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IScheduledToastNotification2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2, 0xa66ea09c, 0x31b4, 0x43b0, 0xb5,0xdd, 0x7a,0x40,0xe8,0x53,0x63,0xb1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("a66ea09c-31b4-43b0-b5dd-7a40e85363b1")
                IScheduledToastNotification2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE put_Tag(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Tag(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Group(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Group(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_SuppressPopup(
                        boolean value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SuppressPopup(
                        boolean *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2, 0xa66ea09c, 0x31b4, 0x43b0, 0xb5,0xdd, 0x7a,0x40,0xe8,0x53,0x63,0xb1)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IScheduledToastNotification2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Tag)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Tag)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Group)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Group)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_SuppressPopup)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_SuppressPopup)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 *This,
        boolean *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IScheduledToastNotification2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_put_Tag(This,value) (This)->lpVtbl->put_Tag(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_get_Tag(This,value) (This)->lpVtbl->get_Tag(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_put_Group(This,value) (This)->lpVtbl->put_Group(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_get_Group(This,value) (This)->lpVtbl->get_Group(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_put_SuppressPopup(This,value) (This)->lpVtbl->put_SuppressPopup(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_get_SuppressPopup(This,value) (This)->lpVtbl->get_SuppressPopup(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_Release(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IScheduledToastNotification2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_put_Tag(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This,HSTRING value) {
    return This->lpVtbl->put_Tag(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_get_Tag(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This,HSTRING *value) {
    return This->lpVtbl->get_Tag(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_put_Group(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This,HSTRING value) {
    return This->lpVtbl->put_Group(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_get_Group(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This,HSTRING *value) {
    return This->lpVtbl->get_Group(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_put_SuppressPopup(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This,boolean value) {
    return This->lpVtbl->put_SuppressPopup(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_get_SuppressPopup(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This,boolean *value) {
    return This->lpVtbl->get_SuppressPopup(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IScheduledToastNotification2 IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2
#define IScheduledToastNotification2Vtbl __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2Vtbl
#define IScheduledToastNotification2 __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2
#define IScheduledToastNotification2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_QueryInterface
#define IScheduledToastNotification2_AddRef __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_AddRef
#define IScheduledToastNotification2_Release __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_Release
#define IScheduledToastNotification2_GetIids __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_GetIids
#define IScheduledToastNotification2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_GetRuntimeClassName
#define IScheduledToastNotification2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_GetTrustLevel
#define IScheduledToastNotification2_put_Tag __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_put_Tag
#define IScheduledToastNotification2_get_Tag __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_get_Tag
#define IScheduledToastNotification2_put_Group __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_put_Group
#define IScheduledToastNotification2_get_Group __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_get_Group
#define IScheduledToastNotification2_put_SuppressPopup __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_put_SuppressPopup
#define IScheduledToastNotification2_get_SuppressPopup __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_get_SuppressPopup
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IScheduledToastNotification3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3, 0x98429e8b, 0xbd32, 0x4a3b, 0x9d,0x15, 0x22,0xae,0xa4,0x94,0x62,0xa1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("98429e8b-bd32-4a3b-9d15-22aea49462a1")
                IScheduledToastNotification3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_NotificationMirroring(
                        ABI::Windows::UI::Notifications::NotificationMirroring *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_NotificationMirroring(
                        ABI::Windows::UI::Notifications::NotificationMirroring value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_RemoteId(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_RemoteId(
                        HSTRING value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3, 0x98429e8b, 0xbd32, 0x4a3b, 0x9d,0x15, 0x22,0xae,0xa4,0x94,0x62,0xa1)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IScheduledToastNotification3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_NotificationMirroring)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 *This,
        __x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring *value);

    HRESULT (STDMETHODCALLTYPE *put_NotificationMirroring)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 *This,
        __x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring value);

    HRESULT (STDMETHODCALLTYPE *get_RemoteId)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_RemoteId)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 *This,
        HSTRING value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IScheduledToastNotification3 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_get_NotificationMirroring(This,value) (This)->lpVtbl->get_NotificationMirroring(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_put_NotificationMirroring(This,value) (This)->lpVtbl->put_NotificationMirroring(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_get_RemoteId(This,value) (This)->lpVtbl->get_RemoteId(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_put_RemoteId(This,value) (This)->lpVtbl->put_RemoteId(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_Release(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IScheduledToastNotification3 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_get_NotificationMirroring(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3* This,__x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring *value) {
    return This->lpVtbl->get_NotificationMirroring(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_put_NotificationMirroring(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3* This,__x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring value) {
    return This->lpVtbl->put_NotificationMirroring(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_get_RemoteId(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3* This,HSTRING *value) {
    return This->lpVtbl->get_RemoteId(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_put_RemoteId(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3* This,HSTRING value) {
    return This->lpVtbl->put_RemoteId(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IScheduledToastNotification3 IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3
#define IScheduledToastNotification3Vtbl __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3Vtbl
#define IScheduledToastNotification3 __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3
#define IScheduledToastNotification3_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_QueryInterface
#define IScheduledToastNotification3_AddRef __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_AddRef
#define IScheduledToastNotification3_Release __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_Release
#define IScheduledToastNotification3_GetIids __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_GetIids
#define IScheduledToastNotification3_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_GetRuntimeClassName
#define IScheduledToastNotification3_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_GetTrustLevel
#define IScheduledToastNotification3_get_NotificationMirroring __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_get_NotificationMirroring
#define IScheduledToastNotification3_put_NotificationMirroring __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_put_NotificationMirroring
#define IScheduledToastNotification3_get_RemoteId __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_get_RemoteId
#define IScheduledToastNotification3_put_RemoteId __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_put_RemoteId
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IScheduledToastNotification4 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4, 0x1d4761fd, 0xbdef, 0x4e4a, 0x96,0xbe, 0x01,0x01,0x36,0x9b,0x58,0xd2);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("1d4761fd-bdef-4e4a-96be-0101369b58d2")
                IScheduledToastNotification4 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4, 0x1d4761fd, 0xbdef, 0x4e4a, 0x96,0xbe, 0x01,0x01,0x36,0x9b,0x58,0xd2)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IScheduledToastNotification4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4 *This,
        __FIReference_1_DateTime **value);

    HRESULT (STDMETHODCALLTYPE *put_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4 *This,
        __FIReference_1_DateTime *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IScheduledToastNotification4 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_get_ExpirationTime(This,value) (This)->lpVtbl->get_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_put_ExpirationTime(This,value) (This)->lpVtbl->put_ExpirationTime(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_Release(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IScheduledToastNotification4 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_get_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4* This,__FIReference_1_DateTime **value) {
    return This->lpVtbl->get_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_put_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4* This,__FIReference_1_DateTime *value) {
    return This->lpVtbl->put_ExpirationTime(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IScheduledToastNotification4 IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4
#define IScheduledToastNotification4Vtbl __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4Vtbl
#define IScheduledToastNotification4 __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4
#define IScheduledToastNotification4_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_QueryInterface
#define IScheduledToastNotification4_AddRef __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_AddRef
#define IScheduledToastNotification4_Release __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_Release
#define IScheduledToastNotification4_GetIids __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_GetIids
#define IScheduledToastNotification4_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_GetRuntimeClassName
#define IScheduledToastNotification4_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_GetTrustLevel
#define IScheduledToastNotification4_get_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_get_ExpirationTime
#define IScheduledToastNotification4_put_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_put_ExpirationTime
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000 */

/*****************************************************************************
 * IScheduledToastNotificationFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory, 0xe7bed191, 0x0bb9, 0x4189, 0x83,0x94, 0x31,0x76,0x1b,0x47,0x6f,0xd7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("e7bed191-0bb9-4189-8394-31761b476fd7")
                IScheduledToastNotificationFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateScheduledToastNotification(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument *content,
                        ABI::Windows::Foundation::DateTime delivery_time,
                        ABI::Windows::UI::Notifications::IScheduledToastNotification **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateScheduledToastNotificationRecurring(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument *content,
                        ABI::Windows::Foundation::DateTime delivery_time,
                        ABI::Windows::Foundation::TimeSpan snooze_interval,
                        UINT32 maximum_snooze_count,
                        ABI::Windows::UI::Notifications::IScheduledToastNotification **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory, 0xe7bed191, 0x0bb9, 0x4189, 0x83,0x94, 0x31,0x76,0x1b,0x47,0x6f,0xd7)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IScheduledToastNotificationFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateScheduledToastNotification)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,
        __x_ABI_CWindows_CFoundation_CDateTime delivery_time,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **value);

    HRESULT (STDMETHODCALLTYPE *CreateScheduledToastNotificationRecurring)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,
        __x_ABI_CWindows_CFoundation_CDateTime delivery_time,
        __x_ABI_CWindows_CFoundation_CTimeSpan snooze_interval,
        UINT32 maximum_snooze_count,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactoryVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IScheduledToastNotificationFactory methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_CreateScheduledToastNotification(This,content,delivery_time,value) (This)->lpVtbl->CreateScheduledToastNotification(This,content,delivery_time,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_CreateScheduledToastNotificationRecurring(This,content,delivery_time,snooze_interval,maximum_snooze_count,value) (This)->lpVtbl->CreateScheduledToastNotificationRecurring(This,content,delivery_time,snooze_interval,maximum_snooze_count,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_Release(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IScheduledToastNotificationFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_CreateScheduledToastNotification(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,__x_ABI_CWindows_CFoundation_CDateTime delivery_time,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **value) {
    return This->lpVtbl->CreateScheduledToastNotification(This,content,delivery_time,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_CreateScheduledToastNotificationRecurring(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,__x_ABI_CWindows_CFoundation_CDateTime delivery_time,__x_ABI_CWindows_CFoundation_CTimeSpan snooze_interval,UINT32 maximum_snooze_count,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **value) {
    return This->lpVtbl->CreateScheduledToastNotificationRecurring(This,content,delivery_time,snooze_interval,maximum_snooze_count,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IScheduledToastNotificationFactory IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory
#define IScheduledToastNotificationFactoryVtbl __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactoryVtbl
#define IScheduledToastNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory
#define IScheduledToastNotificationFactory_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_QueryInterface
#define IScheduledToastNotificationFactory_AddRef __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_AddRef
#define IScheduledToastNotificationFactory_Release __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_Release
#define IScheduledToastNotificationFactory_GetIids __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_GetIids
#define IScheduledToastNotificationFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_GetRuntimeClassName
#define IScheduledToastNotificationFactory_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_GetTrustLevel
#define IScheduledToastNotificationFactory_CreateScheduledToastNotification __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_CreateScheduledToastNotification
#define IScheduledToastNotificationFactory_CreateScheduledToastNotificationRecurring __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_CreateScheduledToastNotificationRecurring
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IScheduledToastNotificationShowingEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs, 0x6173f6b4, 0x412a, 0x5e2c, 0xa6,0xed, 0xa0,0x20,0x9a,0xef,0x9a,0x09);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("6173f6b4-412a-5e2c-a6ed-a0209aef9a09")
                IScheduledToastNotificationShowingEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Cancel(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Cancel(
                        boolean value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ScheduledToastNotification(
                        ABI::Windows::UI::Notifications::IScheduledToastNotification **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetDeferral(
                        ABI::Windows::Foundation::IDeferral **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs, 0x6173f6b4, 0x412a, 0x5e2c, 0xa6,0xed, 0xa0,0x20,0x9a,0xef,0x9a,0x09)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IScheduledToastNotificationShowingEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Cancel)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_Cancel)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_ScheduledToastNotification)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs *This,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **value);

    HRESULT (STDMETHODCALLTYPE *GetDeferral)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs *This,
        __x_ABI_CWindows_CFoundation_CIDeferral **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IScheduledToastNotificationShowingEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_get_Cancel(This,value) (This)->lpVtbl->get_Cancel(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_put_Cancel(This,value) (This)->lpVtbl->put_Cancel(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_get_ScheduledToastNotification(This,value) (This)->lpVtbl->get_ScheduledToastNotification(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetDeferral(This,result) (This)->lpVtbl->GetDeferral(This,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_Release(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IScheduledToastNotificationShowingEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_get_Cancel(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs* This,boolean *value) {
    return This->lpVtbl->get_Cancel(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_put_Cancel(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs* This,boolean value) {
    return This->lpVtbl->put_Cancel(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_get_ScheduledToastNotification(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs* This,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **value) {
    return This->lpVtbl->get_ScheduledToastNotification(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetDeferral(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs* This,__x_ABI_CWindows_CFoundation_CIDeferral **result) {
    return This->lpVtbl->GetDeferral(This,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IScheduledToastNotificationShowingEventArgs IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs
#define IScheduledToastNotificationShowingEventArgsVtbl __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgsVtbl
#define IScheduledToastNotificationShowingEventArgs __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs
#define IScheduledToastNotificationShowingEventArgs_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_QueryInterface
#define IScheduledToastNotificationShowingEventArgs_AddRef __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_AddRef
#define IScheduledToastNotificationShowingEventArgs_Release __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_Release
#define IScheduledToastNotificationShowingEventArgs_GetIids __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetIids
#define IScheduledToastNotificationShowingEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetRuntimeClassName
#define IScheduledToastNotificationShowingEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetTrustLevel
#define IScheduledToastNotificationShowingEventArgs_get_Cancel __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_get_Cancel
#define IScheduledToastNotificationShowingEventArgs_put_Cancel __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_put_Cancel
#define IScheduledToastNotificationShowingEventArgs_get_ScheduledToastNotification __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_get_ScheduledToastNotification
#define IScheduledToastNotificationShowingEventArgs_GetDeferral __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetDeferral
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*****************************************************************************
 * IShownTileNotification interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification, 0x342d8988, 0x5af2, 0x481a, 0xa6,0xa3, 0xf2,0xfd,0xc7,0x8d,0xe8,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("342d8988-5af2-481a-a6a3-f2fdc78de88e")
                IShownTileNotification : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Arguments(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification, 0x342d8988, 0x5af2, 0x481a, 0xa6,0xa3, 0xf2,0xfd,0xc7,0x8d,0xe8,0x8e)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IShownTileNotification methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Arguments)(
        __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotificationVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IShownTileNotification methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_get_Arguments(This,value) (This)->lpVtbl->get_Arguments(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_Release(__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IShownTileNotification methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_get_Arguments(__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification* This,HSTRING *value) {
    return This->lpVtbl->get_Arguments(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IShownTileNotification IID___x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification
#define IShownTileNotificationVtbl __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotificationVtbl
#define IShownTileNotification __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification
#define IShownTileNotification_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_QueryInterface
#define IShownTileNotification_AddRef __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_AddRef
#define IShownTileNotification_Release __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_Release
#define IShownTileNotification_GetIids __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_GetIids
#define IShownTileNotification_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_GetRuntimeClassName
#define IShownTileNotification_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_GetTrustLevel
#define IShownTileNotification_get_Arguments __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_get_Arguments
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * ITileFlyoutNotification interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification, 0x9a53b261, 0xc70c, 0x42be, 0xb2,0xf3, 0xf4,0x2a,0xa9,0x7d,0x34,0xe5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("9a53b261-c70c-42be-b2f3-f42aa97d34e5")
                ITileFlyoutNotification : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Content(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification, 0x9a53b261, 0xc70c, 0x42be, 0xb2,0xf3, 0xf4,0x2a,0xa9,0x7d,0x34,0xe5)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ITileFlyoutNotification methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Content)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value);

    HRESULT (STDMETHODCALLTYPE *put_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification *This,
        __FIReference_1_DateTime *value);

    HRESULT (STDMETHODCALLTYPE *get_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification *This,
        __FIReference_1_DateTime **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileFlyoutNotification methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_get_Content(This,value) (This)->lpVtbl->get_Content(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_put_ExpirationTime(This,value) (This)->lpVtbl->put_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_get_ExpirationTime(This,value) (This)->lpVtbl->get_ExpirationTime(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_Release(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileFlyoutNotification methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_get_Content(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value) {
    return This->lpVtbl->get_Content(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_put_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification* This,__FIReference_1_DateTime *value) {
    return This->lpVtbl->put_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_get_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification* This,__FIReference_1_DateTime **value) {
    return This->lpVtbl->get_ExpirationTime(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileFlyoutNotification IID___x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification
#define ITileFlyoutNotificationVtbl __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationVtbl
#define ITileFlyoutNotification __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification
#define ITileFlyoutNotification_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_QueryInterface
#define ITileFlyoutNotification_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_AddRef
#define ITileFlyoutNotification_Release __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_Release
#define ITileFlyoutNotification_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_GetIids
#define ITileFlyoutNotification_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_GetRuntimeClassName
#define ITileFlyoutNotification_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_GetTrustLevel
#define ITileFlyoutNotification_get_Content __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_get_Content
#define ITileFlyoutNotification_put_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_put_ExpirationTime
#define ITileFlyoutNotification_get_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_get_ExpirationTime
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * ITileFlyoutNotificationFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory, 0xef556ff5, 0x5226, 0x4f2b, 0xb2,0x78, 0x88,0xa3,0x5d,0xfe,0x56,0x9f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("ef556ff5-5226-4f2b-b278-88a35dfe569f")
                ITileFlyoutNotificationFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateTileFlyoutNotification(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument *content,
                        ABI::Windows::UI::Notifications::ITileFlyoutNotification **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory, 0xef556ff5, 0x5226, 0x4f2b, 0xb2,0x78, 0x88,0xa3,0x5d,0xfe,0x56,0x9f)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ITileFlyoutNotificationFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateTileFlyoutNotification)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactoryVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileFlyoutNotificationFactory methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_CreateTileFlyoutNotification(This,content,value) (This)->lpVtbl->CreateTileFlyoutNotification(This,content,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_Release(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileFlyoutNotificationFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_CreateTileFlyoutNotification(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification **value) {
    return This->lpVtbl->CreateTileFlyoutNotification(This,content,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileFlyoutNotificationFactory IID___x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory
#define ITileFlyoutNotificationFactoryVtbl __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactoryVtbl
#define ITileFlyoutNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory
#define ITileFlyoutNotificationFactory_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_QueryInterface
#define ITileFlyoutNotificationFactory_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_AddRef
#define ITileFlyoutNotificationFactory_Release __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_Release
#define ITileFlyoutNotificationFactory_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_GetIids
#define ITileFlyoutNotificationFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_GetRuntimeClassName
#define ITileFlyoutNotificationFactory_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_GetTrustLevel
#define ITileFlyoutNotificationFactory_CreateTileFlyoutNotification __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_CreateTileFlyoutNotification
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * ITileFlyoutUpdateManagerStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics, 0x04363b0b, 0x1ac0, 0x4b99, 0x88,0xe7, 0xad,0xa8,0x3e,0x95,0x3d,0x48);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("04363b0b-1ac0-4b99-88e7-ada83e953d48")
                ITileFlyoutUpdateManagerStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateTileFlyoutUpdaterForApplication(
                        ABI::Windows::UI::Notifications::ITileFlyoutUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateTileFlyoutUpdaterForApplicationWithId(
                        HSTRING application_id,
                        ABI::Windows::UI::Notifications::ITileFlyoutUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateTileFlyoutUpdaterForSecondaryTile(
                        HSTRING tile_id,
                        ABI::Windows::UI::Notifications::ITileFlyoutUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetTemplateContent(
                        ABI::Windows::UI::Notifications::TileFlyoutTemplateType type,
                        ABI::Windows::Data::Xml::Dom::IXmlDocument **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics, 0x04363b0b, 0x1ac0, 0x4b99, 0x88,0xe7, 0xad,0xa8,0x3e,0x95,0x3d,0x48)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ITileFlyoutUpdateManagerStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateTileFlyoutUpdaterForApplication)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics *This,
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater **result);

    HRESULT (STDMETHODCALLTYPE *CreateTileFlyoutUpdaterForApplicationWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics *This,
        HSTRING application_id,
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater **result);

    HRESULT (STDMETHODCALLTYPE *CreateTileFlyoutUpdaterForSecondaryTile)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics *This,
        HSTRING tile_id,
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater **result);

    HRESULT (STDMETHODCALLTYPE *GetTemplateContent)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics *This,
        __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutTemplateType type,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStaticsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileFlyoutUpdateManagerStatics methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForApplication(This,result) (This)->lpVtbl->CreateTileFlyoutUpdaterForApplication(This,result)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForApplicationWithId(This,application_id,result) (This)->lpVtbl->CreateTileFlyoutUpdaterForApplicationWithId(This,application_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForSecondaryTile(This,tile_id,result) (This)->lpVtbl->CreateTileFlyoutUpdaterForSecondaryTile(This,tile_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetTemplateContent(This,type,result) (This)->lpVtbl->GetTemplateContent(This,type,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_Release(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileFlyoutUpdateManagerStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForApplication(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics* This,__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater **result) {
    return This->lpVtbl->CreateTileFlyoutUpdaterForApplication(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForApplicationWithId(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics* This,HSTRING application_id,__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater **result) {
    return This->lpVtbl->CreateTileFlyoutUpdaterForApplicationWithId(This,application_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForSecondaryTile(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics* This,HSTRING tile_id,__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater **result) {
    return This->lpVtbl->CreateTileFlyoutUpdaterForSecondaryTile(This,tile_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetTemplateContent(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics* This,__x_ABI_CWindows_CUI_CNotifications_CTileFlyoutTemplateType type,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **result) {
    return This->lpVtbl->GetTemplateContent(This,type,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileFlyoutUpdateManagerStatics IID___x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics
#define ITileFlyoutUpdateManagerStaticsVtbl __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStaticsVtbl
#define ITileFlyoutUpdateManagerStatics __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics
#define ITileFlyoutUpdateManagerStatics_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_QueryInterface
#define ITileFlyoutUpdateManagerStatics_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_AddRef
#define ITileFlyoutUpdateManagerStatics_Release __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_Release
#define ITileFlyoutUpdateManagerStatics_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetIids
#define ITileFlyoutUpdateManagerStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetRuntimeClassName
#define ITileFlyoutUpdateManagerStatics_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetTrustLevel
#define ITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForApplication __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForApplication
#define ITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForApplicationWithId __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForApplicationWithId
#define ITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForSecondaryTile __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForSecondaryTile
#define ITileFlyoutUpdateManagerStatics_GetTemplateContent __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetTemplateContent
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * ITileFlyoutUpdater interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater, 0x8d40c76a, 0xc465, 0x4052, 0xa7,0x40, 0x5c,0x26,0x54,0xc1,0xa0,0x89);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("8d40c76a-c465-4052-a740-5c2654c1a089")
                ITileFlyoutUpdater : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE Update(
                        ABI::Windows::UI::Notifications::ITileFlyoutNotification *notification) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Clear(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StartPeriodicUpdate(
                        ABI::Windows::Foundation::IUriRuntimeClass *tile_flyout_content,
                        ABI::Windows::UI::Notifications::PeriodicUpdateRecurrence requested_interval) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StartPeriodicUpdateAtTime(
                        ABI::Windows::Foundation::IUriRuntimeClass *tile_flyout_content,
                        ABI::Windows::Foundation::DateTime start_time,
                        ABI::Windows::UI::Notifications::PeriodicUpdateRecurrence requested_interval) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StopPeriodicUpdate(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Setting(
                        ABI::Windows::UI::Notifications::NotificationSetting *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater, 0x8d40c76a, 0xc465, 0x4052, 0xa7,0x40, 0x5c,0x26,0x54,0xc1,0xa0,0x89)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdaterVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ITileFlyoutUpdater methods ***/
    HRESULT (STDMETHODCALLTYPE *Update)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater *This,
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification *notification);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater *This);

    HRESULT (STDMETHODCALLTYPE *StartPeriodicUpdate)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *tile_flyout_content,
        __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval);

    HRESULT (STDMETHODCALLTYPE *StartPeriodicUpdateAtTime)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *tile_flyout_content,
        __x_ABI_CWindows_CFoundation_CDateTime start_time,
        __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval);

    HRESULT (STDMETHODCALLTYPE *StopPeriodicUpdate)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater *This);

    HRESULT (STDMETHODCALLTYPE *get_Setting)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater *This,
        __x_ABI_CWindows_CUI_CNotifications_CNotificationSetting *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdaterVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdaterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileFlyoutUpdater methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_Update(This,notification) (This)->lpVtbl->Update(This,notification)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_Clear(This) (This)->lpVtbl->Clear(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_StartPeriodicUpdate(This,tile_flyout_content,requested_interval) (This)->lpVtbl->StartPeriodicUpdate(This,tile_flyout_content,requested_interval)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_StartPeriodicUpdateAtTime(This,tile_flyout_content,start_time,requested_interval) (This)->lpVtbl->StartPeriodicUpdateAtTime(This,tile_flyout_content,start_time,requested_interval)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_StopPeriodicUpdate(This) (This)->lpVtbl->StopPeriodicUpdate(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_get_Setting(This,value) (This)->lpVtbl->get_Setting(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_Release(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileFlyoutUpdater methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_Update(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This,__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification *notification) {
    return This->lpVtbl->Update(This,notification);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_Clear(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This) {
    return This->lpVtbl->Clear(This);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_StartPeriodicUpdate(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *tile_flyout_content,__x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval) {
    return This->lpVtbl->StartPeriodicUpdate(This,tile_flyout_content,requested_interval);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_StartPeriodicUpdateAtTime(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *tile_flyout_content,__x_ABI_CWindows_CFoundation_CDateTime start_time,__x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval) {
    return This->lpVtbl->StartPeriodicUpdateAtTime(This,tile_flyout_content,start_time,requested_interval);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_StopPeriodicUpdate(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This) {
    return This->lpVtbl->StopPeriodicUpdate(This);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_get_Setting(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This,__x_ABI_CWindows_CUI_CNotifications_CNotificationSetting *value) {
    return This->lpVtbl->get_Setting(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileFlyoutUpdater IID___x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater
#define ITileFlyoutUpdaterVtbl __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdaterVtbl
#define ITileFlyoutUpdater __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater
#define ITileFlyoutUpdater_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_QueryInterface
#define ITileFlyoutUpdater_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_AddRef
#define ITileFlyoutUpdater_Release __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_Release
#define ITileFlyoutUpdater_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_GetIids
#define ITileFlyoutUpdater_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_GetRuntimeClassName
#define ITileFlyoutUpdater_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_GetTrustLevel
#define ITileFlyoutUpdater_Update __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_Update
#define ITileFlyoutUpdater_Clear __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_Clear
#define ITileFlyoutUpdater_StartPeriodicUpdate __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_StartPeriodicUpdate
#define ITileFlyoutUpdater_StartPeriodicUpdateAtTime __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_StartPeriodicUpdateAtTime
#define ITileFlyoutUpdater_StopPeriodicUpdate __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_StopPeriodicUpdate
#define ITileFlyoutUpdater_get_Setting __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_get_Setting
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * ITileNotification interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileNotification_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileNotification, 0xebaec8fa, 0x50ec, 0x4c18, 0xb4,0xd0, 0x3a,0xf0,0x2e,0x55,0x40,0xab);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("ebaec8fa-50ec-4c18-b4d0-3af02e5540ab")
                ITileNotification : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Content(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Tag(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Tag(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileNotification, 0xebaec8fa, 0x50ec, 0x4c18, 0xb4,0xd0, 0x3a,0xf0,0x2e,0x55,0x40,0xab)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ITileNotification methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Content)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotification *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value);

    HRESULT (STDMETHODCALLTYPE *put_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotification *This,
        __FIReference_1_DateTime *value);

    HRESULT (STDMETHODCALLTYPE *get_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotification *This,
        __FIReference_1_DateTime **value);

    HRESULT (STDMETHODCALLTYPE *put_Tag)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotification *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Tag)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotification *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileNotificationVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileNotification {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileNotification methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_get_Content(This,value) (This)->lpVtbl->get_Content(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_put_ExpirationTime(This,value) (This)->lpVtbl->put_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_get_ExpirationTime(This,value) (This)->lpVtbl->get_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_put_Tag(This,value) (This)->lpVtbl->put_Tag(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_get_Tag(This,value) (This)->lpVtbl->get_Tag(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotification_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileNotification_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileNotification_Release(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotification_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotification_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotification_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileNotification methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotification_get_Content(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value) {
    return This->lpVtbl->get_Content(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotification_put_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This,__FIReference_1_DateTime *value) {
    return This->lpVtbl->put_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotification_get_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This,__FIReference_1_DateTime **value) {
    return This->lpVtbl->get_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotification_put_Tag(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This,HSTRING value) {
    return This->lpVtbl->put_Tag(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotification_get_Tag(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This,HSTRING *value) {
    return This->lpVtbl->get_Tag(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileNotification IID___x_ABI_CWindows_CUI_CNotifications_CITileNotification
#define ITileNotificationVtbl __x_ABI_CWindows_CUI_CNotifications_CITileNotificationVtbl
#define ITileNotification __x_ABI_CWindows_CUI_CNotifications_CITileNotification
#define ITileNotification_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileNotification_QueryInterface
#define ITileNotification_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileNotification_AddRef
#define ITileNotification_Release __x_ABI_CWindows_CUI_CNotifications_CITileNotification_Release
#define ITileNotification_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileNotification_GetIids
#define ITileNotification_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileNotification_GetRuntimeClassName
#define ITileNotification_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileNotification_GetTrustLevel
#define ITileNotification_get_Content __x_ABI_CWindows_CUI_CNotifications_CITileNotification_get_Content
#define ITileNotification_put_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CITileNotification_put_ExpirationTime
#define ITileNotification_get_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CITileNotification_get_ExpirationTime
#define ITileNotification_put_Tag __x_ABI_CWindows_CUI_CNotifications_CITileNotification_put_Tag
#define ITileNotification_get_Tag __x_ABI_CWindows_CUI_CNotifications_CITileNotification_get_Tag
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * ITileNotificationFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory, 0xc6abdd6e, 0x4928, 0x46c8, 0xbd,0xbf, 0x81,0xa0,0x47,0xde,0xa0,0xd4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("c6abdd6e-4928-46c8-bdbf-81a047dea0d4")
                ITileNotificationFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateTileNotification(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument *content,
                        ABI::Windows::UI::Notifications::ITileNotification **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory, 0xc6abdd6e, 0x4928, 0x46c8, 0xbd,0xbf, 0x81,0xa0,0x47,0xde,0xa0,0xd4)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ITileNotificationFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateTileNotification)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,
        __x_ABI_CWindows_CUI_CNotifications_CITileNotification **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactoryVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileNotificationFactory methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_CreateTileNotification(This,content,value) (This)->lpVtbl->CreateTileNotification(This,content,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_Release(__x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileNotificationFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_CreateTileNotification(__x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,__x_ABI_CWindows_CUI_CNotifications_CITileNotification **value) {
    return This->lpVtbl->CreateTileNotification(This,content,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileNotificationFactory IID___x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory
#define ITileNotificationFactoryVtbl __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactoryVtbl
#define ITileNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory
#define ITileNotificationFactory_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_QueryInterface
#define ITileNotificationFactory_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_AddRef
#define ITileNotificationFactory_Release __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_Release
#define ITileNotificationFactory_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_GetIids
#define ITileNotificationFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_GetRuntimeClassName
#define ITileNotificationFactory_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_GetTrustLevel
#define ITileNotificationFactory_CreateTileNotification __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_CreateTileNotification
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * ITileUpdateManagerForUser interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser, 0x55141348, 0x2ee2, 0x4e2d, 0x9c,0xc1, 0x21,0x6a,0x20,0xde,0xcc,0x9f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("55141348-2ee2-4e2d-9cc1-216a20decc9f")
                ITileUpdateManagerForUser : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateTileUpdaterForApplication(
                        ABI::Windows::UI::Notifications::ITileUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateTileUpdaterForApplicationWithId(
                        HSTRING application_id,
                        ABI::Windows::UI::Notifications::ITileUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateTileUpdaterForSecondaryTile(
                        HSTRING tile_id,
                        ABI::Windows::UI::Notifications::ITileUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_User(
                        ABI::Windows::System::IUser **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser, 0x55141348, 0x2ee2, 0x4e2d, 0x9c,0xc1, 0x21,0x6a,0x20,0xde,0xcc,0x9f)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUserVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ITileUpdateManagerForUser methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateTileUpdaterForApplication)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser *This,
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result);

    HRESULT (STDMETHODCALLTYPE *CreateTileUpdaterForApplicationWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser *This,
        HSTRING application_id,
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result);

    HRESULT (STDMETHODCALLTYPE *CreateTileUpdaterForSecondaryTile)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser *This,
        HSTRING tile_id,
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result);

    HRESULT (STDMETHODCALLTYPE *get_User)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser *This,
        __x_ABI_CWindows_CSystem_CIUser **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUserVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUserVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileUpdateManagerForUser methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_CreateTileUpdaterForApplication(This,result) (This)->lpVtbl->CreateTileUpdaterForApplication(This,result)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_CreateTileUpdaterForApplicationWithId(This,application_id,result) (This)->lpVtbl->CreateTileUpdaterForApplicationWithId(This,application_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_CreateTileUpdaterForSecondaryTile(This,tile_id,result) (This)->lpVtbl->CreateTileUpdaterForSecondaryTile(This,tile_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_get_User(This,value) (This)->lpVtbl->get_User(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_Release(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileUpdateManagerForUser methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_CreateTileUpdaterForApplication(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser* This,__x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result) {
    return This->lpVtbl->CreateTileUpdaterForApplication(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_CreateTileUpdaterForApplicationWithId(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser* This,HSTRING application_id,__x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result) {
    return This->lpVtbl->CreateTileUpdaterForApplicationWithId(This,application_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_CreateTileUpdaterForSecondaryTile(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser* This,HSTRING tile_id,__x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result) {
    return This->lpVtbl->CreateTileUpdaterForSecondaryTile(This,tile_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_get_User(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser* This,__x_ABI_CWindows_CSystem_CIUser **value) {
    return This->lpVtbl->get_User(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileUpdateManagerForUser IID___x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser
#define ITileUpdateManagerForUserVtbl __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUserVtbl
#define ITileUpdateManagerForUser __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser
#define ITileUpdateManagerForUser_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_QueryInterface
#define ITileUpdateManagerForUser_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_AddRef
#define ITileUpdateManagerForUser_Release __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_Release
#define ITileUpdateManagerForUser_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_GetIids
#define ITileUpdateManagerForUser_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_GetRuntimeClassName
#define ITileUpdateManagerForUser_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_GetTrustLevel
#define ITileUpdateManagerForUser_CreateTileUpdaterForApplication __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_CreateTileUpdaterForApplication
#define ITileUpdateManagerForUser_CreateTileUpdaterForApplicationWithId __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_CreateTileUpdaterForApplicationWithId
#define ITileUpdateManagerForUser_CreateTileUpdaterForSecondaryTile __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_CreateTileUpdaterForSecondaryTile
#define ITileUpdateManagerForUser_get_User __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_get_User
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * ITileUpdateManagerStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics, 0xda159e5d, 0x3ea9, 0x4986, 0x8d,0x84, 0xb0,0x9d,0x5e,0x12,0x27,0x6d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("da159e5d-3ea9-4986-8d84-b09d5e12276d")
                ITileUpdateManagerStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateTileUpdaterForApplication(
                        ABI::Windows::UI::Notifications::ITileUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateTileUpdaterForApplicationWithId(
                        HSTRING application_id,
                        ABI::Windows::UI::Notifications::ITileUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateTileUpdaterForSecondaryTile(
                        HSTRING tileId,
                        ABI::Windows::UI::Notifications::ITileUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetTemplateContent(
                        ABI::Windows::UI::Notifications::TileTemplateType type,
                        ABI::Windows::Data::Xml::Dom::IXmlDocument **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics, 0xda159e5d, 0x3ea9, 0x4986, 0x8d,0x84, 0xb0,0x9d,0x5e,0x12,0x27,0x6d)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ITileUpdateManagerStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateTileUpdaterForApplication)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics *This,
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result);

    HRESULT (STDMETHODCALLTYPE *CreateTileUpdaterForApplicationWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics *This,
        HSTRING application_id,
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result);

    HRESULT (STDMETHODCALLTYPE *CreateTileUpdaterForSecondaryTile)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics *This,
        HSTRING tileId,
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result);

    HRESULT (STDMETHODCALLTYPE *GetTemplateContent)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics *This,
        __x_ABI_CWindows_CUI_CNotifications_CTileTemplateType type,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStaticsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileUpdateManagerStatics methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_CreateTileUpdaterForApplication(This,result) (This)->lpVtbl->CreateTileUpdaterForApplication(This,result)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_CreateTileUpdaterForApplicationWithId(This,application_id,result) (This)->lpVtbl->CreateTileUpdaterForApplicationWithId(This,application_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_CreateTileUpdaterForSecondaryTile(This,tileId,result) (This)->lpVtbl->CreateTileUpdaterForSecondaryTile(This,tileId,result)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetTemplateContent(This,type,result) (This)->lpVtbl->GetTemplateContent(This,type,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_Release(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileUpdateManagerStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_CreateTileUpdaterForApplication(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics* This,__x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result) {
    return This->lpVtbl->CreateTileUpdaterForApplication(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_CreateTileUpdaterForApplicationWithId(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics* This,HSTRING application_id,__x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result) {
    return This->lpVtbl->CreateTileUpdaterForApplicationWithId(This,application_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_CreateTileUpdaterForSecondaryTile(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics* This,HSTRING tileId,__x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result) {
    return This->lpVtbl->CreateTileUpdaterForSecondaryTile(This,tileId,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetTemplateContent(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics* This,__x_ABI_CWindows_CUI_CNotifications_CTileTemplateType type,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **result) {
    return This->lpVtbl->GetTemplateContent(This,type,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileUpdateManagerStatics IID___x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics
#define ITileUpdateManagerStaticsVtbl __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStaticsVtbl
#define ITileUpdateManagerStatics __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics
#define ITileUpdateManagerStatics_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_QueryInterface
#define ITileUpdateManagerStatics_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_AddRef
#define ITileUpdateManagerStatics_Release __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_Release
#define ITileUpdateManagerStatics_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetIids
#define ITileUpdateManagerStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetRuntimeClassName
#define ITileUpdateManagerStatics_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetTrustLevel
#define ITileUpdateManagerStatics_CreateTileUpdaterForApplication __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_CreateTileUpdaterForApplication
#define ITileUpdateManagerStatics_CreateTileUpdaterForApplicationWithId __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_CreateTileUpdaterForApplicationWithId
#define ITileUpdateManagerStatics_CreateTileUpdaterForSecondaryTile __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_CreateTileUpdaterForSecondaryTile
#define ITileUpdateManagerStatics_GetTemplateContent __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetTemplateContent
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * ITileUpdateManagerStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2, 0x731c1ddc, 0x8e14, 0x4b7c, 0xa3,0x4b, 0x9d,0x22,0xde,0x76,0xc8,0x4d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("731c1ddc-8e14-4b7c-a34b-9d22de76c84d")
                ITileUpdateManagerStatics2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetForUser(
                        ABI::Windows::System::IUser *user,
                        ABI::Windows::UI::Notifications::ITileUpdateManagerForUser **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2, 0x731c1ddc, 0x8e14, 0x4b7c, 0xa3,0x4b, 0x9d,0x22,0xde,0x76,0xc8,0x4d)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ITileUpdateManagerStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetForUser)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2 *This,
        __x_ABI_CWindows_CSystem_CIUser *user,
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileUpdateManagerStatics2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetForUser(This,user,result) (This)->lpVtbl->GetForUser(This,user,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_Release(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileUpdateManagerStatics2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetForUser(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2* This,__x_ABI_CWindows_CSystem_CIUser *user,__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser **result) {
    return This->lpVtbl->GetForUser(This,user,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileUpdateManagerStatics2 IID___x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2
#define ITileUpdateManagerStatics2Vtbl __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2Vtbl
#define ITileUpdateManagerStatics2 __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2
#define ITileUpdateManagerStatics2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_QueryInterface
#define ITileUpdateManagerStatics2_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_AddRef
#define ITileUpdateManagerStatics2_Release __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_Release
#define ITileUpdateManagerStatics2_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetIids
#define ITileUpdateManagerStatics2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetRuntimeClassName
#define ITileUpdateManagerStatics2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetTrustLevel
#define ITileUpdateManagerStatics2_GetForUser __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetForUser
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * ITileUpdater interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileUpdater, 0x0942a48b, 0x1d91, 0x44ec, 0x92,0x43, 0xc1,0xe8,0x21,0xc2,0x9a,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("0942a48b-1d91-44ec-9243-c1e821c29a20")
                ITileUpdater : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE Update(
                        ABI::Windows::UI::Notifications::ITileNotification *notification) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Clear(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE EnableNotificationQueue(
                        boolean enable) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Setting(
                        ABI::Windows::UI::Notifications::NotificationSetting *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE AddToSchedule(
                        ABI::Windows::UI::Notifications::IScheduledTileNotification *scheduled_tile) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RemoveFromSchedule(
                        ABI::Windows::UI::Notifications::IScheduledTileNotification *scheduled_tile) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetScheduledTileNotifications(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ScheduledTileNotification* > **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StartPeriodicUpdate(
                        ABI::Windows::Foundation::IUriRuntimeClass *tile_content,
                        ABI::Windows::UI::Notifications::PeriodicUpdateRecurrence requested_interval) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StartPeriodicUpdateAtTime(
                        ABI::Windows::Foundation::IUriRuntimeClass *tile_content,
                        ABI::Windows::Foundation::DateTime start_time,
                        ABI::Windows::UI::Notifications::PeriodicUpdateRecurrence requested_interval) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StopPeriodicUpdate(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StartPeriodicUpdateBatch(
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Uri* > *tile_contents,
                        ABI::Windows::UI::Notifications::PeriodicUpdateRecurrence requested_interval) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StartPeriodicUpdateBatchAtTime(
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Uri* > *tile_contents,
                        ABI::Windows::Foundation::DateTime start_time,
                        ABI::Windows::UI::Notifications::PeriodicUpdateRecurrence requested_interval) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater, 0x0942a48b, 0x1d91, 0x44ec, 0x92,0x43, 0xc1,0xe8,0x21,0xc2,0x9a,0x20)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileUpdaterVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ITileUpdater methods ***/
    HRESULT (STDMETHODCALLTYPE *Update)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        __x_ABI_CWindows_CUI_CNotifications_CITileNotification *notification);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This);

    HRESULT (STDMETHODCALLTYPE *EnableNotificationQueue)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        boolean enable);

    HRESULT (STDMETHODCALLTYPE *get_Setting)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        __x_ABI_CWindows_CUI_CNotifications_CNotificationSetting *value);

    HRESULT (STDMETHODCALLTYPE *AddToSchedule)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *scheduled_tile);

    HRESULT (STDMETHODCALLTYPE *RemoveFromSchedule)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *scheduled_tile);

    HRESULT (STDMETHODCALLTYPE *GetScheduledTileNotifications)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification **result);

    HRESULT (STDMETHODCALLTYPE *StartPeriodicUpdate)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *tile_content,
        __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval);

    HRESULT (STDMETHODCALLTYPE *StartPeriodicUpdateAtTime)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *tile_content,
        __x_ABI_CWindows_CFoundation_CDateTime start_time,
        __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval);

    HRESULT (STDMETHODCALLTYPE *StopPeriodicUpdate)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This);

    HRESULT (STDMETHODCALLTYPE *StartPeriodicUpdateBatch)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        __FIIterable_1_Windows__CFoundation__CUri *tile_contents,
        __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval);

    HRESULT (STDMETHODCALLTYPE *StartPeriodicUpdateBatchAtTime)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        __FIIterable_1_Windows__CFoundation__CUri *tile_contents,
        __x_ABI_CWindows_CFoundation_CDateTime start_time,
        __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileUpdaterVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdater {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileUpdaterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileUpdater methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_Update(This,notification) (This)->lpVtbl->Update(This,notification)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_Clear(This) (This)->lpVtbl->Clear(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_EnableNotificationQueue(This,enable) (This)->lpVtbl->EnableNotificationQueue(This,enable)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_get_Setting(This,value) (This)->lpVtbl->get_Setting(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_AddToSchedule(This,scheduled_tile) (This)->lpVtbl->AddToSchedule(This,scheduled_tile)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_RemoveFromSchedule(This,scheduled_tile) (This)->lpVtbl->RemoveFromSchedule(This,scheduled_tile)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetScheduledTileNotifications(This,result) (This)->lpVtbl->GetScheduledTileNotifications(This,result)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdate(This,tile_content,requested_interval) (This)->lpVtbl->StartPeriodicUpdate(This,tile_content,requested_interval)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdateAtTime(This,tile_content,start_time,requested_interval) (This)->lpVtbl->StartPeriodicUpdateAtTime(This,tile_content,start_time,requested_interval)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StopPeriodicUpdate(This) (This)->lpVtbl->StopPeriodicUpdate(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdateBatch(This,tile_contents,requested_interval) (This)->lpVtbl->StartPeriodicUpdateBatch(This,tile_contents,requested_interval)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdateBatchAtTime(This,tile_contents,start_time,requested_interval) (This)->lpVtbl->StartPeriodicUpdateBatchAtTime(This,tile_contents,start_time,requested_interval)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_Release(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileUpdater methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_Update(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,__x_ABI_CWindows_CUI_CNotifications_CITileNotification *notification) {
    return This->lpVtbl->Update(This,notification);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_Clear(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This) {
    return This->lpVtbl->Clear(This);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_EnableNotificationQueue(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,boolean enable) {
    return This->lpVtbl->EnableNotificationQueue(This,enable);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_get_Setting(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,__x_ABI_CWindows_CUI_CNotifications_CNotificationSetting *value) {
    return This->lpVtbl->get_Setting(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_AddToSchedule(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *scheduled_tile) {
    return This->lpVtbl->AddToSchedule(This,scheduled_tile);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_RemoveFromSchedule(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *scheduled_tile) {
    return This->lpVtbl->RemoveFromSchedule(This,scheduled_tile);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetScheduledTileNotifications(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification **result) {
    return This->lpVtbl->GetScheduledTileNotifications(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdate(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *tile_content,__x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval) {
    return This->lpVtbl->StartPeriodicUpdate(This,tile_content,requested_interval);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdateAtTime(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *tile_content,__x_ABI_CWindows_CFoundation_CDateTime start_time,__x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval) {
    return This->lpVtbl->StartPeriodicUpdateAtTime(This,tile_content,start_time,requested_interval);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StopPeriodicUpdate(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This) {
    return This->lpVtbl->StopPeriodicUpdate(This);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdateBatch(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,__FIIterable_1_Windows__CFoundation__CUri *tile_contents,__x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval) {
    return This->lpVtbl->StartPeriodicUpdateBatch(This,tile_contents,requested_interval);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdateBatchAtTime(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,__FIIterable_1_Windows__CFoundation__CUri *tile_contents,__x_ABI_CWindows_CFoundation_CDateTime start_time,__x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval) {
    return This->lpVtbl->StartPeriodicUpdateBatchAtTime(This,tile_contents,start_time,requested_interval);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileUpdater IID___x_ABI_CWindows_CUI_CNotifications_CITileUpdater
#define ITileUpdaterVtbl __x_ABI_CWindows_CUI_CNotifications_CITileUpdaterVtbl
#define ITileUpdater __x_ABI_CWindows_CUI_CNotifications_CITileUpdater
#define ITileUpdater_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_QueryInterface
#define ITileUpdater_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_AddRef
#define ITileUpdater_Release __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_Release
#define ITileUpdater_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetIids
#define ITileUpdater_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetRuntimeClassName
#define ITileUpdater_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetTrustLevel
#define ITileUpdater_Update __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_Update
#define ITileUpdater_Clear __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_Clear
#define ITileUpdater_EnableNotificationQueue __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_EnableNotificationQueue
#define ITileUpdater_get_Setting __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_get_Setting
#define ITileUpdater_AddToSchedule __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_AddToSchedule
#define ITileUpdater_RemoveFromSchedule __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_RemoveFromSchedule
#define ITileUpdater_GetScheduledTileNotifications __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetScheduledTileNotifications
#define ITileUpdater_StartPeriodicUpdate __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdate
#define ITileUpdater_StartPeriodicUpdateAtTime __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdateAtTime
#define ITileUpdater_StopPeriodicUpdate __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StopPeriodicUpdate
#define ITileUpdater_StartPeriodicUpdateBatch __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdateBatch
#define ITileUpdater_StartPeriodicUpdateBatchAtTime __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdateBatchAtTime
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * ITileUpdater2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileUpdater2, 0xa2266e12, 0x15ee, 0x43ed, 0x83,0xf5, 0x65,0xb3,0x52,0xbb,0x1a,0x84);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("a2266e12-15ee-43ed-83f5-65b352bb1a84")
                ITileUpdater2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE EnableNotificationQueueForSquare150x150(
                        boolean enable) = 0;

                    virtual HRESULT STDMETHODCALLTYPE EnableNotificationQueueForWide310x150(
                        boolean enable) = 0;

                    virtual HRESULT STDMETHODCALLTYPE EnableNotificationQueueForSquare310x310(
                        boolean enable) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater2, 0xa2266e12, 0x15ee, 0x43ed, 0x83,0xf5, 0x65,0xb3,0x52,0xbb,0x1a,0x84)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ITileUpdater2 methods ***/
    HRESULT (STDMETHODCALLTYPE *EnableNotificationQueueForSquare150x150)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 *This,
        boolean enable);

    HRESULT (STDMETHODCALLTYPE *EnableNotificationQueueForWide310x150)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 *This,
        boolean enable);

    HRESULT (STDMETHODCALLTYPE *EnableNotificationQueueForSquare310x310)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 *This,
        boolean enable);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileUpdater2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_EnableNotificationQueueForSquare150x150(This,enable) (This)->lpVtbl->EnableNotificationQueueForSquare150x150(This,enable)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_EnableNotificationQueueForWide310x150(This,enable) (This)->lpVtbl->EnableNotificationQueueForWide310x150(This,enable)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_EnableNotificationQueueForSquare310x310(This,enable) (This)->lpVtbl->EnableNotificationQueueForSquare310x310(This,enable)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_Release(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileUpdater2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_EnableNotificationQueueForSquare150x150(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater2* This,boolean enable) {
    return This->lpVtbl->EnableNotificationQueueForSquare150x150(This,enable);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_EnableNotificationQueueForWide310x150(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater2* This,boolean enable) {
    return This->lpVtbl->EnableNotificationQueueForWide310x150(This,enable);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_EnableNotificationQueueForSquare310x310(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater2* This,boolean enable) {
    return This->lpVtbl->EnableNotificationQueueForSquare310x310(This,enable);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileUpdater2 IID___x_ABI_CWindows_CUI_CNotifications_CITileUpdater2
#define ITileUpdater2Vtbl __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2Vtbl
#define ITileUpdater2 __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2
#define ITileUpdater2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_QueryInterface
#define ITileUpdater2_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_AddRef
#define ITileUpdater2_Release __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_Release
#define ITileUpdater2_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_GetIids
#define ITileUpdater2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_GetRuntimeClassName
#define ITileUpdater2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_GetTrustLevel
#define ITileUpdater2_EnableNotificationQueueForSquare150x150 __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_EnableNotificationQueueForSquare150x150
#define ITileUpdater2_EnableNotificationQueueForWide310x150 __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_EnableNotificationQueueForWide310x150
#define ITileUpdater2_EnableNotificationQueueForSquare310x310 __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_EnableNotificationQueueForSquare310x310
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IToastActivatedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs, 0xe3bf92f3, 0xc197, 0x436f, 0x82,0x65, 0x06,0x25,0x82,0x4f,0x8d,0xac);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("e3bf92f3-c197-436f-8265-0625824f8dac")
                IToastActivatedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Arguments(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs, 0xe3bf92f3, 0xc197, 0x436f, 0x82,0x65, 0x06,0x25,0x82,0x4f,0x8d,0xac)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastActivatedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Arguments)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastActivatedEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_get_Arguments(This,value) (This)->lpVtbl->get_Arguments(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastActivatedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_get_Arguments(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs* This,HSTRING *value) {
    return This->lpVtbl->get_Arguments(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastActivatedEventArgs IID___x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs
#define IToastActivatedEventArgsVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgsVtbl
#define IToastActivatedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs
#define IToastActivatedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_QueryInterface
#define IToastActivatedEventArgs_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_AddRef
#define IToastActivatedEventArgs_Release __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_Release
#define IToastActivatedEventArgs_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_GetIids
#define IToastActivatedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_GetRuntimeClassName
#define IToastActivatedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_GetTrustLevel
#define IToastActivatedEventArgs_get_Arguments __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_get_Arguments
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IToastActivatedEventArgs2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2, 0xab7da512, 0xcc61, 0x568e, 0x81,0xbe, 0x30,0x4a,0xc3,0x10,0x38,0xfa);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("ab7da512-cc61-568e-81be-304ac31038fa")
                IToastActivatedEventArgs2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_UserInput(
                        ABI::Windows::Foundation::Collections::IPropertySet **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2, 0xab7da512, 0xcc61, 0x568e, 0x81,0xbe, 0x30,0x4a,0xc3,0x10,0x38,0xfa)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastActivatedEventArgs2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UserInput)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2 *This,
        __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastActivatedEventArgs2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_get_UserInput(This,value) (This)->lpVtbl->get_UserInput(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastActivatedEventArgs2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_get_UserInput(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2* This,__x_ABI_CWindows_CFoundation_CCollections_CIPropertySet **value) {
    return This->lpVtbl->get_UserInput(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastActivatedEventArgs2 IID___x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2
#define IToastActivatedEventArgs2Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2Vtbl
#define IToastActivatedEventArgs2 __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2
#define IToastActivatedEventArgs2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_QueryInterface
#define IToastActivatedEventArgs2_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_AddRef
#define IToastActivatedEventArgs2_Release __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_Release
#define IToastActivatedEventArgs2_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_GetIids
#define IToastActivatedEventArgs2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_GetRuntimeClassName
#define IToastActivatedEventArgs2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_GetTrustLevel
#define IToastActivatedEventArgs2_get_UserInput __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_get_UserInput
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IToastCollection interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastCollection_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastCollection, 0x0a8bc3b0, 0xe0be, 0x4858, 0xbc,0x2a, 0x89,0xdf,0xe0,0xb3,0x28,0x63);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("0a8bc3b0-e0be-4858-bc2a-89dfe0b32863")
                IToastCollection : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Id(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_DisplayName(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_DisplayName(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_LaunchArgs(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_LaunchArgs(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Icon(
                        ABI::Windows::Foundation::IUriRuntimeClass **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Icon(
                        ABI::Windows::Foundation::IUriRuntimeClass *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection, 0x0a8bc3b0, 0xe0be, 0x4858, 0xbc,0x2a, 0x89,0xdf,0xe0,0xb3,0x28,0x63)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_DisplayName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_DisplayName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_LaunchArgs)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_LaunchArgs)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Icon)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value);

    HRESULT (STDMETHODCALLTYPE *put_Icon)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastCollection {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastCollection methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_Id(This,value) (This)->lpVtbl->get_Id(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_DisplayName(This,value) (This)->lpVtbl->get_DisplayName(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_put_DisplayName(This,value) (This)->lpVtbl->put_DisplayName(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_LaunchArgs(This,value) (This)->lpVtbl->get_LaunchArgs(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_put_LaunchArgs(This,value) (This)->lpVtbl->put_LaunchArgs(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_Icon(This,value) (This)->lpVtbl->get_Icon(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_put_Icon(This,value) (This)->lpVtbl->put_Icon(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastCollection methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_Id(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,HSTRING *value) {
    return This->lpVtbl->get_Id(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_DisplayName(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,HSTRING *value) {
    return This->lpVtbl->get_DisplayName(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_put_DisplayName(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,HSTRING value) {
    return This->lpVtbl->put_DisplayName(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_LaunchArgs(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,HSTRING *value) {
    return This->lpVtbl->get_LaunchArgs(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_put_LaunchArgs(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,HSTRING value) {
    return This->lpVtbl->put_LaunchArgs(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_Icon(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value) {
    return This->lpVtbl->get_Icon(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_put_Icon(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *value) {
    return This->lpVtbl->put_Icon(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastCollection IID___x_ABI_CWindows_CUI_CNotifications_CIToastCollection
#define IToastCollectionVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionVtbl
#define IToastCollection __x_ABI_CWindows_CUI_CNotifications_CIToastCollection
#define IToastCollection_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_QueryInterface
#define IToastCollection_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_AddRef
#define IToastCollection_Release __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_Release
#define IToastCollection_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_GetIids
#define IToastCollection_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_GetRuntimeClassName
#define IToastCollection_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_GetTrustLevel
#define IToastCollection_get_Id __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_Id
#define IToastCollection_get_DisplayName __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_DisplayName
#define IToastCollection_put_DisplayName __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_put_DisplayName
#define IToastCollection_get_LaunchArgs __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_LaunchArgs
#define IToastCollection_put_LaunchArgs __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_put_LaunchArgs
#define IToastCollection_get_Icon __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_Icon
#define IToastCollection_put_Icon __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_put_Icon
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastCollection_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IToastCollectionFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory, 0x164dd3d7, 0x73c4, 0x44f7, 0xb4,0xff, 0xfb,0x6d,0x4b,0xf1,0xf4,0xc6);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("164dd3d7-73c4-44f7-b4ff-fb6d4bf1f4c6")
                IToastCollectionFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateInstance(
                        HSTRING collection_id,
                        HSTRING display_name,
                        HSTRING launch_args,
                        ABI::Windows::Foundation::IUriRuntimeClass *icon_uri,
                        ABI::Windows::UI::Notifications::IToastCollection **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory, 0x164dd3d7, 0x73c4, 0x44f7, 0xb4,0xff, 0xfb,0x6d,0x4b,0xf1,0xf4,0xc6)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastCollectionFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateInstance)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory *This,
        HSTRING collection_id,
        HSTRING display_name,
        HSTRING launch_args,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *icon_uri,
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactoryVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastCollectionFactory methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_CreateInstance(This,collection_id,display_name,launch_args,icon_uri,value) (This)->lpVtbl->CreateInstance(This,collection_id,display_name,launch_args,icon_uri,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastCollectionFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_CreateInstance(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory* This,HSTRING collection_id,HSTRING display_name,HSTRING launch_args,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *icon_uri,__x_ABI_CWindows_CUI_CNotifications_CIToastCollection **value) {
    return This->lpVtbl->CreateInstance(This,collection_id,display_name,launch_args,icon_uri,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastCollectionFactory IID___x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory
#define IToastCollectionFactoryVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactoryVtbl
#define IToastCollectionFactory __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory
#define IToastCollectionFactory_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_QueryInterface
#define IToastCollectionFactory_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_AddRef
#define IToastCollectionFactory_Release __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_Release
#define IToastCollectionFactory_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_GetIids
#define IToastCollectionFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_GetRuntimeClassName
#define IToastCollectionFactory_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_GetTrustLevel
#define IToastCollectionFactory_CreateInstance __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_CreateInstance
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IToastCollectionManager interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager, 0x2a1821fe, 0x179d, 0x49bc, 0xb7,0x9d, 0xa5,0x27,0x92,0x0d,0x36,0x65);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("2a1821fe-179d-49bc-b79d-a527920d3665")
                IToastCollectionManager : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE SaveToastCollectionAsync(
                        ABI::Windows::UI::Notifications::IToastCollection *collection,
                        ABI::Windows::Foundation::IAsyncAction **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FindAllToastCollectionsAsync(
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetToastCollectionAsync(
                        HSTRING collection_id,
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Notifications::ToastCollection* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RemoveToastCollectionAsync(
                        HSTRING collection_id,
                        ABI::Windows::Foundation::IAsyncAction **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RemoveAllToastCollectionsAsync(
                        ABI::Windows::Foundation::IAsyncAction **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_User(
                        ABI::Windows::System::IUser **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_AppId(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager, 0x2a1821fe, 0x179d, 0x49bc, 0xb7,0x9d, 0xa5,0x27,0x92,0x0d,0x36,0x65)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManagerVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastCollectionManager methods ***/
    HRESULT (STDMETHODCALLTYPE *SaveToastCollectionAsync)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *collection,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **operation);

    HRESULT (STDMETHODCALLTYPE *FindAllToastCollectionsAsync)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager *This,
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection **operation);

    HRESULT (STDMETHODCALLTYPE *GetToastCollectionAsync)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager *This,
        HSTRING collection_id,
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection **operation);

    HRESULT (STDMETHODCALLTYPE *RemoveToastCollectionAsync)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager *This,
        HSTRING collection_id,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **operation);

    HRESULT (STDMETHODCALLTYPE *RemoveAllToastCollectionsAsync)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager *This,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **operation);

    HRESULT (STDMETHODCALLTYPE *get_User)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager *This,
        __x_ABI_CWindows_CSystem_CIUser **value);

    HRESULT (STDMETHODCALLTYPE *get_AppId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManagerVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastCollectionManager methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_SaveToastCollectionAsync(This,collection,operation) (This)->lpVtbl->SaveToastCollectionAsync(This,collection,operation)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_FindAllToastCollectionsAsync(This,operation) (This)->lpVtbl->FindAllToastCollectionsAsync(This,operation)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetToastCollectionAsync(This,collection_id,operation) (This)->lpVtbl->GetToastCollectionAsync(This,collection_id,operation)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_RemoveToastCollectionAsync(This,collection_id,operation) (This)->lpVtbl->RemoveToastCollectionAsync(This,collection_id,operation)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_RemoveAllToastCollectionsAsync(This,operation) (This)->lpVtbl->RemoveAllToastCollectionsAsync(This,operation)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_get_User(This,value) (This)->lpVtbl->get_User(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_get_AppId(This,value) (This)->lpVtbl->get_AppId(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastCollectionManager methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_SaveToastCollectionAsync(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,__x_ABI_CWindows_CUI_CNotifications_CIToastCollection *collection,__x_ABI_CWindows_CFoundation_CIAsyncAction **operation) {
    return This->lpVtbl->SaveToastCollectionAsync(This,collection,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_FindAllToastCollectionsAsync(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection **operation) {
    return This->lpVtbl->FindAllToastCollectionsAsync(This,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetToastCollectionAsync(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,HSTRING collection_id,__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection **operation) {
    return This->lpVtbl->GetToastCollectionAsync(This,collection_id,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_RemoveToastCollectionAsync(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,HSTRING collection_id,__x_ABI_CWindows_CFoundation_CIAsyncAction **operation) {
    return This->lpVtbl->RemoveToastCollectionAsync(This,collection_id,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_RemoveAllToastCollectionsAsync(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,__x_ABI_CWindows_CFoundation_CIAsyncAction **operation) {
    return This->lpVtbl->RemoveAllToastCollectionsAsync(This,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_get_User(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,__x_ABI_CWindows_CSystem_CIUser **value) {
    return This->lpVtbl->get_User(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_get_AppId(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,HSTRING *value) {
    return This->lpVtbl->get_AppId(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastCollectionManager IID___x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager
#define IToastCollectionManagerVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManagerVtbl
#define IToastCollectionManager __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager
#define IToastCollectionManager_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_QueryInterface
#define IToastCollectionManager_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_AddRef
#define IToastCollectionManager_Release __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_Release
#define IToastCollectionManager_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetIids
#define IToastCollectionManager_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetRuntimeClassName
#define IToastCollectionManager_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetTrustLevel
#define IToastCollectionManager_SaveToastCollectionAsync __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_SaveToastCollectionAsync
#define IToastCollectionManager_FindAllToastCollectionsAsync __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_FindAllToastCollectionsAsync
#define IToastCollectionManager_GetToastCollectionAsync __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetToastCollectionAsync
#define IToastCollectionManager_RemoveToastCollectionAsync __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_RemoveToastCollectionAsync
#define IToastCollectionManager_RemoveAllToastCollectionsAsync __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_RemoveAllToastCollectionsAsync
#define IToastCollectionManager_get_User __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_get_User
#define IToastCollectionManager_get_AppId __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_get_AppId
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IToastDismissedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs, 0x3f89d935, 0xd9cb, 0x4538, 0xa0,0xf0, 0xff,0xe7,0x65,0x99,0x38,0xf8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("3f89d935-d9cb-4538-a0f0-ffe7659938f8")
                IToastDismissedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Reason(
                        ABI::Windows::UI::Notifications::ToastDismissalReason *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs, 0x3f89d935, 0xd9cb, 0x4538, 0xa0,0xf0, 0xff,0xe7,0x65,0x99,0x38,0xf8)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastDismissedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Reason)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs *This,
        __x_ABI_CWindows_CUI_CNotifications_CToastDismissalReason *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastDismissedEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_get_Reason(This,value) (This)->lpVtbl->get_Reason(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastDismissedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_get_Reason(__x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs* This,__x_ABI_CWindows_CUI_CNotifications_CToastDismissalReason *value) {
    return This->lpVtbl->get_Reason(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastDismissedEventArgs IID___x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs
#define IToastDismissedEventArgsVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgsVtbl
#define IToastDismissedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs
#define IToastDismissedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_QueryInterface
#define IToastDismissedEventArgs_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_AddRef
#define IToastDismissedEventArgs_Release __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_Release
#define IToastDismissedEventArgs_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_GetIids
#define IToastDismissedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_GetRuntimeClassName
#define IToastDismissedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_GetTrustLevel
#define IToastDismissedEventArgs_get_Reason __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_get_Reason
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IToastFailedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs, 0x35176862, 0xcfd4, 0x44f8, 0xad,0x64, 0xf5,0x00,0xfd,0x89,0x6c,0x3b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("35176862-cfd4-44f8-ad64-f500fd896c3b")
                IToastFailedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ErrorCode(
                        HRESULT *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs, 0x35176862, 0xcfd4, 0x44f8, 0xad,0x64, 0xf5,0x00,0xfd,0x89,0x6c,0x3b)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastFailedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ErrorCode)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs *This,
        HRESULT *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastFailedEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_get_ErrorCode(This,value) (This)->lpVtbl->get_ErrorCode(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastFailedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_get_ErrorCode(__x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs* This,HRESULT *value) {
    return This->lpVtbl->get_ErrorCode(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastFailedEventArgs IID___x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs
#define IToastFailedEventArgsVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgsVtbl
#define IToastFailedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs
#define IToastFailedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_QueryInterface
#define IToastFailedEventArgs_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_AddRef
#define IToastFailedEventArgs_Release __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_Release
#define IToastFailedEventArgs_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_GetIids
#define IToastFailedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_GetRuntimeClassName
#define IToastFailedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_GetTrustLevel
#define IToastFailedEventArgs_get_ErrorCode __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_get_ErrorCode
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IToastNotification interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotification, 0x997e2675, 0x059e, 0x4e60, 0x8b,0x06, 0x17,0x60,0x91,0x7c,0x8b,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("997e2675-059e-4e60-8b06-1760917c8b80")
                IToastNotification : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Content(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_Dismissed(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastDismissedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_Dismissed(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_Activated(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,IInspectable* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_Activated(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_Failed(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastFailedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_Failed(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification, 0x997e2675, 0x059e, 0x4e60, 0x8b,0x06, 0x17,0x60,0x91,0x7c,0x8b,0x80)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotification methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Content)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value);

    HRESULT (STDMETHODCALLTYPE *put_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        __FIReference_1_DateTime *value);

    HRESULT (STDMETHODCALLTYPE *get_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        __FIReference_1_DateTime **value);

    HRESULT (STDMETHODCALLTYPE *add_Dismissed)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_Dismissed)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_Activated)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_Activated)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_Failed)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_Failed)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotification methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_get_Content(This,value) (This)->lpVtbl->get_Content(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_put_ExpirationTime(This,value) (This)->lpVtbl->put_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_get_ExpirationTime(This,value) (This)->lpVtbl->get_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_add_Dismissed(This,handler,token) (This)->lpVtbl->add_Dismissed(This,handler,token)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_remove_Dismissed(This,token) (This)->lpVtbl->remove_Dismissed(This,token)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_add_Activated(This,handler,token) (This)->lpVtbl->add_Activated(This,handler,token)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_remove_Activated(This,token) (This)->lpVtbl->remove_Activated(This,token)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_add_Failed(This,handler,token) (This)->lpVtbl->add_Failed(This,handler,token)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_remove_Failed(This,token) (This)->lpVtbl->remove_Failed(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotification methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_get_Content(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value) {
    return This->lpVtbl->get_Content(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_put_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,__FIReference_1_DateTime *value) {
    return This->lpVtbl->put_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_get_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,__FIReference_1_DateTime **value) {
    return This->lpVtbl->get_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_add_Dismissed(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_Dismissed(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_remove_Dismissed(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_Dismissed(This,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_add_Activated(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_Activated(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_remove_Activated(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_Activated(This,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_add_Failed(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_Failed(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_remove_Failed(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_Failed(This,token);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotification IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotification
#define IToastNotificationVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationVtbl
#define IToastNotification __x_ABI_CWindows_CUI_CNotifications_CIToastNotification
#define IToastNotification_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_QueryInterface
#define IToastNotification_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_AddRef
#define IToastNotification_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_Release
#define IToastNotification_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_GetIids
#define IToastNotification_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_GetRuntimeClassName
#define IToastNotification_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_GetTrustLevel
#define IToastNotification_get_Content __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_get_Content
#define IToastNotification_put_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_put_ExpirationTime
#define IToastNotification_get_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_get_ExpirationTime
#define IToastNotification_add_Dismissed __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_add_Dismissed
#define IToastNotification_remove_Dismissed __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_remove_Dismissed
#define IToastNotification_add_Activated __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_add_Activated
#define IToastNotification_remove_Activated __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_remove_Activated
#define IToastNotification_add_Failed __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_add_Failed
#define IToastNotification_remove_Failed __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_remove_Failed
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IToastNotification2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotification2, 0x9dfb9fd1, 0x143a, 0x490e, 0x90,0xbf, 0xb9,0xfb,0xa7,0x13,0x2d,0xe7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("9dfb9fd1-143a-490e-90bf-b9fba7132de7")
                IToastNotification2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE put_Tag(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Tag(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Group(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Group(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_SuppressPopup(
                        boolean value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SuppressPopup(
                        boolean *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2, 0x9dfb9fd1, 0x143a, 0x490e, 0x90,0xbf, 0xb9,0xfb,0xa7,0x13,0x2d,0xe7)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotification2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Tag)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Tag)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Group)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Group)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_SuppressPopup)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_SuppressPopup)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 *This,
        boolean *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotification2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_put_Tag(This,value) (This)->lpVtbl->put_Tag(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_get_Tag(This,value) (This)->lpVtbl->get_Tag(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_put_Group(This,value) (This)->lpVtbl->put_Group(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_get_Group(This,value) (This)->lpVtbl->get_Group(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_put_SuppressPopup(This,value) (This)->lpVtbl->put_SuppressPopup(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_get_SuppressPopup(This,value) (This)->lpVtbl->get_SuppressPopup(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotification2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_put_Tag(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This,HSTRING value) {
    return This->lpVtbl->put_Tag(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_get_Tag(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This,HSTRING *value) {
    return This->lpVtbl->get_Tag(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_put_Group(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This,HSTRING value) {
    return This->lpVtbl->put_Group(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_get_Group(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This,HSTRING *value) {
    return This->lpVtbl->get_Group(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_put_SuppressPopup(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This,boolean value) {
    return This->lpVtbl->put_SuppressPopup(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_get_SuppressPopup(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This,boolean *value) {
    return This->lpVtbl->get_SuppressPopup(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotification2 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotification2
#define IToastNotification2Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2Vtbl
#define IToastNotification2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2
#define IToastNotification2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_QueryInterface
#define IToastNotification2_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_AddRef
#define IToastNotification2_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_Release
#define IToastNotification2_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_GetIids
#define IToastNotification2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_GetRuntimeClassName
#define IToastNotification2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_GetTrustLevel
#define IToastNotification2_put_Tag __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_put_Tag
#define IToastNotification2_get_Tag __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_get_Tag
#define IToastNotification2_put_Group __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_put_Group
#define IToastNotification2_get_Group __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_get_Group
#define IToastNotification2_put_SuppressPopup __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_put_SuppressPopup
#define IToastNotification2_get_SuppressPopup __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_get_SuppressPopup
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IToastNotification3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotification3, 0x31e8aed8, 0x8141, 0x4f99, 0xbc,0x0a, 0xc4,0xed,0x21,0x29,0x7d,0x77);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("31e8aed8-8141-4f99-bc0a-c4ed21297d77")
                IToastNotification3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_NotificationMirroring(
                        ABI::Windows::UI::Notifications::NotificationMirroring *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_NotificationMirroring(
                        ABI::Windows::UI::Notifications::NotificationMirroring value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_RemoteId(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_RemoteId(
                        HSTRING value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3, 0x31e8aed8, 0x8141, 0x4f99, 0xbc,0x0a, 0xc4,0xed,0x21,0x29,0x7d,0x77)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotification3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_NotificationMirroring)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 *This,
        __x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring *value);

    HRESULT (STDMETHODCALLTYPE *put_NotificationMirroring)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 *This,
        __x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring value);

    HRESULT (STDMETHODCALLTYPE *get_RemoteId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_RemoteId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 *This,
        HSTRING value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotification3 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_get_NotificationMirroring(This,value) (This)->lpVtbl->get_NotificationMirroring(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_put_NotificationMirroring(This,value) (This)->lpVtbl->put_NotificationMirroring(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_get_RemoteId(This,value) (This)->lpVtbl->get_RemoteId(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_put_RemoteId(This,value) (This)->lpVtbl->put_RemoteId(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotification3 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_get_NotificationMirroring(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3* This,__x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring *value) {
    return This->lpVtbl->get_NotificationMirroring(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_put_NotificationMirroring(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3* This,__x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring value) {
    return This->lpVtbl->put_NotificationMirroring(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_get_RemoteId(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3* This,HSTRING *value) {
    return This->lpVtbl->get_RemoteId(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_put_RemoteId(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3* This,HSTRING value) {
    return This->lpVtbl->put_RemoteId(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotification3 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotification3
#define IToastNotification3Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3Vtbl
#define IToastNotification3 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3
#define IToastNotification3_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_QueryInterface
#define IToastNotification3_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_AddRef
#define IToastNotification3_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_Release
#define IToastNotification3_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_GetIids
#define IToastNotification3_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_GetRuntimeClassName
#define IToastNotification3_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_GetTrustLevel
#define IToastNotification3_get_NotificationMirroring __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_get_NotificationMirroring
#define IToastNotification3_put_NotificationMirroring __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_put_NotificationMirroring
#define IToastNotification3_get_RemoteId __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_get_RemoteId
#define IToastNotification3_put_RemoteId __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_put_RemoteId
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IToastNotification4 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotification4, 0x15154935, 0x28ea, 0x4727, 0x88,0xe9, 0xc5,0x86,0x80,0xe2,0xd1,0x18);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("15154935-28ea-4727-88e9-c58680e2d118")
                IToastNotification4 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Data(
                        ABI::Windows::UI::Notifications::INotificationData **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Data(
                        ABI::Windows::UI::Notifications::INotificationData *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Priority(
                        ABI::Windows::UI::Notifications::ToastNotificationPriority *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Priority(
                        ABI::Windows::UI::Notifications::ToastNotificationPriority value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4, 0x15154935, 0x28ea, 0x4727, 0x88,0xe9, 0xc5,0x86,0x80,0xe2,0xd1,0x18)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotification4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Data)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData **value);

    HRESULT (STDMETHODCALLTYPE *put_Data)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData *value);

    HRESULT (STDMETHODCALLTYPE *get_Priority)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 *This,
        __x_ABI_CWindows_CUI_CNotifications_CToastNotificationPriority *value);

    HRESULT (STDMETHODCALLTYPE *put_Priority)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 *This,
        __x_ABI_CWindows_CUI_CNotifications_CToastNotificationPriority value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotification4 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_get_Data(This,value) (This)->lpVtbl->get_Data(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_put_Data(This,value) (This)->lpVtbl->put_Data(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_get_Priority(This,value) (This)->lpVtbl->get_Priority(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_put_Priority(This,value) (This)->lpVtbl->put_Priority(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotification4 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_get_Data(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4* This,__x_ABI_CWindows_CUI_CNotifications_CINotificationData **value) {
    return This->lpVtbl->get_Data(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_put_Data(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4* This,__x_ABI_CWindows_CUI_CNotifications_CINotificationData *value) {
    return This->lpVtbl->put_Data(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_get_Priority(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4* This,__x_ABI_CWindows_CUI_CNotifications_CToastNotificationPriority *value) {
    return This->lpVtbl->get_Priority(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_put_Priority(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4* This,__x_ABI_CWindows_CUI_CNotifications_CToastNotificationPriority value) {
    return This->lpVtbl->put_Priority(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotification4 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotification4
#define IToastNotification4Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4Vtbl
#define IToastNotification4 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4
#define IToastNotification4_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_QueryInterface
#define IToastNotification4_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_AddRef
#define IToastNotification4_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_Release
#define IToastNotification4_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_GetIids
#define IToastNotification4_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_GetRuntimeClassName
#define IToastNotification4_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_GetTrustLevel
#define IToastNotification4_get_Data __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_get_Data
#define IToastNotification4_put_Data __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_put_Data
#define IToastNotification4_get_Priority __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_get_Priority
#define IToastNotification4_put_Priority __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_put_Priority
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IToastNotification6 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotification6, 0x43ebfe53, 0x89ae, 0x5c1e, 0xa2,0x79, 0x3a,0xec,0xfe,0x9b,0x6f,0x54);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("43ebfe53-89ae-5c1e-a279-3aecfe9b6f54")
                IToastNotification6 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ExpiresOnReboot(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ExpiresOnReboot(
                        boolean value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification6, 0x43ebfe53, 0x89ae, 0x5c1e, 0xa2,0x79, 0x3a,0xec,0xfe,0x9b,0x6f,0x54)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotification6 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ExpiresOnReboot)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6 *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_ExpiresOnReboot)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6 *This,
        boolean value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotification6 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_get_ExpiresOnReboot(This,value) (This)->lpVtbl->get_ExpiresOnReboot(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_put_ExpiresOnReboot(This,value) (This)->lpVtbl->put_ExpiresOnReboot(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification6* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification6* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification6* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification6* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification6* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotification6 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_get_ExpiresOnReboot(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification6* This,boolean *value) {
    return This->lpVtbl->get_ExpiresOnReboot(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_put_ExpiresOnReboot(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification6* This,boolean value) {
    return This->lpVtbl->put_ExpiresOnReboot(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotification6 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotification6
#define IToastNotification6Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6Vtbl
#define IToastNotification6 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6
#define IToastNotification6_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_QueryInterface
#define IToastNotification6_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_AddRef
#define IToastNotification6_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_Release
#define IToastNotification6_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_GetIids
#define IToastNotification6_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_GetRuntimeClassName
#define IToastNotification6_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_GetTrustLevel
#define IToastNotification6_get_ExpiresOnReboot __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_get_ExpiresOnReboot
#define IToastNotification6_put_ExpiresOnReboot __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_put_ExpiresOnReboot
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IToastNotificationActionTriggerDetail interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail, 0x9445135a, 0x38f3, 0x42f6, 0x96,0xaa, 0x79,0x55,0xb0,0xf0,0x3d,0xa2);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("9445135a-38f3-42f6-96aa-7955b0f03da2")
                IToastNotificationActionTriggerDetail : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Argument(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_UserInput(
                        ABI::Windows::Foundation::Collections::IPropertySet **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail, 0x9445135a, 0x38f3, 0x42f6, 0x96,0xaa, 0x79,0x55,0xb0,0xf0,0x3d,0xa2)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetailVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotificationActionTriggerDetail methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Argument)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_UserInput)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail *This,
        __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetailVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetailVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationActionTriggerDetail methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_get_Argument(This,value) (This)->lpVtbl->get_Argument(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_get_UserInput(This,value) (This)->lpVtbl->get_UserInput(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationActionTriggerDetail methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_get_Argument(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail* This,HSTRING *value) {
    return This->lpVtbl->get_Argument(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_get_UserInput(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail* This,__x_ABI_CWindows_CFoundation_CCollections_CIPropertySet **value) {
    return This->lpVtbl->get_UserInput(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationActionTriggerDetail IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail
#define IToastNotificationActionTriggerDetailVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetailVtbl
#define IToastNotificationActionTriggerDetail __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail
#define IToastNotificationActionTriggerDetail_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_QueryInterface
#define IToastNotificationActionTriggerDetail_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_AddRef
#define IToastNotificationActionTriggerDetail_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_Release
#define IToastNotificationActionTriggerDetail_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_GetIids
#define IToastNotificationActionTriggerDetail_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_GetRuntimeClassName
#define IToastNotificationActionTriggerDetail_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_GetTrustLevel
#define IToastNotificationActionTriggerDetail_get_Argument __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_get_Argument
#define IToastNotificationActionTriggerDetail_get_UserInput __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_get_UserInput
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IToastNotificationFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory, 0x04124b20, 0x82c6, 0x4229, 0xb1,0x09, 0xfd,0x9e,0xd4,0x66,0x2b,0x53);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("04124b20-82c6-4229-b109-fd9ed4662b53")
                IToastNotificationFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateToastNotification(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument *content,
                        ABI::Windows::UI::Notifications::IToastNotification **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory, 0x04124b20, 0x82c6, 0x4229, 0xb1,0x09, 0xfd,0x9e,0xd4,0x66,0x2b,0x53)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotificationFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateToastNotification)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactoryVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationFactory methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_CreateToastNotification(This,content,value) (This)->lpVtbl->CreateToastNotification(This,content,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_CreateToastNotification(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification **value) {
    return This->lpVtbl->CreateToastNotification(This,content,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationFactory IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory
#define IToastNotificationFactoryVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactoryVtbl
#define IToastNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory
#define IToastNotificationFactory_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_QueryInterface
#define IToastNotificationFactory_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_AddRef
#define IToastNotificationFactory_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_Release
#define IToastNotificationFactory_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_GetIids
#define IToastNotificationFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_GetRuntimeClassName
#define IToastNotificationFactory_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_GetTrustLevel
#define IToastNotificationFactory_CreateToastNotification __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_CreateToastNotification
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IToastNotificationHistory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory, 0x5caddc63, 0x01d3, 0x4c97, 0x98,0x6f, 0x05,0x33,0x48,0x3f,0xee,0x14);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("5caddc63-01d3-4c97-986f-0533483fee14")
                IToastNotificationHistory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE RemoveGroup(
                        HSTRING group) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RemoveGroupWithId(
                        HSTRING group,
                        HSTRING application_id) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RemoveGroupedTagWithId(
                        HSTRING tag,
                        HSTRING group,
                        HSTRING application_id) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RemoveGroupedTag(
                        HSTRING tag,
                        HSTRING group) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Remove(
                        HSTRING tag) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Clear(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE ClearWithId(
                        HSTRING application_id) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory, 0x5caddc63, 0x01d3, 0x4c97, 0x98,0x6f, 0x05,0x33,0x48,0x3f,0xee,0x14)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotificationHistory methods ***/
    HRESULT (STDMETHODCALLTYPE *RemoveGroup)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory *This,
        HSTRING group);

    HRESULT (STDMETHODCALLTYPE *RemoveGroupWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory *This,
        HSTRING group,
        HSTRING application_id);

    HRESULT (STDMETHODCALLTYPE *RemoveGroupedTagWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory *This,
        HSTRING tag,
        HSTRING group,
        HSTRING application_id);

    HRESULT (STDMETHODCALLTYPE *RemoveGroupedTag)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory *This,
        HSTRING tag,
        HSTRING group);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory *This,
        HSTRING tag);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory *This);

    HRESULT (STDMETHODCALLTYPE *ClearWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory *This,
        HSTRING application_id);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationHistory methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroup(This,group) (This)->lpVtbl->RemoveGroup(This,group)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroupWithId(This,group,application_id) (This)->lpVtbl->RemoveGroupWithId(This,group,application_id)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroupedTagWithId(This,tag,group,application_id) (This)->lpVtbl->RemoveGroupedTagWithId(This,tag,group,application_id)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroupedTag(This,tag,group) (This)->lpVtbl->RemoveGroupedTag(This,tag,group)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_Remove(This,tag) (This)->lpVtbl->Remove(This,tag)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_Clear(This) (This)->lpVtbl->Clear(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_ClearWithId(This,application_id) (This)->lpVtbl->ClearWithId(This,application_id)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationHistory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroup(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This,HSTRING group) {
    return This->lpVtbl->RemoveGroup(This,group);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroupWithId(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This,HSTRING group,HSTRING application_id) {
    return This->lpVtbl->RemoveGroupWithId(This,group,application_id);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroupedTagWithId(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This,HSTRING tag,HSTRING group,HSTRING application_id) {
    return This->lpVtbl->RemoveGroupedTagWithId(This,tag,group,application_id);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroupedTag(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This,HSTRING tag,HSTRING group) {
    return This->lpVtbl->RemoveGroupedTag(This,tag,group);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_Remove(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This,HSTRING tag) {
    return This->lpVtbl->Remove(This,tag);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_Clear(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This) {
    return This->lpVtbl->Clear(This);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_ClearWithId(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This,HSTRING application_id) {
    return This->lpVtbl->ClearWithId(This,application_id);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationHistory IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory
#define IToastNotificationHistoryVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryVtbl
#define IToastNotificationHistory __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory
#define IToastNotificationHistory_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_QueryInterface
#define IToastNotificationHistory_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_AddRef
#define IToastNotificationHistory_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_Release
#define IToastNotificationHistory_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_GetIids
#define IToastNotificationHistory_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_GetRuntimeClassName
#define IToastNotificationHistory_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_GetTrustLevel
#define IToastNotificationHistory_RemoveGroup __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroup
#define IToastNotificationHistory_RemoveGroupWithId __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroupWithId
#define IToastNotificationHistory_RemoveGroupedTagWithId __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroupedTagWithId
#define IToastNotificationHistory_RemoveGroupedTag __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroupedTag
#define IToastNotificationHistory_Remove __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_Remove
#define IToastNotificationHistory_Clear __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_Clear
#define IToastNotificationHistory_ClearWithId __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_ClearWithId
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IToastNotificationHistory2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2, 0x3bc3d253, 0x2f31, 0x4092, 0x91,0x29, 0x8a,0xd5,0xab,0xf0,0x67,0xda);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("3bc3d253-2f31-4092-9129-8ad5abf067da")
                IToastNotificationHistory2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetHistory(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastNotification* > **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetHistoryWithId(
                        HSTRING application_id,
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastNotification* > **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2, 0x3bc3d253, 0x2f31, 0x4092, 0x91,0x29, 0x8a,0xd5,0xab,0xf0,0x67,0xda)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotificationHistory2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetHistory)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2 *This,
        __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification **result);

    HRESULT (STDMETHODCALLTYPE *GetHistoryWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2 *This,
        HSTRING application_id,
        __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationHistory2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetHistory(This,result) (This)->lpVtbl->GetHistory(This,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetHistoryWithId(This,application_id,result) (This)->lpVtbl->GetHistoryWithId(This,application_id,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationHistory2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetHistory(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2* This,__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification **result) {
    return This->lpVtbl->GetHistory(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetHistoryWithId(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2* This,HSTRING application_id,__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification **result) {
    return This->lpVtbl->GetHistoryWithId(This,application_id,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationHistory2 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2
#define IToastNotificationHistory2Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2Vtbl
#define IToastNotificationHistory2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2
#define IToastNotificationHistory2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_QueryInterface
#define IToastNotificationHistory2_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_AddRef
#define IToastNotificationHistory2_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_Release
#define IToastNotificationHistory2_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetIids
#define IToastNotificationHistory2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetRuntimeClassName
#define IToastNotificationHistory2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetTrustLevel
#define IToastNotificationHistory2_GetHistory __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetHistory
#define IToastNotificationHistory2_GetHistoryWithId __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetHistoryWithId
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IToastNotificationHistoryChangedTriggerDetail interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail, 0xdb037ffa, 0x0068, 0x412c, 0x9c,0x83, 0x26,0x7c,0x37,0xf6,0x56,0x70);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("db037ffa-0068-412c-9c83-267c37f65670")
                IToastNotificationHistoryChangedTriggerDetail : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ChangeType(
                        ABI::Windows::UI::Notifications::ToastHistoryChangedType *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail, 0xdb037ffa, 0x0068, 0x412c, 0x9c,0x83, 0x26,0x7c,0x37,0xf6,0x56,0x70)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetailVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotificationHistoryChangedTriggerDetail methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ChangeType)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail *This,
        __x_ABI_CWindows_CUI_CNotifications_CToastHistoryChangedType *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetailVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetailVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationHistoryChangedTriggerDetail methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_get_ChangeType(This,value) (This)->lpVtbl->get_ChangeType(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationHistoryChangedTriggerDetail methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_get_ChangeType(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail* This,__x_ABI_CWindows_CUI_CNotifications_CToastHistoryChangedType *value) {
    return This->lpVtbl->get_ChangeType(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationHistoryChangedTriggerDetail IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail
#define IToastNotificationHistoryChangedTriggerDetailVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetailVtbl
#define IToastNotificationHistoryChangedTriggerDetail __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail
#define IToastNotificationHistoryChangedTriggerDetail_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_QueryInterface
#define IToastNotificationHistoryChangedTriggerDetail_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_AddRef
#define IToastNotificationHistoryChangedTriggerDetail_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_Release
#define IToastNotificationHistoryChangedTriggerDetail_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_GetIids
#define IToastNotificationHistoryChangedTriggerDetail_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_GetRuntimeClassName
#define IToastNotificationHistoryChangedTriggerDetail_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_GetTrustLevel
#define IToastNotificationHistoryChangedTriggerDetail_get_ChangeType __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_get_ChangeType
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IToastNotificationHistoryChangedTriggerDetail2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2, 0x0b36e982, 0xc871, 0x49fb, 0xba,0xbb, 0x25,0xbd,0xbc,0x4c,0xc4,0x5b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("0b36e982-c871-49fb-babb-25bdbc4cc45b")
                IToastNotificationHistoryChangedTriggerDetail2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_CollectionId(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2, 0x0b36e982, 0xc871, 0x49fb, 0xba,0xbb, 0x25,0xbd,0xbc,0x4c,0xc4,0x5b)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotificationHistoryChangedTriggerDetail2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CollectionId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2 *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationHistoryChangedTriggerDetail2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_get_CollectionId(This,value) (This)->lpVtbl->get_CollectionId(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationHistoryChangedTriggerDetail2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_get_CollectionId(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2* This,HSTRING *value) {
    return This->lpVtbl->get_CollectionId(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationHistoryChangedTriggerDetail2 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2
#define IToastNotificationHistoryChangedTriggerDetail2Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2Vtbl
#define IToastNotificationHistoryChangedTriggerDetail2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2
#define IToastNotificationHistoryChangedTriggerDetail2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_QueryInterface
#define IToastNotificationHistoryChangedTriggerDetail2_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_AddRef
#define IToastNotificationHistoryChangedTriggerDetail2_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_Release
#define IToastNotificationHistoryChangedTriggerDetail2_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_GetIids
#define IToastNotificationHistoryChangedTriggerDetail2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_GetRuntimeClassName
#define IToastNotificationHistoryChangedTriggerDetail2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_GetTrustLevel
#define IToastNotificationHistoryChangedTriggerDetail2_get_CollectionId __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_get_CollectionId
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IToastNotificationManagerForUser interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser, 0x79ab57f6, 0x43fe, 0x487b, 0x8a,0x7f, 0x99,0x56,0x72,0x00,0xae,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("79ab57f6-43fe-487b-8a7f-99567200ae94")
                IToastNotificationManagerForUser : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateToastNotifier(
                        ABI::Windows::UI::Notifications::IToastNotifier **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateToastNotifierWithId(
                        HSTRING application_id,
                        ABI::Windows::UI::Notifications::IToastNotifier **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_History(
                        ABI::Windows::UI::Notifications::IToastNotificationHistory **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_User(
                        ABI::Windows::System::IUser **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser, 0x79ab57f6, 0x43fe, 0x487b, 0x8a,0x7f, 0x99,0x56,0x72,0x00,0xae,0x94)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUserVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotificationManagerForUser methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateToastNotifier)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier **result);

    HRESULT (STDMETHODCALLTYPE *CreateToastNotifierWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser *This,
        HSTRING application_id,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier **result);

    HRESULT (STDMETHODCALLTYPE *get_History)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory **value);

    HRESULT (STDMETHODCALLTYPE *get_User)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser *This,
        __x_ABI_CWindows_CSystem_CIUser **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUserVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUserVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationManagerForUser methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_CreateToastNotifier(This,result) (This)->lpVtbl->CreateToastNotifier(This,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_CreateToastNotifierWithId(This,application_id,result) (This)->lpVtbl->CreateToastNotifierWithId(This,application_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_get_History(This,value) (This)->lpVtbl->get_History(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_get_User(This,value) (This)->lpVtbl->get_User(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationManagerForUser methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_CreateToastNotifier(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier **result) {
    return This->lpVtbl->CreateToastNotifier(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_CreateToastNotifierWithId(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser* This,HSTRING application_id,__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier **result) {
    return This->lpVtbl->CreateToastNotifierWithId(This,application_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_get_History(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory **value) {
    return This->lpVtbl->get_History(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_get_User(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser* This,__x_ABI_CWindows_CSystem_CIUser **value) {
    return This->lpVtbl->get_User(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationManagerForUser IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser
#define IToastNotificationManagerForUserVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUserVtbl
#define IToastNotificationManagerForUser __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser
#define IToastNotificationManagerForUser_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_QueryInterface
#define IToastNotificationManagerForUser_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_AddRef
#define IToastNotificationManagerForUser_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_Release
#define IToastNotificationManagerForUser_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_GetIids
#define IToastNotificationManagerForUser_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_GetRuntimeClassName
#define IToastNotificationManagerForUser_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_GetTrustLevel
#define IToastNotificationManagerForUser_CreateToastNotifier __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_CreateToastNotifier
#define IToastNotificationManagerForUser_CreateToastNotifierWithId __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_CreateToastNotifierWithId
#define IToastNotificationManagerForUser_get_History __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_get_History
#define IToastNotificationManagerForUser_get_User __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_get_User
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IToastNotificationManagerForUser2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2, 0x679c64b7, 0x81ab, 0x42c2, 0x88,0x19, 0xc9,0x58,0x76,0x77,0x53,0xf4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("679c64b7-81ab-42c2-8819-c958767753f4")
                IToastNotificationManagerForUser2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetToastNotifierForToastCollectionIdAsync(
                        HSTRING collection_id,
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotifier* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetHistoryForToastCollectionIdAsync(
                        HSTRING collection_id,
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotificationHistory* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetToastCollectionManager(
                        ABI::Windows::UI::Notifications::IToastCollectionManager **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetToastCollectionManagerWithAppId(
                        HSTRING app_id,
                        ABI::Windows::UI::Notifications::IToastCollectionManager **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2, 0x679c64b7, 0x81ab, 0x42c2, 0x88,0x19, 0xc9,0x58,0x76,0x77,0x53,0xf4)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotificationManagerForUser2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetToastNotifierForToastCollectionIdAsync)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 *This,
        HSTRING collection_id,
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier **operation);

    HRESULT (STDMETHODCALLTYPE *GetHistoryForToastCollectionIdAsync)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 *This,
        HSTRING collection_id,
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory **operation);

    HRESULT (STDMETHODCALLTYPE *GetToastCollectionManager)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager **result);

    HRESULT (STDMETHODCALLTYPE *GetToastCollectionManagerWithAppId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 *This,
        HSTRING app_id,
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationManagerForUser2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetToastNotifierForToastCollectionIdAsync(This,collection_id,operation) (This)->lpVtbl->GetToastNotifierForToastCollectionIdAsync(This,collection_id,operation)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetHistoryForToastCollectionIdAsync(This,collection_id,operation) (This)->lpVtbl->GetHistoryForToastCollectionIdAsync(This,collection_id,operation)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetToastCollectionManager(This,result) (This)->lpVtbl->GetToastCollectionManager(This,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetToastCollectionManagerWithAppId(This,app_id,result) (This)->lpVtbl->GetToastCollectionManagerWithAppId(This,app_id,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationManagerForUser2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetToastNotifierForToastCollectionIdAsync(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2* This,HSTRING collection_id,__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier **operation) {
    return This->lpVtbl->GetToastNotifierForToastCollectionIdAsync(This,collection_id,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetHistoryForToastCollectionIdAsync(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2* This,HSTRING collection_id,__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory **operation) {
    return This->lpVtbl->GetHistoryForToastCollectionIdAsync(This,collection_id,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetToastCollectionManager(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2* This,__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager **result) {
    return This->lpVtbl->GetToastCollectionManager(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetToastCollectionManagerWithAppId(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2* This,HSTRING app_id,__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager **result) {
    return This->lpVtbl->GetToastCollectionManagerWithAppId(This,app_id,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationManagerForUser2 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2
#define IToastNotificationManagerForUser2Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2Vtbl
#define IToastNotificationManagerForUser2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2
#define IToastNotificationManagerForUser2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_QueryInterface
#define IToastNotificationManagerForUser2_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_AddRef
#define IToastNotificationManagerForUser2_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_Release
#define IToastNotificationManagerForUser2_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetIids
#define IToastNotificationManagerForUser2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetRuntimeClassName
#define IToastNotificationManagerForUser2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetTrustLevel
#define IToastNotificationManagerForUser2_GetToastNotifierForToastCollectionIdAsync __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetToastNotifierForToastCollectionIdAsync
#define IToastNotificationManagerForUser2_GetHistoryForToastCollectionIdAsync __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetHistoryForToastCollectionIdAsync
#define IToastNotificationManagerForUser2_GetToastCollectionManager __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetToastCollectionManager
#define IToastNotificationManagerForUser2_GetToastCollectionManagerWithAppId __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetToastCollectionManagerWithAppId
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IToastNotificationManagerForUser3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xf0000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3, 0x3efcb176, 0x6cc1, 0x56dc, 0x97,0x3b, 0x25,0x1f,0x7a,0xac,0xb1,0xc5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("3efcb176-6cc1-56dc-973b-251f7aacb1c5")
                IToastNotificationManagerForUser3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_NotificationMode(
                        ABI::Windows::UI::Notifications::ToastNotificationMode *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_NotificationModeChanged(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotificationManagerForUser*,IInspectable* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_NotificationModeChanged(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3, 0x3efcb176, 0x6cc1, 0x56dc, 0x97,0x3b, 0x25,0x1f,0x7a,0xac,0xb1,0xc5)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotificationManagerForUser3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_NotificationMode)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 *This,
        __x_ABI_CWindows_CUI_CNotifications_CToastNotificationMode *value);

    HRESULT (STDMETHODCALLTYPE *add_NotificationModeChanged)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 *This,
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_NotificationModeChanged)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationManagerForUser3 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_get_NotificationMode(This,value) (This)->lpVtbl->get_NotificationMode(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_add_NotificationModeChanged(This,handler,token) (This)->lpVtbl->add_NotificationModeChanged(This,handler,token)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_remove_NotificationModeChanged(This,token) (This)->lpVtbl->remove_NotificationModeChanged(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationManagerForUser3 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_get_NotificationMode(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3* This,__x_ABI_CWindows_CUI_CNotifications_CToastNotificationMode *value) {
    return This->lpVtbl->get_NotificationMode(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_add_NotificationModeChanged(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3* This,__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_NotificationModeChanged(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_remove_NotificationModeChanged(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_NotificationModeChanged(This,token);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationManagerForUser3 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3
#define IToastNotificationManagerForUser3Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3Vtbl
#define IToastNotificationManagerForUser3 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3
#define IToastNotificationManagerForUser3_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_QueryInterface
#define IToastNotificationManagerForUser3_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_AddRef
#define IToastNotificationManagerForUser3_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_Release
#define IToastNotificationManagerForUser3_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_GetIids
#define IToastNotificationManagerForUser3_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_GetRuntimeClassName
#define IToastNotificationManagerForUser3_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_GetTrustLevel
#define IToastNotificationManagerForUser3_get_NotificationMode __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_get_NotificationMode
#define IToastNotificationManagerForUser3_add_NotificationModeChanged __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_add_NotificationModeChanged
#define IToastNotificationManagerForUser3_remove_NotificationModeChanged __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_remove_NotificationModeChanged
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xf0000 */

/*****************************************************************************
 * IToastNotificationManagerStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics, 0x50ac103f, 0xd235, 0x4598, 0xbb,0xef, 0x98,0xfe,0x4d,0x1a,0x3a,0xd4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("50ac103f-d235-4598-bbef-98fe4d1a3ad4")
                IToastNotificationManagerStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateToastNotifier(
                        ABI::Windows::UI::Notifications::IToastNotifier **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateToastNotifierWithId(
                        HSTRING application_id,
                        ABI::Windows::UI::Notifications::IToastNotifier **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetTemplateContent(
                        ABI::Windows::UI::Notifications::ToastTemplateType type,
                        ABI::Windows::Data::Xml::Dom::IXmlDocument **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics, 0x50ac103f, 0xd235, 0x4598, 0xbb,0xef, 0x98,0xfe,0x4d,0x1a,0x3a,0xd4)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotificationManagerStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateToastNotifier)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier **result);

    HRESULT (STDMETHODCALLTYPE *CreateToastNotifierWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics *This,
        HSTRING application_id,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier **result);

    HRESULT (STDMETHODCALLTYPE *GetTemplateContent)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics *This,
        __x_ABI_CWindows_CUI_CNotifications_CToastTemplateType type,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStaticsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationManagerStatics methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_CreateToastNotifier(This,result) (This)->lpVtbl->CreateToastNotifier(This,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_CreateToastNotifierWithId(This,application_id,result) (This)->lpVtbl->CreateToastNotifierWithId(This,application_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetTemplateContent(This,type,result) (This)->lpVtbl->GetTemplateContent(This,type,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationManagerStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_CreateToastNotifier(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier **result) {
    return This->lpVtbl->CreateToastNotifier(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_CreateToastNotifierWithId(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics* This,HSTRING application_id,__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier **result) {
    return This->lpVtbl->CreateToastNotifierWithId(This,application_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetTemplateContent(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics* This,__x_ABI_CWindows_CUI_CNotifications_CToastTemplateType type,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **result) {
    return This->lpVtbl->GetTemplateContent(This,type,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationManagerStatics IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics
#define IToastNotificationManagerStaticsVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStaticsVtbl
#define IToastNotificationManagerStatics __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics
#define IToastNotificationManagerStatics_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_QueryInterface
#define IToastNotificationManagerStatics_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_AddRef
#define IToastNotificationManagerStatics_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_Release
#define IToastNotificationManagerStatics_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetIids
#define IToastNotificationManagerStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetRuntimeClassName
#define IToastNotificationManagerStatics_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetTrustLevel
#define IToastNotificationManagerStatics_CreateToastNotifier __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_CreateToastNotifier
#define IToastNotificationManagerStatics_CreateToastNotifierWithId __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_CreateToastNotifierWithId
#define IToastNotificationManagerStatics_GetTemplateContent __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetTemplateContent
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IToastNotificationManagerStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2, 0x7ab93c52, 0x0e48, 0x4750, 0xba,0x9d, 0x1a,0x41,0x13,0x98,0x18,0x47);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("7ab93c52-0e48-4750-ba9d-1a4113981847")
                IToastNotificationManagerStatics2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_History(
                        ABI::Windows::UI::Notifications::IToastNotificationHistory **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2, 0x7ab93c52, 0x0e48, 0x4750, 0xba,0x9d, 0x1a,0x41,0x13,0x98,0x18,0x47)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotificationManagerStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_History)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2 *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationManagerStatics2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_get_History(This,value) (This)->lpVtbl->get_History(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationManagerStatics2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_get_History(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory **value) {
    return This->lpVtbl->get_History(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationManagerStatics2 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2
#define IToastNotificationManagerStatics2Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2Vtbl
#define IToastNotificationManagerStatics2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2
#define IToastNotificationManagerStatics2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_QueryInterface
#define IToastNotificationManagerStatics2_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_AddRef
#define IToastNotificationManagerStatics2_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_Release
#define IToastNotificationManagerStatics2_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_GetIids
#define IToastNotificationManagerStatics2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_GetRuntimeClassName
#define IToastNotificationManagerStatics2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_GetTrustLevel
#define IToastNotificationManagerStatics2_get_History __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_get_History
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IToastNotificationManagerStatics4 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4, 0x8f993fd3, 0xe516, 0x45fb, 0x81,0x30, 0x39,0x8e,0x93,0xfa,0x52,0xc3);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("8f993fd3-e516-45fb-8130-398e93fa52c3")
                IToastNotificationManagerStatics4 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetForUser(
                        ABI::Windows::System::IUser *user,
                        ABI::Windows::UI::Notifications::IToastNotificationManagerForUser **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE ConfigureNotificationMirroring(
                        ABI::Windows::UI::Notifications::NotificationMirroring value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4, 0x8f993fd3, 0xe516, 0x45fb, 0x81,0x30, 0x39,0x8e,0x93,0xfa,0x52,0xc3)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotificationManagerStatics4 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetForUser)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4 *This,
        __x_ABI_CWindows_CSystem_CIUser *user,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser **result);

    HRESULT (STDMETHODCALLTYPE *ConfigureNotificationMirroring)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4 *This,
        __x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationManagerStatics4 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetForUser(This,user,result) (This)->lpVtbl->GetForUser(This,user,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_ConfigureNotificationMirroring(This,value) (This)->lpVtbl->ConfigureNotificationMirroring(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationManagerStatics4 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetForUser(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4* This,__x_ABI_CWindows_CSystem_CIUser *user,__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser **result) {
    return This->lpVtbl->GetForUser(This,user,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_ConfigureNotificationMirroring(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4* This,__x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring value) {
    return This->lpVtbl->ConfigureNotificationMirroring(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationManagerStatics4 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4
#define IToastNotificationManagerStatics4Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4Vtbl
#define IToastNotificationManagerStatics4 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4
#define IToastNotificationManagerStatics4_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_QueryInterface
#define IToastNotificationManagerStatics4_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_AddRef
#define IToastNotificationManagerStatics4_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_Release
#define IToastNotificationManagerStatics4_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetIids
#define IToastNotificationManagerStatics4_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetRuntimeClassName
#define IToastNotificationManagerStatics4_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetTrustLevel
#define IToastNotificationManagerStatics4_GetForUser __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetForUser
#define IToastNotificationManagerStatics4_ConfigureNotificationMirroring __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_ConfigureNotificationMirroring
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IToastNotificationManagerStatics5 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5, 0xd6f5f569, 0xd40d, 0x407c, 0x89,0x89, 0x88,0xca,0xb4,0x2c,0xfd,0x14);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("d6f5f569-d40d-407c-8989-88cab42cfd14")
                IToastNotificationManagerStatics5 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetDefault(
                        ABI::Windows::UI::Notifications::IToastNotificationManagerForUser **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5, 0xd6f5f569, 0xd40d, 0x407c, 0x89,0x89, 0x88,0xca,0xb4,0x2c,0xfd,0x14)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotificationManagerStatics5 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDefault)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5 *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationManagerStatics5 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetDefault(This,result) (This)->lpVtbl->GetDefault(This,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationManagerStatics5 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetDefault(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser **result) {
    return This->lpVtbl->GetDefault(This,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationManagerStatics5 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5
#define IToastNotificationManagerStatics5Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5Vtbl
#define IToastNotificationManagerStatics5 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5
#define IToastNotificationManagerStatics5_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_QueryInterface
#define IToastNotificationManagerStatics5_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_AddRef
#define IToastNotificationManagerStatics5_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_Release
#define IToastNotificationManagerStatics5_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetIids
#define IToastNotificationManagerStatics5_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetRuntimeClassName
#define IToastNotificationManagerStatics5_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetTrustLevel
#define IToastNotificationManagerStatics5_GetDefault __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetDefault
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IToastNotifier interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotifier, 0x75927b93, 0x03f3, 0x41ec, 0x91,0xd3, 0x6e,0x5b,0xac,0x1b,0x38,0xe7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("75927b93-03f3-41ec-91d3-6e5bac1b38e7")
                IToastNotifier : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE Show(
                        ABI::Windows::UI::Notifications::IToastNotification *notification) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Hide(
                        ABI::Windows::UI::Notifications::IToastNotification *notification) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Setting(
                        ABI::Windows::UI::Notifications::NotificationSetting *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE AddToSchedule(
                        ABI::Windows::UI::Notifications::IScheduledToastNotification *scheduled_toast) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RemoveFromSchedule(
                        ABI::Windows::UI::Notifications::IScheduledToastNotification *scheduled_toast) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetScheduledToastNotifications(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ScheduledToastNotification* > **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier, 0x75927b93, 0x03f3, 0x41ec, 0x91,0xd3, 0x6e,0x5b,0xac,0x1b,0x38,0xe7)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotifierVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotifier methods ***/
    HRESULT (STDMETHODCALLTYPE *Show)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *notification);

    HRESULT (STDMETHODCALLTYPE *Hide)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *notification);

    HRESULT (STDMETHODCALLTYPE *get_Setting)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *This,
        __x_ABI_CWindows_CUI_CNotifications_CNotificationSetting *value);

    HRESULT (STDMETHODCALLTYPE *AddToSchedule)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *This,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *scheduled_toast);

    HRESULT (STDMETHODCALLTYPE *RemoveFromSchedule)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *This,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *scheduled_toast);

    HRESULT (STDMETHODCALLTYPE *GetScheduledToastNotifications)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *This,
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotifierVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotifierVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotifier methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_Show(This,notification) (This)->lpVtbl->Show(This,notification)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_Hide(This,notification) (This)->lpVtbl->Hide(This,notification)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_get_Setting(This,value) (This)->lpVtbl->get_Setting(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_AddToSchedule(This,scheduled_toast) (This)->lpVtbl->AddToSchedule(This,scheduled_toast)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_RemoveFromSchedule(This,scheduled_toast) (This)->lpVtbl->RemoveFromSchedule(This,scheduled_toast)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetScheduledToastNotifications(This,result) (This)->lpVtbl->GetScheduledToastNotifications(This,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotifier methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_Show(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification *notification) {
    return This->lpVtbl->Show(This,notification);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_Hide(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification *notification) {
    return This->lpVtbl->Hide(This,notification);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_get_Setting(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This,__x_ABI_CWindows_CUI_CNotifications_CNotificationSetting *value) {
    return This->lpVtbl->get_Setting(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_AddToSchedule(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *scheduled_toast) {
    return This->lpVtbl->AddToSchedule(This,scheduled_toast);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_RemoveFromSchedule(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *scheduled_toast) {
    return This->lpVtbl->RemoveFromSchedule(This,scheduled_toast);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetScheduledToastNotifications(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This,__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification **result) {
    return This->lpVtbl->GetScheduledToastNotifications(This,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotifier IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotifier
#define IToastNotifierVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotifierVtbl
#define IToastNotifier __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier
#define IToastNotifier_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_QueryInterface
#define IToastNotifier_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_AddRef
#define IToastNotifier_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_Release
#define IToastNotifier_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetIids
#define IToastNotifier_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetRuntimeClassName
#define IToastNotifier_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetTrustLevel
#define IToastNotifier_Show __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_Show
#define IToastNotifier_Hide __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_Hide
#define IToastNotifier_get_Setting __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_get_Setting
#define IToastNotifier_AddToSchedule __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_AddToSchedule
#define IToastNotifier_RemoveFromSchedule __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_RemoveFromSchedule
#define IToastNotifier_GetScheduledToastNotifications __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetScheduledToastNotifications
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

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

/*****************************************************************************
 * IToastNotifier2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2, 0x354389c6, 0x7c01, 0x4bd5, 0x9c,0x20, 0x60,0x43,0x40,0xcd,0x2b,0x74);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("354389c6-7c01-4bd5-9c20-604340cd2b74")
                IToastNotifier2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE UpdateWithTagAndGroup(
                        ABI::Windows::UI::Notifications::INotificationData *data,
                        HSTRING tag,
                        HSTRING group,
                        ABI::Windows::UI::Notifications::NotificationUpdateResult *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE UpdateWithTag(
                        ABI::Windows::UI::Notifications::INotificationData *data,
                        HSTRING tag,
                        ABI::Windows::UI::Notifications::NotificationUpdateResult *result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2, 0x354389c6, 0x7c01, 0x4bd5, 0x9c,0x20, 0x60,0x43,0x40,0xcd,0x2b,0x74)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotifier2 methods ***/
    HRESULT (STDMETHODCALLTYPE *UpdateWithTagAndGroup)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2 *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData *data,
        HSTRING tag,
        HSTRING group,
        __x_ABI_CWindows_CUI_CNotifications_CNotificationUpdateResult *result);

    HRESULT (STDMETHODCALLTYPE *UpdateWithTag)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2 *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData *data,
        HSTRING tag,
        __x_ABI_CWindows_CUI_CNotifications_CNotificationUpdateResult *result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotifier2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_UpdateWithTagAndGroup(This,data,tag,group,result) (This)->lpVtbl->UpdateWithTagAndGroup(This,data,tag,group,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_UpdateWithTag(This,data,tag,result) (This)->lpVtbl->UpdateWithTag(This,data,tag,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotifier2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_UpdateWithTagAndGroup(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2* This,__x_ABI_CWindows_CUI_CNotifications_CINotificationData *data,HSTRING tag,HSTRING group,__x_ABI_CWindows_CUI_CNotifications_CNotificationUpdateResult *result) {
    return This->lpVtbl->UpdateWithTagAndGroup(This,data,tag,group,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_UpdateWithTag(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2* This,__x_ABI_CWindows_CUI_CNotifications_CINotificationData *data,HSTRING tag,__x_ABI_CWindows_CUI_CNotifications_CNotificationUpdateResult *result) {
    return This->lpVtbl->UpdateWithTag(This,data,tag,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotifier2 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2
#define IToastNotifier2Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2Vtbl
#define IToastNotifier2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2
#define IToastNotifier2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_QueryInterface
#define IToastNotifier2_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_AddRef
#define IToastNotifier2_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_Release
#define IToastNotifier2_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_GetIids
#define IToastNotifier2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_GetRuntimeClassName
#define IToastNotifier2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_GetTrustLevel
#define IToastNotifier2_UpdateWithTagAndGroup __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_UpdateWithTagAndGroup
#define IToastNotifier2_UpdateWithTag __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_UpdateWithTag
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IToastNotifier3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3, 0xae75a04a, 0x3b0c, 0x51ad, 0xb7,0xe8, 0xb0,0x8a,0xb6,0x05,0x25,0x49);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("ae75a04a-3b0c-51ad-b7e8-b08ab6052549")
                IToastNotifier3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE add_ScheduledToastNotificationShowing(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotifier*,ABI::Windows::UI::Notifications::ScheduledToastNotificationShowingEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_ScheduledToastNotificationShowing(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3, 0xae75a04a, 0x3b0c, 0x51ad, 0xb7,0xe8, 0xb0,0x8a,0xb6,0x05,0x25,0x49)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IToastNotifier3 methods ***/
    HRESULT (STDMETHODCALLTYPE *add_ScheduledToastNotificationShowing)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3 *This,
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_ScheduledToastNotificationShowing)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3 *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotifier3 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_add_ScheduledToastNotificationShowing(This,handler,token) (This)->lpVtbl->add_ScheduledToastNotificationShowing(This,handler,token)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_remove_ScheduledToastNotificationShowing(This,token) (This)->lpVtbl->remove_ScheduledToastNotificationShowing(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotifier3 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_add_ScheduledToastNotificationShowing(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3* This,__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_ScheduledToastNotificationShowing(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_remove_ScheduledToastNotificationShowing(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_ScheduledToastNotificationShowing(This,token);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotifier3 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3
#define IToastNotifier3Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3Vtbl
#define IToastNotifier3 __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3
#define IToastNotifier3_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_QueryInterface
#define IToastNotifier3_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_AddRef
#define IToastNotifier3_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_Release
#define IToastNotifier3_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_GetIids
#define IToastNotifier3_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_GetRuntimeClassName
#define IToastNotifier3_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_GetTrustLevel
#define IToastNotifier3_add_ScheduledToastNotificationShowing __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_add_ScheduledToastNotificationShowing
#define IToastNotifier3_remove_ScheduledToastNotificationShowing __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_remove_ScheduledToastNotificationShowing
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*****************************************************************************
 * IUserNotification interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIUserNotification_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIUserNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIUserNotification, 0xadf7e52f, 0x4e53, 0x42d5, 0x9c,0x33, 0xeb,0x5e,0xa5,0x15,0xb2,0x3e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("adf7e52f-4e53-42d5-9c33-eb5ea515b23e")
                IUserNotification : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Notification(
                        ABI::Windows::UI::Notifications::INotification **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_AppInfo(
                        ABI::Windows::ApplicationModel::IAppInfo **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Id(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_CreationTime(
                        ABI::Windows::Foundation::DateTime *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification, 0xadf7e52f, 0x4e53, 0x42d5, 0x9c,0x33, 0xeb,0x5e,0xa5,0x15,0xb2,0x3e)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IUserNotification methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Notification)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotification **value);

    HRESULT (STDMETHODCALLTYPE *get_AppInfo)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification *This,
        __x_ABI_CWindows_CApplicationModel_CIAppInfo **value);

    HRESULT (STDMETHODCALLTYPE *get_Id)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_CreationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification *This,
        __x_ABI_CWindows_CFoundation_CDateTime *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIUserNotification {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IUserNotification methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_Notification(This,value) (This)->lpVtbl->get_Notification(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_AppInfo(This,value) (This)->lpVtbl->get_AppInfo(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_Id(This,value) (This)->lpVtbl->get_Id(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_CreationTime(This,value) (This)->lpVtbl->get_CreationTime(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_Release(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IUserNotification methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_Notification(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification* This,__x_ABI_CWindows_CUI_CNotifications_CINotification **value) {
    return This->lpVtbl->get_Notification(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_AppInfo(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification* This,__x_ABI_CWindows_CApplicationModel_CIAppInfo **value) {
    return This->lpVtbl->get_AppInfo(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_Id(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification* This,UINT32 *value) {
    return This->lpVtbl->get_Id(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_CreationTime(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification* This,__x_ABI_CWindows_CFoundation_CDateTime *value) {
    return This->lpVtbl->get_CreationTime(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IUserNotification IID___x_ABI_CWindows_CUI_CNotifications_CIUserNotification
#define IUserNotificationVtbl __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationVtbl
#define IUserNotification __x_ABI_CWindows_CUI_CNotifications_CIUserNotification
#define IUserNotification_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_QueryInterface
#define IUserNotification_AddRef __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_AddRef
#define IUserNotification_Release __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_Release
#define IUserNotification_GetIids __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_GetIids
#define IUserNotification_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_GetRuntimeClassName
#define IUserNotification_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_GetTrustLevel
#define IUserNotification_get_Notification __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_Notification
#define IUserNotification_get_AppInfo __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_AppInfo
#define IUserNotification_get_Id __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_Id
#define IUserNotification_get_CreationTime __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_CreationTime
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIUserNotification_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IUserNotificationChangedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs, 0xb6bd6839, 0x79cf, 0x4b25, 0x82,0xc0, 0x0c,0xe1,0xee,0xf8,0x1f,0x8c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("b6bd6839-79cf-4b25-82c0-0ce1eef81f8c")
                IUserNotificationChangedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ChangeKind(
                        ABI::Windows::UI::Notifications::UserNotificationChangedKind *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_UserNotificationId(
                        UINT32 *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs, 0xb6bd6839, 0x79cf, 0x4b25, 0x82,0xc0, 0x0c,0xe1,0xee,0xf8,0x1f,0x8c)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IUserNotificationChangedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ChangeKind)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs *This,
        __x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedKind *value);

    HRESULT (STDMETHODCALLTYPE *get_UserNotificationId)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs *This,
        UINT32 *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IUserNotificationChangedEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_get_ChangeKind(This,value) (This)->lpVtbl->get_ChangeKind(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_get_UserNotificationId(This,value) (This)->lpVtbl->get_UserNotificationId(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_Release(__x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IUserNotificationChangedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_get_ChangeKind(__x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs* This,__x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedKind *value) {
    return This->lpVtbl->get_ChangeKind(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_get_UserNotificationId(__x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs* This,UINT32 *value) {
    return This->lpVtbl->get_UserNotificationId(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IUserNotificationChangedEventArgs IID___x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs
#define IUserNotificationChangedEventArgsVtbl __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgsVtbl
#define IUserNotificationChangedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs
#define IUserNotificationChangedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_QueryInterface
#define IUserNotificationChangedEventArgs_AddRef __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_AddRef
#define IUserNotificationChangedEventArgs_Release __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_Release
#define IUserNotificationChangedEventArgs_GetIids __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_GetIids
#define IUserNotificationChangedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_GetRuntimeClassName
#define IUserNotificationChangedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_GetTrustLevel
#define IUserNotificationChangedEventArgs_get_ChangeKind __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_get_ChangeKind
#define IUserNotificationChangedEventArgs_get_UserNotificationId __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_get_UserNotificationId
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.AdaptiveNotificationText
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_AdaptiveNotificationText_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_AdaptiveNotificationText_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_AdaptiveNotificationText[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','A','d','a','p','t','i','v','e','N','o','t','i','f','i','c','a','t','i','o','n','T','e','x','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_AdaptiveNotificationText[] = L"Windows.UI.Notifications.AdaptiveNotificationText";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_AdaptiveNotificationText[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','A','d','a','p','t','i','v','e','N','o','t','i','f','i','c','a','t','i','o','n','T','e','x','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_AdaptiveNotificationText_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.BadgeNotification
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_BadgeNotification_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_BadgeNotification_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_BadgeNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','B','a','d','g','e','N','o','t','i','f','i','c','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_BadgeNotification[] = L"Windows.UI.Notifications.BadgeNotification";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_BadgeNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','B','a','d','g','e','N','o','t','i','f','i','c','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_BadgeNotification_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.BadgeUpdateManager
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_BadgeUpdateManager_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_BadgeUpdateManager_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_BadgeUpdateManager[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','B','a','d','g','e','U','p','d','a','t','e','M','a','n','a','g','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_BadgeUpdateManager[] = L"Windows.UI.Notifications.BadgeUpdateManager";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_BadgeUpdateManager[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','B','a','d','g','e','U','p','d','a','t','e','M','a','n','a','g','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_BadgeUpdateManager_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.BadgeUpdateManagerForUser
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_BadgeUpdateManagerForUser_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_BadgeUpdateManagerForUser_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_BadgeUpdateManagerForUser[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','B','a','d','g','e','U','p','d','a','t','e','M','a','n','a','g','e','r','F','o','r','U','s','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_BadgeUpdateManagerForUser[] = L"Windows.UI.Notifications.BadgeUpdateManagerForUser";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_BadgeUpdateManagerForUser[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','B','a','d','g','e','U','p','d','a','t','e','M','a','n','a','g','e','r','F','o','r','U','s','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_BadgeUpdateManagerForUser_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.BadgeUpdater
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_BadgeUpdater_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_BadgeUpdater_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_BadgeUpdater[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','B','a','d','g','e','U','p','d','a','t','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_BadgeUpdater[] = L"Windows.UI.Notifications.BadgeUpdater";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_BadgeUpdater[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','B','a','d','g','e','U','p','d','a','t','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_BadgeUpdater_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.KnownAdaptiveNotificationHints
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_KnownAdaptiveNotificationHints_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_KnownAdaptiveNotificationHints_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_KnownAdaptiveNotificationHints[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','K','n','o','w','n','A','d','a','p','t','i','v','e','N','o','t','i','f','i','c','a','t','i','o','n','H','i','n','t','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_KnownAdaptiveNotificationHints[] = L"Windows.UI.Notifications.KnownAdaptiveNotificationHints";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_KnownAdaptiveNotificationHints[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','K','n','o','w','n','A','d','a','p','t','i','v','e','N','o','t','i','f','i','c','a','t','i','o','n','H','i','n','t','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_KnownAdaptiveNotificationHints_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.KnownAdaptiveNotificationTextStyles
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_KnownAdaptiveNotificationTextStyles_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_KnownAdaptiveNotificationTextStyles_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_KnownAdaptiveNotificationTextStyles[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','K','n','o','w','n','A','d','a','p','t','i','v','e','N','o','t','i','f','i','c','a','t','i','o','n','T','e','x','t','S','t','y','l','e','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_KnownAdaptiveNotificationTextStyles[] = L"Windows.UI.Notifications.KnownAdaptiveNotificationTextStyles";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_KnownAdaptiveNotificationTextStyles[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','K','n','o','w','n','A','d','a','p','t','i','v','e','N','o','t','i','f','i','c','a','t','i','o','n','T','e','x','t','S','t','y','l','e','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_KnownAdaptiveNotificationTextStyles_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.KnownNotificationBindings
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_KnownNotificationBindings_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_KnownNotificationBindings_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_KnownNotificationBindings[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','K','n','o','w','n','N','o','t','i','f','i','c','a','t','i','o','n','B','i','n','d','i','n','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_KnownNotificationBindings[] = L"Windows.UI.Notifications.KnownNotificationBindings";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_KnownNotificationBindings[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','K','n','o','w','n','N','o','t','i','f','i','c','a','t','i','o','n','B','i','n','d','i','n','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_KnownNotificationBindings_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.Notification
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_Notification_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_Notification_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_Notification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','N','o','t','i','f','i','c','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_Notification[] = L"Windows.UI.Notifications.Notification";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_Notification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','N','o','t','i','f','i','c','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_Notification_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.NotificationBinding
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_NotificationBinding_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_NotificationBinding_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_NotificationBinding[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','N','o','t','i','f','i','c','a','t','i','o','n','B','i','n','d','i','n','g',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_NotificationBinding[] = L"Windows.UI.Notifications.NotificationBinding";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_NotificationBinding[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','N','o','t','i','f','i','c','a','t','i','o','n','B','i','n','d','i','n','g',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_NotificationBinding_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.NotificationData
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_NotificationData_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_NotificationData_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_NotificationData[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','N','o','t','i','f','i','c','a','t','i','o','n','D','a','t','a',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_NotificationData[] = L"Windows.UI.Notifications.NotificationData";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_NotificationData[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','N','o','t','i','f','i','c','a','t','i','o','n','D','a','t','a',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_NotificationData_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*
 * Class Windows.UI.Notifications.NotificationVisual
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_NotificationVisual_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_NotificationVisual_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_NotificationVisual[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','N','o','t','i','f','i','c','a','t','i','o','n','V','i','s','u','a','l',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_NotificationVisual[] = L"Windows.UI.Notifications.NotificationVisual";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_NotificationVisual[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','N','o','t','i','f','i','c','a','t','i','o','n','V','i','s','u','a','l',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_NotificationVisual_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.ScheduledTileNotification
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ScheduledTileNotification_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ScheduledTileNotification_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ScheduledTileNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','S','c','h','e','d','u','l','e','d','T','i','l','e','N','o','t','i','f','i','c','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ScheduledTileNotification[] = L"Windows.UI.Notifications.ScheduledTileNotification";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ScheduledTileNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','S','c','h','e','d','u','l','e','d','T','i','l','e','N','o','t','i','f','i','c','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ScheduledTileNotification_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ScheduledToastNotification
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ScheduledToastNotification_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ScheduledToastNotification_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ScheduledToastNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','S','c','h','e','d','u','l','e','d','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ScheduledToastNotification[] = L"Windows.UI.Notifications.ScheduledToastNotification";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ScheduledToastNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','S','c','h','e','d','u','l','e','d','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ScheduledToastNotification_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ScheduledToastNotificationShowingEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ScheduledToastNotificationShowingEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ScheduledToastNotificationShowingEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ScheduledToastNotificationShowingEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','S','c','h','e','d','u','l','e','d','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','S','h','o','w','i','n','g','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ScheduledToastNotificationShowingEventArgs[] = L"Windows.UI.Notifications.ScheduledToastNotificationShowingEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ScheduledToastNotificationShowingEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','S','c','h','e','d','u','l','e','d','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','S','h','o','w','i','n','g','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ScheduledToastNotificationShowingEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*
 * Class Windows.UI.Notifications.ShownTileNotification
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ShownTileNotification_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ShownTileNotification_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ShownTileNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','S','h','o','w','n','T','i','l','e','N','o','t','i','f','i','c','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ShownTileNotification[] = L"Windows.UI.Notifications.ShownTileNotification";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ShownTileNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','S','h','o','w','n','T','i','l','e','N','o','t','i','f','i','c','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ShownTileNotification_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.TileFlyoutNotification
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_TileFlyoutNotification_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_TileFlyoutNotification_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_TileFlyoutNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','F','l','y','o','u','t','N','o','t','i','f','i','c','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileFlyoutNotification[] = L"Windows.UI.Notifications.TileFlyoutNotification";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileFlyoutNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','F','l','y','o','u','t','N','o','t','i','f','i','c','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_TileFlyoutNotification_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.TileFlyoutUpdateManager
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_TileFlyoutUpdateManager_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_TileFlyoutUpdateManager_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_TileFlyoutUpdateManager[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','F','l','y','o','u','t','U','p','d','a','t','e','M','a','n','a','g','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileFlyoutUpdateManager[] = L"Windows.UI.Notifications.TileFlyoutUpdateManager";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileFlyoutUpdateManager[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','F','l','y','o','u','t','U','p','d','a','t','e','M','a','n','a','g','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_TileFlyoutUpdateManager_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.TileFlyoutUpdater
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_TileFlyoutUpdater_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_TileFlyoutUpdater_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_TileFlyoutUpdater[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','F','l','y','o','u','t','U','p','d','a','t','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileFlyoutUpdater[] = L"Windows.UI.Notifications.TileFlyoutUpdater";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileFlyoutUpdater[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','F','l','y','o','u','t','U','p','d','a','t','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_TileFlyoutUpdater_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.TileNotification
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_TileNotification_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_TileNotification_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_TileNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','N','o','t','i','f','i','c','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileNotification[] = L"Windows.UI.Notifications.TileNotification";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','N','o','t','i','f','i','c','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_TileNotification_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.TileUpdateManager
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_TileUpdateManager_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_TileUpdateManager_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_TileUpdateManager[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','U','p','d','a','t','e','M','a','n','a','g','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileUpdateManager[] = L"Windows.UI.Notifications.TileUpdateManager";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileUpdateManager[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','U','p','d','a','t','e','M','a','n','a','g','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_TileUpdateManager_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.TileUpdateManagerForUser
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_TileUpdateManagerForUser_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_TileUpdateManagerForUser_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_TileUpdateManagerForUser[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','U','p','d','a','t','e','M','a','n','a','g','e','r','F','o','r','U','s','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileUpdateManagerForUser[] = L"Windows.UI.Notifications.TileUpdateManagerForUser";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileUpdateManagerForUser[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','U','p','d','a','t','e','M','a','n','a','g','e','r','F','o','r','U','s','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_TileUpdateManagerForUser_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.TileUpdater
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_TileUpdater_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_TileUpdater_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_TileUpdater[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','U','p','d','a','t','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileUpdater[] = L"Windows.UI.Notifications.TileUpdater";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileUpdater[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','U','p','d','a','t','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_TileUpdater_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ToastActivatedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastActivatedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastActivatedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastActivatedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','A','c','t','i','v','a','t','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastActivatedEventArgs[] = L"Windows.UI.Notifications.ToastActivatedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastActivatedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','A','c','t','i','v','a','t','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastActivatedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ToastCollection
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastCollection_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastCollection_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastCollection[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','C','o','l','l','e','c','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastCollection[] = L"Windows.UI.Notifications.ToastCollection";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastCollection[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','C','o','l','l','e','c','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastCollection_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*
 * Class Windows.UI.Notifications.ToastCollectionManager
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastCollectionManager_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastCollectionManager_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastCollectionManager[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','C','o','l','l','e','c','t','i','o','n','M','a','n','a','g','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastCollectionManager[] = L"Windows.UI.Notifications.ToastCollectionManager";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastCollectionManager[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','C','o','l','l','e','c','t','i','o','n','M','a','n','a','g','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastCollectionManager_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*
 * Class Windows.UI.Notifications.ToastDismissedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastDismissedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastDismissedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastDismissedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','D','i','s','m','i','s','s','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastDismissedEventArgs[] = L"Windows.UI.Notifications.ToastDismissedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastDismissedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','D','i','s','m','i','s','s','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastDismissedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ToastFailedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastFailedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastFailedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastFailedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','F','a','i','l','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastFailedEventArgs[] = L"Windows.UI.Notifications.ToastFailedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastFailedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','F','a','i','l','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastFailedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ToastNotification
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastNotification_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastNotification_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotification[] = L"Windows.UI.Notifications.ToastNotification";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastNotification_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ToastNotificationActionTriggerDetail
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationActionTriggerDetail_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationActionTriggerDetail_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationActionTriggerDetail[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','A','c','t','i','o','n','T','r','i','g','g','e','r','D','e','t','a','i','l',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationActionTriggerDetail[] = L"Windows.UI.Notifications.ToastNotificationActionTriggerDetail";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationActionTriggerDetail[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','A','c','t','i','o','n','T','r','i','g','g','e','r','D','e','t','a','i','l',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationActionTriggerDetail_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ToastNotificationHistory
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationHistory_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationHistory_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationHistory[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','H','i','s','t','o','r','y',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationHistory[] = L"Windows.UI.Notifications.ToastNotificationHistory";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationHistory[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','H','i','s','t','o','r','y',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationHistory_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ToastNotificationHistoryChangedTriggerDetail
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationHistoryChangedTriggerDetail_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationHistoryChangedTriggerDetail_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationHistoryChangedTriggerDetail[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','H','i','s','t','o','r','y','C','h','a','n','g','e','d','T','r','i','g','g','e','r','D','e','t','a','i','l',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationHistoryChangedTriggerDetail[] = L"Windows.UI.Notifications.ToastNotificationHistoryChangedTriggerDetail";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationHistoryChangedTriggerDetail[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','H','i','s','t','o','r','y','C','h','a','n','g','e','d','T','r','i','g','g','e','r','D','e','t','a','i','l',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationHistoryChangedTriggerDetail_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ToastNotificationManager
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationManager_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationManager_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationManager[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','M','a','n','a','g','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationManager[] = L"Windows.UI.Notifications.ToastNotificationManager";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationManager[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','M','a','n','a','g','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationManager_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ToastNotificationManagerForUser
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationManagerForUser_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationManagerForUser_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationManagerForUser[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','M','a','n','a','g','e','r','F','o','r','U','s','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationManagerForUser[] = L"Windows.UI.Notifications.ToastNotificationManagerForUser";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationManagerForUser[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','M','a','n','a','g','e','r','F','o','r','U','s','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationManagerForUser_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.ToastNotifier
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastNotifier_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastNotifier_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotifier[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotifier[] = L"Windows.UI.Notifications.ToastNotifier";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotifier[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastNotifier_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.UserNotification
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_UserNotification_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_UserNotification_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_UserNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','U','s','e','r','N','o','t','i','f','i','c','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_UserNotification[] = L"Windows.UI.Notifications.UserNotification";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_UserNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','U','s','e','r','N','o','t','i','f','i','c','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_UserNotification_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.UserNotificationChangedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_UserNotificationChangedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_UserNotificationChangedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_UserNotificationChangedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','U','s','e','r','N','o','t','i','f','i','c','a','t','i','o','n','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_Notifications_UserNotificationChangedEventArgs[] = L"Windows.UI.Notifications.UserNotificationChangedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_UserNotificationChangedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','U','s','e','r','N','o','t','i','f','i','c','a','t','i','o','n','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_UserNotificationChangedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IIterable<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > interface
 */
#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText, 0x0343e8f2, 0xca4c, 0x5f40, 0xb8,0xd1, 0x3f,0xf4,0x70,0x47,0xce,0x43);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("0343e8f2-ca4c-5f40-b8d1-3ff47047ce43")
                IIterable<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::AdaptiveNotificationText*, ABI::Windows::UI::Notifications::IAdaptiveNotificationText* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText, 0x0343e8f2, 0xca4c, 0x5f40, 0xb8,0xd1, 0x3f,0xf4,0x70,0x47,0xce,0x43)
#endif
#else
typedef struct __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText **value);

    END_INTERFACE
} __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl;

interface __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText {
    CONST_VTBL __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_QueryInterface(__FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_AddRef(__FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_Release(__FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetIids(__FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetRuntimeClassName(__FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetTrustLevel(__FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_First(__FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_AdaptiveNotificationText IID___FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText
#define IIterable_AdaptiveNotificationTextVtbl __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl
#define IIterable_AdaptiveNotificationText __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText
#define IIterable_AdaptiveNotificationText_QueryInterface __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_QueryInterface
#define IIterable_AdaptiveNotificationText_AddRef __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_AddRef
#define IIterable_AdaptiveNotificationText_Release __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_Release
#define IIterable_AdaptiveNotificationText_GetIids __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetIids
#define IIterable_AdaptiveNotificationText_GetRuntimeClassName __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetRuntimeClassName
#define IIterable_AdaptiveNotificationText_GetTrustLevel __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetTrustLevel
#define IIterable_AdaptiveNotificationText_First __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::UI::Notifications::NotificationBinding* > interface
 */
#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding, 0xe8d9489c, 0x635e, 0x5153, 0x8a,0xb7, 0x38,0x9f,0x2e,0xe9,0xfa,0xca);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("e8d9489c-635e-5153-8ab7-389f2ee9faca")
                IIterable<ABI::Windows::UI::Notifications::NotificationBinding* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::NotificationBinding*, ABI::Windows::UI::Notifications::INotificationBinding* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding, 0xe8d9489c, 0x635e, 0x5153, 0x8a,0xb7, 0x38,0x9f,0x2e,0xe9,0xfa,0xca)
#endif
#else
typedef struct __FIIterable_1_Windows__CUI__CNotifications__CNotificationBindingVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding **value);

    END_INTERFACE
} __FIIterable_1_Windows__CUI__CNotifications__CNotificationBindingVtbl;

interface __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding {
    CONST_VTBL __FIIterable_1_Windows__CUI__CNotifications__CNotificationBindingVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface(__FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef(__FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_Release(__FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids(__FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName(__FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel(__FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_First(__FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding* This,__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_NotificationBinding IID___FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding
#define IIterable_NotificationBindingVtbl __FIIterable_1_Windows__CUI__CNotifications__CNotificationBindingVtbl
#define IIterable_NotificationBinding __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding
#define IIterable_NotificationBinding_QueryInterface __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface
#define IIterable_NotificationBinding_AddRef __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef
#define IIterable_NotificationBinding_Release __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_Release
#define IIterable_NotificationBinding_GetIids __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids
#define IIterable_NotificationBinding_GetRuntimeClassName __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName
#define IIterable_NotificationBinding_GetTrustLevel __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel
#define IIterable_NotificationBinding_First __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::UI::Notifications::ScheduledTileNotification* > interface
 */
#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification, 0x4b60d1e5, 0x52ae, 0x5766, 0x97,0x20, 0xbe,0x4a,0xd0,0x86,0xf9,0x52);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("4b60d1e5-52ae-5766-9720-be4ad086f952")
                IIterable<ABI::Windows::UI::Notifications::ScheduledTileNotification* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ScheduledTileNotification*, ABI::Windows::UI::Notifications::IScheduledTileNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification, 0x4b60d1e5, 0x52ae, 0x5766, 0x97,0x20, 0xbe,0x4a,0xd0,0x86,0xf9,0x52)
#endif
#else
typedef struct __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::UI::Notifications::ScheduledTileNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification **value);

    END_INTERFACE
} __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl;

interface __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification {
    CONST_VTBL __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::UI::Notifications::ScheduledTileNotification* > methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_QueryInterface(__FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_AddRef(__FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_Release(__FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetIids(__FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetRuntimeClassName(__FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetTrustLevel(__FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::UI::Notifications::ScheduledTileNotification* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_First(__FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_ScheduledTileNotification IID___FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification
#define IIterable_ScheduledTileNotificationVtbl __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl
#define IIterable_ScheduledTileNotification __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification
#define IIterable_ScheduledTileNotification_QueryInterface __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_QueryInterface
#define IIterable_ScheduledTileNotification_AddRef __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_AddRef
#define IIterable_ScheduledTileNotification_Release __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_Release
#define IIterable_ScheduledTileNotification_GetIids __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetIids
#define IIterable_ScheduledTileNotification_GetRuntimeClassName __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetRuntimeClassName
#define IIterable_ScheduledTileNotification_GetTrustLevel __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetTrustLevel
#define IIterable_ScheduledTileNotification_First __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::UI::Notifications::ScheduledToastNotification* > interface
 */
#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification, 0x7a7b2a51, 0xc182, 0x5846, 0xa8,0x61, 0x4f,0x9c,0x03,0x6f,0x24,0xad);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("7a7b2a51-c182-5846-a861-4f9c036f24ad")
                IIterable<ABI::Windows::UI::Notifications::ScheduledToastNotification* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ScheduledToastNotification*, ABI::Windows::UI::Notifications::IScheduledToastNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification, 0x7a7b2a51, 0xc182, 0x5846, 0xa8,0x61, 0x4f,0x9c,0x03,0x6f,0x24,0xad)
#endif
#else
typedef struct __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::UI::Notifications::ScheduledToastNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification **value);

    END_INTERFACE
} __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl;

interface __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification {
    CONST_VTBL __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::UI::Notifications::ScheduledToastNotification* > methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_QueryInterface(__FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_AddRef(__FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_Release(__FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetIids(__FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetRuntimeClassName(__FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetTrustLevel(__FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::UI::Notifications::ScheduledToastNotification* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_First(__FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_ScheduledToastNotification IID___FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification
#define IIterable_ScheduledToastNotificationVtbl __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl
#define IIterable_ScheduledToastNotification __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification
#define IIterable_ScheduledToastNotification_QueryInterface __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_QueryInterface
#define IIterable_ScheduledToastNotification_AddRef __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_AddRef
#define IIterable_ScheduledToastNotification_Release __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_Release
#define IIterable_ScheduledToastNotification_GetIids __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetIids
#define IIterable_ScheduledToastNotification_GetRuntimeClassName __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetRuntimeClassName
#define IIterable_ScheduledToastNotification_GetTrustLevel __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetTrustLevel
#define IIterable_ScheduledToastNotification_First __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::UI::Notifications::ShownTileNotification* > interface
 */
#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification, 0x1863baee, 0x44f1, 0x5e51, 0xbc,0xdf, 0xa3,0xcd,0xab,0x82,0x6a,0x15);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("1863baee-44f1-5e51-bcdf-a3cdab826a15")
                IIterable<ABI::Windows::UI::Notifications::ShownTileNotification* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ShownTileNotification*, ABI::Windows::UI::Notifications::IShownTileNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification, 0x1863baee, 0x44f1, 0x5e51, 0xbc,0xdf, 0xa3,0xcd,0xab,0x82,0x6a,0x15)
#endif
#else
typedef struct __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::UI::Notifications::ShownTileNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification **value);

    END_INTERFACE
} __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl;

interface __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification {
    CONST_VTBL __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::UI::Notifications::ShownTileNotification* > methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_QueryInterface(__FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_AddRef(__FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_Release(__FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_GetIids(__FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_GetRuntimeClassName(__FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_GetTrustLevel(__FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::UI::Notifications::ShownTileNotification* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_First(__FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification* This,__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_ShownTileNotification IID___FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification
#define IIterable_ShownTileNotificationVtbl __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl
#define IIterable_ShownTileNotification __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification
#define IIterable_ShownTileNotification_QueryInterface __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_QueryInterface
#define IIterable_ShownTileNotification_AddRef __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_AddRef
#define IIterable_ShownTileNotification_Release __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_Release
#define IIterable_ShownTileNotification_GetIids __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_GetIids
#define IIterable_ShownTileNotification_GetRuntimeClassName __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_GetRuntimeClassName
#define IIterable_ShownTileNotification_GetTrustLevel __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_GetTrustLevel
#define IIterable_ShownTileNotification_First __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::UI::Notifications::ToastCollection* > interface
 */
#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CUI__CNotifications__CToastCollection, 0x8928d527, 0xdb5d, 0x5a10, 0xae,0x9b, 0x43,0x0f,0xa0,0x90,0x6e,0x74);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("8928d527-db5d-5a10-ae9b-430fa0906e74")
                IIterable<ABI::Windows::UI::Notifications::ToastCollection* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastCollection*, ABI::Windows::UI::Notifications::IToastCollection* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CUI__CNotifications__CToastCollection, 0x8928d527, 0xdb5d, 0x5a10, 0xae,0x9b, 0x43,0x0f,0xa0,0x90,0x6e,0x74)
#endif
#else
typedef struct __FIIterable_1_Windows__CUI__CNotifications__CToastCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CUI__CNotifications__CToastCollection *This,
        __FIIterator_1_Windows__CUI__CNotifications__CToastCollection **value);

    END_INTERFACE
} __FIIterable_1_Windows__CUI__CNotifications__CToastCollectionVtbl;

interface __FIIterable_1_Windows__CUI__CNotifications__CToastCollection {
    CONST_VTBL __FIIterable_1_Windows__CUI__CNotifications__CToastCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(__FIIterable_1_Windows__CUI__CNotifications__CToastCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_AddRef(__FIIterable_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_Release(__FIIterable_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_GetIids(__FIIterable_1_Windows__CUI__CNotifications__CToastCollection* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName(__FIIterable_1_Windows__CUI__CNotifications__CToastCollection* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel(__FIIterable_1_Windows__CUI__CNotifications__CToastCollection* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_First(__FIIterable_1_Windows__CUI__CNotifications__CToastCollection* This,__FIIterator_1_Windows__CUI__CNotifications__CToastCollection **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_ToastCollection IID___FIIterable_1_Windows__CUI__CNotifications__CToastCollection
#define IIterable_ToastCollectionVtbl __FIIterable_1_Windows__CUI__CNotifications__CToastCollectionVtbl
#define IIterable_ToastCollection __FIIterable_1_Windows__CUI__CNotifications__CToastCollection
#define IIterable_ToastCollection_QueryInterface __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface
#define IIterable_ToastCollection_AddRef __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_AddRef
#define IIterable_ToastCollection_Release __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_Release
#define IIterable_ToastCollection_GetIids __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_GetIids
#define IIterable_ToastCollection_GetRuntimeClassName __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName
#define IIterable_ToastCollection_GetTrustLevel __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel
#define IIterable_ToastCollection_First __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::UI::Notifications::ToastNotification* > interface
 */
#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CToastNotification_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CToastNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CUI__CNotifications__CToastNotification, 0x52c9428b, 0xd37a, 0x554d, 0xbf,0x55, 0xb8,0x68,0x5d,0x5f,0x55,0x2d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("52c9428b-d37a-554d-bf55-b8685d5f552d")
                IIterable<ABI::Windows::UI::Notifications::ToastNotification* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotification*, ABI::Windows::UI::Notifications::IToastNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CUI__CNotifications__CToastNotification, 0x52c9428b, 0xd37a, 0x554d, 0xbf,0x55, 0xb8,0x68,0x5d,0x5f,0x55,0x2d)
#endif
#else
typedef struct __FIIterable_1_Windows__CUI__CNotifications__CToastNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::UI::Notifications::ToastNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CUI__CNotifications__CToastNotification *This,
        __FIIterator_1_Windows__CUI__CNotifications__CToastNotification **value);

    END_INTERFACE
} __FIIterable_1_Windows__CUI__CNotifications__CToastNotificationVtbl;

interface __FIIterable_1_Windows__CUI__CNotifications__CToastNotification {
    CONST_VTBL __FIIterable_1_Windows__CUI__CNotifications__CToastNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::UI::Notifications::ToastNotification* > methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_QueryInterface(__FIIterable_1_Windows__CUI__CNotifications__CToastNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_AddRef(__FIIterable_1_Windows__CUI__CNotifications__CToastNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_Release(__FIIterable_1_Windows__CUI__CNotifications__CToastNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_GetIids(__FIIterable_1_Windows__CUI__CNotifications__CToastNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_GetRuntimeClassName(__FIIterable_1_Windows__CUI__CNotifications__CToastNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_GetTrustLevel(__FIIterable_1_Windows__CUI__CNotifications__CToastNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::UI::Notifications::ToastNotification* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_First(__FIIterable_1_Windows__CUI__CNotifications__CToastNotification* This,__FIIterator_1_Windows__CUI__CNotifications__CToastNotification **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_ToastNotification IID___FIIterable_1_Windows__CUI__CNotifications__CToastNotification
#define IIterable_ToastNotificationVtbl __FIIterable_1_Windows__CUI__CNotifications__CToastNotificationVtbl
#define IIterable_ToastNotification __FIIterable_1_Windows__CUI__CNotifications__CToastNotification
#define IIterable_ToastNotification_QueryInterface __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_QueryInterface
#define IIterable_ToastNotification_AddRef __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_AddRef
#define IIterable_ToastNotification_Release __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_Release
#define IIterable_ToastNotification_GetIids __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_GetIids
#define IIterable_ToastNotification_GetRuntimeClassName __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_GetRuntimeClassName
#define IIterable_ToastNotification_GetTrustLevel __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_GetTrustLevel
#define IIterable_ToastNotification_First __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CNotifications__CToastNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::UI::Notifications::UserNotification* > interface
 */
#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CUI__CNotifications__CUserNotification, 0x18170480, 0x1bd8, 0x5cd0, 0xbb,0x32, 0x67,0xe7,0x1d,0x5b,0x4d,0x7c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("18170480-1bd8-5cd0-bb32-67e71d5b4d7c")
                IIterable<ABI::Windows::UI::Notifications::UserNotification* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::UserNotification*, ABI::Windows::UI::Notifications::IUserNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CUI__CNotifications__CUserNotification, 0x18170480, 0x1bd8, 0x5cd0, 0xbb,0x32, 0x67,0xe7,0x1d,0x5b,0x4d,0x7c)
#endif
#else
typedef struct __FIIterable_1_Windows__CUI__CNotifications__CUserNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::UI::Notifications::UserNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CUI__CNotifications__CUserNotification *This,
        __FIIterator_1_Windows__CUI__CNotifications__CUserNotification **value);

    END_INTERFACE
} __FIIterable_1_Windows__CUI__CNotifications__CUserNotificationVtbl;

interface __FIIterable_1_Windows__CUI__CNotifications__CUserNotification {
    CONST_VTBL __FIIterable_1_Windows__CUI__CNotifications__CUserNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::UI::Notifications::UserNotification* > methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface(__FIIterable_1_Windows__CUI__CNotifications__CUserNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_AddRef(__FIIterable_1_Windows__CUI__CNotifications__CUserNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_Release(__FIIterable_1_Windows__CUI__CNotifications__CUserNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_GetIids(__FIIterable_1_Windows__CUI__CNotifications__CUserNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName(__FIIterable_1_Windows__CUI__CNotifications__CUserNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel(__FIIterable_1_Windows__CUI__CNotifications__CUserNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::UI::Notifications::UserNotification* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_First(__FIIterable_1_Windows__CUI__CNotifications__CUserNotification* This,__FIIterator_1_Windows__CUI__CNotifications__CUserNotification **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_UserNotification IID___FIIterable_1_Windows__CUI__CNotifications__CUserNotification
#define IIterable_UserNotificationVtbl __FIIterable_1_Windows__CUI__CNotifications__CUserNotificationVtbl
#define IIterable_UserNotification __FIIterable_1_Windows__CUI__CNotifications__CUserNotification
#define IIterable_UserNotification_QueryInterface __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface
#define IIterable_UserNotification_AddRef __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_AddRef
#define IIterable_UserNotification_Release __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_Release
#define IIterable_UserNotification_GetIids __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_GetIids
#define IIterable_UserNotification_GetRuntimeClassName __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName
#define IIterable_UserNotification_GetTrustLevel __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel
#define IIterable_UserNotification_First __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText, 0x18015daa, 0xcbc3, 0x5a51, 0x9f,0x4b, 0x3c,0x06,0x91,0x35,0xb0,0xe0);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("18015daa-cbc3-5a51-9f4b-3c069135b0e0")
                IIterator<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::AdaptiveNotificationText*, ABI::Windows::UI::Notifications::IAdaptiveNotificationText* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText, 0x18015daa, 0xcbc3, 0x5a51, 0x9f,0x4b, 0x3c,0x06,0x91,0x35,0xb0,0xe0)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl;

interface __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText {
    CONST_VTBL __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_QueryInterface(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_AddRef(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_Release(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetIids(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetRuntimeClassName(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetTrustLevel(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_get_Current(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_get_HasCurrent(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_MoveNext(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetMany(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_AdaptiveNotificationText IID___FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText
#define IIterator_AdaptiveNotificationTextVtbl __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl
#define IIterator_AdaptiveNotificationText __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText
#define IIterator_AdaptiveNotificationText_QueryInterface __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_QueryInterface
#define IIterator_AdaptiveNotificationText_AddRef __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_AddRef
#define IIterator_AdaptiveNotificationText_Release __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_Release
#define IIterator_AdaptiveNotificationText_GetIids __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetIids
#define IIterator_AdaptiveNotificationText_GetRuntimeClassName __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetRuntimeClassName
#define IIterator_AdaptiveNotificationText_GetTrustLevel __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetTrustLevel
#define IIterator_AdaptiveNotificationText_get_Current __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_get_Current
#define IIterator_AdaptiveNotificationText_get_HasCurrent __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_get_HasCurrent
#define IIterator_AdaptiveNotificationText_MoveNext __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_MoveNext
#define IIterator_AdaptiveNotificationText_GetMany __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::Notifications::NotificationBinding* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding, 0x66187f56, 0x9ee1, 0x5c48, 0x82,0xda, 0x6c,0xb9,0xdd,0xf8,0x79,0xe7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("66187f56-9ee1-5c48-82da-6cb9ddf879e7")
                IIterator<ABI::Windows::UI::Notifications::NotificationBinding* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::NotificationBinding*, ABI::Windows::UI::Notifications::INotificationBinding* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding, 0x66187f56, 0x9ee1, 0x5c48, 0x82,0xda, 0x6c,0xb9,0xdd,0xf8,0x79,0xe7)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CNotifications__CNotificationBindingVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CNotifications__CNotificationBindingVtbl;

interface __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding {
    CONST_VTBL __FIIterator_1_Windows__CUI__CNotifications__CNotificationBindingVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_Release(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_get_Current(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding* This,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_get_HasCurrent(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_MoveNext(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetMany(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_NotificationBinding IID___FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding
#define IIterator_NotificationBindingVtbl __FIIterator_1_Windows__CUI__CNotifications__CNotificationBindingVtbl
#define IIterator_NotificationBinding __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding
#define IIterator_NotificationBinding_QueryInterface __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface
#define IIterator_NotificationBinding_AddRef __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef
#define IIterator_NotificationBinding_Release __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_Release
#define IIterator_NotificationBinding_GetIids __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids
#define IIterator_NotificationBinding_GetRuntimeClassName __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName
#define IIterator_NotificationBinding_GetTrustLevel __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel
#define IIterator_NotificationBinding_get_Current __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_get_Current
#define IIterator_NotificationBinding_get_HasCurrent __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_get_HasCurrent
#define IIterator_NotificationBinding_MoveNext __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_MoveNext
#define IIterator_NotificationBinding_GetMany __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::Notifications::ScheduledTileNotification* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification, 0x5665e491, 0x6543, 0x5036, 0x93,0x5f, 0xb5,0x15,0x79,0x50,0xb3,0x59);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("5665e491-6543-5036-935f-b5157950b359")
                IIterator<ABI::Windows::UI::Notifications::ScheduledTileNotification* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ScheduledTileNotification*, ABI::Windows::UI::Notifications::IScheduledTileNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification, 0x5665e491, 0x6543, 0x5036, 0x93,0x5f, 0xb5,0x15,0x79,0x50,0xb3,0x59)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::UI::Notifications::ScheduledTileNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl;

interface __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification {
    CONST_VTBL __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::Notifications::ScheduledTileNotification* > methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_QueryInterface(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_AddRef(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_Release(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetIids(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetRuntimeClassName(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetTrustLevel(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::UI::Notifications::ScheduledTileNotification* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_get_Current(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_get_HasCurrent(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_MoveNext(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetMany(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_ScheduledTileNotification IID___FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification
#define IIterator_ScheduledTileNotificationVtbl __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl
#define IIterator_ScheduledTileNotification __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification
#define IIterator_ScheduledTileNotification_QueryInterface __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_QueryInterface
#define IIterator_ScheduledTileNotification_AddRef __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_AddRef
#define IIterator_ScheduledTileNotification_Release __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_Release
#define IIterator_ScheduledTileNotification_GetIids __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetIids
#define IIterator_ScheduledTileNotification_GetRuntimeClassName __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetRuntimeClassName
#define IIterator_ScheduledTileNotification_GetTrustLevel __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetTrustLevel
#define IIterator_ScheduledTileNotification_get_Current __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_get_Current
#define IIterator_ScheduledTileNotification_get_HasCurrent __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_get_HasCurrent
#define IIterator_ScheduledTileNotification_MoveNext __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_MoveNext
#define IIterator_ScheduledTileNotification_GetMany __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::Notifications::ScheduledToastNotification* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification, 0x304238b6, 0x888a, 0x5dd2, 0x96,0xcd, 0xbf,0xca,0x89,0x27,0x48,0x3b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("304238b6-888a-5dd2-96cd-bfca8927483b")
                IIterator<ABI::Windows::UI::Notifications::ScheduledToastNotification* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ScheduledToastNotification*, ABI::Windows::UI::Notifications::IScheduledToastNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification, 0x304238b6, 0x888a, 0x5dd2, 0x96,0xcd, 0xbf,0xca,0x89,0x27,0x48,0x3b)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::UI::Notifications::ScheduledToastNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl;

interface __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification {
    CONST_VTBL __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::Notifications::ScheduledToastNotification* > methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_QueryInterface(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_AddRef(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_Release(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetIids(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetRuntimeClassName(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetTrustLevel(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::UI::Notifications::ScheduledToastNotification* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_get_Current(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_get_HasCurrent(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_MoveNext(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetMany(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_ScheduledToastNotification IID___FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification
#define IIterator_ScheduledToastNotificationVtbl __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl
#define IIterator_ScheduledToastNotification __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification
#define IIterator_ScheduledToastNotification_QueryInterface __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_QueryInterface
#define IIterator_ScheduledToastNotification_AddRef __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_AddRef
#define IIterator_ScheduledToastNotification_Release __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_Release
#define IIterator_ScheduledToastNotification_GetIids __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetIids
#define IIterator_ScheduledToastNotification_GetRuntimeClassName __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetRuntimeClassName
#define IIterator_ScheduledToastNotification_GetTrustLevel __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetTrustLevel
#define IIterator_ScheduledToastNotification_get_Current __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_get_Current
#define IIterator_ScheduledToastNotification_get_HasCurrent __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_get_HasCurrent
#define IIterator_ScheduledToastNotification_MoveNext __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_MoveNext
#define IIterator_ScheduledToastNotification_GetMany __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::Notifications::ShownTileNotification* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification, 0x04d8d70b, 0x7c15, 0x5f60, 0x98,0x94, 0xb2,0x13,0x66,0xb4,0x27,0xc2);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("04d8d70b-7c15-5f60-9894-b21366b427c2")
                IIterator<ABI::Windows::UI::Notifications::ShownTileNotification* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ShownTileNotification*, ABI::Windows::UI::Notifications::IShownTileNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification, 0x04d8d70b, 0x7c15, 0x5f60, 0x98,0x94, 0xb2,0x13,0x66,0xb4,0x27,0xc2)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::UI::Notifications::ShownTileNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl;

interface __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification {
    CONST_VTBL __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::Notifications::ShownTileNotification* > methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_QueryInterface(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_AddRef(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_Release(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetIids(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetRuntimeClassName(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetTrustLevel(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::UI::Notifications::ShownTileNotification* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_get_Current(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification* This,__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_get_HasCurrent(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_MoveNext(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetMany(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification* This,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_ShownTileNotification IID___FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification
#define IIterator_ShownTileNotificationVtbl __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl
#define IIterator_ShownTileNotification __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification
#define IIterator_ShownTileNotification_QueryInterface __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_QueryInterface
#define IIterator_ShownTileNotification_AddRef __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_AddRef
#define IIterator_ShownTileNotification_Release __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_Release
#define IIterator_ShownTileNotification_GetIids __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetIids
#define IIterator_ShownTileNotification_GetRuntimeClassName __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetRuntimeClassName
#define IIterator_ShownTileNotification_GetTrustLevel __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetTrustLevel
#define IIterator_ShownTileNotification_get_Current __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_get_Current
#define IIterator_ShownTileNotification_get_HasCurrent __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_get_HasCurrent
#define IIterator_ShownTileNotification_MoveNext __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_MoveNext
#define IIterator_ShownTileNotification_GetMany __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::Notifications::ToastCollection* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CNotifications__CToastCollection, 0x1512ed75, 0x8c74, 0x5520, 0xac,0x88, 0x13,0x4a,0x14,0x03,0xf7,0xad);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("1512ed75-8c74-5520-ac88-134a1403f7ad")
                IIterator<ABI::Windows::UI::Notifications::ToastCollection* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastCollection*, ABI::Windows::UI::Notifications::IToastCollection* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection, 0x1512ed75, 0x8c74, 0x5520, 0xac,0x88, 0x13,0x4a,0x14,0x03,0xf7,0xad)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CNotifications__CToastCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastCollection *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastCollection *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastCollection *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastCollection *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CNotifications__CToastCollectionVtbl;

interface __FIIterator_1_Windows__CUI__CNotifications__CToastCollection {
    CONST_VTBL __FIIterator_1_Windows__CUI__CNotifications__CToastCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_AddRef(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_Release(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetIids(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_get_Current(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection* This,__x_ABI_CWindows_CUI_CNotifications_CIToastCollection **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_get_HasCurrent(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_MoveNext(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetMany(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection* This,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIToastCollection **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_ToastCollection IID___FIIterator_1_Windows__CUI__CNotifications__CToastCollection
#define IIterator_ToastCollectionVtbl __FIIterator_1_Windows__CUI__CNotifications__CToastCollectionVtbl
#define IIterator_ToastCollection __FIIterator_1_Windows__CUI__CNotifications__CToastCollection
#define IIterator_ToastCollection_QueryInterface __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface
#define IIterator_ToastCollection_AddRef __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_AddRef
#define IIterator_ToastCollection_Release __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_Release
#define IIterator_ToastCollection_GetIids __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetIids
#define IIterator_ToastCollection_GetRuntimeClassName __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName
#define IIterator_ToastCollection_GetTrustLevel __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel
#define IIterator_ToastCollection_get_Current __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_get_Current
#define IIterator_ToastCollection_get_HasCurrent __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_get_HasCurrent
#define IIterator_ToastCollection_MoveNext __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_MoveNext
#define IIterator_ToastCollection_GetMany __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::Notifications::ToastNotification* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CToastNotification_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CToastNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CNotifications__CToastNotification, 0xfe1e726a, 0x3aa9, 0x5d98, 0xb1,0x9b, 0x97,0xe3,0xe1,0x7e,0xec,0x7b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("fe1e726a-3aa9-5d98-b19b-97e3e17eec7b")
                IIterator<ABI::Windows::UI::Notifications::ToastNotification* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotification*, ABI::Windows::UI::Notifications::IToastNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification, 0xfe1e726a, 0x3aa9, 0x5d98, 0xb1,0x9b, 0x97,0xe3,0xe1,0x7e,0xec,0x7b)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CNotifications__CToastNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::UI::Notifications::ToastNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastNotification *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastNotification *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastNotification *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CNotifications__CToastNotificationVtbl;

interface __FIIterator_1_Windows__CUI__CNotifications__CToastNotification {
    CONST_VTBL __FIIterator_1_Windows__CUI__CNotifications__CToastNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::Notifications::ToastNotification* > methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_QueryInterface(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_AddRef(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_Release(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetIids(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetRuntimeClassName(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetTrustLevel(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::UI::Notifications::ToastNotification* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_get_Current(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_get_HasCurrent(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_MoveNext(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetMany(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification* This,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_ToastNotification IID___FIIterator_1_Windows__CUI__CNotifications__CToastNotification
#define IIterator_ToastNotificationVtbl __FIIterator_1_Windows__CUI__CNotifications__CToastNotificationVtbl
#define IIterator_ToastNotification __FIIterator_1_Windows__CUI__CNotifications__CToastNotification
#define IIterator_ToastNotification_QueryInterface __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_QueryInterface
#define IIterator_ToastNotification_AddRef __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_AddRef
#define IIterator_ToastNotification_Release __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_Release
#define IIterator_ToastNotification_GetIids __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetIids
#define IIterator_ToastNotification_GetRuntimeClassName __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetRuntimeClassName
#define IIterator_ToastNotification_GetTrustLevel __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetTrustLevel
#define IIterator_ToastNotification_get_Current __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_get_Current
#define IIterator_ToastNotification_get_HasCurrent __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_get_HasCurrent
#define IIterator_ToastNotification_MoveNext __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_MoveNext
#define IIterator_ToastNotification_GetMany __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CNotifications__CToastNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::Notifications::UserNotification* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CNotifications__CUserNotification, 0x6ee1200d, 0xdd13, 0x5050, 0x88,0xcb, 0x53,0x52,0xaf,0x11,0x3f,0xd1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("6ee1200d-dd13-5050-88cb-5352af113fd1")
                IIterator<ABI::Windows::UI::Notifications::UserNotification* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::UserNotification*, ABI::Windows::UI::Notifications::IUserNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification, 0x6ee1200d, 0xdd13, 0x5050, 0x88,0xcb, 0x53,0x52,0xaf,0x11,0x3f,0xd1)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CNotifications__CUserNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::UI::Notifications::UserNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CNotifications__CUserNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CNotifications__CUserNotification *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CNotifications__CUserNotification *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CNotifications__CUserNotification *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CNotifications__CUserNotificationVtbl;

interface __FIIterator_1_Windows__CUI__CNotifications__CUserNotification {
    CONST_VTBL __FIIterator_1_Windows__CUI__CNotifications__CUserNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::Notifications::UserNotification* > methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_AddRef(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_Release(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetIids(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::UI::Notifications::UserNotification* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_get_Current(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification* This,__x_ABI_CWindows_CUI_CNotifications_CIUserNotification **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_get_HasCurrent(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_MoveNext(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetMany(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification* This,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIUserNotification **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_UserNotification IID___FIIterator_1_Windows__CUI__CNotifications__CUserNotification
#define IIterator_UserNotificationVtbl __FIIterator_1_Windows__CUI__CNotifications__CUserNotificationVtbl
#define IIterator_UserNotification __FIIterator_1_Windows__CUI__CNotifications__CUserNotification
#define IIterator_UserNotification_QueryInterface __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface
#define IIterator_UserNotification_AddRef __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_AddRef
#define IIterator_UserNotification_Release __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_Release
#define IIterator_UserNotification_GetIids __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetIids
#define IIterator_UserNotification_GetRuntimeClassName __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName
#define IIterator_UserNotification_GetTrustLevel __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel
#define IIterator_UserNotification_get_Current __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_get_Current
#define IIterator_UserNotification_get_HasCurrent __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_get_HasCurrent
#define IIterator_UserNotification_MoveNext __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_MoveNext
#define IIterator_UserNotification_GetMany __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > interface
 */
#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText, 0xb60de92b, 0x4e12, 0x55af, 0xb4,0x2f, 0xaf,0xe2,0xd7,0x0b,0xa2,0x78);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("b60de92b-4e12-55af-b42f-afe2d70ba278")
                IVectorView<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::AdaptiveNotificationText*, ABI::Windows::UI::Notifications::IAdaptiveNotificationText* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText, 0xb60de92b, 0x4e12, 0x55af, 0xb4,0x2f, 0xaf,0xe2,0xd7,0x0b,0xa2,0x78)
#endif
#else
typedef struct __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl;

interface __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText {
    CONST_VTBL __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_QueryInterface(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_AddRef(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_Release(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetIids(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetRuntimeClassName(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetTrustLevel(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetAt(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_get_Size(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_IndexOf(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetMany(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_AdaptiveNotificationText IID___FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText
#define IVectorView_AdaptiveNotificationTextVtbl __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl
#define IVectorView_AdaptiveNotificationText __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText
#define IVectorView_AdaptiveNotificationText_QueryInterface __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_QueryInterface
#define IVectorView_AdaptiveNotificationText_AddRef __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_AddRef
#define IVectorView_AdaptiveNotificationText_Release __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_Release
#define IVectorView_AdaptiveNotificationText_GetIids __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetIids
#define IVectorView_AdaptiveNotificationText_GetRuntimeClassName __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetRuntimeClassName
#define IVectorView_AdaptiveNotificationText_GetTrustLevel __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetTrustLevel
#define IVectorView_AdaptiveNotificationText_GetAt __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetAt
#define IVectorView_AdaptiveNotificationText_get_Size __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_get_Size
#define IVectorView_AdaptiveNotificationText_IndexOf __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_IndexOf
#define IVectorView_AdaptiveNotificationText_GetMany __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::UI::Notifications::NotificationBinding* > interface
 */
#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding, 0x9e4d0240, 0x6d5c, 0x582a, 0xa2,0x9d, 0x73,0x4e,0x84,0x75,0x07,0x38);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("9e4d0240-6d5c-582a-a29d-734e84750738")
                IVectorView<ABI::Windows::UI::Notifications::NotificationBinding* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::NotificationBinding*, ABI::Windows::UI::Notifications::INotificationBinding* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding, 0x9e4d0240, 0x6d5c, 0x582a, 0xa2,0x9d, 0x73,0x4e,0x84,0x75,0x07,0x38)
#endif
#else
typedef struct __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBindingVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBindingVtbl;

interface __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding {
    CONST_VTBL __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBindingVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_Release(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetAt(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_get_Size(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_IndexOf(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding* This,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetMany(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_NotificationBinding IID___FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding
#define IVectorView_NotificationBindingVtbl __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBindingVtbl
#define IVectorView_NotificationBinding __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding
#define IVectorView_NotificationBinding_QueryInterface __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface
#define IVectorView_NotificationBinding_AddRef __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef
#define IVectorView_NotificationBinding_Release __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_Release
#define IVectorView_NotificationBinding_GetIids __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids
#define IVectorView_NotificationBinding_GetRuntimeClassName __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName
#define IVectorView_NotificationBinding_GetTrustLevel __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel
#define IVectorView_NotificationBinding_GetAt __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetAt
#define IVectorView_NotificationBinding_get_Size __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_get_Size
#define IVectorView_NotificationBinding_IndexOf __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_IndexOf
#define IVectorView_NotificationBinding_GetMany __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::UI::Notifications::ScheduledTileNotification* > interface
 */
#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification, 0x4f729c64, 0xa213, 0x52e9, 0xaf,0x8b, 0x58,0xad,0xca,0x3e,0x59,0x7f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("4f729c64-a213-52e9-af8b-58adca3e597f")
                IVectorView<ABI::Windows::UI::Notifications::ScheduledTileNotification* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ScheduledTileNotification*, ABI::Windows::UI::Notifications::IScheduledTileNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification, 0x4f729c64, 0xa213, 0x52e9, 0xaf,0x8b, 0x58,0xad,0xca,0x3e,0x59,0x7f)
#endif
#else
typedef struct __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::UI::Notifications::ScheduledTileNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl;

interface __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification {
    CONST_VTBL __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::UI::Notifications::ScheduledTileNotification* > methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_QueryInterface(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_AddRef(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_Release(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetIids(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetRuntimeClassName(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetTrustLevel(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::UI::Notifications::ScheduledTileNotification* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetAt(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_get_Size(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_IndexOf(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetMany(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_ScheduledTileNotification IID___FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification
#define IVectorView_ScheduledTileNotificationVtbl __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl
#define IVectorView_ScheduledTileNotification __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification
#define IVectorView_ScheduledTileNotification_QueryInterface __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_QueryInterface
#define IVectorView_ScheduledTileNotification_AddRef __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_AddRef
#define IVectorView_ScheduledTileNotification_Release __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_Release
#define IVectorView_ScheduledTileNotification_GetIids __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetIids
#define IVectorView_ScheduledTileNotification_GetRuntimeClassName __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetRuntimeClassName
#define IVectorView_ScheduledTileNotification_GetTrustLevel __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetTrustLevel
#define IVectorView_ScheduledTileNotification_GetAt __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetAt
#define IVectorView_ScheduledTileNotification_get_Size __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_get_Size
#define IVectorView_ScheduledTileNotification_IndexOf __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_IndexOf
#define IVectorView_ScheduledTileNotification_GetMany __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::UI::Notifications::ScheduledToastNotification* > interface
 */
#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification, 0xba0aff1f, 0x6a8a, 0x5a7e, 0xa9,0xf7, 0x50,0x5b,0x62,0x66,0xa4,0x36);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("ba0aff1f-6a8a-5a7e-a9f7-505b6266a436")
                IVectorView<ABI::Windows::UI::Notifications::ScheduledToastNotification* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ScheduledToastNotification*, ABI::Windows::UI::Notifications::IScheduledToastNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification, 0xba0aff1f, 0x6a8a, 0x5a7e, 0xa9,0xf7, 0x50,0x5b,0x62,0x66,0xa4,0x36)
#endif
#else
typedef struct __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::UI::Notifications::ScheduledToastNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl;

interface __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification {
    CONST_VTBL __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::UI::Notifications::ScheduledToastNotification* > methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_QueryInterface(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_AddRef(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_Release(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetIids(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetRuntimeClassName(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetTrustLevel(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::UI::Notifications::ScheduledToastNotification* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetAt(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_get_Size(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_IndexOf(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetMany(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_ScheduledToastNotification IID___FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification
#define IVectorView_ScheduledToastNotificationVtbl __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl
#define IVectorView_ScheduledToastNotification __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification
#define IVectorView_ScheduledToastNotification_QueryInterface __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_QueryInterface
#define IVectorView_ScheduledToastNotification_AddRef __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_AddRef
#define IVectorView_ScheduledToastNotification_Release __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_Release
#define IVectorView_ScheduledToastNotification_GetIids __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetIids
#define IVectorView_ScheduledToastNotification_GetRuntimeClassName __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetRuntimeClassName
#define IVectorView_ScheduledToastNotification_GetTrustLevel __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetTrustLevel
#define IVectorView_ScheduledToastNotification_GetAt __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetAt
#define IVectorView_ScheduledToastNotification_get_Size __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_get_Size
#define IVectorView_ScheduledToastNotification_IndexOf __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_IndexOf
#define IVectorView_ScheduledToastNotification_GetMany __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::UI::Notifications::ShownTileNotification* > interface
 */
#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification, 0x2b23baa9, 0x1d54, 0x5440, 0xbd,0x32, 0x86,0xed,0x70,0xf1,0x5c,0x9e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("2b23baa9-1d54-5440-bd32-86ed70f15c9e")
                IVectorView<ABI::Windows::UI::Notifications::ShownTileNotification* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ShownTileNotification*, ABI::Windows::UI::Notifications::IShownTileNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification, 0x2b23baa9, 0x1d54, 0x5440, 0xbd,0x32, 0x86,0xed,0x70,0xf1,0x5c,0x9e)
#endif
#else
typedef struct __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::UI::Notifications::ShownTileNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl;

interface __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification {
    CONST_VTBL __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::UI::Notifications::ShownTileNotification* > methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_QueryInterface(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_AddRef(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_Release(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetIids(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetRuntimeClassName(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetTrustLevel(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::UI::Notifications::ShownTileNotification* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetAt(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_get_Size(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_IndexOf(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification* This,__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetMany(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_ShownTileNotification IID___FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification
#define IVectorView_ShownTileNotificationVtbl __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl
#define IVectorView_ShownTileNotification __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification
#define IVectorView_ShownTileNotification_QueryInterface __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_QueryInterface
#define IVectorView_ShownTileNotification_AddRef __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_AddRef
#define IVectorView_ShownTileNotification_Release __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_Release
#define IVectorView_ShownTileNotification_GetIids __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetIids
#define IVectorView_ShownTileNotification_GetRuntimeClassName __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetRuntimeClassName
#define IVectorView_ShownTileNotification_GetTrustLevel __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetTrustLevel
#define IVectorView_ShownTileNotification_GetAt __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetAt
#define IVectorView_ShownTileNotification_get_Size __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_get_Size
#define IVectorView_ShownTileNotification_IndexOf __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_IndexOf
#define IVectorView_ShownTileNotification_GetMany __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::UI::Notifications::ToastCollection* > interface
 */
#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection, 0xe09d090a, 0x12e2, 0x569b, 0xad,0x29, 0xfb,0x0d,0xfb,0x98,0xa1,0xda);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("e09d090a-12e2-569b-ad29-fb0dfb98a1da")
                IVectorView<ABI::Windows::UI::Notifications::ToastCollection* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastCollection*, ABI::Windows::UI::Notifications::IToastCollection* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection, 0xe09d090a, 0x12e2, 0x569b, 0xad,0x29, 0xfb,0x0d,0xfb,0x98,0xa1,0xda)
#endif
#else
typedef struct __FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl;

interface __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection {
    CONST_VTBL __FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_AddRef(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Release(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetIids(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetAt(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CIToastCollection **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_get_Size(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_IndexOf(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,__x_ABI_CWindows_CUI_CNotifications_CIToastCollection *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetMany(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIToastCollection **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_ToastCollection IID___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection
#define IVectorView_ToastCollectionVtbl __FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl
#define IVectorView_ToastCollection __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection
#define IVectorView_ToastCollection_QueryInterface __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface
#define IVectorView_ToastCollection_AddRef __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_AddRef
#define IVectorView_ToastCollection_Release __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Release
#define IVectorView_ToastCollection_GetIids __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetIids
#define IVectorView_ToastCollection_GetRuntimeClassName __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName
#define IVectorView_ToastCollection_GetTrustLevel __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel
#define IVectorView_ToastCollection_GetAt __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetAt
#define IVectorView_ToastCollection_get_Size __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_get_Size
#define IVectorView_ToastCollection_IndexOf __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_IndexOf
#define IVectorView_ToastCollection_GetMany __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::UI::Notifications::ToastNotification* > interface
 */
#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CUI__CNotifications__CToastNotification, 0xa819f3de, 0x60aa, 0x5159, 0x84,0x07, 0xf0,0xa7,0xfb,0x1f,0x68,0x32);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("a819f3de-60aa-5159-8407-f0a7fb1f6832")
                IVectorView<ABI::Windows::UI::Notifications::ToastNotification* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotification*, ABI::Windows::UI::Notifications::IToastNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification, 0xa819f3de, 0x60aa, 0x5159, 0x84,0x07, 0xf0,0xa7,0xfb,0x1f,0x68,0x32)
#endif
#else
typedef struct __FIVectorView_1_Windows__CUI__CNotifications__CToastNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::UI::Notifications::ToastNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CUI__CNotifications__CToastNotificationVtbl;

interface __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification {
    CONST_VTBL __FIVectorView_1_Windows__CUI__CNotifications__CToastNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::UI::Notifications::ToastNotification* > methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_QueryInterface(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_AddRef(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_Release(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetIids(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetRuntimeClassName(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetTrustLevel(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::UI::Notifications::ToastNotification* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetAt(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_get_Size(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_IndexOf(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetMany(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_ToastNotification IID___FIVectorView_1_Windows__CUI__CNotifications__CToastNotification
#define IVectorView_ToastNotificationVtbl __FIVectorView_1_Windows__CUI__CNotifications__CToastNotificationVtbl
#define IVectorView_ToastNotification __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification
#define IVectorView_ToastNotification_QueryInterface __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_QueryInterface
#define IVectorView_ToastNotification_AddRef __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_AddRef
#define IVectorView_ToastNotification_Release __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_Release
#define IVectorView_ToastNotification_GetIids __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetIids
#define IVectorView_ToastNotification_GetRuntimeClassName __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetRuntimeClassName
#define IVectorView_ToastNotification_GetTrustLevel __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetTrustLevel
#define IVectorView_ToastNotification_GetAt __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetAt
#define IVectorView_ToastNotification_get_Size __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_get_Size
#define IVectorView_ToastNotification_IndexOf __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_IndexOf
#define IVectorView_ToastNotification_GetMany __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::UI::Notifications::UserNotification* > interface
 */
#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification, 0x5a08f98c, 0x8e45, 0x5705, 0xaf,0x54, 0xf5,0x41,0x8e,0x59,0x83,0x92);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("5a08f98c-8e45-5705-af54-f5418e598392")
                IVectorView<ABI::Windows::UI::Notifications::UserNotification* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::UserNotification*, ABI::Windows::UI::Notifications::IUserNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification, 0x5a08f98c, 0x8e45, 0x5705, 0xaf,0x54, 0xf5,0x41,0x8e,0x59,0x83,0x92)
#endif
#else
typedef struct __FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::UI::Notifications::UserNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl;

interface __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification {
    CONST_VTBL __FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::UI::Notifications::UserNotification* > methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_AddRef(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Release(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetIids(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::UI::Notifications::UserNotification* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetAt(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CIUserNotification **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_get_Size(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_IndexOf(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,__x_ABI_CWindows_CUI_CNotifications_CIUserNotification *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetMany(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIUserNotification **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_UserNotification IID___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification
#define IVectorView_UserNotificationVtbl __FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl
#define IVectorView_UserNotification __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification
#define IVectorView_UserNotification_QueryInterface __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface
#define IVectorView_UserNotification_AddRef __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_AddRef
#define IVectorView_UserNotification_Release __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Release
#define IVectorView_UserNotification_GetIids __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetIids
#define IVectorView_UserNotification_GetRuntimeClassName __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName
#define IVectorView_UserNotification_GetTrustLevel __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel
#define IVectorView_UserNotification_GetAt __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetAt
#define IVectorView_UserNotification_get_Size __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_get_Size
#define IVectorView_UserNotification_IndexOf __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_IndexOf
#define IVectorView_UserNotification_GetMany __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVector<ABI::Windows::UI::Notifications::NotificationBinding* > interface
 */
#ifndef ____FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__
#define ____FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVector_1_Windows__CUI__CNotifications__CNotificationBinding, 0x7f7d8ad7, 0xb4d2, 0x5a03, 0xbe,0x6f, 0x2b,0x89,0x87,0x5f,0xb3,0x2d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("7f7d8ad7-b4d2-5a03-be6f-2b89875fb32d")
                IVector<ABI::Windows::UI::Notifications::NotificationBinding* > : IVector_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::NotificationBinding*, ABI::Windows::UI::Notifications::INotificationBinding* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding, 0x7f7d8ad7, 0xb4d2, 0x5a03, 0xbe,0x6f, 0x2b,0x89,0x87,0x5f,0xb3,0x2d)
#endif
#else
typedef struct __FIVector_1_Windows__CUI__CNotifications__CNotificationBindingVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVector<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *GetView)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding **value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *value);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *Append)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAtEnd)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **items,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *ReplaceAll)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 count,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **items);

    END_INTERFACE
} __FIVector_1_Windows__CUI__CNotifications__CNotificationBindingVtbl;

interface __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding {
    CONST_VTBL __FIVector_1_Windows__CUI__CNotifications__CNotificationBindingVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVector<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetView(This,value) (This)->lpVtbl->GetView(This,value)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_SetAt(This,index,value) (This)->lpVtbl->SetAt(This,index,value)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_InsertAt(This,index,value) (This)->lpVtbl->InsertAt(This,index,value)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_Append(This,value) (This)->lpVtbl->Append(This,value)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_RemoveAtEnd(This) (This)->lpVtbl->RemoveAtEnd(This)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_Clear(This) (This)->lpVtbl->Clear(This)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_ReplaceAll(This,count,items) (This)->lpVtbl->ReplaceAll(This,count,items)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_Release(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVector<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetAt(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_get_Size(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetView(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding **value) {
    return This->lpVtbl->GetView(This,value);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_IndexOf(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_SetAt(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *value) {
    return This->lpVtbl->SetAt(This,index,value);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_InsertAt(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *value) {
    return This->lpVtbl->InsertAt(This,index,value);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_RemoveAt(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_Append(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *value) {
    return This->lpVtbl->Append(This,value);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_RemoveAtEnd(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This) {
    return This->lpVtbl->RemoveAtEnd(This);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_Clear(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This) {
    return This->lpVtbl->Clear(This);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetMany(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_ReplaceAll(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 count,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **items) {
    return This->lpVtbl->ReplaceAll(This,count,items);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVector_NotificationBinding IID___FIVector_1_Windows__CUI__CNotifications__CNotificationBinding
#define IVector_NotificationBindingVtbl __FIVector_1_Windows__CUI__CNotifications__CNotificationBindingVtbl
#define IVector_NotificationBinding __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding
#define IVector_NotificationBinding_QueryInterface __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface
#define IVector_NotificationBinding_AddRef __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef
#define IVector_NotificationBinding_Release __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_Release
#define IVector_NotificationBinding_GetIids __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids
#define IVector_NotificationBinding_GetRuntimeClassName __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName
#define IVector_NotificationBinding_GetTrustLevel __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel
#define IVector_NotificationBinding_GetAt __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetAt
#define IVector_NotificationBinding_get_Size __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_get_Size
#define IVector_NotificationBinding_GetView __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetView
#define IVector_NotificationBinding_IndexOf __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_IndexOf
#define IVector_NotificationBinding_SetAt __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_SetAt
#define IVector_NotificationBinding_InsertAt __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_InsertAt
#define IVector_NotificationBinding_RemoveAt __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_RemoveAt
#define IVector_NotificationBinding_Append __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_Append
#define IVector_NotificationBinding_RemoveAtEnd __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_RemoveAtEnd
#define IVector_NotificationBinding_Clear __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_Clear
#define IVector_NotificationBinding_GetMany __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetMany
#define IVector_NotificationBinding_ReplaceAll __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_ReplaceAll
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > interface
 */
#ifndef ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection, 0x34d4fa14, 0x252b, 0x5cb4, 0xa7,0xda, 0x97,0x1e,0xe5,0xda,0xec,0x7c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("34d4fa14-252b-5cb4-a7da-971ee5daec7c")
            IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > : IAsyncOperation_impl<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection, 0x34d4fa14, 0x252b, 0x5cb4, 0xa7,0xda, 0x97,0x1e,0xe5,0xda,0xec,0x7c)
#endif
#else
typedef struct __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection **results);

    END_INTERFACE
} __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl;

interface __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection {
    CONST_VTBL __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > methods ***/
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_AddRef(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Release(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetIids(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > methods ***/
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_put_Completed(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_get_Completed(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetResults(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_IVectorView_ToastCollection IID___FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection
#define IAsyncOperation_IVectorView_ToastCollectionVtbl __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl
#define IAsyncOperation_IVectorView_ToastCollection __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection
#define IAsyncOperation_IVectorView_ToastCollection_QueryInterface __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface
#define IAsyncOperation_IVectorView_ToastCollection_AddRef __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_AddRef
#define IAsyncOperation_IVectorView_ToastCollection_Release __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Release
#define IAsyncOperation_IVectorView_ToastCollection_GetIids __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetIids
#define IAsyncOperation_IVectorView_ToastCollection_GetRuntimeClassName __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName
#define IAsyncOperation_IVectorView_ToastCollection_GetTrustLevel __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel
#define IAsyncOperation_IVectorView_ToastCollection_put_Completed __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_put_Completed
#define IAsyncOperation_IVectorView_ToastCollection_get_Completed __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_get_Completed
#define IAsyncOperation_IVectorView_ToastCollection_GetResults __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* > interface
 */
#ifndef ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification, 0xbf7f3d3c, 0x230f, 0x54ea, 0xad,0x74, 0x0c,0xf6,0xc5,0x5c,0xd8,0xd1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("bf7f3d3c-230f-54ea-ad74-0cf6c55cd8d1")
            IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* > : IAsyncOperation_impl<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification, 0xbf7f3d3c, 0x230f, 0x54ea, 0xad,0x74, 0x0c,0xf6,0xc5,0x5c,0xd8,0xd1)
#endif
#else
typedef struct __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification **results);

    END_INTERFACE
} __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl;

interface __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification {
    CONST_VTBL __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* > methods ***/
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_AddRef(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Release(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetIids(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* > methods ***/
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_put_Completed(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_get_Completed(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetResults(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_IVectorView_UserNotification IID___FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification
#define IAsyncOperation_IVectorView_UserNotificationVtbl __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl
#define IAsyncOperation_IVectorView_UserNotification __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification
#define IAsyncOperation_IVectorView_UserNotification_QueryInterface __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface
#define IAsyncOperation_IVectorView_UserNotification_AddRef __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_AddRef
#define IAsyncOperation_IVectorView_UserNotification_Release __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Release
#define IAsyncOperation_IVectorView_UserNotification_GetIids __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetIids
#define IAsyncOperation_IVectorView_UserNotification_GetRuntimeClassName __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName
#define IAsyncOperation_IVectorView_UserNotification_GetTrustLevel __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel
#define IAsyncOperation_IVectorView_UserNotification_put_Completed __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_put_Completed
#define IAsyncOperation_IVectorView_UserNotification_get_Completed __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_get_Completed
#define IAsyncOperation_IVectorView_UserNotification_GetResults __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::UI::Notifications::ToastCollection* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection, 0x9310ec47, 0x9f0a, 0x5999, 0x80,0xc2, 0x4b,0x31,0xe9,0xf7,0x7e,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("9310ec47-9f0a-5999-80c2-4b31e9f77e8e")
            IAsyncOperation<ABI::Windows::UI::Notifications::ToastCollection* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastCollection*, ABI::Windows::UI::Notifications::IToastCollection* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection, 0x9310ec47, 0x9f0a, 0x5999, 0x80,0xc2, 0x4b,0x31,0xe9,0xf7,0x7e,0x8e)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollectionVtbl;

interface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection {
    CONST_VTBL __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_AddRef(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_Release(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetIids(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_put_Completed(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection* This,__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_get_Completed(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection* This,__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetResults(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection* This,__x_ABI_CWindows_CUI_CNotifications_CIToastCollection **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_ToastCollection IID___FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection
#define IAsyncOperation_ToastCollectionVtbl __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollectionVtbl
#define IAsyncOperation_ToastCollection __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection
#define IAsyncOperation_ToastCollection_QueryInterface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface
#define IAsyncOperation_ToastCollection_AddRef __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_AddRef
#define IAsyncOperation_ToastCollection_Release __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_Release
#define IAsyncOperation_ToastCollection_GetIids __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetIids
#define IAsyncOperation_ToastCollection_GetRuntimeClassName __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName
#define IAsyncOperation_ToastCollection_GetTrustLevel __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel
#define IAsyncOperation_ToastCollection_put_Completed __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_put_Completed
#define IAsyncOperation_ToastCollection_get_Completed __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_get_Completed
#define IAsyncOperation_ToastCollection_GetResults __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotificationHistory* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory, 0x2a22fecb, 0x4b96, 0x551f, 0xb7,0xb9, 0xa7,0xb5,0xbe,0xec,0xad,0x05);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("2a22fecb-4b96-551f-b7b9-a7b5beecad05")
            IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotificationHistory* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotificationHistory*, ABI::Windows::UI::Notifications::IToastNotificationHistory* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory, 0x2a22fecb, 0x4b96, 0x551f, 0xb7,0xb9, 0xa7,0xb5,0xbe,0xec,0xad,0x05)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotificationHistory* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistoryVtbl;

interface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory {
    CONST_VTBL __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotificationHistory* > methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_QueryInterface(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_AddRef(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_Release(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetIids(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetTrustLevel(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotificationHistory* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_put_Completed(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory* This,__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_get_Completed(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory* This,__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetResults(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_ToastNotificationHistory IID___FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory
#define IAsyncOperation_ToastNotificationHistoryVtbl __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistoryVtbl
#define IAsyncOperation_ToastNotificationHistory __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory
#define IAsyncOperation_ToastNotificationHistory_QueryInterface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_QueryInterface
#define IAsyncOperation_ToastNotificationHistory_AddRef __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_AddRef
#define IAsyncOperation_ToastNotificationHistory_Release __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_Release
#define IAsyncOperation_ToastNotificationHistory_GetIids __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetIids
#define IAsyncOperation_ToastNotificationHistory_GetRuntimeClassName __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetRuntimeClassName
#define IAsyncOperation_ToastNotificationHistory_GetTrustLevel __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetTrustLevel
#define IAsyncOperation_ToastNotificationHistory_put_Completed __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_put_Completed
#define IAsyncOperation_ToastNotificationHistory_get_Completed __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_get_Completed
#define IAsyncOperation_ToastNotificationHistory_GetResults __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotifier* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier, 0x2dddc10e, 0x38e6, 0x5655, 0xad,0xf3, 0x82,0x0e,0x8f,0xb1,0x4d,0xcc);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("2dddc10e-38e6-5655-adf3-820e8fb14dcc")
            IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotifier* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotifier*, ABI::Windows::UI::Notifications::IToastNotifier* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier, 0x2dddc10e, 0x38e6, 0x5655, 0xad,0xf3, 0x82,0x0e,0x8f,0xb1,0x4d,0xcc)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifierVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotifier* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifierVtbl;

interface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier {
    CONST_VTBL __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifierVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotifier* > methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_QueryInterface(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_AddRef(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_Release(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetIids(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetTrustLevel(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotifier* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_put_Completed(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier* This,__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_get_Completed(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier* This,__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetResults(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_ToastNotifier IID___FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier
#define IAsyncOperation_ToastNotifierVtbl __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifierVtbl
#define IAsyncOperation_ToastNotifier __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier
#define IAsyncOperation_ToastNotifier_QueryInterface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_QueryInterface
#define IAsyncOperation_ToastNotifier_AddRef __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_AddRef
#define IAsyncOperation_ToastNotifier_Release __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_Release
#define IAsyncOperation_ToastNotifier_GetIids __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetIids
#define IAsyncOperation_ToastNotifier_GetRuntimeClassName __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetRuntimeClassName
#define IAsyncOperation_ToastNotifier_GetTrustLevel __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetTrustLevel
#define IAsyncOperation_ToastNotifier_put_Completed __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_put_Completed
#define IAsyncOperation_ToastNotifier_get_Completed __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_get_Completed
#define IAsyncOperation_ToastNotifier_GetResults __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection, 0x4650e069, 0x3052, 0x530e, 0xbc,0x38, 0x93,0xc4,0x11,0x77,0x3b,0x77);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("4650e069-3052-530e-bc38-93c411773b77")
            IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection, 0x4650e069, 0x3052, 0x530e, 0xbc,0x38, 0x93,0xc4,0x11,0x77,0x3b,0x77)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl;

interface __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > methods ***/
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_AddRef(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Release(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Invoke(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_IVectorView_ToastCollection IID___FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection
#define IAsyncOperationCompletedHandler_IVectorView_ToastCollectionVtbl __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl
#define IAsyncOperationCompletedHandler_IVectorView_ToastCollection __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection
#define IAsyncOperationCompletedHandler_IVectorView_ToastCollection_QueryInterface __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface
#define IAsyncOperationCompletedHandler_IVectorView_ToastCollection_AddRef __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_AddRef
#define IAsyncOperationCompletedHandler_IVectorView_ToastCollection_Release __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Release
#define IAsyncOperationCompletedHandler_IVectorView_ToastCollection_Invoke __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification, 0x9e42ed08, 0x45b3, 0x5643, 0xb5,0xc7, 0xb2,0x16,0xf5,0x78,0x15,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("9e42ed08-45b3-5643-b5c7-b216f5781594")
            IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification, 0x9e42ed08, 0x45b3, 0x5643, 0xb5,0xc7, 0xb2,0x16,0xf5,0x78,0x15,0x94)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl;

interface __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* > methods ***/
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_AddRef(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Release(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Invoke(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_IVectorView_UserNotification IID___FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification
#define IAsyncOperationCompletedHandler_IVectorView_UserNotificationVtbl __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl
#define IAsyncOperationCompletedHandler_IVectorView_UserNotification __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification
#define IAsyncOperationCompletedHandler_IVectorView_UserNotification_QueryInterface __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface
#define IAsyncOperationCompletedHandler_IVectorView_UserNotification_AddRef __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_AddRef
#define IAsyncOperationCompletedHandler_IVectorView_UserNotification_Release __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Release
#define IAsyncOperationCompletedHandler_IVectorView_UserNotification_Invoke __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastCollection* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection, 0x8d44ca1e, 0x15d7, 0x5bcb, 0xb0,0x02, 0x38,0x4c,0x87,0x17,0x1c,0x74);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("8d44ca1e-15d7-5bcb-b002-384c87171c74")
            IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastCollection* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastCollection*, ABI::Windows::UI::Notifications::IToastCollection* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection, 0x8d44ca1e, 0x15d7, 0x5bcb, 0xb0,0x02, 0x38,0x4c,0x87,0x17,0x1c,0x74)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection *This,
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollectionVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_Release(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection* This,__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_ToastCollection IID___FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection
#define IAsyncOperationCompletedHandler_ToastCollectionVtbl __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollectionVtbl
#define IAsyncOperationCompletedHandler_ToastCollection __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection
#define IAsyncOperationCompletedHandler_ToastCollection_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface
#define IAsyncOperationCompletedHandler_ToastCollection_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_AddRef
#define IAsyncOperationCompletedHandler_ToastCollection_Release __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_Release
#define IAsyncOperationCompletedHandler_ToastCollection_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotificationHistory* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory, 0xc661d5da, 0x6762, 0x5d93, 0x91,0x38, 0xe7,0xda,0xcd,0x57,0x10,0x56);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("c661d5da-6762-5d93-9138-e7dacd571056")
            IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotificationHistory* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotificationHistory*, ABI::Windows::UI::Notifications::IToastNotificationHistory* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory, 0xc661d5da, 0x6762, 0x5d93, 0x91,0x38, 0xe7,0xda,0xcd,0x57,0x10,0x56)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotificationHistory* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory *This,
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistoryVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotificationHistory* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_Release(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotificationHistory* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory* This,__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_ToastNotificationHistory IID___FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory
#define IAsyncOperationCompletedHandler_ToastNotificationHistoryVtbl __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistoryVtbl
#define IAsyncOperationCompletedHandler_ToastNotificationHistory __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory
#define IAsyncOperationCompletedHandler_ToastNotificationHistory_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_QueryInterface
#define IAsyncOperationCompletedHandler_ToastNotificationHistory_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_AddRef
#define IAsyncOperationCompletedHandler_ToastNotificationHistory_Release __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_Release
#define IAsyncOperationCompletedHandler_ToastNotificationHistory_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotifier* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier, 0xfde26ed7, 0xbc37, 0x5a7c, 0xb3,0xda, 0x3e,0x41,0xac,0x97,0xbb,0xa4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("fde26ed7-bc37-5a7c-b3da-3e41ac97bba4")
            IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotifier* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotifier*, ABI::Windows::UI::Notifications::IToastNotifier* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier, 0xfde26ed7, 0xbc37, 0x5a7c, 0xb3,0xda, 0x3e,0x41,0xac,0x97,0xbb,0xa4)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifierVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotifier* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier *This,
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifierVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifierVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotifier* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_Release(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotifier* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier* This,__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_ToastNotifier IID___FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier
#define IAsyncOperationCompletedHandler_ToastNotifierVtbl __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifierVtbl
#define IAsyncOperationCompletedHandler_ToastNotifier __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier
#define IAsyncOperationCompletedHandler_ToastNotifier_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_QueryInterface
#define IAsyncOperationCompletedHandler_ToastNotifier_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_AddRef
#define IAsyncOperationCompletedHandler_ToastNotifier_Release __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_Release
#define IAsyncOperationCompletedHandler_ToastNotifier_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,IInspectable* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable, 0xab54de2d, 0x97d9, 0x5528, 0xb6,0xad, 0x10,0x5a,0xfe,0x15,0x65,0x30);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("ab54de2d-97d9-5528-b6ad-105afe156530")
            ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,IInspectable* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotification*, ABI::Windows::UI::Notifications::IToastNotification* >, IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable, 0xab54de2d, 0x97d9, 0x5528, 0xb6,0xad, 0x10,0x5a,0xfe,0x15,0x65,0x30)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *sender,
        IInspectable *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectableVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,IInspectable* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_AddRef(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_Release(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,IInspectable* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_Invoke(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification *sender,IInspectable *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_ToastNotification_IInspectable IID___FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable
#define ITypedEventHandler_ToastNotification_IInspectableVtbl __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectableVtbl
#define ITypedEventHandler_ToastNotification_IInspectable __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable
#define ITypedEventHandler_ToastNotification_IInspectable_QueryInterface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_QueryInterface
#define ITypedEventHandler_ToastNotification_IInspectable_AddRef __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_AddRef
#define ITypedEventHandler_ToastNotification_IInspectable_Release __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_Release
#define ITypedEventHandler_ToastNotification_IInspectable_Invoke __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastDismissedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs, 0x61c2402f, 0x0ed0, 0x5a18, 0xab,0x69, 0x59,0xf4,0xaa,0x99,0xa3,0x68);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("61c2402f-0ed0-5a18-ab69-59f4aa99a368")
            ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastDismissedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotification*, ABI::Windows::UI::Notifications::IToastNotification* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastDismissedEventArgs*, ABI::Windows::UI::Notifications::IToastDismissedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs, 0x61c2402f, 0x0ed0, 0x5a18, 0xab,0x69, 0x59,0xf4,0xaa,0x99,0xa3,0x68)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastDismissedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *sender,
        __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastDismissedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastDismissedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification *sender,__x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_ToastNotification_ToastDismissedEventArgs IID___FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs
#define ITypedEventHandler_ToastNotification_ToastDismissedEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgsVtbl
#define ITypedEventHandler_ToastNotification_ToastDismissedEventArgs __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs
#define ITypedEventHandler_ToastNotification_ToastDismissedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_QueryInterface
#define ITypedEventHandler_ToastNotification_ToastDismissedEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_AddRef
#define ITypedEventHandler_ToastNotification_ToastDismissedEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_Release
#define ITypedEventHandler_ToastNotification_ToastDismissedEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastFailedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs, 0x95e3e803, 0xc969, 0x5e3a, 0x97,0x53, 0xea,0x2a,0xd2,0x2a,0x9a,0x33);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("95e3e803-c969-5e3a-9753-ea2ad22a9a33")
            ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastFailedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotification*, ABI::Windows::UI::Notifications::IToastNotification* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastFailedEventArgs*, ABI::Windows::UI::Notifications::IToastFailedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs, 0x95e3e803, 0xc969, 0x5e3a, 0x97,0x53, 0xea,0x2a,0xd2,0x2a,0x9a,0x33)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastFailedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *sender,
        __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastFailedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastFailedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification *sender,__x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_ToastNotification_ToastFailedEventArgs IID___FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs
#define ITypedEventHandler_ToastNotification_ToastFailedEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgsVtbl
#define ITypedEventHandler_ToastNotification_ToastFailedEventArgs __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs
#define ITypedEventHandler_ToastNotification_ToastFailedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_QueryInterface
#define ITypedEventHandler_ToastNotification_ToastFailedEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_AddRef
#define ITypedEventHandler_ToastNotification_ToastFailedEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_Release
#define ITypedEventHandler_ToastNotification_ToastFailedEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotificationManagerForUser*,IInspectable* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable, 0x821bdf6b, 0x029a, 0x5299, 0x93,0xf3, 0x30,0x77,0xb2,0xee,0x5e,0x33);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("821bdf6b-029a-5299-93f3-3077b2ee5e33")
            ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotificationManagerForUser*,IInspectable* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotificationManagerForUser*, ABI::Windows::UI::Notifications::IToastNotificationManagerForUser* >, IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable, 0x821bdf6b, 0x029a, 0x5299, 0x93,0xf3, 0x30,0x77,0xb2,0xee,0x5e,0x33)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotificationManagerForUser*,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser *sender,
        IInspectable *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectableVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotificationManagerForUser*,IInspectable* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_AddRef(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_Release(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotificationManagerForUser*,IInspectable* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_Invoke(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser *sender,IInspectable *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_ToastNotificationManagerForUser_IInspectable IID___FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable
#define ITypedEventHandler_ToastNotificationManagerForUser_IInspectableVtbl __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectableVtbl
#define ITypedEventHandler_ToastNotificationManagerForUser_IInspectable __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable
#define ITypedEventHandler_ToastNotificationManagerForUser_IInspectable_QueryInterface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_QueryInterface
#define ITypedEventHandler_ToastNotificationManagerForUser_IInspectable_AddRef __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_AddRef
#define ITypedEventHandler_ToastNotificationManagerForUser_IInspectable_Release __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_Release
#define ITypedEventHandler_ToastNotificationManagerForUser_IInspectable_Invoke __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotifier*,ABI::Windows::UI::Notifications::ScheduledToastNotificationShowingEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs, 0xb1bb0cab, 0xf8b9, 0x5909, 0xa8,0x72, 0xef,0x29,0xe0,0x5a,0x8c,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("b1bb0cab-f8b9-5909-a872-ef29e05a8c7a")
            ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotifier*,ABI::Windows::UI::Notifications::ScheduledToastNotificationShowingEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotifier*, ABI::Windows::UI::Notifications::IToastNotifier* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ScheduledToastNotificationShowingEventArgs*, ABI::Windows::UI::Notifications::IScheduledToastNotificationShowingEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs, 0xb1bb0cab, 0xf8b9, 0x5909, 0xa8,0x72, 0xef,0x29,0xe0,0x5a,0x8c,0x7a)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotifier*,ABI::Windows::UI::Notifications::ScheduledToastNotificationShowingEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *sender,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotifier*,ABI::Windows::UI::Notifications::ScheduledToastNotificationShowingEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotifier*,ABI::Windows::UI::Notifications::ScheduledToastNotificationShowingEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *sender,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_ToastNotifier_ScheduledToastNotificationShowingEventArgs IID___FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs
#define ITypedEventHandler_ToastNotifier_ScheduledToastNotificationShowingEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgsVtbl
#define ITypedEventHandler_ToastNotifier_ScheduledToastNotificationShowingEventArgs __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs
#define ITypedEventHandler_ToastNotifier_ScheduledToastNotificationShowingEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_QueryInterface
#define ITypedEventHandler_ToastNotifier_ScheduledToastNotificationShowingEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_AddRef
#define ITypedEventHandler_ToastNotifier_ScheduledToastNotificationShowingEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_Release
#define ITypedEventHandler_ToastNotifier_ScheduledToastNotificationShowingEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_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_ui_notifications_h__ */
