[Home] [Help]
PACKAGE BODY: APPS.AR_CREATE_ACCTING_SRS
Source
1 PACKAGE BODY ar_create_accting_srs AS
2 /*$Header: ARSACCTB.pls 120.10.12000000.2 2007/08/22 13:24:16 sgnagara ship $*/
3
4 g_exec_status VARCHAR2(1) := fnd_api.G_RET_STS_SUCCESS;
5
6 g_xla_run VARCHAR2(1) := 'Y';
7 --Local procedures
8 PROCEDURE log(
9 message IN VARCHAR2,
10 newline IN BOOLEAN DEFAULT TRUE) IS
11 BEGIN
12 IF message = 'NEWLINE' THEN
13 FND_FILE.NEW_LINE(FND_FILE.LOG, 1);
14 ELSIF (newline) THEN
15 FND_FILE.put_line(fnd_file.log,message);
16 ELSE
17 FND_FILE.put(fnd_file.log,message);
18 END IF;
19 END log;
20
21 PROCEDURE out(
22 message IN VARCHAR2,
23 newline IN BOOLEAN DEFAULT TRUE) IS
24 BEGIN
25 IF message = 'NEWLINE' THEN
26 FND_FILE.NEW_LINE(FND_FILE.output, 1);
27 ELSIF (newline) THEN
28 FND_FILE.put_line(fnd_file.output,message);
29 ELSE
30 FND_FILE.put(fnd_file.output,message);
31 END IF;
32 END out;
33
34 PROCEDURE outandlog(
35 message IN VARCHAR2,
36 newline IN BOOLEAN DEFAULT TRUE) IS
37 BEGIN
38 out(message, newline);
39 log(message, newline);
40 END outandlog;
41
42 FUNCTION logerror(SQLERRM VARCHAR2 DEFAULT NULL)
43 RETURN VARCHAR2 IS
44 l_msg_data VARCHAR2(2000);
45 BEGIN
46 FND_MSG_PUB.Reset;
47
48 FOR I IN 1..FND_MSG_PUB.Count_Msg LOOP
49 l_msg_data := l_msg_data || FND_MSG_PUB.Get(p_encoded => FND_API.G_FALSE );
50 END LOOP;
51 IF (SQLERRM IS NOT NULL) THEN
52 l_msg_data := l_msg_data || SQLERRM;
53 END IF;
54 log(l_msg_data);
55 RETURN l_msg_data;
56 END logerror;
57
58 PROCEDURE revrec_per_org
59 (p_report_mode IN VARCHAR2 := 'S',
60 p_max_workers IN NUMBER := 2,
61 p_interval IN NUMBER := 60,
62 p_max_wait IN NUMBER := 180,
63 p_org_id IN NUMBER,
64 x_out_request_id OUT NOCOPY NUMBER)
65 IS
66 revrec_sub_pb EXCEPTION;
67 BEGIN
68 outandlog('Submitting Revenue Recognition ARTERRPM for Org_id:'||p_org_id);
69 FND_REQUEST.SET_ORG_ID(p_org_id);
70 x_out_request_id := FND_REQUEST.SUBMIT_REQUEST(
71 application=>'AR',
72 program=>'ARTERRPM',
73 sub_request=>FALSE,
74 argument1=> p_report_mode,
75 argument2=> p_max_workers,
76 argument3=> p_interval,
77 argument4=> p_max_wait,
78 argument5=> p_org_id );
79 IF x_out_request_id <> 0 THEN
80 outandlog('Revenue Recognition submitted for Org_id:'||p_org_id||' by the request '||x_out_request_id);
81 INSERT INTO ar_submission_ctrl_gt
82 (worker_id , --org_id
83 batch_id , --batch_id
84 script_name , --script_name
85 status , --
86 order_num , --order helper number
87 request_id , --request_id
88 table_name ) --table_name
89 VALUES
90 (p_org_id,
91 NULL,
92 'ARTERRPM',
93 'SUBMITTED',
94 1,
95 x_out_request_id,
96 'REVREC');
97 COMMIT;
98 ELSE
99 RAISE revrec_sub_pb;
100 END IF;
101 EXCEPTION
102 WHEN revrec_sub_pb THEN
103 log(logerror(SQLERRM));
104 WHEN OTHERS THEN
105 log(logerror(SQLERRM));
106 END;
107
108
109 PROCEDURE rev_contigency_per_org
110 (p_org_id IN NUMBER,
111 x_out_request_id OUT NOCOPY NUMBER)
112 IS
113 rev_contingency_sub_pb EXCEPTION;
114 BEGIN
115 outandlog('submit_rev_contigency for org_id :'||p_org_id);
116 FND_REQUEST.SET_ORG_ID(p_org_id);
117
118 IF (ar_revenue_management_pvt.revenue_management_enabled) THEN
119
120 x_out_request_id := FND_REQUEST.SUBMIT_REQUEST(
121 application=>'AR',
122 program=>'ARREVSWP',
123 sub_request=>FALSE,
124 argument1 =>p_org_id);
125 IF x_out_request_id <> 0 THEN
126 outandlog('submit_rev_contigency for org_id :'||p_org_id||' has submitted the request :'||x_out_request_id);
127 INSERT INTO ar_submission_ctrl_gt
128 (worker_id , --org_id
129 batch_id , --batch_id
130 script_name , --script_name
131 status , --
132 order_num , --order helper number
133 request_id , --request_id
134 table_name ) --table_name
135 VALUES
136 (p_org_id,
137 NULL,
138 'ARREVSWP',
139 'SUBMITTED',
140 2,
141 x_out_request_id,
142 'REVCONTEN');
143 COMMIT;
144 ELSE
145 RAISE rev_contingency_sub_pb;
146 END IF;
147
148 END IF;
149 EXCEPTION
150 WHEN rev_contingency_sub_pb THEN
151 log(logerror(SQLERRM));
152 WHEN OTHERS THEN
153 log(logerror(SQLERRM));
154 END;
155
156
157 PROCEDURE sla_create_accounting
158 (p_request_id IN NUMBER DEFAULT NULL
159 ,p_entity_id IN NUMBER DEFAULT NULL
160 ,p_src_app IN NUMBER DEFAULT NULL
161 ,p_app IN NUMBER DEFAULT NULL
162 ,p_dummy_param0 IN VARCHAR2 DEFAULT NULL
163 ,p_ledger IN NUMBER
164 ,p_proc_categ IN VARCHAR2 DEFAULT NULL
165 ,p_end_date IN DATE
166 ,p_create_acct IN VARCHAR2
167 ,p_dummy_param1 IN VARCHAR2 DEFAULT NULL
168 ,p_acct_mode IN VARCHAR2
169 ,p_dummy_param2 IN VARCHAR2 DEFAULT NULL
170 ,p_errors_only IN VARCHAR2
171 ,p_report IN VARCHAR2
172 ,p_transf_gl IN VARCHAR2
173 ,p_dummy_param3 IN VARCHAR2 DEFAULT NULL
174 ,p_post_to_gl IN VARCHAR2
175 ,p_gl_batch_name IN VARCHAR2 DEFAULT NULL
176 ,p_mixed_currency IN NUMBER DEFAULT NULL
177 ,p_val_meth IN VARCHAR2 DEFAULT NULL
178 ,p_sec_id_int_1 IN NUMBER DEFAULT NULL
179 ,p_sec_id_int_2 IN NUMBER DEFAULT NULL
180 ,p_sec_id_int_3 IN NUMBER DEFAULT NULL
181 ,p_sec_id_char_1 IN VARCHAR2 DEFAULT NULL
182 ,p_sec_id_char_2 IN VARCHAR2 DEFAULT NULL
183 ,p_sec_id_char_3 IN VARCHAR2 DEFAULT NULL
184 --BUG#5391740
185 ,p_include_user_trx_id_flag IN VARCHAR2 DEFAULT 'N'
186 ,p_include_user_trx_identifiers IN VARCHAR2 DEFAULT NULL
187 ,p_debug_flag IN VARCHAR2 DEFAULT NULL
188 )
189 IS
190 CURSOR c_app_name(p_app_id IN NUMBER) IS
191 SELECT application_name
192 FROM FND_APPLICATION_VL FVL
193 WHERE application_id = p_src_app;
194
195 CURSOR c_ledger_name(p_ledger_id IN NUMBER) IS
196 SELECT name
197 FROM gl_ledgers
198 WHERE ledger_id = p_ledger_id;
199
200 CURSOR c_valid_date(p_ledger_id IN VARCHAR2,
201 p_date IN DATE) IS
202 SELECT 'Y'
203 FROM gl_period_statuses glp
204 WHERE glp.application_id = 222
205 AND p_date BETWEEN glp.start_date AND glp.end_date
206 AND glp.set_of_books_id = p_ledger
207 AND glp.closing_status IN ('O','F');
208
209 l_res VARCHAr2(1);
210 l_iso_language VARCHAR2(30);
211 l_iso_territory VARCHAR2(30);
212 l_bool BOOLEAN;
213 l_request_id NUMBER;
214 l_src_app VARCHAR2(240);
215 l_app VARCHAR2(240);
216 l_ledger_name VARCHAR2(30);
217 x_msg_count NUMBER;
218 x_msg_data VARCHAR2(2000);
219 create_acct_sub_pb EXCEPTION;
220 accting_date_pb EXCEPTION;
221 BEGIN
222 outandlog('sla_create_accounting for the ledger: '||p_ledger);
223
224 /*BUG#5687816 -- Remove the verification to AR accounting period status
225 IF p_acct_mode = 'F' THEN
226 log('ledger_id:'||p_ledger);
227 log('End Date :'||p_end_date);
228 OPEN c_valid_date(p_ledger_id => p_ledger,
229 p_date => p_end_date);
230 FETCH c_valid_date INTO l_res;
231 IF c_valid_date%NOTFOUND THEN
232 FND_MSG_PUB.initialize;
233 FND_MESSAGE.SET_NAME('AR','AR_ACCT_PERIOD_NOT_OPEN');
234 FND_MSG_PUB.ADD;
235 RAISE accting_date_pb;
236 END IF;
237 END IF;
238 */
239
240 OPEN c_app_name(p_src_app);
241 FETCH c_app_name INTO l_src_app;
242 CLOSE c_app_name;
243
244 OPEN c_app_name(p_app);
245 FETCH c_app_name INTO l_app;
246 CLOSE c_app_name;
247
248 OPEN c_ledger_name(p_ledger);
249 FETCH c_ledger_name INTO l_ledger_name;
250 CLOSE c_ledger_name;
251
252 SELECT lower(iso_language),iso_territory
253 INTO l_iso_language,
254 l_iso_territory
255 FROM FND_LANGUAGES
256 WHERE language_code = USERENV('LANG');
257
258
259 l_bool := fnd_request.add_layout
260 (template_appl_name => 'XLA',
261 template_code => 'XLAACCPB01',
262 template_language => l_iso_language,
263 template_territory => l_iso_territory,
264 output_format => 'PDF');
265
266 l_request_id := FND_REQUEST.SUBMIT_REQUEST(
267 application=>'XLA',
268 program=>'XLAACCPB',
269 sub_request=>FALSE,
270 argument1 =>p_src_app,
271 argument2 =>p_app,
272 argument3 =>p_dummy_param0,
273 argument4 =>p_ledger,
274 argument5 =>p_proc_categ,
275 argument6 =>fnd_date.date_to_canonical(p_end_date),
276 argument7 =>p_create_acct,
277 argument8 =>p_dummy_param1,
278 argument9 =>p_acct_mode,
279 argument10=>p_dummy_param2,
280 argument11=>p_errors_only,
281 argument12=>p_report,
282 argument13=>p_transf_gl,
283 argument14=>p_dummy_param3,
284 argument15=>p_post_to_gl,
285 argument16=>p_gl_batch_name,
286 argument17=>p_mixed_currency,
287 argument18=>'N',
288 argument19=>p_request_id,
289 argument20=>p_entity_id,
290 argument21=>l_src_app,
291 argument22=>l_app,
292 argument23=>l_ledger_name,
293 argument24=>p_proc_categ,
294 argument25=>p_create_acct,
295 argument26=>'',
296 argument27=>p_errors_only,
297 argument28=>p_report,
298 argument29=>p_transf_gl,
299 argument30=>p_post_to_gl,
300 argument31=>'No',
301 argument32=>p_val_meth,
302 argument33=>p_sec_id_int_1,
303 argument34=>p_sec_id_int_2,
304 argument35=>p_sec_id_int_3,
305 argument36=>p_sec_id_char_1,
306 argument37=>p_sec_id_char_2,
307 argument38=>p_sec_id_char_3,
308 argument39=>NULL,
309 argument40=>p_include_user_trx_id_flag,
310 argument41=>p_include_user_trx_identifiers,
311 argument42=>p_debug_flag );
312
313
314 IF l_request_id <> 0 THEN
315 outandlog('sla create accounting submitted with the request_id'||l_request_id);
316 COMMIT;
317 ELSE
318 RAISE create_acct_sub_pb;
319 END IF;
320 EXCEPTION
321 WHEN accting_date_pb THEN
322 g_xla_run := 'N';
323 IF c_valid_date%ISOPEN THEN
324 CLOSE c_valid_date;
325 END IF;
326 FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE,
327 p_count => x_msg_count,
328 p_data => x_msg_data);
329 out(message => x_msg_data);
330 log(message => x_msg_data);
331 WHEN create_acct_sub_pb THEN
332 log(logerror(SQLERRM));
333 WHEN OTHERS THEN
334 log(logerror(SQLERRM));
335 END;
336
337 PROCEDURE wait_for_end_subreq(
338 p_interval IN NUMBER DEFAULT 60
339 ,p_max_wait IN NUMBER DEFAULT 180
340 ,p_sub_name IN VARCHAR2)
341 IS
342 CURSOR reqs IS
343 SELECT request_id
344 FROM ar_submission_ctrl_gt
345 WHERE status <> 'COMPLETE'
346 AND script_name = p_sub_name;
347 l_req_id NUMBER;
348 l_phase VARCHAR2(50);
349 l_status VARCHAR2(50);
350 l_dev_phase VARCHAR2(50);
351 l_dev_status VARCHAR2(50);
352 l_message VARCHAR2(2000);
353 l_complete BOOLEAN;
354 revrecdone EXCEPTION;
355 BEGIN
356 log('wait_for_end_subreq :'|| p_sub_name ||' to finish');
357 LOOP
358 OPEN reqs;
359 LOOP
360 FETCH reqs INTO l_req_id;
361 EXIT WHEN reqs%NOTFOUND;
362 l_complete := FND_CONCURRENT.WAIT_FOR_REQUEST(
363 request_id=>l_req_id,
364 interval=>p_interval,
365 max_wait=>p_max_wait,
366 phase=>l_phase,
367 status=>l_status,
368 dev_phase=>l_dev_phase,
369 dev_status=>l_dev_status,
370 message=>l_message);
371 IF l_dev_phase = 'COMPLETE' THEN
372 UPDATE ar_submission_ctrl_gt
373 SET status = 'COMPLETE'
374 WHERE request_id = l_req_id;
375 --{If required, we can control the error handling at concurrent process level
376 -- but as this is part of the accounting posting process if revrec or rev analyser fails
377 -- for now we allow the accouning for the cash receipts
378 -- IF l_dev_status IN ('TERMINATED', 'CANCELLED', 'ERROR') THEN
379 -- RAISE fnd_api.G_EXC_UNEXPECTED_ERROR;
380 -- END IF;
381 --}
382 END IF;
383 END LOOP;
384 CLOSE reqs;
385
386 OPEN reqs;
387 FETCH reqs INTO l_req_id;
388 IF reqs%NOTFOUND THEN
389 RAISE revrecdone;
390 END IF;
391 CLOSE reqs;
392 END LOOP;
393 EXCEPTION
394 WHEN revrecdone THEN
395 IF reqs%ISOPEN THEN
396 CLOSE reqs;
397 END IF;
398 WHEN fnd_api.G_EXC_UNEXPECTED_ERROR THEN
399 g_exec_status := fnd_api.G_RET_STS_UNEXP_ERROR;
400 WHEN OTHERS THEN
401 IF reqs%ISOPEN THEN
402 CLOSE reqs;
403 END IF;
404 RAISE;
405 END;
406
407 -- Public procedure
408 PROCEDURE submission (
409 errbuf OUT NOCOPY VARCHAR2
410 ,retcode OUT NOCOPY NUMBER
411 --
412 ,p_report_mode IN VARCHAR2 DEFAULT 'S'
413 ,p_max_workers IN NUMBER DEFAULT 2
414 ,p_interval IN NUMBER DEFAULT 60
415 ,p_max_wait IN NUMBER DEFAULT 180
416 ---
417 ,p_request_id IN NUMBER DEFAULT NULL
418 ,p_entity_id IN NUMBER DEFAULT NULL
419 ,p_src_app IN NUMBER DEFAULT NULL
420 ,p_app IN NUMBER DEFAULT NULL
421 ,p_dummy_param0 IN VARCHAR2 DEFAULT NULL
422 ,p_ledger IN NUMBER
423 ,p_proc_categ IN VARCHAR2 DEFAULT NULL
424 ,p_end_date IN VARCHAR2
425 ,p_create_acct IN VARCHAR2
426 ,p_dummy_param1 IN VARCHAR2 DEFAULT NULL
427 ,p_acct_mode IN VARCHAR2
428 ,p_dummy_param2 IN VARCHAR2 DEFAULT NULL
429 ,p_errors_only IN VARCHAR2
430 ,p_report IN VARCHAR2
434 ,p_gl_batch_name IN VARCHAR2 DEFAULT NULL
431 ,p_transf_gl IN VARCHAR2
432 ,p_dummy_param3 IN VARCHAR2 DEFAULT NULL
433 ,p_post_to_gl IN VARCHAR2
435 ,p_mixed_currency IN NUMBER DEFAULT NULL
436 ,p_val_meth IN VARCHAR2 DEFAULT NULL
437 ,p_sec_id_int_1 IN NUMBER DEFAULT NULL
438 ,p_sec_id_int_2 IN NUMBER DEFAULT NULL
439 ,p_sec_id_int_3 IN NUMBER DEFAULT NULL
440 ,p_sec_id_char_1 IN VARCHAR2 DEFAULT NULL
441 ,p_sec_id_char_2 IN VARCHAR2 DEFAULT NULL
442 ,p_sec_id_char_3 IN VARCHAR2 DEFAULT NULL
443 --BUG#5391740
444 ,p_include_user_trx_id_flag IN VARCHAR2 DEFAULT 'N'
445 ,p_include_user_trx_identifiers IN VARCHAR2 DEFAULT NULL
446 ,p_debug_flag IN VARCHAR2 DEFAULT NULL
447 ,p_user_id IN NUMBER DEFAULT fnd_profile.value('USER_ID')
448 )
449 IS
450 CURSOR ous(p_ledger_id IN NUMBER) IS
451 SELECT DISTINCT arsys.org_id
452 FROM ar_system_parameters_all arsys,
453 mo_glob_org_access_tmp mo
454 WHERE arsys.set_of_books_id = p_ledger_id
455 AND arsys.org_id = mo.organization_id;
456
457 l_org_id NUMBER;
458 l_request_id NUMBER;
459 i NUMBER;
460 l_text VARCHAR2(2000);
461 NullLedger EXCEPTION;
462 xla_not_run EXCEPTION;
463 BEGIN
464 outandlog('Submission parameters');
465 outandlog('p_report_mode :'||p_report_mode);
466 outandlog('p_max_workers :'||p_max_workers);
467 outandlog('p_interval :'||p_interval);
468 outandlog('p_max_wait :'||p_max_wait);
469 outandlog('p_request_id :'||p_request_id);
470 outandlog('p_entity_id :'||p_entity_id);
471 outandlog('p_src_app :'||p_src_app);
472 outandlog('p_app :'||p_app);
473 outandlog('p_dummy_param0:'||p_dummy_param0);
474 outandlog('p_ledger :'||p_ledger);
475 outandlog('p_proc_categ :'||p_proc_categ);
476 outandlog('p_end_date :'||p_end_date);
477 outandlog('p_create_acct :'||p_create_acct);
478 outandlog('p_dummy_param1:'||p_dummy_param1);
479 outandlog('p_acct_mode :'||p_acct_mode);
480 outandlog('p_dummy_param2:'||p_dummy_param2);
481 outandlog('p_errors_only :'||p_errors_only);
482 outandlog('p_report :'||p_report);
483 outandlog('p_transf_gl :'||p_transf_gl);
484 outandlog('p_dummy_param3:'||p_dummy_param3);
485 outandlog('p_post_to_gl :'||p_post_to_gl);
486 outandlog('p_gl_batch_name:'||p_gl_batch_name);
487 outandlog('p_mixed_currency:'||p_mixed_currency);
488 outandlog('p_val_meth :'||p_val_meth);
489 outandlog('p_sec_id_int_1 :'||p_sec_id_int_1);
490 outandlog('p_sec_id_int_2 :'||p_sec_id_int_2);
491 outandlog('p_sec_id_int_3 :'||p_sec_id_int_3);
492 outandlog('p_sec_id_char_1:'||p_sec_id_char_1);
493 outandlog('p_sec_id_char_2:'||p_sec_id_char_2);
494 outandlog('p_sec_id_char_3:'||p_sec_id_char_3);
495
496 IF p_ledger IS NULL THEN
497 RAISE NullLedger;
498 END IF;
499
500 OPEN ous(p_ledger);
501 LOOP
502 FETCH ous INTO l_org_id;
503 EXIT WHEN ous%NOTFOUND;
504
505 --submission of Rev Rec
506 revrec_per_org
507 (p_report_mode => p_report_mode,
508 p_max_workers => p_max_workers,
509 p_interval => p_interval,
510 p_max_wait => p_max_wait,
511 p_org_id => l_org_id,
512 x_out_request_id => l_request_id);
513
514 END LOOP;
515 CLOSE ous;
516
517 wait_for_end_subreq(
518 p_interval => p_interval
519 ,p_max_wait => p_max_wait
520 ,p_sub_name => 'ARTERRPM' );
521
522
523 OPEN ous(p_ledger);
524 LOOP
525 FETCH ous INTO l_org_id;
526 EXIT WHEN ous%NOTFOUND;
527 --Run Revenue Contingency Analyzer
528 rev_contigency_per_org
529 (p_org_id => l_org_id,
530 x_out_request_id => l_request_id);
531 END LOOP;
532 CLOSE ous;
533
534 wait_for_end_subreq(
535 p_interval => p_interval
536 ,p_max_wait => p_max_wait
537 ,p_sub_name => 'ARREVSWP' );
538
539 --Submit SLA Create Accounting
540 sla_create_accounting
541 (p_request_id => p_request_id
542 ,p_entity_id => p_entity_id
543 ,p_src_app => p_src_app
544 ,p_app => p_app
545 ,p_dummy_param0 => p_dummy_param0
546 ,p_ledger => p_ledger
547 ,p_proc_categ => p_proc_categ
548 ,p_end_date => fnd_date.canonical_to_date(p_end_date)
549 --,p_end_date => p_end_date
550 ,p_create_acct => p_create_acct
551 ,p_dummy_param1 => p_dummy_param1
552 ,p_acct_mode => p_acct_mode
553 ,p_dummy_param2 => p_dummy_param2
554 ,p_errors_only => p_errors_only
555 ,p_report => p_report
556 ,p_transf_gl => p_transf_gl
557 ,p_dummy_param3 => p_dummy_param3
558 ,p_post_to_gl => p_post_to_gl
559 ,p_gl_batch_name => p_gl_batch_name
560 ,p_mixed_currency => p_mixed_currency
561 ,p_val_meth => p_val_meth
562 ,p_sec_id_int_1 => p_sec_id_int_1
563 ,p_sec_id_int_2 => p_sec_id_int_2
564 ,p_sec_id_int_3 => p_sec_id_int_3
565 ,p_sec_id_char_1 => p_sec_id_char_1
566 ,p_sec_id_char_2 => p_sec_id_char_2
567 ,p_sec_id_char_3 => p_sec_id_char_3
568 ,p_include_user_trx_id_flag => p_include_user_trx_id_flag
569 ,p_include_user_trx_identifiers => p_include_user_trx_identifiers
570 ,p_debug_flag => p_debug_flag
571 );
572
573 IF g_xla_run = 'N' THEN
574 RAISE xla_not_run;
575 END IF;
576
577 EXCEPTION
578 WHEN NullLedger THEN
579 retcode := 2;
580 log('Ledger can not be null');
581 errbuf := 'Ledger can not be null';
582
583 WHEN xla_not_run THEN
584 retcode := 1;
585
586 WHEN OTHERS THEN
587 retcode := 2;
588 l_text := logerror(SQLERRM);
589 log(l_text);
590 errbuf := l_text;
591 IF ous%ISOPEN THEN CLOSE ous; END IF;
592 RAISE;
593
594 END;
595
596 END;