Built motion from commit eddce310.|2.6.12
[motion2.git] / server / api / openchannelQueueReport / openchannelQueueReport.controller.js
index 3bc7612..8af42a5 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0x06a2=['hasOwnProperty','nolimit','order','sort','where','filter','merge','includeAll','include','findAll','catch','show','params','length','options','find','create','body','update','destroy','describe','eml-format','rimraf','zip-dir','fast-json-patch','request-promise','bluebird','util','path','sox','to-csv','fs-extra','lodash','squel','jsforce','desk.js','querystring','papaparse','ioredis','../../components/auth/service','../../components/parsers/qs','../../config/license/hardware','../../config/logger','api','../../config/environment','../../config/license/util','../../mysqldb','sendStatus','status','end','json','count','offset','limit','set','Content-Range','apply','reject','save','then','error','name','index','OpenchannelQueueReport','rawAttributes','fieldName','type','map','query','keys','filters','intersection','attributes','fields','model'];(function(_0x2714b8,_0x22ffd0){var _0x3e643c=function(_0x361bf1){while(--_0x361bf1){_0x2714b8['push'](_0x2714b8['shift']());}};_0x3e643c(++_0x22ffd0);}(_0x06a2,0x141));var _0x206a=function(_0x4b2a08,_0x373995){_0x4b2a08=_0x4b2a08-0x0;var _0x3deb17=_0x06a2[_0x4b2a08];return _0x3deb17;};'use strict';var emlformat=require(_0x206a('0x0'));var rimraf=require(_0x206a('0x1'));var zipdir=require(_0x206a('0x2'));var jsonpatch=require(_0x206a('0x3'));var rp=require(_0x206a('0x4'));var moment=require('moment');var BPromise=require(_0x206a('0x5'));var Mustache=require('mustache');var util=require(_0x206a('0x6'));var path=require(_0x206a('0x7'));var sox=require(_0x206a('0x8'));var csv=require(_0x206a('0x9'));var ejs=require('ejs');var fs=require('fs');var fs_extra=require(_0x206a('0xa'));var _=require(_0x206a('0xb'));var squel=require(_0x206a('0xc'));var crypto=require('crypto');var jsforce=require(_0x206a('0xd'));var deskjs=require(_0x206a('0xe'));var toCsv=require(_0x206a('0x9'));var querystring=require(_0x206a('0xf'));var Papa=require(_0x206a('0x10'));var Redis=require(_0x206a('0x11'));var authService=require(_0x206a('0x12'));var qs=require(_0x206a('0x13'));var as=require('../../components/parsers/advancedSearch');var hardwareService=require(_0x206a('0x14'));var logger=require(_0x206a('0x15'))(_0x206a('0x16'));var utils=require('../../config/utils');var config=require(_0x206a('0x17'));var licenseUtil=require(_0x206a('0x18'));var db=require(_0x206a('0x19'))['db'];function respondWithStatusCode(_0x2ec37a,_0x2a4714){_0x2a4714=_0x2a4714||0xcc;return function(_0xbfea80){if(_0xbfea80){return _0x2ec37a[_0x206a('0x1a')](_0x2a4714);}return _0x2ec37a[_0x206a('0x1b')](_0x2a4714)[_0x206a('0x1c')]();};}function respondWithResult(_0x63fe06,_0x45793c){_0x45793c=_0x45793c||0xc8;return function(_0x177dec){if(_0x177dec){return _0x63fe06[_0x206a('0x1b')](_0x45793c)[_0x206a('0x1d')](_0x177dec);}};}function respondWithFilteredResult(_0x4b29ba,_0x5759f7){return function(_0x2a484f){if(_0x2a484f){var _0x2ddb23=_0x2a484f[_0x206a('0x1e')],_0x5b9a7c=_0x5759f7['offset'],_0x2afee9=_0x5759f7[_0x206a('0x1f')]+_0x5759f7[_0x206a('0x20')],_0x40298a;if(_0x2afee9>=_0x2ddb23){_0x2afee9=_0x2ddb23;_0x40298a=0xc8;}else{_0x40298a=0xce;}_0x4b29ba[_0x206a('0x1b')](_0x40298a);return _0x4b29ba[_0x206a('0x21')](_0x206a('0x22'),_0x5b9a7c+'-'+_0x2afee9+'/'+_0x2ddb23)['json'](_0x2a484f);}return null;};}function patchUpdates(_0x102bd9){return function(_0x22b2c2){try{jsonpatch[_0x206a('0x23')](_0x22b2c2,_0x102bd9,!![]);}catch(_0x246bb1){return BPromise[_0x206a('0x24')](_0x246bb1);}return _0x22b2c2[_0x206a('0x25')]();};}function saveUpdates(_0x32a688,_0x418a7f){return function(_0x40fb32){if(_0x40fb32){return _0x40fb32['update'](_0x32a688)[_0x206a('0x26')](function(_0x583ac5){return _0x583ac5;});}return null;};}function removeEntity(_0x27d1fd,_0x20b818){return function(_0x2c5820){if(_0x2c5820){return _0x2c5820['destroy']()[_0x206a('0x26')](function(){_0x27d1fd[_0x206a('0x1b')](0xcc)[_0x206a('0x1c')]();});}};}function handleEntityNotFound(_0x2e113f,_0x20ceaa){return function(_0x54ded6){if(!_0x54ded6){_0x2e113f[_0x206a('0x1a')](0x194);}return _0x54ded6;};}function handleError(_0x1d61c9,_0xc07899){_0xc07899=_0xc07899||0x1f4;return function(_0x1e67fe){logger[_0x206a('0x27')](_0x1e67fe['stack']);if(_0x1e67fe['name']){delete _0x1e67fe[_0x206a('0x28')];}_0x1d61c9[_0x206a('0x1b')](_0xc07899)['send'](_0x1e67fe);};}exports[_0x206a('0x29')]=function(_0x5d310c,_0x1f0879){var _0x28e2a7={},_0x2b66c8={},_0x20f06c={'count':0x0,'rows':[]};var _0x3adbd5=_['map'](db[_0x206a('0x2a')][_0x206a('0x2b')],function(_0x5ab0f5){return{'name':_0x5ab0f5[_0x206a('0x2c')],'type':_0x5ab0f5[_0x206a('0x2d')]['key']};});_0x2b66c8['model']=_[_0x206a('0x2e')](_0x3adbd5,'name');_0x2b66c8[_0x206a('0x2f')]=_[_0x206a('0x30')](_0x5d310c['query']);_0x2b66c8[_0x206a('0x31')]=_[_0x206a('0x32')](_0x2b66c8['model'],_0x2b66c8[_0x206a('0x2f')]);_0x28e2a7[_0x206a('0x33')]=_['intersection'](_0x2b66c8['model'],qs[_0x206a('0x34')](_0x5d310c[_0x206a('0x2f')]['fields']));_0x28e2a7[_0x206a('0x33')]=_0x28e2a7[_0x206a('0x33')]['length']?_0x28e2a7['attributes']:_0x2b66c8[_0x206a('0x35')];if(!_0x5d310c[_0x206a('0x2f')][_0x206a('0x36')](_0x206a('0x37'))){_0x28e2a7[_0x206a('0x20')]=qs['limit'](_0x5d310c[_0x206a('0x2f')]['limit']);_0x28e2a7[_0x206a('0x1f')]=qs[_0x206a('0x1f')](_0x5d310c[_0x206a('0x2f')][_0x206a('0x1f')]);}_0x28e2a7[_0x206a('0x38')]=qs['sort'](_0x5d310c['query'][_0x206a('0x39')]);_0x28e2a7[_0x206a('0x3a')]=qs['filters'](_['pick'](_0x5d310c[_0x206a('0x2f')],_0x2b66c8[_0x206a('0x31')]),_0x3adbd5);if(_0x5d310c[_0x206a('0x2f')][_0x206a('0x3b')]){_0x28e2a7[_0x206a('0x3a')]=_['merge'](_0x28e2a7['where'],{'$or':_['map'](_0x3adbd5,function(_0x50ced8){if(_0x50ced8['type']!=='VIRTUAL'){var _0x2e2f59={};_0x2e2f59[_0x50ced8[_0x206a('0x28')]]={'$like':'%'+_0x5d310c[_0x206a('0x2f')][_0x206a('0x3b')]+'%'};return _0x2e2f59;}})});}_0x28e2a7=_[_0x206a('0x3c')]({},_0x28e2a7,_0x5d310c['options']);var _0x38f2e2={'where':_0x28e2a7[_0x206a('0x3a')]};return db[_0x206a('0x2a')][_0x206a('0x1e')](_0x38f2e2)[_0x206a('0x26')](function(_0x4ccb4d){_0x20f06c['count']=_0x4ccb4d;if(_0x5d310c[_0x206a('0x2f')][_0x206a('0x3d')]){_0x28e2a7[_0x206a('0x3e')]=[{'all':!![]}];}return db[_0x206a('0x2a')][_0x206a('0x3f')](_0x28e2a7);})[_0x206a('0x26')](function(_0x49d705){_0x20f06c['rows']=_0x49d705;return _0x20f06c;})['then'](respondWithFilteredResult(_0x1f0879,_0x28e2a7))[_0x206a('0x40')](handleError(_0x1f0879,null));};exports[_0x206a('0x41')]=function(_0x414a8b,_0x326ba0){var _0x557879={'raw':!![],'where':{'id':_0x414a8b[_0x206a('0x42')]['id']}},_0x10a60a={};_0x10a60a[_0x206a('0x35')]=_[_0x206a('0x30')](db[_0x206a('0x2a')][_0x206a('0x2b')]);_0x10a60a['query']=_['keys'](_0x414a8b['query']);_0x10a60a[_0x206a('0x31')]=_[_0x206a('0x32')](_0x10a60a['model'],_0x10a60a[_0x206a('0x2f')]);_0x557879[_0x206a('0x33')]=_['intersection'](_0x10a60a[_0x206a('0x35')],qs[_0x206a('0x34')](_0x414a8b[_0x206a('0x2f')][_0x206a('0x34')]));_0x557879[_0x206a('0x33')]=_0x557879[_0x206a('0x33')][_0x206a('0x43')]?_0x557879[_0x206a('0x33')]:_0x10a60a[_0x206a('0x35')];if(_0x414a8b[_0x206a('0x2f')]['includeAll']){_0x557879[_0x206a('0x3e')]=[{'all':!![]}];}_0x557879=_[_0x206a('0x3c')]({},_0x557879,_0x414a8b[_0x206a('0x44')]);return db[_0x206a('0x2a')][_0x206a('0x45')](_0x557879)[_0x206a('0x26')](handleEntityNotFound(_0x326ba0,null))['then'](respondWithResult(_0x326ba0,null))['catch'](handleError(_0x326ba0,null));};exports[_0x206a('0x46')]=function(_0xf08b78,_0x414c38){return db[_0x206a('0x2a')][_0x206a('0x46')](_0xf08b78[_0x206a('0x47')],{})[_0x206a('0x26')](respondWithResult(_0x414c38,0xc9))[_0x206a('0x40')](handleError(_0x414c38,null));};exports[_0x206a('0x48')]=function(_0x384ed4,_0x5a91b3){if(_0x384ed4[_0x206a('0x47')]['id']){delete _0x384ed4['body']['id'];}return db['OpenchannelQueueReport'][_0x206a('0x45')]({'where':{'id':_0x384ed4[_0x206a('0x42')]['id']}})[_0x206a('0x26')](handleEntityNotFound(_0x5a91b3,null))['then'](saveUpdates(_0x384ed4[_0x206a('0x47')],null))[_0x206a('0x26')](respondWithResult(_0x5a91b3,null))[_0x206a('0x40')](handleError(_0x5a91b3,null));};exports[_0x206a('0x49')]=function(_0x583da7,_0xe2bf3d){return db[_0x206a('0x2a')][_0x206a('0x45')]({'where':{'id':_0x583da7[_0x206a('0x42')]['id']}})[_0x206a('0x26')](handleEntityNotFound(_0xe2bf3d,null))[_0x206a('0x26')](removeEntity(_0xe2bf3d,null))['catch'](handleError(_0xe2bf3d,null));};exports[_0x206a('0x4a')]=function(_0x456f54,_0x382554){return db[_0x206a('0x2a')][_0x206a('0x4a')]()[_0x206a('0x26')](respondWithResult(_0x382554,null))[_0x206a('0x40')](handleError(_0x382554,null));};
\ No newline at end of file
+var _0x670d=['save','destroy','error','stack','name','map','OpenchannelQueueReport','fieldName','type','key','model','query','keys','filters','intersection','fields','attributes','length','nolimit','sort','where','pick','merge','VIRTUAL','filter','includeAll','include','findAll','then','rows','show','options','find','catch','create','body','update','params','describe','eml-format','zip-dir','fast-json-patch','request-promise','bluebird','util','path','sox','to-csv','ejs','fs-extra','squel','jsforce','desk.js','papaparse','ioredis','../../components/auth/service','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/license/hardware','../../config/logger','api','../../config/utils','../../config/environment','../../config/license/util','../../mysqldb','sendStatus','status','end','json','offset','undefined','count','limit','set','Content-Range','apply','reject'];(function(_0x525cc6,_0x5a7e0e){var _0x2427d3=function(_0x1df73b){while(--_0x1df73b){_0x525cc6['push'](_0x525cc6['shift']());}};_0x2427d3(++_0x5a7e0e);}(_0x670d,0x74));var _0xd670=function(_0x227aaf,_0x183de8){_0x227aaf=_0x227aaf-0x0;var _0x2c9746=_0x670d[_0x227aaf];return _0x2c9746;};'use strict';var emlformat=require(_0xd670('0x0'));var rimraf=require('rimraf');var zipdir=require(_0xd670('0x1'));var jsonpatch=require(_0xd670('0x2'));var rp=require(_0xd670('0x3'));var moment=require('moment');var BPromise=require(_0xd670('0x4'));var Mustache=require('mustache');var util=require(_0xd670('0x5'));var path=require(_0xd670('0x6'));var sox=require(_0xd670('0x7'));var csv=require(_0xd670('0x8'));var ejs=require(_0xd670('0x9'));var fs=require('fs');var fs_extra=require(_0xd670('0xa'));var _=require('lodash');var squel=require(_0xd670('0xb'));var crypto=require('crypto');var jsforce=require(_0xd670('0xc'));var deskjs=require(_0xd670('0xd'));var toCsv=require(_0xd670('0x8'));var querystring=require('querystring');var Papa=require(_0xd670('0xe'));var Redis=require(_0xd670('0xf'));var authService=require(_0xd670('0x10'));var qs=require(_0xd670('0x11'));var as=require(_0xd670('0x12'));var hardwareService=require(_0xd670('0x13'));var logger=require(_0xd670('0x14'))(_0xd670('0x15'));var utils=require(_0xd670('0x16'));var config=require(_0xd670('0x17'));var licenseUtil=require(_0xd670('0x18'));var db=require(_0xd670('0x19'))['db'];function respondWithStatusCode(_0x42a461,_0x3b4e38){_0x3b4e38=_0x3b4e38||0xcc;return function(_0x545269){if(_0x545269){return _0x42a461[_0xd670('0x1a')](_0x3b4e38);}return _0x42a461[_0xd670('0x1b')](_0x3b4e38)[_0xd670('0x1c')]();};}function respondWithResult(_0xa0ae58,_0x46527a){_0x46527a=_0x46527a||0xc8;return function(_0x43b315){if(_0x43b315){return _0xa0ae58[_0xd670('0x1b')](_0x46527a)[_0xd670('0x1d')](_0x43b315);}};}function respondWithFilteredResult(_0x4572ab,_0x37501e){return function(_0x5e4eb1){if(_0x5e4eb1){var _0x4640f7=typeof _0x37501e[_0xd670('0x1e')]===_0xd670('0x1f')&&typeof _0x37501e['limit']===_0xd670('0x1f');var _0x4ddc8f=_0x5e4eb1['count'];var _0x3e8b4c=_0x4640f7?0x0:_0x37501e[_0xd670('0x1e')];var _0x431942=_0x4640f7?_0x5e4eb1[_0xd670('0x20')]:_0x37501e[_0xd670('0x1e')]+_0x37501e[_0xd670('0x21')];var _0x28978e;if(_0x431942>=_0x4ddc8f){_0x431942=_0x4ddc8f;_0x28978e=0xc8;}else{_0x28978e=0xce;}_0x4572ab[_0xd670('0x1b')](_0x28978e);return _0x4572ab[_0xd670('0x22')](_0xd670('0x23'),_0x3e8b4c+'-'+_0x431942+'/'+_0x4ddc8f)[_0xd670('0x1d')](_0x5e4eb1);}return null;};}function patchUpdates(_0x41fc98){return function(_0x174fb4){try{jsonpatch[_0xd670('0x24')](_0x174fb4,_0x41fc98,!![]);}catch(_0x49a4d9){return BPromise[_0xd670('0x25')](_0x49a4d9);}return _0x174fb4[_0xd670('0x26')]();};}function saveUpdates(_0x2c7018,_0x4d84e7){return function(_0x3890a5){if(_0x3890a5){return _0x3890a5['update'](_0x2c7018)['then'](function(_0x44bfa8){return _0x44bfa8;});}return null;};}function removeEntity(_0x5b8471,_0x10f6c7){return function(_0xd83b5a){if(_0xd83b5a){return _0xd83b5a[_0xd670('0x27')]()['then'](function(){_0x5b8471['status'](0xcc)[_0xd670('0x1c')]();});}};}function handleEntityNotFound(_0x133116,_0x213d9a){return function(_0x4dfed6){if(!_0x4dfed6){_0x133116[_0xd670('0x1a')](0x194);}return _0x4dfed6;};}function handleError(_0x4933a2,_0x27ddf7){_0x27ddf7=_0x27ddf7||0x1f4;return function(_0x5bd429){logger[_0xd670('0x28')](_0x5bd429[_0xd670('0x29')]);if(_0x5bd429[_0xd670('0x2a')]){delete _0x5bd429[_0xd670('0x2a')];}_0x4933a2['status'](_0x27ddf7)['send'](_0x5bd429);};}exports['index']=function(_0x1f3f2d,_0x2bf5c8){var _0x379e4e={},_0x3d6f54={},_0x461169={'count':0x0,'rows':[]};var _0x51b9b7=_[_0xd670('0x2b')](db[_0xd670('0x2c')]['rawAttributes'],function(_0x48307b){return{'name':_0x48307b[_0xd670('0x2d')],'type':_0x48307b[_0xd670('0x2e')][_0xd670('0x2f')]};});_0x3d6f54[_0xd670('0x30')]=_[_0xd670('0x2b')](_0x51b9b7,_0xd670('0x2a'));_0x3d6f54[_0xd670('0x31')]=_[_0xd670('0x32')](_0x1f3f2d['query']);_0x3d6f54[_0xd670('0x33')]=_['intersection'](_0x3d6f54['model'],_0x3d6f54['query']);_0x379e4e['attributes']=_[_0xd670('0x34')](_0x3d6f54[_0xd670('0x30')],qs[_0xd670('0x35')](_0x1f3f2d[_0xd670('0x31')]['fields']));_0x379e4e[_0xd670('0x36')]=_0x379e4e['attributes'][_0xd670('0x37')]?_0x379e4e[_0xd670('0x36')]:_0x3d6f54[_0xd670('0x30')];if(!_0x1f3f2d[_0xd670('0x31')]['hasOwnProperty'](_0xd670('0x38'))){_0x379e4e[_0xd670('0x21')]=qs[_0xd670('0x21')](_0x1f3f2d[_0xd670('0x31')][_0xd670('0x21')]);_0x379e4e[_0xd670('0x1e')]=qs[_0xd670('0x1e')](_0x1f3f2d[_0xd670('0x31')]['offset']);}_0x379e4e['order']=qs['sort'](_0x1f3f2d['query'][_0xd670('0x39')]);_0x379e4e[_0xd670('0x3a')]=qs[_0xd670('0x33')](_[_0xd670('0x3b')](_0x1f3f2d[_0xd670('0x31')],_0x3d6f54[_0xd670('0x33')]),_0x51b9b7);if(_0x1f3f2d['query']['filter']){_0x379e4e[_0xd670('0x3a')]=_[_0xd670('0x3c')](_0x379e4e[_0xd670('0x3a')],{'$or':_[_0xd670('0x2b')](_0x51b9b7,function(_0x38e8b0){if(_0x38e8b0[_0xd670('0x2e')]!==_0xd670('0x3d')){var _0x4f2fa4={};_0x4f2fa4[_0x38e8b0[_0xd670('0x2a')]]={'$like':'%'+_0x1f3f2d['query'][_0xd670('0x3e')]+'%'};return _0x4f2fa4;}})});}_0x379e4e=_[_0xd670('0x3c')]({},_0x379e4e,_0x1f3f2d['options']);var _0x5c6abd={'where':_0x379e4e[_0xd670('0x3a')]};return db[_0xd670('0x2c')]['count'](_0x5c6abd)['then'](function(_0x5b2704){_0x461169[_0xd670('0x20')]=_0x5b2704;if(_0x1f3f2d[_0xd670('0x31')][_0xd670('0x3f')]){_0x379e4e[_0xd670('0x40')]=[{'all':!![]}];}return db['OpenchannelQueueReport'][_0xd670('0x41')](_0x379e4e);})[_0xd670('0x42')](function(_0x49d57c){_0x461169[_0xd670('0x43')]=_0x49d57c;return _0x461169;})[_0xd670('0x42')](respondWithFilteredResult(_0x2bf5c8,_0x379e4e))['catch'](handleError(_0x2bf5c8,null));};exports[_0xd670('0x44')]=function(_0x33a436,_0x45c099){var _0x4af348={'raw':!![],'where':{'id':_0x33a436['params']['id']}},_0x177ec6={};_0x177ec6['model']=_[_0xd670('0x32')](db[_0xd670('0x2c')]['rawAttributes']);_0x177ec6[_0xd670('0x31')]=_[_0xd670('0x32')](_0x33a436['query']);_0x177ec6[_0xd670('0x33')]=_[_0xd670('0x34')](_0x177ec6['model'],_0x177ec6[_0xd670('0x31')]);_0x4af348[_0xd670('0x36')]=_[_0xd670('0x34')](_0x177ec6['model'],qs[_0xd670('0x35')](_0x33a436[_0xd670('0x31')][_0xd670('0x35')]));_0x4af348['attributes']=_0x4af348[_0xd670('0x36')][_0xd670('0x37')]?_0x4af348['attributes']:_0x177ec6['model'];if(_0x33a436['query'][_0xd670('0x3f')]){_0x4af348[_0xd670('0x40')]=[{'all':!![]}];}_0x4af348=_['merge']({},_0x4af348,_0x33a436[_0xd670('0x45')]);return db[_0xd670('0x2c')][_0xd670('0x46')](_0x4af348)[_0xd670('0x42')](handleEntityNotFound(_0x45c099,null))[_0xd670('0x42')](respondWithResult(_0x45c099,null))[_0xd670('0x47')](handleError(_0x45c099,null));};exports[_0xd670('0x48')]=function(_0x25ff3c,_0x572b8a){return db[_0xd670('0x2c')][_0xd670('0x48')](_0x25ff3c[_0xd670('0x49')],{})[_0xd670('0x42')](respondWithResult(_0x572b8a,0xc9))['catch'](handleError(_0x572b8a,null));};exports[_0xd670('0x4a')]=function(_0x288280,_0x50fc45){if(_0x288280[_0xd670('0x49')]['id']){delete _0x288280[_0xd670('0x49')]['id'];}return db[_0xd670('0x2c')][_0xd670('0x46')]({'where':{'id':_0x288280[_0xd670('0x4b')]['id']}})[_0xd670('0x42')](handleEntityNotFound(_0x50fc45,null))[_0xd670('0x42')](saveUpdates(_0x288280[_0xd670('0x49')],null))[_0xd670('0x42')](respondWithResult(_0x50fc45,null))[_0xd670('0x47')](handleError(_0x50fc45,null));};exports[_0xd670('0x27')]=function(_0x5e2d0a,_0x5be2ca){return db[_0xd670('0x2c')][_0xd670('0x46')]({'where':{'id':_0x5e2d0a['params']['id']}})[_0xd670('0x42')](handleEntityNotFound(_0x5be2ca,null))[_0xd670('0x42')](removeEntity(_0x5be2ca,null))[_0xd670('0x47')](handleError(_0x5be2ca,null));};exports[_0xd670('0x4c')]=function(_0x490bea,_0x1873fc){return db['OpenchannelQueueReport'][_0xd670('0x4c')]()['then'](respondWithResult(_0x1873fc,null))[_0xd670('0x47')](handleError(_0x1873fc,null));};
\ No newline at end of file