/*** Autogenerated by WIDL 9.18 from include/windows.gaming.input.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_gaming_input_h__
#define __windows_gaming_input_h__

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

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIArcadeStick_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIArcadeStick_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIArcadeStick __x_ABI_CWindows_CGaming_CInput_CIArcadeStick;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStick ABI::Windows::Gaming::Input::IArcadeStick
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IArcadeStick;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics ABI::Windows::Gaming::Input::IArcadeStickStatics
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IArcadeStickStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2 __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2 ABI::Windows::Gaming::Input::IArcadeStickStatics2
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IArcadeStickStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIFlightStick_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIFlightStick_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIFlightStick __x_ABI_CWindows_CGaming_CInput_CIFlightStick;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStick ABI::Windows::Gaming::Input::IFlightStick
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IFlightStick;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics ABI::Windows::Gaming::Input::IFlightStickStatics
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IFlightStickStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIGameController_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIGameController_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIGameController __x_ABI_CWindows_CGaming_CInput_CIGameController;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIGameController ABI::Windows::Gaming::Input::IGameController
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IGameController;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIGamepad_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIGamepad_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIGamepad __x_ABI_CWindows_CGaming_CInput_CIGamepad;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIGamepad ABI::Windows::Gaming::Input::IGamepad
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IGamepad;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIGamepad2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIGamepad2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIGamepad2 __x_ABI_CWindows_CGaming_CInput_CIGamepad2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIGamepad2 ABI::Windows::Gaming::Input::IGamepad2
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IGamepad2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIRacingWheel_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIRacingWheel_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIRacingWheel __x_ABI_CWindows_CGaming_CInput_CIRacingWheel;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheel ABI::Windows::Gaming::Input::IRacingWheel
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IRacingWheel;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics ABI::Windows::Gaming::Input::IRacingWheelStatics
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IRacingWheelStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2 __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2 ABI::Windows::Gaming::Input::IRacingWheelStatics2
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IRacingWheelStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIRawGameController_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIRawGameController_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIRawGameController __x_ABI_CWindows_CGaming_CInput_CIRawGameController;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController ABI::Windows::Gaming::Input::IRawGameController
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IRawGameController;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIRawGameController2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIRawGameController2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIRawGameController2 __x_ABI_CWindows_CGaming_CInput_CIRawGameController2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController2 ABI::Windows::Gaming::Input::IRawGameController2
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IRawGameController2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics ABI::Windows::Gaming::Input::IGamepadStatics
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IGamepadStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2 __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2 ABI::Windows::Gaming::Input::IGamepadStatics2
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IGamepadStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIHeadset_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIHeadset_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIHeadset __x_ABI_CWindows_CGaming_CInput_CIHeadset;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIHeadset ABI::Windows::Gaming::Input::IHeadset
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IHeadset;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics ABI::Windows::Gaming::Input::IRawGameControllerStatics
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IRawGameControllerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo ABI::Windows::Gaming::Input::IGameControllerBatteryInfo
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IGameControllerBatteryInfo;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CArcadeStick_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CArcadeStick_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                class ArcadeStick;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CArcadeStick __x_ABI_CWindows_CGaming_CInput_CArcadeStick;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGaming_CInput_CArcadeStick_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGaming_CInput_CFlightStick_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CFlightStick_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                class FlightStick;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CFlightStick __x_ABI_CWindows_CGaming_CInput_CFlightStick;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGaming_CInput_CFlightStick_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGaming_CInput_CGamepad_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CGamepad_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                class Gamepad;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CGamepad __x_ABI_CWindows_CGaming_CInput_CGamepad;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGaming_CInput_CGamepad_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGaming_CInput_CHeadset_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CHeadset_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                class Headset;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CHeadset __x_ABI_CWindows_CGaming_CInput_CHeadset;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGaming_CInput_CHeadset_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGaming_CInput_CRacingWheel_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CRacingWheel_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                class RacingWheel;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CRacingWheel __x_ABI_CWindows_CGaming_CInput_CRacingWheel;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGaming_CInput_CRacingWheel_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGaming_CInput_CRawGameController_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CRawGameController_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                class RawGameController;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CRawGameController __x_ABI_CWindows_CGaming_CInput_CRawGameController;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGaming_CInput_CRawGameController_FWD_DEFINED__ */

#ifndef ____FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick_FWD_DEFINED__
#define ____FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick_FWD_DEFINED__
typedef interface __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick;
#ifdef __cplusplus
#define __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick ABI::Windows::Foundation::IEventHandler<ABI::Windows::Gaming::Input::ArcadeStick* >
#endif /* __cplusplus */
#endif

#ifndef ____FIEventHandler_1_Windows__CGaming__CInput__CFlightStick_FWD_DEFINED__
#define ____FIEventHandler_1_Windows__CGaming__CInput__CFlightStick_FWD_DEFINED__
typedef interface __FIEventHandler_1_Windows__CGaming__CInput__CFlightStick __FIEventHandler_1_Windows__CGaming__CInput__CFlightStick;
#ifdef __cplusplus
#define __FIEventHandler_1_Windows__CGaming__CInput__CFlightStick ABI::Windows::Foundation::IEventHandler<ABI::Windows::Gaming::Input::FlightStick* >
#endif /* __cplusplus */
#endif

#ifndef ____FIEventHandler_1_Windows__CGaming__CInput__CGamepad_FWD_DEFINED__
#define ____FIEventHandler_1_Windows__CGaming__CInput__CGamepad_FWD_DEFINED__
typedef interface __FIEventHandler_1_Windows__CGaming__CInput__CGamepad __FIEventHandler_1_Windows__CGaming__CInput__CGamepad;
#ifdef __cplusplus
#define __FIEventHandler_1_Windows__CGaming__CInput__CGamepad ABI::Windows::Foundation::IEventHandler<ABI::Windows::Gaming::Input::Gamepad* >
#endif /* __cplusplus */
#endif

#ifndef ____FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel_FWD_DEFINED__
#define ____FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel_FWD_DEFINED__
typedef interface __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel;
#ifdef __cplusplus
#define __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel ABI::Windows::Foundation::IEventHandler<ABI::Windows::Gaming::Input::RacingWheel* >
#endif /* __cplusplus */
#endif

#ifndef ____FIEventHandler_1_Windows__CGaming__CInput__CRawGameController_FWD_DEFINED__
#define ____FIEventHandler_1_Windows__CGaming__CInput__CRawGameController_FWD_DEFINED__
typedef interface __FIEventHandler_1_Windows__CGaming__CInput__CRawGameController __FIEventHandler_1_Windows__CGaming__CInput__CRawGameController;
#ifdef __cplusplus
#define __FIEventHandler_1_Windows__CGaming__CInput__CRawGameController ABI::Windows::Foundation::IEventHandler<ABI::Windows::Gaming::Input::RawGameController* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Gaming::Input::IGameController*,ABI::Windows::Gaming::Input::Headset* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Gaming::Input::IGameController*,ABI::Windows::System::UserChangedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CGaming__CInput__CArcadeStick_FWD_DEFINED__
#define ____FIIterator_1_Windows__CGaming__CInput__CArcadeStick_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CGaming__CInput__CArcadeStick __FIIterator_1_Windows__CGaming__CInput__CArcadeStick;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CGaming__CInput__CArcadeStick ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Gaming::Input::ArcadeStick* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CGaming__CInput__CArcadeStick_FWD_DEFINED__
#define ____FIIterable_1_Windows__CGaming__CInput__CArcadeStick_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CGaming__CInput__CArcadeStick __FIIterable_1_Windows__CGaming__CInput__CArcadeStick;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CGaming__CInput__CArcadeStick ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Gaming::Input::ArcadeStick* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Gaming::Input::ArcadeStick* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CGaming__CInput__CFlightStick_FWD_DEFINED__
#define ____FIIterator_1_Windows__CGaming__CInput__CFlightStick_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CGaming__CInput__CFlightStick __FIIterator_1_Windows__CGaming__CInput__CFlightStick;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CGaming__CInput__CFlightStick ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Gaming::Input::FlightStick* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CGaming__CInput__CFlightStick_FWD_DEFINED__
#define ____FIIterable_1_Windows__CGaming__CInput__CFlightStick_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CGaming__CInput__CFlightStick __FIIterable_1_Windows__CGaming__CInput__CFlightStick;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CGaming__CInput__CFlightStick ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Gaming::Input::FlightStick* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CGaming__CInput__CFlightStick_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CGaming__CInput__CFlightStick_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CGaming__CInput__CFlightStick __FIVectorView_1_Windows__CGaming__CInput__CFlightStick;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CGaming__CInput__CFlightStick ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Gaming::Input::FlightStick* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CGaming__CInput__CGamepad_FWD_DEFINED__
#define ____FIIterator_1_Windows__CGaming__CInput__CGamepad_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CGaming__CInput__CGamepad __FIIterator_1_Windows__CGaming__CInput__CGamepad;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CGaming__CInput__CGamepad ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Gaming::Input::Gamepad* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CGaming__CInput__CGamepad_FWD_DEFINED__
#define ____FIIterable_1_Windows__CGaming__CInput__CGamepad_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CGaming__CInput__CGamepad __FIIterable_1_Windows__CGaming__CInput__CGamepad;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CGaming__CInput__CGamepad ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Gaming::Input::Gamepad* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CGaming__CInput__CGamepad_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CGaming__CInput__CGamepad_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CGaming__CInput__CGamepad __FIVectorView_1_Windows__CGaming__CInput__CGamepad;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CGaming__CInput__CGamepad ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Gaming::Input::Gamepad* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CGaming__CInput__CGamepad_FWD_DEFINED__
#define ____FIVector_1_Windows__CGaming__CInput__CGamepad_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CGaming__CInput__CGamepad __FIVector_1_Windows__CGaming__CInput__CGamepad;
#ifdef __cplusplus
#define __FIVector_1_Windows__CGaming__CInput__CGamepad ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Gaming::Input::Gamepad* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CGaming__CInput__CRacingWheel_FWD_DEFINED__
#define ____FIIterator_1_Windows__CGaming__CInput__CRacingWheel_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CGaming__CInput__CRacingWheel __FIIterator_1_Windows__CGaming__CInput__CRacingWheel;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CGaming__CInput__CRacingWheel ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Gaming::Input::RacingWheel* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CGaming__CInput__CRacingWheel_FWD_DEFINED__
#define ____FIIterable_1_Windows__CGaming__CInput__CRacingWheel_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CGaming__CInput__CRacingWheel __FIIterable_1_Windows__CGaming__CInput__CRacingWheel;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CGaming__CInput__CRacingWheel ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Gaming::Input::RacingWheel* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Gaming::Input::RacingWheel* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CGaming__CInput__CRacingWheel_FWD_DEFINED__
#define ____FIVector_1_Windows__CGaming__CInput__CRacingWheel_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CGaming__CInput__CRacingWheel __FIVector_1_Windows__CGaming__CInput__CRacingWheel;
#ifdef __cplusplus
#define __FIVector_1_Windows__CGaming__CInput__CRacingWheel ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Gaming::Input::RacingWheel* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CGaming__CInput__CRawGameController_FWD_DEFINED__
#define ____FIIterator_1_Windows__CGaming__CInput__CRawGameController_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CGaming__CInput__CRawGameController __FIIterator_1_Windows__CGaming__CInput__CRawGameController;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CGaming__CInput__CRawGameController ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Gaming::Input::RawGameController* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CGaming__CInput__CRawGameController_FWD_DEFINED__
#define ____FIIterable_1_Windows__CGaming__CInput__CRawGameController_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CGaming__CInput__CRawGameController __FIIterable_1_Windows__CGaming__CInput__CRawGameController;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CGaming__CInput__CRawGameController ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Gaming::Input::RawGameController* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CGaming__CInput__CRawGameController_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CGaming__CInput__CRawGameController_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CGaming__CInput__CRawGameController __FIVectorView_1_Windows__CGaming__CInput__CRawGameController;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CGaming__CInput__CRawGameController ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Gaming::Input::RawGameController* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CGaming__CInput__CRawGameController_FWD_DEFINED__
#define ____FIVector_1_Windows__CGaming__CInput__CRawGameController_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CGaming__CInput__CRawGameController __FIVector_1_Windows__CGaming__CInput__CRawGameController;
#ifdef __cplusplus
#define __FIVector_1_Windows__CGaming__CInput__CRawGameController ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Gaming::Input::RawGameController* >
#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.devices.haptics.h>
#include <windows.gaming.input.forcefeedback.h>
#include <windows.system.h>
#include <windows.devices.power.h>

