Built motion from commit 5e31ea4.|0.0.32
[motion.git] / server / api / voice_extension / voice_extension.controller.js
index 42e223e..c3c727b 100644 (file)
@@ -1 +1,1348 @@
-var _0x2c4e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x49\x6E\x74\x65\x72\x76\x61\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x53\x65\x71\x75\x65\x6C\x69\x7A\x65","\x75\x74\x69\x6C","\x61\x73\x79\x6E\x63","\x47\x6F\x74\x6F\x49\x66\x54\x69\x6D\x65","\x25\x73\x3F\x25\x73\x2C\x24\x7B\x45\x58\x54\x45\x4E\x7D\x2C\x25\x73\x3A\x25\x73\x2C\x24\x7B\x45\x58\x54\x45\x4E\x7D\x2C\x25\x73","\x53\x65\x74","\x43\x41\x4C\x4C\x45\x52\x49\x44\x28\x61\x6C\x6C\x29\x3D\x25\x73","\x44\x69\x61\x6C","\x25\x73\x2C\x25\x73\x2C\x25\x73\x2C\x25\x73","\x4E\x6F\x4F\x70","\x44\x69\x61\x6C\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x41\x6E\x73\x77\x65\x72","","\x51\x75\x65\x75\x65","\x25\x73\x2C\x25\x73\x2C\x25\x73\x2C\x25\x73\x2C\x25\x73","\x51\x75\x65\x75\x65\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x50\x6C\x61\x79\x62\x61\x63\x6B","\x25\x73\x2C\x25\x73","\x50\x6C\x61\x79\x62\x61\x63\x6B\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x41\x47\x49","\x61\x67\x69\x3A\x2F\x2F\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31\x2F\x73\x71\x75\x61\x72\x65\x2C\x25\x73","\x41\x47\x49\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x47\x6F\x74\x6F","\x25\x73\x2C\x25\x73\x2C\x25\x64","\x47\x6F\x74\x6F\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x48\x61\x6E\x67\x75\x70","\x25\x73","\x48\x61\x6E\x67\x75\x70\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x25\x73\x3D\x25\x73","\x53\x65\x74\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x63\x75\x73\x74\x6F\x6D","\x43\x75\x73\x74\x6F\x6D\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x56\x6F\x69\x63\x65\x6D\x61\x69\x6C","\x56\x6F\x69\x63\x65\x6D\x61\x69\x6C\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77\x42\x79\x52\x6F\x75\x74\x65","\x63\x6F\x6E\x74\x65\x78\x74","\x65\x78\x74\x65\x6E","\x61\x70\x70","\x61\x70\x70\x64\x61\x74\x61","\x70\x65\x72\x5F\x70\x61\x67\x65","\x71\x75\x65\x72\x79","\x70\x61\x67\x65","\x72\x6F\x75\x74\x65","\x70\x61\x72\x61\x6D\x73","\x6F\x72\x64\x65\x72","\x25\x73\x20\x25\x73","\x73\x6F\x72\x74\x5F\x62\x79","\x73\x6F\x72\x74\x5F\x6F\x72\x64\x65\x72","\x41\x53\x43","\x66\x6F\x72\x6D\x61\x74","\x24\x6F\x72","\x77\x68\x65\x72\x65","\x25","\x70\x75\x73\x68","\x66\x6F\x72\x45\x61\x63\x68","\x24","\x24\x6C\x69\x6B\x65","\x66\x6F\x72\x49\x6E","\x53\x6F\x6D\x65\x74\x68\x69\x6E\x67\x20\x62\x6C\x65\x77\x20\x75\x70\x21","\x63\x6F\x75\x6E\x74","\x63\x65\x69\x6C","\x6F\x66\x66\x73\x65\x74","\x25\x73\x3A\x2F\x2F\x25\x73\x25\x73\x3F\x70\x61\x67\x65\x3D\x25\x64","\x70\x72\x6F\x74\x6F\x63\x6F\x6C","\x68\x6F\x73\x74","\x68\x65\x61\x64\x65\x72\x73","\x62\x61\x73\x65\x55\x72\x6C","\x72\x6F\x77\x73","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77\x41\x70\x70\x73\x42\x79\x52\x6F\x75\x74\x65","\x69\x64","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x72\x6F\x75\x74\x65\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x62\x6F\x64\x79","\x74\x79\x70\x65","\x73\x6F\x72\x74\x41\x70\x70\x73\x42\x79\x52\x6F\x75\x74\x65","\x61\x70\x70\x47\x72\x6F\x75\x70","\x69\x73\x41\x70\x70","\x66\x69\x6E\x64","\x63\x6C\x6F\x6E\x65\x44\x65\x65\x70","\x63\x75\x73\x74\x6F\x6D\x41\x70\x70","\x25\x73\x25\x73\x25\x73","\x69\x6E\x74\x65\x72\x76\x61\x6C","\x2A\x2C\x2A\x2C\x2A\x2C\x2A","\x69\x73\x49\x6E\x74\x65\x72\x76\x61\x6C","\x66\x69\x6C\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x73\x70\x6C\x69\x63\x65","\x47\x6F\x74\x6F\x49\x66\x54\x69\x6D\x65\x46\x72\x6F\x6D\x41\x72\x72\x61\x79","\x3F\x25\x73\x2C\x24\x7B\x45\x58\x54\x45\x4E\x7D\x2C\x25\x73\x3A\x25\x73\x2C\x24\x7B\x45\x58\x54\x45\x4E\x7D\x2C\x25\x73","\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64","\x75\x6E\x73\x68\x69\x66\x74","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x64\x65\x73\x74\x72\x6F\x79","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x63\x72\x65\x61\x74\x65","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E\x49\x64","\x70\x72\x69\x6F\x72\x69\x74\x79","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x70\x6C\x75\x63\x6B","\x4D\x45\x53\x53\x41\x47\x45\x5F\x45\x58\x49\x53\x54\x5F\x52\x4F\x55\x54\x45","\x6D\x61\x78","\x63\x61\x6C\x6C\x65\x72\x49\x44","\x72\x65\x6D\x6F\x76\x65","\x6F\x75\x74\x62\x6F\x75\x6E\x64","\x74\x72\x75\x6E\x6B","\x54\x72\x75\x6E\x6B\x49\x64","\x63\x75\x74\x64\x69\x67\x69\x74\x73","\x69\x6E\x74\x65\x72\x66\x61\x63\x65","\x61\x70\x70\x5F\x6F\x70\x74\x69\x6F\x6E\x73","\x74\x69\x6D\x65\x6F\x75\x74","\x75\x72\x6C","\x2C","\x72\x65\x70\x6C\x61\x63\x65","\x4F\x75\x74\x62\x6F\x75\x6E\x64\x20\x44\x69\x61\x6C\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x61\x75\x64\x69\x6F\x66\x69\x6C\x65","\x71\x75\x65\x75\x65","\x70\x72\x6F\x6A\x65\x63\x74","\x61\x6C\x74\x5F\x70\x72\x69\x6F\x72\x69\x74\x79","\x61\x6C\x74\x5F\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x61\x6C\x74\x5F\x63\x6F\x6E\x74\x65\x78\x74","\x63\x61\x75\x73\x65\x63\x6F\x64\x65","\x76\x61\x72\x69\x61\x62\x6C\x65","\x76\x61\x6C\x75\x65","\x6D\x61\x69\x6C\x62\x6F\x78","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79"];_0x2c4e[0];var _=require(_0x2c4e[1]);var VoiceExtension=require(_0x2c4e[3])[_0x2c4e[2]];var Interval=require(_0x2c4e[3])[_0x2c4e[4]];var sequelize=require(_0x2c4e[3])[_0x2c4e[5]];var Sequelize=require(_0x2c4e[3])[_0x2c4e[6]];var util=require(_0x2c4e[7]);var async=require(_0x2c4e[8]);var Applications={Dial:[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[11],appdata:_0x2c4e[12]},{app:_0x2c4e[13],appdata:_0x2c4e[14],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[16]}],Queue:[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[17],appdata:_0x2c4e[18]},{app:_0x2c4e[19],appdata:_0x2c4e[20],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[21]}],Playback:[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[22],appdata:_0x2c4e[23],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[24]}],AGI:[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[25],appdata:_0x2c4e[26],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[27]}],Goto:[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[28],appdata:_0x2c4e[29],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[30]}],Hangup:[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[31],appdata:_0x2c4e[32],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[33]}],Set:[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[11],appdata:_0x2c4e[34],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[35]}],custom:[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[36],appdata:_0x2c4e[32],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[37]}],Voicemail:[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[38],appdata:_0x2c4e[32],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[39]}]};exports[_0x2c4e[40]]=function(_0x234fx9,_0x234fxa){VoiceExtension[_0x2c4e[45]]()[_0x2c4e[44]](function(_0x234fxc){return _0x234fxa[_0x2c4e[43]](200)[_0x2c4e[42]](_0x234fxc)})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)})};exports[_0x2c4e[46]]=function(_0x234fx9,_0x234fxa,_0x234fxd){var _0x234fxe=[_0x2c4e[47],_0x2c4e[48],_0x2c4e[49],_0x2c4e[50]];var _0x234fxf=_0x234fx9[_0x2c4e[52]][_0x2c4e[51]]?parseInt(_0x234fx9[_0x2c4e[52]][_0x2c4e[51]],10):100;var _0x234fx10=_0x234fx9[_0x2c4e[52]][_0x2c4e[53]]?parseInt(_0x234fx9[_0x2c4e[52]][_0x2c4e[53]],10):0;var _0x234fx11={where:{type:_0x234fx9[_0x2c4e[55]][_0x2c4e[54]],VoiceExtensionId:null,app:_0x2c4e[15]},limit:_0x234fxf,offset:_0x234fx10*_0x234fxf};_[_0x2c4e[69]](_0x234fx9[_0x2c4e[52]],function(_0x234fx12,_0x234fx13){switch(_0x234fx13){case _0x2c4e[51]:;case _0x2c4e[53]:break ;;case _0x2c4e[58]:_0x234fx11[_0x2c4e[56]]=util[_0x2c4e[61]](_0x2c4e[57],_0x234fx9[_0x2c4e[52]][_0x2c4e[58]],_0x234fx9[_0x2c4e[52]][_0x2c4e[59]]||_0x2c4e[60])||null;break ;;case _0x2c4e[59]:break ;;case _0x2c4e[67]:_0x234fx11[_0x2c4e[63]][_0x2c4e[62]]=[];_0x234fxe[_0x2c4e[66]](function(_0x234fx14){var _0x234fx15={};_0x234fx15[_0x234fx14]={$like:_0x2c4e[64]+_0x234fx12+_0x2c4e[64]};_0x234fx11[_0x2c4e[63]][_0x2c4e[62]][_0x2c4e[65]](_0x234fx15);});break ;;default:_0x234fx11[_0x2c4e[63]][_0x234fx13]={$like:{}};_0x234fx11[_0x2c4e[63]][_0x234fx13][_0x2c4e[68]]=_0x2c4e[64]+_0x234fx12+_0x2c4e[64];;}});VoiceExtension[_0x2c4e[80]](_0x234fx11)[_0x2c4e[44]](function(_0x234fx16){var _0x234fx17=Math[_0x2c4e[72]](_0x234fx16[_0x2c4e[71]]/_0x234fxf);var _0x234fx18=_0x234fx17>(_0x234fx11[_0x2c4e[73]]+1)?util[_0x2c4e[61]](_0x2c4e[74],_0x234fx9[_0x2c4e[75]],_0x234fx9[_0x2c4e[77]][_0x2c4e[76]],_0x234fx9[_0x2c4e[78]],_0x234fx10+1):null;var _0x234fx19=_0x234fx10>0?util[_0x2c4e[61]](_0x2c4e[74],_0x234fx9[_0x2c4e[75]],_0x234fx9[_0x2c4e[77]][_0x2c4e[76]],_0x234fx9[_0x2c4e[78]],_0x234fx10-1):null;_0x234fxa[_0x2c4e[43]](200)[_0x2c4e[42]]({count:_0x234fx16[_0x2c4e[71]],rows:_0x234fx16[_0x2c4e[79]],next_page:_0x234fx18,previous_page:_0x234fx19,total_pages:_0x234fx17});})[_0x2c4e[41]](function(_0x234fxb){_0x234fxa[_0x2c4e[43]](500)[_0x2c4e[42]]({error:_0x2c4e[70]})});};exports[_0x2c4e[81]]=function(_0x234fx9,_0x234fxa){VoiceExtension[_0x2c4e[45]]({where:{VoiceExtensionId:_0x234fx9[_0x2c4e[55]][_0x2c4e[82]],isApp:true}})[_0x2c4e[44]](function(_0x234fxc){return _0x234fxa[_0x2c4e[43]](200)[_0x2c4e[42]](_0x234fxc)})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)})};exports[_0x2c4e[83]]=function(_0x234fx9,_0x234fxa){VoiceExtension[_0x2c4e[85]](_0x234fx9[_0x2c4e[55]][_0x2c4e[82]])[_0x2c4e[44]](function(_0x234fx1a){if(!_0x234fx1a){return _0x234fxa[_0x2c4e[84]](404)};return _0x234fxa[_0x2c4e[42]](_0x234fx1a);})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)})};exports[_0x2c4e[86]]=function(_0x234fx9,_0x234fxa){VoiceExtension[_0x2c4e[45]]({where:{exten:_0x234fx9[_0x2c4e[87]][_0x2c4e[48]],context:_0x234fx9[_0x2c4e[87]][_0x2c4e[47]],type:_0x234fx9[_0x2c4e[87]][_0x2c4e[88]]}})[_0x2c4e[44]](function(_0x234fx1a){if(!_0x234fx1a){return _0x234fxa[_0x2c4e[84]](404)};return _0x234fxa[_0x2c4e[42]](_0x234fx1a);})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)})};exports[_0x2c4e[89]]=function(_0x234fx9,_0x234fxa,_0x234fxd){VoiceExtension[_0x2c4e[45]]({where:{appGroup:_0x234fx9[_0x2c4e[87]][_0x2c4e[107]]}})[_0x2c4e[44]](function(_0x234fx1b){return sequelize[_0x2c4e[109]](function(_0x234fx1c){return VoiceExtension[_0x2c4e[108]]({where:{appGroup:_0x234fx9[_0x2c4e[87]][_0x2c4e[107]]}},{transaction:_0x234fx1c})[_0x2c4e[44]](function(){var _0x234fx1d=2;_0x234fx9[_0x2c4e[87]][_0x2c4e[107]][_0x2c4e[66]](function(_0x234fx1e){var _0x234fx1f=_[_0x2c4e[92]](_0x234fx1b,function(_0x234fx20){return (_0x234fx20[_0x2c4e[90]]==_0x234fx1e&&_0x234fx20[_0x2c4e[91]]===true)});var _0x234fx21=_[_0x2c4e[93]](Applications[_0x234fx1f[_0x2c4e[49]]]);if(!_0x234fx21||_0x234fx1f[_0x2c4e[94]]){_0x234fx21=[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[36],appdata:_0x2c4e[32],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[37]}]};var _0x234fx22=util[_0x2c4e[61]](_0x2c4e[95],_0x234fx1f[_0x2c4e[47]],_0x234fx1f[_0x2c4e[48]],_0x234fx1d);_0x234fx1f[_0x2c4e[96]]=_0x234fx1f[_0x2c4e[96]]||_0x2c4e[97];var _0x234fx23=_[_0x2c4e[99]](_0x234fx1b,function(_0x234fx20){return (_0x234fx20[_0x2c4e[90]]==_0x234fx1e&&_0x234fx20[_0x2c4e[98]]===true)});if(_0x234fx23&&_0x234fx23[_0x2c4e[100]]>0){_0x234fx21[_0x2c4e[101]](0,1);_0x234fx23[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx21[_0x2c4e[105]]({app:_0x2c4e[102],appdata:_0x234fx20[_0x2c4e[96]]+_0x2c4e[103],IntervalId:_0x234fx20[_0x2c4e[104]]?_0x234fx20[_0x2c4e[104]]:null,isInterval:true,interval:_0x234fx20[_0x2c4e[96]]})});};_0x234fx1d=appCreate(_0x234fx21,_0x234fx1f,_0x234fx22,_0x234fx23||[],_0x234fx1d);return VoiceExtension[_0x2c4e[106]](_0x234fx21,{transaction:_0x234fx1c});});})})[_0x2c4e[44]](function(){return _0x234fxa[_0x2c4e[84]](201)})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)})})[_0x2c4e[41]](function(_0x234fxb){return _0x234fxd(_0x234fxb)})};exports[_0x2c4e[110]]=function(_0x234fx9,_0x234fxa,_0x234fxd){var _0x234fx21;var _0x234fx22;var _0x234fx25;VoiceExtension[_0x2c4e[116]](_0x2c4e[112],{where:{VoiceExtensionId:_0x234fx9[_0x2c4e[87]][_0x2c4e[111]]}})[_0x2c4e[44]](function(_0x234fx26){if(_0x234fx9[_0x2c4e[87]][_0x2c4e[111]]){_0x234fx9[_0x2c4e[87]][_0x2c4e[112]]=_0x234fx26?++_0x234fx26:2;_0x234fx21=_[_0x2c4e[93]](Applications[_0x234fx9[_0x2c4e[87]][_0x2c4e[49]]]);if(!_0x234fx21||_0x234fx9[_0x2c4e[87]][_0x2c4e[94]]){_0x234fx21=[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[36],appdata:_0x2c4e[32],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[37]}]};_0x234fx22=util[_0x2c4e[61]](_0x2c4e[95],_0x234fx9[_0x2c4e[87]][_0x2c4e[47]],_0x234fx9[_0x2c4e[87]][_0x2c4e[48]],_0x234fx9[_0x2c4e[87]][_0x2c4e[112]]);_0x234fx9[_0x2c4e[87]][_0x2c4e[96]]=_0x234fx9[_0x2c4e[87]][_0x2c4e[96]]||_0x2c4e[97];Interval[_0x2c4e[45]]({where:{IntervalId:(_0x234fx9[_0x2c4e[87]][_0x2c4e[104]]!==null)?_0x234fx9[_0x2c4e[87]][_0x2c4e[104]]:0}})[_0x2c4e[44]](function(_0x234fx27){var _0x234fx28=[];var _0x234fx29;if(_0x234fx27&&_0x234fx27[_0x2c4e[100]]>0){_0x234fx21[_0x2c4e[101]](0,1);_0x234fx28=_[_0x2c4e[114]](_0x234fx27,_0x2c4e[113]);_0x234fx28[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx21[_0x2c4e[105]]({app:_0x2c4e[102],appdata:_0x234fx20[_0x2c4e[96]]+_0x2c4e[103],IntervalId:_0x234fx20[_0x2c4e[82]],interval:_0x234fx29,isInterval:true})});};appCreate(_0x234fx21,_0x234fx9[_0x2c4e[87]],_0x234fx22,_0x234fx28);VoiceExtension[_0x2c4e[106]](_0x234fx21)[_0x2c4e[44]](function(_0x234fx2a){return _0x234fxa[_0x2c4e[43]](201)[_0x2c4e[42]](_0x234fx2a)});});}else {VoiceExtension[_0x2c4e[45]]({where:{exten:_0x234fx9[_0x2c4e[87]][_0x2c4e[48]],context:_0x234fx9[_0x2c4e[87]][_0x2c4e[47]],type:_0x234fx9[_0x2c4e[87]][_0x2c4e[88]]}})[_0x2c4e[44]](function(_0x234fx2b){if(!_0x234fx2b){return _0x234fxa[_0x2c4e[84]](404)};if(_0x234fx2b[_0x2c4e[100]]>0){return _0x234fxa[_0x2c4e[43]](500)[_0x2c4e[42]]({message:_0x2c4e[115]})};_0x234fx9[_0x2c4e[87]][_0x2c4e[112]]=1;VoiceExtension[_0x2c4e[110]](_0x234fx9[_0x2c4e[87]])[_0x2c4e[44]](function(_0x234fx2a){return _0x234fxa[_0x2c4e[43]](201)[_0x2c4e[42]](_0x234fx2a)})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)});})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)})}})[_0x2c4e[41]](function(_0x234fxb){_0x234fxd(_0x234fxb)});};function appCreate(_0x234fx21,_0x234fx2d,_0x234fx22,_0x234fx28,_0x234fx1d){var _0x234fx2e=_0x234fx28[_0x2c4e[100]];if(_0x234fx2d[_0x2c4e[94]]){_0x234fx2d[_0x2c4e[49]]=_0x2c4e[36]};switch(_0x234fx2d[_0x2c4e[49]]){case _0x2c4e[13]:if(!_0x234fx2d[_0x2c4e[117]]){_[_0x2c4e[118]](_0x234fx21,{app:_0x2c4e[11]})};_0x234fx21[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx20[_0x2c4e[48]]=_0x234fx2d[_0x2c4e[48]];_0x234fx20[_0x2c4e[88]]=_0x234fx2d[_0x2c4e[88]];_0x234fx20[_0x2c4e[47]]=_0x234fx2d[_0x2c4e[47]];_0x234fx20[_0x2c4e[111]]=_0x234fx2d[_0x2c4e[111]];_0x234fx20[_0x2c4e[112]]=_0x234fx1d?_0x234fx1d++:_0x234fx2d[_0x2c4e[112]]++;_0x234fx20[_0x2c4e[90]]=_0x234fx22;switch(_0x234fx20[_0x2c4e[49]]){case _0x2c4e[9]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[104]]?_0x2c4e[97]:_0x234fx2d[_0x2c4e[96]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+1,_0x234fx20[_0x2c4e[47]],(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[102]:_0x234fx20[_0x2c4e[49]]=_0x2c4e[9];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+_0x234fx2e-_0x234fx24,_0x234fx20[_0x2c4e[47]],(_0x234fx24+1)<_0x234fx2e?(_0x234fx20[_0x2c4e[112]]+1):(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[13]:if(_0x234fx2d[_0x2c4e[88]]===_0x2c4e[119]){_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[120]]=_0x234fx2d[_0x2c4e[120]];_0x234fx20[_0x2c4e[121]]=_0x234fx2d[_0x2c4e[121]];_0x234fx20[_0x2c4e[122]]=_0x234fx2d[_0x2c4e[122]]||0;_0x234fx20[_0x2c4e[117]]=_0x234fx2d[_0x2c4e[117]]||null;}else {_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[123]]=_0x234fx2d[_0x2c4e[123]];_0x234fx20[_0x2c4e[124]]=_0x234fx2d[_0x2c4e[124]]||_0x2c4e[18];_0x234fx20[_0x2c4e[125]]=_0x234fx2d[_0x2c4e[125]]||_0x2c4e[18];_0x234fx20[_0x2c4e[126]]=_0x234fx2d[_0x2c4e[126]]||_0x2c4e[18];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[123]],_0x234fx20[_0x2c4e[125]],_0x234fx20[_0x2c4e[124]]?_0x234fx20[_0x2c4e[124]][_0x2c4e[128]](_0x2c4e[127],_0x2c4e[18]):_0x2c4e[18],_0x234fx20[_0x2c4e[126]]);};break ;;case _0x2c4e[11]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[117]]);break ;;case _0x2c4e[15]:if(_0x234fx2d[_0x2c4e[88]]===_0x2c4e[119]){_0x234fx20[_0x2c4e[50]]=_0x2c4e[129]};break ;;default:;};});break ;;case _0x2c4e[19]:_0x234fx21[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx20[_0x2c4e[48]]=_0x234fx2d[_0x2c4e[48]];_0x234fx20[_0x2c4e[88]]=_0x234fx2d[_0x2c4e[88]];_0x234fx20[_0x2c4e[47]]=_0x234fx2d[_0x2c4e[47]];_0x234fx20[_0x2c4e[111]]=_0x234fx2d[_0x2c4e[111]];_0x234fx20[_0x2c4e[112]]=_0x234fx1d?_0x234fx1d++:_0x234fx2d[_0x2c4e[112]]++;_0x234fx20[_0x2c4e[90]]=_0x234fx22;switch(_0x234fx20[_0x2c4e[49]]){case _0x2c4e[9]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[104]]?_0x2c4e[97]:_0x234fx2d[_0x2c4e[96]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+1,_0x234fx20[_0x2c4e[47]],(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[102]:_0x234fx20[_0x2c4e[49]]=_0x2c4e[9];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+_0x234fx2e-_0x234fx24,_0x234fx20[_0x2c4e[47]],(_0x234fx24+1)<_0x234fx2e?(_0x234fx20[_0x2c4e[112]]+1):(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[19]:_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[124]]=_0x234fx2d[_0x2c4e[124]]||_0x2c4e[18];_0x234fx20[_0x2c4e[130]]=_0x234fx2d[_0x2c4e[130]]||_0x2c4e[18];_0x234fx20[_0x2c4e[131]]=_0x234fx2d[_0x2c4e[131]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[123]]=_0x234fx2d[_0x2c4e[123]];_0x234fx20[_0x2c4e[124]]=_0x234fx2d[_0x2c4e[124]];_0x234fx20[_0x2c4e[125]]=_0x234fx2d[_0x2c4e[125]]||_0x2c4e[18];_0x234fx20[_0x2c4e[126]]=_0x234fx2d[_0x2c4e[126]]||_0x2c4e[18];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[131]],_0x234fx20[_0x2c4e[124]]?_0x234fx20[_0x2c4e[124]][_0x2c4e[128]](_0x2c4e[127],_0x2c4e[18]):_0x2c4e[18],_0x234fx20[_0x2c4e[126]],_0x234fx20[_0x2c4e[130]],_0x234fx20[_0x2c4e[125]]);break ;;default:;};});break ;;case _0x2c4e[22]:_0x234fx21[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx20[_0x2c4e[48]]=_0x234fx2d[_0x2c4e[48]];_0x234fx20[_0x2c4e[88]]=_0x234fx2d[_0x2c4e[88]];_0x234fx20[_0x2c4e[47]]=_0x234fx2d[_0x2c4e[47]];_0x234fx20[_0x2c4e[111]]=_0x234fx2d[_0x2c4e[111]];_0x234fx20[_0x2c4e[112]]=_0x234fx1d?_0x234fx1d++:_0x234fx2d[_0x2c4e[112]]++;_0x234fx20[_0x2c4e[90]]=_0x234fx22;switch(_0x234fx20[_0x2c4e[49]]){case _0x2c4e[9]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[104]]?_0x2c4e[97]:_0x234fx2d[_0x2c4e[96]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+1,_0x234fx20[_0x2c4e[47]],(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[102]:_0x234fx20[_0x2c4e[49]]=_0x2c4e[9];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+_0x234fx2e-_0x234fx24,_0x234fx20[_0x2c4e[47]],(_0x234fx24+1)<_0x234fx2e?(_0x234fx20[_0x2c4e[112]]+1):(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[22]:_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[130]]=_0x234fx2d[_0x2c4e[130]]||_0x2c4e[18];_0x234fx20[_0x2c4e[124]]=_0x234fx2d[_0x2c4e[124]]||_0x2c4e[18];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[130]],_0x234fx20[_0x2c4e[124]]?_0x234fx20[_0x2c4e[124]][_0x2c4e[128]](_0x2c4e[127],_0x2c4e[18]):_0x2c4e[18]);break ;;default:;};});break ;;case _0x2c4e[25]:_0x234fx21[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx20[_0x2c4e[48]]=_0x234fx2d[_0x2c4e[48]];_0x234fx20[_0x2c4e[88]]=_0x234fx2d[_0x2c4e[88]];_0x234fx20[_0x2c4e[47]]=_0x234fx2d[_0x2c4e[47]];_0x234fx20[_0x2c4e[111]]=_0x234fx2d[_0x2c4e[111]];_0x234fx20[_0x2c4e[112]]=_0x234fx1d?_0x234fx1d++:_0x234fx2d[_0x2c4e[112]]++;_0x234fx20[_0x2c4e[90]]=_0x234fx22;switch(_0x234fx20[_0x2c4e[49]]){case _0x2c4e[9]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[104]]?_0x2c4e[97]:_0x234fx2d[_0x2c4e[96]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+1,_0x234fx20[_0x2c4e[47]],(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[102]:_0x234fx20[_0x2c4e[49]]=_0x2c4e[9];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+_0x234fx2e-_0x234fx24,_0x234fx20[_0x2c4e[47]],(_0x234fx24+1)<_0x234fx2e?(_0x234fx20[_0x2c4e[112]]+1):(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[25]:_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[132]]=_0x234fx2d[_0x2c4e[132]];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[132]]);break ;;default:;};});break ;;case _0x2c4e[28]:_0x234fx21[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx20[_0x2c4e[48]]=_0x234fx2d[_0x2c4e[48]];_0x234fx20[_0x2c4e[88]]=_0x234fx2d[_0x2c4e[88]];_0x234fx20[_0x2c4e[47]]=_0x234fx2d[_0x2c4e[47]];_0x234fx20[_0x2c4e[111]]=_0x234fx2d[_0x2c4e[111]];_0x234fx20[_0x2c4e[112]]=_0x234fx1d?_0x234fx1d++:_0x234fx2d[_0x2c4e[112]]++;_0x234fx20[_0x2c4e[90]]=_0x234fx22;switch(_0x234fx20[_0x2c4e[49]]){case _0x2c4e[9]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[104]]?_0x2c4e[97]:_0x234fx2d[_0x2c4e[96]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+1,_0x234fx20[_0x2c4e[47]],(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[102]:_0x234fx20[_0x2c4e[49]]=_0x2c4e[9];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+_0x234fx2e-_0x234fx24,_0x234fx20[_0x2c4e[47]],(_0x234fx24+1)<_0x234fx2e?(_0x234fx20[_0x2c4e[112]]+1):(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[28]:_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[133]]=_0x234fx2d[_0x2c4e[133]];_0x234fx20[_0x2c4e[134]]=_0x234fx2d[_0x2c4e[134]];_0x234fx20[_0x2c4e[135]]=_0x234fx2d[_0x2c4e[135]];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[135]],_0x234fx20[_0x2c4e[134]],_0x234fx20[_0x2c4e[133]]);break ;;default:;};});break ;;case _0x2c4e[31]:_0x234fx21[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx20[_0x2c4e[48]]=_0x234fx2d[_0x2c4e[48]];_0x234fx20[_0x2c4e[88]]=_0x234fx2d[_0x2c4e[88]];_0x234fx20[_0x2c4e[47]]=_0x234fx2d[_0x2c4e[47]];_0x234fx20[_0x2c4e[111]]=_0x234fx2d[_0x2c4e[111]];_0x234fx20[_0x2c4e[112]]=_0x234fx1d?_0x234fx1d++:_0x234fx2d[_0x2c4e[112]]++;_0x234fx20[_0x2c4e[90]]=_0x234fx22;switch(_0x234fx20[_0x2c4e[49]]){case _0x2c4e[9]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[104]]?_0x2c4e[97]:_0x234fx2d[_0x2c4e[96]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+1,_0x234fx20[_0x2c4e[47]],(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[102]:_0x234fx20[_0x2c4e[49]]=_0x2c4e[9];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+_0x234fx2e-_0x234fx24,_0x234fx20[_0x2c4e[47]],(_0x234fx24+1)<_0x234fx2e?(_0x234fx20[_0x2c4e[112]]+1):(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[31]:_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[136]]=_0x234fx2d[_0x2c4e[136]];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[136]]);break ;;default:;};});break ;;case _0x2c4e[11]:_0x234fx21[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx20[_0x2c4e[48]]=_0x234fx2d[_0x2c4e[48]];_0x234fx20[_0x2c4e[88]]=_0x234fx2d[_0x2c4e[88]];_0x234fx20[_0x2c4e[47]]=_0x234fx2d[_0x2c4e[47]];_0x234fx20[_0x2c4e[111]]=_0x234fx2d[_0x2c4e[111]];_0x234fx20[_0x2c4e[112]]=_0x234fx1d?_0x234fx1d++:_0x234fx2d[_0x2c4e[112]]++;_0x234fx20[_0x2c4e[90]]=_0x234fx22;switch(_0x234fx20[_0x2c4e[49]]){case _0x2c4e[9]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[104]]?_0x2c4e[97]:_0x234fx2d[_0x2c4e[96]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+1,_0x234fx20[_0x2c4e[47]],(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[102]:_0x234fx20[_0x2c4e[49]]=_0x2c4e[9];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+_0x234fx2e-_0x234fx24,_0x234fx20[_0x2c4e[47]],(_0x234fx24+1)<_0x234fx2e?(_0x234fx20[_0x2c4e[112]]+1):(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[11]:_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[137]]=_0x234fx2d[_0x2c4e[137]];_0x234fx20[_0x2c4e[138]]=_0x234fx2d[_0x2c4e[138]];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[137]],_0x234fx20[_0x2c4e[138]]);break ;;default:;};});break ;;case _0x2c4e[36]:_0x234fx21[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx20[_0x2c4e[48]]=_0x234fx2d[_0x2c4e[48]];_0x234fx20[_0x2c4e[88]]=_0x234fx2d[_0x2c4e[88]];_0x234fx20[_0x2c4e[47]]=_0x234fx2d[_0x2c4e[47]];_0x234fx20[_0x2c4e[111]]=_0x234fx2d[_0x2c4e[111]];_0x234fx20[_0x2c4e[112]]=_0x234fx1d?_0x234fx1d++:_0x234fx2d[_0x2c4e[112]]++;_0x234fx20[_0x2c4e[90]]=_0x234fx22;switch(_0x234fx20[_0x2c4e[49]]){case _0x2c4e[9]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[104]]?_0x2c4e[97]:_0x234fx2d[_0x2c4e[96]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+1,_0x234fx20[_0x2c4e[47]],(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[102]:_0x234fx20[_0x2c4e[49]]=_0x2c4e[9];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+_0x234fx2e-_0x234fx24,_0x234fx20[_0x2c4e[47]],(_0x234fx24+1)<_0x234fx2e?(_0x234fx20[_0x2c4e[112]]+1):(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[36]:_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[49]]=_0x234fx20[_0x2c4e[94]]=_0x234fx2d[_0x2c4e[94]];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[50]]);break ;;default:;};});break ;;case _0x2c4e[38]:_0x234fx21[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx20[_0x2c4e[48]]=_0x234fx2d[_0x2c4e[48]];_0x234fx20[_0x2c4e[88]]=_0x234fx2d[_0x2c4e[88]];_0x234fx20[_0x2c4e[47]]=_0x234fx2d[_0x2c4e[47]];_0x234fx20[_0x2c4e[111]]=_0x234fx2d[_0x2c4e[111]];_0x234fx20[_0x2c4e[112]]=_0x234fx1d?_0x234fx1d++:_0x234fx2d[_0x2c4e[112]]++;_0x234fx20[_0x2c4e[90]]=_0x234fx22;switch(_0x234fx20[_0x2c4e[49]]){case _0x2c4e[9]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[104]]?_0x2c4e[97]:_0x234fx2d[_0x2c4e[96]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+1,_0x234fx20[_0x2c4e[47]],(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[102]:_0x234fx20[_0x2c4e[49]]=_0x2c4e[9];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+_0x234fx2e-_0x234fx24,_0x234fx20[_0x2c4e[47]],(_0x234fx24+1)<_0x234fx2e?(_0x234fx20[_0x2c4e[112]]+1):(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[38]:_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[139]]=_0x234fx2d[_0x2c4e[139]];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[139]]);break ;;default:;};});break ;;default:_0x234fx21[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx20[_0x2c4e[48]]=_0x234fx2d[_0x2c4e[48]];_0x234fx20[_0x2c4e[88]]=_0x234fx2d[_0x2c4e[88]];_0x234fx20[_0x2c4e[47]]=_0x234fx2d[_0x2c4e[47]];_0x234fx20[_0x2c4e[111]]=_0x234fx2d[_0x2c4e[111]];_0x234fx20[_0x2c4e[112]]=_0x234fx1d?_0x234fx1d++:_0x234fx2d[_0x2c4e[112]]++;_0x234fx20[_0x2c4e[90]]=_0x234fx22;switch(_0x234fx20[_0x2c4e[49]]){case _0x2c4e[9]:_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[104]]?_0x2c4e[97]:_0x234fx2d[_0x2c4e[96]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+1,_0x234fx20[_0x2c4e[47]],(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[102]:_0x234fx20[_0x2c4e[49]]=_0x2c4e[9];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx20[_0x2c4e[47]],_0x234fx20[_0x2c4e[112]]+_0x234fx2e-_0x234fx24,_0x234fx20[_0x2c4e[47]],(_0x234fx24+1)<_0x234fx2e?(_0x234fx20[_0x2c4e[112]]+1):(_0x234fx20[_0x2c4e[112]]+2));break ;;case _0x2c4e[36]:_0x234fx20[_0x2c4e[104]]=_0x234fx2d[_0x2c4e[104]];_0x234fx20[_0x2c4e[96]]=_0x234fx2d[_0x2c4e[96]];_0x234fx20[_0x2c4e[49]]=_0x234fx20[_0x2c4e[94]]=_0x234fx2d[_0x2c4e[94]];_0x234fx20[_0x2c4e[50]]=util[_0x2c4e[61]](_0x234fx20[_0x2c4e[50]],_0x234fx2d[_0x2c4e[50]]);break ;;default:;};});;};if(_0x234fx1d){return _0x234fx1d};}exports[_0x2c4e[140]]=function(_0x234fx9,_0x234fxa){VoiceExtension[_0x2c4e[45]]({where:{exten:_0x234fx9[_0x2c4e[87]][_0x2c4e[48]],context:_0x234fx9[_0x2c4e[87]][_0x2c4e[47]],type:_0x234fx9[_0x2c4e[87]][_0x2c4e[88]],VoiceExtensionId:null,id:{$ne:_0x234fx9[_0x2c4e[87]][_0x2c4e[82]]}}})[_0x2c4e[44]](function(_0x234fx2b){if(!_0x234fx2b){return _0x234fxa[_0x2c4e[84]](404)};if(_0x234fx2b[_0x2c4e[100]]>0){return _0x234fxa[_0x2c4e[43]](500)[_0x2c4e[42]]({message:_0x2c4e[115]})};if(_0x234fx9[_0x2c4e[87]][_0x2c4e[82]]){delete _0x234fx9[_0x2c4e[87]][_0x2c4e[82]]};VoiceExtension[_0x2c4e[92]]({where:{id:_0x234fx9[_0x2c4e[55]][_0x2c4e[82]]}})[_0x2c4e[44]](function(_0x234fx1a){if(!_0x234fx1a){return _0x234fxa[_0x2c4e[84]](404)};var _0x234fx2f=_[_0x2c4e[141]](_0x234fx1a,_0x234fx9[_0x2c4e[87]]);return sequelize[_0x2c4e[109]](function(_0x234fx1c){return _0x234fx2f[_0x2c4e[142]]({transaction:_0x234fx1c})[_0x2c4e[44]](function(_0x234fx30){VoiceExtension[_0x2c4e[45]]({where:{VoiceExtensionId:_0x234fx30[_0x2c4e[82]],isApp:true}})[_0x2c4e[44]](function(_0x234fx2a){return VoiceExtension[_0x2c4e[108]]({where:{VoiceExtensionId:_0x234fx30[_0x2c4e[82]]}},{transaction:_0x234fx1c})[_0x2c4e[44]](function(){_0x234fx2a=_[_0x2c4e[114]](_0x234fx2a,_0x2c4e[113]);var _0x234fx31=_[_0x2c4e[99]](_[_0x2c4e[114]](_0x234fx2a,_0x2c4e[104]),function(_0x234fx20){return _0x234fx20!==null});Interval[_0x2c4e[45]]({where:{IntervalId:_0x234fx31}})[_0x2c4e[44]](function(_0x234fx28){var _0x234fx1d=2;var _0x234fx25;_0x234fx2a[_0x2c4e[66]](function(_0x234fx1f){var _0x234fx21=_[_0x2c4e[93]](Applications[_0x234fx1f[_0x2c4e[49]]]);if(!_0x234fx21||_0x234fx1f[_0x2c4e[94]]){_0x234fx21=[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[36],appdata:_0x2c4e[32],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[37]}]};_0x234fx1f[_0x2c4e[47]]=_0x234fx30[_0x2c4e[47]];_0x234fx1f[_0x2c4e[48]]=_0x234fx30[_0x2c4e[48]];var _0x234fx22=util[_0x2c4e[61]](_0x2c4e[95],_0x234fx1f[_0x2c4e[47]],_0x234fx1f[_0x2c4e[48]],_0x234fx1d);_0x234fx1f[_0x2c4e[96]]=_0x234fx1f[_0x2c4e[96]]||_0x2c4e[97];var _0x234fx23=_[_0x2c4e[99]](_0x234fx28,function(_0x234fx20){return (_0x234fx20[_0x2c4e[104]]==_0x234fx1f[_0x2c4e[104]])});if(_0x234fx23&&_0x234fx23[_0x2c4e[100]]>0){_0x234fx21[_0x2c4e[101]](0,1);_0x234fx23[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx21[_0x2c4e[105]]({app:_0x2c4e[102],appdata:_0x234fx20[_0x2c4e[96]]+_0x2c4e[103],IntervalId:_0x234fx20[_0x2c4e[82]],isInterval:true,interval:_0x234fx20[_0x2c4e[96]]})});};_0x234fx1d=appCreate(_0x234fx21,_0x234fx1f,_0x234fx22,_0x234fx23||[],_0x234fx1d);VoiceExtension[_0x2c4e[106]](_0x234fx21);});return _0x234fxa[_0x2c4e[84]](200);});})})})})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)});})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)});})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)})};exports[_0x2c4e[143]]=function(_0x234fx9,_0x234fxa,_0x234fxd){var _0x234fx25;if(_0x234fx9[_0x2c4e[87]][_0x2c4e[50]]){delete _0x234fx9[_0x2c4e[87]][_0x2c4e[50]]};VoiceExtension[_0x2c4e[85]](_0x234fx9[_0x2c4e[87]][_0x2c4e[82]])[_0x2c4e[44]](function(_0x234fx32){if(!_0x234fx32){return _0x234fxa[_0x2c4e[84]](404)};delete _0x234fx9[_0x2c4e[87]][_0x2c4e[82]];var _0x234fx2f=_[_0x2c4e[141]](_0x234fx32,_0x234fx9[_0x2c4e[87]]);return sequelize[_0x2c4e[109]](function(_0x234fx1c){return _0x234fx2f[_0x2c4e[142]]({transaction:_0x234fx1c})[_0x2c4e[44]](function(){VoiceExtension[_0x2c4e[45]]({where:{VoiceExtensionId:_0x234fx9[_0x2c4e[87]][_0x2c4e[111]],isApp:true}})[_0x2c4e[44]](function(_0x234fx2a){return VoiceExtension[_0x2c4e[108]]({where:{VoiceExtensionId:_0x234fx9[_0x2c4e[87]][_0x2c4e[111]]}},{transaction:_0x234fx1c})[_0x2c4e[44]](function(){_0x234fx2a=_[_0x2c4e[114]](_0x234fx2a,_0x2c4e[113]);var _0x234fx31=_[_0x2c4e[99]](_[_0x2c4e[114]](_0x234fx2a,_0x2c4e[104]),function(_0x234fx20){return _0x234fx20!==null});return Interval[_0x2c4e[45]]({where:{IntervalId:_0x234fx31}})[_0x2c4e[44]](function(_0x234fx28){var _0x234fx1d=2;var _0x234fx25;_0x234fx2a[_0x2c4e[66]](function(_0x234fx1f){var _0x234fx21=_[_0x2c4e[93]](Applications[_0x234fx1f[_0x2c4e[49]]]);if(!_0x234fx21||_0x234fx1f[_0x2c4e[94]]){_0x234fx21=[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[36],appdata:_0x2c4e[32],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[37]}]};var _0x234fx22=util[_0x2c4e[61]](_0x2c4e[95],_0x234fx1f[_0x2c4e[47]],_0x234fx1f[_0x2c4e[48]],_0x234fx1d);_0x234fx1f[_0x2c4e[96]]=_0x234fx1f[_0x2c4e[96]]||_0x2c4e[97];var _0x234fx23=_[_0x2c4e[99]](_0x234fx28,function(_0x234fx20){return (_0x234fx20[_0x2c4e[104]]==_0x234fx1f[_0x2c4e[104]])});if(_0x234fx23&&_0x234fx23[_0x2c4e[100]]>0){_0x234fx21[_0x2c4e[101]](0,1);_0x234fx23[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx21[_0x2c4e[105]]({app:_0x2c4e[102],appdata:_0x234fx20[_0x2c4e[96]]+_0x2c4e[103],IntervalId:_0x234fx20[_0x2c4e[82]],isInterval:true,interval:_0x234fx20[_0x2c4e[96]]})});};_0x234fx1d=appCreate(_0x234fx21,_0x234fx1f,_0x234fx22,_0x234fx23||[],_0x234fx1d);VoiceExtension[_0x2c4e[106]](_0x234fx21);});});})})})})[_0x2c4e[44]](function(_0x234fx16){return _0x234fxa[_0x2c4e[43]](201)[_0x2c4e[42]](_0x234fx16)})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)});})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)});};exports[_0x2c4e[108]]=function(_0x234fx9,_0x234fxa,_0x234fxd){VoiceExtension[_0x2c4e[85]](_0x234fx9[_0x2c4e[55]][_0x2c4e[82]])[_0x2c4e[44]](function(_0x234fx1a){if(!_0x234fx1a){return _0x234fxa[_0x2c4e[84]](404)};if(!_0x234fx1a[_0x2c4e[111]]){_0x234fx1a[_0x2c4e[108]]()[_0x2c4e[44]](function(){return _0x234fxa[_0x2c4e[84]](204)})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)})}else {VoiceExtension[_0x2c4e[45]]({where:{appGroup:_0x234fx1a[_0x2c4e[90]]}})[_0x2c4e[44]](function(_0x234fxc){if(!_0x234fxc){return _0x234fxa[_0x2c4e[84]](404)};return sequelize[_0x2c4e[109]](function(_0x234fx1c){return VoiceExtension[_0x2c4e[108]]({where:{appGroup:_0x234fx1a[_0x2c4e[90]]}},{transaction:_0x234fx1c})[_0x2c4e[44]](function(_0x234fx33){return VoiceExtension[_0x2c4e[45]]({where:{VoiceExtensionId:_0x234fx1a[_0x2c4e[111]],priority:{$gt:_0x234fxc[_0x234fx33-1][_0x2c4e[112]]}}})[_0x2c4e[44]](function(_0x234fx1b){return VoiceExtension[_0x2c4e[108]]({where:{VoiceExtensionId:_0x234fx1a[_0x2c4e[111]],priority:{$gt:_0x234fxc[_0x234fx33-1][_0x2c4e[112]]}}},{transaction:_0x234fx1c})[_0x2c4e[44]](function(){var _0x234fx34=_[_0x2c4e[114]](_[_0x2c4e[99]](_[_0x2c4e[114]](_0x234fx1b,_0x2c4e[113]),function(_0x234fx20){return _0x234fx20[_0x2c4e[91]]===true}),_0x2c4e[90]);var _0x234fx1d=_0x234fxc[0][_0x2c4e[112]];_0x234fx34[_0x2c4e[66]](function(_0x234fx1e){var _0x234fx1f=_[_0x2c4e[92]](_0x234fx1b,function(_0x234fx20){return (_0x234fx20[_0x2c4e[90]]==_0x234fx1e&&_0x234fx20[_0x2c4e[91]]===true)});var _0x234fx21=_[_0x2c4e[93]](Applications[_0x234fx1f[_0x2c4e[49]]]);if(!_0x234fx21||_0x234fx1f[_0x2c4e[94]]){_0x234fx21=[{app:_0x2c4e[9],appdata:_0x2c4e[10]},{app:_0x2c4e[36],appdata:_0x2c4e[32],isApp:true},{app:_0x2c4e[15],appdata:_0x2c4e[37]}]};var _0x234fx22=util[_0x2c4e[61]](_0x2c4e[95],_0x234fx1f[_0x2c4e[47]],_0x234fx1f[_0x2c4e[48]],_0x234fx1d);_0x234fx1f[_0x2c4e[96]]=_0x234fx1f[_0x2c4e[96]]||_0x2c4e[97];var _0x234fx23=_[_0x2c4e[99]](_0x234fx1b,function(_0x234fx20){return (_0x234fx20[_0x2c4e[90]]==_0x234fx1e&&_0x234fx20[_0x2c4e[98]]===true)});if(_0x234fx23&&_0x234fx23[_0x2c4e[100]]>0){_0x234fx21[_0x2c4e[101]](0,1);_0x234fx23[_0x2c4e[66]](function(_0x234fx20,_0x234fx24){_0x234fx21[_0x2c4e[105]]({app:_0x2c4e[102],appdata:_0x234fx20[_0x2c4e[96]]+_0x2c4e[103],IntervalId:_0x234fx20[_0x2c4e[104]]?_0x234fx20[_0x2c4e[104]]:null,isInterval:true,interval:_0x234fx20[_0x2c4e[96]]})});};_0x234fx1d=appCreate(_0x234fx21,_0x234fx1f,_0x234fx22,_0x234fx23||[],_0x234fx1d);VoiceExtension[_0x2c4e[106]](_0x234fx21);});})})})})[_0x2c4e[44]](function(_0x234fx16){_0x234fxa[_0x2c4e[84]](201)})[_0x2c4e[41]](function(_0x234fxb){return _0x234fxd(_0x234fxb)});})};})[_0x2c4e[41]](function(_0x234fxb){return _0x234fxd(_0x234fxb)})};exports[_0x2c4e[144]]=function(_0x234fx9,_0x234fxa){VoiceExtension[_0x2c4e[108]]({where:{id:_0x234fx9[_0x2c4e[52]][_0x2c4e[82]]},individualHooks:true})[_0x2c4e[44]](function(){return _0x234fxa[_0x2c4e[84]](204)})[_0x2c4e[41]](function(_0x234fxb){return handleError(_0x234fxa,_0x234fxb)})};function handleError(_0x234fxa,_0x234fxb){return _0x234fxa[_0x2c4e[43]](500)[_0x2c4e[42]](_0x234fxb)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var VoiceExtension = require('../../models').VoiceExtension;
+var Interval = require('../../models').Interval;
+var sequelize = require('../../models').sequelize;
+var Sequelize = require('../../models').Sequelize;
+var util = require('util');
+var async = require('async');
+
+var Applications = {
+  Dial: [{
+    app: 'GotoIfTime',
+    appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+  }, {
+    app: 'Set',
+    appdata: 'CALLERID(all)=%s'
+  }, {
+    app: 'Dial',
+    appdata: '%s,%s,%s,%s',
+    isApp: true
+  }, {
+    app: 'NoOp',
+    appdata: 'Dial Application End'
+  }],
+  Queue: [{
+    app: 'GotoIfTime',
+    appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+  }, {
+    app: 'Answer',
+    appdata: ''
+  }, {
+    app: 'Queue',
+    appdata: '%s,%s,%s,%s,%s',
+    isApp: true
+  }, {
+    app: 'NoOp',
+    appdata: 'Queue Application End'
+  }],
+  Playback: [{
+    app: 'GotoIfTime',
+    appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+  }, {
+    app: 'Playback',
+    appdata: '%s,%s',
+    isApp: true
+  }, {
+    app: 'NoOp',
+    appdata: 'Playback Application End'
+  }],
+  AGI: [{
+    app: 'GotoIfTime',
+    appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+  }, {
+    app: 'AGI',
+    appdata: 'agi://127.0.0.1/square,%s',
+    isApp: true
+  }, {
+    app: 'NoOp',
+    appdata: 'AGI Application End'
+  }],
+  Goto: [{
+    app: 'GotoIfTime',
+    appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+  }, {
+    app: 'Goto',
+    appdata: '%s,%s,%d',
+    isApp: true
+  }, {
+    app: 'NoOp',
+    appdata: 'Goto Application End'
+  }],
+  Hangup: [{
+    app: 'GotoIfTime',
+    appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+  }, {
+    app: 'Hangup',
+    appdata: '%s',
+    isApp: true
+  }, {
+    app: 'NoOp',
+    appdata: 'Hangup Application End'
+  }],
+  Set: [{
+    app: 'GotoIfTime',
+    appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+  }, {
+    app: 'Set',
+    appdata: '%s=%s',
+    isApp: true
+  }, {
+    app: 'NoOp',
+    appdata: 'Set Application End'
+  }],
+  custom: [{
+    app: 'GotoIfTime',
+    appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+  }, {
+    app: 'custom',
+    appdata: '%s',
+    isApp: true
+  }, {
+    app: 'NoOp',
+    appdata: 'Custom Application End'
+  }],
+  Voicemail: [{
+    app: 'GotoIfTime',
+    appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+  }, {
+    app: 'Voicemail',
+    appdata: '%s',
+    isApp: true
+  }, {
+    app: 'NoOp',
+    appdata: 'Voicemail Application End'
+  }]
+};
+
+// Get list of voice_extensions
+exports.index = function(req, res) {
+  VoiceExtension
+    .findAll()
+    .then(function(voice_extensions) {
+      return res.status(200).send(voice_extensions);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get list of agents
+exports.showByRoute = function(req, res, next) {
+
+  var attributes = ['context', 'exten', 'app', 'appdata'];
+  var per_page = req.query.per_page ? parseInt(req.query.per_page, 10) : 100;
+  var page = req.query.page ? parseInt(req.query.page, 10) : 0;
+
+  var query = {
+    where: {
+      type: req.params.route,
+      VoiceExtensionId: null,
+      app: 'NoOp'
+    },
+    limit: per_page,
+    offset: page * per_page
+  };
+
+  _.forIn(req.query, function(value, key) {
+    switch (key) {
+      case 'per_page':
+      case 'page':
+        break;
+      case 'sort_by':
+        query.order = util.format('%s %s', req.query.sort_by, req.query.sort_order || 'ASC') || null;
+        break;
+      case 'sort_order':
+        break;
+      case '$':
+        query.where.$or = [];
+        attributes.forEach(function(attribute) {
+          var tmp = {};
+          tmp[attribute] = {
+            $like: '%' + value + '%'
+          };
+
+          query.where.$or.push(tmp);
+        });
+        break;
+      default:
+        query.where[key] = {
+          $like: {}
+        };
+        query.where[key].$like = '%' + value + '%';
+    }
+  });
+
+  VoiceExtension
+    .findAndCountAll(query)
+    .then(function(result) {
+
+      var total_pages = Math.ceil(result.count / per_page);
+      var next_page = total_pages > (query.offset + 1) ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page + 1) : null;
+      var previous_page = page > 0 ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page - 1) : null;
+
+      res.status(200).send({
+        count: result.count,
+        rows: result.rows,
+        next_page: next_page,
+        previous_page: previous_page,
+        total_pages: total_pages
+      });
+
+    })
+    .catch(function(err) {
+      res.status(500).send({
+        error: 'Something blew up!'
+      });
+    });
+};
+
+
+// Get list of voice_extensions by route
+exports.showAppsByRoute = function(req, res) {
+  VoiceExtension
+    .findAll({
+      where: {
+        VoiceExtensionId: req.params.id,
+        isApp: true
+      }
+    })
+    .then(function(voice_extensions) {
+      return res.status(200).send(voice_extensions);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single voice_extension or application
+exports.show = function(req, res) {
+  VoiceExtension
+    .findById(req.params.id)
+    .then(function(voice_extension) {
+      if (!voice_extension) {
+        return res.sendStatus(404);
+      }
+      return res.send(voice_extension);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Validate the existence of a route
+exports.routeValidation = function(req, res) {
+  VoiceExtension
+    .findAll({
+      where: {
+        exten: req.body.exten,
+        context: req.body.context,
+        type: req.body.type
+      }
+    })
+    .then(function(voice_extension) {
+      if (!voice_extension) {
+        return res.sendStatus(404);
+      }
+      return res.send(voice_extension);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// exports.sortAppsByRoute = function(req, res, next) {
+//   return sequelize
+//     .transaction()
+//     .then(function(t) {
+//       async.waterfall([
+//           function(callback) {
+//             VoiceExtension
+//               .findAll({
+//                 where: {
+//                   appGroup: req.body.applications
+//                 }
+//               })
+//               .then(function(voiceApplications) {
+//                 callback(null, voiceApplications);
+//               })
+//               .catch(function(err) {
+//                 callback(err);
+//               });
+//           },
+//           function(voiceApplications, callback) {
+//             console.log('found ad saved applications');
+//             console.log('destroying old applications from db');
+//             return VoiceExtension.destroy({
+//                 where: {
+//                   appGroup: req.body.applications
+//                 }
+//               }, {
+//                 transaction: t
+//               })
+//               .then(function() {
+//                 callback(null, voiceApplications);
+//               })
+//               .catch(function(err) {
+//                 callback(err);
+//               });
+//           },
+//           function(voiceApplications, callback) {
+//             console.log('destroyed old applications from db');
+//             var priority = 2;
+//             console.log('iterating sorted applications ids');
+//             req.body.applications.forEach(function(sortedElem) {
+//               var tmpElem = _.find(voiceApplications, function(elem) {
+//                 return (elem.appGroup == sortedElem && elem.isApp === true);
+//               });
+//               var application = _.cloneDeep(Applications[tmpElem.app]);
+//               if (!application || tmpElem.customApp) {
+//                 application = [{
+//                   app: 'GotoIfTime',
+//                   appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+//                 }, {
+//                   app: 'custom',
+//                   appdata: '%s',
+//                   isApp: true
+//                 }, {
+//                   app: 'NoOp',
+//                   appdata: 'Custom Application End'
+//                 }];
+//               }
+//               //console.log('PRIORITY');
+//               //console.log(priority);
+//               var appGroup = util.format('%s%s%s', tmpElem.context, tmpElem.exten, priority);
+//               tmpElem.interval = tmpElem.interval || '*,*,*,*';
+//               var tmpIntervals = _.filter(voiceApplications, function(elem) {
+//                 return (elem.appGroup == sortedElem && elem.isInterval === true);
+//               });
+//               if (tmpIntervals && tmpIntervals.length > 0) {
+//                 console.log('found custom interval, adding to app');
+//                 application.splice(0, 1);
+//                 tmpIntervals.forEach(function(elem, index) {
+//
+//                   application.unshift({
+//                     app: 'GotoIfTimeFromArray',
+//                     appdata: elem.interval + '?%s,${EXTEN},%s:%s,${EXTEN},%s',
+//                     IntervalId: elem.IntervalId ? elem.IntervalId : null,
+//                     isInterval: true,
+//                     interval: elem.interval,
+//                   });
+//                 })
+//               }
+//               priority = appCreate(application, tmpElem, appGroup, tmpIntervals || [], priority);
+//               //console.log('returned priority');
+//               //console.log(priority);
+//               console.log('creating group of extensions');
+//               return VoiceExtension
+//                 .bulkCreate(application, {
+//                   transaction: t
+//                 })
+//             });
+//             callback();
+//           }
+//         ],
+//         function(err, result) {
+//           if (err) {
+//             console.log(err);
+//             t.rollback();
+//           } else {
+//             console.log('commit');
+//             t.commit();
+//             console.log('finished creating, now searching the sorted and saved apps');
+//             VoiceExtension
+//               .findAll({
+//                 where: {
+//                   VoiceExtensionId: req.params.id,
+//                   isApp: true
+//                 }
+//               })
+//               .then(function(voiceExtensions) {
+//                 console.log('found sorted applications, returning');
+//                 //console.log(_.pluck(voiceExtensions, 'dataValues'));
+//                 return res.status(201).send(voiceExtensions);
+//               })
+//           }
+//         });
+//     });
+// }
+
+exports.sortAppsByRoute = function(req, res, next) {
+  // console.log('finding and saving old applications');
+  VoiceExtension
+    .findAll({
+      where: {
+        appGroup: req.body.applications
+      }
+    })
+    .then(function(voiceApplications) {
+      // console.log('found ad saved applications');
+      return sequelize.transaction(function(t) {
+          // console.log('destroying old applications from db');
+          return VoiceExtension.destroy({
+              where: {
+                appGroup: req.body.applications
+              }
+            }, {
+              transaction: t
+            })
+            .then(function() {
+              var priority = 2;
+              req.body.applications.forEach(function(sortedElem) {
+                var tmpElem = _.find(voiceApplications, function(elem) {
+                  return (elem.appGroup == sortedElem && elem.isApp === true);
+                });
+                var application = _.cloneDeep(Applications[tmpElem.app]);
+                if (!application || tmpElem.customApp) {
+                  application = [{
+                    app: 'GotoIfTime',
+                    appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+                  }, {
+                    app: 'custom',
+                    appdata: '%s',
+                    isApp: true
+                  }, {
+                    app: 'NoOp',
+                    appdata: 'Custom Application End'
+                  }];
+                }
+                var appGroup = util.format('%s%s%s', tmpElem.context, tmpElem.exten, priority);
+                tmpElem.interval = tmpElem.interval || '*,*,*,*';
+                var tmpIntervals = _.filter(voiceApplications, function(elem) {
+                  return (elem.appGroup == sortedElem && elem.isInterval === true);
+                });
+                if (tmpIntervals && tmpIntervals.length > 0) {
+                  // console.log('found custom interval, adding to app');
+                  application.splice(0, 1);
+                  tmpIntervals.forEach(function(elem, index) {
+
+                    application.unshift({
+                      app: 'GotoIfTimeFromArray',
+                      appdata: elem.interval + '?%s,${EXTEN},%s:%s,${EXTEN},%s',
+                      IntervalId: elem.IntervalId ? elem.IntervalId : null,
+                      isInterval: true,
+                      interval: elem.interval,
+                    });
+                  })
+                }
+                priority = appCreate(application, tmpElem, appGroup, tmpIntervals || [], priority);
+                //console.log('returned priority');
+                //console.log(priority);
+                // console.log('creating group of extensions');
+                return VoiceExtension
+                  .bulkCreate(application, {
+                    transaction: t
+                  })
+              });
+            })
+        })
+        .then(function() {
+          // console.log('finished creating, now searching the sorted and saved apps');
+          // VoiceExtension
+          //   .findAll({
+          //     where: {
+          //       VoiceExtensionId: req.params.id,
+          //       isApp: true
+          //     }
+          //   })
+          //   .then(function(voiceExtensions) {
+          //     console.log('found sorted applications, returning');
+          //     //console.log(_.pluck(voiceExtensions, 'dataValues'));
+          //     return res.status(201).send(voiceExtensions);
+          //   })
+          return res.sendStatus(201);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return next(err);
+    });
+};
+
+// // Creates a new voice_extension in the DB.
+// exports.create = function(req, res) {
+//   VoiceExtension
+//     .create(req.body)
+//     .then(function(voice_extension) {
+//       return res.status(201).send(voice_extension);
+//     })
+//     .catch(function(err) {
+//       return handleError(res, err);
+//     });
+// };
+
+// Creates a new voiceApplication in the DB.
+exports.create = function(req, res, next) {
+  // //console.log(req.body);
+  var application;
+  var appGroup;
+  var interval;
+  VoiceExtension
+    .max('priority', {
+      where: {
+        VoiceExtensionId: req.body.VoiceExtensionId
+      }
+    }).then(function(max) {
+      // SET PRIORITY
+      if (req.body.VoiceExtensionId) {
+        req.body.priority = max ? ++max : 2;
+        application = _.cloneDeep(Applications[req.body.app]);
+        if (!application || req.body.customApp) {
+          application = [{
+            app: 'GotoIfTime',
+            appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+          }, {
+            app: 'custom',
+            appdata: '%s',
+            isApp: true
+          }, {
+            app: 'NoOp',
+            appdata: 'Custom Application End'
+          }];
+        }
+        appGroup = util.format('%s%s%s', req.body.context, req.body.exten, req.body.priority);
+        // interval = createInterval(req.body);
+
+
+        req.body.interval = req.body.interval || '*,*,*,*';
+        Interval
+          .findAll({
+            where: {
+              IntervalId: (req.body.IntervalId !== null) ? req.body.IntervalId : 0
+            }
+          })
+          .then(function(Intervals) {
+            var intervals = [];
+            var gotoInterval;
+            if (Intervals && Intervals.length > 0) {
+              application.splice(0, 1);
+              intervals = _.pluck(Intervals, 'dataValues');
+              intervals.forEach(function(elem, index) {
+                // gotoInterval = createInterval(elem);
+                application.unshift({
+                  app: 'GotoIfTimeFromArray',
+                  appdata: elem.interval + '?%s,${EXTEN},%s:%s,${EXTEN},%s',
+                  IntervalId: elem.id,
+                  interval: gotoInterval,
+                  isInterval: true
+                });
+              })
+            }
+            appCreate(application, req.body, appGroup, intervals);
+            VoiceExtension
+              .bulkCreate(application)
+              .then(function(voiceExtensions) {
+                return res.status(201).send(voiceExtensions);
+              })
+          })
+      } else {
+        VoiceExtension
+          .findAll({
+            where: {
+              exten: req.body.exten,
+              context: req.body.context,
+              type: req.body.type,
+            }
+          })
+          .then(function(existingExtensions) {
+            //console.log(existingExtensions);
+            //console.log('Finding app row.....');
+            if (!existingExtensions) {
+              return res.sendStatus(404);
+            }
+            if (existingExtensions.length > 0) {
+              return res.status(500).send({
+                message: 'MESSAGE_EXIST_ROUTE'
+              });
+            }
+            req.body.priority = 1;
+            VoiceExtension
+              .create(req.body)
+              .then(function(voiceExtensions) {
+                return res.status(201).send(voiceExtensions);
+              })
+              .catch(function(err) {
+                return handleError(res, err);
+              })
+          })
+          .catch(function(err) {
+            return handleError(res, err);
+          });
+      }
+      // //console.log(application);
+
+    })
+    .catch(function(err) {
+      next(err);
+    });
+};
+
+// function createInterval(element) {
+//   var interval = [];
+//   if (element.t_from && element.t_from !== '') {
+//     interval[0] = element.t_from;
+//     if (element.t_to && element.t_to !== '') {
+//       interval[0] += '-' + element.t_to;
+//     }
+//   } else {
+//     interval[0] = '*';
+//   }
+//
+//   if (element.wd_from && element.wd_from !== '') {
+//     interval[1] = element.wd_from;
+//     if (element.wd_to && element.wd_to !== '') {
+//       interval[1] += '-' + element.wd_to;
+//     }
+//   } else {
+//     interval[1] = '*';
+//   }
+//
+//   if (element.md_from && element.md_from !== '') {
+//     interval[2] = element.md_from;
+//     if (element.md_to && element.md_to !== '') {
+//       interval[2] += '-' + element.md_to;
+//     }
+//   } else {
+//     interval[2] = '*';
+//   }
+//
+//   if (element.m_from && element.m_from !== '') {
+//     interval[3] = element.m_from;
+//     if (element.m_to && element.m_to !== '') {
+//       interval[3] += '-' + element.m_to;
+//     }
+//   } else {
+//     interval[3] = '*';
+//   }
+//
+//   return interval.join(',');
+// }
+
+function appCreate(application, element, appGroup, intervals, priority) {
+  var intLength = intervals.length;
+  if (element.customApp) {
+    element.app = 'custom'; //in questo modo posso rimuovere il default dello switch, ma lo lascio per completezza
+  }
+  switch (element.app) {
+    case 'Dial':
+      if (!element.callerID) {
+        _.remove(application, {
+          app: 'Set'
+        });
+      }
+      application.forEach(function(elem, index) {
+        elem.exten = element.exten;
+        elem.type = element.type;
+        elem.context = element.context;
+        elem.VoiceExtensionId = element.VoiceExtensionId;
+        elem.priority = priority ? priority++ : element.priority++;
+        elem.appGroup = appGroup;
+        switch (elem.app) {
+          case 'GotoIfTime':
+            elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
+            break;
+          case 'GotoIfTimeFromArray':
+            elem.app = 'GotoIfTime';
+            elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
+            break;
+          case 'Dial':
+            if (element.type === 'outbound') {
+              elem.IntervalId = element.IntervalId;
+              elem.interval = element.interval;
+              elem.trunk = element.trunk;
+              elem.TrunkId = element.TrunkId;
+              elem.cutdigits = element.cutdigits || 0;
+              elem.callerID = element.callerID || null;
+              // elem.appdata = util.format('SIP/${EXTEN:%d}@%s', elem.cutdigits, elem.trunk);
+            } else {
+              elem.IntervalId = element.IntervalId;
+              elem.interval = element.interval;
+              elem.interface = element.interface;
+              elem.app_options = element.app_options || '';
+              elem.timeout = element.timeout || '';
+              elem.url = element.url || '';
+              elem.appdata = util.format(elem.appdata, element.interface, elem.timeout, elem.app_options ? elem.app_options.replace(',', '') : '', elem.url);
+            }
+            break;
+          case 'Set':
+            elem.appdata = util.format(elem.appdata, element.callerID);
+            break;
+          case 'NoOp':
+            if (element.type === 'outbound') {
+              elem.appdata = 'Outbound Dial Application End';
+            }
+            break;
+          default:
+
+        }
+      });
+      break;
+    case 'Queue':
+      application.forEach(function(elem, index) {
+        elem.exten = element.exten;
+        elem.type = element.type;
+        elem.context = element.context;
+        elem.VoiceExtensionId = element.VoiceExtensionId;
+        elem.priority = priority ? priority++ : element.priority++;
+        elem.appGroup = appGroup;
+        switch (elem.app) {
+          case 'GotoIfTime':
+            elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
+            break;
+          case 'GotoIfTimeFromArray':
+            elem.app = 'GotoIfTime';
+            elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
+            break;
+          case 'Queue':
+            elem.IntervalId = element.IntervalId;
+            elem.app_options = element.app_options || '';
+            elem.audiofile = element.audiofile || '';
+            elem.queue = element.queue;
+            elem.interval = element.interval;
+            elem.interface = element.interface;
+            elem.app_options = element.app_options;
+            elem.timeout = element.timeout || '';
+            elem.url = element.url || '';
+            elem.appdata = util.format(elem.appdata, elem.queue, elem.app_options ? elem.app_options.replace(',', '') : '', elem.url, elem.audiofile, elem.timeout);
+            break;
+          default:
+
+        }
+      });
+      break;
+    case 'Playback':
+      application.forEach(function(elem, index) {
+        elem.exten = element.exten;
+        elem.type = element.type;
+        elem.context = element.context;
+        elem.VoiceExtensionId = element.VoiceExtensionId;
+        elem.priority = priority ? priority++ : element.priority++;
+        elem.appGroup = appGroup;
+        switch (elem.app) {
+          case 'GotoIfTime':
+            elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
+            break;
+          case 'GotoIfTimeFromArray':
+            elem.app = 'GotoIfTime';
+            elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
+            break;
+          case 'Playback':
+            elem.IntervalId = element.IntervalId;
+            elem.interval = element.interval;
+            elem.audiofile = element.audiofile || '';
+            elem.app_options = element.app_options || '';
+            elem.appdata = util.format(elem.appdata, elem.audiofile, elem.app_options ? elem.app_options.replace(',', '') : '');
+            break;
+          default:
+
+        }
+      });
+      break;
+    case 'AGI':
+      application.forEach(function(elem, index) {
+        elem.exten = element.exten;
+        elem.type = element.type;
+        elem.context = element.context;
+        elem.VoiceExtensionId = element.VoiceExtensionId;
+        elem.priority = priority ? priority++ : element.priority++;
+        elem.appGroup = appGroup;
+        switch (elem.app) {
+          case 'GotoIfTime':
+            elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
+            break;
+          case 'GotoIfTimeFromArray':
+            elem.app = 'GotoIfTime';
+            elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
+            break;
+          case 'AGI':
+            elem.IntervalId = element.IntervalId;
+            elem.interval = element.interval;
+            elem.project = element.project;
+            elem.appdata = util.format(elem.appdata, elem.project);
+            break;
+          default:
+
+        }
+      });
+      break;
+    case 'Goto':
+      application.forEach(function(elem, index) {
+        elem.exten = element.exten;
+        elem.type = element.type;
+        elem.context = element.context;
+        elem.VoiceExtensionId = element.VoiceExtensionId;
+        elem.priority = priority ? priority++ : element.priority++;
+        elem.appGroup = appGroup;
+        switch (elem.app) {
+          case 'GotoIfTime':
+            elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
+            break;
+          case 'GotoIfTimeFromArray':
+            elem.app = 'GotoIfTime';
+            elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
+            break;
+          case 'Goto':
+            elem.IntervalId = element.IntervalId;
+            elem.interval = element.interval;
+            elem.alt_priority = element.alt_priority;
+            elem.alt_extension = element.alt_extension;
+            elem.alt_context = element.alt_context;
+            elem.appdata = util.format(elem.appdata, elem.alt_context, elem.alt_extension, elem.alt_priority);
+            break;
+          default:
+
+        }
+      });
+      break;
+    case 'Hangup':
+      application.forEach(function(elem, index) {
+        elem.exten = element.exten;
+        elem.type = element.type;
+        elem.context = element.context;
+        elem.VoiceExtensionId = element.VoiceExtensionId;
+        elem.priority = priority ? priority++ : element.priority++;
+        elem.appGroup = appGroup;
+        switch (elem.app) {
+          case 'GotoIfTime':
+            elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
+            break;
+          case 'GotoIfTimeFromArray':
+            elem.app = 'GotoIfTime';
+            elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
+            break;
+          case 'Hangup':
+            elem.IntervalId = element.IntervalId;
+            elem.interval = element.interval;
+            elem.causecode = element.causecode;
+            elem.appdata = util.format(elem.appdata, elem.causecode);
+            break;
+          default:
+
+        }
+      });
+      break;
+    case 'Set':
+      application.forEach(function(elem, index) {
+        elem.exten = element.exten;
+        elem.type = element.type;
+        elem.context = element.context;
+        elem.VoiceExtensionId = element.VoiceExtensionId;
+        elem.priority = priority ? priority++ : element.priority++;
+        elem.appGroup = appGroup;
+        switch (elem.app) {
+          case 'GotoIfTime':
+            elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
+            break;
+          case 'GotoIfTimeFromArray':
+            elem.app = 'GotoIfTime';
+            elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
+            break;
+          case 'Set':
+            elem.IntervalId = element.IntervalId;
+            elem.interval = element.interval;
+            elem.variable = element.variable;
+            elem.value = element.value;
+            elem.appdata = util.format(elem.appdata, elem.variable, elem.value);
+            break;
+          default:
+
+        }
+      });
+      break;
+    case 'custom':
+      application.forEach(function(elem, index) {
+        elem.exten = element.exten;
+        elem.type = element.type;
+        elem.context = element.context;
+        elem.VoiceExtensionId = element.VoiceExtensionId;
+        elem.priority = priority ? priority++ : element.priority++;
+        elem.appGroup = appGroup;
+        switch (elem.app) {
+          case 'GotoIfTime':
+            elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
+            break;
+          case 'GotoIfTimeFromArray':
+            elem.app = 'GotoIfTime';
+            elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
+            break;
+          case 'custom':
+            elem.IntervalId = element.IntervalId;
+            elem.interval = element.interval;
+            elem.app = elem.customApp = element.customApp;
+            elem.appdata = util.format(elem.appdata, element.appdata);
+            break;
+          default:
+
+        }
+      });
+      break;
+    case 'Voicemail':
+      application.forEach(function(elem, index) {
+        elem.exten = element.exten;
+        elem.type = element.type;
+        elem.context = element.context;
+        elem.VoiceExtensionId = element.VoiceExtensionId;
+        elem.priority = priority ? priority++ : element.priority++;
+        elem.appGroup = appGroup;
+        switch (elem.app) {
+          case 'GotoIfTime':
+            elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
+            break;
+          case 'GotoIfTimeFromArray':
+            elem.app = 'GotoIfTime';
+            elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
+            break;
+          case 'Voicemail':
+            elem.IntervalId = element.IntervalId;
+            elem.interval = element.interval;
+            elem.mailbox = element.mailbox;
+            elem.appdata = util.format(elem.appdata, elem.mailbox);
+            break;
+          default:
+
+        }
+      });
+      break;
+    default:
+      application.forEach(function(elem, index) {
+        elem.exten = element.exten;
+        elem.type = element.type;
+        elem.context = element.context;
+        elem.VoiceExtensionId = element.VoiceExtensionId;
+        elem.priority = priority ? priority++ : element.priority++;
+        elem.appGroup = appGroup;
+        switch (elem.app) {
+          case 'GotoIfTime':
+            elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
+            break;
+          case 'GotoIfTimeFromArray':
+            elem.app = 'GotoIfTime';
+            elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
+            break;
+          case 'custom':
+            elem.IntervalId = element.IntervalId;
+            elem.interval = element.interval;
+            elem.app = elem.customApp = element.customApp;
+            elem.appdata = util.format(elem.appdata, element.appdata);
+            break;
+          default:
+
+        }
+      });
+
+  }
+  if (priority) {
+    return priority;
+  }
+}
+
+// Updates an existing voice_extension in the DB.
+exports.update = function(req, res) {
+  VoiceExtension
+    .findAll({
+      where: {
+        exten: req.body.exten,
+        context: req.body.context,
+        type: req.body.type,
+        VoiceExtensionId: null,
+        id: {
+          $ne: req.body.id
+        }
+      }
+    })
+    .then(function(existingExtensions) {
+      //console.log(existingExtensions);
+      //console.log('Finding app row.....');
+      if (!existingExtensions) {
+        return res.sendStatus(404);
+      }
+      if (existingExtensions.length > 0) {
+        return res.status(500).send({
+          message: 'MESSAGE_EXIST_ROUTE'
+        })
+      }
+      if (req.body.id) {
+        delete req.body.id;
+      }
+      VoiceExtension
+        .find({
+          where: {
+            id: req.params.id
+          }
+        })
+        .then(function(voice_extension) {
+          if (!voice_extension) {
+            return res.sendStatus(404);
+          }
+          var updated = _.merge(voice_extension, req.body);
+          return sequelize.transaction(function(t) {
+              return updated.save({
+                  transaction: t
+                })
+                .then(function(updatedRoute) {
+                  VoiceExtension
+                    .findAll({
+                      where: {
+                        VoiceExtensionId: updatedRoute.id,
+                        isApp: true
+                      }
+                    })
+                    .then(function(voiceExtensions) {
+                      return VoiceExtension.destroy({
+                          where: {
+                            VoiceExtensionId: updatedRoute.id
+                          }
+                        }, {
+                          transaction: t
+                        })
+                        .then(function() {
+                          voiceExtensions = _.pluck(voiceExtensions, 'dataValues');
+                          var intervalIds = _.filter(_.pluck(voiceExtensions, 'IntervalId'), function(elem) {
+                            return elem !== null;
+                          });
+                          Interval
+                            .findAll({
+                              where: {
+                                IntervalId: intervalIds
+                              }
+                            })
+                            .then(function(intervals) {
+                              var priority = 2;
+                              var interval;
+                              voiceExtensions.forEach(function(tmpElem) {
+                                var application = _.cloneDeep(Applications[tmpElem.app]);
+                                if (!application || tmpElem.customApp) {
+                                  application = [{
+                                    app: 'GotoIfTime',
+                                    appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+                                  }, {
+                                    app: 'custom',
+                                    appdata: '%s',
+                                    isApp: true
+                                  }, {
+                                    app: 'NoOp',
+                                    appdata: 'Custom Application End'
+                                  }];
+                                }
+                                tmpElem.context = updatedRoute.context;
+                                tmpElem.exten = updatedRoute.exten;
+                                var appGroup = util.format('%s%s%s', tmpElem.context, tmpElem.exten, priority);
+                                tmpElem.interval = tmpElem.interval || '*,*,*,*';
+                                var tmpIntervals = _.filter(intervals, function(elem) {
+                                  return (elem.IntervalId == tmpElem.IntervalId);
+                                });
+                                if (tmpIntervals && tmpIntervals.length > 0) {
+                                  application.splice(0, 1);
+                                  tmpIntervals.forEach(function(elem, index) {
+                                    application.unshift({
+                                      app: 'GotoIfTimeFromArray',
+                                      appdata: elem.interval + '?%s,${EXTEN},%s:%s,${EXTEN},%s',
+                                      IntervalId: elem.id,
+                                      isInterval: true,
+                                      interval: elem.interval
+                                    });
+                                  })
+                                }
+                                priority = appCreate(application, tmpElem, appGroup, tmpIntervals || [], priority);
+                                VoiceExtension
+                                  .bulkCreate(application)
+                              });
+                              return res.sendStatus(200);
+                            })
+                        })
+                    })
+                })
+            })
+            .catch(function(err) {
+              return handleError(res, err);
+            });
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing voice_extension in the DB.
+exports.updateApplication = function(req, res, next) {
+  var interval;
+  if (req.body.appdata) {
+    delete req.body.appdata;
+  }
+
+  //console.log('Finding app row.....');
+  VoiceExtension
+    .findById(req.body.id)
+    .then(function(voiceExtension) {
+      if (!voiceExtension) {
+        return res.sendStatus(404);
+      }
+      delete req.body.id;
+      var updated = _.merge(voiceExtension, req.body);
+      //console.log('Updating app row.....');
+      return sequelize.transaction(function(t) {
+          return updated.save({
+              transaction: t
+            })
+            .then(function() {
+              //console.log('Finding extension apps..');
+              VoiceExtension
+                .findAll({
+                  where: {
+                    VoiceExtensionId: req.body.VoiceExtensionId,
+                    isApp: true
+                  }
+                })
+                .then(function(voiceExtensions) {
+                  //console.log('Extensions found');
+                  //console.log('Destroying extension rows...');
+                  return VoiceExtension.destroy({
+                      where: {
+                        VoiceExtensionId: req.body.VoiceExtensionId
+                      }
+                    }, {
+                      transaction: t
+                    })
+                    .then(function() {
+                      voiceExtensions = _.pluck(voiceExtensions, 'dataValues');
+                      var intervalIds = _.filter(_.pluck(voiceExtensions, 'IntervalId'), function(elem) {
+                        return elem !== null;
+                      });
+                      return Interval
+                        .findAll({
+                          where: {
+                            IntervalId: intervalIds
+                          }
+                        })
+                        .then(function(intervals) {
+                          //console.log('Creating extension rows...');
+                          var priority = 2;
+                          var interval;
+                          voiceExtensions.forEach(function(tmpElem) {
+                            //console.log('Creating app..');
+                            var application = _.cloneDeep(Applications[tmpElem.app]);
+                            if (!application || tmpElem.customApp) {
+                              application = [{
+                                app: 'GotoIfTime',
+                                appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+                              }, {
+                                app: 'custom',
+                                appdata: '%s',
+                                isApp: true
+                              }, {
+                                app: 'NoOp',
+                                appdata: 'Custom Application End'
+                              }];
+                            }
+                            //console.log('PRIORITY');
+                            //console.log(priority);
+                            var appGroup = util.format('%s%s%s', tmpElem.context, tmpElem.exten, priority);
+                            tmpElem.interval = tmpElem.interval || '*,*,*,*';
+                            var tmpIntervals = _.filter(intervals, function(elem) {
+                              return (elem.IntervalId == tmpElem.IntervalId);
+                            });
+                            if (tmpIntervals && tmpIntervals.length > 0) {
+                              application.splice(0, 1);
+                              tmpIntervals.forEach(function(elem, index) {
+                                // interval = createInterval(elem);
+                                application.unshift({
+                                  app: 'GotoIfTimeFromArray',
+                                  appdata: elem.interval + '?%s,${EXTEN},%s:%s,${EXTEN},%s',
+                                  IntervalId: elem.id,
+                                  isInterval: true,
+                                  interval: elem.interval
+                                });
+                              })
+                            }
+                            priority = appCreate(application, tmpElem, appGroup, tmpIntervals || [], priority);
+                            //console.log('returned priority');
+                            //console.log(priority);
+                            VoiceExtension
+                              .bulkCreate(application)
+                          });
+                          //console.log('THE END');
+                        })
+                    })
+                })
+            })
+        })
+        .then(function(result) {
+          return res.status(201).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+
+};
+
+// Deletes a voice_extension from the DB.
+exports.destroy = function(req, res, next) {
+  VoiceExtension
+    .findById(req.params.id)
+    .then(function(voice_extension) {
+      if (!voice_extension) {
+        return res.sendStatus(404);
+      }
+      if (!voice_extension.VoiceExtensionId) {
+        voice_extension.destroy()
+          .then(function() {
+            return res.sendStatus(204);
+          })
+          .catch(function(err) {
+            return handleError(res, err);
+          });
+      } else {
+        //console.log('isApplication');
+        VoiceExtension
+          .findAll({
+            where: {
+              appGroup: voice_extension.appGroup
+            }
+          })
+          .then(function(voice_extensions) {
+            //console.log('found extensions');
+            if (!voice_extensions) {
+              return res.sendStatus(404);
+            }
+            return sequelize.transaction(function(t) {
+                //console.log('trying to delete');
+                return VoiceExtension.destroy({
+                    where: {
+                      appGroup: voice_extension.appGroup
+                    }
+                  }, {
+                    transaction: t
+                  })
+                  .then(function(deleted_rows) {
+                    //console.log('the length of the group is', deleted_rows);
+                    // //console.log(voice_extensions);
+                    return VoiceExtension
+                      .findAll({
+                        where: {
+                          VoiceExtensionId: voice_extension.VoiceExtensionId,
+                          priority: {
+                            $gt: voice_extensions[deleted_rows - 1].priority
+                          }
+                        }
+                      })
+                      .then(function(voiceApplications) {
+                        return VoiceExtension
+                          .destroy({
+                            where: {
+                              VoiceExtensionId: voice_extension.VoiceExtensionId,
+                              priority: {
+                                $gt: voice_extensions[deleted_rows - 1].priority
+                              }
+                            }
+                          }, {
+                            transaction: t
+                          })
+                          .then(function() {
+                            var appGroups = _.pluck(_.filter(_.pluck(voiceApplications, 'dataValues'), function(elem) {
+                              return elem.isApp === true;
+                            }), 'appGroup');
+                            var priority = voice_extensions[0].priority;
+                            appGroups.forEach(function(sortedElem) {
+                              var tmpElem = _.find(voiceApplications, function(elem) {
+                                return (elem.appGroup == sortedElem && elem.isApp === true);
+                              });
+                              var application = _.cloneDeep(Applications[tmpElem.app]);
+                              if (!application || tmpElem.customApp) {
+                                application = [{
+                                  app: 'GotoIfTime',
+                                  appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
+                                }, {
+                                  app: 'custom',
+                                  appdata: '%s',
+                                  isApp: true
+                                }, {
+                                  app: 'NoOp',
+                                  appdata: 'Custom Application End'
+                                }];
+                              }
+                              //console.log('PRIORITY');
+                              //console.log(priority);
+                              var appGroup = util.format('%s%s%s', tmpElem.context, tmpElem.exten, priority);
+                              tmpElem.interval = tmpElem.interval || '*,*,*,*';
+                              var tmpIntervals = _.filter(voiceApplications, function(elem) {
+                                return (elem.appGroup == sortedElem && elem.isInterval === true);
+                              });
+                              if (tmpIntervals && tmpIntervals.length > 0) {
+                                application.splice(0, 1);
+                                tmpIntervals.forEach(function(elem, index) {
+
+                                  application.unshift({
+                                    app: 'GotoIfTimeFromArray',
+                                    appdata: elem.interval + '?%s,${EXTEN},%s:%s,${EXTEN},%s',
+                                    IntervalId: elem.IntervalId ? elem.IntervalId : null,
+                                    isInterval: true,
+                                    interval: elem.interval,
+                                  });
+                                })
+                              }
+                              priority = appCreate(application, tmpElem, appGroup, tmpIntervals || [], priority);
+                              //console.log('returned priority');
+                              //console.log(priority);
+                              VoiceExtension
+                                .bulkCreate(application)
+                            });
+                          })
+                      })
+                  })
+              })
+              .then(function(result) {
+                // VoiceExtension
+                //   .findAll({
+                //     where: {
+                //       VoiceExtensionId: voice_extension.VoiceExtensionId,
+                //       isApp: true
+                //     }
+                //   })
+                //   .then(function(voiceExtensions) {
+                //     // //console.log(_.pluck(voiceExtensions, 'dataValues'));
+                //     return res.status(201).send(voiceExtensions);
+                //   })
+                res.sendStatus(201);
+              })
+              .catch(function(err) {
+                return next(err);
+              });
+          })
+      }
+    })
+    .catch(function(err) {
+      return next(err);
+    });
+};
+
+
+// Deletes a agent from the DB.
+exports.bulkDestroy = function(req, res) {
+  VoiceExtension
+    .destroy({
+      where: {
+        id: req.query.id
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}