Built motion from commit 953226e6.|2.6.32
[motion2.git] / server / config / triggers / index.js
index e43987b..99c7aa0 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0xe38c=['SELECT','contact','UserId','undefined','interface','agent','incomingmessage','outgoingmessage','SELECT\x20*\x20FROM\x20cm_contacts\x20WHERE\x20id\x20=\x20','QueryTypes','format','AfterCreate','changed','closed','substatus','SIP/%s','AfterUpdate','User','find','name','fullname','email','internal','length','hasOwnProperty','hook','callback','toLowerCase','util','../../mysqldb','jayson/promise','../logger','triggers','http','Chat','ChatInteraction','afterCreate','closedinteraction','newmessage','Sms','newinteraction','SmsInteraction','afterUpdate','SmsMessage','Whatsapp','WhatsappInteraction','WhatsappMessage','FaxInteraction','Fax','FaxMessage','MailInteraction','Mail','OpenchannelInteraction','Openchannel','OpenchannelMessage','request','EventManager','then','info','Trigger,\x20%s','error','code','catch','get','channel','motionChannel','event','direction','resolve','ContactId','sequelize','query','Sequelize'];(function(_0x2d281e,_0x5d509b){var _0x4c985c=function(_0xaad575){while(--_0xaad575){_0x2d281e['push'](_0x2d281e['shift']());}};_0x4c985c(++_0x5d509b);}(_0xe38c,0x1d2));var _0xce38=function(_0x13e741,_0x5d3c24){_0x13e741=_0x13e741-0x0;var _0x3f8bb3=_0xe38c[_0x13e741];return _0x3f8bb3;};'use strict';var util=require(_0xce38('0x0'));var db=require(_0xce38('0x1'))['db'];var jayson=require(_0xce38('0x2'));var logger=require(_0xce38('0x3'))(_0xce38('0x4'));var client=jayson['client'][_0xce38('0x5')]({'port':0x232a});var triggers=[{'channel':_0xce38('0x6'),'model':_0xce38('0x7'),'event':_0xce38('0x8'),'condition':'newinteraction','callback':afterCreate},{'channel':_0xce38('0x6'),'model':_0xce38('0x7'),'event':'afterUpdate','condition':_0xce38('0x9'),'callback':afterUpdate},{'channel':_0xce38('0x6'),'model':'ChatMessage','event':_0xce38('0x8'),'condition':'newmessage','callback':afterCreateMessage},{'channel':_0xce38('0x6'),'model':'ChatOfflineMessage','event':_0xce38('0x8'),'condition':_0xce38('0xa'),'callback':afterCreateOfflineMessage},{'channel':_0xce38('0xb'),'model':'SmsInteraction','event':_0xce38('0x8'),'condition':_0xce38('0xc'),'callback':afterCreate},{'channel':_0xce38('0xb'),'model':_0xce38('0xd'),'event':_0xce38('0xe'),'condition':_0xce38('0x9'),'callback':afterUpdate},{'channel':_0xce38('0xb'),'model':_0xce38('0xf'),'event':_0xce38('0x8'),'condition':_0xce38('0xa'),'callback':afterCreateMessage},{'channel':_0xce38('0x10'),'model':_0xce38('0x11'),'event':_0xce38('0x8'),'condition':_0xce38('0xc'),'callback':afterCreate},{'channel':_0xce38('0x10'),'model':_0xce38('0x11'),'event':'afterUpdate','condition':_0xce38('0x9'),'callback':afterUpdate},{'channel':_0xce38('0x10'),'model':_0xce38('0x12'),'event':'afterCreate','condition':'newmessage','callback':afterCreateMessage},{'channel':'Fax','model':_0xce38('0x13'),'event':'afterCreate','condition':_0xce38('0xc'),'callback':afterCreate},{'channel':_0xce38('0x14'),'model':_0xce38('0x13'),'event':'afterUpdate','condition':_0xce38('0x9'),'callback':afterUpdate},{'channel':'Fax','model':_0xce38('0x15'),'event':_0xce38('0x8'),'condition':_0xce38('0xa'),'callback':afterCreateMessage},{'channel':'Mail','model':_0xce38('0x16'),'event':_0xce38('0x8'),'condition':_0xce38('0xc'),'callback':afterCreate},{'channel':_0xce38('0x17'),'model':'MailInteraction','event':_0xce38('0xe'),'condition':_0xce38('0x9'),'callback':afterUpdate},{'channel':'Mail','model':'MailMessage','event':'afterCreate','condition':_0xce38('0xa'),'callback':afterCreateMessage},{'channel':'Openchannel','model':_0xce38('0x18'),'event':_0xce38('0x8'),'condition':_0xce38('0xc'),'callback':afterCreate},{'channel':_0xce38('0x19'),'model':_0xce38('0x18'),'event':_0xce38('0xe'),'condition':_0xce38('0x9'),'callback':afterUpdate},{'channel':_0xce38('0x19'),'model':_0xce38('0x1a'),'event':_0xce38('0x8'),'condition':'newmessage','callback':afterCreateMessage}];function request(_0x38c4e3){return client[_0xce38('0x1b')](_0xce38('0x1c'),_0x38c4e3)[_0xce38('0x1d')](function(_0x5215dd){logger[_0xce38('0x1e')](_0xce38('0x1f'),'EventManager',_0x5215dd);if(_0x5215dd[_0xce38('0x20')]){if(_0x5215dd[_0xce38('0x20')][_0xce38('0x21')]===0x1f4){logger['error']('Trigger,\x20%s',_0xce38('0x1c'),_0x5215dd[_0xce38('0x20')]);}}})[_0xce38('0x22')](function(_0x17bf5c){logger[_0xce38('0x20')]('Trigger,\x20%s',_0xce38('0x1c'),_0x17bf5c);});}function afterCreateMessage(_0x22cd07){return function(_0x532399){_0x532399=_0x532399[_0xce38('0x23')]({'plain':!![]});_0x532399[_0xce38('0x24')]=_0x22cd07;_0x532399[_0xce38('0x25')]=_0x22cd07;_0x532399[_0xce38('0x26')]=_0x532399[_0xce38('0x27')];Promise[_0xce38('0x28')]()[_0xce38('0x1d')](function(){if(typeof _0x532399[_0xce38('0x29')]==='undefined')return null;var _0xe99dd5='SELECT\x20*\x20FROM\x20cm_contacts\x20WHERE\x20id\x20=\x20'+_0x532399[_0xce38('0x29')];return db[_0xce38('0x2a')][_0xce38('0x2b')](_0xe99dd5,{'type':db[_0xce38('0x2c')]['QueryTypes'][_0xce38('0x2d')],'raw':!![]});})[_0xce38('0x1d')](function(_0x2727c4){if(_0x2727c4){_0x532399[_0xce38('0x2e')]=_0x2727c4[0x0];}if(typeof _0x532399[_0xce38('0x2f')]===_0xce38('0x30'))return;return getAgent(_0x532399[_0xce38('0x2f')]);})['then'](function(_0x3c66ea){if(_0x3c66ea){_0x532399[_0xce38('0x31')]=util['format']('SIP/%s',_0x3c66ea['name']);_0x532399[_0xce38('0x32')]=_0x3c66ea;_0x532399['channel']=_0x22cd07;return request({'event':_0xce38('0x33'),'message':_0x532399});}else{return request({'event':_0xce38('0x34'),'message':_0x532399});}})[_0xce38('0x22')](function(_0x420f64){logger[_0xce38('0x20')](_0xce38('0x1f'),'AfterCreateMessage',_0x420f64);});};}function afterCreateOfflineMessage(_0x562cfc){return function(_0x22ea7a){_0x22ea7a=_0x22ea7a[_0xce38('0x23')]({'plain':!![]});_0x22ea7a[_0xce38('0x24')]=_0x562cfc;_0x22ea7a['motionChannel']=_0x562cfc;_0x22ea7a[_0xce38('0x26')]='offlineMessage';return request({'event':_0x22ea7a[_0xce38('0x26')],'message':_0x22ea7a});};}function afterCreate(_0x1ad23c,_0x5e464a){return function(_0x1c1988){_0x1c1988=_0x1c1988['get']({'plain':!![]});_0x1c1988[_0xce38('0x24')]=_0x1ad23c;_0x1c1988['motionChannel']=_0x1ad23c;_0x1c1988[_0xce38('0x26')]='opened';Promise[_0xce38('0x28')]()[_0xce38('0x1d')](function(){var _0x14c24d=_0xce38('0x35')+_0x1c1988[_0xce38('0x29')];return db[_0xce38('0x2a')][_0xce38('0x2b')](_0x14c24d,{'type':db[_0xce38('0x2c')][_0xce38('0x36')][_0xce38('0x2d')],'raw':!![]});})[_0xce38('0x1d')](function(_0x1208be){if(_0x1208be){_0x1c1988['contact']=_0x1208be[0x0];}if(typeof _0x1c1988[_0xce38('0x2f')]===_0xce38('0x30'))return;return getAgent(_0x1c1988[_0xce38('0x2f')]);})['then'](function(_0x14fc00){if(_0x14fc00){_0x1c1988[_0xce38('0x31')]=util[_0xce38('0x37')]('SIP/%s',_0x14fc00['name']);_0x1c1988['agent']=_0x14fc00;}return request({'event':_0x5e464a,'message':_0x1c1988});})[_0xce38('0x22')](function(_0x2a39df){logger[_0xce38('0x20')](_0xce38('0x1f'),_0xce38('0x38'),_0x2a39df);});};}function afterUpdate(_0x492ee2){return function(_0x41e4a3){var _0x3336e3=_0x41e4a3[_0xce38('0x39')](_0xce38('0x3a'))&&_0x41e4a3[_0xce38('0x3a')];var _0x2f7268=_0x41e4a3[_0xce38('0x39')](_0xce38('0x3b'));if(_0x3336e3||_0x2f7268){var _0x12e390=_0x3336e3?'closedinteraction':_0xce38('0x3b');var _0x58808=_0x41e4a3[_0xce38('0x23')]({'plain':!![]});_0x58808[_0xce38('0x24')]=_0x492ee2;_0x58808[_0xce38('0x25')]=_0x492ee2;_0x58808['event']=_0x3336e3?_0xce38('0x3a'):'substatus';var _0x541235='SELECT\x20*\x20FROM\x20cm_contacts\x20WHERE\x20id\x20=\x20'+_0x58808['ContactId'];return db[_0xce38('0x2a')][_0xce38('0x2b')](_0x541235,{'type':db[_0xce38('0x2c')][_0xce38('0x36')][_0xce38('0x2d')],'raw':!![]})[_0xce38('0x1d')](function(_0x4006f5){if(_0x4006f5){_0x58808[_0xce38('0x2e')]=_0x4006f5[0x0];}if(typeof _0x58808[_0xce38('0x2f')]===_0xce38('0x30'))return;return getAgent(_0x58808[_0xce38('0x2f')]);})[_0xce38('0x1d')](function(_0x769e8d){if(_0x769e8d){_0x58808[_0xce38('0x31')]=util['format'](_0xce38('0x3c'),_0x769e8d['name']);_0x58808[_0xce38('0x32')]=_0x769e8d;}return request({'event':_0x12e390,'message':_0x58808});})[_0xce38('0x22')](function(_0x5a1062){logger[_0xce38('0x20')](_0xce38('0x1f'),_0xce38('0x3d'),_0x5a1062);});}};}function getAgent(_0x55cb92){return db[_0xce38('0x3e')][_0xce38('0x3f')]({'where':{'id':_0x55cb92},'attributes':['id',_0xce38('0x40'),_0xce38('0x41'),_0xce38('0x42'),_0xce38('0x43')],'raw':!![]})[_0xce38('0x1d')](function(_0x4f474b){return _0x4f474b;});}exports['default']=function(){for(var _0x31ab54=0x0;_0x31ab54<triggers[_0xce38('0x44')];_0x31ab54+=0x1){if(db[_0xce38('0x45')](triggers[_0x31ab54]['model'])){db[triggers[_0x31ab54]['model']][_0xce38('0x46')](triggers[_0x31ab54][_0xce38('0x26')],triggers[_0x31ab54][_0xce38('0x47')](triggers[_0x31ab54][_0xce38('0x24')][_0xce38('0x48')](),triggers[_0x31ab54]['condition']));}}};
\ No newline at end of file
+var _0xb98b=['User','find','fullname','email','internal','default','length','hasOwnProperty','hook','toLowerCase','condition','../../mysqldb','jayson/promise','triggers','client','http','Chat','afterCreate','newinteraction','afterUpdate','closedinteraction','ChatMessage','newmessage','ChatOfflineMessage','Sms','SmsInteraction','SmsMessage','Whatsapp','WhatsappInteraction','WhatsappMessage','FaxInteraction','Fax','FaxMessage','Mail','MailInteraction','MailMessage','Openchannel','OpenchannelInteraction','OpenchannelMessage','request','EventManager','then','info','error','Trigger,\x20%s','get','motionChannel','event','direction','resolve','ContactId','SELECT\x20*\x20FROM\x20cm_contacts\x20WHERE\x20id\x20=\x20','sequelize','query','QueryTypes','SELECT','contact','UserId','undefined','name','agent','channel','outgoingmessage','AfterCreateMessage','offlineMessage','opened','Sequelize','catch','changed','closed','substatus','SIP/%s','AfterUpdate'];(function(_0x4cecbd,_0x103c9c){var _0x143b0c=function(_0x453d0d){while(--_0x453d0d){_0x4cecbd['push'](_0x4cecbd['shift']());}};_0x143b0c(++_0x103c9c);}(_0xb98b,0x12f));var _0xbb98=function(_0x30c0af,_0x45701d){_0x30c0af=_0x30c0af-0x0;var _0x357cd1=_0xb98b[_0x30c0af];return _0x357cd1;};'use strict';var util=require('util');var db=require(_0xbb98('0x0'))['db'];var jayson=require(_0xbb98('0x1'));var logger=require('../logger')(_0xbb98('0x2'));var client=jayson[_0xbb98('0x3')][_0xbb98('0x4')]({'port':0x232a});var triggers=[{'channel':_0xbb98('0x5'),'model':'ChatInteraction','event':_0xbb98('0x6'),'condition':_0xbb98('0x7'),'callback':afterCreate},{'channel':'Chat','model':'ChatInteraction','event':_0xbb98('0x8'),'condition':_0xbb98('0x9'),'callback':afterUpdate},{'channel':_0xbb98('0x5'),'model':_0xbb98('0xa'),'event':'afterCreate','condition':_0xbb98('0xb'),'callback':afterCreateMessage},{'channel':'Chat','model':_0xbb98('0xc'),'event':_0xbb98('0x6'),'condition':_0xbb98('0xb'),'callback':afterCreateOfflineMessage},{'channel':_0xbb98('0xd'),'model':_0xbb98('0xe'),'event':'afterCreate','condition':_0xbb98('0x7'),'callback':afterCreate},{'channel':_0xbb98('0xd'),'model':_0xbb98('0xe'),'event':_0xbb98('0x8'),'condition':_0xbb98('0x9'),'callback':afterUpdate},{'channel':'Sms','model':_0xbb98('0xf'),'event':_0xbb98('0x6'),'condition':_0xbb98('0xb'),'callback':afterCreateMessage},{'channel':_0xbb98('0x10'),'model':_0xbb98('0x11'),'event':_0xbb98('0x6'),'condition':_0xbb98('0x7'),'callback':afterCreate},{'channel':'Whatsapp','model':_0xbb98('0x11'),'event':_0xbb98('0x8'),'condition':'closedinteraction','callback':afterUpdate},{'channel':_0xbb98('0x10'),'model':_0xbb98('0x12'),'event':_0xbb98('0x6'),'condition':'newmessage','callback':afterCreateMessage},{'channel':'Fax','model':_0xbb98('0x13'),'event':_0xbb98('0x6'),'condition':'newinteraction','callback':afterCreate},{'channel':_0xbb98('0x14'),'model':_0xbb98('0x13'),'event':_0xbb98('0x8'),'condition':_0xbb98('0x9'),'callback':afterUpdate},{'channel':_0xbb98('0x14'),'model':_0xbb98('0x15'),'event':_0xbb98('0x6'),'condition':_0xbb98('0xb'),'callback':afterCreateMessage},{'channel':_0xbb98('0x16'),'model':_0xbb98('0x17'),'event':_0xbb98('0x6'),'condition':_0xbb98('0x7'),'callback':afterCreate},{'channel':_0xbb98('0x16'),'model':'MailInteraction','event':_0xbb98('0x8'),'condition':'closedinteraction','callback':afterUpdate},{'channel':_0xbb98('0x16'),'model':_0xbb98('0x18'),'event':_0xbb98('0x6'),'condition':_0xbb98('0xb'),'callback':afterCreateMessage},{'channel':_0xbb98('0x19'),'model':_0xbb98('0x1a'),'event':_0xbb98('0x6'),'condition':_0xbb98('0x7'),'callback':afterCreate},{'channel':_0xbb98('0x19'),'model':_0xbb98('0x1a'),'event':_0xbb98('0x8'),'condition':'closedinteraction','callback':afterUpdate},{'channel':_0xbb98('0x19'),'model':_0xbb98('0x1b'),'event':_0xbb98('0x6'),'condition':_0xbb98('0xb'),'callback':afterCreateMessage}];function request(_0x13a3f7){return client[_0xbb98('0x1c')](_0xbb98('0x1d'),_0x13a3f7)[_0xbb98('0x1e')](function(_0x4c35a0){logger[_0xbb98('0x1f')]('Trigger,\x20%s',_0xbb98('0x1d'),_0x4c35a0);if(_0x4c35a0[_0xbb98('0x20')]){if(_0x4c35a0['error']['code']===0x1f4){logger[_0xbb98('0x20')](_0xbb98('0x21'),_0xbb98('0x1d'),_0x4c35a0[_0xbb98('0x20')]);}}})['catch'](function(_0x116a8f){logger['error'](_0xbb98('0x21'),_0xbb98('0x1d'),_0x116a8f);});}function afterCreateMessage(_0x18af5b){return function(_0x1a8a75){_0x1a8a75=_0x1a8a75[_0xbb98('0x22')]({'plain':!![]});_0x1a8a75['channel']=_0x18af5b;_0x1a8a75[_0xbb98('0x23')]=_0x18af5b;_0x1a8a75[_0xbb98('0x24')]=_0x1a8a75[_0xbb98('0x25')];Promise[_0xbb98('0x26')]()[_0xbb98('0x1e')](function(){if(typeof _0x1a8a75[_0xbb98('0x27')]==='undefined')return null;var _0x515f98=_0xbb98('0x28')+_0x1a8a75['ContactId'];return db[_0xbb98('0x29')][_0xbb98('0x2a')](_0x515f98,{'type':db['Sequelize'][_0xbb98('0x2b')][_0xbb98('0x2c')],'raw':!![]});})[_0xbb98('0x1e')](function(_0x24b919){if(_0x24b919){_0x1a8a75[_0xbb98('0x2d')]=_0x24b919[0x0];}if(typeof _0x1a8a75[_0xbb98('0x2e')]===_0xbb98('0x2f'))return;return getAgent(_0x1a8a75[_0xbb98('0x2e')]);})['then'](function(_0x1352e4){if(_0x1352e4){_0x1a8a75['interface']=util['format']('SIP/%s',_0x1352e4[_0xbb98('0x30')]);_0x1a8a75[_0xbb98('0x31')]=_0x1352e4;_0x1a8a75[_0xbb98('0x32')]=_0x18af5b;return request({'event':'incomingmessage','message':_0x1a8a75});}else{return request({'event':_0xbb98('0x33'),'message':_0x1a8a75});}})['catch'](function(_0x297e49){logger[_0xbb98('0x20')]('Trigger,\x20%s',_0xbb98('0x34'),_0x297e49);});};}function afterCreateOfflineMessage(_0x4c1f69){return function(_0x1b70cf){_0x1b70cf=_0x1b70cf[_0xbb98('0x22')]({'plain':!![]});_0x1b70cf[_0xbb98('0x32')]=_0x4c1f69;_0x1b70cf[_0xbb98('0x23')]=_0x4c1f69;_0x1b70cf['event']=_0xbb98('0x35');return request({'event':_0x1b70cf[_0xbb98('0x24')],'message':_0x1b70cf});};}function afterCreate(_0x175a2f,_0xd32c37){return function(_0x245a9b){var _0x5ae227=_0x245a9b[_0xbb98('0x22')]({'plain':!![]});_0x5ae227[_0xbb98('0x32')]=_0x175a2f;_0x5ae227[_0xbb98('0x23')]=_0x175a2f;_0x5ae227[_0xbb98('0x24')]=_0xbb98('0x36');Promise[_0xbb98('0x26')]()['then'](function(){var _0x3d0718=_0xbb98('0x28')+_0x5ae227[_0xbb98('0x27')];return db['sequelize'][_0xbb98('0x2a')](_0x3d0718,{'type':db[_0xbb98('0x37')][_0xbb98('0x2b')][_0xbb98('0x2c')],'raw':!![]});})['then'](function(_0x56a2b0){if(_0x56a2b0){_0x5ae227[_0xbb98('0x2d')]=_0x56a2b0[0x0];}if(_0x5ae227[_0xbb98('0x2e')]){return getAgent(_0x5ae227[_0xbb98('0x2e')]);}return;})[_0xbb98('0x1e')](function(_0xe6cf1a){if(_0xe6cf1a){_0x5ae227['interface']=util['format']('SIP/%s',_0xe6cf1a[_0xbb98('0x30')]);_0x5ae227[_0xbb98('0x31')]=_0xe6cf1a;}return request({'event':_0xd32c37,'message':_0x5ae227});})[_0xbb98('0x38')](function(_0x3dce3a){logger[_0xbb98('0x20')](_0xbb98('0x21'),'AfterCreate',_0x3dce3a);});};}function afterUpdate(_0x5ddc04){return function(_0x2aac34){var _0x2f2f13=_0x2aac34[_0xbb98('0x39')](_0xbb98('0x3a'))&&_0x2aac34[_0xbb98('0x3a')];var _0x38c440=_0x2aac34[_0xbb98('0x39')](_0xbb98('0x3b'));if(_0x2f2f13||_0x38c440){var _0x3dd42a=_0x2f2f13?_0xbb98('0x9'):_0xbb98('0x3b');var _0x545fb6=_0x2aac34[_0xbb98('0x22')]({'plain':!![]});_0x545fb6[_0xbb98('0x32')]=_0x5ddc04;_0x545fb6[_0xbb98('0x23')]=_0x5ddc04;_0x545fb6[_0xbb98('0x24')]=_0x2f2f13?_0xbb98('0x3a'):_0xbb98('0x3b');var _0x18412d=_0xbb98('0x28')+_0x545fb6[_0xbb98('0x27')];return db[_0xbb98('0x29')][_0xbb98('0x2a')](_0x18412d,{'type':db['Sequelize'][_0xbb98('0x2b')][_0xbb98('0x2c')],'raw':!![]})[_0xbb98('0x1e')](function(_0x15e6ed){if(_0x15e6ed){_0x545fb6[_0xbb98('0x2d')]=_0x15e6ed[0x0];}if(typeof _0x545fb6[_0xbb98('0x2e')]===_0xbb98('0x2f'))return;return getAgent(_0x545fb6[_0xbb98('0x2e')]);})['then'](function(_0x2b63fd){if(_0x2b63fd){_0x545fb6['interface']=util['format'](_0xbb98('0x3c'),_0x2b63fd['name']);_0x545fb6[_0xbb98('0x31')]=_0x2b63fd;}return request({'event':_0x3dd42a,'message':_0x545fb6});})[_0xbb98('0x38')](function(_0x529924){logger[_0xbb98('0x20')](_0xbb98('0x21'),_0xbb98('0x3d'),_0x529924);});}};}function getAgent(_0x4b8dfc){return db[_0xbb98('0x3e')][_0xbb98('0x3f')]({'where':{'id':_0x4b8dfc},'attributes':['id',_0xbb98('0x30'),_0xbb98('0x40'),_0xbb98('0x41'),_0xbb98('0x42')],'raw':!![]})[_0xbb98('0x1e')](function(_0x3f6d60){return _0x3f6d60;});}exports[_0xbb98('0x43')]=function(){for(var _0x3b8954=0x0;_0x3b8954<triggers[_0xbb98('0x44')];_0x3b8954+=0x1){if(db[_0xbb98('0x45')](triggers[_0x3b8954]['model'])){db[triggers[_0x3b8954]['model']][_0xbb98('0x46')](triggers[_0x3b8954][_0xbb98('0x24')],triggers[_0x3b8954]['callback'](triggers[_0x3b8954]['channel'][_0xbb98('0x47')](),triggers[_0x3b8954][_0xbb98('0x48')]));}}};
\ No newline at end of file