#ifdef __cplusplus
extern "C" {
#endif

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

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

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

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

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

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

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

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CGaming_CInput_CArcadeStickReading __x_ABI_CWindows_CGaming_CInput_CArcadeStickReading;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                typedef struct ArcadeStickReading ArcadeStickReading;
            }
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CGaming_CInput_CFlightStickReading __x_ABI_CWindows_CGaming_CInput_CFlightStickReading;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                typedef struct FlightStickReading FlightStickReading;
            }
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CGaming_CInput_CGamepadReading __x_ABI_CWindows_CGaming_CInput_CGamepadReading;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                typedef struct GamepadReading GamepadReading;
            }
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CGaming_CInput_CGamepadVibration __x_ABI_CWindows_CGaming_CInput_CGamepadVibration;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                typedef struct GamepadVibration GamepadVibration;
            }
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CGaming_CInput_CRacingWheelReading __x_ABI_CWindows_CGaming_CInput_CRacingWheelReading;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                typedef struct RacingWheelReading RacingWheelReading;
            }
        }
    }
}
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIArcadeStick_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIArcadeStick_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIArcadeStick __x_ABI_CWindows_CGaming_CInput_CIArcadeStick;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStick ABI::Windows::Gaming::Input::IArcadeStick
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IArcadeStick;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics ABI::Windows::Gaming::Input::IArcadeStickStatics
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IArcadeStickStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2 __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2 ABI::Windows::Gaming::Input::IArcadeStickStatics2
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IArcadeStickStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIFlightStick_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIFlightStick_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIFlightStick __x_ABI_CWindows_CGaming_CInput_CIFlightStick;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStick ABI::Windows::Gaming::Input::IFlightStick
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IFlightStick;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics ABI::Windows::Gaming::Input::IFlightStickStatics
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IFlightStickStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIGameController_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIGameController_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIGameController __x_ABI_CWindows_CGaming_CInput_CIGameController;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIGameController ABI::Windows::Gaming::Input::IGameController
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IGameController;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo ABI::Windows::Gaming::Input::IGameControllerBatteryInfo
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IGameControllerBatteryInfo;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIGamepad_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIGamepad_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIGamepad __x_ABI_CWindows_CGaming_CInput_CIGamepad;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIGamepad ABI::Windows::Gaming::Input::IGamepad
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IGamepad;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIGamepad2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIGamepad2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIGamepad2 __x_ABI_CWindows_CGaming_CInput_CIGamepad2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIGamepad2 ABI::Windows::Gaming::Input::IGamepad2
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IGamepad2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics ABI::Windows::Gaming::Input::IGamepadStatics
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IGamepadStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2 __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2 ABI::Windows::Gaming::Input::IGamepadStatics2
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IGamepadStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIRacingWheel_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIRacingWheel_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIRacingWheel __x_ABI_CWindows_CGaming_CInput_CIRacingWheel;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheel ABI::Windows::Gaming::Input::IRacingWheel
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IRacingWheel;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics ABI::Windows::Gaming::Input::IRacingWheelStatics
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IRacingWheelStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2 __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2 ABI::Windows::Gaming::Input::IRacingWheelStatics2
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IRacingWheelStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIRawGameController_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIRawGameController_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIRawGameController __x_ABI_CWindows_CGaming_CInput_CIRawGameController;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController ABI::Windows::Gaming::Input::IRawGameController
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IRawGameController;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CIRawGameController2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIRawGameController2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CIRawGameController2 __x_ABI_CWindows_CGaming_CInput_CIRawGameController2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController2 ABI::Windows::Gaming::Input::IRawGameController2
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                interface IRawGameController2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CGaming__CInput__CArcadeStick_FWD_DEFINED__
#define ____FIIterator_1_Windows__CGaming__CInput__CArcadeStick_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CGaming__CInput__CArcadeStick __FIIterator_1_Windows__CGaming__CInput__CArcadeStick;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CGaming__CInput__CArcadeStick ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Gaming::Input::ArcadeStick* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CGaming__CInput__CArcadeStick_FWD_DEFINED__
#define ____FIIterable_1_Windows__CGaming__CInput__CArcadeStick_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CGaming__CInput__CArcadeStick __FIIterable_1_Windows__CGaming__CInput__CArcadeStick;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CGaming__CInput__CArcadeStick ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Gaming::Input::ArcadeStick* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Gaming::Input::ArcadeStick* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CGaming__CInput__CFlightStick_FWD_DEFINED__
#define ____FIIterator_1_Windows__CGaming__CInput__CFlightStick_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CGaming__CInput__CFlightStick __FIIterator_1_Windows__CGaming__CInput__CFlightStick;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CGaming__CInput__CFlightStick ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Gaming::Input::FlightStick* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CGaming__CInput__CFlightStick_FWD_DEFINED__
#define ____FIIterable_1_Windows__CGaming__CInput__CFlightStick_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CGaming__CInput__CFlightStick __FIIterable_1_Windows__CGaming__CInput__CFlightStick;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CGaming__CInput__CFlightStick ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Gaming::Input::FlightStick* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CGaming__CInput__CFlightStick_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CGaming__CInput__CFlightStick_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CGaming__CInput__CFlightStick __FIVectorView_1_Windows__CGaming__CInput__CFlightStick;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CGaming__CInput__CFlightStick ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Gaming::Input::FlightStick* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CGaming__CInput__CGamepad_FWD_DEFINED__
#define ____FIIterator_1_Windows__CGaming__CInput__CGamepad_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CGaming__CInput__CGamepad __FIIterator_1_Windows__CGaming__CInput__CGamepad;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CGaming__CInput__CGamepad ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Gaming::Input::Gamepad* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CGaming__CInput__CGamepad_FWD_DEFINED__
#define ____FIIterable_1_Windows__CGaming__CInput__CGamepad_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CGaming__CInput__CGamepad __FIIterable_1_Windows__CGaming__CInput__CGamepad;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CGaming__CInput__CGamepad ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Gaming::Input::Gamepad* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CGaming__CInput__CGamepad_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CGaming__CInput__CGamepad_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CGaming__CInput__CGamepad __FIVectorView_1_Windows__CGaming__CInput__CGamepad;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CGaming__CInput__CGamepad ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Gaming::Input::Gamepad* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CGaming__CInput__CGamepad_FWD_DEFINED__
#define ____FIVector_1_Windows__CGaming__CInput__CGamepad_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CGaming__CInput__CGamepad __FIVector_1_Windows__CGaming__CInput__CGamepad;
#ifdef __cplusplus
#define __FIVector_1_Windows__CGaming__CInput__CGamepad ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Gaming::Input::Gamepad* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CGaming__CInput__CRacingWheel_FWD_DEFINED__
#define ____FIIterator_1_Windows__CGaming__CInput__CRacingWheel_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CGaming__CInput__CRacingWheel __FIIterator_1_Windows__CGaming__CInput__CRacingWheel;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CGaming__CInput__CRacingWheel ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Gaming::Input::RacingWheel* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CGaming__CInput__CRacingWheel_FWD_DEFINED__
#define ____FIIterable_1_Windows__CGaming__CInput__CRacingWheel_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CGaming__CInput__CRacingWheel __FIIterable_1_Windows__CGaming__CInput__CRacingWheel;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CGaming__CInput__CRacingWheel ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Gaming::Input::RacingWheel* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Gaming::Input::RacingWheel* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CGaming__CInput__CRacingWheel_FWD_DEFINED__
#define ____FIVector_1_Windows__CGaming__CInput__CRacingWheel_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CGaming__CInput__CRacingWheel __FIVector_1_Windows__CGaming__CInput__CRacingWheel;
#ifdef __cplusplus
#define __FIVector_1_Windows__CGaming__CInput__CRacingWheel ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Gaming::Input::RacingWheel* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CGaming__CInput__CRawGameController_FWD_DEFINED__
#define ____FIIterator_1_Windows__CGaming__CInput__CRawGameController_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CGaming__CInput__CRawGameController __FIIterator_1_Windows__CGaming__CInput__CRawGameController;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CGaming__CInput__CRawGameController ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Gaming::Input::RawGameController* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CGaming__CInput__CRawGameController_FWD_DEFINED__
#define ____FIIterable_1_Windows__CGaming__CInput__CRawGameController_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CGaming__CInput__CRawGameController __FIIterable_1_Windows__CGaming__CInput__CRawGameController;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CGaming__CInput__CRawGameController ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Gaming::Input::RawGameController* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CGaming__CInput__CRawGameController_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CGaming__CInput__CRawGameController_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CGaming__CInput__CRawGameController __FIVectorView_1_Windows__CGaming__CInput__CRawGameController;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CGaming__CInput__CRawGameController ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Gaming::Input::RawGameController* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CGaming__CInput__CRawGameController_FWD_DEFINED__
#define ____FIVector_1_Windows__CGaming__CInput__CRawGameController_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CGaming__CInput__CRawGameController __FIVector_1_Windows__CGaming__CInput__CRawGameController;
#ifdef __cplusplus
#define __FIVector_1_Windows__CGaming__CInput__CRawGameController ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Gaming::Input::RawGameController* >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                enum ArcadeStickButtons {
                    ArcadeStickButtons_None = 0x0,
                    ArcadeStickButtons_StickUp = 0x1,
                    ArcadeStickButtons_StickDown = 0x2,
                    ArcadeStickButtons_StickLeft = 0x4,
                    ArcadeStickButtons_StickRight = 0x8,
                    ArcadeStickButtons_Action1 = 0x10,
                    ArcadeStickButtons_Action2 = 0x20,
                    ArcadeStickButtons_Action3 = 0x40,
                    ArcadeStickButtons_Action4 = 0x80,
                    ArcadeStickButtons_Action5 = 0x100,
                    ArcadeStickButtons_Action6 = 0x200,
                    ArcadeStickButtons_Special1 = 0x400,
                    ArcadeStickButtons_Special2 = 0x800
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGaming_CInput_CArcadeStickButtons {
    ArcadeStickButtons_None = 0x0,
    ArcadeStickButtons_StickUp = 0x1,
    ArcadeStickButtons_StickDown = 0x2,
    ArcadeStickButtons_StickLeft = 0x4,
    ArcadeStickButtons_StickRight = 0x8,
    ArcadeStickButtons_Action1 = 0x10,
    ArcadeStickButtons_Action2 = 0x20,
    ArcadeStickButtons_Action3 = 0x40,
    ArcadeStickButtons_Action4 = 0x80,
    ArcadeStickButtons_Action5 = 0x100,
    ArcadeStickButtons_Action6 = 0x200,
    ArcadeStickButtons_Special1 = 0x400,
    ArcadeStickButtons_Special2 = 0x800
};
#ifdef WIDL_using_Windows_Gaming_Input
#define ArcadeStickButtons __x_ABI_CWindows_CGaming_CInput_CArcadeStickButtons
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                enum FlightStickButtons {
                    FlightStickButtons_None = 0x0,
                    FlightStickButtons_FirePrimary = 0x1,
                    FlightStickButtons_FireSecondary = 0x2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGaming_CInput_CFlightStickButtons {
    FlightStickButtons_None = 0x0,
    FlightStickButtons_FirePrimary = 0x1,
    FlightStickButtons_FireSecondary = 0x2
};
#ifdef WIDL_using_Windows_Gaming_Input
#define FlightStickButtons __x_ABI_CWindows_CGaming_CInput_CFlightStickButtons
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                enum GamepadButtons {
                    GamepadButtons_None = 0x0,
                    GamepadButtons_Menu = 0x1,
                    GamepadButtons_View = 0x2,
                    GamepadButtons_A = 0x4,
                    GamepadButtons_B = 0x8,
                    GamepadButtons_X = 0x10,
                    GamepadButtons_Y = 0x20,
                    GamepadButtons_DPadUp = 0x40,
                    GamepadButtons_DPadDown = 0x80,
                    GamepadButtons_DPadLeft = 0x100,
                    GamepadButtons_DPadRight = 0x200,
                    GamepadButtons_LeftShoulder = 0x400,
                    GamepadButtons_RightShoulder = 0x800,
                    GamepadButtons_LeftThumbstick = 0x1000,
                    GamepadButtons_RightThumbstick = 0x2000,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
                    GamepadButtons_Paddle1 = 0x4000,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
                    GamepadButtons_Paddle2 = 0x8000,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
                    GamepadButtons_Paddle3 = 0x10000,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
                    GamepadButtons_Paddle4 = 0x20000
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGaming_CInput_CGamepadButtons {
    GamepadButtons_None = 0x0,
    GamepadButtons_Menu = 0x1,
    GamepadButtons_View = 0x2,
    GamepadButtons_A = 0x4,
    GamepadButtons_B = 0x8,
    GamepadButtons_X = 0x10,
    GamepadButtons_Y = 0x20,
    GamepadButtons_DPadUp = 0x40,
    GamepadButtons_DPadDown = 0x80,
    GamepadButtons_DPadLeft = 0x100,
    GamepadButtons_DPadRight = 0x200,
    GamepadButtons_LeftShoulder = 0x400,
    GamepadButtons_RightShoulder = 0x800,
    GamepadButtons_LeftThumbstick = 0x1000,
    GamepadButtons_RightThumbstick = 0x2000,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
    GamepadButtons_Paddle1 = 0x4000,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
    GamepadButtons_Paddle2 = 0x8000,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
    GamepadButtons_Paddle3 = 0x10000,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
    GamepadButtons_Paddle4 = 0x20000
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
};
#ifdef WIDL_using_Windows_Gaming_Input
#define GamepadButtons __x_ABI_CWindows_CGaming_CInput_CGamepadButtons
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                enum GameControllerButtonLabel {
                    GameControllerButtonLabel_None = 0,
                    GameControllerButtonLabel_XboxBack = 1,
                    GameControllerButtonLabel_XboxStart = 2,
                    GameControllerButtonLabel_XboxMenu = 3,
                    GameControllerButtonLabel_XboxView = 4,
                    GameControllerButtonLabel_XboxUp = 5,
                    GameControllerButtonLabel_XboxDown = 6,
                    GameControllerButtonLabel_XboxLeft = 7,
                    GameControllerButtonLabel_XboxRight = 8,
                    GameControllerButtonLabel_XboxA = 9,
                    GameControllerButtonLabel_XboxB = 10,
                    GameControllerButtonLabel_XboxX = 11,
                    GameControllerButtonLabel_XboxY = 12,
                    GameControllerButtonLabel_XboxLeftBumper = 13,
                    GameControllerButtonLabel_XboxLeftTrigger = 14,
                    GameControllerButtonLabel_XboxLeftStickButton = 15,
                    GameControllerButtonLabel_XboxRightBumper = 16,
                    GameControllerButtonLabel_XboxRightTrigger = 17,
                    GameControllerButtonLabel_XboxRightStickButton = 18,
                    GameControllerButtonLabel_XboxPaddle1 = 19,
                    GameControllerButtonLabel_XboxPaddle2 = 20,
                    GameControllerButtonLabel_XboxPaddle3 = 21,
                    GameControllerButtonLabel_XboxPaddle4 = 22,
                    GameControllerButtonLabel_Mode = 23,
                    GameControllerButtonLabel_Select = 24,
                    GameControllerButtonLabel_Menu = 25,
                    GameControllerButtonLabel_View = 26,
                    GameControllerButtonLabel_Back = 27,
                    GameControllerButtonLabel_Start = 28,
                    GameControllerButtonLabel_Options = 29,
                    GameControllerButtonLabel_Share = 30,
                    GameControllerButtonLabel_Up = 31,
                    GameControllerButtonLabel_Down = 32,
                    GameControllerButtonLabel_Left = 33,
                    GameControllerButtonLabel_Right = 34,
                    GameControllerButtonLabel_LetterA = 35,
                    GameControllerButtonLabel_LetterB = 36,
                    GameControllerButtonLabel_LetterC = 37,
                    GameControllerButtonLabel_LetterL = 38,
                    GameControllerButtonLabel_LetterR = 39,
                    GameControllerButtonLabel_LetterX = 40,
                    GameControllerButtonLabel_LetterY = 41,
                    GameControllerButtonLabel_LetterZ = 42,
                    GameControllerButtonLabel_Cross = 43,
                    GameControllerButtonLabel_Circle = 44,
                    GameControllerButtonLabel_Square = 45,
                    GameControllerButtonLabel_Triangle = 46,
                    GameControllerButtonLabel_LeftBumper = 47,
                    GameControllerButtonLabel_LeftTrigger = 48,
                    GameControllerButtonLabel_LeftStickButton = 49,
                    GameControllerButtonLabel_Left1 = 50,
                    GameControllerButtonLabel_Left2 = 51,
                    GameControllerButtonLabel_Left3 = 52,
                    GameControllerButtonLabel_RightBumper = 53,
                    GameControllerButtonLabel_RightTrigger = 54,
                    GameControllerButtonLabel_RightStickButton = 55,
                    GameControllerButtonLabel_Right1 = 56,
                    GameControllerButtonLabel_Right2 = 57,
                    GameControllerButtonLabel_Right3 = 58,
                    GameControllerButtonLabel_Paddle1 = 59,
                    GameControllerButtonLabel_Paddle2 = 60,
                    GameControllerButtonLabel_Paddle3 = 61,
                    GameControllerButtonLabel_Paddle4 = 62,
                    GameControllerButtonLabel_Plus = 63,
                    GameControllerButtonLabel_Minus = 64,
                    GameControllerButtonLabel_DownLeftArrow = 65,
                    GameControllerButtonLabel_DialLeft = 66,
                    GameControllerButtonLabel_DialRight = 67,
                    GameControllerButtonLabel_Suspension = 68
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGaming_CInput_CGameControllerButtonLabel {
    GameControllerButtonLabel_None = 0,
    GameControllerButtonLabel_XboxBack = 1,
    GameControllerButtonLabel_XboxStart = 2,
    GameControllerButtonLabel_XboxMenu = 3,
    GameControllerButtonLabel_XboxView = 4,
    GameControllerButtonLabel_XboxUp = 5,
    GameControllerButtonLabel_XboxDown = 6,
    GameControllerButtonLabel_XboxLeft = 7,
    GameControllerButtonLabel_XboxRight = 8,
    GameControllerButtonLabel_XboxA = 9,
    GameControllerButtonLabel_XboxB = 10,
    GameControllerButtonLabel_XboxX = 11,
    GameControllerButtonLabel_XboxY = 12,
    GameControllerButtonLabel_XboxLeftBumper = 13,
    GameControllerButtonLabel_XboxLeftTrigger = 14,
    GameControllerButtonLabel_XboxLeftStickButton = 15,
    GameControllerButtonLabel_XboxRightBumper = 16,
    GameControllerButtonLabel_XboxRightTrigger = 17,
    GameControllerButtonLabel_XboxRightStickButton = 18,
    GameControllerButtonLabel_XboxPaddle1 = 19,
    GameControllerButtonLabel_XboxPaddle2 = 20,
    GameControllerButtonLabel_XboxPaddle3 = 21,
    GameControllerButtonLabel_XboxPaddle4 = 22,
    GameControllerButtonLabel_Mode = 23,
    GameControllerButtonLabel_Select = 24,
    GameControllerButtonLabel_Menu = 25,
    GameControllerButtonLabel_View = 26,
    GameControllerButtonLabel_Back = 27,
    GameControllerButtonLabel_Start = 28,
    GameControllerButtonLabel_Options = 29,
    GameControllerButtonLabel_Share = 30,
    GameControllerButtonLabel_Up = 31,
    GameControllerButtonLabel_Down = 32,
    GameControllerButtonLabel_Left = 33,
    GameControllerButtonLabel_Right = 34,
    GameControllerButtonLabel_LetterA = 35,
    GameControllerButtonLabel_LetterB = 36,
    GameControllerButtonLabel_LetterC = 37,
    GameControllerButtonLabel_LetterL = 38,
    GameControllerButtonLabel_LetterR = 39,
    GameControllerButtonLabel_LetterX = 40,
    GameControllerButtonLabel_LetterY = 41,
    GameControllerButtonLabel_LetterZ = 42,
    GameControllerButtonLabel_Cross = 43,
    GameControllerButtonLabel_Circle = 44,
    GameControllerButtonLabel_Square = 45,
    GameControllerButtonLabel_Triangle = 46,
    GameControllerButtonLabel_LeftBumper = 47,
    GameControllerButtonLabel_LeftTrigger = 48,
    GameControllerButtonLabel_LeftStickButton = 49,
    GameControllerButtonLabel_Left1 = 50,
    GameControllerButtonLabel_Left2 = 51,
    GameControllerButtonLabel_Left3 = 52,
    GameControllerButtonLabel_RightBumper = 53,
    GameControllerButtonLabel_RightTrigger = 54,
    GameControllerButtonLabel_RightStickButton = 55,
    GameControllerButtonLabel_Right1 = 56,
    GameControllerButtonLabel_Right2 = 57,
    GameControllerButtonLabel_Right3 = 58,
    GameControllerButtonLabel_Paddle1 = 59,
    GameControllerButtonLabel_Paddle2 = 60,
    GameControllerButtonLabel_Paddle3 = 61,
    GameControllerButtonLabel_Paddle4 = 62,
    GameControllerButtonLabel_Plus = 63,
    GameControllerButtonLabel_Minus = 64,
    GameControllerButtonLabel_DownLeftArrow = 65,
    GameControllerButtonLabel_DialLeft = 66,
    GameControllerButtonLabel_DialRight = 67,
    GameControllerButtonLabel_Suspension = 68
};
#ifdef WIDL_using_Windows_Gaming_Input
#define GameControllerButtonLabel __x_ABI_CWindows_CGaming_CInput_CGameControllerButtonLabel
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                enum GameControllerSwitchKind {
                    GameControllerSwitchKind_TwoWay = 0,
                    GameControllerSwitchKind_FourWay = 1,
                    GameControllerSwitchKind_EightWay = 2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGaming_CInput_CGameControllerSwitchKind {
    GameControllerSwitchKind_TwoWay = 0,
    GameControllerSwitchKind_FourWay = 1,
    GameControllerSwitchKind_EightWay = 2
};
#ifdef WIDL_using_Windows_Gaming_Input
#define GameControllerSwitchKind __x_ABI_CWindows_CGaming_CInput_CGameControllerSwitchKind
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                enum GameControllerSwitchPosition {
                    GameControllerSwitchPosition_Center = 0,
                    GameControllerSwitchPosition_Up = 1,
                    GameControllerSwitchPosition_UpRight = 2,
                    GameControllerSwitchPosition_Right = 3,
                    GameControllerSwitchPosition_DownRight = 4,
                    GameControllerSwitchPosition_Down = 5,
                    GameControllerSwitchPosition_DownLeft = 6,
                    GameControllerSwitchPosition_Left = 7,
                    GameControllerSwitchPosition_UpLeft = 8
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGaming_CInput_CGameControllerSwitchPosition {
    GameControllerSwitchPosition_Center = 0,
    GameControllerSwitchPosition_Up = 1,
    GameControllerSwitchPosition_UpRight = 2,
    GameControllerSwitchPosition_Right = 3,
    GameControllerSwitchPosition_DownRight = 4,
    GameControllerSwitchPosition_Down = 5,
    GameControllerSwitchPosition_DownLeft = 6,
    GameControllerSwitchPosition_Left = 7,
    GameControllerSwitchPosition_UpLeft = 8
};
#ifdef WIDL_using_Windows_Gaming_Input
#define GameControllerSwitchPosition __x_ABI_CWindows_CGaming_CInput_CGameControllerSwitchPosition
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                enum RacingWheelButtons {
                    RacingWheelButtons_None = 0x0,
                    RacingWheelButtons_PreviousGear = 0x1,
                    RacingWheelButtons_NextGear = 0x2,
                    RacingWheelButtons_DPadUp = 0x4,
                    RacingWheelButtons_DPadDown = 0x8,
                    RacingWheelButtons_DPadLeft = 0x10,
                    RacingWheelButtons_DPadRight = 0x20,
                    RacingWheelButtons_Button1 = 0x40,
                    RacingWheelButtons_Button2 = 0x80,
                    RacingWheelButtons_Button3 = 0x100,
                    RacingWheelButtons_Button4 = 0x200,
                    RacingWheelButtons_Button5 = 0x400,
                    RacingWheelButtons_Button6 = 0x800,
                    RacingWheelButtons_Button7 = 0x1000,
                    RacingWheelButtons_Button8 = 0x2000,
                    RacingWheelButtons_Button9 = 0x4000,
                    RacingWheelButtons_Button10 = 0x8000,
                    RacingWheelButtons_Button11 = 0x10000,
                    RacingWheelButtons_Button12 = 0x20000,
                    RacingWheelButtons_Button13 = 0x40000,
                    RacingWheelButtons_Button14 = 0x80000,
                    RacingWheelButtons_Button15 = 0x100000,
                    RacingWheelButtons_Button16 = 0x200000
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGaming_CInput_CRacingWheelButtons {
    RacingWheelButtons_None = 0x0,
    RacingWheelButtons_PreviousGear = 0x1,
    RacingWheelButtons_NextGear = 0x2,
    RacingWheelButtons_DPadUp = 0x4,
    RacingWheelButtons_DPadDown = 0x8,
    RacingWheelButtons_DPadLeft = 0x10,
    RacingWheelButtons_DPadRight = 0x20,
    RacingWheelButtons_Button1 = 0x40,
    RacingWheelButtons_Button2 = 0x80,
    RacingWheelButtons_Button3 = 0x100,
    RacingWheelButtons_Button4 = 0x200,
    RacingWheelButtons_Button5 = 0x400,
    RacingWheelButtons_Button6 = 0x800,
    RacingWheelButtons_Button7 = 0x1000,
    RacingWheelButtons_Button8 = 0x2000,
    RacingWheelButtons_Button9 = 0x4000,
    RacingWheelButtons_Button10 = 0x8000,
    RacingWheelButtons_Button11 = 0x10000,
    RacingWheelButtons_Button12 = 0x20000,
    RacingWheelButtons_Button13 = 0x40000,
    RacingWheelButtons_Button14 = 0x80000,
    RacingWheelButtons_Button15 = 0x100000,
    RacingWheelButtons_Button16 = 0x200000
};
#ifdef WIDL_using_Windows_Gaming_Input
#define RacingWheelButtons __x_ABI_CWindows_CGaming_CInput_CRacingWheelButtons
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                struct ArcadeStickReading {
                    UINT64 Timestamp;
                    ABI::Windows::Gaming::Input::ArcadeStickButtons Buttons;
                };
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CGaming_CInput_CArcadeStickReading {
    UINT64 Timestamp;
    __x_ABI_CWindows_CGaming_CInput_CArcadeStickButtons Buttons;
};
#ifdef WIDL_using_Windows_Gaming_Input
#define ArcadeStickReading __x_ABI_CWindows_CGaming_CInput_CArcadeStickReading
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                struct FlightStickReading {
                    UINT64 Timestamp;
                    ABI::Windows::Gaming::Input::FlightStickButtons Buttons;
                    ABI::Windows::Gaming::Input::GameControllerSwitchPosition HatSwitch;
                    DOUBLE Roll;
                    DOUBLE Pitch;
                    DOUBLE Yaw;
                    DOUBLE Throttle;
                };
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CGaming_CInput_CFlightStickReading {
    UINT64 Timestamp;
    __x_ABI_CWindows_CGaming_CInput_CFlightStickButtons Buttons;
    __x_ABI_CWindows_CGaming_CInput_CGameControllerSwitchPosition HatSwitch;
    DOUBLE Roll;
    DOUBLE Pitch;
    DOUBLE Yaw;
    DOUBLE Throttle;
};
#ifdef WIDL_using_Windows_Gaming_Input
#define FlightStickReading __x_ABI_CWindows_CGaming_CInput_CFlightStickReading
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                struct GamepadReading {
                    UINT64 Timestamp;
                    ABI::Windows::Gaming::Input::GamepadButtons Buttons;
                    DOUBLE LeftTrigger;
                    DOUBLE RightTrigger;
                    DOUBLE LeftThumbstickX;
                    DOUBLE LeftThumbstickY;
                    DOUBLE RightThumbstickX;
                    DOUBLE RightThumbstickY;
                };
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CGaming_CInput_CGamepadReading {
    UINT64 Timestamp;
    __x_ABI_CWindows_CGaming_CInput_CGamepadButtons Buttons;
    DOUBLE LeftTrigger;
    DOUBLE RightTrigger;
    DOUBLE LeftThumbstickX;
    DOUBLE LeftThumbstickY;
    DOUBLE RightThumbstickX;
    DOUBLE RightThumbstickY;
};
#ifdef WIDL_using_Windows_Gaming_Input
#define GamepadReading __x_ABI_CWindows_CGaming_CInput_CGamepadReading
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                struct GamepadVibration {
                    DOUBLE LeftMotor;
                    DOUBLE RightMotor;
                    DOUBLE LeftTrigger;
                    DOUBLE RightTrigger;
                };
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CGaming_CInput_CGamepadVibration {
    DOUBLE LeftMotor;
    DOUBLE RightMotor;
    DOUBLE LeftTrigger;
    DOUBLE RightTrigger;
};
#ifdef WIDL_using_Windows_Gaming_Input
#define GamepadVibration __x_ABI_CWindows_CGaming_CInput_CGamepadVibration
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                struct RacingWheelReading {
                    UINT64 Timestamp;
                    ABI::Windows::Gaming::Input::RacingWheelButtons Buttons;
                    INT32 PatternShifterGear;
                    DOUBLE Wheel;
                    DOUBLE Throttle;
                    DOUBLE Brake;
                    DOUBLE Clutch;
                    DOUBLE Handbrake;
                };
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CGaming_CInput_CRacingWheelReading {
    UINT64 Timestamp;
    __x_ABI_CWindows_CGaming_CInput_CRacingWheelButtons Buttons;
    INT32 PatternShifterGear;
    DOUBLE Wheel;
    DOUBLE Throttle;
    DOUBLE Brake;
    DOUBLE Clutch;
    DOUBLE Handbrake;
};
#ifdef WIDL_using_Windows_Gaming_Input
#define RacingWheelReading __x_ABI_CWindows_CGaming_CInput_CRacingWheelReading
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
/*****************************************************************************
 * IArcadeStick interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CIArcadeStick_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIArcadeStick_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CIArcadeStick, 0xb14a539d, 0xbefb, 0x4c81, 0x80,0x51, 0x15,0xec,0xf3,0xb1,0x30,0x36);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                MIDL_INTERFACE("b14a539d-befb-4c81-8051-15ecf3b13036")
                IArcadeStick : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetButtonLabel(
                        ABI::Windows::Gaming::Input::ArcadeStickButtons button,
                        ABI::Windows::Gaming::Input::GameControllerButtonLabel *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetCurrentReading(
                        ABI::Windows::Gaming::Input::ArcadeStickReading *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CIArcadeStick, 0xb14a539d, 0xbefb, 0x4c81, 0x80,0x51, 0x15,0xec,0xf3,0xb1,0x30,0x36)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CIArcadeStickVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IArcadeStick methods ***/
    HRESULT (STDMETHODCALLTYPE *GetButtonLabel)(
        __x_ABI_CWindows_CGaming_CInput_CIArcadeStick *This,
        __x_ABI_CWindows_CGaming_CInput_CArcadeStickButtons button,
        __x_ABI_CWindows_CGaming_CInput_CGameControllerButtonLabel *value);

    HRESULT (STDMETHODCALLTYPE *GetCurrentReading)(
        __x_ABI_CWindows_CGaming_CInput_CIArcadeStick *This,
        __x_ABI_CWindows_CGaming_CInput_CArcadeStickReading *value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CIArcadeStickVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CIArcadeStick {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CIArcadeStickVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IArcadeStick methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_GetButtonLabel(This,button,value) (This)->lpVtbl->GetButtonLabel(This,button,value)
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_GetCurrentReading(This,value) (This)->lpVtbl->GetCurrentReading(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CIArcadeStick* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_AddRef(__x_ABI_CWindows_CGaming_CInput_CIArcadeStick* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_Release(__x_ABI_CWindows_CGaming_CInput_CIArcadeStick* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_GetIids(__x_ABI_CWindows_CGaming_CInput_CIArcadeStick* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CIArcadeStick* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CIArcadeStick* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IArcadeStick methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_GetButtonLabel(__x_ABI_CWindows_CGaming_CInput_CIArcadeStick* This,__x_ABI_CWindows_CGaming_CInput_CArcadeStickButtons button,__x_ABI_CWindows_CGaming_CInput_CGameControllerButtonLabel *value) {
    return This->lpVtbl->GetButtonLabel(This,button,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_GetCurrentReading(__x_ABI_CWindows_CGaming_CInput_CIArcadeStick* This,__x_ABI_CWindows_CGaming_CInput_CArcadeStickReading *value) {
    return This->lpVtbl->GetCurrentReading(This,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input
#define IID_IArcadeStick IID___x_ABI_CWindows_CGaming_CInput_CIArcadeStick
#define IArcadeStickVtbl __x_ABI_CWindows_CGaming_CInput_CIArcadeStickVtbl
#define IArcadeStick __x_ABI_CWindows_CGaming_CInput_CIArcadeStick
#define IArcadeStick_QueryInterface __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_QueryInterface
#define IArcadeStick_AddRef __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_AddRef
#define IArcadeStick_Release __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_Release
#define IArcadeStick_GetIids __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_GetIids
#define IArcadeStick_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_GetRuntimeClassName
#define IArcadeStick_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_GetTrustLevel
#define IArcadeStick_GetButtonLabel __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_GetButtonLabel
#define IArcadeStick_GetCurrentReading __x_ABI_CWindows_CGaming_CInput_CIArcadeStick_GetCurrentReading
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif

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

/*****************************************************************************
 * IArcadeStickStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics, 0x5c37b8c8, 0x37b1, 0x4ad8, 0x94,0x58, 0x20,0x0f,0x1a,0x30,0x01,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                MIDL_INTERFACE("5c37b8c8-37b1-4ad8-9458-200f1a30018e")
                IArcadeStickStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE add_ArcadeStickAdded(
                        ABI::Windows::Foundation::IEventHandler<ABI::Windows::Gaming::Input::ArcadeStick* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_ArcadeStickAdded(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_ArcadeStickRemoved(
                        ABI::Windows::Foundation::IEventHandler<ABI::Windows::Gaming::Input::ArcadeStick* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_ArcadeStickRemoved(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ArcadeSticks(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Gaming::Input::ArcadeStick* > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics, 0x5c37b8c8, 0x37b1, 0x4ad8, 0x94,0x58, 0x20,0x0f,0x1a,0x30,0x01,0x8e)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IArcadeStickStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *add_ArcadeStickAdded)(
        __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics *This,
        __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_ArcadeStickAdded)(
        __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_ArcadeStickRemoved)(
        __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics *This,
        __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_ArcadeStickRemoved)(
        __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *get_ArcadeSticks)(
        __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics *This,
        __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick **value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStaticsVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IArcadeStickStatics methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_add_ArcadeStickAdded(This,value,token) (This)->lpVtbl->add_ArcadeStickAdded(This,value,token)
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_remove_ArcadeStickAdded(This,token) (This)->lpVtbl->remove_ArcadeStickAdded(This,token)
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_add_ArcadeStickRemoved(This,value,token) (This)->lpVtbl->add_ArcadeStickRemoved(This,value,token)
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_remove_ArcadeStickRemoved(This,token) (This)->lpVtbl->remove_ArcadeStickRemoved(This,token)
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_get_ArcadeSticks(This,value) (This)->lpVtbl->get_ArcadeSticks(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_AddRef(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_Release(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_GetIids(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IArcadeStickStatics methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_add_ArcadeStickAdded(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics* This,__FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_ArcadeStickAdded(This,value,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_remove_ArcadeStickAdded(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_ArcadeStickAdded(This,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_add_ArcadeStickRemoved(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics* This,__FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_ArcadeStickRemoved(This,value,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_remove_ArcadeStickRemoved(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_ArcadeStickRemoved(This,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_get_ArcadeSticks(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics* This,__FIVectorView_1_Windows__CGaming__CInput__CArcadeStick **value) {
    return This->lpVtbl->get_ArcadeSticks(This,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input
#define IID_IArcadeStickStatics IID___x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics
#define IArcadeStickStaticsVtbl __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStaticsVtbl
#define IArcadeStickStatics __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics
#define IArcadeStickStatics_QueryInterface __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_QueryInterface
#define IArcadeStickStatics_AddRef __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_AddRef
#define IArcadeStickStatics_Release __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_Release
#define IArcadeStickStatics_GetIids __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_GetIids
#define IArcadeStickStatics_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_GetRuntimeClassName
#define IArcadeStickStatics_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_GetTrustLevel
#define IArcadeStickStatics_add_ArcadeStickAdded __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_add_ArcadeStickAdded
#define IArcadeStickStatics_remove_ArcadeStickAdded __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_remove_ArcadeStickAdded
#define IArcadeStickStatics_add_ArcadeStickRemoved __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_add_ArcadeStickRemoved
#define IArcadeStickStatics_remove_ArcadeStickRemoved __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_remove_ArcadeStickRemoved
#define IArcadeStickStatics_get_ArcadeSticks __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics_get_ArcadeSticks
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif

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

/*****************************************************************************
 * IArcadeStickStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2, 0x52b5d744, 0xbb86, 0x445a, 0xb5,0x9c, 0x59,0x6f,0x0e,0x2a,0x49,0xdf);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                MIDL_INTERFACE("52b5d744-bb86-445a-b59c-596f0e2a49df")
                IArcadeStickStatics2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE FromGameController(
                        ABI::Windows::Gaming::Input::IGameController *controller,
                        ABI::Windows::Gaming::Input::IArcadeStick **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2, 0x52b5d744, 0xbb86, 0x445a, 0xb5,0x9c, 0x59,0x6f,0x0e,0x2a,0x49,0xdf)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IArcadeStickStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *FromGameController)(
        __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2 *This,
        __x_ABI_CWindows_CGaming_CInput_CIGameController *controller,
        __x_ABI_CWindows_CGaming_CInput_CIArcadeStick **value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2Vtbl;

interface __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2 {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IArcadeStickStatics2 methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_FromGameController(This,controller,value) (This)->lpVtbl->FromGameController(This,controller,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_AddRef(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_Release(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_GetIids(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IArcadeStickStatics2 methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_FromGameController(__x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2* This,__x_ABI_CWindows_CGaming_CInput_CIGameController *controller,__x_ABI_CWindows_CGaming_CInput_CIArcadeStick **value) {
    return This->lpVtbl->FromGameController(This,controller,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input
#define IID_IArcadeStickStatics2 IID___x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2
#define IArcadeStickStatics2Vtbl __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2Vtbl
#define IArcadeStickStatics2 __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2
#define IArcadeStickStatics2_QueryInterface __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_QueryInterface
#define IArcadeStickStatics2_AddRef __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_AddRef
#define IArcadeStickStatics2_Release __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_Release
#define IArcadeStickStatics2_GetIids __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_GetIids
#define IArcadeStickStatics2_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_GetRuntimeClassName
#define IArcadeStickStatics2_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_GetTrustLevel
#define IArcadeStickStatics2_FromGameController __x_ABI_CWindows_CGaming_CInput_CIArcadeStickStatics2_FromGameController
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif

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

/*****************************************************************************
 * IFlightStick interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CIFlightStick_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIFlightStick_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CIFlightStick, 0xb4a2c01c, 0xb83b, 0x4459, 0xa1,0xa9, 0x97,0xb0,0x3c,0x33,0xda,0x7c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                MIDL_INTERFACE("b4a2c01c-b83b-4459-a1a9-97b03c33da7c")
                IFlightStick : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_HatSwitchKind(
                        ABI::Windows::Gaming::Input::GameControllerSwitchKind *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetButtonLabel(
                        ABI::Windows::Gaming::Input::FlightStickButtons button,
                        ABI::Windows::Gaming::Input::GameControllerButtonLabel *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetCurrentReading(
                        ABI::Windows::Gaming::Input::FlightStickReading *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CIFlightStick, 0xb4a2c01c, 0xb83b, 0x4459, 0xa1,0xa9, 0x97,0xb0,0x3c,0x33,0xda,0x7c)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CIFlightStickVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IFlightStick methods ***/
    HRESULT (STDMETHODCALLTYPE *get_HatSwitchKind)(
        __x_ABI_CWindows_CGaming_CInput_CIFlightStick *This,
        __x_ABI_CWindows_CGaming_CInput_CGameControllerSwitchKind *value);

    HRESULT (STDMETHODCALLTYPE *GetButtonLabel)(
        __x_ABI_CWindows_CGaming_CInput_CIFlightStick *This,
        __x_ABI_CWindows_CGaming_CInput_CFlightStickButtons button,
        __x_ABI_CWindows_CGaming_CInput_CGameControllerButtonLabel *value);

    HRESULT (STDMETHODCALLTYPE *GetCurrentReading)(
        __x_ABI_CWindows_CGaming_CInput_CIFlightStick *This,
        __x_ABI_CWindows_CGaming_CInput_CFlightStickReading *value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CIFlightStickVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CIFlightStick {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CIFlightStickVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStick_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStick_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStick_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStick_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStick_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStick_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IFlightStick methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStick_get_HatSwitchKind(This,value) (This)->lpVtbl->get_HatSwitchKind(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStick_GetButtonLabel(This,button,value) (This)->lpVtbl->GetButtonLabel(This,button,value)
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStick_GetCurrentReading(This,value) (This)->lpVtbl->GetCurrentReading(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIFlightStick_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CIFlightStick* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIFlightStick_AddRef(__x_ABI_CWindows_CGaming_CInput_CIFlightStick* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIFlightStick_Release(__x_ABI_CWindows_CGaming_CInput_CIFlightStick* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIFlightStick_GetIids(__x_ABI_CWindows_CGaming_CInput_CIFlightStick* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIFlightStick_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CIFlightStick* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIFlightStick_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CIFlightStick* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IFlightStick methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIFlightStick_get_HatSwitchKind(__x_ABI_CWindows_CGaming_CInput_CIFlightStick* This,__x_ABI_CWindows_CGaming_CInput_CGameControllerSwitchKind *value) {
    return This->lpVtbl->get_HatSwitchKind(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIFlightStick_GetButtonLabel(__x_ABI_CWindows_CGaming_CInput_CIFlightStick* This,__x_ABI_CWindows_CGaming_CInput_CFlightStickButtons button,__x_ABI_CWindows_CGaming_CInput_CGameControllerButtonLabel *value) {
    return This->lpVtbl->GetButtonLabel(This,button,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIFlightStick_GetCurrentReading(__x_ABI_CWindows_CGaming_CInput_CIFlightStick* This,__x_ABI_CWindows_CGaming_CInput_CFlightStickReading *value) {
    return This->lpVtbl->GetCurrentReading(This,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input
#define IID_IFlightStick IID___x_ABI_CWindows_CGaming_CInput_CIFlightStick
#define IFlightStickVtbl __x_ABI_CWindows_CGaming_CInput_CIFlightStickVtbl
#define IFlightStick __x_ABI_CWindows_CGaming_CInput_CIFlightStick
#define IFlightStick_QueryInterface __x_ABI_CWindows_CGaming_CInput_CIFlightStick_QueryInterface
#define IFlightStick_AddRef __x_ABI_CWindows_CGaming_CInput_CIFlightStick_AddRef
#define IFlightStick_Release __x_ABI_CWindows_CGaming_CInput_CIFlightStick_Release
#define IFlightStick_GetIids __x_ABI_CWindows_CGaming_CInput_CIFlightStick_GetIids
#define IFlightStick_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CIFlightStick_GetRuntimeClassName
#define IFlightStick_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CIFlightStick_GetTrustLevel
#define IFlightStick_get_HatSwitchKind __x_ABI_CWindows_CGaming_CInput_CIFlightStick_get_HatSwitchKind
#define IFlightStick_GetButtonLabel __x_ABI_CWindows_CGaming_CInput_CIFlightStick_GetButtonLabel
#define IFlightStick_GetCurrentReading __x_ABI_CWindows_CGaming_CInput_CIFlightStick_GetCurrentReading
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif

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

/*****************************************************************************
 * IFlightStickStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics, 0x5514924a, 0xfecc, 0x435e, 0x83,0xdc, 0x5c,0xec,0x8a,0x18,0xa5,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                MIDL_INTERFACE("5514924a-fecc-435e-83dc-5cec8a18a520")
                IFlightStickStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE add_FlightStickAdded(
                        ABI::Windows::Foundation::IEventHandler<ABI::Windows::Gaming::Input::FlightStick* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_FlightStickAdded(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_FlightStickRemoved(
                        ABI::Windows::Foundation::IEventHandler<ABI::Windows::Gaming::Input::FlightStick* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_FlightStickRemoved(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_FlightSticks(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Gaming::Input::FlightStick* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FromGameController(
                        ABI::Windows::Gaming::Input::IGameController *controller,
                        ABI::Windows::Gaming::Input::IFlightStick **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics, 0x5514924a, 0xfecc, 0x435e, 0x83,0xdc, 0x5c,0xec,0x8a,0x18,0xa5,0x20)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CIFlightStickStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IFlightStickStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *add_FlightStickAdded)(
        __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics *This,
        __FIEventHandler_1_Windows__CGaming__CInput__CFlightStick *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_FlightStickAdded)(
        __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_FlightStickRemoved)(
        __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics *This,
        __FIEventHandler_1_Windows__CGaming__CInput__CFlightStick *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_FlightStickRemoved)(
        __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *get_FlightSticks)(
        __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics *This,
        __FIVectorView_1_Windows__CGaming__CInput__CFlightStick **value);

    HRESULT (STDMETHODCALLTYPE *FromGameController)(
        __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics *This,
        __x_ABI_CWindows_CGaming_CInput_CIGameController *controller,
        __x_ABI_CWindows_CGaming_CInput_CIFlightStick **value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CIFlightStickStaticsVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CIFlightStickStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IFlightStickStatics methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_add_FlightStickAdded(This,value,token) (This)->lpVtbl->add_FlightStickAdded(This,value,token)
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_remove_FlightStickAdded(This,token) (This)->lpVtbl->remove_FlightStickAdded(This,token)
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_add_FlightStickRemoved(This,value,token) (This)->lpVtbl->add_FlightStickRemoved(This,value,token)
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_remove_FlightStickRemoved(This,token) (This)->lpVtbl->remove_FlightStickRemoved(This,token)
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_get_FlightSticks(This,value) (This)->lpVtbl->get_FlightSticks(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_FromGameController(This,controller,value) (This)->lpVtbl->FromGameController(This,controller,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_AddRef(__x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_Release(__x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_GetIids(__x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IFlightStickStatics methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_add_FlightStickAdded(__x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics* This,__FIEventHandler_1_Windows__CGaming__CInput__CFlightStick *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_FlightStickAdded(This,value,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_remove_FlightStickAdded(__x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_FlightStickAdded(This,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_add_FlightStickRemoved(__x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics* This,__FIEventHandler_1_Windows__CGaming__CInput__CFlightStick *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_FlightStickRemoved(This,value,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_remove_FlightStickRemoved(__x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_FlightStickRemoved(This,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_get_FlightSticks(__x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics* This,__FIVectorView_1_Windows__CGaming__CInput__CFlightStick **value) {
    return This->lpVtbl->get_FlightSticks(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_FromGameController(__x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics* This,__x_ABI_CWindows_CGaming_CInput_CIGameController *controller,__x_ABI_CWindows_CGaming_CInput_CIFlightStick **value) {
    return This->lpVtbl->FromGameController(This,controller,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input
#define IID_IFlightStickStatics IID___x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics
#define IFlightStickStaticsVtbl __x_ABI_CWindows_CGaming_CInput_CIFlightStickStaticsVtbl
#define IFlightStickStatics __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics
#define IFlightStickStatics_QueryInterface __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_QueryInterface
#define IFlightStickStatics_AddRef __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_AddRef
#define IFlightStickStatics_Release __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_Release
#define IFlightStickStatics_GetIids __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_GetIids
#define IFlightStickStatics_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_GetRuntimeClassName
#define IFlightStickStatics_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_GetTrustLevel
#define IFlightStickStatics_add_FlightStickAdded __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_add_FlightStickAdded
#define IFlightStickStatics_remove_FlightStickAdded __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_remove_FlightStickAdded
#define IFlightStickStatics_add_FlightStickRemoved __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_add_FlightStickRemoved
#define IFlightStickStatics_remove_FlightStickRemoved __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_remove_FlightStickRemoved
#define IFlightStickStatics_get_FlightSticks __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_get_FlightSticks
#define IFlightStickStatics_FromGameController __x_ABI_CWindows_CGaming_CInput_CIFlightStickStatics_FromGameController
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif

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

/*****************************************************************************
 * IGameController interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CIGameController_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIGameController_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CIGameController, 0x1baf6522, 0x5f64, 0x42c5, 0x82,0x67, 0xb9,0xfe,0x22,0x15,0xbf,0xbd);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                MIDL_INTERFACE("1baf6522-5f64-42c5-8267-b9fe2215bfbd")
                IGameController : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE add_HeadsetConnected(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Gaming::Input::IGameController*,ABI::Windows::Gaming::Input::Headset* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_HeadsetConnected(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_HeadsetDisconnected(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Gaming::Input::IGameController*,ABI::Windows::Gaming::Input::Headset* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_HeadsetDisconnected(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_UserChanged(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Gaming::Input::IGameController*,ABI::Windows::System::UserChangedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_UserChanged(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Headset(
                        ABI::Windows::Gaming::Input::IHeadset **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_IsWireless(
                        boolean *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_CGaming_CInput_CIGameController, 0x1baf6522, 0x5f64, 0x42c5, 0x82,0x67, 0xb9,0xfe,0x22,0x15,0xbf,0xbd)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CIGameControllerVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IGameController methods ***/
    HRESULT (STDMETHODCALLTYPE *add_HeadsetConnected)(
        __x_ABI_CWindows_CGaming_CInput_CIGameController *This,
        __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_HeadsetConnected)(
        __x_ABI_CWindows_CGaming_CInput_CIGameController *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_HeadsetDisconnected)(
        __x_ABI_CWindows_CGaming_CInput_CIGameController *This,
        __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_HeadsetDisconnected)(
        __x_ABI_CWindows_CGaming_CInput_CIGameController *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_UserChanged)(
        __x_ABI_CWindows_CGaming_CInput_CIGameController *This,
        __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_UserChanged)(
        __x_ABI_CWindows_CGaming_CInput_CIGameController *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *get_Headset)(
        __x_ABI_CWindows_CGaming_CInput_CIGameController *This,
        __x_ABI_CWindows_CGaming_CInput_CIHeadset **value);

    HRESULT (STDMETHODCALLTYPE *get_IsWireless)(
        __x_ABI_CWindows_CGaming_CInput_CIGameController *This,
        boolean *value);

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

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CIGameControllerVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CIGameController {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CIGameControllerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIGameController_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CIGameController_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CIGameController_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIGameController_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CIGameController_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CIGameController_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IGameController methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIGameController_add_HeadsetConnected(This,handler,token) (This)->lpVtbl->add_HeadsetConnected(This,handler,token)
#define __x_ABI_CWindows_CGaming_CInput_CIGameController_remove_HeadsetConnected(This,token) (This)->lpVtbl->remove_HeadsetConnected(This,token)
#define __x_ABI_CWindows_CGaming_CInput_CIGameController_add_HeadsetDisconnected(This,handler,token) (This)->lpVtbl->add_HeadsetDisconnected(This,handler,token)
#define __x_ABI_CWindows_CGaming_CInput_CIGameController_remove_HeadsetDisconnected(This,token) (This)->lpVtbl->remove_HeadsetDisconnected(This,token)
#define __x_ABI_CWindows_CGaming_CInput_CIGameController_add_UserChanged(This,handler,token) (This)->lpVtbl->add_UserChanged(This,handler,token)
#define __x_ABI_CWindows_CGaming_CInput_CIGameController_remove_UserChanged(This,token) (This)->lpVtbl->remove_UserChanged(This,token)
#define __x_ABI_CWindows_CGaming_CInput_CIGameController_get_Headset(This,value) (This)->lpVtbl->get_Headset(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIGameController_get_IsWireless(This,value) (This)->lpVtbl->get_IsWireless(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIGameController_get_User(This,value) (This)->lpVtbl->get_User(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGameController_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CIGameController* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIGameController_AddRef(__x_ABI_CWindows_CGaming_CInput_CIGameController* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIGameController_Release(__x_ABI_CWindows_CGaming_CInput_CIGameController* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGameController_GetIids(__x_ABI_CWindows_CGaming_CInput_CIGameController* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGameController_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CIGameController* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGameController_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CIGameController* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IGameController methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGameController_add_HeadsetConnected(__x_ABI_CWindows_CGaming_CInput_CIGameController* This,__FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_HeadsetConnected(This,handler,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGameController_remove_HeadsetConnected(__x_ABI_CWindows_CGaming_CInput_CIGameController* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_HeadsetConnected(This,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGameController_add_HeadsetDisconnected(__x_ABI_CWindows_CGaming_CInput_CIGameController* This,__FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_HeadsetDisconnected(This,handler,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGameController_remove_HeadsetDisconnected(__x_ABI_CWindows_CGaming_CInput_CIGameController* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_HeadsetDisconnected(This,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGameController_add_UserChanged(__x_ABI_CWindows_CGaming_CInput_CIGameController* This,__FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_UserChanged(This,handler,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGameController_remove_UserChanged(__x_ABI_CWindows_CGaming_CInput_CIGameController* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_UserChanged(This,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGameController_get_Headset(__x_ABI_CWindows_CGaming_CInput_CIGameController* This,__x_ABI_CWindows_CGaming_CInput_CIHeadset **value) {
    return This->lpVtbl->get_Headset(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGameController_get_IsWireless(__x_ABI_CWindows_CGaming_CInput_CIGameController* This,boolean *value) {
    return This->lpVtbl->get_IsWireless(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGameController_get_User(__x_ABI_CWindows_CGaming_CInput_CIGameController* This,__x_ABI_CWindows_CSystem_CIUser **value) {
    return This->lpVtbl->get_User(This,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input
#define IID_IGameController IID___x_ABI_CWindows_CGaming_CInput_CIGameController
#define IGameControllerVtbl __x_ABI_CWindows_CGaming_CInput_CIGameControllerVtbl
#define IGameController __x_ABI_CWindows_CGaming_CInput_CIGameController
#define IGameController_QueryInterface __x_ABI_CWindows_CGaming_CInput_CIGameController_QueryInterface
#define IGameController_AddRef __x_ABI_CWindows_CGaming_CInput_CIGameController_AddRef
#define IGameController_Release __x_ABI_CWindows_CGaming_CInput_CIGameController_Release
#define IGameController_GetIids __x_ABI_CWindows_CGaming_CInput_CIGameController_GetIids
#define IGameController_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CIGameController_GetRuntimeClassName
#define IGameController_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CIGameController_GetTrustLevel
#define IGameController_add_HeadsetConnected __x_ABI_CWindows_CGaming_CInput_CIGameController_add_HeadsetConnected
#define IGameController_remove_HeadsetConnected __x_ABI_CWindows_CGaming_CInput_CIGameController_remove_HeadsetConnected
#define IGameController_add_HeadsetDisconnected __x_ABI_CWindows_CGaming_CInput_CIGameController_add_HeadsetDisconnected
#define IGameController_remove_HeadsetDisconnected __x_ABI_CWindows_CGaming_CInput_CIGameController_remove_HeadsetDisconnected
#define IGameController_add_UserChanged __x_ABI_CWindows_CGaming_CInput_CIGameController_add_UserChanged
#define IGameController_remove_UserChanged __x_ABI_CWindows_CGaming_CInput_CIGameController_remove_UserChanged
#define IGameController_get_Headset __x_ABI_CWindows_CGaming_CInput_CIGameController_get_Headset
#define IGameController_get_IsWireless __x_ABI_CWindows_CGaming_CInput_CIGameController_get_IsWireless
#define IGameController_get_User __x_ABI_CWindows_CGaming_CInput_CIGameController_get_User
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif

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

/*****************************************************************************
 * IGamepad interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CIGamepad_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIGamepad_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CIGamepad, 0xbc7bb43c, 0x0a69, 0x3903, 0x9e,0x9d, 0xa5,0x0f,0x86,0xa4,0x5d,0xe5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                MIDL_INTERFACE("bc7bb43c-0a69-3903-9e9d-a50f86a45de5")
                IGamepad : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Vibration(
                        ABI::Windows::Gaming::Input::GamepadVibration *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Vibration(
                        ABI::Windows::Gaming::Input::GamepadVibration value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetCurrentReading(
                        ABI::Windows::Gaming::Input::GamepadReading *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CIGamepad, 0xbc7bb43c, 0x0a69, 0x3903, 0x9e,0x9d, 0xa5,0x0f,0x86,0xa4,0x5d,0xe5)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CIGamepadVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IGamepad methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Vibration)(
        __x_ABI_CWindows_CGaming_CInput_CIGamepad *This,
        __x_ABI_CWindows_CGaming_CInput_CGamepadVibration *value);

    HRESULT (STDMETHODCALLTYPE *put_Vibration)(
        __x_ABI_CWindows_CGaming_CInput_CIGamepad *This,
        __x_ABI_CWindows_CGaming_CInput_CGamepadVibration value);

    HRESULT (STDMETHODCALLTYPE *GetCurrentReading)(
        __x_ABI_CWindows_CGaming_CInput_CIGamepad *This,
        __x_ABI_CWindows_CGaming_CInput_CGamepadReading *value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CIGamepadVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CIGamepad {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CIGamepadVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIGamepad_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepad_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepad_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIGamepad_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepad_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepad_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IGamepad methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIGamepad_get_Vibration(This,value) (This)->lpVtbl->get_Vibration(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepad_put_Vibration(This,value) (This)->lpVtbl->put_Vibration(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepad_GetCurrentReading(This,value) (This)->lpVtbl->GetCurrentReading(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepad_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CIGamepad* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIGamepad_AddRef(__x_ABI_CWindows_CGaming_CInput_CIGamepad* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIGamepad_Release(__x_ABI_CWindows_CGaming_CInput_CIGamepad* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepad_GetIids(__x_ABI_CWindows_CGaming_CInput_CIGamepad* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepad_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CIGamepad* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepad_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CIGamepad* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IGamepad methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepad_get_Vibration(__x_ABI_CWindows_CGaming_CInput_CIGamepad* This,__x_ABI_CWindows_CGaming_CInput_CGamepadVibration *value) {
    return This->lpVtbl->get_Vibration(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepad_put_Vibration(__x_ABI_CWindows_CGaming_CInput_CIGamepad* This,__x_ABI_CWindows_CGaming_CInput_CGamepadVibration value) {
    return This->lpVtbl->put_Vibration(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepad_GetCurrentReading(__x_ABI_CWindows_CGaming_CInput_CIGamepad* This,__x_ABI_CWindows_CGaming_CInput_CGamepadReading *value) {
    return This->lpVtbl->GetCurrentReading(This,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input
#define IID_IGamepad IID___x_ABI_CWindows_CGaming_CInput_CIGamepad
#define IGamepadVtbl __x_ABI_CWindows_CGaming_CInput_CIGamepadVtbl
#define IGamepad __x_ABI_CWindows_CGaming_CInput_CIGamepad
#define IGamepad_QueryInterface __x_ABI_CWindows_CGaming_CInput_CIGamepad_QueryInterface
#define IGamepad_AddRef __x_ABI_CWindows_CGaming_CInput_CIGamepad_AddRef
#define IGamepad_Release __x_ABI_CWindows_CGaming_CInput_CIGamepad_Release
#define IGamepad_GetIids __x_ABI_CWindows_CGaming_CInput_CIGamepad_GetIids
#define IGamepad_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CIGamepad_GetRuntimeClassName
#define IGamepad_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CIGamepad_GetTrustLevel
#define IGamepad_get_Vibration __x_ABI_CWindows_CGaming_CInput_CIGamepad_get_Vibration
#define IGamepad_put_Vibration __x_ABI_CWindows_CGaming_CInput_CIGamepad_put_Vibration
#define IGamepad_GetCurrentReading __x_ABI_CWindows_CGaming_CInput_CIGamepad_GetCurrentReading
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif

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

/*****************************************************************************
 * IGamepad2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CIGamepad2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIGamepad2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CIGamepad2, 0x3c1689bd, 0x5915, 0x4245, 0xb0,0xc0, 0xc8,0x9f,0xae,0x03,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                MIDL_INTERFACE("3c1689bd-5915-4245-b0c0-c89fae0308ff")
                IGamepad2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetButtonLabel(
                        ABI::Windows::Gaming::Input::GamepadButtons button,
                        ABI::Windows::Gaming::Input::GameControllerButtonLabel *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CIGamepad2, 0x3c1689bd, 0x5915, 0x4245, 0xb0,0xc0, 0xc8,0x9f,0xae,0x03,0x08,0xff)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CIGamepad2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IGamepad2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetButtonLabel)(
        __x_ABI_CWindows_CGaming_CInput_CIGamepad2 *This,
        __x_ABI_CWindows_CGaming_CInput_CGamepadButtons button,
        __x_ABI_CWindows_CGaming_CInput_CGameControllerButtonLabel *value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CIGamepad2Vtbl;

interface __x_ABI_CWindows_CGaming_CInput_CIGamepad2 {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CIGamepad2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIGamepad2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepad2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepad2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIGamepad2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepad2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepad2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IGamepad2 methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIGamepad2_GetButtonLabel(This,button,value) (This)->lpVtbl->GetButtonLabel(This,button,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepad2_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CIGamepad2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIGamepad2_AddRef(__x_ABI_CWindows_CGaming_CInput_CIGamepad2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIGamepad2_Release(__x_ABI_CWindows_CGaming_CInput_CIGamepad2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepad2_GetIids(__x_ABI_CWindows_CGaming_CInput_CIGamepad2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepad2_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CIGamepad2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepad2_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CIGamepad2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IGamepad2 methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepad2_GetButtonLabel(__x_ABI_CWindows_CGaming_CInput_CIGamepad2* This,__x_ABI_CWindows_CGaming_CInput_CGamepadButtons button,__x_ABI_CWindows_CGaming_CInput_CGameControllerButtonLabel *value) {
    return This->lpVtbl->GetButtonLabel(This,button,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input
#define IID_IGamepad2 IID___x_ABI_CWindows_CGaming_CInput_CIGamepad2
#define IGamepad2Vtbl __x_ABI_CWindows_CGaming_CInput_CIGamepad2Vtbl
#define IGamepad2 __x_ABI_CWindows_CGaming_CInput_CIGamepad2
#define IGamepad2_QueryInterface __x_ABI_CWindows_CGaming_CInput_CIGamepad2_QueryInterface
#define IGamepad2_AddRef __x_ABI_CWindows_CGaming_CInput_CIGamepad2_AddRef
#define IGamepad2_Release __x_ABI_CWindows_CGaming_CInput_CIGamepad2_Release
#define IGamepad2_GetIids __x_ABI_CWindows_CGaming_CInput_CIGamepad2_GetIids
#define IGamepad2_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CIGamepad2_GetRuntimeClassName
#define IGamepad2_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CIGamepad2_GetTrustLevel
#define IGamepad2_GetButtonLabel __x_ABI_CWindows_CGaming_CInput_CIGamepad2_GetButtonLabel
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif

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

/*****************************************************************************
 * IRacingWheel interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CIRacingWheel_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIRacingWheel_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CIRacingWheel, 0xf546656f, 0xe106, 0x4c82, 0xa9,0x0f, 0x55,0x40,0x12,0x90,0x4b,0x85);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                MIDL_INTERFACE("f546656f-e106-4c82-a90f-554012904b85")
                IRacingWheel : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_HasClutch(
                        boolean *value) = 0;

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

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

                    virtual HRESULT STDMETHODCALLTYPE get_MaxPatternShifterGear(
                        INT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_MaxWheelAngle(
                        DOUBLE *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_WheelMotor(
                        ABI::Windows::Gaming::Input::ForceFeedback::IForceFeedbackMotor **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetButtonLabel(
                        ABI::Windows::Gaming::Input::RacingWheelButtons button,
                        ABI::Windows::Gaming::Input::GameControllerButtonLabel *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetCurrentReading(
                        ABI::Windows::Gaming::Input::RacingWheelReading *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CIRacingWheel, 0xf546656f, 0xe106, 0x4c82, 0xa9,0x0f, 0x55,0x40,0x12,0x90,0x4b,0x85)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CIRacingWheelVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IRacingWheel methods ***/
    HRESULT (STDMETHODCALLTYPE *get_HasClutch)(
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_HasHandbrake)(
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_HasPatternShifter)(
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_MaxPatternShifterGear)(
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel *This,
        INT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_MaxWheelAngle)(
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel *This,
        DOUBLE *value);

    HRESULT (STDMETHODCALLTYPE *get_WheelMotor)(
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel *This,
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor **value);

    HRESULT (STDMETHODCALLTYPE *GetButtonLabel)(
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel *This,
        __x_ABI_CWindows_CGaming_CInput_CRacingWheelButtons button,
        __x_ABI_CWindows_CGaming_CInput_CGameControllerButtonLabel *value);

    HRESULT (STDMETHODCALLTYPE *GetCurrentReading)(
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel *This,
        __x_ABI_CWindows_CGaming_CInput_CRacingWheelReading *value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CIRacingWheelVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CIRacingWheel {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CIRacingWheelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IRacingWheel methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_get_HasClutch(This,value) (This)->lpVtbl->get_HasClutch(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_get_HasHandbrake(This,value) (This)->lpVtbl->get_HasHandbrake(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_get_HasPatternShifter(This,value) (This)->lpVtbl->get_HasPatternShifter(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_get_MaxPatternShifterGear(This,value) (This)->lpVtbl->get_MaxPatternShifterGear(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_get_MaxWheelAngle(This,value) (This)->lpVtbl->get_MaxWheelAngle(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_get_WheelMotor(This,value) (This)->lpVtbl->get_WheelMotor(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_GetButtonLabel(This,button,value) (This)->lpVtbl->GetButtonLabel(This,button,value)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_GetCurrentReading(This,value) (This)->lpVtbl->GetCurrentReading(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CIRacingWheel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_AddRef(__x_ABI_CWindows_CGaming_CInput_CIRacingWheel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_Release(__x_ABI_CWindows_CGaming_CInput_CIRacingWheel* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_GetIids(__x_ABI_CWindows_CGaming_CInput_CIRacingWheel* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CIRacingWheel* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CIRacingWheel* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IRacingWheel methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_get_HasClutch(__x_ABI_CWindows_CGaming_CInput_CIRacingWheel* This,boolean *value) {
    return This->lpVtbl->get_HasClutch(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_get_HasHandbrake(__x_ABI_CWindows_CGaming_CInput_CIRacingWheel* This,boolean *value) {
    return This->lpVtbl->get_HasHandbrake(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_get_HasPatternShifter(__x_ABI_CWindows_CGaming_CInput_CIRacingWheel* This,boolean *value) {
    return This->lpVtbl->get_HasPatternShifter(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_get_MaxPatternShifterGear(__x_ABI_CWindows_CGaming_CInput_CIRacingWheel* This,INT32 *value) {
    return This->lpVtbl->get_MaxPatternShifterGear(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_get_MaxWheelAngle(__x_ABI_CWindows_CGaming_CInput_CIRacingWheel* This,DOUBLE *value) {
    return This->lpVtbl->get_MaxWheelAngle(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_get_WheelMotor(__x_ABI_CWindows_CGaming_CInput_CIRacingWheel* This,__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor **value) {
    return This->lpVtbl->get_WheelMotor(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_GetButtonLabel(__x_ABI_CWindows_CGaming_CInput_CIRacingWheel* This,__x_ABI_CWindows_CGaming_CInput_CRacingWheelButtons button,__x_ABI_CWindows_CGaming_CInput_CGameControllerButtonLabel *value) {
    return This->lpVtbl->GetButtonLabel(This,button,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_GetCurrentReading(__x_ABI_CWindows_CGaming_CInput_CIRacingWheel* This,__x_ABI_CWindows_CGaming_CInput_CRacingWheelReading *value) {
    return This->lpVtbl->GetCurrentReading(This,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input
#define IID_IRacingWheel IID___x_ABI_CWindows_CGaming_CInput_CIRacingWheel
#define IRacingWheelVtbl __x_ABI_CWindows_CGaming_CInput_CIRacingWheelVtbl
#define IRacingWheel __x_ABI_CWindows_CGaming_CInput_CIRacingWheel
#define IRacingWheel_QueryInterface __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_QueryInterface
#define IRacingWheel_AddRef __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_AddRef
#define IRacingWheel_Release __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_Release
#define IRacingWheel_GetIids __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_GetIids
#define IRacingWheel_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_GetRuntimeClassName
#define IRacingWheel_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_GetTrustLevel
#define IRacingWheel_get_HasClutch __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_get_HasClutch
#define IRacingWheel_get_HasHandbrake __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_get_HasHandbrake
#define IRacingWheel_get_HasPatternShifter __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_get_HasPatternShifter
#define IRacingWheel_get_MaxPatternShifterGear __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_get_MaxPatternShifterGear
#define IRacingWheel_get_MaxWheelAngle __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_get_MaxWheelAngle
#define IRacingWheel_get_WheelMotor __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_get_WheelMotor
#define IRacingWheel_GetButtonLabel __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_GetButtonLabel
#define IRacingWheel_GetCurrentReading __x_ABI_CWindows_CGaming_CInput_CIRacingWheel_GetCurrentReading
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif

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

/*****************************************************************************
 * IRacingWheelStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics, 0x3ac12cd5, 0x581b, 0x4936, 0x9f,0x94, 0x69,0xf1,0xe6,0x51,0x4c,0x7d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                MIDL_INTERFACE("3ac12cd5-581b-4936-9f94-69f1e6514c7d")
                IRacingWheelStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE add_RacingWheelAdded(
                        ABI::Windows::Foundation::IEventHandler<ABI::Windows::Gaming::Input::RacingWheel* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_RacingWheelAdded(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_RacingWheelRemoved(
                        ABI::Windows::Foundation::IEventHandler<ABI::Windows::Gaming::Input::RacingWheel* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_RacingWheelRemoved(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_RacingWheels(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Gaming::Input::RacingWheel* > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics, 0x3ac12cd5, 0x581b, 0x4936, 0x9f,0x94, 0x69,0xf1,0xe6,0x51,0x4c,0x7d)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IRacingWheelStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *add_RacingWheelAdded)(
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics *This,
        __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_RacingWheelAdded)(
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_RacingWheelRemoved)(
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics *This,
        __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_RacingWheelRemoved)(
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *get_RacingWheels)(
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics *This,
        __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel **value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStaticsVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IRacingWheelStatics methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_add_RacingWheelAdded(This,value,token) (This)->lpVtbl->add_RacingWheelAdded(This,value,token)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_remove_RacingWheelAdded(This,token) (This)->lpVtbl->remove_RacingWheelAdded(This,token)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_add_RacingWheelRemoved(This,value,token) (This)->lpVtbl->add_RacingWheelRemoved(This,value,token)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_remove_RacingWheelRemoved(This,token) (This)->lpVtbl->remove_RacingWheelRemoved(This,token)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_get_RacingWheels(This,value) (This)->lpVtbl->get_RacingWheels(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_AddRef(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_Release(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_GetIids(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IRacingWheelStatics methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_add_RacingWheelAdded(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics* This,__FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_RacingWheelAdded(This,value,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_remove_RacingWheelAdded(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_RacingWheelAdded(This,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_add_RacingWheelRemoved(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics* This,__FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_RacingWheelRemoved(This,value,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_remove_RacingWheelRemoved(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_RacingWheelRemoved(This,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_get_RacingWheels(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics* This,__FIVectorView_1_Windows__CGaming__CInput__CRacingWheel **value) {
    return This->lpVtbl->get_RacingWheels(This,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input
#define IID_IRacingWheelStatics IID___x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics
#define IRacingWheelStaticsVtbl __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStaticsVtbl
#define IRacingWheelStatics __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics
#define IRacingWheelStatics_QueryInterface __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_QueryInterface
#define IRacingWheelStatics_AddRef __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_AddRef
#define IRacingWheelStatics_Release __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_Release
#define IRacingWheelStatics_GetIids __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_GetIids
#define IRacingWheelStatics_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_GetRuntimeClassName
#define IRacingWheelStatics_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_GetTrustLevel
#define IRacingWheelStatics_add_RacingWheelAdded __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_add_RacingWheelAdded
#define IRacingWheelStatics_remove_RacingWheelAdded __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_remove_RacingWheelAdded
#define IRacingWheelStatics_add_RacingWheelRemoved __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_add_RacingWheelRemoved
#define IRacingWheelStatics_remove_RacingWheelRemoved __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_remove_RacingWheelRemoved
#define IRacingWheelStatics_get_RacingWheels __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics_get_RacingWheels
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif

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

/*****************************************************************************
 * IRacingWheelStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2, 0xe666bcaa, 0xedfd, 0x4323, 0xa9,0xf6, 0x3c,0x38,0x40,0x48,0xd1,0xed);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                MIDL_INTERFACE("e666bcaa-edfd-4323-a9f6-3c384048d1ed")
                IRacingWheelStatics2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE FromGameController(
                        ABI::Windows::Gaming::Input::IGameController *controller,
                        ABI::Windows::Gaming::Input::IRacingWheel **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2, 0xe666bcaa, 0xedfd, 0x4323, 0xa9,0xf6, 0x3c,0x38,0x40,0x48,0xd1,0xed)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IRacingWheelStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *FromGameController)(
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2 *This,
        __x_ABI_CWindows_CGaming_CInput_CIGameController *controller,
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel **value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2Vtbl;

interface __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2 {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IRacingWheelStatics2 methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_FromGameController(This,controller,value) (This)->lpVtbl->FromGameController(This,controller,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_AddRef(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_Release(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_GetIids(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IRacingWheelStatics2 methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_FromGameController(__x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2* This,__x_ABI_CWindows_CGaming_CInput_CIGameController *controller,__x_ABI_CWindows_CGaming_CInput_CIRacingWheel **value) {
    return This->lpVtbl->FromGameController(This,controller,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input
#define IID_IRacingWheelStatics2 IID___x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2
#define IRacingWheelStatics2Vtbl __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2Vtbl
#define IRacingWheelStatics2 __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2
#define IRacingWheelStatics2_QueryInterface __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_QueryInterface
#define IRacingWheelStatics2_AddRef __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_AddRef
#define IRacingWheelStatics2_Release __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_Release
#define IRacingWheelStatics2_GetIids __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_GetIids
#define IRacingWheelStatics2_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_GetRuntimeClassName
#define IRacingWheelStatics2_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_GetTrustLevel
#define IRacingWheelStatics2_FromGameController __x_ABI_CWindows_CGaming_CInput_CIRacingWheelStatics2_FromGameController
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif

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

/*****************************************************************************
 * IRawGameController interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CIRawGameController_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIRawGameController_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CIRawGameController, 0x7cad6d91, 0xa7e1, 0x4f71, 0x9a,0x78, 0x33,0xe9,0xc5,0xdf,0xea,0x62);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                MIDL_INTERFACE("7cad6d91-a7e1-4f71-9a78-33e9c5dfea62")
                IRawGameController : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_AxisCount(
                        INT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ButtonCount(
                        INT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ForceFeedbackMotors(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_HardwareProductId(
                        UINT16 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_HardwareVendorId(
                        UINT16 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SwitchCount(
                        INT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetButtonLabel(
                        INT32 index,
                        ABI::Windows::Gaming::Input::GameControllerButtonLabel *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetCurrentReading(
                        UINT32 buttons_size,
                        boolean *buttons,
                        UINT32 switches_size,
                        ABI::Windows::Gaming::Input::GameControllerSwitchPosition *switches,
                        UINT32 axes_size,
                        DOUBLE *axes,
                        UINT64 *timestamp) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetSwitchKind(
                        INT32 index,
                        ABI::Windows::Gaming::Input::GameControllerSwitchKind *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CIRawGameController, 0x7cad6d91, 0xa7e1, 0x4f71, 0x9a,0x78, 0x33,0xe9,0xc5,0xdf,0xea,0x62)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IRawGameController methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AxisCount)(
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController *This,
        INT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_ButtonCount)(
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController *This,
        INT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_ForceFeedbackMotors)(
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController *This,
        __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor **value);

    HRESULT (STDMETHODCALLTYPE *get_HardwareProductId)(
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController *This,
        UINT16 *value);

    HRESULT (STDMETHODCALLTYPE *get_HardwareVendorId)(
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController *This,
        UINT16 *value);

    HRESULT (STDMETHODCALLTYPE *get_SwitchCount)(
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController *This,
        INT32 *value);

    HRESULT (STDMETHODCALLTYPE *GetButtonLabel)(
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController *This,
        INT32 index,
        __x_ABI_CWindows_CGaming_CInput_CGameControllerButtonLabel *value);

    HRESULT (STDMETHODCALLTYPE *GetCurrentReading)(
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController *This,
        UINT32 buttons_size,
        boolean *buttons,
        UINT32 switches_size,
        __x_ABI_CWindows_CGaming_CInput_CGameControllerSwitchPosition *switches,
        UINT32 axes_size,
        DOUBLE *axes,
        UINT64 *timestamp);

    HRESULT (STDMETHODCALLTYPE *GetSwitchKind)(
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController *This,
        INT32 index,
        __x_ABI_CWindows_CGaming_CInput_CGameControllerSwitchKind *value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CIRawGameController {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IRawGameController methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController_get_AxisCount(This,value) (This)->lpVtbl->get_AxisCount(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController_get_ButtonCount(This,value) (This)->lpVtbl->get_ButtonCount(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController_get_ForceFeedbackMotors(This,value) (This)->lpVtbl->get_ForceFeedbackMotors(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController_get_HardwareProductId(This,value) (This)->lpVtbl->get_HardwareProductId(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController_get_HardwareVendorId(This,value) (This)->lpVtbl->get_HardwareVendorId(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController_get_SwitchCount(This,value) (This)->lpVtbl->get_SwitchCount(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController_GetButtonLabel(This,index,value) (This)->lpVtbl->GetButtonLabel(This,index,value)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController_GetCurrentReading(This,buttons_size,buttons,switches_size,switches,axes_size,axes,timestamp) (This)->lpVtbl->GetCurrentReading(This,buttons_size,buttons,switches_size,switches,axes_size,axes,timestamp)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController_GetSwitchKind(This,index,value) (This)->lpVtbl->GetSwitchKind(This,index,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameController_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CIRawGameController* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIRawGameController_AddRef(__x_ABI_CWindows_CGaming_CInput_CIRawGameController* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIRawGameController_Release(__x_ABI_CWindows_CGaming_CInput_CIRawGameController* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameController_GetIids(__x_ABI_CWindows_CGaming_CInput_CIRawGameController* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameController_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CIRawGameController* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameController_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CIRawGameController* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IRawGameController methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameController_get_AxisCount(__x_ABI_CWindows_CGaming_CInput_CIRawGameController* This,INT32 *value) {
    return This->lpVtbl->get_AxisCount(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameController_get_ButtonCount(__x_ABI_CWindows_CGaming_CInput_CIRawGameController* This,INT32 *value) {
    return This->lpVtbl->get_ButtonCount(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameController_get_ForceFeedbackMotors(__x_ABI_CWindows_CGaming_CInput_CIRawGameController* This,__FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor **value) {
    return This->lpVtbl->get_ForceFeedbackMotors(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameController_get_HardwareProductId(__x_ABI_CWindows_CGaming_CInput_CIRawGameController* This,UINT16 *value) {
    return This->lpVtbl->get_HardwareProductId(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameController_get_HardwareVendorId(__x_ABI_CWindows_CGaming_CInput_CIRawGameController* This,UINT16 *value) {
    return This->lpVtbl->get_HardwareVendorId(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameController_get_SwitchCount(__x_ABI_CWindows_CGaming_CInput_CIRawGameController* This,INT32 *value) {
    return This->lpVtbl->get_SwitchCount(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameController_GetButtonLabel(__x_ABI_CWindows_CGaming_CInput_CIRawGameController* This,INT32 index,__x_ABI_CWindows_CGaming_CInput_CGameControllerButtonLabel *value) {
    return This->lpVtbl->GetButtonLabel(This,index,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameController_GetCurrentReading(__x_ABI_CWindows_CGaming_CInput_CIRawGameController* This,UINT32 buttons_size,boolean *buttons,UINT32 switches_size,__x_ABI_CWindows_CGaming_CInput_CGameControllerSwitchPosition *switches,UINT32 axes_size,DOUBLE *axes,UINT64 *timestamp) {
    return This->lpVtbl->GetCurrentReading(This,buttons_size,buttons,switches_size,switches,axes_size,axes,timestamp);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameController_GetSwitchKind(__x_ABI_CWindows_CGaming_CInput_CIRawGameController* This,INT32 index,__x_ABI_CWindows_CGaming_CInput_CGameControllerSwitchKind *value) {
    return This->lpVtbl->GetSwitchKind(This,index,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input
#define IID_IRawGameController IID___x_ABI_CWindows_CGaming_CInput_CIRawGameController
#define IRawGameControllerVtbl __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerVtbl
#define IRawGameController __x_ABI_CWindows_CGaming_CInput_CIRawGameController
#define IRawGameController_QueryInterface __x_ABI_CWindows_CGaming_CInput_CIRawGameController_QueryInterface
#define IRawGameController_AddRef __x_ABI_CWindows_CGaming_CInput_CIRawGameController_AddRef
#define IRawGameController_Release __x_ABI_CWindows_CGaming_CInput_CIRawGameController_Release
#define IRawGameController_GetIids __x_ABI_CWindows_CGaming_CInput_CIRawGameController_GetIids
#define IRawGameController_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CIRawGameController_GetRuntimeClassName
#define IRawGameController_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CIRawGameController_GetTrustLevel
#define IRawGameController_get_AxisCount __x_ABI_CWindows_CGaming_CInput_CIRawGameController_get_AxisCount
#define IRawGameController_get_ButtonCount __x_ABI_CWindows_CGaming_CInput_CIRawGameController_get_ButtonCount
#define IRawGameController_get_ForceFeedbackMotors __x_ABI_CWindows_CGaming_CInput_CIRawGameController_get_ForceFeedbackMotors
#define IRawGameController_get_HardwareProductId __x_ABI_CWindows_CGaming_CInput_CIRawGameController_get_HardwareProductId
#define IRawGameController_get_HardwareVendorId __x_ABI_CWindows_CGaming_CInput_CIRawGameController_get_HardwareVendorId
#define IRawGameController_get_SwitchCount __x_ABI_CWindows_CGaming_CInput_CIRawGameController_get_SwitchCount
#define IRawGameController_GetButtonLabel __x_ABI_CWindows_CGaming_CInput_CIRawGameController_GetButtonLabel
#define IRawGameController_GetCurrentReading __x_ABI_CWindows_CGaming_CInput_CIRawGameController_GetCurrentReading
#define IRawGameController_GetSwitchKind __x_ABI_CWindows_CGaming_CInput_CIRawGameController_GetSwitchKind
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif

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

/*****************************************************************************
 * IRawGameController2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CIRawGameController2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIRawGameController2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CIRawGameController2, 0x43c0c035, 0xbb73, 0x4756, 0xa7,0x87, 0x3e,0xd6,0xbe,0xa6,0x17,0xbd);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                MIDL_INTERFACE("43c0c035-bb73-4756-a787-3ed6bea617bd")
                IRawGameController2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_SimpleHapticsControllers(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Devices::Haptics::SimpleHapticsController* > **value) = 0;

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

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

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CIRawGameController2, 0x43c0c035, 0xbb73, 0x4756, 0xa7,0x87, 0x3e,0xd6,0xbe,0xa6,0x17,0xbd)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CIRawGameController2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IRawGameController2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_SimpleHapticsControllers)(
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController2 *This,
        __FIVectorView_1_Windows__CDevices__CHaptics__CSimpleHapticsController **value);

    HRESULT (STDMETHODCALLTYPE *get_NonRoamableId)(
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController2 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_DisplayName)(
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController2 *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CIRawGameController2Vtbl;

interface __x_ABI_CWindows_CGaming_CInput_CIRawGameController2 {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CIRawGameController2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IRawGameController2 methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_get_SimpleHapticsControllers(This,value) (This)->lpVtbl->get_SimpleHapticsControllers(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_get_NonRoamableId(This,value) (This)->lpVtbl->get_NonRoamableId(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_get_DisplayName(This,value) (This)->lpVtbl->get_DisplayName(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CIRawGameController2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_AddRef(__x_ABI_CWindows_CGaming_CInput_CIRawGameController2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_Release(__x_ABI_CWindows_CGaming_CInput_CIRawGameController2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_GetIids(__x_ABI_CWindows_CGaming_CInput_CIRawGameController2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CIRawGameController2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CIRawGameController2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IRawGameController2 methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_get_SimpleHapticsControllers(__x_ABI_CWindows_CGaming_CInput_CIRawGameController2* This,__FIVectorView_1_Windows__CDevices__CHaptics__CSimpleHapticsController **value) {
    return This->lpVtbl->get_SimpleHapticsControllers(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_get_NonRoamableId(__x_ABI_CWindows_CGaming_CInput_CIRawGameController2* This,HSTRING *value) {
    return This->lpVtbl->get_NonRoamableId(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_get_DisplayName(__x_ABI_CWindows_CGaming_CInput_CIRawGameController2* This,HSTRING *value) {
    return This->lpVtbl->get_DisplayName(This,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input
#define IID_IRawGameController2 IID___x_ABI_CWindows_CGaming_CInput_CIRawGameController2
#define IRawGameController2Vtbl __x_ABI_CWindows_CGaming_CInput_CIRawGameController2Vtbl
#define IRawGameController2 __x_ABI_CWindows_CGaming_CInput_CIRawGameController2
#define IRawGameController2_QueryInterface __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_QueryInterface
#define IRawGameController2_AddRef __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_AddRef
#define IRawGameController2_Release __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_Release
#define IRawGameController2_GetIids __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_GetIids
#define IRawGameController2_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_GetRuntimeClassName
#define IRawGameController2_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_GetTrustLevel
#define IRawGameController2_get_SimpleHapticsControllers __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_get_SimpleHapticsControllers
#define IRawGameController2_get_NonRoamableId __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_get_NonRoamableId
#define IRawGameController2_get_DisplayName __x_ABI_CWindows_CGaming_CInput_CIRawGameController2_get_DisplayName
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGaming_CInput_CIRawGameController2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */

/*****************************************************************************
 * IGamepadStatics interface
 */
#ifndef ____x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CIGamepadStatics, 0x8bbce529, 0xd49c, 0x39e9, 0x95,0x60, 0xe4,0x7d,0xde,0x96,0xb7,0xc8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                MIDL_INTERFACE("8bbce529-d49c-39e9-9560-e47dde96b7c8")
                IGamepadStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE add_GamepadAdded(
                        ABI::Windows::Foundation::IEventHandler<ABI::Windows::Gaming::Input::Gamepad* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_GamepadAdded(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_GamepadRemoved(
                        ABI::Windows::Foundation::IEventHandler<ABI::Windows::Gaming::Input::Gamepad* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_GamepadRemoved(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Gamepads(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Gaming::Input::Gamepad* > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics, 0x8bbce529, 0xd49c, 0x39e9, 0x95,0x60, 0xe4,0x7d,0xde,0x96,0xb7,0xc8)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CIGamepadStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IGamepadStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *add_GamepadAdded)(
        __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics *This,
        __FIEventHandler_1_Windows__CGaming__CInput__CGamepad *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_GamepadAdded)(
        __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_GamepadRemoved)(
        __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics *This,
        __FIEventHandler_1_Windows__CGaming__CInput__CGamepad *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_GamepadRemoved)(
        __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *get_Gamepads)(
        __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics *This,
        __FIVectorView_1_Windows__CGaming__CInput__CGamepad **value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CIGamepadStaticsVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CIGamepadStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IGamepadStatics methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_add_GamepadAdded(This,value,token) (This)->lpVtbl->add_GamepadAdded(This,value,token)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_remove_GamepadAdded(This,token) (This)->lpVtbl->remove_GamepadAdded(This,token)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_add_GamepadRemoved(This,value,token) (This)->lpVtbl->add_GamepadRemoved(This,value,token)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_remove_GamepadRemoved(This,token) (This)->lpVtbl->remove_GamepadRemoved(This,token)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_get_Gamepads(This,value) (This)->lpVtbl->get_Gamepads(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_AddRef(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_Release(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_GetIids(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IGamepadStatics methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_add_GamepadAdded(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics* This,__FIEventHandler_1_Windows__CGaming__CInput__CGamepad *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_GamepadAdded(This,value,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_remove_GamepadAdded(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_GamepadAdded(This,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_add_GamepadRemoved(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics* This,__FIEventHandler_1_Windows__CGaming__CInput__CGamepad *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_GamepadRemoved(This,value,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_remove_GamepadRemoved(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_GamepadRemoved(This,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_get_Gamepads(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics* This,__FIVectorView_1_Windows__CGaming__CInput__CGamepad **value) {
    return This->lpVtbl->get_Gamepads(This,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input
#define IID_IGamepadStatics IID___x_ABI_CWindows_CGaming_CInput_CIGamepadStatics
#define IGamepadStaticsVtbl __x_ABI_CWindows_CGaming_CInput_CIGamepadStaticsVtbl
#define IGamepadStatics __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics
#define IGamepadStatics_QueryInterface __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_QueryInterface
#define IGamepadStatics_AddRef __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_AddRef
#define IGamepadStatics_Release __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_Release
#define IGamepadStatics_GetIids __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_GetIids
#define IGamepadStatics_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_GetRuntimeClassName
#define IGamepadStatics_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_GetTrustLevel
#define IGamepadStatics_add_GamepadAdded __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_add_GamepadAdded
#define IGamepadStatics_remove_GamepadAdded __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_remove_GamepadAdded
#define IGamepadStatics_add_GamepadRemoved __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_add_GamepadRemoved
#define IGamepadStatics_remove_GamepadRemoved __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_remove_GamepadRemoved
#define IGamepadStatics_get_Gamepads __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_get_Gamepads
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IGamepadStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2, 0x42676dc5, 0x0856, 0x47c4, 0x92,0x13, 0xb3,0x95,0x50,0x4c,0x3a,0x3c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                MIDL_INTERFACE("42676dc5-0856-47c4-9213-b395504c3a3c")
                IGamepadStatics2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE FromGameController(
                        ABI::Windows::Gaming::Input::IGameController *controller,
                        ABI::Windows::Gaming::Input::IGamepad **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2, 0x42676dc5, 0x0856, 0x47c4, 0x92,0x13, 0xb3,0x95,0x50,0x4c,0x3a,0x3c)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IGamepadStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *FromGameController)(
        __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2 *This,
        __x_ABI_CWindows_CGaming_CInput_CIGameController *controller,
        __x_ABI_CWindows_CGaming_CInput_CIGamepad **value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2Vtbl;

interface __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2 {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IGamepadStatics2 methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_FromGameController(This,controller,value) (This)->lpVtbl->FromGameController(This,controller,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_AddRef(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_Release(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_GetIids(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IGamepadStatics2 methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_FromGameController(__x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2* This,__x_ABI_CWindows_CGaming_CInput_CIGameController *controller,__x_ABI_CWindows_CGaming_CInput_CIGamepad **value) {
    return This->lpVtbl->FromGameController(This,controller,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input
#define IID_IGamepadStatics2 IID___x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2
#define IGamepadStatics2Vtbl __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2Vtbl
#define IGamepadStatics2 __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2
#define IGamepadStatics2_QueryInterface __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_QueryInterface
#define IGamepadStatics2_AddRef __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_AddRef
#define IGamepadStatics2_Release __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_Release
#define IGamepadStatics2_GetIids __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_GetIids
#define IGamepadStatics2_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_GetRuntimeClassName
#define IGamepadStatics2_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_GetTrustLevel
#define IGamepadStatics2_FromGameController __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2_FromGameController
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif

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

/*****************************************************************************
 * IHeadset interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CIHeadset_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIHeadset_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CIHeadset, 0x3fd156ef, 0x6925, 0x3fa8, 0x91,0x81, 0x02,0x9c,0x52,0x23,0xae,0x3b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                MIDL_INTERFACE("3fd156ef-6925-3fa8-9181-029c5223ae3b")
                IHeadset : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_CaptureDeviceId(
                        HSTRING *value) = 0;

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

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CIHeadset, 0x3fd156ef, 0x6925, 0x3fa8, 0x91,0x81, 0x02,0x9c,0x52,0x23,0xae,0x3b)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CIHeadsetVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IHeadset methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CaptureDeviceId)(
        __x_ABI_CWindows_CGaming_CInput_CIHeadset *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_RenderDeviceId)(
        __x_ABI_CWindows_CGaming_CInput_CIHeadset *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CIHeadsetVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CIHeadset {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CIHeadsetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIHeadset_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CIHeadset_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CIHeadset_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIHeadset_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CIHeadset_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CIHeadset_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IHeadset methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIHeadset_get_CaptureDeviceId(This,value) (This)->lpVtbl->get_CaptureDeviceId(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIHeadset_get_RenderDeviceId(This,value) (This)->lpVtbl->get_RenderDeviceId(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIHeadset_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CIHeadset* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIHeadset_AddRef(__x_ABI_CWindows_CGaming_CInput_CIHeadset* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIHeadset_Release(__x_ABI_CWindows_CGaming_CInput_CIHeadset* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIHeadset_GetIids(__x_ABI_CWindows_CGaming_CInput_CIHeadset* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIHeadset_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CIHeadset* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIHeadset_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CIHeadset* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IHeadset methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIHeadset_get_CaptureDeviceId(__x_ABI_CWindows_CGaming_CInput_CIHeadset* This,HSTRING *value) {
    return This->lpVtbl->get_CaptureDeviceId(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIHeadset_get_RenderDeviceId(__x_ABI_CWindows_CGaming_CInput_CIHeadset* This,HSTRING *value) {
    return This->lpVtbl->get_RenderDeviceId(This,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input
#define IID_IHeadset IID___x_ABI_CWindows_CGaming_CInput_CIHeadset
#define IHeadsetVtbl __x_ABI_CWindows_CGaming_CInput_CIHeadsetVtbl
#define IHeadset __x_ABI_CWindows_CGaming_CInput_CIHeadset
#define IHeadset_QueryInterface __x_ABI_CWindows_CGaming_CInput_CIHeadset_QueryInterface
#define IHeadset_AddRef __x_ABI_CWindows_CGaming_CInput_CIHeadset_AddRef
#define IHeadset_Release __x_ABI_CWindows_CGaming_CInput_CIHeadset_Release
#define IHeadset_GetIids __x_ABI_CWindows_CGaming_CInput_CIHeadset_GetIids
#define IHeadset_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CIHeadset_GetRuntimeClassName
#define IHeadset_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CIHeadset_GetTrustLevel
#define IHeadset_get_CaptureDeviceId __x_ABI_CWindows_CGaming_CInput_CIHeadset_get_CaptureDeviceId
#define IHeadset_get_RenderDeviceId __x_ABI_CWindows_CGaming_CInput_CIHeadset_get_RenderDeviceId
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif

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

/*****************************************************************************
 * IRawGameControllerStatics interface
 */
#ifndef ____x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics, 0xeb8d0792, 0xe95a, 0x4b19, 0xaf,0xc7, 0x0a,0x59,0xf8,0xbf,0x75,0x9e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                MIDL_INTERFACE("eb8d0792-e95a-4b19-afc7-0a59f8bf759e")
                IRawGameControllerStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE add_RawGameControllerAdded(
                        ABI::Windows::Foundation::IEventHandler<ABI::Windows::Gaming::Input::RawGameController* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_RawGameControllerAdded(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_RawGameControllerRemoved(
                        ABI::Windows::Foundation::IEventHandler<ABI::Windows::Gaming::Input::RawGameController* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_RawGameControllerRemoved(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_RawGameControllers(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Gaming::Input::RawGameController* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FromGameController(
                        ABI::Windows::Gaming::Input::IGameController *game_controller,
                        ABI::Windows::Gaming::Input::IRawGameController **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics, 0xeb8d0792, 0xe95a, 0x4b19, 0xaf,0xc7, 0x0a,0x59,0xf8,0xbf,0x75,0x9e)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IRawGameControllerStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *add_RawGameControllerAdded)(
        __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics *This,
        __FIEventHandler_1_Windows__CGaming__CInput__CRawGameController *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_RawGameControllerAdded)(
        __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_RawGameControllerRemoved)(
        __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics *This,
        __FIEventHandler_1_Windows__CGaming__CInput__CRawGameController *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_RawGameControllerRemoved)(
        __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *get_RawGameControllers)(
        __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics *This,
        __FIVectorView_1_Windows__CGaming__CInput__CRawGameController **value);

    HRESULT (STDMETHODCALLTYPE *FromGameController)(
        __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics *This,
        __x_ABI_CWindows_CGaming_CInput_CIGameController *game_controller,
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController **value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStaticsVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IRawGameControllerStatics methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_add_RawGameControllerAdded(This,handler,token) (This)->lpVtbl->add_RawGameControllerAdded(This,handler,token)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_remove_RawGameControllerAdded(This,token) (This)->lpVtbl->remove_RawGameControllerAdded(This,token)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_add_RawGameControllerRemoved(This,handler,token) (This)->lpVtbl->add_RawGameControllerRemoved(This,handler,token)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_remove_RawGameControllerRemoved(This,token) (This)->lpVtbl->remove_RawGameControllerRemoved(This,token)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_get_RawGameControllers(This,value) (This)->lpVtbl->get_RawGameControllers(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_FromGameController(This,game_controller,value) (This)->lpVtbl->FromGameController(This,game_controller,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_AddRef(__x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_Release(__x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_GetIids(__x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IRawGameControllerStatics methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_add_RawGameControllerAdded(__x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics* This,__FIEventHandler_1_Windows__CGaming__CInput__CRawGameController *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_RawGameControllerAdded(This,handler,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_remove_RawGameControllerAdded(__x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_RawGameControllerAdded(This,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_add_RawGameControllerRemoved(__x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics* This,__FIEventHandler_1_Windows__CGaming__CInput__CRawGameController *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_RawGameControllerRemoved(This,handler,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_remove_RawGameControllerRemoved(__x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_RawGameControllerRemoved(This,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_get_RawGameControllers(__x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics* This,__FIVectorView_1_Windows__CGaming__CInput__CRawGameController **value) {
    return This->lpVtbl->get_RawGameControllers(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_FromGameController(__x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics* This,__x_ABI_CWindows_CGaming_CInput_CIGameController *game_controller,__x_ABI_CWindows_CGaming_CInput_CIRawGameController **value) {
    return This->lpVtbl->FromGameController(This,game_controller,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input
#define IID_IRawGameControllerStatics IID___x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics
#define IRawGameControllerStaticsVtbl __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStaticsVtbl
#define IRawGameControllerStatics __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics
#define IRawGameControllerStatics_QueryInterface __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_QueryInterface
#define IRawGameControllerStatics_AddRef __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_AddRef
#define IRawGameControllerStatics_Release __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_Release
#define IRawGameControllerStatics_GetIids __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_GetIids
#define IRawGameControllerStatics_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_GetRuntimeClassName
#define IRawGameControllerStatics_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_GetTrustLevel
#define IRawGameControllerStatics_add_RawGameControllerAdded __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_add_RawGameControllerAdded
#define IRawGameControllerStatics_remove_RawGameControllerAdded __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_remove_RawGameControllerAdded
#define IRawGameControllerStatics_add_RawGameControllerRemoved __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_add_RawGameControllerRemoved
#define IRawGameControllerStatics_remove_RawGameControllerRemoved __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_remove_RawGameControllerRemoved
#define IRawGameControllerStatics_get_RawGameControllers __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_get_RawGameControllers
#define IRawGameControllerStatics_FromGameController __x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_FromGameController
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGaming_CInput_CIRawGameControllerStatics_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IGameControllerBatteryInfo interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo, 0xdcecc681, 0x3963, 0x4da6, 0x95,0x5d, 0x55,0x3f,0x3b,0x6f,0x61,0x61);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                MIDL_INTERFACE("dcecc681-3963-4da6-955d-553f3b6f6161")
                IGameControllerBatteryInfo : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE TryGetBatteryReport(
                        ABI::Windows::Devices::Power::IBatteryReport **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo, 0xdcecc681, 0x3963, 0x4da6, 0x95,0x5d, 0x55,0x3f,0x3b,0x6f,0x61,0x61)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfoVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IGameControllerBatteryInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *TryGetBatteryReport)(
        __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo *This,
        __x_ABI_CWindows_CDevices_CPower_CIBatteryReport **value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfoVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IGameControllerBatteryInfo methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_TryGetBatteryReport(This,value) (This)->lpVtbl->TryGetBatteryReport(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_AddRef(__x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_Release(__x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_GetIids(__x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IGameControllerBatteryInfo methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_TryGetBatteryReport(__x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo* This,__x_ABI_CWindows_CDevices_CPower_CIBatteryReport **value) {
    return This->lpVtbl->TryGetBatteryReport(This,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input
#define IID_IGameControllerBatteryInfo IID___x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo
#define IGameControllerBatteryInfoVtbl __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfoVtbl
#define IGameControllerBatteryInfo __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo
#define IGameControllerBatteryInfo_QueryInterface __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_QueryInterface
#define IGameControllerBatteryInfo_AddRef __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_AddRef
#define IGameControllerBatteryInfo_Release __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_Release
#define IGameControllerBatteryInfo_GetIids __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_GetIids
#define IGameControllerBatteryInfo_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_GetRuntimeClassName
#define IGameControllerBatteryInfo_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_GetTrustLevel
#define IGameControllerBatteryInfo_TryGetBatteryReport __x_ABI_CWindows_CGaming_CInput_CIGameControllerBatteryInfo_TryGetBatteryReport
#endif /* WIDL_using_Windows_Gaming_Input */
#endif

#endif

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

/*
 * Class Windows.Gaming.Input.ArcadeStick
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_Gaming_Input_ArcadeStick_DEFINED
#define RUNTIMECLASS_Windows_Gaming_Input_ArcadeStick_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Gaming_Input_ArcadeStick[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','A','r','c','a','d','e','S','t','i','c','k',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_ArcadeStick[] = L"Windows.Gaming.Input.ArcadeStick";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_ArcadeStick[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','A','r','c','a','d','e','S','t','i','c','k',0};
#endif
#endif /* RUNTIMECLASS_Windows_Gaming_Input_ArcadeStick_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.Gaming.Input.FlightStick
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef RUNTIMECLASS_Windows_Gaming_Input_FlightStick_DEFINED
#define RUNTIMECLASS_Windows_Gaming_Input_FlightStick_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Gaming_Input_FlightStick[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','F','l','i','g','h','t','S','t','i','c','k',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_FlightStick[] = L"Windows.Gaming.Input.FlightStick";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_FlightStick[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','F','l','i','g','h','t','S','t','i','c','k',0};
#endif
#endif /* RUNTIMECLASS_Windows_Gaming_Input_FlightStick_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*
 * Class Windows.Gaming.Input.Gamepad
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Gaming_Input_Gamepad_DEFINED
#define RUNTIMECLASS_Windows_Gaming_Input_Gamepad_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Gaming_Input_Gamepad[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','G','a','m','e','p','a','d',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_Gamepad[] = L"Windows.Gaming.Input.Gamepad";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_Gamepad[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','G','a','m','e','p','a','d',0};
#endif
#endif /* RUNTIMECLASS_Windows_Gaming_Input_Gamepad_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Gaming.Input.Headset
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Gaming_Input_Headset_DEFINED
#define RUNTIMECLASS_Windows_Gaming_Input_Headset_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Gaming_Input_Headset[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','H','e','a','d','s','e','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_Headset[] = L"Windows.Gaming.Input.Headset";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_Headset[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','H','e','a','d','s','e','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Gaming_Input_Headset_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Gaming.Input.RacingWheel
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_Gaming_Input_RacingWheel_DEFINED
#define RUNTIMECLASS_Windows_Gaming_Input_RacingWheel_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Gaming_Input_RacingWheel[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','R','a','c','i','n','g','W','h','e','e','l',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_RacingWheel[] = L"Windows.Gaming.Input.RacingWheel";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_RacingWheel[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','R','a','c','i','n','g','W','h','e','e','l',0};
#endif
#endif /* RUNTIMECLASS_Windows_Gaming_Input_RacingWheel_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.Gaming.Input.RawGameController
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef RUNTIMECLASS_Windows_Gaming_Input_RawGameController_DEFINED
#define RUNTIMECLASS_Windows_Gaming_Input_RawGameController_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Gaming_Input_RawGameController[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','R','a','w','G','a','m','e','C','o','n','t','r','o','l','l','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_RawGameController[] = L"Windows.Gaming.Input.RawGameController";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_RawGameController[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','R','a','w','G','a','m','e','C','o','n','t','r','o','l','l','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Gaming_Input_RawGameController_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IEventHandler<ABI::Windows::Gaming::Input::ArcadeStick* > interface
 */
#ifndef ____FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick_INTERFACE_DEFINED__
#define ____FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick, 0x6afb8188, 0xd28d, 0x539b, 0xbb,0x69, 0xea,0x17,0x63,0xfb,0x99,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("6afb8188-d28d-539b-bb69-ea1763fb9920")
            IEventHandler<ABI::Windows::Gaming::Input::ArcadeStick* > : IEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::ArcadeStick*, ABI::Windows::Gaming::Input::IArcadeStick* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick, 0x6afb8188, 0xd28d, 0x539b, 0xbb,0x69, 0xea,0x17,0x63,0xfb,0x99,0x20)
#endif
#else
typedef struct __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStickVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEventHandler<ABI::Windows::Gaming::Input::ArcadeStick* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick *This,
        IInspectable *sender,
        __x_ABI_CWindows_CGaming_CInput_CIArcadeStick *args);

    END_INTERFACE
} __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStickVtbl;

interface __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick {
    CONST_VTBL __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStickVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick_Release(This) (This)->lpVtbl->Release(This)
/*** IEventHandler<ABI::Windows::Gaming::Input::ArcadeStick* > methods ***/
#define __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick_QueryInterface(__FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick_AddRef(__FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick_Release(__FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick* This) {
    return This->lpVtbl->Release(This);
}
/*** IEventHandler<ABI::Windows::Gaming::Input::ArcadeStick* > methods ***/
static __WIDL_INLINE HRESULT __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick_Invoke(__FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick* This,IInspectable *sender,__x_ABI_CWindows_CGaming_CInput_CIArcadeStick *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IEventHandler_ArcadeStick IID___FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick
#define IEventHandler_ArcadeStickVtbl __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStickVtbl
#define IEventHandler_ArcadeStick __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick
#define IEventHandler_ArcadeStick_QueryInterface __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick_QueryInterface
#define IEventHandler_ArcadeStick_AddRef __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick_AddRef
#define IEventHandler_ArcadeStick_Release __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick_Release
#define IEventHandler_ArcadeStick_Invoke __FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIEventHandler_1_Windows__CGaming__CInput__CArcadeStick_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEventHandler<ABI::Windows::Gaming::Input::FlightStick* > interface
 */
#ifndef ____FIEventHandler_1_Windows__CGaming__CInput__CFlightStick_INTERFACE_DEFINED__
#define ____FIEventHandler_1_Windows__CGaming__CInput__CFlightStick_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIEventHandler_1_Windows__CGaming__CInput__CFlightStick, 0xd57470b1, 0xcc22, 0x5a43, 0x8e,0x18, 0x5c,0xa0,0x64,0xaa,0xfe,0x21);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("d57470b1-cc22-5a43-8e18-5ca064aafe21")
            IEventHandler<ABI::Windows::Gaming::Input::FlightStick* > : IEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::FlightStick*, ABI::Windows::Gaming::Input::IFlightStick* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIEventHandler_1_Windows__CGaming__CInput__CFlightStick, 0xd57470b1, 0xcc22, 0x5a43, 0x8e,0x18, 0x5c,0xa0,0x64,0xaa,0xfe,0x21)
#endif
#else
typedef struct __FIEventHandler_1_Windows__CGaming__CInput__CFlightStickVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEventHandler<ABI::Windows::Gaming::Input::FlightStick* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIEventHandler_1_Windows__CGaming__CInput__CFlightStick *This,
        IInspectable *sender,
        __x_ABI_CWindows_CGaming_CInput_CIFlightStick *args);

    END_INTERFACE
} __FIEventHandler_1_Windows__CGaming__CInput__CFlightStickVtbl;

interface __FIEventHandler_1_Windows__CGaming__CInput__CFlightStick {
    CONST_VTBL __FIEventHandler_1_Windows__CGaming__CInput__CFlightStickVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIEventHandler_1_Windows__CGaming__CInput__CFlightStick_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIEventHandler_1_Windows__CGaming__CInput__CFlightStick_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIEventHandler_1_Windows__CGaming__CInput__CFlightStick_Release(This) (This)->lpVtbl->Release(This)
/*** IEventHandler<ABI::Windows::Gaming::Input::FlightStick* > methods ***/
#define __FIEventHandler_1_Windows__CGaming__CInput__CFlightStick_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIEventHandler_1_Windows__CGaming__CInput__CFlightStick_QueryInterface(__FIEventHandler_1_Windows__CGaming__CInput__CFlightStick* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIEventHandler_1_Windows__CGaming__CInput__CFlightStick_AddRef(__FIEventHandler_1_Windows__CGaming__CInput__CFlightStick* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIEventHandler_1_Windows__CGaming__CInput__CFlightStick_Release(__FIEventHandler_1_Windows__CGaming__CInput__CFlightStick* This) {
    return This->lpVtbl->Release(This);
}
/*** IEventHandler<ABI::Windows::Gaming::Input::FlightStick* > methods ***/
static __WIDL_INLINE HRESULT __FIEventHandler_1_Windows__CGaming__CInput__CFlightStick_Invoke(__FIEventHandler_1_Windows__CGaming__CInput__CFlightStick* This,IInspectable *sender,__x_ABI_CWindows_CGaming_CInput_CIFlightStick *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IEventHandler_FlightStick IID___FIEventHandler_1_Windows__CGaming__CInput__CFlightStick
#define IEventHandler_FlightStickVtbl __FIEventHandler_1_Windows__CGaming__CInput__CFlightStickVtbl
#define IEventHandler_FlightStick __FIEventHandler_1_Windows__CGaming__CInput__CFlightStick
#define IEventHandler_FlightStick_QueryInterface __FIEventHandler_1_Windows__CGaming__CInput__CFlightStick_QueryInterface
#define IEventHandler_FlightStick_AddRef __FIEventHandler_1_Windows__CGaming__CInput__CFlightStick_AddRef
#define IEventHandler_FlightStick_Release __FIEventHandler_1_Windows__CGaming__CInput__CFlightStick_Release
#define IEventHandler_FlightStick_Invoke __FIEventHandler_1_Windows__CGaming__CInput__CFlightStick_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIEventHandler_1_Windows__CGaming__CInput__CFlightStick_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEventHandler<ABI::Windows::Gaming::Input::Gamepad* > interface
 */
#ifndef ____FIEventHandler_1_Windows__CGaming__CInput__CGamepad_INTERFACE_DEFINED__
#define ____FIEventHandler_1_Windows__CGaming__CInput__CGamepad_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIEventHandler_1_Windows__CGaming__CInput__CGamepad, 0x8a7639ee, 0x624a, 0x501a, 0xbb,0x53, 0x56,0x2d,0x1e,0xc1,0x1b,0x52);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("8a7639ee-624a-501a-bb53-562d1ec11b52")
            IEventHandler<ABI::Windows::Gaming::Input::Gamepad* > : IEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::Gamepad*, ABI::Windows::Gaming::Input::IGamepad* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIEventHandler_1_Windows__CGaming__CInput__CGamepad, 0x8a7639ee, 0x624a, 0x501a, 0xbb,0x53, 0x56,0x2d,0x1e,0xc1,0x1b,0x52)
#endif
#else
typedef struct __FIEventHandler_1_Windows__CGaming__CInput__CGamepadVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEventHandler<ABI::Windows::Gaming::Input::Gamepad* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIEventHandler_1_Windows__CGaming__CInput__CGamepad *This,
        IInspectable *sender,
        __x_ABI_CWindows_CGaming_CInput_CIGamepad *args);

    END_INTERFACE
} __FIEventHandler_1_Windows__CGaming__CInput__CGamepadVtbl;

interface __FIEventHandler_1_Windows__CGaming__CInput__CGamepad {
    CONST_VTBL __FIEventHandler_1_Windows__CGaming__CInput__CGamepadVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIEventHandler_1_Windows__CGaming__CInput__CGamepad_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIEventHandler_1_Windows__CGaming__CInput__CGamepad_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIEventHandler_1_Windows__CGaming__CInput__CGamepad_Release(This) (This)->lpVtbl->Release(This)
/*** IEventHandler<ABI::Windows::Gaming::Input::Gamepad* > methods ***/
#define __FIEventHandler_1_Windows__CGaming__CInput__CGamepad_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIEventHandler_1_Windows__CGaming__CInput__CGamepad_QueryInterface(__FIEventHandler_1_Windows__CGaming__CInput__CGamepad* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIEventHandler_1_Windows__CGaming__CInput__CGamepad_AddRef(__FIEventHandler_1_Windows__CGaming__CInput__CGamepad* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIEventHandler_1_Windows__CGaming__CInput__CGamepad_Release(__FIEventHandler_1_Windows__CGaming__CInput__CGamepad* This) {
    return This->lpVtbl->Release(This);
}
/*** IEventHandler<ABI::Windows::Gaming::Input::Gamepad* > methods ***/
static __WIDL_INLINE HRESULT __FIEventHandler_1_Windows__CGaming__CInput__CGamepad_Invoke(__FIEventHandler_1_Windows__CGaming__CInput__CGamepad* This,IInspectable *sender,__x_ABI_CWindows_CGaming_CInput_CIGamepad *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IEventHandler_Gamepad IID___FIEventHandler_1_Windows__CGaming__CInput__CGamepad
#define IEventHandler_GamepadVtbl __FIEventHandler_1_Windows__CGaming__CInput__CGamepadVtbl
#define IEventHandler_Gamepad __FIEventHandler_1_Windows__CGaming__CInput__CGamepad
#define IEventHandler_Gamepad_QueryInterface __FIEventHandler_1_Windows__CGaming__CInput__CGamepad_QueryInterface
#define IEventHandler_Gamepad_AddRef __FIEventHandler_1_Windows__CGaming__CInput__CGamepad_AddRef
#define IEventHandler_Gamepad_Release __FIEventHandler_1_Windows__CGaming__CInput__CGamepad_Release
#define IEventHandler_Gamepad_Invoke __FIEventHandler_1_Windows__CGaming__CInput__CGamepad_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIEventHandler_1_Windows__CGaming__CInput__CGamepad_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEventHandler<ABI::Windows::Gaming::Input::RacingWheel* > interface
 */
#ifndef ____FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel_INTERFACE_DEFINED__
#define ____FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel, 0x352ec824, 0xf64b, 0x5353, 0x80,0xea, 0x7f,0xf5,0x8e,0x3b,0x92,0xa4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("352ec824-f64b-5353-80ea-7ff58e3b92a4")
            IEventHandler<ABI::Windows::Gaming::Input::RacingWheel* > : IEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::RacingWheel*, ABI::Windows::Gaming::Input::IRacingWheel* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel, 0x352ec824, 0xf64b, 0x5353, 0x80,0xea, 0x7f,0xf5,0x8e,0x3b,0x92,0xa4)
#endif
#else
typedef struct __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheelVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEventHandler<ABI::Windows::Gaming::Input::RacingWheel* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel *This,
        IInspectable *sender,
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel *args);

    END_INTERFACE
} __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheelVtbl;

interface __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel {
    CONST_VTBL __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel_Release(This) (This)->lpVtbl->Release(This)
/*** IEventHandler<ABI::Windows::Gaming::Input::RacingWheel* > methods ***/
#define __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel_QueryInterface(__FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel_AddRef(__FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel_Release(__FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel* This) {
    return This->lpVtbl->Release(This);
}
/*** IEventHandler<ABI::Windows::Gaming::Input::RacingWheel* > methods ***/
static __WIDL_INLINE HRESULT __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel_Invoke(__FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel* This,IInspectable *sender,__x_ABI_CWindows_CGaming_CInput_CIRacingWheel *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IEventHandler_RacingWheel IID___FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel
#define IEventHandler_RacingWheelVtbl __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheelVtbl
#define IEventHandler_RacingWheel __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel
#define IEventHandler_RacingWheel_QueryInterface __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel_QueryInterface
#define IEventHandler_RacingWheel_AddRef __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel_AddRef
#define IEventHandler_RacingWheel_Release __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel_Release
#define IEventHandler_RacingWheel_Invoke __FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIEventHandler_1_Windows__CGaming__CInput__CRacingWheel_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEventHandler<ABI::Windows::Gaming::Input::RawGameController* > interface
 */
#ifndef ____FIEventHandler_1_Windows__CGaming__CInput__CRawGameController_INTERFACE_DEFINED__
#define ____FIEventHandler_1_Windows__CGaming__CInput__CRawGameController_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIEventHandler_1_Windows__CGaming__CInput__CRawGameController, 0x00621c22, 0x42e8, 0x529f, 0x92,0x70, 0x83,0x6b,0x32,0x93,0x1d,0x72);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("00621c22-42e8-529f-9270-836b32931d72")
            IEventHandler<ABI::Windows::Gaming::Input::RawGameController* > : IEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::RawGameController*, ABI::Windows::Gaming::Input::IRawGameController* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIEventHandler_1_Windows__CGaming__CInput__CRawGameController, 0x00621c22, 0x42e8, 0x529f, 0x92,0x70, 0x83,0x6b,0x32,0x93,0x1d,0x72)
#endif
#else
typedef struct __FIEventHandler_1_Windows__CGaming__CInput__CRawGameControllerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEventHandler<ABI::Windows::Gaming::Input::RawGameController* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIEventHandler_1_Windows__CGaming__CInput__CRawGameController *This,
        IInspectable *sender,
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController *args);

    END_INTERFACE
} __FIEventHandler_1_Windows__CGaming__CInput__CRawGameControllerVtbl;

interface __FIEventHandler_1_Windows__CGaming__CInput__CRawGameController {
    CONST_VTBL __FIEventHandler_1_Windows__CGaming__CInput__CRawGameControllerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIEventHandler_1_Windows__CGaming__CInput__CRawGameController_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIEventHandler_1_Windows__CGaming__CInput__CRawGameController_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIEventHandler_1_Windows__CGaming__CInput__CRawGameController_Release(This) (This)->lpVtbl->Release(This)
/*** IEventHandler<ABI::Windows::Gaming::Input::RawGameController* > methods ***/
#define __FIEventHandler_1_Windows__CGaming__CInput__CRawGameController_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIEventHandler_1_Windows__CGaming__CInput__CRawGameController_QueryInterface(__FIEventHandler_1_Windows__CGaming__CInput__CRawGameController* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIEventHandler_1_Windows__CGaming__CInput__CRawGameController_AddRef(__FIEventHandler_1_Windows__CGaming__CInput__CRawGameController* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIEventHandler_1_Windows__CGaming__CInput__CRawGameController_Release(__FIEventHandler_1_Windows__CGaming__CInput__CRawGameController* This) {
    return This->lpVtbl->Release(This);
}
/*** IEventHandler<ABI::Windows::Gaming::Input::RawGameController* > methods ***/
static __WIDL_INLINE HRESULT __FIEventHandler_1_Windows__CGaming__CInput__CRawGameController_Invoke(__FIEventHandler_1_Windows__CGaming__CInput__CRawGameController* This,IInspectable *sender,__x_ABI_CWindows_CGaming_CInput_CIRawGameController *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IEventHandler_RawGameController IID___FIEventHandler_1_Windows__CGaming__CInput__CRawGameController
#define IEventHandler_RawGameControllerVtbl __FIEventHandler_1_Windows__CGaming__CInput__CRawGameControllerVtbl
#define IEventHandler_RawGameController __FIEventHandler_1_Windows__CGaming__CInput__CRawGameController
#define IEventHandler_RawGameController_QueryInterface __FIEventHandler_1_Windows__CGaming__CInput__CRawGameController_QueryInterface
#define IEventHandler_RawGameController_AddRef __FIEventHandler_1_Windows__CGaming__CInput__CRawGameController_AddRef
#define IEventHandler_RawGameController_Release __FIEventHandler_1_Windows__CGaming__CInput__CRawGameController_Release
#define IEventHandler_RawGameController_Invoke __FIEventHandler_1_Windows__CGaming__CInput__CRawGameController_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIEventHandler_1_Windows__CGaming__CInput__CRawGameController_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::Gaming::Input::IGameController*,ABI::Windows::Gaming::Input::Headset* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset, 0x07b2f2b7, 0x8825, 0x5c4e, 0xa0,0x52, 0xfc,0xfe,0xdf,0x3a,0xee,0xa1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("07b2f2b7-8825-5c4e-a052-fcfedf3aeea1")
            ITypedEventHandler<ABI::Windows::Gaming::Input::IGameController*,ABI::Windows::Gaming::Input::Headset* > : ITypedEventHandler_impl<ABI::Windows::Gaming::Input::IGameController*, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::Headset*, ABI::Windows::Gaming::Input::IHeadset* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset, 0x07b2f2b7, 0x8825, 0x5c4e, 0xa0,0x52, 0xfc,0xfe,0xdf,0x3a,0xee,0xa1)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadsetVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::Gaming::Input::IGameController*,ABI::Windows::Gaming::Input::Headset* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset *This,
        __x_ABI_CWindows_CGaming_CInput_CIGameController *sender,
        __x_ABI_CWindows_CGaming_CInput_CIHeadset *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadsetVtbl;

interface __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset {
    CONST_VTBL __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadsetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::Gaming::Input::IGameController*,ABI::Windows::Gaming::Input::Headset* > methods ***/
#define __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset_QueryInterface(__FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset_AddRef(__FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset_Release(__FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::Gaming::Input::IGameController*,ABI::Windows::Gaming::Input::Headset* > methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset_Invoke(__FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset* This,__x_ABI_CWindows_CGaming_CInput_CIGameController *sender,__x_ABI_CWindows_CGaming_CInput_CIHeadset *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_IGameController_Headset IID___FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset
#define ITypedEventHandler_IGameController_HeadsetVtbl __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadsetVtbl
#define ITypedEventHandler_IGameController_Headset __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset
#define ITypedEventHandler_IGameController_Headset_QueryInterface __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset_QueryInterface
#define ITypedEventHandler_IGameController_Headset_AddRef __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset_AddRef
#define ITypedEventHandler_IGameController_Headset_Release __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset_Release
#define ITypedEventHandler_IGameController_Headset_Invoke __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CGaming__CInput__CHeadset_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::Gaming::Input::IGameController*,ABI::Windows::System::UserChangedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs, 0xcb753f2c, 0x2f36, 0x5a8f, 0xad,0xad, 0x05,0x7b,0xea,0xe7,0x3a,0xa4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("cb753f2c-2f36-5a8f-adad-057beae73aa4")
            ITypedEventHandler<ABI::Windows::Gaming::Input::IGameController*,ABI::Windows::System::UserChangedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Gaming::Input::IGameController*, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::System::UserChangedEventArgs*, ABI::Windows::System::IUserChangedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs, 0xcb753f2c, 0x2f36, 0x5a8f, 0xad,0xad, 0x05,0x7b,0xea,0xe7,0x3a,0xa4)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::Gaming::Input::IGameController*,ABI::Windows::System::UserChangedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs *This,
        __x_ABI_CWindows_CGaming_CInput_CIGameController *sender,
        __x_ABI_CWindows_CSystem_CIUserChangedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::Gaming::Input::IGameController*,ABI::Windows::System::UserChangedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs_Release(__FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::Gaming::Input::IGameController*,ABI::Windows::System::UserChangedEventArgs* > methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs* This,__x_ABI_CWindows_CGaming_CInput_CIGameController *sender,__x_ABI_CWindows_CSystem_CIUserChangedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_IGameController_UserChangedEventArgs IID___FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs
#define ITypedEventHandler_IGameController_UserChangedEventArgsVtbl __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgsVtbl
#define ITypedEventHandler_IGameController_UserChangedEventArgs __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs
#define ITypedEventHandler_IGameController_UserChangedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs_QueryInterface
#define ITypedEventHandler_IGameController_UserChangedEventArgs_AddRef __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs_AddRef
#define ITypedEventHandler_IGameController_UserChangedEventArgs_Release __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs_Release
#define ITypedEventHandler_IGameController_UserChangedEventArgs_Invoke __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Gaming::Input::ArcadeStick* > interface
 */
#ifndef ____FIIterator_1_Windows__CGaming__CInput__CArcadeStick_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CGaming__CInput__CArcadeStick_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CGaming__CInput__CArcadeStick, 0xd30629af, 0xcc9d, 0x52e1, 0x8b,0x1f, 0x0f,0xfa,0x96,0x29,0xaf,0xee);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("d30629af-cc9d-52e1-8b1f-0ffa9629afee")
                IIterator<ABI::Windows::Gaming::Input::ArcadeStick* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::ArcadeStick*, ABI::Windows::Gaming::Input::IArcadeStick* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CGaming__CInput__CArcadeStick, 0xd30629af, 0xcc9d, 0x52e1, 0x8b,0x1f, 0x0f,0xfa,0x96,0x29,0xaf,0xee)
#endif
#else
typedef struct __FIIterator_1_Windows__CGaming__CInput__CArcadeStickVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::Gaming::Input::ArcadeStick* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CGaming__CInput__CArcadeStick *This,
        __x_ABI_CWindows_CGaming_CInput_CIArcadeStick **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CGaming__CInput__CArcadeStick *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CGaming__CInput__CArcadeStick *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CGaming__CInput__CArcadeStick *This,
        UINT32 items_size,
        __x_ABI_CWindows_CGaming_CInput_CIArcadeStick **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CGaming__CInput__CArcadeStickVtbl;

interface __FIIterator_1_Windows__CGaming__CInput__CArcadeStick {
    CONST_VTBL __FIIterator_1_Windows__CGaming__CInput__CArcadeStickVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Gaming::Input::ArcadeStick* > methods ***/
#define __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_QueryInterface(__FIIterator_1_Windows__CGaming__CInput__CArcadeStick* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_AddRef(__FIIterator_1_Windows__CGaming__CInput__CArcadeStick* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_Release(__FIIterator_1_Windows__CGaming__CInput__CArcadeStick* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_GetIids(__FIIterator_1_Windows__CGaming__CInput__CArcadeStick* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_GetRuntimeClassName(__FIIterator_1_Windows__CGaming__CInput__CArcadeStick* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_GetTrustLevel(__FIIterator_1_Windows__CGaming__CInput__CArcadeStick* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Gaming::Input::ArcadeStick* > methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_get_Current(__FIIterator_1_Windows__CGaming__CInput__CArcadeStick* This,__x_ABI_CWindows_CGaming_CInput_CIArcadeStick **value) {
    return This->lpVtbl->get_Current(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_get_HasCurrent(__FIIterator_1_Windows__CGaming__CInput__CArcadeStick* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_MoveNext(__FIIterator_1_Windows__CGaming__CInput__CArcadeStick* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_GetMany(__FIIterator_1_Windows__CGaming__CInput__CArcadeStick* This,UINT32 items_size,__x_ABI_CWindows_CGaming_CInput_CIArcadeStick **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_ArcadeStick IID___FIIterator_1_Windows__CGaming__CInput__CArcadeStick
#define IIterator_ArcadeStickVtbl __FIIterator_1_Windows__CGaming__CInput__CArcadeStickVtbl
#define IIterator_ArcadeStick __FIIterator_1_Windows__CGaming__CInput__CArcadeStick
#define IIterator_ArcadeStick_QueryInterface __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_QueryInterface
#define IIterator_ArcadeStick_AddRef __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_AddRef
#define IIterator_ArcadeStick_Release __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_Release
#define IIterator_ArcadeStick_GetIids __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_GetIids
#define IIterator_ArcadeStick_GetRuntimeClassName __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_GetRuntimeClassName
#define IIterator_ArcadeStick_GetTrustLevel __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_GetTrustLevel
#define IIterator_ArcadeStick_get_Current __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_get_Current
#define IIterator_ArcadeStick_get_HasCurrent __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_get_HasCurrent
#define IIterator_ArcadeStick_MoveNext __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_MoveNext
#define IIterator_ArcadeStick_GetMany __FIIterator_1_Windows__CGaming__CInput__CArcadeStick_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CGaming__CInput__CArcadeStick_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::Gaming::Input::ArcadeStick* > interface
 */
#ifndef ____FIIterable_1_Windows__CGaming__CInput__CArcadeStick_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CGaming__CInput__CArcadeStick_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CGaming__CInput__CArcadeStick, 0x9376f457, 0x2da5, 0x544a, 0xa4,0x09, 0xc6,0x36,0xf5,0xd8,0x1c,0x35);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("9376f457-2da5-544a-a409-c636f5d81c35")
                IIterable<ABI::Windows::Gaming::Input::ArcadeStick* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::ArcadeStick*, ABI::Windows::Gaming::Input::IArcadeStick* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CGaming__CInput__CArcadeStick, 0x9376f457, 0x2da5, 0x544a, 0xa4,0x09, 0xc6,0x36,0xf5,0xd8,0x1c,0x35)
#endif
#else
typedef struct __FIIterable_1_Windows__CGaming__CInput__CArcadeStickVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Gaming::Input::ArcadeStick* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CGaming__CInput__CArcadeStick *This,
        __FIIterator_1_Windows__CGaming__CInput__CArcadeStick **value);

    END_INTERFACE
} __FIIterable_1_Windows__CGaming__CInput__CArcadeStickVtbl;

interface __FIIterable_1_Windows__CGaming__CInput__CArcadeStick {
    CONST_VTBL __FIIterable_1_Windows__CGaming__CInput__CArcadeStickVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Gaming::Input::ArcadeStick* > methods ***/
#define __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_QueryInterface(__FIIterable_1_Windows__CGaming__CInput__CArcadeStick* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_AddRef(__FIIterable_1_Windows__CGaming__CInput__CArcadeStick* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_Release(__FIIterable_1_Windows__CGaming__CInput__CArcadeStick* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_GetIids(__FIIterable_1_Windows__CGaming__CInput__CArcadeStick* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_GetRuntimeClassName(__FIIterable_1_Windows__CGaming__CInput__CArcadeStick* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_GetTrustLevel(__FIIterable_1_Windows__CGaming__CInput__CArcadeStick* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Gaming::Input::ArcadeStick* > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_First(__FIIterable_1_Windows__CGaming__CInput__CArcadeStick* This,__FIIterator_1_Windows__CGaming__CInput__CArcadeStick **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_ArcadeStick IID___FIIterable_1_Windows__CGaming__CInput__CArcadeStick
#define IIterable_ArcadeStickVtbl __FIIterable_1_Windows__CGaming__CInput__CArcadeStickVtbl
#define IIterable_ArcadeStick __FIIterable_1_Windows__CGaming__CInput__CArcadeStick
#define IIterable_ArcadeStick_QueryInterface __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_QueryInterface
#define IIterable_ArcadeStick_AddRef __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_AddRef
#define IIterable_ArcadeStick_Release __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_Release
#define IIterable_ArcadeStick_GetIids __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_GetIids
#define IIterable_ArcadeStick_GetRuntimeClassName __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_GetRuntimeClassName
#define IIterable_ArcadeStick_GetTrustLevel __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_GetTrustLevel
#define IIterable_ArcadeStick_First __FIIterable_1_Windows__CGaming__CInput__CArcadeStick_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CGaming__CInput__CArcadeStick_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Gaming::Input::ArcadeStick* > interface
 */
#ifndef ____FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CGaming__CInput__CArcadeStick, 0xbecace75, 0xd0cd, 0x5a9c, 0x84,0x5f, 0x72,0xf0,0x85,0x50,0x3c,0xdf);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("becace75-d0cd-5a9c-845f-72f085503cdf")
                IVectorView<ABI::Windows::Gaming::Input::ArcadeStick* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::ArcadeStick*, ABI::Windows::Gaming::Input::IArcadeStick* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CGaming__CInput__CArcadeStick, 0xbecace75, 0xd0cd, 0x5a9c, 0x84,0x5f, 0x72,0xf0,0x85,0x50,0x3c,0xdf)
#endif
#else
typedef struct __FIVectorView_1_Windows__CGaming__CInput__CArcadeStickVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Gaming::Input::ArcadeStick* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick *This,
        UINT32 index,
        __x_ABI_CWindows_CGaming_CInput_CIArcadeStick **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick *This,
        __x_ABI_CWindows_CGaming_CInput_CIArcadeStick *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CGaming_CInput_CIArcadeStick **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CGaming__CInput__CArcadeStickVtbl;

interface __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick {
    CONST_VTBL __FIVectorView_1_Windows__CGaming__CInput__CArcadeStickVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Gaming::Input::ArcadeStick* > methods ***/
#define __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_QueryInterface(__FIVectorView_1_Windows__CGaming__CInput__CArcadeStick* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_AddRef(__FIVectorView_1_Windows__CGaming__CInput__CArcadeStick* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_Release(__FIVectorView_1_Windows__CGaming__CInput__CArcadeStick* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_GetIids(__FIVectorView_1_Windows__CGaming__CInput__CArcadeStick* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_GetRuntimeClassName(__FIVectorView_1_Windows__CGaming__CInput__CArcadeStick* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_GetTrustLevel(__FIVectorView_1_Windows__CGaming__CInput__CArcadeStick* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Gaming::Input::ArcadeStick* > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_GetAt(__FIVectorView_1_Windows__CGaming__CInput__CArcadeStick* This,UINT32 index,__x_ABI_CWindows_CGaming_CInput_CIArcadeStick **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_get_Size(__FIVectorView_1_Windows__CGaming__CInput__CArcadeStick* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_IndexOf(__FIVectorView_1_Windows__CGaming__CInput__CArcadeStick* This,__x_ABI_CWindows_CGaming_CInput_CIArcadeStick *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_GetMany(__FIVectorView_1_Windows__CGaming__CInput__CArcadeStick* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CGaming_CInput_CIArcadeStick **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_ArcadeStick IID___FIVectorView_1_Windows__CGaming__CInput__CArcadeStick
#define IVectorView_ArcadeStickVtbl __FIVectorView_1_Windows__CGaming__CInput__CArcadeStickVtbl
#define IVectorView_ArcadeStick __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick
#define IVectorView_ArcadeStick_QueryInterface __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_QueryInterface
#define IVectorView_ArcadeStick_AddRef __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_AddRef
#define IVectorView_ArcadeStick_Release __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_Release
#define IVectorView_ArcadeStick_GetIids __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_GetIids
#define IVectorView_ArcadeStick_GetRuntimeClassName __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_GetRuntimeClassName
#define IVectorView_ArcadeStick_GetTrustLevel __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_GetTrustLevel
#define IVectorView_ArcadeStick_GetAt __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_GetAt
#define IVectorView_ArcadeStick_get_Size __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_get_Size
#define IVectorView_ArcadeStick_IndexOf __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_IndexOf
#define IVectorView_ArcadeStick_GetMany __FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CGaming__CInput__CArcadeStick_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Gaming::Input::FlightStick* > interface
 */
#ifndef ____FIIterator_1_Windows__CGaming__CInput__CFlightStick_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CGaming__CInput__CFlightStick_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CGaming__CInput__CFlightStick, 0xf5fa1919, 0x3f18, 0x5560, 0xbb,0x13, 0xcf,0x70,0x18,0xac,0x41,0xd5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("f5fa1919-3f18-5560-bb13-cf7018ac41d5")
                IIterator<ABI::Windows::Gaming::Input::FlightStick* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::FlightStick*, ABI::Windows::Gaming::Input::IFlightStick* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CGaming__CInput__CFlightStick, 0xf5fa1919, 0x3f18, 0x5560, 0xbb,0x13, 0xcf,0x70,0x18,0xac,0x41,0xd5)
#endif
#else
typedef struct __FIIterator_1_Windows__CGaming__CInput__CFlightStickVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::Gaming::Input::FlightStick* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CGaming__CInput__CFlightStick *This,
        __x_ABI_CWindows_CGaming_CInput_CIFlightStick **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CGaming__CInput__CFlightStick *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CGaming__CInput__CFlightStick *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CGaming__CInput__CFlightStick *This,
        UINT32 items_size,
        __x_ABI_CWindows_CGaming_CInput_CIFlightStick **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CGaming__CInput__CFlightStickVtbl;

interface __FIIterator_1_Windows__CGaming__CInput__CFlightStick {
    CONST_VTBL __FIIterator_1_Windows__CGaming__CInput__CFlightStickVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CGaming__CInput__CFlightStick_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CGaming__CInput__CFlightStick_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CGaming__CInput__CFlightStick_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CGaming__CInput__CFlightStick_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CGaming__CInput__CFlightStick_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CGaming__CInput__CFlightStick_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Gaming::Input::FlightStick* > methods ***/
#define __FIIterator_1_Windows__CGaming__CInput__CFlightStick_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CGaming__CInput__CFlightStick_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CGaming__CInput__CFlightStick_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CGaming__CInput__CFlightStick_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CFlightStick_QueryInterface(__FIIterator_1_Windows__CGaming__CInput__CFlightStick* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CGaming__CInput__CFlightStick_AddRef(__FIIterator_1_Windows__CGaming__CInput__CFlightStick* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CGaming__CInput__CFlightStick_Release(__FIIterator_1_Windows__CGaming__CInput__CFlightStick* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CFlightStick_GetIids(__FIIterator_1_Windows__CGaming__CInput__CFlightStick* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CFlightStick_GetRuntimeClassName(__FIIterator_1_Windows__CGaming__CInput__CFlightStick* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CFlightStick_GetTrustLevel(__FIIterator_1_Windows__CGaming__CInput__CFlightStick* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Gaming::Input::FlightStick* > methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CFlightStick_get_Current(__FIIterator_1_Windows__CGaming__CInput__CFlightStick* This,__x_ABI_CWindows_CGaming_CInput_CIFlightStick **value) {
    return This->lpVtbl->get_Current(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CFlightStick_get_HasCurrent(__FIIterator_1_Windows__CGaming__CInput__CFlightStick* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CFlightStick_MoveNext(__FIIterator_1_Windows__CGaming__CInput__CFlightStick* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CFlightStick_GetMany(__FIIterator_1_Windows__CGaming__CInput__CFlightStick* This,UINT32 items_size,__x_ABI_CWindows_CGaming_CInput_CIFlightStick **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_FlightStick IID___FIIterator_1_Windows__CGaming__CInput__CFlightStick
#define IIterator_FlightStickVtbl __FIIterator_1_Windows__CGaming__CInput__CFlightStickVtbl
#define IIterator_FlightStick __FIIterator_1_Windows__CGaming__CInput__CFlightStick
#define IIterator_FlightStick_QueryInterface __FIIterator_1_Windows__CGaming__CInput__CFlightStick_QueryInterface
#define IIterator_FlightStick_AddRef __FIIterator_1_Windows__CGaming__CInput__CFlightStick_AddRef
#define IIterator_FlightStick_Release __FIIterator_1_Windows__CGaming__CInput__CFlightStick_Release
#define IIterator_FlightStick_GetIids __FIIterator_1_Windows__CGaming__CInput__CFlightStick_GetIids
#define IIterator_FlightStick_GetRuntimeClassName __FIIterator_1_Windows__CGaming__CInput__CFlightStick_GetRuntimeClassName
#define IIterator_FlightStick_GetTrustLevel __FIIterator_1_Windows__CGaming__CInput__CFlightStick_GetTrustLevel
#define IIterator_FlightStick_get_Current __FIIterator_1_Windows__CGaming__CInput__CFlightStick_get_Current
#define IIterator_FlightStick_get_HasCurrent __FIIterator_1_Windows__CGaming__CInput__CFlightStick_get_HasCurrent
#define IIterator_FlightStick_MoveNext __FIIterator_1_Windows__CGaming__CInput__CFlightStick_MoveNext
#define IIterator_FlightStick_GetMany __FIIterator_1_Windows__CGaming__CInput__CFlightStick_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CGaming__CInput__CFlightStick_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::Gaming::Input::FlightStick* > interface
 */
#ifndef ____FIIterable_1_Windows__CGaming__CInput__CFlightStick_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CGaming__CInput__CFlightStick_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CGaming__CInput__CFlightStick, 0x3b7fc175, 0xbebe, 0x52ef, 0xa3,0xe9, 0xdd,0xa7,0x5e,0xa1,0xac,0xfc);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("3b7fc175-bebe-52ef-a3e9-dda75ea1acfc")
                IIterable<ABI::Windows::Gaming::Input::FlightStick* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::FlightStick*, ABI::Windows::Gaming::Input::IFlightStick* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CGaming__CInput__CFlightStick, 0x3b7fc175, 0xbebe, 0x52ef, 0xa3,0xe9, 0xdd,0xa7,0x5e,0xa1,0xac,0xfc)
#endif
#else
typedef struct __FIIterable_1_Windows__CGaming__CInput__CFlightStickVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Gaming::Input::FlightStick* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CGaming__CInput__CFlightStick *This,
        __FIIterator_1_Windows__CGaming__CInput__CFlightStick **value);

    END_INTERFACE
} __FIIterable_1_Windows__CGaming__CInput__CFlightStickVtbl;

interface __FIIterable_1_Windows__CGaming__CInput__CFlightStick {
    CONST_VTBL __FIIterable_1_Windows__CGaming__CInput__CFlightStickVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CGaming__CInput__CFlightStick_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CGaming__CInput__CFlightStick_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CGaming__CInput__CFlightStick_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CGaming__CInput__CFlightStick_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CGaming__CInput__CFlightStick_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CGaming__CInput__CFlightStick_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Gaming::Input::FlightStick* > methods ***/
#define __FIIterable_1_Windows__CGaming__CInput__CFlightStick_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CFlightStick_QueryInterface(__FIIterable_1_Windows__CGaming__CInput__CFlightStick* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CGaming__CInput__CFlightStick_AddRef(__FIIterable_1_Windows__CGaming__CInput__CFlightStick* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CGaming__CInput__CFlightStick_Release(__FIIterable_1_Windows__CGaming__CInput__CFlightStick* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CFlightStick_GetIids(__FIIterable_1_Windows__CGaming__CInput__CFlightStick* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CFlightStick_GetRuntimeClassName(__FIIterable_1_Windows__CGaming__CInput__CFlightStick* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CFlightStick_GetTrustLevel(__FIIterable_1_Windows__CGaming__CInput__CFlightStick* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Gaming::Input::FlightStick* > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CFlightStick_First(__FIIterable_1_Windows__CGaming__CInput__CFlightStick* This,__FIIterator_1_Windows__CGaming__CInput__CFlightStick **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_FlightStick IID___FIIterable_1_Windows__CGaming__CInput__CFlightStick
#define IIterable_FlightStickVtbl __FIIterable_1_Windows__CGaming__CInput__CFlightStickVtbl
#define IIterable_FlightStick __FIIterable_1_Windows__CGaming__CInput__CFlightStick
#define IIterable_FlightStick_QueryInterface __FIIterable_1_Windows__CGaming__CInput__CFlightStick_QueryInterface
#define IIterable_FlightStick_AddRef __FIIterable_1_Windows__CGaming__CInput__CFlightStick_AddRef
#define IIterable_FlightStick_Release __FIIterable_1_Windows__CGaming__CInput__CFlightStick_Release
#define IIterable_FlightStick_GetIids __FIIterable_1_Windows__CGaming__CInput__CFlightStick_GetIids
#define IIterable_FlightStick_GetRuntimeClassName __FIIterable_1_Windows__CGaming__CInput__CFlightStick_GetRuntimeClassName
#define IIterable_FlightStick_GetTrustLevel __FIIterable_1_Windows__CGaming__CInput__CFlightStick_GetTrustLevel
#define IIterable_FlightStick_First __FIIterable_1_Windows__CGaming__CInput__CFlightStick_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CGaming__CInput__CFlightStick_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Gaming::Input::FlightStick* > interface
 */
#ifndef ____FIVectorView_1_Windows__CGaming__CInput__CFlightStick_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CGaming__CInput__CFlightStick_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CGaming__CInput__CFlightStick, 0x8b9d067e, 0xb6f5, 0x592f, 0xa9,0x0a, 0xd7,0x2c,0x3d,0x98,0xd4,0xda);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("8b9d067e-b6f5-592f-a90a-d72c3d98d4da")
                IVectorView<ABI::Windows::Gaming::Input::FlightStick* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::FlightStick*, ABI::Windows::Gaming::Input::IFlightStick* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CGaming__CInput__CFlightStick, 0x8b9d067e, 0xb6f5, 0x592f, 0xa9,0x0a, 0xd7,0x2c,0x3d,0x98,0xd4,0xda)
#endif
#else
typedef struct __FIVectorView_1_Windows__CGaming__CInput__CFlightStickVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Gaming::Input::FlightStick* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CGaming__CInput__CFlightStick *This,
        UINT32 index,
        __x_ABI_CWindows_CGaming_CInput_CIFlightStick **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CGaming__CInput__CFlightStick *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CGaming__CInput__CFlightStick *This,
        __x_ABI_CWindows_CGaming_CInput_CIFlightStick *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CGaming__CInput__CFlightStick *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CGaming_CInput_CIFlightStick **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CGaming__CInput__CFlightStickVtbl;

interface __FIVectorView_1_Windows__CGaming__CInput__CFlightStick {
    CONST_VTBL __FIVectorView_1_Windows__CGaming__CInput__CFlightStickVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Gaming::Input::FlightStick* > methods ***/
#define __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_QueryInterface(__FIVectorView_1_Windows__CGaming__CInput__CFlightStick* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_AddRef(__FIVectorView_1_Windows__CGaming__CInput__CFlightStick* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_Release(__FIVectorView_1_Windows__CGaming__CInput__CFlightStick* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_GetIids(__FIVectorView_1_Windows__CGaming__CInput__CFlightStick* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_GetRuntimeClassName(__FIVectorView_1_Windows__CGaming__CInput__CFlightStick* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_GetTrustLevel(__FIVectorView_1_Windows__CGaming__CInput__CFlightStick* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Gaming::Input::FlightStick* > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_GetAt(__FIVectorView_1_Windows__CGaming__CInput__CFlightStick* This,UINT32 index,__x_ABI_CWindows_CGaming_CInput_CIFlightStick **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_get_Size(__FIVectorView_1_Windows__CGaming__CInput__CFlightStick* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_IndexOf(__FIVectorView_1_Windows__CGaming__CInput__CFlightStick* This,__x_ABI_CWindows_CGaming_CInput_CIFlightStick *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_GetMany(__FIVectorView_1_Windows__CGaming__CInput__CFlightStick* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CGaming_CInput_CIFlightStick **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_FlightStick IID___FIVectorView_1_Windows__CGaming__CInput__CFlightStick
#define IVectorView_FlightStickVtbl __FIVectorView_1_Windows__CGaming__CInput__CFlightStickVtbl
#define IVectorView_FlightStick __FIVectorView_1_Windows__CGaming__CInput__CFlightStick
#define IVectorView_FlightStick_QueryInterface __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_QueryInterface
#define IVectorView_FlightStick_AddRef __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_AddRef
#define IVectorView_FlightStick_Release __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_Release
#define IVectorView_FlightStick_GetIids __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_GetIids
#define IVectorView_FlightStick_GetRuntimeClassName __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_GetRuntimeClassName
#define IVectorView_FlightStick_GetTrustLevel __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_GetTrustLevel
#define IVectorView_FlightStick_GetAt __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_GetAt
#define IVectorView_FlightStick_get_Size __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_get_Size
#define IVectorView_FlightStick_IndexOf __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_IndexOf
#define IVectorView_FlightStick_GetMany __FIVectorView_1_Windows__CGaming__CInput__CFlightStick_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CGaming__CInput__CFlightStick_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Gaming::Input::Gamepad* > interface
 */
#ifndef ____FIIterator_1_Windows__CGaming__CInput__CGamepad_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CGaming__CInput__CGamepad_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CGaming__CInput__CGamepad, 0x246737e8, 0x12bc, 0x5c64, 0xaf,0x52, 0x06,0xdb,0x4b,0x13,0xfa,0x2f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("246737e8-12bc-5c64-af52-06db4b13fa2f")
                IIterator<ABI::Windows::Gaming::Input::Gamepad* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::Gamepad*, ABI::Windows::Gaming::Input::IGamepad* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CGaming__CInput__CGamepad, 0x246737e8, 0x12bc, 0x5c64, 0xaf,0x52, 0x06,0xdb,0x4b,0x13,0xfa,0x2f)
#endif
#else
typedef struct __FIIterator_1_Windows__CGaming__CInput__CGamepadVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::Gaming::Input::Gamepad* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CGaming__CInput__CGamepad *This,
        __x_ABI_CWindows_CGaming_CInput_CIGamepad **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CGaming__CInput__CGamepad *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CGaming__CInput__CGamepad *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CGaming__CInput__CGamepad *This,
        UINT32 items_size,
        __x_ABI_CWindows_CGaming_CInput_CIGamepad **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CGaming__CInput__CGamepadVtbl;

interface __FIIterator_1_Windows__CGaming__CInput__CGamepad {
    CONST_VTBL __FIIterator_1_Windows__CGaming__CInput__CGamepadVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CGaming__CInput__CGamepad_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CGaming__CInput__CGamepad_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CGaming__CInput__CGamepad_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CGaming__CInput__CGamepad_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CGaming__CInput__CGamepad_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CGaming__CInput__CGamepad_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Gaming::Input::Gamepad* > methods ***/
#define __FIIterator_1_Windows__CGaming__CInput__CGamepad_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CGaming__CInput__CGamepad_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CGaming__CInput__CGamepad_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CGaming__CInput__CGamepad_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CGamepad_QueryInterface(__FIIterator_1_Windows__CGaming__CInput__CGamepad* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CGaming__CInput__CGamepad_AddRef(__FIIterator_1_Windows__CGaming__CInput__CGamepad* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CGaming__CInput__CGamepad_Release(__FIIterator_1_Windows__CGaming__CInput__CGamepad* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CGamepad_GetIids(__FIIterator_1_Windows__CGaming__CInput__CGamepad* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CGamepad_GetRuntimeClassName(__FIIterator_1_Windows__CGaming__CInput__CGamepad* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CGamepad_GetTrustLevel(__FIIterator_1_Windows__CGaming__CInput__CGamepad* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Gaming::Input::Gamepad* > methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CGamepad_get_Current(__FIIterator_1_Windows__CGaming__CInput__CGamepad* This,__x_ABI_CWindows_CGaming_CInput_CIGamepad **value) {
    return This->lpVtbl->get_Current(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CGamepad_get_HasCurrent(__FIIterator_1_Windows__CGaming__CInput__CGamepad* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CGamepad_MoveNext(__FIIterator_1_Windows__CGaming__CInput__CGamepad* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CGamepad_GetMany(__FIIterator_1_Windows__CGaming__CInput__CGamepad* This,UINT32 items_size,__x_ABI_CWindows_CGaming_CInput_CIGamepad **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_Gamepad IID___FIIterator_1_Windows__CGaming__CInput__CGamepad
#define IIterator_GamepadVtbl __FIIterator_1_Windows__CGaming__CInput__CGamepadVtbl
#define IIterator_Gamepad __FIIterator_1_Windows__CGaming__CInput__CGamepad
#define IIterator_Gamepad_QueryInterface __FIIterator_1_Windows__CGaming__CInput__CGamepad_QueryInterface
#define IIterator_Gamepad_AddRef __FIIterator_1_Windows__CGaming__CInput__CGamepad_AddRef
#define IIterator_Gamepad_Release __FIIterator_1_Windows__CGaming__CInput__CGamepad_Release
#define IIterator_Gamepad_GetIids __FIIterator_1_Windows__CGaming__CInput__CGamepad_GetIids
#define IIterator_Gamepad_GetRuntimeClassName __FIIterator_1_Windows__CGaming__CInput__CGamepad_GetRuntimeClassName
#define IIterator_Gamepad_GetTrustLevel __FIIterator_1_Windows__CGaming__CInput__CGamepad_GetTrustLevel
#define IIterator_Gamepad_get_Current __FIIterator_1_Windows__CGaming__CInput__CGamepad_get_Current
#define IIterator_Gamepad_get_HasCurrent __FIIterator_1_Windows__CGaming__CInput__CGamepad_get_HasCurrent
#define IIterator_Gamepad_MoveNext __FIIterator_1_Windows__CGaming__CInput__CGamepad_MoveNext
#define IIterator_Gamepad_GetMany __FIIterator_1_Windows__CGaming__CInput__CGamepad_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CGaming__CInput__CGamepad_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::Gaming::Input::Gamepad* > interface
 */
#ifndef ____FIIterable_1_Windows__CGaming__CInput__CGamepad_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CGaming__CInput__CGamepad_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CGaming__CInput__CGamepad, 0x47132ba0, 0x6b17, 0x5cd2, 0xa8,0xbd, 0xb5,0xd3,0x44,0x3c,0xcb,0x13);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("47132ba0-6b17-5cd2-a8bd-b5d3443ccb13")
                IIterable<ABI::Windows::Gaming::Input::Gamepad* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::Gamepad*, ABI::Windows::Gaming::Input::IGamepad* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CGaming__CInput__CGamepad, 0x47132ba0, 0x6b17, 0x5cd2, 0xa8,0xbd, 0xb5,0xd3,0x44,0x3c,0xcb,0x13)
#endif
#else
typedef struct __FIIterable_1_Windows__CGaming__CInput__CGamepadVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Gaming::Input::Gamepad* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CGaming__CInput__CGamepad *This,
        __FIIterator_1_Windows__CGaming__CInput__CGamepad **value);

    END_INTERFACE
} __FIIterable_1_Windows__CGaming__CInput__CGamepadVtbl;

interface __FIIterable_1_Windows__CGaming__CInput__CGamepad {
    CONST_VTBL __FIIterable_1_Windows__CGaming__CInput__CGamepadVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CGaming__CInput__CGamepad_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CGaming__CInput__CGamepad_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CGaming__CInput__CGamepad_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CGaming__CInput__CGamepad_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CGaming__CInput__CGamepad_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CGaming__CInput__CGamepad_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Gaming::Input::Gamepad* > methods ***/
#define __FIIterable_1_Windows__CGaming__CInput__CGamepad_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CGamepad_QueryInterface(__FIIterable_1_Windows__CGaming__CInput__CGamepad* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CGaming__CInput__CGamepad_AddRef(__FIIterable_1_Windows__CGaming__CInput__CGamepad* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CGaming__CInput__CGamepad_Release(__FIIterable_1_Windows__CGaming__CInput__CGamepad* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CGamepad_GetIids(__FIIterable_1_Windows__CGaming__CInput__CGamepad* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CGamepad_GetRuntimeClassName(__FIIterable_1_Windows__CGaming__CInput__CGamepad* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CGamepad_GetTrustLevel(__FIIterable_1_Windows__CGaming__CInput__CGamepad* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Gaming::Input::Gamepad* > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CGamepad_First(__FIIterable_1_Windows__CGaming__CInput__CGamepad* This,__FIIterator_1_Windows__CGaming__CInput__CGamepad **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_Gamepad IID___FIIterable_1_Windows__CGaming__CInput__CGamepad
#define IIterable_GamepadVtbl __FIIterable_1_Windows__CGaming__CInput__CGamepadVtbl
#define IIterable_Gamepad __FIIterable_1_Windows__CGaming__CInput__CGamepad
#define IIterable_Gamepad_QueryInterface __FIIterable_1_Windows__CGaming__CInput__CGamepad_QueryInterface
#define IIterable_Gamepad_AddRef __FIIterable_1_Windows__CGaming__CInput__CGamepad_AddRef
#define IIterable_Gamepad_Release __FIIterable_1_Windows__CGaming__CInput__CGamepad_Release
#define IIterable_Gamepad_GetIids __FIIterable_1_Windows__CGaming__CInput__CGamepad_GetIids
#define IIterable_Gamepad_GetRuntimeClassName __FIIterable_1_Windows__CGaming__CInput__CGamepad_GetRuntimeClassName
#define IIterable_Gamepad_GetTrustLevel __FIIterable_1_Windows__CGaming__CInput__CGamepad_GetTrustLevel
#define IIterable_Gamepad_First __FIIterable_1_Windows__CGaming__CInput__CGamepad_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CGaming__CInput__CGamepad_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Gaming::Input::Gamepad* > interface
 */
#ifndef ____FIVectorView_1_Windows__CGaming__CInput__CGamepad_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CGaming__CInput__CGamepad_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CGaming__CInput__CGamepad, 0xeb97bb69, 0x09c9, 0x5a99, 0x86,0xb2, 0x3e,0x36,0x08,0x52,0x84,0xd4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("eb97bb69-09c9-5a99-86b2-3e36085284d4")
                IVectorView<ABI::Windows::Gaming::Input::Gamepad* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::Gamepad*, ABI::Windows::Gaming::Input::IGamepad* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CGaming__CInput__CGamepad, 0xeb97bb69, 0x09c9, 0x5a99, 0x86,0xb2, 0x3e,0x36,0x08,0x52,0x84,0xd4)
#endif
#else
typedef struct __FIVectorView_1_Windows__CGaming__CInput__CGamepadVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Gaming::Input::Gamepad* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CGaming__CInput__CGamepad *This,
        UINT32 index,
        __x_ABI_CWindows_CGaming_CInput_CIGamepad **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CGaming__CInput__CGamepad *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CGaming__CInput__CGamepad *This,
        __x_ABI_CWindows_CGaming_CInput_CIGamepad *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CGaming__CInput__CGamepad *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CGaming_CInput_CIGamepad **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CGaming__CInput__CGamepadVtbl;

interface __FIVectorView_1_Windows__CGaming__CInput__CGamepad {
    CONST_VTBL __FIVectorView_1_Windows__CGaming__CInput__CGamepadVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CGaming__CInput__CGamepad_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CGaming__CInput__CGamepad_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CGaming__CInput__CGamepad_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CGaming__CInput__CGamepad_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CGaming__CInput__CGamepad_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CGaming__CInput__CGamepad_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Gaming::Input::Gamepad* > methods ***/
#define __FIVectorView_1_Windows__CGaming__CInput__CGamepad_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CGaming__CInput__CGamepad_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CGaming__CInput__CGamepad_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CGaming__CInput__CGamepad_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CGamepad_QueryInterface(__FIVectorView_1_Windows__CGaming__CInput__CGamepad* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CGaming__CInput__CGamepad_AddRef(__FIVectorView_1_Windows__CGaming__CInput__CGamepad* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CGaming__CInput__CGamepad_Release(__FIVectorView_1_Windows__CGaming__CInput__CGamepad* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CGamepad_GetIids(__FIVectorView_1_Windows__CGaming__CInput__CGamepad* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CGamepad_GetRuntimeClassName(__FIVectorView_1_Windows__CGaming__CInput__CGamepad* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CGamepad_GetTrustLevel(__FIVectorView_1_Windows__CGaming__CInput__CGamepad* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Gaming::Input::Gamepad* > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CGamepad_GetAt(__FIVectorView_1_Windows__CGaming__CInput__CGamepad* This,UINT32 index,__x_ABI_CWindows_CGaming_CInput_CIGamepad **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CGamepad_get_Size(__FIVectorView_1_Windows__CGaming__CInput__CGamepad* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CGamepad_IndexOf(__FIVectorView_1_Windows__CGaming__CInput__CGamepad* This,__x_ABI_CWindows_CGaming_CInput_CIGamepad *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CGamepad_GetMany(__FIVectorView_1_Windows__CGaming__CInput__CGamepad* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CGaming_CInput_CIGamepad **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_Gamepad IID___FIVectorView_1_Windows__CGaming__CInput__CGamepad
#define IVectorView_GamepadVtbl __FIVectorView_1_Windows__CGaming__CInput__CGamepadVtbl
#define IVectorView_Gamepad __FIVectorView_1_Windows__CGaming__CInput__CGamepad
#define IVectorView_Gamepad_QueryInterface __FIVectorView_1_Windows__CGaming__CInput__CGamepad_QueryInterface
#define IVectorView_Gamepad_AddRef __FIVectorView_1_Windows__CGaming__CInput__CGamepad_AddRef
#define IVectorView_Gamepad_Release __FIVectorView_1_Windows__CGaming__CInput__CGamepad_Release
#define IVectorView_Gamepad_GetIids __FIVectorView_1_Windows__CGaming__CInput__CGamepad_GetIids
#define IVectorView_Gamepad_GetRuntimeClassName __FIVectorView_1_Windows__CGaming__CInput__CGamepad_GetRuntimeClassName
#define IVectorView_Gamepad_GetTrustLevel __FIVectorView_1_Windows__CGaming__CInput__CGamepad_GetTrustLevel
#define IVectorView_Gamepad_GetAt __FIVectorView_1_Windows__CGaming__CInput__CGamepad_GetAt
#define IVectorView_Gamepad_get_Size __FIVectorView_1_Windows__CGaming__CInput__CGamepad_get_Size
#define IVectorView_Gamepad_IndexOf __FIVectorView_1_Windows__CGaming__CInput__CGamepad_IndexOf
#define IVectorView_Gamepad_GetMany __FIVectorView_1_Windows__CGaming__CInput__CGamepad_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CGaming__CInput__CGamepad_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVector<ABI::Windows::Gaming::Input::Gamepad* > interface
 */
#ifndef ____FIVector_1_Windows__CGaming__CInput__CGamepad_INTERFACE_DEFINED__
#define ____FIVector_1_Windows__CGaming__CInput__CGamepad_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVector_1_Windows__CGaming__CInput__CGamepad, 0x152bec39, 0x0a47, 0x5466, 0xb2,0x53, 0x64,0xe2,0xbb,0x68,0xd7,0x44);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("152bec39-0a47-5466-b253-64e2bb68d744")
                IVector<ABI::Windows::Gaming::Input::Gamepad* > : IVector_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::Gamepad*, ABI::Windows::Gaming::Input::IGamepad* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVector_1_Windows__CGaming__CInput__CGamepad, 0x152bec39, 0x0a47, 0x5466, 0xb2,0x53, 0x64,0xe2,0xbb,0x68,0xd7,0x44)
#endif
#else
typedef struct __FIVector_1_Windows__CGaming__CInput__CGamepadVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVector<ABI::Windows::Gaming::Input::Gamepad* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVector_1_Windows__CGaming__CInput__CGamepad *This,
        UINT32 index,
        __x_ABI_CWindows_CGaming_CInput_CIGamepad **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVector_1_Windows__CGaming__CInput__CGamepad *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *GetView)(
        __FIVector_1_Windows__CGaming__CInput__CGamepad *This,
        __FIVectorView_1_Windows__CGaming__CInput__CGamepad **value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVector_1_Windows__CGaming__CInput__CGamepad *This,
        __x_ABI_CWindows_CGaming_CInput_CIGamepad *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        __FIVector_1_Windows__CGaming__CInput__CGamepad *This,
        UINT32 index,
        __x_ABI_CWindows_CGaming_CInput_CIGamepad *value);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        __FIVector_1_Windows__CGaming__CInput__CGamepad *This,
        UINT32 index,
        __x_ABI_CWindows_CGaming_CInput_CIGamepad *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        __FIVector_1_Windows__CGaming__CInput__CGamepad *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *Append)(
        __FIVector_1_Windows__CGaming__CInput__CGamepad *This,
        __x_ABI_CWindows_CGaming_CInput_CIGamepad *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAtEnd)(
        __FIVector_1_Windows__CGaming__CInput__CGamepad *This);

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

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVector_1_Windows__CGaming__CInput__CGamepad *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CGaming_CInput_CIGamepad **items,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *ReplaceAll)(
        __FIVector_1_Windows__CGaming__CInput__CGamepad *This,
        UINT32 count,
        __x_ABI_CWindows_CGaming_CInput_CIGamepad **items);

    END_INTERFACE
} __FIVector_1_Windows__CGaming__CInput__CGamepadVtbl;

interface __FIVector_1_Windows__CGaming__CInput__CGamepad {
    CONST_VTBL __FIVector_1_Windows__CGaming__CInput__CGamepadVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVector_1_Windows__CGaming__CInput__CGamepad_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVector_1_Windows__CGaming__CInput__CGamepad_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVector_1_Windows__CGaming__CInput__CGamepad_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVector_1_Windows__CGaming__CInput__CGamepad_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVector_1_Windows__CGaming__CInput__CGamepad_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVector_1_Windows__CGaming__CInput__CGamepad_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVector<ABI::Windows::Gaming::Input::Gamepad* > methods ***/
#define __FIVector_1_Windows__CGaming__CInput__CGamepad_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVector_1_Windows__CGaming__CInput__CGamepad_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVector_1_Windows__CGaming__CInput__CGamepad_GetView(This,value) (This)->lpVtbl->GetView(This,value)
#define __FIVector_1_Windows__CGaming__CInput__CGamepad_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVector_1_Windows__CGaming__CInput__CGamepad_SetAt(This,index,value) (This)->lpVtbl->SetAt(This,index,value)
#define __FIVector_1_Windows__CGaming__CInput__CGamepad_InsertAt(This,index,value) (This)->lpVtbl->InsertAt(This,index,value)
#define __FIVector_1_Windows__CGaming__CInput__CGamepad_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define __FIVector_1_Windows__CGaming__CInput__CGamepad_Append(This,value) (This)->lpVtbl->Append(This,value)
#define __FIVector_1_Windows__CGaming__CInput__CGamepad_RemoveAtEnd(This) (This)->lpVtbl->RemoveAtEnd(This)
#define __FIVector_1_Windows__CGaming__CInput__CGamepad_Clear(This) (This)->lpVtbl->Clear(This)
#define __FIVector_1_Windows__CGaming__CInput__CGamepad_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#define __FIVector_1_Windows__CGaming__CInput__CGamepad_ReplaceAll(This,count,items) (This)->lpVtbl->ReplaceAll(This,count,items)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CGamepad_QueryInterface(__FIVector_1_Windows__CGaming__CInput__CGamepad* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVector_1_Windows__CGaming__CInput__CGamepad_AddRef(__FIVector_1_Windows__CGaming__CInput__CGamepad* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVector_1_Windows__CGaming__CInput__CGamepad_Release(__FIVector_1_Windows__CGaming__CInput__CGamepad* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CGamepad_GetIids(__FIVector_1_Windows__CGaming__CInput__CGamepad* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CGamepad_GetRuntimeClassName(__FIVector_1_Windows__CGaming__CInput__CGamepad* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CGamepad_GetTrustLevel(__FIVector_1_Windows__CGaming__CInput__CGamepad* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVector<ABI::Windows::Gaming::Input::Gamepad* > methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CGamepad_GetAt(__FIVector_1_Windows__CGaming__CInput__CGamepad* This,UINT32 index,__x_ABI_CWindows_CGaming_CInput_CIGamepad **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CGamepad_get_Size(__FIVector_1_Windows__CGaming__CInput__CGamepad* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CGamepad_GetView(__FIVector_1_Windows__CGaming__CInput__CGamepad* This,__FIVectorView_1_Windows__CGaming__CInput__CGamepad **value) {
    return This->lpVtbl->GetView(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CGamepad_IndexOf(__FIVector_1_Windows__CGaming__CInput__CGamepad* This,__x_ABI_CWindows_CGaming_CInput_CIGamepad *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CGamepad_SetAt(__FIVector_1_Windows__CGaming__CInput__CGamepad* This,UINT32 index,__x_ABI_CWindows_CGaming_CInput_CIGamepad *value) {
    return This->lpVtbl->SetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CGamepad_InsertAt(__FIVector_1_Windows__CGaming__CInput__CGamepad* This,UINT32 index,__x_ABI_CWindows_CGaming_CInput_CIGamepad *value) {
    return This->lpVtbl->InsertAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CGamepad_RemoveAt(__FIVector_1_Windows__CGaming__CInput__CGamepad* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CGamepad_Append(__FIVector_1_Windows__CGaming__CInput__CGamepad* This,__x_ABI_CWindows_CGaming_CInput_CIGamepad *value) {
    return This->lpVtbl->Append(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CGamepad_RemoveAtEnd(__FIVector_1_Windows__CGaming__CInput__CGamepad* This) {
    return This->lpVtbl->RemoveAtEnd(This);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CGamepad_Clear(__FIVector_1_Windows__CGaming__CInput__CGamepad* This) {
    return This->lpVtbl->Clear(This);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CGamepad_GetMany(__FIVector_1_Windows__CGaming__CInput__CGamepad* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CGaming_CInput_CIGamepad **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CGamepad_ReplaceAll(__FIVector_1_Windows__CGaming__CInput__CGamepad* This,UINT32 count,__x_ABI_CWindows_CGaming_CInput_CIGamepad **items) {
    return This->lpVtbl->ReplaceAll(This,count,items);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVector_Gamepad IID___FIVector_1_Windows__CGaming__CInput__CGamepad
#define IVector_GamepadVtbl __FIVector_1_Windows__CGaming__CInput__CGamepadVtbl
#define IVector_Gamepad __FIVector_1_Windows__CGaming__CInput__CGamepad
#define IVector_Gamepad_QueryInterface __FIVector_1_Windows__CGaming__CInput__CGamepad_QueryInterface
#define IVector_Gamepad_AddRef __FIVector_1_Windows__CGaming__CInput__CGamepad_AddRef
#define IVector_Gamepad_Release __FIVector_1_Windows__CGaming__CInput__CGamepad_Release
#define IVector_Gamepad_GetIids __FIVector_1_Windows__CGaming__CInput__CGamepad_GetIids
#define IVector_Gamepad_GetRuntimeClassName __FIVector_1_Windows__CGaming__CInput__CGamepad_GetRuntimeClassName
#define IVector_Gamepad_GetTrustLevel __FIVector_1_Windows__CGaming__CInput__CGamepad_GetTrustLevel
#define IVector_Gamepad_GetAt __FIVector_1_Windows__CGaming__CInput__CGamepad_GetAt
#define IVector_Gamepad_get_Size __FIVector_1_Windows__CGaming__CInput__CGamepad_get_Size
#define IVector_Gamepad_GetView __FIVector_1_Windows__CGaming__CInput__CGamepad_GetView
#define IVector_Gamepad_IndexOf __FIVector_1_Windows__CGaming__CInput__CGamepad_IndexOf
#define IVector_Gamepad_SetAt __FIVector_1_Windows__CGaming__CInput__CGamepad_SetAt
#define IVector_Gamepad_InsertAt __FIVector_1_Windows__CGaming__CInput__CGamepad_InsertAt
#define IVector_Gamepad_RemoveAt __FIVector_1_Windows__CGaming__CInput__CGamepad_RemoveAt
#define IVector_Gamepad_Append __FIVector_1_Windows__CGaming__CInput__CGamepad_Append
#define IVector_Gamepad_RemoveAtEnd __FIVector_1_Windows__CGaming__CInput__CGamepad_RemoveAtEnd
#define IVector_Gamepad_Clear __FIVector_1_Windows__CGaming__CInput__CGamepad_Clear
#define IVector_Gamepad_GetMany __FIVector_1_Windows__CGaming__CInput__CGamepad_GetMany
#define IVector_Gamepad_ReplaceAll __FIVector_1_Windows__CGaming__CInput__CGamepad_ReplaceAll
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVector_1_Windows__CGaming__CInput__CGamepad_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Gaming::Input::RacingWheel* > interface
 */
#ifndef ____FIIterator_1_Windows__CGaming__CInput__CRacingWheel_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CGaming__CInput__CRacingWheel_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CGaming__CInput__CRacingWheel, 0x23d735b8, 0x4d36, 0x5377, 0xa2,0x45, 0x69,0xdf,0x97,0xc9,0xfc,0xd9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("23d735b8-4d36-5377-a245-69df97c9fcd9")
                IIterator<ABI::Windows::Gaming::Input::RacingWheel* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::RacingWheel*, ABI::Windows::Gaming::Input::IRacingWheel* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CGaming__CInput__CRacingWheel, 0x23d735b8, 0x4d36, 0x5377, 0xa2,0x45, 0x69,0xdf,0x97,0xc9,0xfc,0xd9)
#endif
#else
typedef struct __FIIterator_1_Windows__CGaming__CInput__CRacingWheelVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::Gaming::Input::RacingWheel* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CGaming__CInput__CRacingWheel *This,
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CGaming__CInput__CRacingWheel *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CGaming__CInput__CRacingWheel *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CGaming__CInput__CRacingWheel *This,
        UINT32 items_size,
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CGaming__CInput__CRacingWheelVtbl;

interface __FIIterator_1_Windows__CGaming__CInput__CRacingWheel {
    CONST_VTBL __FIIterator_1_Windows__CGaming__CInput__CRacingWheelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Gaming::Input::RacingWheel* > methods ***/
#define __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_QueryInterface(__FIIterator_1_Windows__CGaming__CInput__CRacingWheel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_AddRef(__FIIterator_1_Windows__CGaming__CInput__CRacingWheel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_Release(__FIIterator_1_Windows__CGaming__CInput__CRacingWheel* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_GetIids(__FIIterator_1_Windows__CGaming__CInput__CRacingWheel* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_GetRuntimeClassName(__FIIterator_1_Windows__CGaming__CInput__CRacingWheel* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_GetTrustLevel(__FIIterator_1_Windows__CGaming__CInput__CRacingWheel* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Gaming::Input::RacingWheel* > methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_get_Current(__FIIterator_1_Windows__CGaming__CInput__CRacingWheel* This,__x_ABI_CWindows_CGaming_CInput_CIRacingWheel **value) {
    return This->lpVtbl->get_Current(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_get_HasCurrent(__FIIterator_1_Windows__CGaming__CInput__CRacingWheel* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_MoveNext(__FIIterator_1_Windows__CGaming__CInput__CRacingWheel* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_GetMany(__FIIterator_1_Windows__CGaming__CInput__CRacingWheel* This,UINT32 items_size,__x_ABI_CWindows_CGaming_CInput_CIRacingWheel **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_RacingWheel IID___FIIterator_1_Windows__CGaming__CInput__CRacingWheel
#define IIterator_RacingWheelVtbl __FIIterator_1_Windows__CGaming__CInput__CRacingWheelVtbl
#define IIterator_RacingWheel __FIIterator_1_Windows__CGaming__CInput__CRacingWheel
#define IIterator_RacingWheel_QueryInterface __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_QueryInterface
#define IIterator_RacingWheel_AddRef __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_AddRef
#define IIterator_RacingWheel_Release __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_Release
#define IIterator_RacingWheel_GetIids __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_GetIids
#define IIterator_RacingWheel_GetRuntimeClassName __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_GetRuntimeClassName
#define IIterator_RacingWheel_GetTrustLevel __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_GetTrustLevel
#define IIterator_RacingWheel_get_Current __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_get_Current
#define IIterator_RacingWheel_get_HasCurrent __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_get_HasCurrent
#define IIterator_RacingWheel_MoveNext __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_MoveNext
#define IIterator_RacingWheel_GetMany __FIIterator_1_Windows__CGaming__CInput__CRacingWheel_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CGaming__CInput__CRacingWheel_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::Gaming::Input::RacingWheel* > interface
 */
#ifndef ____FIIterable_1_Windows__CGaming__CInput__CRacingWheel_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CGaming__CInput__CRacingWheel_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CGaming__CInput__CRacingWheel, 0x9a7c3830, 0x9a87, 0x5287, 0xa1,0xe2, 0x8a,0x2a,0xf2,0x9c,0xf6,0x8c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("9a7c3830-9a87-5287-a1e2-8a2af29cf68c")
                IIterable<ABI::Windows::Gaming::Input::RacingWheel* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::RacingWheel*, ABI::Windows::Gaming::Input::IRacingWheel* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CGaming__CInput__CRacingWheel, 0x9a7c3830, 0x9a87, 0x5287, 0xa1,0xe2, 0x8a,0x2a,0xf2,0x9c,0xf6,0x8c)
#endif
#else
typedef struct __FIIterable_1_Windows__CGaming__CInput__CRacingWheelVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Gaming::Input::RacingWheel* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CGaming__CInput__CRacingWheel *This,
        __FIIterator_1_Windows__CGaming__CInput__CRacingWheel **value);

    END_INTERFACE
} __FIIterable_1_Windows__CGaming__CInput__CRacingWheelVtbl;

interface __FIIterable_1_Windows__CGaming__CInput__CRacingWheel {
    CONST_VTBL __FIIterable_1_Windows__CGaming__CInput__CRacingWheelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Gaming::Input::RacingWheel* > methods ***/
#define __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_QueryInterface(__FIIterable_1_Windows__CGaming__CInput__CRacingWheel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_AddRef(__FIIterable_1_Windows__CGaming__CInput__CRacingWheel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_Release(__FIIterable_1_Windows__CGaming__CInput__CRacingWheel* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_GetIids(__FIIterable_1_Windows__CGaming__CInput__CRacingWheel* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_GetRuntimeClassName(__FIIterable_1_Windows__CGaming__CInput__CRacingWheel* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_GetTrustLevel(__FIIterable_1_Windows__CGaming__CInput__CRacingWheel* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Gaming::Input::RacingWheel* > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_First(__FIIterable_1_Windows__CGaming__CInput__CRacingWheel* This,__FIIterator_1_Windows__CGaming__CInput__CRacingWheel **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_RacingWheel IID___FIIterable_1_Windows__CGaming__CInput__CRacingWheel
#define IIterable_RacingWheelVtbl __FIIterable_1_Windows__CGaming__CInput__CRacingWheelVtbl
#define IIterable_RacingWheel __FIIterable_1_Windows__CGaming__CInput__CRacingWheel
#define IIterable_RacingWheel_QueryInterface __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_QueryInterface
#define IIterable_RacingWheel_AddRef __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_AddRef
#define IIterable_RacingWheel_Release __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_Release
#define IIterable_RacingWheel_GetIids __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_GetIids
#define IIterable_RacingWheel_GetRuntimeClassName __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_GetRuntimeClassName
#define IIterable_RacingWheel_GetTrustLevel __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_GetTrustLevel
#define IIterable_RacingWheel_First __FIIterable_1_Windows__CGaming__CInput__CRacingWheel_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CGaming__CInput__CRacingWheel_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Gaming::Input::RacingWheel* > interface
 */
#ifndef ____FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CGaming__CInput__CRacingWheel, 0x153993b2, 0x6052, 0x5959, 0x91,0xec, 0x90,0x0c,0x53,0xfe,0xf1,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("153993b2-6052-5959-91ec-900c53fef120")
                IVectorView<ABI::Windows::Gaming::Input::RacingWheel* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::RacingWheel*, ABI::Windows::Gaming::Input::IRacingWheel* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CGaming__CInput__CRacingWheel, 0x153993b2, 0x6052, 0x5959, 0x91,0xec, 0x90,0x0c,0x53,0xfe,0xf1,0x20)
#endif
#else
typedef struct __FIVectorView_1_Windows__CGaming__CInput__CRacingWheelVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Gaming::Input::RacingWheel* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel *This,
        UINT32 index,
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel *This,
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CGaming__CInput__CRacingWheelVtbl;

interface __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel {
    CONST_VTBL __FIVectorView_1_Windows__CGaming__CInput__CRacingWheelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Gaming::Input::RacingWheel* > methods ***/
#define __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_QueryInterface(__FIVectorView_1_Windows__CGaming__CInput__CRacingWheel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_AddRef(__FIVectorView_1_Windows__CGaming__CInput__CRacingWheel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_Release(__FIVectorView_1_Windows__CGaming__CInput__CRacingWheel* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_GetIids(__FIVectorView_1_Windows__CGaming__CInput__CRacingWheel* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_GetRuntimeClassName(__FIVectorView_1_Windows__CGaming__CInput__CRacingWheel* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_GetTrustLevel(__FIVectorView_1_Windows__CGaming__CInput__CRacingWheel* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Gaming::Input::RacingWheel* > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_GetAt(__FIVectorView_1_Windows__CGaming__CInput__CRacingWheel* This,UINT32 index,__x_ABI_CWindows_CGaming_CInput_CIRacingWheel **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_get_Size(__FIVectorView_1_Windows__CGaming__CInput__CRacingWheel* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_IndexOf(__FIVectorView_1_Windows__CGaming__CInput__CRacingWheel* This,__x_ABI_CWindows_CGaming_CInput_CIRacingWheel *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_GetMany(__FIVectorView_1_Windows__CGaming__CInput__CRacingWheel* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CGaming_CInput_CIRacingWheel **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_RacingWheel IID___FIVectorView_1_Windows__CGaming__CInput__CRacingWheel
#define IVectorView_RacingWheelVtbl __FIVectorView_1_Windows__CGaming__CInput__CRacingWheelVtbl
#define IVectorView_RacingWheel __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel
#define IVectorView_RacingWheel_QueryInterface __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_QueryInterface
#define IVectorView_RacingWheel_AddRef __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_AddRef
#define IVectorView_RacingWheel_Release __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_Release
#define IVectorView_RacingWheel_GetIids __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_GetIids
#define IVectorView_RacingWheel_GetRuntimeClassName __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_GetRuntimeClassName
#define IVectorView_RacingWheel_GetTrustLevel __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_GetTrustLevel
#define IVectorView_RacingWheel_GetAt __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_GetAt
#define IVectorView_RacingWheel_get_Size __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_get_Size
#define IVectorView_RacingWheel_IndexOf __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_IndexOf
#define IVectorView_RacingWheel_GetMany __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CGaming__CInput__CRacingWheel_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVector<ABI::Windows::Gaming::Input::RacingWheel* > interface
 */
#ifndef ____FIVector_1_Windows__CGaming__CInput__CRacingWheel_INTERFACE_DEFINED__
#define ____FIVector_1_Windows__CGaming__CInput__CRacingWheel_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVector_1_Windows__CGaming__CInput__CRacingWheel, 0xe21d3be8, 0xb215, 0x5c0f, 0xaf,0x72, 0x33,0x9f,0x41,0xaf,0x73,0x4d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("e21d3be8-b215-5c0f-af72-339f41af734d")
                IVector<ABI::Windows::Gaming::Input::RacingWheel* > : IVector_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::RacingWheel*, ABI::Windows::Gaming::Input::IRacingWheel* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVector_1_Windows__CGaming__CInput__CRacingWheel, 0xe21d3be8, 0xb215, 0x5c0f, 0xaf,0x72, 0x33,0x9f,0x41,0xaf,0x73,0x4d)
#endif
#else
typedef struct __FIVector_1_Windows__CGaming__CInput__CRacingWheelVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVector<ABI::Windows::Gaming::Input::RacingWheel* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVector_1_Windows__CGaming__CInput__CRacingWheel *This,
        UINT32 index,
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVector_1_Windows__CGaming__CInput__CRacingWheel *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *GetView)(
        __FIVector_1_Windows__CGaming__CInput__CRacingWheel *This,
        __FIVectorView_1_Windows__CGaming__CInput__CRacingWheel **value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVector_1_Windows__CGaming__CInput__CRacingWheel *This,
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        __FIVector_1_Windows__CGaming__CInput__CRacingWheel *This,
        UINT32 index,
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel *value);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        __FIVector_1_Windows__CGaming__CInput__CRacingWheel *This,
        UINT32 index,
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        __FIVector_1_Windows__CGaming__CInput__CRacingWheel *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *Append)(
        __FIVector_1_Windows__CGaming__CInput__CRacingWheel *This,
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAtEnd)(
        __FIVector_1_Windows__CGaming__CInput__CRacingWheel *This);

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

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVector_1_Windows__CGaming__CInput__CRacingWheel *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel **items,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *ReplaceAll)(
        __FIVector_1_Windows__CGaming__CInput__CRacingWheel *This,
        UINT32 count,
        __x_ABI_CWindows_CGaming_CInput_CIRacingWheel **items);

    END_INTERFACE
} __FIVector_1_Windows__CGaming__CInput__CRacingWheelVtbl;

interface __FIVector_1_Windows__CGaming__CInput__CRacingWheel {
    CONST_VTBL __FIVector_1_Windows__CGaming__CInput__CRacingWheelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVector_1_Windows__CGaming__CInput__CRacingWheel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVector_1_Windows__CGaming__CInput__CRacingWheel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVector_1_Windows__CGaming__CInput__CRacingWheel_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVector_1_Windows__CGaming__CInput__CRacingWheel_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVector_1_Windows__CGaming__CInput__CRacingWheel_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVector_1_Windows__CGaming__CInput__CRacingWheel_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVector<ABI::Windows::Gaming::Input::RacingWheel* > methods ***/
#define __FIVector_1_Windows__CGaming__CInput__CRacingWheel_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVector_1_Windows__CGaming__CInput__CRacingWheel_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVector_1_Windows__CGaming__CInput__CRacingWheel_GetView(This,value) (This)->lpVtbl->GetView(This,value)
#define __FIVector_1_Windows__CGaming__CInput__CRacingWheel_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVector_1_Windows__CGaming__CInput__CRacingWheel_SetAt(This,index,value) (This)->lpVtbl->SetAt(This,index,value)
#define __FIVector_1_Windows__CGaming__CInput__CRacingWheel_InsertAt(This,index,value) (This)->lpVtbl->InsertAt(This,index,value)
#define __FIVector_1_Windows__CGaming__CInput__CRacingWheel_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define __FIVector_1_Windows__CGaming__CInput__CRacingWheel_Append(This,value) (This)->lpVtbl->Append(This,value)
#define __FIVector_1_Windows__CGaming__CInput__CRacingWheel_RemoveAtEnd(This) (This)->lpVtbl->RemoveAtEnd(This)
#define __FIVector_1_Windows__CGaming__CInput__CRacingWheel_Clear(This) (This)->lpVtbl->Clear(This)
#define __FIVector_1_Windows__CGaming__CInput__CRacingWheel_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#define __FIVector_1_Windows__CGaming__CInput__CRacingWheel_ReplaceAll(This,count,items) (This)->lpVtbl->ReplaceAll(This,count,items)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRacingWheel_QueryInterface(__FIVector_1_Windows__CGaming__CInput__CRacingWheel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVector_1_Windows__CGaming__CInput__CRacingWheel_AddRef(__FIVector_1_Windows__CGaming__CInput__CRacingWheel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVector_1_Windows__CGaming__CInput__CRacingWheel_Release(__FIVector_1_Windows__CGaming__CInput__CRacingWheel* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRacingWheel_GetIids(__FIVector_1_Windows__CGaming__CInput__CRacingWheel* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRacingWheel_GetRuntimeClassName(__FIVector_1_Windows__CGaming__CInput__CRacingWheel* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRacingWheel_GetTrustLevel(__FIVector_1_Windows__CGaming__CInput__CRacingWheel* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVector<ABI::Windows::Gaming::Input::RacingWheel* > methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRacingWheel_GetAt(__FIVector_1_Windows__CGaming__CInput__CRacingWheel* This,UINT32 index,__x_ABI_CWindows_CGaming_CInput_CIRacingWheel **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRacingWheel_get_Size(__FIVector_1_Windows__CGaming__CInput__CRacingWheel* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRacingWheel_GetView(__FIVector_1_Windows__CGaming__CInput__CRacingWheel* This,__FIVectorView_1_Windows__CGaming__CInput__CRacingWheel **value) {
    return This->lpVtbl->GetView(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRacingWheel_IndexOf(__FIVector_1_Windows__CGaming__CInput__CRacingWheel* This,__x_ABI_CWindows_CGaming_CInput_CIRacingWheel *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRacingWheel_SetAt(__FIVector_1_Windows__CGaming__CInput__CRacingWheel* This,UINT32 index,__x_ABI_CWindows_CGaming_CInput_CIRacingWheel *value) {
    return This->lpVtbl->SetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRacingWheel_InsertAt(__FIVector_1_Windows__CGaming__CInput__CRacingWheel* This,UINT32 index,__x_ABI_CWindows_CGaming_CInput_CIRacingWheel *value) {
    return This->lpVtbl->InsertAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRacingWheel_RemoveAt(__FIVector_1_Windows__CGaming__CInput__CRacingWheel* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRacingWheel_Append(__FIVector_1_Windows__CGaming__CInput__CRacingWheel* This,__x_ABI_CWindows_CGaming_CInput_CIRacingWheel *value) {
    return This->lpVtbl->Append(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRacingWheel_RemoveAtEnd(__FIVector_1_Windows__CGaming__CInput__CRacingWheel* This) {
    return This->lpVtbl->RemoveAtEnd(This);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRacingWheel_Clear(__FIVector_1_Windows__CGaming__CInput__CRacingWheel* This) {
    return This->lpVtbl->Clear(This);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRacingWheel_GetMany(__FIVector_1_Windows__CGaming__CInput__CRacingWheel* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CGaming_CInput_CIRacingWheel **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRacingWheel_ReplaceAll(__FIVector_1_Windows__CGaming__CInput__CRacingWheel* This,UINT32 count,__x_ABI_CWindows_CGaming_CInput_CIRacingWheel **items) {
    return This->lpVtbl->ReplaceAll(This,count,items);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVector_RacingWheel IID___FIVector_1_Windows__CGaming__CInput__CRacingWheel
#define IVector_RacingWheelVtbl __FIVector_1_Windows__CGaming__CInput__CRacingWheelVtbl
#define IVector_RacingWheel __FIVector_1_Windows__CGaming__CInput__CRacingWheel
#define IVector_RacingWheel_QueryInterface __FIVector_1_Windows__CGaming__CInput__CRacingWheel_QueryInterface
#define IVector_RacingWheel_AddRef __FIVector_1_Windows__CGaming__CInput__CRacingWheel_AddRef
#define IVector_RacingWheel_Release __FIVector_1_Windows__CGaming__CInput__CRacingWheel_Release
#define IVector_RacingWheel_GetIids __FIVector_1_Windows__CGaming__CInput__CRacingWheel_GetIids
#define IVector_RacingWheel_GetRuntimeClassName __FIVector_1_Windows__CGaming__CInput__CRacingWheel_GetRuntimeClassName
#define IVector_RacingWheel_GetTrustLevel __FIVector_1_Windows__CGaming__CInput__CRacingWheel_GetTrustLevel
#define IVector_RacingWheel_GetAt __FIVector_1_Windows__CGaming__CInput__CRacingWheel_GetAt
#define IVector_RacingWheel_get_Size __FIVector_1_Windows__CGaming__CInput__CRacingWheel_get_Size
#define IVector_RacingWheel_GetView __FIVector_1_Windows__CGaming__CInput__CRacingWheel_GetView
#define IVector_RacingWheel_IndexOf __FIVector_1_Windows__CGaming__CInput__CRacingWheel_IndexOf
#define IVector_RacingWheel_SetAt __FIVector_1_Windows__CGaming__CInput__CRacingWheel_SetAt
#define IVector_RacingWheel_InsertAt __FIVector_1_Windows__CGaming__CInput__CRacingWheel_InsertAt
#define IVector_RacingWheel_RemoveAt __FIVector_1_Windows__CGaming__CInput__CRacingWheel_RemoveAt
#define IVector_RacingWheel_Append __FIVector_1_Windows__CGaming__CInput__CRacingWheel_Append
#define IVector_RacingWheel_RemoveAtEnd __FIVector_1_Windows__CGaming__CInput__CRacingWheel_RemoveAtEnd
#define IVector_RacingWheel_Clear __FIVector_1_Windows__CGaming__CInput__CRacingWheel_Clear
#define IVector_RacingWheel_GetMany __FIVector_1_Windows__CGaming__CInput__CRacingWheel_GetMany
#define IVector_RacingWheel_ReplaceAll __FIVector_1_Windows__CGaming__CInput__CRacingWheel_ReplaceAll
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVector_1_Windows__CGaming__CInput__CRacingWheel_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Gaming::Input::RawGameController* > interface
 */
#ifndef ____FIIterator_1_Windows__CGaming__CInput__CRawGameController_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CGaming__CInput__CRawGameController_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CGaming__CInput__CRawGameController, 0x51cc88dc, 0x66fb, 0x55ea, 0x9a,0x1b, 0xaa,0xdc,0xd7,0x1c,0xc0,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("51cc88dc-66fb-55ea-9a1b-aadcd71cc08e")
                IIterator<ABI::Windows::Gaming::Input::RawGameController* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::RawGameController*, ABI::Windows::Gaming::Input::IRawGameController* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CGaming__CInput__CRawGameController, 0x51cc88dc, 0x66fb, 0x55ea, 0x9a,0x1b, 0xaa,0xdc,0xd7,0x1c,0xc0,0x8e)
#endif
#else
typedef struct __FIIterator_1_Windows__CGaming__CInput__CRawGameControllerVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::Gaming::Input::RawGameController* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CGaming__CInput__CRawGameController *This,
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CGaming__CInput__CRawGameController *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CGaming__CInput__CRawGameController *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CGaming__CInput__CRawGameController *This,
        UINT32 items_size,
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CGaming__CInput__CRawGameControllerVtbl;

interface __FIIterator_1_Windows__CGaming__CInput__CRawGameController {
    CONST_VTBL __FIIterator_1_Windows__CGaming__CInput__CRawGameControllerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CGaming__CInput__CRawGameController_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CGaming__CInput__CRawGameController_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CGaming__CInput__CRawGameController_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CGaming__CInput__CRawGameController_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CGaming__CInput__CRawGameController_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CGaming__CInput__CRawGameController_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Gaming::Input::RawGameController* > methods ***/
#define __FIIterator_1_Windows__CGaming__CInput__CRawGameController_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CGaming__CInput__CRawGameController_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CGaming__CInput__CRawGameController_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CGaming__CInput__CRawGameController_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CRawGameController_QueryInterface(__FIIterator_1_Windows__CGaming__CInput__CRawGameController* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CGaming__CInput__CRawGameController_AddRef(__FIIterator_1_Windows__CGaming__CInput__CRawGameController* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CGaming__CInput__CRawGameController_Release(__FIIterator_1_Windows__CGaming__CInput__CRawGameController* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CRawGameController_GetIids(__FIIterator_1_Windows__CGaming__CInput__CRawGameController* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CRawGameController_GetRuntimeClassName(__FIIterator_1_Windows__CGaming__CInput__CRawGameController* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CRawGameController_GetTrustLevel(__FIIterator_1_Windows__CGaming__CInput__CRawGameController* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Gaming::Input::RawGameController* > methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CRawGameController_get_Current(__FIIterator_1_Windows__CGaming__CInput__CRawGameController* This,__x_ABI_CWindows_CGaming_CInput_CIRawGameController **value) {
    return This->lpVtbl->get_Current(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CRawGameController_get_HasCurrent(__FIIterator_1_Windows__CGaming__CInput__CRawGameController* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CRawGameController_MoveNext(__FIIterator_1_Windows__CGaming__CInput__CRawGameController* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CRawGameController_GetMany(__FIIterator_1_Windows__CGaming__CInput__CRawGameController* This,UINT32 items_size,__x_ABI_CWindows_CGaming_CInput_CIRawGameController **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_RawGameController IID___FIIterator_1_Windows__CGaming__CInput__CRawGameController
#define IIterator_RawGameControllerVtbl __FIIterator_1_Windows__CGaming__CInput__CRawGameControllerVtbl
#define IIterator_RawGameController __FIIterator_1_Windows__CGaming__CInput__CRawGameController
#define IIterator_RawGameController_QueryInterface __FIIterator_1_Windows__CGaming__CInput__CRawGameController_QueryInterface
#define IIterator_RawGameController_AddRef __FIIterator_1_Windows__CGaming__CInput__CRawGameController_AddRef
#define IIterator_RawGameController_Release __FIIterator_1_Windows__CGaming__CInput__CRawGameController_Release
#define IIterator_RawGameController_GetIids __FIIterator_1_Windows__CGaming__CInput__CRawGameController_GetIids
#define IIterator_RawGameController_GetRuntimeClassName __FIIterator_1_Windows__CGaming__CInput__CRawGameController_GetRuntimeClassName
#define IIterator_RawGameController_GetTrustLevel __FIIterator_1_Windows__CGaming__CInput__CRawGameController_GetTrustLevel
#define IIterator_RawGameController_get_Current __FIIterator_1_Windows__CGaming__CInput__CRawGameController_get_Current
#define IIterator_RawGameController_get_HasCurrent __FIIterator_1_Windows__CGaming__CInput__CRawGameController_get_HasCurrent
#define IIterator_RawGameController_MoveNext __FIIterator_1_Windows__CGaming__CInput__CRawGameController_MoveNext
#define IIterator_RawGameController_GetMany __FIIterator_1_Windows__CGaming__CInput__CRawGameController_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CGaming__CInput__CRawGameController_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::Gaming::Input::RawGameController* > interface
 */
#ifndef ____FIIterable_1_Windows__CGaming__CInput__CRawGameController_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CGaming__CInput__CRawGameController_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CGaming__CInput__CRawGameController, 0x8f2f08cc, 0xf4f4, 0x5539, 0x93,0x57, 0x1f,0x07,0x33,0x4d,0x38,0x1f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("8f2f08cc-f4f4-5539-9357-1f07334d381f")
                IIterable<ABI::Windows::Gaming::Input::RawGameController* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::RawGameController*, ABI::Windows::Gaming::Input::IRawGameController* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CGaming__CInput__CRawGameController, 0x8f2f08cc, 0xf4f4, 0x5539, 0x93,0x57, 0x1f,0x07,0x33,0x4d,0x38,0x1f)
#endif
#else
typedef struct __FIIterable_1_Windows__CGaming__CInput__CRawGameControllerVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Gaming::Input::RawGameController* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CGaming__CInput__CRawGameController *This,
        __FIIterator_1_Windows__CGaming__CInput__CRawGameController **value);

    END_INTERFACE
} __FIIterable_1_Windows__CGaming__CInput__CRawGameControllerVtbl;

interface __FIIterable_1_Windows__CGaming__CInput__CRawGameController {
    CONST_VTBL __FIIterable_1_Windows__CGaming__CInput__CRawGameControllerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CGaming__CInput__CRawGameController_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CGaming__CInput__CRawGameController_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CGaming__CInput__CRawGameController_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CGaming__CInput__CRawGameController_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CGaming__CInput__CRawGameController_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CGaming__CInput__CRawGameController_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Gaming::Input::RawGameController* > methods ***/
#define __FIIterable_1_Windows__CGaming__CInput__CRawGameController_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CRawGameController_QueryInterface(__FIIterable_1_Windows__CGaming__CInput__CRawGameController* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CGaming__CInput__CRawGameController_AddRef(__FIIterable_1_Windows__CGaming__CInput__CRawGameController* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CGaming__CInput__CRawGameController_Release(__FIIterable_1_Windows__CGaming__CInput__CRawGameController* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CRawGameController_GetIids(__FIIterable_1_Windows__CGaming__CInput__CRawGameController* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CRawGameController_GetRuntimeClassName(__FIIterable_1_Windows__CGaming__CInput__CRawGameController* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CRawGameController_GetTrustLevel(__FIIterable_1_Windows__CGaming__CInput__CRawGameController* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Gaming::Input::RawGameController* > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CRawGameController_First(__FIIterable_1_Windows__CGaming__CInput__CRawGameController* This,__FIIterator_1_Windows__CGaming__CInput__CRawGameController **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_RawGameController IID___FIIterable_1_Windows__CGaming__CInput__CRawGameController
#define IIterable_RawGameControllerVtbl __FIIterable_1_Windows__CGaming__CInput__CRawGameControllerVtbl
#define IIterable_RawGameController __FIIterable_1_Windows__CGaming__CInput__CRawGameController
#define IIterable_RawGameController_QueryInterface __FIIterable_1_Windows__CGaming__CInput__CRawGameController_QueryInterface
#define IIterable_RawGameController_AddRef __FIIterable_1_Windows__CGaming__CInput__CRawGameController_AddRef
#define IIterable_RawGameController_Release __FIIterable_1_Windows__CGaming__CInput__CRawGameController_Release
#define IIterable_RawGameController_GetIids __FIIterable_1_Windows__CGaming__CInput__CRawGameController_GetIids
#define IIterable_RawGameController_GetRuntimeClassName __FIIterable_1_Windows__CGaming__CInput__CRawGameController_GetRuntimeClassName
#define IIterable_RawGameController_GetTrustLevel __FIIterable_1_Windows__CGaming__CInput__CRawGameController_GetTrustLevel
#define IIterable_RawGameController_First __FIIterable_1_Windows__CGaming__CInput__CRawGameController_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CGaming__CInput__CRawGameController_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Gaming::Input::RawGameController* > interface
 */
#ifndef ____FIVectorView_1_Windows__CGaming__CInput__CRawGameController_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CGaming__CInput__CRawGameController_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CGaming__CInput__CRawGameController, 0x779cc322, 0x40c0, 0x55c1, 0x8d,0xc5, 0xcc,0x6e,0x3a,0xfe,0x02,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("779cc322-40c0-55c1-8dc5-cc6e3afe02cf")
                IVectorView<ABI::Windows::Gaming::Input::RawGameController* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::RawGameController*, ABI::Windows::Gaming::Input::IRawGameController* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CGaming__CInput__CRawGameController, 0x779cc322, 0x40c0, 0x55c1, 0x8d,0xc5, 0xcc,0x6e,0x3a,0xfe,0x02,0xcf)
#endif
#else
typedef struct __FIVectorView_1_Windows__CGaming__CInput__CRawGameControllerVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Gaming::Input::RawGameController* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CGaming__CInput__CRawGameController *This,
        UINT32 index,
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CGaming__CInput__CRawGameController *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CGaming__CInput__CRawGameController *This,
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CGaming__CInput__CRawGameController *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CGaming__CInput__CRawGameControllerVtbl;

interface __FIVectorView_1_Windows__CGaming__CInput__CRawGameController {
    CONST_VTBL __FIVectorView_1_Windows__CGaming__CInput__CRawGameControllerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Gaming::Input::RawGameController* > methods ***/
#define __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_QueryInterface(__FIVectorView_1_Windows__CGaming__CInput__CRawGameController* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_AddRef(__FIVectorView_1_Windows__CGaming__CInput__CRawGameController* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_Release(__FIVectorView_1_Windows__CGaming__CInput__CRawGameController* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_GetIids(__FIVectorView_1_Windows__CGaming__CInput__CRawGameController* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_GetRuntimeClassName(__FIVectorView_1_Windows__CGaming__CInput__CRawGameController* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_GetTrustLevel(__FIVectorView_1_Windows__CGaming__CInput__CRawGameController* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Gaming::Input::RawGameController* > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_GetAt(__FIVectorView_1_Windows__CGaming__CInput__CRawGameController* This,UINT32 index,__x_ABI_CWindows_CGaming_CInput_CIRawGameController **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_get_Size(__FIVectorView_1_Windows__CGaming__CInput__CRawGameController* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_IndexOf(__FIVectorView_1_Windows__CGaming__CInput__CRawGameController* This,__x_ABI_CWindows_CGaming_CInput_CIRawGameController *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_GetMany(__FIVectorView_1_Windows__CGaming__CInput__CRawGameController* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CGaming_CInput_CIRawGameController **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_RawGameController IID___FIVectorView_1_Windows__CGaming__CInput__CRawGameController
#define IVectorView_RawGameControllerVtbl __FIVectorView_1_Windows__CGaming__CInput__CRawGameControllerVtbl
#define IVectorView_RawGameController __FIVectorView_1_Windows__CGaming__CInput__CRawGameController
#define IVectorView_RawGameController_QueryInterface __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_QueryInterface
#define IVectorView_RawGameController_AddRef __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_AddRef
#define IVectorView_RawGameController_Release __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_Release
#define IVectorView_RawGameController_GetIids __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_GetIids
#define IVectorView_RawGameController_GetRuntimeClassName __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_GetRuntimeClassName
#define IVectorView_RawGameController_GetTrustLevel __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_GetTrustLevel
#define IVectorView_RawGameController_GetAt __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_GetAt
#define IVectorView_RawGameController_get_Size __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_get_Size
#define IVectorView_RawGameController_IndexOf __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_IndexOf
#define IVectorView_RawGameController_GetMany __FIVectorView_1_Windows__CGaming__CInput__CRawGameController_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CGaming__CInput__CRawGameController_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVector<ABI::Windows::Gaming::Input::RawGameController* > interface
 */
#ifndef ____FIVector_1_Windows__CGaming__CInput__CRawGameController_INTERFACE_DEFINED__
#define ____FIVector_1_Windows__CGaming__CInput__CRawGameController_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVector_1_Windows__CGaming__CInput__CRawGameController, 0x9136cbcf, 0xb87c, 0x5886, 0x89,0x62, 0xb0,0xff,0xbd,0x64,0xb7,0x63);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("9136cbcf-b87c-5886-8962-b0ffbd64b763")
                IVector<ABI::Windows::Gaming::Input::RawGameController* > : IVector_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::RawGameController*, ABI::Windows::Gaming::Input::IRawGameController* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVector_1_Windows__CGaming__CInput__CRawGameController, 0x9136cbcf, 0xb87c, 0x5886, 0x89,0x62, 0xb0,0xff,0xbd,0x64,0xb7,0x63)
#endif
#else
typedef struct __FIVector_1_Windows__CGaming__CInput__CRawGameControllerVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVector<ABI::Windows::Gaming::Input::RawGameController* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVector_1_Windows__CGaming__CInput__CRawGameController *This,
        UINT32 index,
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVector_1_Windows__CGaming__CInput__CRawGameController *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *GetView)(
        __FIVector_1_Windows__CGaming__CInput__CRawGameController *This,
        __FIVectorView_1_Windows__CGaming__CInput__CRawGameController **value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVector_1_Windows__CGaming__CInput__CRawGameController *This,
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        __FIVector_1_Windows__CGaming__CInput__CRawGameController *This,
        UINT32 index,
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController *value);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        __FIVector_1_Windows__CGaming__CInput__CRawGameController *This,
        UINT32 index,
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        __FIVector_1_Windows__CGaming__CInput__CRawGameController *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *Append)(
        __FIVector_1_Windows__CGaming__CInput__CRawGameController *This,
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAtEnd)(
        __FIVector_1_Windows__CGaming__CInput__CRawGameController *This);

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

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVector_1_Windows__CGaming__CInput__CRawGameController *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController **items,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *ReplaceAll)(
        __FIVector_1_Windows__CGaming__CInput__CRawGameController *This,
        UINT32 count,
        __x_ABI_CWindows_CGaming_CInput_CIRawGameController **items);

    END_INTERFACE
} __FIVector_1_Windows__CGaming__CInput__CRawGameControllerVtbl;

interface __FIVector_1_Windows__CGaming__CInput__CRawGameController {
    CONST_VTBL __FIVector_1_Windows__CGaming__CInput__CRawGameControllerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVector_1_Windows__CGaming__CInput__CRawGameController_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVector_1_Windows__CGaming__CInput__CRawGameController_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVector_1_Windows__CGaming__CInput__CRawGameController_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVector_1_Windows__CGaming__CInput__CRawGameController_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVector_1_Windows__CGaming__CInput__CRawGameController_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVector_1_Windows__CGaming__CInput__CRawGameController_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVector<ABI::Windows::Gaming::Input::RawGameController* > methods ***/
#define __FIVector_1_Windows__CGaming__CInput__CRawGameController_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVector_1_Windows__CGaming__CInput__CRawGameController_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVector_1_Windows__CGaming__CInput__CRawGameController_GetView(This,value) (This)->lpVtbl->GetView(This,value)
#define __FIVector_1_Windows__CGaming__CInput__CRawGameController_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVector_1_Windows__CGaming__CInput__CRawGameController_SetAt(This,index,value) (This)->lpVtbl->SetAt(This,index,value)
#define __FIVector_1_Windows__CGaming__CInput__CRawGameController_InsertAt(This,index,value) (This)->lpVtbl->InsertAt(This,index,value)
#define __FIVector_1_Windows__CGaming__CInput__CRawGameController_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define __FIVector_1_Windows__CGaming__CInput__CRawGameController_Append(This,value) (This)->lpVtbl->Append(This,value)
#define __FIVector_1_Windows__CGaming__CInput__CRawGameController_RemoveAtEnd(This) (This)->lpVtbl->RemoveAtEnd(This)
#define __FIVector_1_Windows__CGaming__CInput__CRawGameController_Clear(This) (This)->lpVtbl->Clear(This)
#define __FIVector_1_Windows__CGaming__CInput__CRawGameController_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#define __FIVector_1_Windows__CGaming__CInput__CRawGameController_ReplaceAll(This,count,items) (This)->lpVtbl->ReplaceAll(This,count,items)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRawGameController_QueryInterface(__FIVector_1_Windows__CGaming__CInput__CRawGameController* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVector_1_Windows__CGaming__CInput__CRawGameController_AddRef(__FIVector_1_Windows__CGaming__CInput__CRawGameController* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVector_1_Windows__CGaming__CInput__CRawGameController_Release(__FIVector_1_Windows__CGaming__CInput__CRawGameController* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRawGameController_GetIids(__FIVector_1_Windows__CGaming__CInput__CRawGameController* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRawGameController_GetRuntimeClassName(__FIVector_1_Windows__CGaming__CInput__CRawGameController* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRawGameController_GetTrustLevel(__FIVector_1_Windows__CGaming__CInput__CRawGameController* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVector<ABI::Windows::Gaming::Input::RawGameController* > methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRawGameController_GetAt(__FIVector_1_Windows__CGaming__CInput__CRawGameController* This,UINT32 index,__x_ABI_CWindows_CGaming_CInput_CIRawGameController **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRawGameController_get_Size(__FIVector_1_Windows__CGaming__CInput__CRawGameController* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRawGameController_GetView(__FIVector_1_Windows__CGaming__CInput__CRawGameController* This,__FIVectorView_1_Windows__CGaming__CInput__CRawGameController **value) {
    return This->lpVtbl->GetView(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRawGameController_IndexOf(__FIVector_1_Windows__CGaming__CInput__CRawGameController* This,__x_ABI_CWindows_CGaming_CInput_CIRawGameController *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRawGameController_SetAt(__FIVector_1_Windows__CGaming__CInput__CRawGameController* This,UINT32 index,__x_ABI_CWindows_CGaming_CInput_CIRawGameController *value) {
    return This->lpVtbl->SetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRawGameController_InsertAt(__FIVector_1_Windows__CGaming__CInput__CRawGameController* This,UINT32 index,__x_ABI_CWindows_CGaming_CInput_CIRawGameController *value) {
    return This->lpVtbl->InsertAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRawGameController_RemoveAt(__FIVector_1_Windows__CGaming__CInput__CRawGameController* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRawGameController_Append(__FIVector_1_Windows__CGaming__CInput__CRawGameController* This,__x_ABI_CWindows_CGaming_CInput_CIRawGameController *value) {
    return This->lpVtbl->Append(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRawGameController_RemoveAtEnd(__FIVector_1_Windows__CGaming__CInput__CRawGameController* This) {
    return This->lpVtbl->RemoveAtEnd(This);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRawGameController_Clear(__FIVector_1_Windows__CGaming__CInput__CRawGameController* This) {
    return This->lpVtbl->Clear(This);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRawGameController_GetMany(__FIVector_1_Windows__CGaming__CInput__CRawGameController* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CGaming_CInput_CIRawGameController **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CRawGameController_ReplaceAll(__FIVector_1_Windows__CGaming__CInput__CRawGameController* This,UINT32 count,__x_ABI_CWindows_CGaming_CInput_CIRawGameController **items) {
    return This->lpVtbl->ReplaceAll(This,count,items);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVector_RawGameController IID___FIVector_1_Windows__CGaming__CInput__CRawGameController
#define IVector_RawGameControllerVtbl __FIVector_1_Windows__CGaming__CInput__CRawGameControllerVtbl
#define IVector_RawGameController __FIVector_1_Windows__CGaming__CInput__CRawGameController
#define IVector_RawGameController_QueryInterface __FIVector_1_Windows__CGaming__CInput__CRawGameController_QueryInterface
#define IVector_RawGameController_AddRef __FIVector_1_Windows__CGaming__CInput__CRawGameController_AddRef
#define IVector_RawGameController_Release __FIVector_1_Windows__CGaming__CInput__CRawGameController_Release
#define IVector_RawGameController_GetIids __FIVector_1_Windows__CGaming__CInput__CRawGameController_GetIids
#define IVector_RawGameController_GetRuntimeClassName __FIVector_1_Windows__CGaming__CInput__CRawGameController_GetRuntimeClassName
#define IVector_RawGameController_GetTrustLevel __FIVector_1_Windows__CGaming__CInput__CRawGameController_GetTrustLevel
#define IVector_RawGameController_GetAt __FIVector_1_Windows__CGaming__CInput__CRawGameController_GetAt
#define IVector_RawGameController_get_Size __FIVector_1_Windows__CGaming__CInput__CRawGameController_get_Size
#define IVector_RawGameController_GetView __FIVector_1_Windows__CGaming__CInput__CRawGameController_GetView
#define IVector_RawGameController_IndexOf __FIVector_1_Windows__CGaming__CInput__CRawGameController_IndexOf
#define IVector_RawGameController_SetAt __FIVector_1_Windows__CGaming__CInput__CRawGameController_SetAt
#define IVector_RawGameController_InsertAt __FIVector_1_Windows__CGaming__CInput__CRawGameController_InsertAt
#define IVector_RawGameController_RemoveAt __FIVector_1_Windows__CGaming__CInput__CRawGameController_RemoveAt
#define IVector_RawGameController_Append __FIVector_1_Windows__CGaming__CInput__CRawGameController_Append
#define IVector_RawGameController_RemoveAtEnd __FIVector_1_Windows__CGaming__CInput__CRawGameController_RemoveAtEnd
#define IVector_RawGameController_Clear __FIVector_1_Windows__CGaming__CInput__CRawGameController_Clear
#define IVector_RawGameController_GetMany __FIVector_1_Windows__CGaming__CInput__CRawGameController_GetMany
#define IVector_RawGameController_ReplaceAll __FIVector_1_Windows__CGaming__CInput__CRawGameController_ReplaceAll
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVector_1_Windows__CGaming__CInput__CRawGameController_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_gaming_input_h__ */
