Built motion from commit d127c62.|0.0.151
[motion.git] / server / api / voice_recording / voice_recording.controller.js
index 70822d7..b5bd6da 100644 (file)
@@ -1 +1 @@
-var _0xbc91=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x56\x6F\x69\x63\x65\x52\x65\x63\x6F\x72\x64\x69\x6E\x67","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x62\x6C\x75\x65\x62\x69\x72\x64","\x66\x69\x6C\x65\x2D\x62\x61\x73\x65\x36\x34","\x66\x73","\x70\x61\x74\x68","\x63\x61\x75\x73\x65","\x63\x6F\x64\x65","\x45\x4E\x4F\x45\x4E\x54","\x4E\x6F\x20\x66\x69\x6C\x65\x20\x6F\x72\x20\x64\x69\x72\x65\x63\x74\x6F\x72\x79","\x4D\x45\x53\x53\x41\x47\x45\x5F\x4E\x4F\x5F\x46\x49\x4C\x45\x5F\x4F\x52\x5F\x44\x49\x52\x45\x43\x54\x4F\x52\x59","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x74\x68\x65\x6E","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x72\x6F\x77\x73","\x6E\x61\x6D\x65","\x6D\x61\x70","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x67\x65\x74\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x69\x64","\x75\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x61\x67\x65\x6E\x74","\x72\x6F\x6C\x65","\x73\x68\x6F\x77","\x70\x61\x72\x61\x6D\x73","\x64\x65\x73\x63\x72\x69\x62\x65","\x67\x65\x74\x53\x74\x72\x65\x61\x6D","\x62\x61\x73\x65\x36\x34","\x62\x69\x6E\x61\x72\x79","\x72\x65\x61\x64\x46\x69\x6C\x65","\x70\x72\x6F\x6D\x69\x73\x69\x66\x79","\x76\x61\x6C\x75\x65","\x67\x65\x74\x53\x74\x72\x65\x61\x6D\x42\x79\x55\x6E\x69\x71\x75\x65\x69\x64","\x62\x61\x73\x65\x6E\x61\x6D\x65","\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x75\x6E\x69\x71\x75\x65\x69\x64","\x66\x69\x6E\x64\x4F\x6E\x65","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64\x73"];_0xbc91[0];var _=require(_0xbc91[1]);var util=require(_0xbc91[2]);var Util=require(_0xbc91[3]);var VoiceRecording=require(_0xbc91[5])[_0xbc91[4]];var User=require(_0xbc91[5])[_0xbc91[6]];var Promise=require(_0xbc91[7]);var base64=require(_0xbc91[8]);var fs=require(_0xbc91[9]);var path=require(_0xbc91[10]);function handleError(_0x5231xb){return function(_0x5231xc){if(_0x5231xc[_0xbc91[11]]&& _0x5231xc[_0xbc91[11]][_0xbc91[12]]=== _0xbc91[13]){_0x5231xc= {message:_0xbc91[14],translatedMessage:_0xbc91[15]}};return _0x5231xb[_0xbc91[17]](500)[_0xbc91[16]](_0x5231xc)}}function responseWithResult(_0x5231xb,_0x5231xe){_0x5231xe= _0x5231xe|| 200;return function(_0x5231xf){if(_0x5231xf){_0x5231xb[_0xbc91[17]](_0x5231xe)[_0xbc91[18]](_0x5231xf)}}}function handleEntityNotFound(_0x5231xb){return function(_0x5231xf){if(!_0x5231xf){_0x5231xb[_0xbc91[17]](404)[_0xbc91[19]]();return null};return _0x5231xf}}function saveUpdates(_0x5231x12){return function(_0x5231xf){return _0x5231xf[_0xbc91[20]](_0x5231x12)}}function removeEntity(_0x5231xb){return function(_0x5231xf){if(_0x5231xf){return _0x5231xf[_0xbc91[22]]()[_0xbc91[21]](function(){_0x5231xb[_0xbc91[17]](204)[_0xbc91[19]]()})}}}exports[_0xbc91[23]]= function(_0x5231x14,_0x5231xb){switch(_0x5231x14[_0xbc91[33]][_0xbc91[36]]){case _0xbc91[33]:return User[_0xbc91[34]](_0x5231x14[_0xbc91[33]][_0xbc91[32]],{attributes:[_0xbc91[32]]})[_0xbc91[21]](Util[_0xbc91[31]]())[_0xbc91[21]](function(_0x5231x15){_0x5231x15= _[_0xbc91[27]](_0x5231x15[_0xbc91[25]],_0xbc91[26]);return VoiceRecording[_0xbc91[30]](Util[_0xbc91[29]](_0x5231x14[_0xbc91[28]],{queue:_0x5231x15}))})[_0xbc91[21]](responseWithResult(_0x5231xb))[_0xbc91[24]](handleError(_0x5231xb));case _0xbc91[35]:return VoiceRecording[_0xbc91[30]](Util[_0xbc91[29]](_0x5231x14[_0xbc91[28]],{membername:_0x5231x14[_0xbc91[33]][_0xbc91[26]]}))[_0xbc91[21]](responseWithResult(_0x5231xb))[_0xbc91[24]](handleError(_0x5231xb));default:return VoiceRecording[_0xbc91[30]](Util[_0xbc91[29]](_0x5231x14[_0xbc91[28]]))[_0xbc91[21]](responseWithResult(_0x5231xb))[_0xbc91[24]](handleError(_0x5231xb))}};exports[_0xbc91[37]]= function(_0x5231x14,_0x5231xb){return VoiceRecording[_0xbc91[34]](_0x5231x14[_0xbc91[38]][_0xbc91[32]])[_0xbc91[21]](handleEntityNotFound(_0x5231xb))[_0xbc91[21]](responseWithResult(_0x5231xb))[_0xbc91[24]](handleError(_0x5231xb))};exports[_0xbc91[39]]= function(_0x5231x14,_0x5231xb){return VoiceRecording[_0xbc91[39]]()[_0xbc91[21]](function(_0x5231x16){return _0x5231xb[_0xbc91[17]](200)[_0xbc91[16]](_0x5231x16)})[_0xbc91[24]](handleError(_0x5231xb))};exports[_0xbc91[40]]= function(_0x5231x14,_0x5231xb){return VoiceRecording[_0xbc91[34]](_0x5231x14[_0xbc91[38]][_0xbc91[32]])[_0xbc91[21]](function(_0x5231x19){var _0x5231x1a=Promise[_0xbc91[44]](fs[_0xbc91[43]]);return _0x5231x1a(_0x5231x19[_0xbc91[45]])})[_0xbc91[21]](function(_0x5231x18){var _0x5231x17= new Buffer(_0x5231x18,_0xbc91[42]).toString(_0xbc91[41]);return _0x5231x17})[_0xbc91[21]](function(_0x5231x17){return _0x5231xb[_0xbc91[17]](200)[_0xbc91[16]]({downloadString:_0x5231x17})})[_0xbc91[24]](handleError(_0x5231xb))};exports[_0xbc91[46]]= function(_0x5231x14,_0x5231xb){return VoiceRecording[_0xbc91[50]]({where:{uniqueid:_0x5231x14[_0xbc91[38]][_0xbc91[49]]}})[_0xbc91[21]](handleEntityNotFound(_0x5231xb))[_0xbc91[21]](function(_0x5231x19){return _0x5231xb[_0xbc91[48]](_0x5231x19[_0xbc91[45]],path[_0xbc91[47]](_0x5231x19[_0xbc91[45]]))})[_0xbc91[24]](handleError(_0x5231xb))};exports[_0xbc91[51]]= function(_0x5231x14,_0x5231xb){return VoiceRecording[_0xbc91[51]](_0x5231x14[_0xbc91[52]])[_0xbc91[21]](responseWithResult(_0x5231xb,201))[_0xbc91[24]](handleError(_0x5231xb))};exports[_0xbc91[53]]= function(_0x5231x14,_0x5231xb){if(_0x5231x14[_0xbc91[52]][_0xbc91[32]]){delete _0x5231x14[_0xbc91[52]][_0xbc91[32]]};return VoiceRecording[_0xbc91[34]](_0x5231x14[_0xbc91[38]][_0xbc91[32]])[_0xbc91[21]](handleEntityNotFound(_0x5231xb))[_0xbc91[21]](saveUpdates(_0x5231x14[_0xbc91[52]]))[_0xbc91[21]](responseWithResult(_0x5231xb))[_0xbc91[24]](handleError(_0x5231xb))};exports[_0xbc91[22]]= function(_0x5231x14,_0x5231xb){return VoiceRecording[_0xbc91[34]](_0x5231x14[_0xbc91[38]][_0xbc91[32]])[_0xbc91[21]](handleEntityNotFound(_0x5231xb))[_0xbc91[21]](removeEntity(_0x5231xb))[_0xbc91[24]](handleError(_0x5231xb))};exports[_0xbc91[54]]= function(_0x5231x14,_0x5231xb){return VoiceRecording[_0xbc91[22]]({where:{uniqueid:_0x5231x14[_0xbc91[28]][_0xbc91[56]]},individualHooks:true})[_0xbc91[21]](function(){return _0x5231xb[_0xbc91[55]](204)})[_0xbc91[24]](handleError(_0x5231xb))}
\ No newline at end of file
+var _0x22cd=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x56\x6F\x69\x63\x65\x52\x65\x63\x6F\x72\x64\x69\x6E\x67","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x62\x6C\x75\x65\x62\x69\x72\x64","\x66\x69\x6C\x65\x2D\x62\x61\x73\x65\x36\x34","\x66\x73","\x70\x61\x74\x68","\x63\x61\x75\x73\x65","\x63\x6F\x64\x65","\x45\x4E\x4F\x45\x4E\x54","\x4E\x6F\x20\x66\x69\x6C\x65\x20\x6F\x72\x20\x64\x69\x72\x65\x63\x74\x6F\x72\x79","\x4D\x45\x53\x53\x41\x47\x45\x5F\x4E\x4F\x5F\x46\x49\x4C\x45\x5F\x4F\x52\x5F\x44\x49\x52\x45\x43\x54\x4F\x52\x59","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x76\x61\x6C\x75\x65","\x73\x74\x61\x74\x53\x79\x6E\x63","\x6C\x6F\x67","\x74\x68\x65\x6E","\x64\x65\x73\x74\x72\x6F\x79","\x75\x6E\x6C\x69\x6E\x6B\x53\x79\x6E\x63","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x72\x6F\x77\x73","\x6E\x61\x6D\x65","\x6D\x61\x70","\x75\x6E\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x67\x65\x74\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x69\x64","\x75\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x61\x67\x65\x6E\x74","\x72\x6F\x6C\x65","\x73\x68\x6F\x77","\x70\x61\x72\x61\x6D\x73","\x64\x65\x73\x63\x72\x69\x62\x65","\x67\x65\x74\x53\x74\x72\x65\x61\x6D","\x62\x61\x73\x65\x36\x34","\x62\x69\x6E\x61\x72\x79","\x72\x65\x61\x64\x46\x69\x6C\x65","\x70\x72\x6F\x6D\x69\x73\x69\x66\x79","\x67\x65\x74\x53\x74\x72\x65\x61\x6D\x42\x79\x49\x64","\x74\x79\x70\x65","\x68\x61\x73\x4F\x77\x6E\x50\x72\x6F\x70\x65\x72\x74\x79","\x75\x6E\x69\x71\x75\x65\x69\x64","\x62\x61\x73\x65\x6E\x61\x6D\x65","\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x66\x69\x6E\x64\x4F\x6E\x65","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x61\x6C\x6C","\x70\x75\x73\x68","\x43\x61\x6E\x27\x20\x74\x20\x64\x65\x6C\x65\x74\x65\x20\x74\x68\x65\x20\x66\x69\x6C\x65","\x46\x69\x6C\x65\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64\x2C\x20\x64\x65\x6C\x65\x74\x69\x6E\x67\x20\x64\x62\x20\x65\x6E\x74\x72\x79\x2E\x2E\x2E","\x69\x64\x73","\x66\x69\x6E\x64\x41\x6C\x6C"];_0x22cd[0];var _=require(_0x22cd[1]);var util=require(_0x22cd[2]);var Util=require(_0x22cd[3]);var VoiceRecording=require(_0x22cd[5])[_0x22cd[4]];var User=require(_0x22cd[5])[_0x22cd[6]];var Promise=require(_0x22cd[7]);var base64=require(_0x22cd[8]);var fs=require(_0x22cd[9]);var path=require(_0x22cd[10]);function handleError(_0xb8c5xb){return function(_0xb8c5xc){if(_0xb8c5xc[_0x22cd[11]]&& _0xb8c5xc[_0x22cd[11]][_0x22cd[12]]=== _0x22cd[13]){_0xb8c5xc= {message:_0x22cd[14],translatedMessage:_0x22cd[15]}};return _0xb8c5xb[_0x22cd[17]](500)[_0x22cd[16]](_0xb8c5xc)}}function responseWithResult(_0xb8c5xb,_0xb8c5xe){_0xb8c5xe= _0xb8c5xe|| 200;return function(_0xb8c5xf){if(_0xb8c5xf){_0xb8c5xb[_0x22cd[17]](_0xb8c5xe)[_0x22cd[18]](_0xb8c5xf)}}}function handleEntityNotFound(_0xb8c5xb){return function(_0xb8c5xf){if(!_0xb8c5xf){_0xb8c5xb[_0x22cd[17]](404)[_0x22cd[19]]();return null};return _0xb8c5xf}}function saveUpdates(_0xb8c5x12){return function(_0xb8c5xf){return _0xb8c5xf[_0x22cd[20]](_0xb8c5x12)}}function removeEntity(_0xb8c5xb){return function(_0xb8c5xf){if(_0xb8c5xf){try{fs[_0x22cd[22]](_0xb8c5xf[_0x22cd[21]])}catch(err){console[_0x22cd[23]](err);return _0xb8c5xf[_0x22cd[25]]()[_0x22cd[24]](function(){_0xb8c5xb[_0x22cd[17]](204)[_0x22cd[19]]()})};try{fs[_0x22cd[26]](_0xb8c5xf[_0x22cd[21]]);return _0xb8c5xf[_0x22cd[25]]()[_0x22cd[24]](function(){_0xb8c5xb[_0x22cd[17]](204)[_0x22cd[19]]()})}catch(err){console[_0x22cd[23]](err);throw  new Error(err)}}}}exports[_0x22cd[27]]= function(_0xb8c5x14,_0xb8c5xb){switch(_0xb8c5x14[_0x22cd[39]][_0x22cd[42]]){case _0x22cd[39]:return User[_0x22cd[40]](_0xb8c5x14[_0x22cd[39]][_0x22cd[38]],{attributes:[_0x22cd[38]]})[_0x22cd[24]](Util[_0x22cd[37]]())[_0x22cd[24]](function(_0xb8c5x15){var _0xb8c5x16=[];var _0xb8c5x17=_[_0x22cd[31]](_0xb8c5x15[_0x22cd[29]],_0x22cd[30]);_0xb8c5x15[_0x22cd[29]][_0x22cd[33]](function(_0xb8c5x18){_0xb8c5x16= _[_0x22cd[32]](_0xb8c5x16,_[_0x22cd[31]](_0xb8c5x18.Users,_0x22cd[30]))});return VoiceRecording[_0x22cd[36]](Util[_0x22cd[35]](_0xb8c5x14[_0x22cd[34]],{$or:{queue:_0xb8c5x17,membername:_0xb8c5x16}}))})[_0x22cd[24]](responseWithResult(_0xb8c5xb))[_0x22cd[28]](handleError(_0xb8c5xb));case _0x22cd[41]:return VoiceRecording[_0x22cd[36]](Util[_0x22cd[35]](_0xb8c5x14[_0x22cd[34]],{membername:_0xb8c5x14[_0x22cd[39]][_0x22cd[30]]}))[_0x22cd[24]](responseWithResult(_0xb8c5xb))[_0x22cd[28]](handleError(_0xb8c5xb));default:return VoiceRecording[_0x22cd[36]](Util[_0x22cd[35]](_0xb8c5x14[_0x22cd[34]]))[_0x22cd[24]](responseWithResult(_0xb8c5xb))[_0x22cd[28]](handleError(_0xb8c5xb))}};exports[_0x22cd[43]]= function(_0xb8c5x14,_0xb8c5xb){return VoiceRecording[_0x22cd[40]](_0xb8c5x14[_0x22cd[44]][_0x22cd[38]])[_0x22cd[24]](handleEntityNotFound(_0xb8c5xb))[_0x22cd[24]](responseWithResult(_0xb8c5xb))[_0x22cd[28]](handleError(_0xb8c5xb))};exports[_0x22cd[45]]= function(_0xb8c5x14,_0xb8c5xb){return VoiceRecording[_0x22cd[45]]()[_0x22cd[24]](function(_0xb8c5x19){return _0xb8c5xb[_0x22cd[17]](200)[_0x22cd[16]](_0xb8c5x19)})[_0x22cd[28]](handleError(_0xb8c5xb))};exports[_0x22cd[46]]= function(_0xb8c5x14,_0xb8c5xb){return VoiceRecording[_0x22cd[40]](_0xb8c5x14[_0x22cd[44]][_0x22cd[38]])[_0x22cd[24]](function(_0xb8c5x1c){var _0xb8c5x1d=Promise[_0x22cd[50]](fs[_0x22cd[49]]);return _0xb8c5x1d(_0xb8c5x1c[_0x22cd[21]])})[_0x22cd[24]](function(_0xb8c5x1b){var _0xb8c5x1a= new Buffer(_0xb8c5x1b,_0x22cd[48]).toString(_0x22cd[47]);return _0xb8c5x1a})[_0x22cd[24]](function(_0xb8c5x1a){return _0xb8c5xb[_0x22cd[17]](200)[_0x22cd[16]]({downloadString:_0xb8c5x1a})})[_0x22cd[28]](handleError(_0xb8c5xb))};exports[_0x22cd[51]]= function(_0xb8c5x14,_0xb8c5xb){var _0xb8c5x1e={};if(_0xb8c5x14[_0x22cd[34]]&& _0xb8c5x14[_0x22cd[34]][_0x22cd[53]](_0x22cd[52])&& _0xb8c5x14[_0x22cd[34]][_0x22cd[52]]=== _0x22cd[54]){_0xb8c5x1e[_0x22cd[54]]= _0xb8c5x14[_0x22cd[44]][_0x22cd[38]]}else {_0xb8c5x1e[_0x22cd[38]]= _0xb8c5x14[_0x22cd[44]][_0x22cd[38]]};return VoiceRecording[_0x22cd[57]]({where:_0xb8c5x1e})[_0x22cd[24]](handleEntityNotFound(_0xb8c5xb))[_0x22cd[24]](function(_0xb8c5x1c){return _0xb8c5xb[_0x22cd[56]](_0xb8c5x1c[_0x22cd[21]],path[_0x22cd[55]](_0xb8c5x1c[_0x22cd[21]]))})[_0x22cd[28]](handleError(_0xb8c5xb))};exports[_0x22cd[58]]= function(_0xb8c5x14,_0xb8c5xb){return VoiceRecording[_0x22cd[58]](_0xb8c5x14[_0x22cd[59]])[_0x22cd[24]](responseWithResult(_0xb8c5xb,201))[_0x22cd[28]](handleError(_0xb8c5xb))};exports[_0x22cd[60]]= function(_0xb8c5x14,_0xb8c5xb){if(_0xb8c5x14[_0x22cd[59]][_0x22cd[38]]){delete _0xb8c5x14[_0x22cd[59]][_0x22cd[38]]};return VoiceRecording[_0x22cd[40]](_0xb8c5x14[_0x22cd[44]][_0x22cd[38]])[_0x22cd[24]](handleEntityNotFound(_0xb8c5xb))[_0x22cd[24]](saveUpdates(_0xb8c5x14[_0x22cd[59]]))[_0x22cd[24]](responseWithResult(_0xb8c5xb))[_0x22cd[28]](handleError(_0xb8c5xb))};exports[_0x22cd[25]]= function(_0xb8c5x14,_0xb8c5xb){return VoiceRecording[_0x22cd[40]](_0xb8c5x14[_0x22cd[44]][_0x22cd[38]])[_0x22cd[24]](handleEntityNotFound(_0xb8c5xb))[_0x22cd[24]](removeEntity(_0xb8c5xb))[_0x22cd[28]](handleError(_0xb8c5xb))};exports[_0x22cd[61]]= function(_0xb8c5x14,_0xb8c5xb){return VoiceRecording[_0x22cd[68]]({where:{id:_0xb8c5x14[_0x22cd[34]][_0x22cd[67]]}})[_0x22cd[24]](function(_0xb8c5x1f){var _0xb8c5x20=[];_[_0x22cd[33]](_0xb8c5x1f,function(_0xb8c5x21){try{fs[_0x22cd[22]](_0xb8c5x21[_0x22cd[21]]);try{fs[_0x22cd[26]](_0xb8c5x21[_0x22cd[21]]);_0xb8c5x20[_0x22cd[64]](_0xb8c5x21[_0x22cd[25]]())}catch(err){console[_0x22cd[23]](_0x22cd[65],err)}}catch(err){console[_0x22cd[23]](_0x22cd[66]);_0xb8c5x20[_0x22cd[64]](_0xb8c5x21[_0x22cd[25]]())}});return _0xb8c5x20})[_0x22cd[63]]()[_0x22cd[24]](function(){return _0xb8c5xb[_0x22cd[62]](204)})[_0x22cd[28]](handleError(_0xb8c5xb))}
\ No newline at end of file