master
  1#ifndef __alink_h__
  2#define __alink_h__
  3
  4#include <winapifamily.h>
  5
  6#if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP)
  7
  8typedef enum _AssemblyOptions {
  9  optAssemTitle = 0,
 10  optAssemDescription,
 11  optAssemConfig,
 12  optAssemOS,
 13  optAssemProcessor,
 14  optAssemLocale,
 15  optAssemVersion,
 16  optAssemCompany,
 17  optAssemProduct,
 18  optAssemProductVersion,
 19  optAssemCopyright,
 20  optAssemTrademark,
 21  optAssemKeyFile,
 22  optAssemKeyName,
 23  optAssemAlgID,
 24  optAssemFlags,
 25  optAssemHalfSign,
 26  optAssemFileVersion,
 27  optAssemSatelliteVer,
 28  optAssemSignaturePublicKey,
 29  optLastAssemOption
 30} AssemblyOptions;
 31
 32typedef enum _AssemblyFlags {
 33  afNone = 0x00000000,
 34  afInMemory = 0x00000001,
 35  afCleanModules = 0x00000002,
 36  afNoRefHash = 0x00000004,
 37  afNoDupTypeCheck = 0x00000008,
 38  afDupeCheckTypeFwds = 0x00000010
 39} AssemblyFlags;
 40
 41EXTERN_GUID (CLSID_AssemblyLinker, 0xf7e02368, 0xa7f4, 0x471f, 0x8c, 0x5e, 0x98, 0x39, 0xed, 0x57, 0xcb, 0x5e);
 42
 43EXTERN_GUID (IID_IALink, 0xc8e77f39, 0x3604, 0x4fd4, 0x85, 0xcf, 0x38, 0xbd, 0xeb, 0x23, 0x3a, 0xd4);
 44EXTERN_GUID (IID_IALink2, 0xc8e77f39, 0x3604, 0x4fd4, 0x85, 0xcf, 0x38, 0xbd, 0xeb, 0x23, 0x3a, 0xd5);
 45EXTERN_GUID (IID_IALink3, 0x22d4f7a0, 0x65, 0x43dd, 0x8e, 0xaf, 0xb9, 0xfb, 0x90, 0x1d, 0x82, 0x23);
 46
 47#define AssemblyIsUBM ((mdAssembly) mdAssemblyNil)
 48#define MAX_IDENT_LEN 2048
 49
 50#ifndef HALINKENUM
 51#define HALINKENUM void *
 52#endif
 53
 54#undef INTERFACE
 55#define INTERFACE IALink
 56
 57DECLARE_INTERFACE_ (IALink, IUnknown) {
 58  BEGIN_INTERFACE
 59#ifndef __cplusplus
 60   /* IUnknown methods */
 61   STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
 62   STDMETHOD_(ULONG, AddRef)(THIS) PURE;
 63   STDMETHOD_(ULONG, Release)(THIS) PURE;
 64#endif  
 65  STDMETHOD (Init) (IMetaDataDispenserEx *pDispenser, IMetaDataError *pErrorHandler) PURE;
 66  STDMETHOD (ImportFile) (LPCWSTR pszFilename, LPCWSTR pszTargetName, WINBOOL fSmartImport, mdToken *pImportToken, IMetaDataAssemblyImport **ppAssemblyScope, DWORD *pdwCountOfScopes) PURE;
 67  STDMETHOD (SetAssemblyFile) (LPCWSTR pszFilename, IMetaDataEmit *pEmitter, AssemblyFlags afFlags, mdAssembly *pAssemblyID) PURE;
 68  STDMETHOD (AddFile) (mdAssembly AssemblyID, LPCWSTR pszFilename, DWORD dwFlags, IMetaDataEmit *pEmitter, mdFile *pFileToken) PURE;
 69  STDMETHOD (AddImport) (mdAssembly AssemblyID, mdToken ImportToken, DWORD dwFlags, mdFile *pFileToken) PURE;
 70  STDMETHOD (GetScope) (mdAssembly AssemblyID, mdToken FileToken, DWORD dwScope, IMetaDataImport **ppImportScope) PURE;
 71  STDMETHOD (GetAssemblyRefHash) (mdToken FileToken, const void **ppvHash, DWORD *pcbHash) PURE;
 72  STDMETHOD (ImportTypes) (mdAssembly AssemblyID, mdToken FileToken, DWORD dwScope, HALINKENUM *phEnum, IMetaDataImport **ppImportScope, DWORD *pdwCountOfTypes) PURE;
 73  STDMETHOD (EnumCustomAttributes) (HALINKENUM hEnum, mdToken tkType, mdCustomAttribute rCustomValues[], ULONG cMax, ULONG *pcCustomValues) PURE;
 74  STDMETHOD (EnumImportTypes) (HALINKENUM hEnum, DWORD dwMax, mdTypeDef aTypeDefs[], DWORD *pdwCount) PURE;
 75  STDMETHOD (CloseEnum) (HALINKENUM hEnum) PURE;
 76  STDMETHOD (ExportType) (mdAssembly AssemblyID, mdToken FileToken, mdTypeDef TypeToken, LPCWSTR pszTypename, DWORD dwFlags, mdExportedType *pType) PURE;
 77  STDMETHOD (ExportNestedType) (mdAssembly AssemblyID, mdToken FileToken, mdTypeDef TypeToken, mdExportedType ParentType, LPCWSTR pszTypename, DWORD dwFlags, mdExportedType *pType) PURE;
 78  STDMETHOD (EmbedResource) (mdAssembly AssemblyID, mdToken FileToken, LPCWSTR pszResourceName, DWORD dwOffset, DWORD dwFlags) PURE;
 79  STDMETHOD (LinkResource) (mdAssembly AssemblyID, LPCWSTR pszFileName, LPCWSTR pszNewLocation, LPCWSTR pszResourceName, DWORD dwFlags) PURE;
 80  STDMETHOD (GetResolutionScope) (mdAssembly AssemblyID, mdToken FileToken, mdToken TargetFile, mdToken *pScope) PURE;
 81  STDMETHOD (SetAssemblyProps) (mdAssembly AssemblyID, mdToken FileToken, AssemblyOptions Option, VARIANT Value) PURE;
 82  STDMETHOD (EmitAssemblyCustomAttribute) (mdAssembly AssemblyID, mdToken FileToken, mdToken tkType, void const *pCustomValue, DWORD cbCustomValue, WINBOOL bSecurity, WINBOOL bAllowMulti) PURE;
 83  STDMETHOD (GetWin32ResBlob) (mdAssembly AssemblyID, mdToken FileToken, WINBOOL fDll, LPCWSTR pszIconFile, const void **ppResBlob, DWORD *pcbResBlob) PURE;
 84  STDMETHOD (FreeWin32ResBlob) (const void **ppResBlob) PURE;
 85  STDMETHOD (EmitManifest) (mdAssembly AssemblyID, DWORD *pdwReserveSize, mdAssembly *ptkManifest) PURE;
 86  STDMETHOD (PreCloseAssembly) (mdAssembly AssemblyID) PURE;
 87  STDMETHOD (CloseAssembly) (mdAssembly AssemblyID) PURE;
 88  STDMETHOD (EndMerge) (mdAssembly AssemblyID) PURE;
 89  STDMETHOD (SetNonAssemblyFlags) (AssemblyFlags afFlags) PURE;
 90  STDMETHOD (ImportFile2) (LPCWSTR pszFilename, LPCWSTR pszTargetName, IMetaDataAssemblyImport *pAssemblyScopeIn, WINBOOL fSmartImport, mdToken *pImportToken, IMetaDataAssemblyImport **ppAssemblyScope, DWORD *pdwCountOfScopes) PURE;
 91  STDMETHOD (ExportTypeForwarder) (mdAssemblyRef tkAssemblyRef, LPCWSTR pszTypename, DWORD dwFlags, mdExportedType *pType) PURE;
 92  STDMETHOD (ExportNestedTypeForwarder) (mdAssembly AssemblyID, mdToken FileToken, mdTypeDef TypeToken, mdExportedType ParentType, LPCWSTR pszTypename, DWORD dwFlags, mdExportedType *pType) PURE;
 93  END_INTERFACE
 94};
 95__CRT_UUID_DECL (IALink, 0xc8e77f39, 0x3604, 0x4fd4, 0x85, 0xcf, 0x38, 0xbd, 0xeb, 0x23, 0x3a, 0xd4);
 96
 97#undef INTERFACE
 98#define INTERFACE IALink2
 99DECLARE_INTERFACE_ (IALink2, IALink) {
100#ifndef __cplusplus
101   /* IUnknown methods */
102   STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
103   STDMETHOD_(ULONG, AddRef)(THIS) PURE;
104   STDMETHOD_(ULONG, Release)(THIS) PURE;
105  /* IALink */
106  STDMETHOD (Init) (IMetaDataDispenserEx *pDispenser, IMetaDataError *pErrorHandler) PURE;
107  STDMETHOD (ImportFile) (LPCWSTR pszFilename, LPCWSTR pszTargetName, WINBOOL fSmartImport, mdToken *pImportToken, IMetaDataAssemblyImport **ppAssemblyScope, DWORD *pdwCountOfScopes) PURE;
108  STDMETHOD (SetAssemblyFile) (LPCWSTR pszFilename, IMetaDataEmit *pEmitter, AssemblyFlags afFlags, mdAssembly *pAssemblyID) PURE;
109  STDMETHOD (AddFile) (mdAssembly AssemblyID, LPCWSTR pszFilename, DWORD dwFlags, IMetaDataEmit *pEmitter, mdFile *pFileToken) PURE;
110  STDMETHOD (AddImport) (mdAssembly AssemblyID, mdToken ImportToken, DWORD dwFlags, mdFile *pFileToken) PURE;
111  STDMETHOD (GetScope) (mdAssembly AssemblyID, mdToken FileToken, DWORD dwScope, IMetaDataImport **ppImportScope) PURE;
112  STDMETHOD (GetAssemblyRefHash) (mdToken FileToken, const void **ppvHash, DWORD *pcbHash) PURE;
113  STDMETHOD (ImportTypes) (mdAssembly AssemblyID, mdToken FileToken, DWORD dwScope, HALINKENUM *phEnum, IMetaDataImport **ppImportScope, DWORD *pdwCountOfTypes) PURE;
114  STDMETHOD (EnumCustomAttributes) (HALINKENUM hEnum, mdToken tkType, mdCustomAttribute rCustomValues[], ULONG cMax, ULONG *pcCustomValues) PURE;
115  STDMETHOD (EnumImportTypes) (HALINKENUM hEnum, DWORD dwMax, mdTypeDef aTypeDefs[], DWORD *pdwCount) PURE;
116  STDMETHOD (CloseEnum) (HALINKENUM hEnum) PURE;
117  STDMETHOD (ExportType) (mdAssembly AssemblyID, mdToken FileToken, mdTypeDef TypeToken, LPCWSTR pszTypename, DWORD dwFlags, mdExportedType *pType) PURE;
118  STDMETHOD (ExportNestedType) (mdAssembly AssemblyID, mdToken FileToken, mdTypeDef TypeToken, mdExportedType ParentType, LPCWSTR pszTypename, DWORD dwFlags, mdExportedType *pType) PURE;
119  STDMETHOD (EmbedResource) (mdAssembly AssemblyID, mdToken FileToken, LPCWSTR pszResourceName, DWORD dwOffset, DWORD dwFlags) PURE;
120  STDMETHOD (LinkResource) (mdAssembly AssemblyID, LPCWSTR pszFileName, LPCWSTR pszNewLocation, LPCWSTR pszResourceName, DWORD dwFlags) PURE;
121  STDMETHOD (GetResolutionScope) (mdAssembly AssemblyID, mdToken FileToken, mdToken TargetFile, mdToken *pScope) PURE;
122  STDMETHOD (SetAssemblyProps) (mdAssembly AssemblyID, mdToken FileToken, AssemblyOptions Option, VARIANT Value) PURE;
123  STDMETHOD (EmitAssemblyCustomAttribute) (mdAssembly AssemblyID, mdToken FileToken, mdToken tkType, void const *pCustomValue, DWORD cbCustomValue, WINBOOL bSecurity, WINBOOL bAllowMulti) PURE;
124  STDMETHOD (GetWin32ResBlob) (mdAssembly AssemblyID, mdToken FileToken, WINBOOL fDll, LPCWSTR pszIconFile, const void **ppResBlob, DWORD *pcbResBlob) PURE;
125  STDMETHOD (FreeWin32ResBlob) (const void **ppResBlob) PURE;
126  STDMETHOD (EmitManifest) (mdAssembly AssemblyID, DWORD *pdwReserveSize, mdAssembly *ptkManifest) PURE;
127  STDMETHOD (PreCloseAssembly) (mdAssembly AssemblyID) PURE;
128  STDMETHOD (CloseAssembly) (mdAssembly AssemblyID) PURE;
129  STDMETHOD (EndMerge) (mdAssembly AssemblyID) PURE;
130  STDMETHOD (SetNonAssemblyFlags) (AssemblyFlags afFlags) PURE;
131  STDMETHOD (ImportFile2) (LPCWSTR pszFilename, LPCWSTR pszTargetName, IMetaDataAssemblyImport *pAssemblyScopeIn, WINBOOL fSmartImport, mdToken *pImportToken, IMetaDataAssemblyImport **ppAssemblyScope, DWORD *pdwCountOfScopes) PURE;
132  STDMETHOD (ExportTypeForwarder) (mdAssemblyRef tkAssemblyRef, LPCWSTR pszTypename, DWORD dwFlags, mdExportedType *pType) PURE;
133  STDMETHOD (ExportNestedTypeForwarder) (mdAssembly AssemblyID, mdToken FileToken, mdTypeDef TypeToken, mdExportedType ParentType, LPCWSTR pszTypename, DWORD dwFlags, mdExportedType *pType) PURE;
134#endif
135  STDMETHOD (SetAssemblyFile2) (LPCWSTR pszFilename, IMetaDataEmit2 *pEmitter, AssemblyFlags afFlags, mdAssembly *pAssemblyID) PURE;
136  STDMETHOD (AddFile2) (mdAssembly AssemblyID, LPCWSTR pszFilename, DWORD dwFlags, IMetaDataEmit2 *pEmitter, mdFile *pFileToken) PURE;
137  STDMETHOD (GetScope2) (mdAssembly AssemblyID, mdToken FileToken, DWORD dwScope, IMetaDataImport2 **ppImportScope) PURE;
138  STDMETHOD (ImportTypes2) (mdAssembly AssemblyID, mdToken FileToken, DWORD dwScope, HALINKENUM *phEnum, IMetaDataImport2 **ppImportScope, DWORD *pdwCountOfTypes) PURE;
139  STDMETHOD (GetFileDef) (mdAssembly AssemblyID, mdFile TargetFile, mdFile *pScope) PURE;
140  STDMETHOD (GetPublicKeyToken) (LPCWSTR pszKeyFile, LPCWSTR pszKeyContainer, void *pvPublicKeyToken, DWORD *pcbPublicKeyToken) PURE;
141  STDMETHOD (EmitInternalExportedTypes) (mdAssembly AssemblyID) PURE;
142  STDMETHOD (ImportFileEx) (LPCWSTR pszFilename, LPCWSTR pszTargetName, WINBOOL fSmartImport, DWORD dwOpenFlags, mdToken *pImportToken, IMetaDataAssemblyImport **ppAssemblyScope, DWORD *pdwCountOfScopes) PURE;
143  STDMETHOD (ImportFileEx2) (LPCWSTR pszFilename, LPCWSTR pszTargetName, IMetaDataAssemblyImport *pAssemblyScopeIn, WINBOOL fSmartImport, DWORD dwOpenFlags, mdToken *pImportToken, IMetaDataAssemblyImport **ppAssemblyScope, DWORD *pdwCountOfScopes) PURE;
144  STDMETHOD (SetPEKind) (mdAssembly AssemblyID, mdToken FileToken, DWORD dwPEKind, DWORD dwMachine) PURE;
145  STDMETHOD (EmitAssembly) (mdAssembly AssemblyID) PURE;
146};
147__CRT_UUID_DECL (IALink2, 0xc8e77f39, 0x3604, 0x4fd4, 0x85, 0xcf, 0x38, 0xbd, 0xeb, 0x23, 0x3a, 0xd5);
148
149#undef INTERFACE
150#define INTERFACE IALink3
151DECLARE_INTERFACE_ (IALink3, IALink2) {
152#ifndef __cplusplus
153   /* IUnknown methods */
154   STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
155   STDMETHOD_(ULONG, AddRef)(THIS) PURE;
156   STDMETHOD_(ULONG, Release)(THIS) PURE;
157  /* IALink */
158  STDMETHOD (Init) (IMetaDataDispenserEx *pDispenser, IMetaDataError *pErrorHandler) PURE;
159  STDMETHOD (ImportFile) (LPCWSTR pszFilename, LPCWSTR pszTargetName, WINBOOL fSmartImport, mdToken *pImportToken, IMetaDataAssemblyImport **ppAssemblyScope, DWORD *pdwCountOfScopes) PURE;
160  STDMETHOD (SetAssemblyFile) (LPCWSTR pszFilename, IMetaDataEmit *pEmitter, AssemblyFlags afFlags, mdAssembly *pAssemblyID) PURE;
161  STDMETHOD (AddFile) (mdAssembly AssemblyID, LPCWSTR pszFilename, DWORD dwFlags, IMetaDataEmit *pEmitter, mdFile *pFileToken) PURE;
162  STDMETHOD (AddImport) (mdAssembly AssemblyID, mdToken ImportToken, DWORD dwFlags, mdFile *pFileToken) PURE;
163  STDMETHOD (GetScope) (mdAssembly AssemblyID, mdToken FileToken, DWORD dwScope, IMetaDataImport **ppImportScope) PURE;
164  STDMETHOD (GetAssemblyRefHash) (mdToken FileToken, const void **ppvHash, DWORD *pcbHash) PURE;
165  STDMETHOD (ImportTypes) (mdAssembly AssemblyID, mdToken FileToken, DWORD dwScope, HALINKENUM *phEnum, IMetaDataImport **ppImportScope, DWORD *pdwCountOfTypes) PURE;
166  STDMETHOD (EnumCustomAttributes) (HALINKENUM hEnum, mdToken tkType, mdCustomAttribute rCustomValues[], ULONG cMax, ULONG *pcCustomValues) PURE;
167  STDMETHOD (EnumImportTypes) (HALINKENUM hEnum, DWORD dwMax, mdTypeDef aTypeDefs[], DWORD *pdwCount) PURE;
168  STDMETHOD (CloseEnum) (HALINKENUM hEnum) PURE;
169  STDMETHOD (ExportType) (mdAssembly AssemblyID, mdToken FileToken, mdTypeDef TypeToken, LPCWSTR pszTypename, DWORD dwFlags, mdExportedType *pType) PURE;
170  STDMETHOD (ExportNestedType) (mdAssembly AssemblyID, mdToken FileToken, mdTypeDef TypeToken, mdExportedType ParentType, LPCWSTR pszTypename, DWORD dwFlags, mdExportedType *pType) PURE;
171  STDMETHOD (EmbedResource) (mdAssembly AssemblyID, mdToken FileToken, LPCWSTR pszResourceName, DWORD dwOffset, DWORD dwFlags) PURE;
172  STDMETHOD (LinkResource) (mdAssembly AssemblyID, LPCWSTR pszFileName, LPCWSTR pszNewLocation, LPCWSTR pszResourceName, DWORD dwFlags) PURE;
173  STDMETHOD (GetResolutionScope) (mdAssembly AssemblyID, mdToken FileToken, mdToken TargetFile, mdToken *pScope) PURE;
174  STDMETHOD (SetAssemblyProps) (mdAssembly AssemblyID, mdToken FileToken, AssemblyOptions Option, VARIANT Value) PURE;
175  STDMETHOD (EmitAssemblyCustomAttribute) (mdAssembly AssemblyID, mdToken FileToken, mdToken tkType, void const *pCustomValue, DWORD cbCustomValue, WINBOOL bSecurity, WINBOOL bAllowMulti) PURE;
176  STDMETHOD (GetWin32ResBlob) (mdAssembly AssemblyID, mdToken FileToken, WINBOOL fDll, LPCWSTR pszIconFile, const void **ppResBlob, DWORD *pcbResBlob) PURE;
177  STDMETHOD (FreeWin32ResBlob) (const void **ppResBlob) PURE;
178  STDMETHOD (EmitManifest) (mdAssembly AssemblyID, DWORD *pdwReserveSize, mdAssembly *ptkManifest) PURE;
179  STDMETHOD (PreCloseAssembly) (mdAssembly AssemblyID) PURE;
180  STDMETHOD (CloseAssembly) (mdAssembly AssemblyID) PURE;
181  STDMETHOD (EndMerge) (mdAssembly AssemblyID) PURE;
182  STDMETHOD (SetNonAssemblyFlags) (AssemblyFlags afFlags) PURE;
183  STDMETHOD (ImportFile2) (LPCWSTR pszFilename, LPCWSTR pszTargetName, IMetaDataAssemblyImport *pAssemblyScopeIn, WINBOOL fSmartImport, mdToken *pImportToken, IMetaDataAssemblyImport **ppAssemblyScope, DWORD *pdwCountOfScopes) PURE;
184  STDMETHOD (ExportTypeForwarder) (mdAssemblyRef tkAssemblyRef, LPCWSTR pszTypename, DWORD dwFlags, mdExportedType *pType) PURE;
185  STDMETHOD (ExportNestedTypeForwarder) (mdAssembly AssemblyID, mdToken FileToken, mdTypeDef TypeToken, mdExportedType ParentType, LPCWSTR pszTypename, DWORD dwFlags, mdExportedType *pType) PURE;
186  /* IALink2 */
187  STDMETHOD (SetAssemblyFile2) (LPCWSTR pszFilename, IMetaDataEmit2 *pEmitter, AssemblyFlags afFlags, mdAssembly *pAssemblyID) PURE;
188  STDMETHOD (AddFile2) (mdAssembly AssemblyID, LPCWSTR pszFilename, DWORD dwFlags, IMetaDataEmit2 *pEmitter, mdFile *pFileToken) PURE;
189  STDMETHOD (GetScope2) (mdAssembly AssemblyID, mdToken FileToken, DWORD dwScope, IMetaDataImport2 **ppImportScope) PURE;
190  STDMETHOD (ImportTypes2) (mdAssembly AssemblyID, mdToken FileToken, DWORD dwScope, HALINKENUM *phEnum, IMetaDataImport2 **ppImportScope, DWORD *pdwCountOfTypes) PURE;
191  STDMETHOD (GetFileDef) (mdAssembly AssemblyID, mdFile TargetFile, mdFile *pScope) PURE;
192  STDMETHOD (GetPublicKeyToken) (LPCWSTR pszKeyFile, LPCWSTR pszKeyContainer, void *pvPublicKeyToken, DWORD *pcbPublicKeyToken) PURE;
193  STDMETHOD (EmitInternalExportedTypes) (mdAssembly AssemblyID) PURE;
194  STDMETHOD (ImportFileEx) (LPCWSTR pszFilename, LPCWSTR pszTargetName, WINBOOL fSmartImport, DWORD dwOpenFlags, mdToken *pImportToken, IMetaDataAssemblyImport **ppAssemblyScope, DWORD *pdwCountOfScopes) PURE;
195  STDMETHOD (ImportFileEx2) (LPCWSTR pszFilename, LPCWSTR pszTargetName, IMetaDataAssemblyImport *pAssemblyScopeIn, WINBOOL fSmartImport, DWORD dwOpenFlags, mdToken *pImportToken, IMetaDataAssemblyImport **ppAssemblyScope, DWORD *pdwCountOfScopes) PURE;
196  STDMETHOD (SetPEKind) (mdAssembly AssemblyID, mdToken FileToken, DWORD dwPEKind, DWORD dwMachine) PURE;
197  STDMETHOD (EmitAssembly) (mdAssembly AssemblyID) PURE;
198#endif
199  STDMETHOD (SetManifestFile) (LPCWSTR pszFile) PURE;
200};
201__CRT_UUID_DECL (IALink3, 0x22d4f7a0, 0x65, 0x43dd, 0x8e, 0xaf, 0xb9, 0xfb, 0x90, 0x1d, 0x82, 0x23);
202
203#undef INTERFACE
204
205#ifdef __cplusplus
206extern "C" {
207#endif
208
209  HRESULT WINAPI CreateALink (REFIID riid, IUnknown **ppInterface);
210  HINSTANCE WINAPI GetALinkMessageDll ();
211
212#ifdef __cplusplus
213}
214#endif
215
216#endif
217#endif