Built motion from commit 953226e6.|2.6.32
[motion2.git] / server / api / memberReport / memberReport.controller.js
index 0f82690..4b30bc1 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0x043f=['then','includeAll','include','findAll','rows','catch','show','params','keys','length','find','create','body','destroy','describe','html-pdf','eml-format','rimraf','fast-json-patch','request-promise','moment','bluebird','mustache','util','sox','ejs','crypto','desk.js','querystring','../../components/parsers/qs','../../config/utils','../../config/environment','../../mysqldb','sendStatus','status','end','offset','set','Content-Range','json','apply','reject','save','update','error','name','send','index','map','MemberReport','rawAttributes','fieldName','key','model','query','filters','intersection','attributes','fields','hasOwnProperty','nolimit','limit','order','sort','where','pick','filter','type','merge','options','count'];(function(_0x4e086a,_0x4a830d){var _0x2a9585=function(_0x3191e0){while(--_0x3191e0){_0x4e086a['push'](_0x4e086a['shift']());}};_0x2a9585(++_0x4a830d);}(_0x043f,0x1b9));var _0xf043=function(_0x34db21,_0x4256bb){_0x34db21=_0x34db21-0x0;var _0x5e7d82=_0x043f[_0x34db21];return _0x5e7d82;};'use strict';var pdf=require(_0xf043('0x0'));var emlformat=require(_0xf043('0x1'));var rimraf=require(_0xf043('0x2'));var zipdir=require('zip-dir');var jsonpatch=require(_0xf043('0x3'));var rp=require(_0xf043('0x4'));var moment=require(_0xf043('0x5'));var BPromise=require(_0xf043('0x6'));var Mustache=require(_0xf043('0x7'));var util=require(_0xf043('0x8'));var path=require('path');var sox=require(_0xf043('0x9'));var csv=require('to-csv');var ejs=require(_0xf043('0xa'));var fs=require('fs');var _=require('lodash');var squel=require('squel');var crypto=require(_0xf043('0xb'));var jsforce=require('jsforce');var deskjs=require(_0xf043('0xc'));var toCsv=require('to-csv');var querystring=require(_0xf043('0xd'));var Papa=require('papaparse');var Redis=require('ioredis');var authService=require('../../components/auth/service');var qs=require(_0xf043('0xe'));var as=require('../../components/parsers/advancedSearch');var hardwareService=require('../../config/license/hardware');var logger=require('../../config/logger')('api');var utils=require(_0xf043('0xf'));var config=require(_0xf043('0x10'));var db=require(_0xf043('0x11'))['db'];function respondWithStatusCode(_0xec30fc,_0x1aa081){_0x1aa081=_0x1aa081||0xcc;return function(_0x4aa25d){if(_0x4aa25d){return _0xec30fc[_0xf043('0x12')](_0x1aa081);}return _0xec30fc[_0xf043('0x13')](_0x1aa081)[_0xf043('0x14')]();};}function respondWithResult(_0x3d8432,_0x43dc62){_0x43dc62=_0x43dc62||0xc8;return function(_0x2e3275){if(_0x2e3275){return _0x3d8432[_0xf043('0x13')](_0x43dc62)['json'](_0x2e3275);}};}function respondWithFilteredResult(_0x2c9a99,_0x15bed7){return function(_0x17dc8c){if(_0x17dc8c){var _0x26c7c3=_0x17dc8c['count'],_0x134a25=_0x15bed7[_0xf043('0x15')],_0x253ec5=_0x15bed7[_0xf043('0x15')]+_0x15bed7['limit'],_0x2c5ad7;if(_0x253ec5>=_0x26c7c3){_0x253ec5=_0x26c7c3;_0x2c5ad7=0xc8;}else{_0x2c5ad7=0xce;}_0x2c9a99[_0xf043('0x13')](_0x2c5ad7);return _0x2c9a99[_0xf043('0x16')](_0xf043('0x17'),_0x134a25+'-'+_0x253ec5+'/'+_0x26c7c3)[_0xf043('0x18')](_0x17dc8c);}return null;};}function patchUpdates(_0x11e395){return function(_0x4d7681){try{jsonpatch[_0xf043('0x19')](_0x4d7681,_0x11e395,!![]);}catch(_0x515c6a){return BPromise[_0xf043('0x1a')](_0x515c6a);}return _0x4d7681[_0xf043('0x1b')]();};}function saveUpdates(_0x12fd24,_0x236a78){return function(_0x532920){if(_0x532920){return _0x532920[_0xf043('0x1c')](_0x12fd24)['then'](function(_0x1f1ab2){return _0x1f1ab2;});}return null;};}function removeEntity(_0x3c1881,_0x3037ad){return function(_0x4efa12){if(_0x4efa12){return _0x4efa12['destroy']()['then'](function(){_0x3c1881[_0xf043('0x13')](0xcc)[_0xf043('0x14')]();});}};}function handleEntityNotFound(_0x48c3e4,_0x155031){return function(_0x355557){if(!_0x355557){_0x48c3e4[_0xf043('0x12')](0x194);}return _0x355557;};}function handleError(_0x643733,_0x5da5c9){_0x5da5c9=_0x5da5c9||0x1f4;return function(_0x31156a){logger[_0xf043('0x1d')](_0x31156a['stack']);if(_0x31156a[_0xf043('0x1e')]){delete _0x31156a[_0xf043('0x1e')];}_0x643733[_0xf043('0x13')](_0x5da5c9)[_0xf043('0x1f')](_0x31156a);};}exports[_0xf043('0x20')]=function(_0x3f2f09,_0x1cf0d5){var _0x5dd341={},_0x3b1da5={},_0x286d9a={'count':0x0,'rows':[]};var _0x28fa81=_[_0xf043('0x21')](db[_0xf043('0x22')][_0xf043('0x23')],function(_0x50bf33){return{'name':_0x50bf33[_0xf043('0x24')],'type':_0x50bf33['type'][_0xf043('0x25')]};});_0x3b1da5[_0xf043('0x26')]=_[_0xf043('0x21')](_0x28fa81,_0xf043('0x1e'));_0x3b1da5[_0xf043('0x27')]=_['keys'](_0x3f2f09[_0xf043('0x27')]);_0x3b1da5[_0xf043('0x28')]=_[_0xf043('0x29')](_0x3b1da5[_0xf043('0x26')],_0x3b1da5[_0xf043('0x27')]);_0x5dd341[_0xf043('0x2a')]=_[_0xf043('0x29')](_0x3b1da5[_0xf043('0x26')],qs['fields'](_0x3f2f09[_0xf043('0x27')][_0xf043('0x2b')]));_0x5dd341['attributes']=_0x5dd341[_0xf043('0x2a')]['length']?_0x5dd341[_0xf043('0x2a')]:_0x3b1da5[_0xf043('0x26')];if(!_0x3f2f09[_0xf043('0x27')][_0xf043('0x2c')](_0xf043('0x2d'))){_0x5dd341[_0xf043('0x2e')]=qs[_0xf043('0x2e')](_0x3f2f09[_0xf043('0x27')]['limit']);_0x5dd341[_0xf043('0x15')]=qs[_0xf043('0x15')](_0x3f2f09[_0xf043('0x27')][_0xf043('0x15')]);}_0x5dd341[_0xf043('0x2f')]=qs[_0xf043('0x30')](_0x3f2f09['query'][_0xf043('0x30')]);_0x5dd341[_0xf043('0x31')]=qs['filters'](_[_0xf043('0x32')](_0x3f2f09['query'],_0x3b1da5[_0xf043('0x28')]));if(_0x3f2f09[_0xf043('0x27')][_0xf043('0x33')]){_0x5dd341[_0xf043('0x31')]=_['merge'](_0x5dd341[_0xf043('0x31')],{'$or':_[_0xf043('0x21')](_0x28fa81,function(_0x47b29f){if(_0x47b29f[_0xf043('0x34')]!=='VIRTUAL'){var _0x5ea916={};_0x5ea916[_0x47b29f[_0xf043('0x1e')]]={'$like':'%'+_0x3f2f09[_0xf043('0x27')][_0xf043('0x33')]+'%'};return _0x5ea916;}})});}_0x5dd341=_[_0xf043('0x35')]({},_0x5dd341,_0x3f2f09[_0xf043('0x36')]);var _0x1c4429={'where':_0x5dd341[_0xf043('0x31')]};return db[_0xf043('0x22')][_0xf043('0x37')](_0x1c4429)[_0xf043('0x38')](function(_0x430608){_0x286d9a[_0xf043('0x37')]=_0x430608;if(_0x3f2f09[_0xf043('0x27')][_0xf043('0x39')]){_0x5dd341[_0xf043('0x3a')]=[{'all':!![]}];}return db[_0xf043('0x22')][_0xf043('0x3b')](_0x5dd341);})['then'](function(_0x271784){_0x286d9a[_0xf043('0x3c')]=_0x271784;return _0x286d9a;})[_0xf043('0x38')](respondWithFilteredResult(_0x1cf0d5,_0x5dd341))[_0xf043('0x3d')](handleError(_0x1cf0d5,null));};exports[_0xf043('0x3e')]=function(_0x3d81a1,_0x171480){var _0x2e2210={'raw':!![],'where':{'id':_0x3d81a1[_0xf043('0x3f')]['id']}},_0x1bde9d={};_0x1bde9d['model']=_[_0xf043('0x40')](db[_0xf043('0x22')][_0xf043('0x23')]);_0x1bde9d['query']=_['keys'](_0x3d81a1[_0xf043('0x27')]);_0x1bde9d[_0xf043('0x28')]=_['intersection'](_0x1bde9d[_0xf043('0x26')],_0x1bde9d[_0xf043('0x27')]);_0x2e2210[_0xf043('0x2a')]=_[_0xf043('0x29')](_0x1bde9d[_0xf043('0x26')],qs['fields'](_0x3d81a1[_0xf043('0x27')]['fields']));_0x2e2210[_0xf043('0x2a')]=_0x2e2210[_0xf043('0x2a')][_0xf043('0x41')]?_0x2e2210['attributes']:_0x1bde9d[_0xf043('0x26')];if(_0x3d81a1[_0xf043('0x27')]['includeAll']){_0x2e2210['include']=[{'all':!![]}];}_0x2e2210=_['merge']({},_0x2e2210,_0x3d81a1[_0xf043('0x36')]);return db[_0xf043('0x22')][_0xf043('0x42')](_0x2e2210)['then'](handleEntityNotFound(_0x171480,null))['then'](respondWithResult(_0x171480,null))[_0xf043('0x3d')](handleError(_0x171480,null));};exports['create']=function(_0x39d096,_0x2437cc){return db[_0xf043('0x22')][_0xf043('0x43')](_0x39d096[_0xf043('0x44')],{})[_0xf043('0x38')](respondWithResult(_0x2437cc,0xc9))['catch'](handleError(_0x2437cc,null));};exports[_0xf043('0x1c')]=function(_0x3ebfb8,_0x3ca3e5){if(_0x3ebfb8[_0xf043('0x44')]['id']){delete _0x3ebfb8['body']['id'];}return db[_0xf043('0x22')][_0xf043('0x42')]({'where':{'id':_0x3ebfb8[_0xf043('0x3f')]['id']}})[_0xf043('0x38')](handleEntityNotFound(_0x3ca3e5,null))[_0xf043('0x38')](saveUpdates(_0x3ebfb8[_0xf043('0x44')],null))[_0xf043('0x38')](respondWithResult(_0x3ca3e5,null))[_0xf043('0x3d')](handleError(_0x3ca3e5,null));};exports[_0xf043('0x45')]=function(_0x47a94a,_0x3d448f){return db[_0xf043('0x22')]['find']({'where':{'id':_0x47a94a[_0xf043('0x3f')]['id']}})['then'](handleEntityNotFound(_0x3d448f,null))['then'](removeEntity(_0x3d448f,null))['catch'](handleError(_0x3d448f,null));};exports[_0xf043('0x46')]=function(_0x22b20a,_0xbc65c2){return db[_0xf043('0x22')][_0xf043('0x46')]()[_0xf043('0x38')](respondWithResult(_0xbc65c2,null))[_0xf043('0x3d')](handleError(_0xbc65c2,null));};
\ No newline at end of file
+var _0x34e8=['path','sox','to-csv','fs-extra','squel','crypto','jsforce','desk.js','querystring','papaparse','ioredis','../../components/auth/service','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/license/hardware','../../config/logger','api','../../config/utils','../../config/environment','../../config/license/util','sendStatus','status','end','undefined','limit','count','offset','set','Content-Range','json','apply','reject','save','update','then','destroy','error','stack','name','map','MemberReport','rawAttributes','fieldName','type','key','model','query','filters','intersection','attributes','fields','length','hasOwnProperty','sort','where','pick','filter','merge','options','includeAll','catch','show','params','keys','include','find','create','body','describe','eml-format','rimraf','zip-dir','fast-json-patch','moment','bluebird','mustache','util'];(function(_0x3e112d,_0x2bb132){var _0x531c31=function(_0x1954bc){while(--_0x1954bc){_0x3e112d['push'](_0x3e112d['shift']());}};_0x531c31(++_0x2bb132);}(_0x34e8,0x12c));var _0x834e=function(_0x255b89,_0x4b326d){_0x255b89=_0x255b89-0x0;var _0x565a70=_0x34e8[_0x255b89];return _0x565a70;};'use strict';var emlformat=require(_0x834e('0x0'));var rimraf=require(_0x834e('0x1'));var zipdir=require(_0x834e('0x2'));var jsonpatch=require(_0x834e('0x3'));var rp=require('request-promise');var moment=require(_0x834e('0x4'));var BPromise=require(_0x834e('0x5'));var Mustache=require(_0x834e('0x6'));var util=require(_0x834e('0x7'));var path=require(_0x834e('0x8'));var sox=require(_0x834e('0x9'));var csv=require(_0x834e('0xa'));var ejs=require('ejs');var fs=require('fs');var fs_extra=require(_0x834e('0xb'));var _=require('lodash');var squel=require(_0x834e('0xc'));var crypto=require(_0x834e('0xd'));var jsforce=require(_0x834e('0xe'));var deskjs=require(_0x834e('0xf'));var toCsv=require(_0x834e('0xa'));var querystring=require(_0x834e('0x10'));var Papa=require(_0x834e('0x11'));var Redis=require(_0x834e('0x12'));var authService=require(_0x834e('0x13'));var qs=require(_0x834e('0x14'));var as=require(_0x834e('0x15'));var hardwareService=require(_0x834e('0x16'));var logger=require(_0x834e('0x17'))(_0x834e('0x18'));var utils=require(_0x834e('0x19'));var config=require(_0x834e('0x1a'));var licenseUtil=require(_0x834e('0x1b'));var db=require('../../mysqldb')['db'];function respondWithStatusCode(_0x5e5b6d,_0x6cd9b9){_0x6cd9b9=_0x6cd9b9||0xcc;return function(_0x58a27e){if(_0x58a27e){return _0x5e5b6d[_0x834e('0x1c')](_0x6cd9b9);}return _0x5e5b6d[_0x834e('0x1d')](_0x6cd9b9)[_0x834e('0x1e')]();};}function respondWithResult(_0x21cc0a,_0x50e860){_0x50e860=_0x50e860||0xc8;return function(_0x43156c){if(_0x43156c){return _0x21cc0a[_0x834e('0x1d')](_0x50e860)['json'](_0x43156c);}};}function respondWithFilteredResult(_0x316205,_0x4a9cdc){return function(_0x38a8cd){if(_0x38a8cd){var _0x36d443=typeof _0x4a9cdc['offset']===_0x834e('0x1f')&&typeof _0x4a9cdc[_0x834e('0x20')]===_0x834e('0x1f');var _0x50b3f6=_0x38a8cd[_0x834e('0x21')];var _0x211e9a=_0x36d443?0x0:_0x4a9cdc[_0x834e('0x22')];var _0xb993a1=_0x36d443?_0x38a8cd[_0x834e('0x21')]:_0x4a9cdc[_0x834e('0x22')]+_0x4a9cdc[_0x834e('0x20')];var _0x595515;if(_0xb993a1>=_0x50b3f6){_0xb993a1=_0x50b3f6;_0x595515=0xc8;}else{_0x595515=0xce;}_0x316205[_0x834e('0x1d')](_0x595515);return _0x316205[_0x834e('0x23')](_0x834e('0x24'),_0x211e9a+'-'+_0xb993a1+'/'+_0x50b3f6)[_0x834e('0x25')](_0x38a8cd);}return null;};}function patchUpdates(_0x4ab05d){return function(_0x45a630){try{jsonpatch[_0x834e('0x26')](_0x45a630,_0x4ab05d,!![]);}catch(_0x5a05c0){return BPromise[_0x834e('0x27')](_0x5a05c0);}return _0x45a630[_0x834e('0x28')]();};}function saveUpdates(_0x8d406e,_0x5c55ca){return function(_0x4e3f48){if(_0x4e3f48){return _0x4e3f48[_0x834e('0x29')](_0x8d406e)[_0x834e('0x2a')](function(_0x589dde){return _0x589dde;});}return null;};}function removeEntity(_0x25ee1d,_0x1dc1e0){return function(_0x58f4fd){if(_0x58f4fd){return _0x58f4fd[_0x834e('0x2b')]()[_0x834e('0x2a')](function(){_0x25ee1d[_0x834e('0x1d')](0xcc)['end']();});}};}function handleEntityNotFound(_0x24fcf7,_0x3e310f){return function(_0x5e1cc5){if(!_0x5e1cc5){_0x24fcf7['sendStatus'](0x194);}return _0x5e1cc5;};}function handleError(_0x1e713a,_0x508a1d){_0x508a1d=_0x508a1d||0x1f4;return function(_0x2826ec){logger[_0x834e('0x2c')](_0x2826ec[_0x834e('0x2d')]);if(_0x2826ec[_0x834e('0x2e')]){delete _0x2826ec[_0x834e('0x2e')];}_0x1e713a[_0x834e('0x1d')](_0x508a1d)['send'](_0x2826ec);};}exports['index']=function(_0x4dc64a,_0x58c1d7){var _0x2c7a8d={},_0x567cea={},_0x106d6a={'count':0x0,'rows':[]};var _0x5dacc1=_[_0x834e('0x2f')](db[_0x834e('0x30')][_0x834e('0x31')],function(_0x1e026a){return{'name':_0x1e026a[_0x834e('0x32')],'type':_0x1e026a[_0x834e('0x33')][_0x834e('0x34')]};});_0x567cea[_0x834e('0x35')]=_[_0x834e('0x2f')](_0x5dacc1,'name');_0x567cea[_0x834e('0x36')]=_['keys'](_0x4dc64a[_0x834e('0x36')]);_0x567cea[_0x834e('0x37')]=_[_0x834e('0x38')](_0x567cea[_0x834e('0x35')],_0x567cea[_0x834e('0x36')]);_0x2c7a8d[_0x834e('0x39')]=_[_0x834e('0x38')](_0x567cea[_0x834e('0x35')],qs[_0x834e('0x3a')](_0x4dc64a[_0x834e('0x36')]['fields']));_0x2c7a8d[_0x834e('0x39')]=_0x2c7a8d[_0x834e('0x39')][_0x834e('0x3b')]?_0x2c7a8d[_0x834e('0x39')]:_0x567cea['model'];if(!_0x4dc64a[_0x834e('0x36')][_0x834e('0x3c')]('nolimit')){_0x2c7a8d['limit']=qs['limit'](_0x4dc64a[_0x834e('0x36')][_0x834e('0x20')]);_0x2c7a8d[_0x834e('0x22')]=qs[_0x834e('0x22')](_0x4dc64a[_0x834e('0x36')][_0x834e('0x22')]);}_0x2c7a8d['order']=qs[_0x834e('0x3d')](_0x4dc64a['query'][_0x834e('0x3d')]);_0x2c7a8d[_0x834e('0x3e')]=qs['filters'](_[_0x834e('0x3f')](_0x4dc64a[_0x834e('0x36')],_0x567cea['filters']),_0x5dacc1);if(_0x4dc64a['query'][_0x834e('0x40')]){_0x2c7a8d[_0x834e('0x3e')]=_[_0x834e('0x41')](_0x2c7a8d[_0x834e('0x3e')],{'$or':_[_0x834e('0x2f')](_0x5dacc1,function(_0x4ca43c){if(_0x4ca43c[_0x834e('0x33')]!=='VIRTUAL'){var _0x50c243={};_0x50c243[_0x4ca43c[_0x834e('0x2e')]]={'$like':'%'+_0x4dc64a['query'][_0x834e('0x40')]+'%'};return _0x50c243;}})});}_0x2c7a8d=_[_0x834e('0x41')]({},_0x2c7a8d,_0x4dc64a[_0x834e('0x42')]);var _0x3c59af={'where':_0x2c7a8d[_0x834e('0x3e')]};return db['MemberReport'][_0x834e('0x21')](_0x3c59af)[_0x834e('0x2a')](function(_0x38f266){_0x106d6a['count']=_0x38f266;if(_0x4dc64a[_0x834e('0x36')][_0x834e('0x43')]){_0x2c7a8d['include']=[{'all':!![]}];}return db[_0x834e('0x30')]['findAll'](_0x2c7a8d);})[_0x834e('0x2a')](function(_0x585335){_0x106d6a['rows']=_0x585335;return _0x106d6a;})['then'](respondWithFilteredResult(_0x58c1d7,_0x2c7a8d))[_0x834e('0x44')](handleError(_0x58c1d7,null));};exports[_0x834e('0x45')]=function(_0x3bcbf4,_0xbc1571){var _0x8ad264={'raw':!![],'where':{'id':_0x3bcbf4[_0x834e('0x46')]['id']}},_0x23feea={};_0x23feea['model']=_[_0x834e('0x47')](db['MemberReport'][_0x834e('0x31')]);_0x23feea['query']=_[_0x834e('0x47')](_0x3bcbf4['query']);_0x23feea[_0x834e('0x37')]=_[_0x834e('0x38')](_0x23feea['model'],_0x23feea[_0x834e('0x36')]);_0x8ad264[_0x834e('0x39')]=_[_0x834e('0x38')](_0x23feea[_0x834e('0x35')],qs[_0x834e('0x3a')](_0x3bcbf4[_0x834e('0x36')][_0x834e('0x3a')]));_0x8ad264[_0x834e('0x39')]=_0x8ad264[_0x834e('0x39')][_0x834e('0x3b')]?_0x8ad264['attributes']:_0x23feea[_0x834e('0x35')];if(_0x3bcbf4[_0x834e('0x36')]['includeAll']){_0x8ad264[_0x834e('0x48')]=[{'all':!![]}];}_0x8ad264=_[_0x834e('0x41')]({},_0x8ad264,_0x3bcbf4[_0x834e('0x42')]);return db[_0x834e('0x30')][_0x834e('0x49')](_0x8ad264)[_0x834e('0x2a')](handleEntityNotFound(_0xbc1571,null))['then'](respondWithResult(_0xbc1571,null))['catch'](handleError(_0xbc1571,null));};exports[_0x834e('0x4a')]=function(_0x1a5444,_0x30568e){return db[_0x834e('0x30')][_0x834e('0x4a')](_0x1a5444[_0x834e('0x4b')],{})[_0x834e('0x2a')](respondWithResult(_0x30568e,0xc9))[_0x834e('0x44')](handleError(_0x30568e,null));};exports[_0x834e('0x29')]=function(_0x390c45,_0xf02f0d){if(_0x390c45[_0x834e('0x4b')]['id']){delete _0x390c45[_0x834e('0x4b')]['id'];}return db[_0x834e('0x30')][_0x834e('0x49')]({'where':{'id':_0x390c45[_0x834e('0x46')]['id']}})[_0x834e('0x2a')](handleEntityNotFound(_0xf02f0d,null))[_0x834e('0x2a')](saveUpdates(_0x390c45[_0x834e('0x4b')],null))[_0x834e('0x2a')](respondWithResult(_0xf02f0d,null))['catch'](handleError(_0xf02f0d,null));};exports[_0x834e('0x2b')]=function(_0x1f08b9,_0x4e73e0){return db[_0x834e('0x30')][_0x834e('0x49')]({'where':{'id':_0x1f08b9['params']['id']}})[_0x834e('0x2a')](handleEntityNotFound(_0x4e73e0,null))[_0x834e('0x2a')](removeEntity(_0x4e73e0,null))[_0x834e('0x44')](handleError(_0x4e73e0,null));};exports[_0x834e('0x4c')]=function(_0x4288e4,_0xb77aab){return db[_0x834e('0x30')]['describe']()[_0x834e('0x2a')](respondWithResult(_0xb77aab,null))[_0x834e('0x44')](handleError(_0xb77aab,null));};
\ No newline at end of file