1 /* This is a generated file, edit the .stub.php file instead.
2  * Stub hash: b91206482b5119ce6d7c899e9599acfa2e06ec2a */
3 
4 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_variant_set, 0, 2, IS_VOID, 0)
5 	ZEND_ARG_OBJ_INFO(0, variant, variant, 0)
6 	ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0)
7 ZEND_END_ARG_INFO()
8 
9 ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_variant_add, 0, 2, variant, 0)
10 	ZEND_ARG_TYPE_INFO(0, left, IS_MIXED, 0)
11 	ZEND_ARG_TYPE_INFO(0, right, IS_MIXED, 0)
12 ZEND_END_ARG_INFO()
13 
14 #define arginfo_variant_cat arginfo_variant_add
15 
16 #define arginfo_variant_sub arginfo_variant_add
17 
18 #define arginfo_variant_mul arginfo_variant_add
19 
20 #define arginfo_variant_and arginfo_variant_add
21 
22 #define arginfo_variant_div arginfo_variant_add
23 
24 #define arginfo_variant_eqv arginfo_variant_add
25 
26 #define arginfo_variant_idiv arginfo_variant_add
27 
28 #define arginfo_variant_imp arginfo_variant_add
29 
30 #define arginfo_variant_mod arginfo_variant_add
31 
32 #define arginfo_variant_or arginfo_variant_add
33 
34 #define arginfo_variant_pow arginfo_variant_add
35 
36 #define arginfo_variant_xor arginfo_variant_add
37 
38 ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_variant_abs, 0, 1, variant, 0)
39 	ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0)
40 ZEND_END_ARG_INFO()
41 
42 #define arginfo_variant_fix arginfo_variant_abs
43 
44 #define arginfo_variant_int arginfo_variant_abs
45 
46 #define arginfo_variant_neg arginfo_variant_abs
47 
48 #define arginfo_variant_not arginfo_variant_abs
49 
50 ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_variant_round, 0, 2, variant, 1)
51 	ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0)
52 	ZEND_ARG_TYPE_INFO(0, decimals, IS_LONG, 0)
53 ZEND_END_ARG_INFO()
54 
55 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_variant_cmp, 0, 2, IS_LONG, 0)
56 	ZEND_ARG_TYPE_INFO(0, left, IS_MIXED, 0)
57 	ZEND_ARG_TYPE_INFO(0, right, IS_MIXED, 0)
58 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, locale_id, IS_LONG, 0, "LOCALE_SYSTEM_DEFAULT")
59 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0")
60 ZEND_END_ARG_INFO()
61 
62 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_variant_date_to_timestamp, 0, 1, IS_LONG, 1)
63 	ZEND_ARG_OBJ_INFO(0, variant, variant, 0)
64 ZEND_END_ARG_INFO()
65 
66 ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_variant_date_from_timestamp, 0, 1, variant, 0)
67 	ZEND_ARG_TYPE_INFO(0, timestamp, IS_LONG, 0)
68 ZEND_END_ARG_INFO()
69 
70 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_variant_get_type, 0, 1, IS_LONG, 0)
71 	ZEND_ARG_OBJ_INFO(0, variant, variant, 0)
72 ZEND_END_ARG_INFO()
73 
74 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_variant_set_type, 0, 2, IS_VOID, 0)
75 	ZEND_ARG_OBJ_INFO(0, variant, variant, 0)
76 	ZEND_ARG_TYPE_INFO(0, type, IS_LONG, 0)
77 ZEND_END_ARG_INFO()
78 
79 ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_variant_cast, 0, 2, variant, 0)
80 	ZEND_ARG_OBJ_INFO(0, variant, variant, 0)
81 	ZEND_ARG_TYPE_INFO(0, type, IS_LONG, 0)
82 ZEND_END_ARG_INFO()
83 
84 ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_com_get_active_object, 0, 1, variant, 0)
85 	ZEND_ARG_TYPE_INFO(0, prog_id, IS_STRING, 0)
86 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, codepage, IS_LONG, 1, "null")
87 ZEND_END_ARG_INFO()
88 
89 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_com_create_guid, 0, 0, MAY_BE_STRING|MAY_BE_FALSE)
90 ZEND_END_ARG_INFO()
91 
92 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_com_event_sink, 0, 2, _IS_BOOL, 0)
93 	ZEND_ARG_OBJ_INFO(0, variant, variant, 0)
94 	ZEND_ARG_TYPE_INFO(0, sink_object, IS_OBJECT, 0)
95 	ZEND_ARG_TYPE_MASK(0, sink_interface, MAY_BE_ARRAY|MAY_BE_STRING|MAY_BE_NULL, "null")
96 ZEND_END_ARG_INFO()
97 
98 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_com_print_typeinfo, 0, 1, _IS_BOOL, 0)
99 	ZEND_ARG_OBJ_TYPE_MASK(0, variant, variant, MAY_BE_STRING, NULL)
100 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, dispatch_interface, IS_STRING, 1, "null")
101 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, display_sink, _IS_BOOL, 0, "false")
102 ZEND_END_ARG_INFO()
103 
104 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_com_message_pump, 0, 0, _IS_BOOL, 0)
105 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timeout_milliseconds, IS_LONG, 0, "0")
106 ZEND_END_ARG_INFO()
107 
108 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_com_load_typelib, 0, 1, _IS_BOOL, 0)
109 	ZEND_ARG_TYPE_INFO(0, typelib, IS_STRING, 0)
110 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, case_insensitive, _IS_BOOL, 0, "true")
111 ZEND_END_ARG_INFO()
112 
113 ZEND_BEGIN_ARG_INFO_EX(arginfo_class_variant___construct, 0, 0, 0)
114 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, value, IS_MIXED, 0, "null")
115 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, type, IS_LONG, 0, "VT_EMPTY")
116 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, codepage, IS_LONG, 0, "CP_ACP")
117 ZEND_END_ARG_INFO()
118 
119 ZEND_BEGIN_ARG_INFO_EX(arginfo_class_com___construct, 0, 0, 1)
120 	ZEND_ARG_TYPE_INFO(0, module_name, IS_STRING, 0)
121 	ZEND_ARG_TYPE_MASK(0, server_name, MAY_BE_ARRAY|MAY_BE_STRING|MAY_BE_NULL, "null")
122 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, codepage, IS_LONG, 0, "CP_ACP")
123 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, typelib, IS_STRING, 0, "\"\"")
124 ZEND_END_ARG_INFO()
125 
126 #if HAVE_MSCOREE_H
127 ZEND_BEGIN_ARG_INFO_EX(arginfo_class_dotnet___construct, 0, 0, 2)
128 	ZEND_ARG_TYPE_INFO(0, assembly_name, IS_STRING, 0)
129 	ZEND_ARG_TYPE_INFO(0, datatype_name, IS_STRING, 0)
130 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, codepage, IS_LONG, 0, "CP_ACP")
131 ZEND_END_ARG_INFO()
132 #endif
133 
134 ZEND_FUNCTION(variant_set);
135 ZEND_FUNCTION(variant_add);
136 ZEND_FUNCTION(variant_cat);
137 ZEND_FUNCTION(variant_sub);
138 ZEND_FUNCTION(variant_mul);
139 ZEND_FUNCTION(variant_and);
140 ZEND_FUNCTION(variant_div);
141 ZEND_FUNCTION(variant_eqv);
142 ZEND_FUNCTION(variant_idiv);
143 ZEND_FUNCTION(variant_imp);
144 ZEND_FUNCTION(variant_mod);
145 ZEND_FUNCTION(variant_or);
146 ZEND_FUNCTION(variant_pow);
147 ZEND_FUNCTION(variant_xor);
148 ZEND_FUNCTION(variant_abs);
149 ZEND_FUNCTION(variant_fix);
150 ZEND_FUNCTION(variant_int);
151 ZEND_FUNCTION(variant_neg);
152 ZEND_FUNCTION(variant_not);
153 ZEND_FUNCTION(variant_round);
154 ZEND_FUNCTION(variant_cmp);
155 ZEND_FUNCTION(variant_date_to_timestamp);
156 ZEND_FUNCTION(variant_date_from_timestamp);
157 ZEND_FUNCTION(variant_get_type);
158 ZEND_FUNCTION(variant_set_type);
159 ZEND_FUNCTION(variant_cast);
160 ZEND_FUNCTION(com_get_active_object);
161 ZEND_FUNCTION(com_create_guid);
162 ZEND_FUNCTION(com_event_sink);
163 ZEND_FUNCTION(com_print_typeinfo);
164 ZEND_FUNCTION(com_message_pump);
165 ZEND_FUNCTION(com_load_typelib);
166 ZEND_METHOD(variant, __construct);
167 ZEND_METHOD(com, __construct);
168 #if HAVE_MSCOREE_H
169 ZEND_METHOD(dotnet, __construct);
170 #endif
171 
172 static const zend_function_entry ext_functions[] = {
173 	ZEND_FE(variant_set, arginfo_variant_set)
174 	ZEND_FE(variant_add, arginfo_variant_add)
175 	ZEND_FE(variant_cat, arginfo_variant_cat)
176 	ZEND_FE(variant_sub, arginfo_variant_sub)
177 	ZEND_FE(variant_mul, arginfo_variant_mul)
178 	ZEND_FE(variant_and, arginfo_variant_and)
179 	ZEND_FE(variant_div, arginfo_variant_div)
180 	ZEND_FE(variant_eqv, arginfo_variant_eqv)
181 	ZEND_FE(variant_idiv, arginfo_variant_idiv)
182 	ZEND_FE(variant_imp, arginfo_variant_imp)
183 	ZEND_FE(variant_mod, arginfo_variant_mod)
184 	ZEND_FE(variant_or, arginfo_variant_or)
185 	ZEND_FE(variant_pow, arginfo_variant_pow)
186 	ZEND_FE(variant_xor, arginfo_variant_xor)
187 	ZEND_FE(variant_abs, arginfo_variant_abs)
188 	ZEND_FE(variant_fix, arginfo_variant_fix)
189 	ZEND_FE(variant_int, arginfo_variant_int)
190 	ZEND_FE(variant_neg, arginfo_variant_neg)
191 	ZEND_FE(variant_not, arginfo_variant_not)
192 	ZEND_FE(variant_round, arginfo_variant_round)
193 	ZEND_FE(variant_cmp, arginfo_variant_cmp)
194 	ZEND_FE(variant_date_to_timestamp, arginfo_variant_date_to_timestamp)
195 	ZEND_FE(variant_date_from_timestamp, arginfo_variant_date_from_timestamp)
196 	ZEND_FE(variant_get_type, arginfo_variant_get_type)
197 	ZEND_FE(variant_set_type, arginfo_variant_set_type)
198 	ZEND_FE(variant_cast, arginfo_variant_cast)
199 	ZEND_FE(com_get_active_object, arginfo_com_get_active_object)
200 	ZEND_FE(com_create_guid, arginfo_com_create_guid)
201 	ZEND_FE(com_event_sink, arginfo_com_event_sink)
202 	ZEND_FE(com_print_typeinfo, arginfo_com_print_typeinfo)
203 	ZEND_FE(com_message_pump, arginfo_com_message_pump)
204 	ZEND_FE(com_load_typelib, arginfo_com_load_typelib)
205 	ZEND_FE_END
206 };
207 
208 static const zend_function_entry class_variant_methods[] = {
209 	ZEND_ME(variant, __construct, arginfo_class_variant___construct, ZEND_ACC_PUBLIC)
210 	ZEND_FE_END
211 };
212 
213 static const zend_function_entry class_com_methods[] = {
214 	ZEND_ME(com, __construct, arginfo_class_com___construct, ZEND_ACC_PUBLIC)
215 	ZEND_FE_END
216 };
217 
218 #if HAVE_MSCOREE_H
219 static const zend_function_entry class_dotnet_methods[] = {
220 	ZEND_ME(dotnet, __construct, arginfo_class_dotnet___construct, ZEND_ACC_PUBLIC)
221 	ZEND_FE_END
222 };
223 #endif
224 
225 static const zend_function_entry class_com_safearray_proxy_methods[] = {
226 	ZEND_FE_END
227 };
228 
229 static const zend_function_entry class_com_exception_methods[] = {
230 	ZEND_FE_END
231 };
232 
register_com_extension_symbols(int module_number)233 static void register_com_extension_symbols(int module_number)
234 {
235 	REGISTER_LONG_CONSTANT("CLSCTX_INPROC_SERVER", CLSCTX_INPROC_SERVER, CONST_PERSISTENT);
236 	REGISTER_LONG_CONSTANT("CLSCTX_INPROC_HANDLER", CLSCTX_INPROC_HANDLER, CONST_PERSISTENT);
237 	REGISTER_LONG_CONSTANT("CLSCTX_LOCAL_SERVER", CLSCTX_LOCAL_SERVER, CONST_PERSISTENT);
238 	REGISTER_LONG_CONSTANT("CLSCTX_REMOTE_SERVER", CLSCTX_REMOTE_SERVER, CONST_PERSISTENT);
239 	REGISTER_LONG_CONSTANT("CLSCTX_SERVER", CLSCTX_SERVER, CONST_PERSISTENT);
240 	REGISTER_LONG_CONSTANT("CLSCTX_ALL", CLSCTX_ALL, CONST_PERSISTENT);
241 	REGISTER_LONG_CONSTANT("VT_NULL", VT_NULL, CONST_PERSISTENT);
242 	REGISTER_LONG_CONSTANT("VT_EMPTY", VT_EMPTY, CONST_PERSISTENT);
243 	REGISTER_LONG_CONSTANT("VT_UI1", VT_UI1, CONST_PERSISTENT);
244 	REGISTER_LONG_CONSTANT("VT_I1", VT_I1, CONST_PERSISTENT);
245 	REGISTER_LONG_CONSTANT("VT_UI2", VT_UI2, CONST_PERSISTENT);
246 	REGISTER_LONG_CONSTANT("VT_I2", VT_I2, CONST_PERSISTENT);
247 	REGISTER_LONG_CONSTANT("VT_UI4", VT_UI4, CONST_PERSISTENT);
248 	REGISTER_LONG_CONSTANT("VT_I4", VT_I4, CONST_PERSISTENT);
249 	REGISTER_LONG_CONSTANT("VT_R4", VT_R4, CONST_PERSISTENT);
250 	REGISTER_LONG_CONSTANT("VT_R8", VT_R8, CONST_PERSISTENT);
251 	REGISTER_LONG_CONSTANT("VT_BOOL", VT_BOOL, CONST_PERSISTENT);
252 	REGISTER_LONG_CONSTANT("VT_ERROR", VT_ERROR, CONST_PERSISTENT);
253 	REGISTER_LONG_CONSTANT("VT_CY", VT_CY, CONST_PERSISTENT);
254 	REGISTER_LONG_CONSTANT("VT_DATE", VT_DATE, CONST_PERSISTENT);
255 	REGISTER_LONG_CONSTANT("VT_BSTR", VT_BSTR, CONST_PERSISTENT);
256 	REGISTER_LONG_CONSTANT("VT_DECIMAL", VT_DECIMAL, CONST_PERSISTENT);
257 	REGISTER_LONG_CONSTANT("VT_UNKNOWN", VT_UNKNOWN, CONST_PERSISTENT);
258 	REGISTER_LONG_CONSTANT("VT_DISPATCH", VT_DISPATCH, CONST_PERSISTENT);
259 	REGISTER_LONG_CONSTANT("VT_VARIANT", VT_VARIANT, CONST_PERSISTENT);
260 	REGISTER_LONG_CONSTANT("VT_INT", VT_INT, CONST_PERSISTENT);
261 	REGISTER_LONG_CONSTANT("VT_UINT", VT_UINT, CONST_PERSISTENT);
262 	REGISTER_LONG_CONSTANT("VT_ARRAY", VT_ARRAY, CONST_PERSISTENT);
263 	REGISTER_LONG_CONSTANT("VT_BYREF", VT_BYREF, CONST_PERSISTENT);
264 	REGISTER_LONG_CONSTANT("CP_ACP", CP_ACP, CONST_PERSISTENT);
265 	REGISTER_LONG_CONSTANT("CP_MACCP", CP_MACCP, CONST_PERSISTENT);
266 	REGISTER_LONG_CONSTANT("CP_OEMCP", CP_OEMCP, CONST_PERSISTENT);
267 	REGISTER_LONG_CONSTANT("CP_UTF7", CP_UTF7, CONST_PERSISTENT);
268 	REGISTER_LONG_CONSTANT("CP_UTF8", CP_UTF8, CONST_PERSISTENT);
269 	REGISTER_LONG_CONSTANT("CP_SYMBOL", CP_SYMBOL, CONST_PERSISTENT);
270 	REGISTER_LONG_CONSTANT("CP_THREAD_ACP", CP_THREAD_ACP, CONST_PERSISTENT);
271 	REGISTER_LONG_CONSTANT("VARCMP_LT", VARCMP_LT, CONST_PERSISTENT);
272 	REGISTER_LONG_CONSTANT("VARCMP_EQ", VARCMP_EQ, CONST_PERSISTENT);
273 	REGISTER_LONG_CONSTANT("VARCMP_GT", VARCMP_GT, CONST_PERSISTENT);
274 	REGISTER_LONG_CONSTANT("VARCMP_NULL", VARCMP_NULL, CONST_PERSISTENT);
275 	REGISTER_LONG_CONSTANT("LOCALE_SYSTEM_DEFAULT", LOCALE_SYSTEM_DEFAULT, CONST_PERSISTENT);
276 	REGISTER_LONG_CONSTANT("LOCALE_NEUTRAL", LOCALE_NEUTRAL, CONST_PERSISTENT);
277 	REGISTER_LONG_CONSTANT("NORM_IGNORECASE", NORM_IGNORECASE, CONST_PERSISTENT);
278 	REGISTER_LONG_CONSTANT("NORM_IGNORENONSPACE", NORM_IGNORENONSPACE, CONST_PERSISTENT);
279 	REGISTER_LONG_CONSTANT("NORM_IGNORESYMBOLS", NORM_IGNORESYMBOLS, CONST_PERSISTENT);
280 	REGISTER_LONG_CONSTANT("NORM_IGNOREWIDTH", NORM_IGNOREWIDTH, CONST_PERSISTENT);
281 	REGISTER_LONG_CONSTANT("NORM_IGNOREKANATYPE", NORM_IGNOREKANATYPE, CONST_PERSISTENT);
282 #if defined(NORM_IGNOREKASHIDA)
283 	REGISTER_LONG_CONSTANT("NORM_IGNOREKASHIDA", NORM_IGNOREKASHIDA, CONST_PERSISTENT);
284 #endif
285 	REGISTER_LONG_CONSTANT("DISP_E_DIVBYZERO", PHP_DISP_E_DIVBYZERO, CONST_PERSISTENT);
286 	REGISTER_LONG_CONSTANT("DISP_E_OVERFLOW", PHP_DISP_E_OVERFLOW, CONST_PERSISTENT);
287 	REGISTER_LONG_CONSTANT("DISP_E_BADINDEX", PHP_DISP_E_BADINDEX, CONST_PERSISTENT);
288 	REGISTER_LONG_CONSTANT("DISP_E_PARAMNOTFOUND", PHP_DISP_E_PARAMNOTFOUND, CONST_PERSISTENT);
289 	REGISTER_LONG_CONSTANT("MK_E_UNAVAILABLE", PHP_MK_E_UNAVAILABLE, CONST_PERSISTENT);
290 #if SIZEOF_ZEND_LONG == 8
291 	REGISTER_LONG_CONSTANT("VT_UI8", VT_UI8, CONST_PERSISTENT);
292 #endif
293 #if SIZEOF_ZEND_LONG == 8
294 	REGISTER_LONG_CONSTANT("VT_I8", VT_I8, CONST_PERSISTENT);
295 #endif
296 }
297 
register_class_variant(void)298 static zend_class_entry *register_class_variant(void)
299 {
300 	zend_class_entry ce, *class_entry;
301 
302 	INIT_CLASS_ENTRY(ce, "variant", class_variant_methods);
303 	class_entry = zend_register_internal_class_ex(&ce, NULL);
304 	class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE;
305 
306 	return class_entry;
307 }
308 
register_class_com(zend_class_entry * class_entry_variant)309 static zend_class_entry *register_class_com(zend_class_entry *class_entry_variant)
310 {
311 	zend_class_entry ce, *class_entry;
312 
313 	INIT_CLASS_ENTRY(ce, "com", class_com_methods);
314 	class_entry = zend_register_internal_class_ex(&ce, class_entry_variant);
315 
316 	return class_entry;
317 }
318 
319 #if HAVE_MSCOREE_H
register_class_dotnet(zend_class_entry * class_entry_variant)320 static zend_class_entry *register_class_dotnet(zend_class_entry *class_entry_variant)
321 {
322 	zend_class_entry ce, *class_entry;
323 
324 	INIT_CLASS_ENTRY(ce, "dotnet", class_dotnet_methods);
325 	class_entry = zend_register_internal_class_ex(&ce, class_entry_variant);
326 
327 	return class_entry;
328 }
329 #endif
330 
register_class_com_safearray_proxy(void)331 static zend_class_entry *register_class_com_safearray_proxy(void)
332 {
333 	zend_class_entry ce, *class_entry;
334 
335 	INIT_CLASS_ENTRY(ce, "com_safearray_proxy", class_com_safearray_proxy_methods);
336 	class_entry = zend_register_internal_class_ex(&ce, NULL);
337 	class_entry->ce_flags |= ZEND_ACC_FINAL;
338 
339 	return class_entry;
340 }
341 
register_class_com_exception(zend_class_entry * class_entry_Exception)342 static zend_class_entry *register_class_com_exception(zend_class_entry *class_entry_Exception)
343 {
344 	zend_class_entry ce, *class_entry;
345 
346 	INIT_CLASS_ENTRY(ce, "com_exception", class_com_exception_methods);
347 	class_entry = zend_register_internal_class_ex(&ce, class_entry_Exception);
348 	class_entry->ce_flags |= ZEND_ACC_FINAL;
349 
350 	return class_entry;
351 }
352