Built motion from commit efa66e19.|2.6.22
[motion2.git] / server / api / cmHopperHistory / cmHopperHistory.controller.js
index f9a2a98..3db1fbe 100644 (file)
@@ -15,4 +15,4 @@
 // * treaties. The SOFTWARE PRODUCT is licensed, not sold.                        *
 // *                                                                       *
 // *************************************************************************
-var _0xf18a=['type','key','model','query','keys','filters','intersection','attributes','fields','length','hasOwnProperty','nolimit','order','sort','pick','filter','where','merge','options','include','findAll','rows','catch','show','params','find','create','body','describe','update','uniqueid','eml-format','rimraf','fast-json-patch','request-promise','bluebird','mustache','util','path','sox','to-csv','ejs','fs-extra','squel','crypto','jsforce','desk.js','querystring','papaparse','ioredis','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/license/hardware','../../config/logger','api','../../config/utils','../../config/environment','../../config/license/util','../../mysqldb','sendStatus','end','status','json','offset','undefined','limit','count','set','Content-Range','apply','reject','save','then','error','stack','name','send','index','map','CmHopperHistory','rawAttributes','fieldName'];(function(_0x6978c0,_0x1f6765){var _0x361377=function(_0x2d6cfd){while(--_0x2d6cfd){_0x6978c0['push'](_0x6978c0['shift']());}};_0x361377(++_0x1f6765);}(_0xf18a,0x115));var _0xaf18=function(_0x7d8554,_0x4ac5ed){_0x7d8554=_0x7d8554-0x0;var _0x27af1a=_0xf18a[_0x7d8554];return _0x27af1a;};'use strict';var emlformat=require(_0xaf18('0x0'));var rimraf=require(_0xaf18('0x1'));var zipdir=require('zip-dir');var jsonpatch=require(_0xaf18('0x2'));var rp=require(_0xaf18('0x3'));var moment=require('moment');var BPromise=require(_0xaf18('0x4'));var Mustache=require(_0xaf18('0x5'));var util=require(_0xaf18('0x6'));var path=require(_0xaf18('0x7'));var sox=require(_0xaf18('0x8'));var csv=require(_0xaf18('0x9'));var ejs=require(_0xaf18('0xa'));var fs=require('fs');var fs_extra=require(_0xaf18('0xb'));var _=require('lodash');var squel=require(_0xaf18('0xc'));var crypto=require(_0xaf18('0xd'));var jsforce=require(_0xaf18('0xe'));var deskjs=require(_0xaf18('0xf'));var toCsv=require(_0xaf18('0x9'));var querystring=require(_0xaf18('0x10'));var Papa=require(_0xaf18('0x11'));var Redis=require(_0xaf18('0x12'));var authService=require('../../components/auth/service');var qs=require(_0xaf18('0x13'));var as=require(_0xaf18('0x14'));var hardwareService=require(_0xaf18('0x15'));var logger=require(_0xaf18('0x16'))(_0xaf18('0x17'));var utils=require(_0xaf18('0x18'));var config=require(_0xaf18('0x19'));var licenseUtil=require(_0xaf18('0x1a'));var db=require(_0xaf18('0x1b'))['db'];function respondWithStatusCode(_0x213b47,_0x218ed8){_0x218ed8=_0x218ed8||0xcc;return function(_0x4258c3){if(_0x4258c3){return _0x213b47[_0xaf18('0x1c')](_0x218ed8);}return _0x213b47['status'](_0x218ed8)[_0xaf18('0x1d')]();};}function respondWithResult(_0x3664ac,_0x111111){_0x111111=_0x111111||0xc8;return function(_0x1f40d4){if(_0x1f40d4){return _0x3664ac[_0xaf18('0x1e')](_0x111111)[_0xaf18('0x1f')](_0x1f40d4);}};}function respondWithFilteredResult(_0x3fa8cc,_0x23c0e7){return function(_0x85ec42){if(_0x85ec42){var _0x4573e7=typeof _0x23c0e7[_0xaf18('0x20')]===_0xaf18('0x21')&&typeof _0x23c0e7[_0xaf18('0x22')]===_0xaf18('0x21');var _0x21b085=_0x85ec42[_0xaf18('0x23')];var _0x484491=_0x4573e7?0x0:_0x23c0e7[_0xaf18('0x20')];var _0x4dea3a=_0x4573e7?_0x85ec42[_0xaf18('0x23')]:_0x23c0e7['offset']+_0x23c0e7[_0xaf18('0x22')];var _0x2fce3f;if(_0x4dea3a>=_0x21b085){_0x4dea3a=_0x21b085;_0x2fce3f=0xc8;}else{_0x2fce3f=0xce;}_0x3fa8cc['status'](_0x2fce3f);return _0x3fa8cc[_0xaf18('0x24')](_0xaf18('0x25'),_0x484491+'-'+_0x4dea3a+'/'+_0x21b085)[_0xaf18('0x1f')](_0x85ec42);}return null;};}function patchUpdates(_0x5c1e26){return function(_0x44895e){try{jsonpatch[_0xaf18('0x26')](_0x44895e,_0x5c1e26,!![]);}catch(_0x26ed7d){return BPromise[_0xaf18('0x27')](_0x26ed7d);}return _0x44895e[_0xaf18('0x28')]();};}function saveUpdates(_0x5f3a52,_0x4e2a27){return function(_0x33b207){if(_0x33b207){return _0x33b207['update'](_0x5f3a52)[_0xaf18('0x29')](function(_0x17ec15){return _0x17ec15;});}return null;};}function removeEntity(_0x51412b,_0x4f225f){return function(_0xacdad0){if(_0xacdad0){return _0xacdad0['destroy']()[_0xaf18('0x29')](function(){_0x51412b[_0xaf18('0x1e')](0xcc)[_0xaf18('0x1d')]();});}};}function handleEntityNotFound(_0x3359fa,_0xd96450){return function(_0x3b7f1f){if(!_0x3b7f1f){_0x3359fa[_0xaf18('0x1c')](0x194);}return _0x3b7f1f;};}function handleError(_0x362a74,_0x358dbc){_0x358dbc=_0x358dbc||0x1f4;return function(_0x598121){logger[_0xaf18('0x2a')](_0x598121[_0xaf18('0x2b')]);if(_0x598121[_0xaf18('0x2c')]){delete _0x598121[_0xaf18('0x2c')];}_0x362a74[_0xaf18('0x1e')](_0x358dbc)[_0xaf18('0x2d')](_0x598121);};}exports[_0xaf18('0x2e')]=function(_0x491cec,_0x347159){var _0x175db5={},_0x25330f={},_0x10e8de={'count':0x0,'rows':[]};var _0x2bec7e=_[_0xaf18('0x2f')](db[_0xaf18('0x30')][_0xaf18('0x31')],function(_0x57be19){return{'name':_0x57be19[_0xaf18('0x32')],'type':_0x57be19[_0xaf18('0x33')][_0xaf18('0x34')]};});_0x25330f[_0xaf18('0x35')]=_[_0xaf18('0x2f')](_0x2bec7e,'name');_0x25330f[_0xaf18('0x36')]=_[_0xaf18('0x37')](_0x491cec['query']);_0x25330f[_0xaf18('0x38')]=_[_0xaf18('0x39')](_0x25330f[_0xaf18('0x35')],_0x25330f[_0xaf18('0x36')]);_0x175db5[_0xaf18('0x3a')]=_['intersection'](_0x25330f[_0xaf18('0x35')],qs['fields'](_0x491cec[_0xaf18('0x36')][_0xaf18('0x3b')]));_0x175db5[_0xaf18('0x3a')]=_0x175db5[_0xaf18('0x3a')][_0xaf18('0x3c')]?_0x175db5[_0xaf18('0x3a')]:_0x25330f['model'];if(!_0x491cec[_0xaf18('0x36')][_0xaf18('0x3d')](_0xaf18('0x3e'))){_0x175db5[_0xaf18('0x22')]=qs[_0xaf18('0x22')](_0x491cec[_0xaf18('0x36')][_0xaf18('0x22')]);_0x175db5[_0xaf18('0x20')]=qs[_0xaf18('0x20')](_0x491cec['query'][_0xaf18('0x20')]);}_0x175db5[_0xaf18('0x3f')]=qs[_0xaf18('0x40')](_0x491cec['query']['sort']);_0x175db5['where']=qs[_0xaf18('0x38')](_[_0xaf18('0x41')](_0x491cec[_0xaf18('0x36')],_0x25330f[_0xaf18('0x38')]),_0x2bec7e);if(_0x491cec[_0xaf18('0x36')][_0xaf18('0x42')]){_0x175db5[_0xaf18('0x43')]=_['merge'](_0x175db5[_0xaf18('0x43')],{'$or':_['map'](_0x2bec7e,function(_0x2f1685){if(_0x2f1685[_0xaf18('0x33')]!=='VIRTUAL'){var _0x2a789e={};_0x2a789e[_0x2f1685['name']]={'$like':'%'+_0x491cec['query'][_0xaf18('0x42')]+'%'};return _0x2a789e;}})});}_0x175db5=_[_0xaf18('0x44')]({},_0x175db5,_0x491cec[_0xaf18('0x45')]);var _0x49203d={'where':_0x175db5[_0xaf18('0x43')]};return db[_0xaf18('0x30')][_0xaf18('0x23')](_0x49203d)[_0xaf18('0x29')](function(_0x148aaa){_0x10e8de['count']=_0x148aaa;if(_0x491cec['query']['includeAll']){_0x175db5[_0xaf18('0x46')]=[{'all':!![]}];}return db['CmHopperHistory'][_0xaf18('0x47')](_0x175db5);})[_0xaf18('0x29')](function(_0x1ecafd){_0x10e8de[_0xaf18('0x48')]=_0x1ecafd;return _0x10e8de;})['then'](respondWithFilteredResult(_0x347159,_0x175db5))[_0xaf18('0x49')](handleError(_0x347159,null));};exports[_0xaf18('0x4a')]=function(_0x208e17,_0x108631){var _0x38fa12={'raw':!![],'where':{'id':_0x208e17[_0xaf18('0x4b')]['id']}},_0x3361fc={};_0x3361fc[_0xaf18('0x35')]=_['keys'](db[_0xaf18('0x30')][_0xaf18('0x31')]);_0x3361fc[_0xaf18('0x36')]=_['keys'](_0x208e17['query']);_0x3361fc[_0xaf18('0x38')]=_['intersection'](_0x3361fc[_0xaf18('0x35')],_0x3361fc['query']);_0x38fa12[_0xaf18('0x3a')]=_['intersection'](_0x3361fc[_0xaf18('0x35')],qs['fields'](_0x208e17[_0xaf18('0x36')][_0xaf18('0x3b')]));_0x38fa12[_0xaf18('0x3a')]=_0x38fa12[_0xaf18('0x3a')][_0xaf18('0x3c')]?_0x38fa12[_0xaf18('0x3a')]:_0x3361fc[_0xaf18('0x35')];if(_0x208e17[_0xaf18('0x36')]['includeAll']){_0x38fa12[_0xaf18('0x46')]=[{'all':!![]}];}_0x38fa12=_[_0xaf18('0x44')]({},_0x38fa12,_0x208e17[_0xaf18('0x45')]);return db[_0xaf18('0x30')][_0xaf18('0x4c')](_0x38fa12)[_0xaf18('0x29')](handleEntityNotFound(_0x108631,null))[_0xaf18('0x29')](respondWithResult(_0x108631,null))[_0xaf18('0x49')](handleError(_0x108631,null));};exports[_0xaf18('0x4d')]=function(_0x124b72,_0x5dc6d6){return db[_0xaf18('0x30')][_0xaf18('0x4d')](_0x124b72[_0xaf18('0x4e')],{})['then'](respondWithResult(_0x5dc6d6,0xc9))[_0xaf18('0x49')](handleError(_0x5dc6d6,null));};exports[_0xaf18('0x4f')]=function(_0x90268,_0x5a0da1){return db[_0xaf18('0x30')][_0xaf18('0x4f')]()[_0xaf18('0x29')](respondWithResult(_0x5a0da1,null))[_0xaf18('0x49')](handleError(_0x5a0da1,null));};exports[_0xaf18('0x50')]=function(_0x2ee1cb,_0x4b6b03){if(_0x2ee1cb[_0xaf18('0x4e')][_0xaf18('0x51')]){delete _0x2ee1cb[_0xaf18('0x4e')][_0xaf18('0x51')];}return db[_0xaf18('0x30')][_0xaf18('0x4c')]({'where':{'uniqueid':_0x2ee1cb['params']['id']}})[_0xaf18('0x29')](handleEntityNotFound(_0x4b6b03,null))[_0xaf18('0x29')](saveUpdates(_0x2ee1cb[_0xaf18('0x4e')],null))[_0xaf18('0x29')](respondWithResult(_0x4b6b03,null))['catch'](handleError(_0x4b6b03,null));};
\ No newline at end of file
+var _0x59f1=['send','map','CmHopperHistory','rawAttributes','fieldName','type','key','model','keys','query','filters','intersection','attributes','fields','length','nolimit','order','sort','filter','where','merge','VIRTUAL','options','includeAll','findAll','rows','catch','show','include','create','body','describe','uniqueid','find','params','eml-format','rimraf','request-promise','moment','bluebird','mustache','util','path','sox','ejs','fs-extra','lodash','jsforce','desk.js','querystring','papaparse','ioredis','../../components/parsers/qs','../../components/parsers/advancedSearch','../../config/logger','api','../../config/environment','../../config/license/util','../../mysqldb','sendStatus','status','end','json','offset','undefined','limit','count','set','Content-Range','apply','reject','save','update','then','stack','name'];(function(_0x3b8e2c,_0x11a1b8){var _0x432178=function(_0x524669){while(--_0x524669){_0x3b8e2c['push'](_0x3b8e2c['shift']());}};_0x432178(++_0x11a1b8);}(_0x59f1,0x153));var _0x159f=function(_0x41052c,_0x20035c){_0x41052c=_0x41052c-0x0;var _0x4dc096=_0x59f1[_0x41052c];return _0x4dc096;};'use strict';var emlformat=require(_0x159f('0x0'));var rimraf=require(_0x159f('0x1'));var zipdir=require('zip-dir');var jsonpatch=require('fast-json-patch');var rp=require(_0x159f('0x2'));var moment=require(_0x159f('0x3'));var BPromise=require(_0x159f('0x4'));var Mustache=require(_0x159f('0x5'));var util=require(_0x159f('0x6'));var path=require(_0x159f('0x7'));var sox=require(_0x159f('0x8'));var csv=require('to-csv');var ejs=require(_0x159f('0x9'));var fs=require('fs');var fs_extra=require(_0x159f('0xa'));var _=require(_0x159f('0xb'));var squel=require('squel');var crypto=require('crypto');var jsforce=require(_0x159f('0xc'));var deskjs=require(_0x159f('0xd'));var toCsv=require('to-csv');var querystring=require(_0x159f('0xe'));var Papa=require(_0x159f('0xf'));var Redis=require(_0x159f('0x10'));var authService=require('../../components/auth/service');var qs=require(_0x159f('0x11'));var as=require(_0x159f('0x12'));var hardwareService=require('../../config/license/hardware');var logger=require(_0x159f('0x13'))(_0x159f('0x14'));var utils=require('../../config/utils');var config=require(_0x159f('0x15'));var licenseUtil=require(_0x159f('0x16'));var db=require(_0x159f('0x17'))['db'];function respondWithStatusCode(_0x1ec1c9,_0x58b6c1){_0x58b6c1=_0x58b6c1||0xcc;return function(_0x168eb3){if(_0x168eb3){return _0x1ec1c9[_0x159f('0x18')](_0x58b6c1);}return _0x1ec1c9[_0x159f('0x19')](_0x58b6c1)[_0x159f('0x1a')]();};}function respondWithResult(_0x2ddb72,_0x26fa74){_0x26fa74=_0x26fa74||0xc8;return function(_0x96f5d){if(_0x96f5d){return _0x2ddb72[_0x159f('0x19')](_0x26fa74)[_0x159f('0x1b')](_0x96f5d);}};}function respondWithFilteredResult(_0x599c14,_0x3d5f66){return function(_0x335c5e){if(_0x335c5e){var _0x20323f=typeof _0x3d5f66[_0x159f('0x1c')]===_0x159f('0x1d')&&typeof _0x3d5f66[_0x159f('0x1e')]===_0x159f('0x1d');var _0x4dd1db=_0x335c5e[_0x159f('0x1f')];var _0x239fad=_0x20323f?0x0:_0x3d5f66[_0x159f('0x1c')];var _0x3d2273=_0x20323f?_0x335c5e[_0x159f('0x1f')]:_0x3d5f66[_0x159f('0x1c')]+_0x3d5f66['limit'];var _0x27d7c6;if(_0x3d2273>=_0x4dd1db){_0x3d2273=_0x4dd1db;_0x27d7c6=0xc8;}else{_0x27d7c6=0xce;}_0x599c14[_0x159f('0x19')](_0x27d7c6);return _0x599c14[_0x159f('0x20')](_0x159f('0x21'),_0x239fad+'-'+_0x3d2273+'/'+_0x4dd1db)[_0x159f('0x1b')](_0x335c5e);}return null;};}function patchUpdates(_0x2c5866){return function(_0x390751){try{jsonpatch[_0x159f('0x22')](_0x390751,_0x2c5866,!![]);}catch(_0x12f4e5){return BPromise[_0x159f('0x23')](_0x12f4e5);}return _0x390751[_0x159f('0x24')]();};}function saveUpdates(_0x397e11,_0x3fbacc){return function(_0x2d1987){if(_0x2d1987){return _0x2d1987[_0x159f('0x25')](_0x397e11)[_0x159f('0x26')](function(_0x171eb9){return _0x171eb9;});}return null;};}function removeEntity(_0x216d20,_0x208a37){return function(_0x40e345){if(_0x40e345){return _0x40e345['destroy']()['then'](function(){_0x216d20[_0x159f('0x19')](0xcc)['end']();});}};}function handleEntityNotFound(_0x24e018,_0xec80b1){return function(_0x503fca){if(!_0x503fca){_0x24e018['sendStatus'](0x194);}return _0x503fca;};}function handleError(_0x1db057,_0x5f2053){_0x5f2053=_0x5f2053||0x1f4;return function(_0x1b69f2){logger['error'](_0x1b69f2[_0x159f('0x27')]);if(_0x1b69f2['name']){delete _0x1b69f2[_0x159f('0x28')];}_0x1db057['status'](_0x5f2053)[_0x159f('0x29')](_0x1b69f2);};}exports['index']=function(_0x31283b,_0x6d3599){var _0x4a8d91={},_0x16b63a={},_0x4869d9={'count':0x0,'rows':[]};var _0x58a625=_[_0x159f('0x2a')](db[_0x159f('0x2b')][_0x159f('0x2c')],function(_0x57ac16){return{'name':_0x57ac16[_0x159f('0x2d')],'type':_0x57ac16[_0x159f('0x2e')][_0x159f('0x2f')]};});_0x16b63a[_0x159f('0x30')]=_[_0x159f('0x2a')](_0x58a625,'name');_0x16b63a['query']=_[_0x159f('0x31')](_0x31283b[_0x159f('0x32')]);_0x16b63a[_0x159f('0x33')]=_[_0x159f('0x34')](_0x16b63a[_0x159f('0x30')],_0x16b63a[_0x159f('0x32')]);_0x4a8d91[_0x159f('0x35')]=_[_0x159f('0x34')](_0x16b63a[_0x159f('0x30')],qs[_0x159f('0x36')](_0x31283b[_0x159f('0x32')]['fields']));_0x4a8d91[_0x159f('0x35')]=_0x4a8d91[_0x159f('0x35')][_0x159f('0x37')]?_0x4a8d91[_0x159f('0x35')]:_0x16b63a[_0x159f('0x30')];if(!_0x31283b['query']['hasOwnProperty'](_0x159f('0x38'))){_0x4a8d91[_0x159f('0x1e')]=qs[_0x159f('0x1e')](_0x31283b[_0x159f('0x32')][_0x159f('0x1e')]);_0x4a8d91[_0x159f('0x1c')]=qs[_0x159f('0x1c')](_0x31283b[_0x159f('0x32')][_0x159f('0x1c')]);}_0x4a8d91[_0x159f('0x39')]=qs[_0x159f('0x3a')](_0x31283b['query'][_0x159f('0x3a')]);_0x4a8d91['where']=qs[_0x159f('0x33')](_['pick'](_0x31283b[_0x159f('0x32')],_0x16b63a['filters']),_0x58a625);if(_0x31283b[_0x159f('0x32')][_0x159f('0x3b')]){_0x4a8d91[_0x159f('0x3c')]=_[_0x159f('0x3d')](_0x4a8d91[_0x159f('0x3c')],{'$or':_['map'](_0x58a625,function(_0x569388){if(_0x569388[_0x159f('0x2e')]!==_0x159f('0x3e')){var _0x6d41bf={};_0x6d41bf[_0x569388[_0x159f('0x28')]]={'$like':'%'+_0x31283b['query'][_0x159f('0x3b')]+'%'};return _0x6d41bf;}})});}_0x4a8d91=_['merge']({},_0x4a8d91,_0x31283b[_0x159f('0x3f')]);var _0x1be51e={'where':_0x4a8d91[_0x159f('0x3c')]};return db[_0x159f('0x2b')][_0x159f('0x1f')](_0x1be51e)[_0x159f('0x26')](function(_0x1f6837){_0x4869d9[_0x159f('0x1f')]=_0x1f6837;if(_0x31283b[_0x159f('0x32')][_0x159f('0x40')]){_0x4a8d91['include']=[{'all':!![]}];}return db[_0x159f('0x2b')][_0x159f('0x41')](_0x4a8d91);})['then'](function(_0x331853){_0x4869d9[_0x159f('0x42')]=_0x331853;return _0x4869d9;})[_0x159f('0x26')](respondWithFilteredResult(_0x6d3599,_0x4a8d91))[_0x159f('0x43')](handleError(_0x6d3599,null));};exports[_0x159f('0x44')]=function(_0x4f2d07,_0x5d636d){var _0x39b6b0={'raw':!![],'where':{'id':_0x4f2d07['params']['id']}},_0x4cc490={};_0x4cc490[_0x159f('0x30')]=_['keys'](db['CmHopperHistory'][_0x159f('0x2c')]);_0x4cc490[_0x159f('0x32')]=_[_0x159f('0x31')](_0x4f2d07['query']);_0x4cc490[_0x159f('0x33')]=_[_0x159f('0x34')](_0x4cc490[_0x159f('0x30')],_0x4cc490[_0x159f('0x32')]);_0x39b6b0[_0x159f('0x35')]=_[_0x159f('0x34')](_0x4cc490['model'],qs[_0x159f('0x36')](_0x4f2d07[_0x159f('0x32')][_0x159f('0x36')]));_0x39b6b0[_0x159f('0x35')]=_0x39b6b0[_0x159f('0x35')][_0x159f('0x37')]?_0x39b6b0[_0x159f('0x35')]:_0x4cc490[_0x159f('0x30')];if(_0x4f2d07[_0x159f('0x32')][_0x159f('0x40')]){_0x39b6b0[_0x159f('0x45')]=[{'all':!![]}];}_0x39b6b0=_[_0x159f('0x3d')]({},_0x39b6b0,_0x4f2d07[_0x159f('0x3f')]);return db[_0x159f('0x2b')]['find'](_0x39b6b0)['then'](handleEntityNotFound(_0x5d636d,null))[_0x159f('0x26')](respondWithResult(_0x5d636d,null))[_0x159f('0x43')](handleError(_0x5d636d,null));};exports[_0x159f('0x46')]=function(_0x1a7b44,_0x452834){return db[_0x159f('0x2b')][_0x159f('0x46')](_0x1a7b44[_0x159f('0x47')],{})[_0x159f('0x26')](respondWithResult(_0x452834,0xc9))[_0x159f('0x43')](handleError(_0x452834,null));};exports['describe']=function(_0x50a77d,_0x1b983e){return db[_0x159f('0x2b')][_0x159f('0x48')]()[_0x159f('0x26')](respondWithResult(_0x1b983e,null))[_0x159f('0x43')](handleError(_0x1b983e,null));};exports[_0x159f('0x25')]=function(_0x1f53cb,_0x443515){if(_0x1f53cb[_0x159f('0x47')][_0x159f('0x49')]){delete _0x1f53cb[_0x159f('0x47')]['uniqueid'];}return db[_0x159f('0x2b')][_0x159f('0x4a')]({'where':{'uniqueid':_0x1f53cb[_0x159f('0x4b')]['id']}})['then'](handleEntityNotFound(_0x443515,null))['then'](saveUpdates(_0x1f53cb[_0x159f('0x47')],null))[_0x159f('0x26')](respondWithResult(_0x443515,null))[_0x159f('0x43')](handleError(_0x443515,null));};
\ No newline at end of file