{"version":3,"mappings":"8KAKO,QACLA,YAAoBC,EAAkCC,GAAlCC,mBAAkCA,cAEtDC,YAAYH,EAA+BC,GACzC,MAAMG,EAAcH,EAAMI,IAI1B,QAAIH,KAAKI,YAAYC,mBAGrBL,KAAKI,YAAYE,eAAeJ,GAChCF,KAAKO,OAAOC,SAAS,CAACR,KAAKI,YAAYK,iBAChC,GAETC,iBAAiBZ,EAA+BC,GAS9C,OAAO,EAETY,cAAcb,GACZ,MAAMC,EAAU,IAAIa,KACdV,EAAY,IAAIU,KAAKd,GAC3B,QAAIC,EAAQc,YAAcX,EAAUW,WAAad,EAAQe,WAAaZ,EAAUY,mDA7BvEC,GAAgBC,mDAAhBD,EAAgBE,QAAhBF,EAAgB,YCD7B,MAAMG,EAAiB,CACrB,CAAEC,KAAM,GAAIC,WAAY,OAAQC,UAAW,QAE3C,CAAEF,KAAM,QAASG,aAAc,IAAMC,sKAA+BC,KAAKC,GAAKA,EAAEC,cAChF,CACEP,KAAM,cAAeG,aAAc,IAAMC,oGAA2CC,KAAKC,GAAKA,EAAEE,mBAC9F1B,YAAa,CAACc,IAElB,CACEI,KAAM,QAASG,aAAc,IAAMC,iIAA+BC,KAAKC,GAAKA,EAAEG,aAC5E3B,YAAa,CAACc,IAElB,CAAEI,KAAM,OAAQG,aAAc,IAAMC,yMAA6BC,KAAKC,GAAKA,EAAEI,aAC7E,CAAEV,KAAM,QAASG,aAAc,IAAMC,kIAA+BC,KAAKC,GAAKA,EAAEK,cAChF,CAAEX,KAAM,QAASG,aAAc,IAAMC,8JAA+BC,KAAKC,GAAKA,EAAEM,cAChF,CAAEZ,KAAM,OAAQG,aAAc,IAAMC,0KAA6BC,KAAKC,GAAKA,EAAEO,aAC7E,CACEb,KAAM,kBAAmBG,aAAc,IAAMC,oKAAmDC,KAAKC,GAAKA,EAAEQ,uBAC5GhC,YAAa,CAACc,IAEhB,CACEI,KAAM,cAAeG,aAAc,IAAMY,+DAAmCV,KAAKC,GAAKA,EAAEU,eACtFlC,YAAa,CAACc,IAElB,CACEI,KAAM,SAAUG,aAAc,IAAMC,wCAAiCC,KAAKC,GAAKA,EAAEW,cAC/EnC,YAAa,CAACc,IAElB,CAAEI,KAAM,OAAQG,aAAc,IAAMY,yDAA6BV,KAAKC,GAAKA,EAAEY,aAC7E,CACElB,KAAM,UAAWG,aAAc,IAAMY,+DAAmCV,KAAKC,GAAKA,EAAEa,gBAGtF,CAAEnB,KAAM,cAAeG,aAAc,IAAMC,oGAA2CC,KAAKC,GAAKA,EAAEc,oBAClG,CAAEpB,KAAM,KAAMG,aAAc,IAAMY,kEAAsCV,KAAKC,GAAKA,EAAEe,kBAc/E,+CAAMC,4DARF,CAACC,aAAqBxB,EAK3B,CAAEyB,uBAAwB,SAAUC,oBAAqB,YACnDF,iKCzCJ1B,iBAA4CA,2FAAuCA,oLAAiCA,kCAN5HA,mCAKIA,iBACIA,uBACAA,yBACJA,QACJA,8BATkCA,uCAAsC,iCAEjDA,kDAGYA,iDACHA,uCCmBzB,QAULnB,YACSC,EACAC,EACCG,EACA2C,EACAC,IAJD9C,iBACAA,aACCA,sBACAA,cACAA,YAbVA,WAAQ,oBACRA,yBAAqB,EACrBA,qBAAiB,EACjBA,iBAAa,EACbA,cAAU,EACVA,kBAAe,EACfA,mBAAe,EASbA,KAAK+C,MAAMC,aACXhD,KAAKiD,eAAeC,gCACpBlD,KAAK+C,MAAMI,iBAEbC,YAAYtD,GAKV,OAJAE,KAAK+C,MAAMM,WAAWC,SAAYxD,EAAe,KAAP,KAC1CE,KAAKuD,UAAUC,eAAe1D,GAC9BE,KAAKuD,UAAUE,IAAI3D,GACnBE,KAAKiD,eAAeS,kBAAkB5D,EAAK,YACnCA,OACD,KACHE,KAAK+C,MAAMM,WAAWM,OAAQ,EAC9B,UAEG,KACH3D,KAAK+C,MAAMM,WAAWM,OAAQ,EAC9B,cAGA3D,KAAKuD,UAAUC,eAAe,MAC9BxD,KAAKuD,UAAUE,IAAI,MACnBzD,KAAK+C,MAAMM,WAAWM,OAAQ,GAKpCC,GAAG9D,GACDE,KAAKO,OAAOC,SAAS,CAACV,IAExB+D,WAKE,OAJA7D,KAAK+C,MAAMM,WAAa,IAAIS,IAC5B9D,KAAK+C,MAAMM,WAAWC,SAAWtD,KAAKiD,eAAec,QACnD,YAEM/D,KAAKiD,eAAec,QAAQ,iBAC7B,KAcH,QAGA/D,KAAKuD,UAAUC,eAAe,MAC9BxD,KAAKuD,UAAUE,IAAI,MACnBzD,KAAK+C,MAAMM,WAAWM,OAAQ,EAC9B3D,KAAK+C,MAAMM,WAAWC,SAAW,KAEjC,MAhBA,IAEG,KACHtD,KAAKuD,UAAUC,eAAe,MAC9BxD,KAAKuD,UAAUE,IAAI,MACnBzD,KAAK+C,MAAMM,WAAWM,OAAQ,EAC9B3D,KAAK+C,MAAMM,WAAWC,SAAW,KAcjCU,SAASC,KAAKC,UAAUC,SAAS,oBACnCnE,KAAKoE,oBAAqB,EACjBC,OAAOC,aAAaC,QAAQ,wBACrCvE,KAAKoE,mBAAqBI,KAAKC,MAC7BJ,OAAOC,aAAaC,QAAQ,wBAIlCG,eACE1E,KAAK2E,IAAIC,UAAwB,aAAaC,UAAU/E,IACtDE,KAAK+C,MAAM+B,UAAYhF,2CAxFhBiF,GAAY/D,mFAAZ+D,EAAYC,+WD5BzBhE,gDAGAA,gDAHeA,2CAMiCA,oyBCSlC,EACV,QAAQ,iBAAkB,EACxB,QAAW,SAAU,EACnB,QAAM,CAAEiE,UAAW,mBAAoBC,QAAS,KAChD,QAAQ,SAAS,QAAM,CAAED,UAAW,gBAAiBC,QAAS,QAEhE,QAAW,SAAU,EACnB,QAAM,CAAED,UAAW,gBAAiBC,QAAS,KAC7C,QAAQ,SAAS,QAAM,CAAED,UAAW,mBAAoBC,QAAS,yECZlE,QAIHrF,YACWC,EACAC,EACCG,GAFDF,cACAA,iBACCA,eAEZmF,YAAYrF,GACR,GAAIA,aAAiBsF,KAAmB,CAEpC,GADApF,KAAKqF,QAAQC,UACVxF,EAAMyF,QAAQC,cAAcC,SAAS,2CAA2C,CAC/EzF,KAAK0F,cAAe,EACpB,MAAM3F,EAAYC,KAAK2F,OAAOC,KAAKC,KAQnC,OAPA9F,EAAU+F,kBAAkBC,MAAQ/F,KAAKuD,UAAUyC,QAAQ,gCAC3DjG,EAAU+F,kBAAkBG,WAAY,EACxClG,EAAU+F,kBAAkBI,OAAQ,EACpCnG,EAAU+F,kBAAkBP,QAAU,GAAGzF,EAAMyF,eAC/CxF,EAAUoG,cAActB,UAAU3E,IAC9BF,KAAK0F,cAAe,IAQ5B,GACS,KAJTU,QAAQC,MAAM,iCAAkCvG,EAAMwG,QACtDF,QAAQC,MAAM,iBAAkBvG,EAAMyF,SACtCvF,KAAKuG,UAAYzG,EAAMwG,OACfxG,EAAMwG,QAENtG,KAAKwG,aAAexG,KAAKuD,UAAUyC,QAAQ,gCAI3ChG,KAAKwG,aAAe1G,EAAMyF,QAelC,GAZKzF,EAAMuG,QACTrG,KAAKwG,aAAe1G,EAAMuG,MAAMI,MAAM,MAAM,IAE1CzG,KAAKwG,aAAahB,cAAcC,SAAS,6EACzCzF,KAAKwG,aAAe,6MAGpBxG,KAAKwG,aAAahB,cAAcC,SAAS,uBAC3CzF,KAAKwG,aAAexG,KAAKwG,aAAaE,QAAQ,qBAAsB,KAGtE1G,KAAKqF,QAAQC,WACRtF,KAAK0F,aAAc,CACpB1F,KAAK0F,cAAe,EACpB,MAAM3F,EAAYC,KAAK2F,OAAOC,KAAKC,KACnC9F,EAAU+F,kBAAkBC,MAAQ/F,KAAKuD,UAAUyC,QAAQ,uBAC3DjG,EAAU+F,kBAAkBG,WAAY,EACxClG,EAAU+F,kBAAkBP,QAAU,GAAGvF,KAAKwG,eAC9CzG,EAAUoG,cAActB,UAAU3E,IAC9BF,KAAK0F,cAAe,SAIzB,CAEHU,QAAQC,MAAM,qBAAsBvG,EAAMyF,SAC1C,MAAMxF,EAAMD,EAAMyF,QAAQC,cAC1B,KAAKzF,EAAI0F,SAAS,mBAAsB1F,EAAI0F,SAAS,gBAAmB1F,EAAI0F,SAAS,iBACjFzF,KAAKqF,QAAQC,UACRtF,KAAK0F,eAAc,CACpB1F,KAAK0F,cAAe,EACpB,MAAMxF,EAAYF,KAAK2F,OAAOC,KAAKC,KACnC3F,EAAU4F,kBAAkBC,MAAQ/F,KAAKuD,UAAUyC,QAAQ,uBAC3D9F,EAAU4F,kBAAkBG,WAAY,EACxC/F,EAAU4F,kBAAkBI,OAAQ,EACpChG,EAAU4F,kBAAkBP,QAAU,GAAGzF,EAAMyF,UAC/CrF,EAAUiG,cAActB,UAAUhC,IAC9B7C,KAAK0F,cAAe,KAMpC1F,KAAKqF,QAAQC,iDAhFRqB,GAAyB3F,iEAAzB2F,EAAyB1F,QAAzB0F,EAAyB,qBAFtB,wBCIT,QAEH9G,YACYC,EACAC,EACAG,GAFAF,YACAA,aACAA,eAGZ4G,cAAc9G,GACV,MAAMC,EAAQD,EAAIK,IAAI0G,oBAOtB,OANmB9G,EAAM0F,SAAS,SAAW1F,EAAM0F,SAAS,SAAW1F,EAAM0F,SAAS,YAAc1F,EAAM0F,SAAS,UAAY1F,EAAM0F,SAAS,mBAAqB1F,EAAM0F,SAAS,YAAc1F,EAAM0F,SAAS,eAAiB1F,EAAM0F,SAAS,WAAa1F,EAAM0F,SAAS,YACpQ1F,EAAM0F,SAAS,cAAgB1F,EAAM0F,SAAS,qBAAuB1F,EAAM0F,SAAS,kBAAoB1F,EAAM0F,SAAS,mBAAqB1F,EAAM0F,SAAS,gBAAkB1F,EAAM0F,SAAS,mBAC5L1F,EAAM0F,SAAS,sBAAwB1F,EAAM0F,SAAS,kBAAoB1F,EAAM0F,SAAS,gBACzF1F,EAAM0F,SAAS,kBAAoB1F,EAAM0F,SAAS,qBAAuB1F,EAAM0F,SAAS,qBACxF1F,EAAM0F,SAAS,8BAAgC1F,EAAM0F,SAAS,mBAAqB1F,EAAM0F,SAAS,wBAAyB1F,EAAM0F,SAAS,gBAC1I1F,EAAM0F,SAAS,aAG1BqB,UAAUhH,EAAuBC,GAI7B,GAAKC,KAAK4G,cAAc9G,GAYpB,OAAKE,KAAK+G,gBAAgBjH,GAInBE,KAAKgH,YAAYlH,EAAKC,GAhBH,CAE1B,MAAMG,EAAUJ,EAAImH,MAAM,CACtBC,QAASpH,EAAIoH,QAAQC,IAAI,gBAAiB,UAAYnH,KAAKoH,aAE/D,OAAKpH,KAAK+G,gBAAgB7G,GAInBH,EAAKsH,OAAOnH,IAU3B6G,gBAAgBjH,GAGZ,OADmBA,EADDK,IAAI0G,oBACGpB,SAAS,QAItCuB,YACIlH,EACAC,GAGA,OAAID,IAAQA,EAAIK,IAAIsF,SAAS,WACzBzF,KAAKqF,QAAQiC,QAEVvH,EAAKsH,OAAOvH,GAAKyH,MACpB,SAAIrH,IACIA,aAAiBkF,MAIjBpF,KAAKqF,QAAQC,UAEbpF,aAAiBkF,MACjBpF,KAAKqF,QAAQC,oDAhEpBkC,GAAexG,8DAAfwG,EAAevG,QAAfuG,EAAe,qBAFZ,yICiFT,QAEL3H,YAAYC,GACV2H,EAAUC,SAAW5H,yCAHZ2H,GAASzG,uCAATyG,EAASE,WAFR5C,kCApBD,CACThE,EACAqE,KACAwC,IACAjB,EACAkB,IACAC,IACAC,IACAC,KACAC,IACA,CACEC,QAASlH,MACTmH,SAAUxB,GAEZ,CACEuB,QAAS9C,KACT+C,SAAUX,EAAiBY,OAAO,IAErCC,SAhDQ,CAEPjD,KACAkD,gBAIAC,aAAwB,CACtBC,OAAQ,CACNN,QAASK,KACTE,WArBD,YAA+BhH,GACpC,OAAO,IAAIiH,IAAoBjH,EAAM,iBAAkB,UAqBjDkH,KAAM,CAACvD,SAGX3C,EACAmG,KACAC,KACAC,KACAC,KACAC,eACAC,cAAuB,CAAEC,KAAM,GAAIC,QAAS,EAAGC,KAAM,IACrDC,cAA6B,iBAAkB,CAC7CC,QAASC,eAGTC,qBAAsB,mJCzDxBxI,oBAAmHA,8BAAiCA,eAAjCA,kEACnHA,oBAA2GA,8BAA6BA,eAA7BA,wCCAxG,QAKLnB,YAAmB4J,EACL7B,GADK5H,iBACLA,qBALdA,WAAQ,GACRA,aAAU,GAMV6D,aACO7D,KAAKuF,SAA4B,KAAjBvF,KAAKuF,UACxBvF,KAAK0J,UAAUC,QAGnBC,aAAaH,GACXzJ,KAAKiG,WAAY,EACjBjG,KAAKkG,OAAQ,EACblG,KAAK+F,MAAQ/F,KAAK6J,cAAc7D,QAAQ,oBACxChG,KAAKuF,QAAUvF,KAAK6J,cAAc7D,QAAQ,mBAC1ChG,KAAKuF,QAAUvF,KAAKuF,QAAQmB,QAAQ,MAAO+C,0CAlBlC3F,GAAe9C,kDAAf8C,EAAekB,6jBDT5BhE,gBAAiCA,gBAAMA,SAASA,QAAOA,QAEvDA,iBACIA,aAAGA,SAAWA,QAElBA,QAEAA,iBACIA,0BACAA,0BACJA,eAVuCA,wBAGhCA,0BAK+FA,mCACJA,q1BEJ1FA,oBAAqCA,iDAAS8I,gBAE1C9I,gBACJA,+BAKJA,eACIA,kBACJA,iDAEIA,oBAAqCA,iDAAS4C,GAAG,qBAE7C5C,mBAEAA,gBACJA,gCAHUA,mGAKVA,oBAAqCA,iDAAS+I,YAC1C/I,gBACJA,kCACAA,qBAEIA,gBACJA,0CAHkEA,6BAA+B,4FAgC7FA,qBAMIA,kDAAS,OAATA,UAAS2I,QAAuBJ,KAAG,oBACnCvI,gBACAA,mBAAmBA,8BAA+BA,QACtDA,cADuBA,0FAIvBA,qBAIIA,oGAAsC6G,UAAuB0B,KAAG,qBAChEvI,gBACAA,mBAAmBA,8BAAwCA,QAC/DA,cADuBA,6FAIvBA,qBAIIA,oGAAsC6G,UAAyB0B,KAAG,iBAClEvI,gBACAA,mBAAmBA,8BAAoCA,QAC3DA,cADuBA,yFAIvBA,qBAGIA,oGAAsC6G,UAAyB0B,KAAG,UAClEvI,gBACAA,mBAAmBA,8BAA6BA,QACpDA,cADuBA,kFAIvBA,qBACIA,oGAAsC6G,UAAyB0B,kBAC/DvI,gBACAA,mBAAmBA,8BAAwCA,QAC/DA,cADuBA,kGAIvBA,qBAEIA,oGAAsC6G,UAAyB0B,KAAG,WAClEvI,gBACAA,mBAAmBA,8BAAgCA,QACvDA,cADuBA,sFAGvBA,qBAIIA,kDAAS,OAATA,UAAS2I,QAAwBJ,KAAG,YACpCvI,gBACAA,mBAAoBA,8BAAkCA,QAC1DA,cADwBA,+FAGxBA,qBAIIA,kDAAS,OAATA,UAAS2I,QAAwBJ,KAAG,iBACpCvI,gBACAA,mBAAoBA,8BAAmCA,QAC3DA,cADwBA,gGAGxBA,qBAGIA,kDAAS,OAATA,UAAS2I,QAAwBJ,WACjCvI,gBACAA,mBAAoBA,8BAA8BA,QACtDA,cADwBA,kDCzH7B,QAkBLnB,YACUoI,EACAe,EACDK,EACGE,EACA1B,EACAmC,GACAvC,GANFzH,qBACAA,sBACDA,aACGA,cACAA,iBACAA,YACAA,cAlBFA,eAA+B,IAAIgB,MAE7ChB,yBAAqB,EACrBA,qBAAiB,EACjBA,iBAAa,EACbA,cAAU,EACVA,kBAAe,EACfA,mBAAe,EACfA,gBAAa,GACbA,uBAA4B,EAW1BA,KAAKiD,eAAeC,gCAEtBW,WAaE,OAZA7D,KAAKiK,mBAAqBjK,KAAKkK,kBAAkB,YACjDlK,KAAKmK,iBAAmBnK,KAAKkK,oBACvBlK,KAAKoK,UACTpK,KAAKoK,SAAU,GAEXpK,KAAKqK,aACTrK,KAAKqK,YAAa,GAEpBrK,KAAK+C,MAAMM,WAAa,IAAIX,IAC5B1C,KAAK+C,MAAMM,WAAWC,SAAWtD,KAAKiD,eAAec,QACnD,YAEM/D,KAAKiD,eAAec,QAAQ,iBAC7B,KAcH,QAGA/D,KAAKuD,UAAUC,eAAe,MAC9BxD,KAAKuD,UAAUE,IAAI,MACnBzD,KAAK+C,MAAMM,WAAWM,OAAQ,EAC9B3D,KAAK+C,MAAMM,WAAWC,SAAW,KAEjC,MAhBA,IAEG,KACHtD,KAAKuD,UAAUC,eAAe,MAC9BxD,KAAKuD,UAAUE,IAAI,MACnBzD,KAAK+C,MAAMM,WAAWM,OAAQ,EAC9B3D,KAAK+C,MAAMM,WAAWC,SAAW,MAcvCF,YAAY6E,GAKV,OAJAjI,KAAK+C,MAAMM,WAAWC,SAAW2E,EACjCjI,KAAKuD,UAAUC,eAAeyE,GAC9BjI,KAAKuD,UAAUE,IAAIwE,GACnBjI,KAAKiD,eAAeS,kBAAkBuE,EAAK,YACnCA,OACD,KACHjI,KAAK+C,MAAMM,WAAWM,OAAQ,EAC9B,UAEG,KACH3D,KAAK+C,MAAMM,WAAWM,OAAQ,EAC9B,cAGA3D,KAAKuD,UAAUC,eAAe,MAC9BxD,KAAKuD,UAAUE,IAAI,MACnBzD,KAAK+C,MAAMM,WAAWM,OAAQ,GAKpCoG,UACE/J,KAAK+C,MAAMuH,sBACXtK,KAAKuK,UAAUC,KAAKxK,KAAKG,KAE3B2J,cACE9J,KAAK4J,aAAa5J,KAAKuD,UAAUyC,QAAQ,wBAE3C4D,aAAa3B,GACX,MAAMe,EAAYhJ,KAAK2F,OAAOC,KAAKkC,KACnCkB,EAAUlD,kBAAkB8D,aAAa3B,GACzCe,EAAU7C,cAActB,UAAUwE,IACjB,OAAXA,GACFrJ,KAAKyK,iBAMXA,eACEzK,KAAK2E,IAAI+F,gBAAqB,cAAe1K,KAAK+C,MAAM4H,oBAAoB9F,UAAWoD,IACrFjI,KAAK4K,cAAe,IAEtB5K,KAAK4K,cAAe,EAEtBhH,GAAGqE,GACDjI,KAAK4K,cAAgB5K,KAAK4K,aACd,gBAAR3C,IAEAA,EADwC,IAAtCjI,KAAK+C,MAAM8H,QAAQC,eACf,QAEA,eAGE,mBAAR7C,GAA4BjI,KAAK+C,MAAMgI,SAAiC,IAAtB/K,KAAK+C,MAAMgI,UAC/D9C,GAAYjI,KAAK+C,MAAMgI,SACb,mBAAR9C,KAA8BjI,KAAK+C,MAAMgI,SAAiC,IAAtB/K,KAAK+C,MAAMgI,WACjE/K,KAAK+C,MAAMgI,QAAU,IACrB9C,GAAYjI,KAAK+C,MAAMgI,SAEzB/K,KAAK+C,MAAMiI,QAAU,IAAM/C,EAC3B7B,QAAQ6E,IAAIjL,KAAK+C,MAAMiI,SACvBhL,KAAKO,OAAOC,SAAS,CAAC,IAAMyH,IAQ9BiC,kBAAkBjC,GAChB,IAAIe,EAAchJ,KAAK+C,MAAM8H,QAAQK,YACrC,MAAuB,SAAnBlL,KAAKO,OAAOJ,KACO,UAAnBH,KAAKO,OAAOJ,KAAsC,YAAnBH,KAAKO,OAAOJ,KAAwC,WAAnBH,KAAKO,OAAOJ,KAAuC,oBAAnBH,KAAKO,OAAOJ,KAAgD,gBAAnBH,KAAKO,OAAOJ,KAE9H,MAAvBH,KAAK+C,MAAMgI,SAAuC,qBAApB/K,KAAKO,OAAOJ,KAHZH,KAAKmL,kBAAmB,GAAa,KAQnEnC,EAAYoC,gBAAkBpC,EAAYqC,0BAC5CrL,KAAKmL,kBAAmB,GAEtBnC,EAAYsC,iBAAiD,IAA/BtC,EAAYuC,iBAC5CvL,KAAKmL,kBAAmB,GAEC,MAA3BnL,KAAS+C,MAAMgI,QACb/K,KAAKmL,kBAAmB,EACjBnL,KAAK+C,MAAM8H,QAAQK,YAAYI,gBAAkBtL,KAAK+C,MAAM8H,QAAQK,YAAYK,iBACvFvL,KAAKmL,kBAAmB,GAEtBnC,EAAYsC,gBAAkBtC,EAAYuC,iBAC5CvL,KAAKmL,kBAAmB,GAEjB,YAALlD,GAAmBjI,KAAKwL,UAAYxL,KAAKmL,kBAEzCnL,KAAKwL,UAAYxL,KAAK+C,MAAM8H,QAAQK,YAAYE,gBAAkBpL,KAAK+C,MAAMgI,SACxE,GAIXU,OACEpH,OAAOqH,SAASC,KAAO,gDA5Kd5D,GAAe/G,2GAAf+G,EAAe/C,i+DDhB5BhE,oBACIA,iBACIA,oBAAqCA,mDAAS4K,SAAuB5C,iCACjEhI,eACJA,QACAA,0BAIAA,iBACIA,kBAAyBA,SAAyDA,QACtFA,QACJA,QACAA,uBAGAA,iBACIA,2BAOAA,2BAGAA,2BAIAA,4BACIA,mBACIA,mBAAKA,gCAASgI,iBAAe,UAA4BhI,QACzDA,mBAAKA,gCAASgI,iBAAe,YAAgChI,QAC7DA,mBAAKA,gCAASgI,iBAAe,WAA8BhI,QAC3DA,mBAAKA,gCAASgI,iBAAe,UAA4BhI,QAC7DA,QACJA,QAEAA,sBACIA,oBAAqBA,UAA6BA,QACtDA,QACAA,6BACIA,sBAAsBA,gCAASgI,cAAY,QAAOhI,oBAAOA,QACzDA,sBAAsBA,gCAASgI,cAAY,QAAOhI,oBAAOA,QAC7DA,QACJA,QACJA,QACAA,mBAA+CA,mDAAS2I,QAAsBX,iCAC1EhI,8BACIA,wBACIA,qBACAA,oBACAA,mBACIA,iBACJA,QACJA,QACAA,4BACIA,6BAUAA,wBAEAA,4BAQAA,wBAEAA,4BAQAA,wBAEAA,4BAOAA,wBAEAA,4BAKAA,wBAEAA,6BAMAA,wBACAA,6BAQAA,wBACAA,6BAQAA,wBACAA,6BAOAA,wBAEJA,QACAA,mBAAyBA,sCAAyBA,QACtDA,QACJA,kCA1IaA,mEAIwBA,4DAG3BA,iCAGeA,uCAEZA,qJAMqDA,oCAGjDA,8DAaYA,sCACIA,4CAQdA,sCACiEA,8BASnCA,mWAahCA,sdAUAA,sZASgCA,wKASAA,qEAOAA,wKAQhCA,8UASAA,+UAQgCA,8sMEnHrC8G,yCACAA,0CACAA,2CACAA,+CAGRA,iBACIA,gBACIA,gBAAMA,6DAASA,QACnBA,QACJA,8BAHOA,yCCXJ,gBAA8BpF,IA2BnC7C,YACSgM,EACAC,EACCC,EACAC,GACNC,QAJKjM,cACAA,aACCA,aACAA,eA9BVA,WAAgB,sBAKhBA,YAAe,EAIfA,aAAU,CACR,CAAEkM,KAAM,OAAQC,MAAO,GACvB,CAAED,KAAM,QAASC,MAAO,GACxB,CAAED,KAAM,SAAUC,MAAO,GACzB,CAAED,KAAM,eAAgBC,MAAO,IAGjCnM,WAAkB,CAChB,CAACkM,KAAM,kEACP,CAACA,KAAM,mEAETlM,gBAAY,EACZA,eAAoB,EAEpBA,gBAAaA,KAAKoM,MAAM,GACxBpM,qBAA2B,EAU3B6D,WACE7D,KAAK+C,MAAMiI,QAAU,SAEjBhL,KAAKqM,aAAa,4CAA4CR,IAGxD7L,KAAKsM,SAFNT,EAEiB,4CAGD,gDAK3BU,aAAaV,GAGX,OAFc,IAAVA,IACF7L,KAAK+C,MAAMyJ,mBAAoB,GACzBxM,KAAK+C,MAAM0J,kBACZ,EACHzM,KAAKO,OAAOC,SAAS,CAAC,iBACtB,WACG,EACHR,KAAKO,OAAOC,SAAS,CAAC,kBACtB,WACG,EACHR,KAAKO,OAAOC,SAAS,CAAC,mBACtB,WACG,EACDR,KAAKO,OAAOC,SAAS,CAAC,mBAG5BR,KAAK0M,kBAGPC,SAASd,GACP7L,KAAK4M,SAAWf,EAAIM,MACpB/F,QAAQ6E,IAAIjL,KAAK4M,UAGnBF,kBACE,GACO,IADC1M,KAAK+C,MAAM0J,YAEfzM,KAAK6M,OAAQ,OAGb7M,KAAK6M,OAAQ,EAKnBR,aAAaR,EAAIC,GAEf,IAAIC,EAAQe,WAAW,WAEnBhB,GAAS,IACX,KAEEE,EAAMhI,SAAS+I,cAAc,OACjCf,EAAIgB,OAAS,WACTC,aAAalB,GACbD,GAAS,IAGbE,EAAIkB,QAAU,WACVD,aAAalB,GACbD,GAAS,IAGbE,EAAImB,IAAMtB,EAAI,sDAvGL9C,GAAejB,uEAAfiB,EAAe/D,0aDb5B8C,wBAEAA,iBACAA,eAA0BA,yBAAaA,QAEnCA,iBAEIA,2BAAeA,yEAAuDgE,0BAElEhE,0CACAA,0CACAA,4CACAA,4CAEJA,QAEAA,kBACIA,6BACAA,8BACAA,+BACAA,+BACJA,QACJA,QACAA,wBAMJA,eApB0DA,sDACAA,wDACAA,0DACAA,0DAKnCA,2EACCA,+CACCA,+CACAA,+CAGSA,gqFEd3B,gBAAoCpF,IAgBzC7C,YAAoBgM,EAA8BC,GAChDG,QADkBjM,kBAA8BA,aAEhDA,KAAKoN,WAAapN,KAAK2E,IAAI0I,OAAS,QACpCrN,KAAKsN,eAAiBtN,KAAKoN,WAAa,WACxCpN,KAAKuN,aAAevN,KAAKoN,WAAa,SACtCpN,KAAKwN,WAAaxN,KAAKoN,WAAa,QAG/BK,aAAa5B,GAClB,OAAO7L,KAAK0N,WAAWC,QAAQ,IAAI/E,KACjC,MACA,GAAG5I,KAAKsN,uBAAuBzB,IAC/B,KACA,CACE+B,gBAAgB,EAChBC,aAAc,UAIpBC,kBAAmBjC,EAAWC,EAAQ,kEACpC,IAAIC,EAAS,GAKb,IAHAF,EAAYA,GAAa,EACzBC,EAAUA,GAAW,mEAEZD,GACLE,EAAOgC,KAAKjC,EAAQkC,OAAOC,KAAKC,MAAMD,KAAKE,SAAWrC,EAAQsC,UAGlE,OAAOrC,EAAOsC,KAAK,IAGdC,WAAWzC,EAAYC,EAAgBC,GAC5C,MAAMC,EAAW,IAAIuC,SACfC,EAAa,IAAID,SACvB,IAAIE,EAEAC,EAAiB7C,EADM8C,KAAKC,WAAWnI,MAAM,KACZ,GACrC,MAAMoI,EAAa/C,EAEnB,OAAQA,OACD,UAAW2C,EAAM3C,EACpBA,EAAS9L,KAAK8N,kBAAkB,KAAK,IAAMY,EAC3C,UACG,OACHD,EAAM3C,EACNA,GAAU,OACV,UACG,WACH2C,EAAM3C,EACwBA,EAAP,QAAvB4C,EAAuC3C,EAAK+C,KAAO,OAA2B/C,EAAK+C,KAAO,IAAMJ,EAChG,UACG,QACHD,EAAM3C,EACN9L,KAAK+O,MAAQhD,EACbD,EAAU9L,KAAK+O,MAAMD,KAAO,OAC5B,UACG,SACHL,EAAM3C,EACNA,EAAUC,EAAK,OAQnB,GAFAC,EAASgD,OAAO,OAAQnD,EAAMC,GAElB,QAAT2C,GAAmB5C,EAAKoD,KAAO,KAChC,eAAQ5I,MAAM,6CAA0BqI,EAAgB,IAAK7C,EAAKoD,MAClEjP,KAAKkP,QAAUrD,EAAKoD,KAAMjP,KAAKmP,QAAUtD,EAAK8C,KAC9C3O,KAAKoP,QAAU,oJACfpP,KAAKqP,MAAO,qJACLrP,KAAK0N,WAAWC,QAAQ,IAAI/E,KAAY,OAAO5I,KAAKuN,aAAaiB,EAAU,CAACZ,gBAAgB,KAErG,GAAa,SAATa,GAAoB5C,EAAKoD,KAAO,IAClC,eAAQ5I,MAAM,sEAA0BqI,EAAgB,IAAK7C,EAAKoD,MAClEjP,KAAKkP,QAAUrD,EAAKoD,KAAMjP,KAAKmP,QAAUtD,EAAK8C,KAC9C3O,KAAKoP,QAAU,0JACfpP,KAAKqP,MAAO,2JACLrP,KAAK0N,WAAWC,QAAQ,IAAI/E,KAAY,OAAO5I,KAAKuN,aAAaiB,EAAU,CAACZ,gBAAgB,KAErG,GAAa,YAATa,GAAuB5C,EAAKoD,KAAO,IACrC,eAAQ5I,MAAM,mFAA8BqI,EAAiB,IAAM7C,EAAKoD,MACxEjP,KAAKkP,QAAUrD,EAAKoD,KAAMjP,KAAKmP,QAAUtD,EAAK8C,KAC9C3O,KAAKoP,QAAU,0JACfpP,KAAKqP,MAAM,2JACJrP,KAAK0N,WAAWC,QAAQ,IAAI/E,KAAY,OAAQ5I,KAAKuN,aAAciB,EAAW,CAAEZ,gBAAgB,KAEzG,GAAa,UAATa,GAAqB5C,EAAKoD,KAAO,IACnC,YAAKG,QAAU,+LACfpP,KAAKqP,MAAM,gMACJrP,KAAK0N,WAAWC,QAAQ,IAAI/E,KAAY,OAAQ5I,KAAKuN,aAAciB,EAAW,CAAEZ,gBAAgB,KAEzG,MAAM0B,EAAa,IAAI5G,EACrB4G,EAAWC,OAASV,EACpBS,EAAWE,MAAQ3D,EACnB,IAAI4D,GAAS,IAAI7G,KACjB,UAAOoG,OAAO,SAAU,KACxBhD,EAASgD,OAAO,SAAUH,GAEnB7O,KAAK0N,WAAWC,QAAQ,IAAI/E,KACjC,OACA5I,KAAKuN,aACJvB,EACA,CACE4B,gBAAgB,EAChB8B,OAAQD,MAMVE,WACL,OAAO3P,KAAK0N,WAAWkC,IAAc5P,KAAKwN,YAG5CqC,QAAQhE,GACN7L,KAAK8P,QAAUjE,EACf7L,KAAK+P,SAAWlE,EAAKK,4CAtIZ9G,GAAqB0C,mDAArB1C,EAAqBnE,QAArBmE,EAAqB,YAyI3B,aC7IK4K,yCCFRlI,SACIA,mBAAmCA,SAAyBA,QAChEA,8BADuCA,+DAEvCA,SACIA,mBAA2BA,8BAAoCA,QACnEA,eAD+BA,+CCM5B,QAOLjI,YAAmBgM,EAA6CC,EAAuBC,EAA+BC,GAAnGhM,qBAA6CA,cAAuBA,aAA+BA,cANtHA,cAAmB,EASnB6D,WACE7D,KAAKiQ,OAGPrG,aAAaiC,GACX,MAAMC,EAAY9L,KAAK2F,OAAOC,KAAKb,KACnC+G,EAAUhG,kBAAkB8D,aAAaiC,GACzCC,EAAU3F,cAActB,UAAUkH,IACf,OAAXA,GACA/L,KAAK2F,OAAOuK,aAMtBD,OAAejQ,KAAKmQ,QAAU,IAAIvP,KAAKwP,+CAzB5BC,GAAavI,sEAAbuI,EAAarL,+MDb1B8C,iBACIA,iBAAOA,uDAAmDA,QAC1DA,iBACAA,iCAGAA,gCAGAA,6BAAiBA,iCAAUgE,+BAA4BhE,QAC3DA,eATWA,yDACYA,yEACJA,gDAGAA,u7BDDPwI,QAAkB,KAC1BA,mBAAOA,2BAAUA,iCAAaA,4HGDxBxI,iBACEA,qBAAOA,6DAAUA,EAAVyI,MAAUC,SAAe,SAAQ/B,SAAjC3G,CAAgD,6CAAwH2I,iBAA/K3I,QACAA,gBAAMA,aAACA,QACPA,iBACFA,8CAH0DA,4BAErBA,kFCKxC,QAmBLjI,YAAmBgM,EAAsCC,EAAgCC,EAA+BC,GAArGhM,eAAsCA,aAAgCA,iBAA+BA,cAhBxHA,cAAqB,GAErBA,gBAAagE,SAAS0M,eAAe,eACrC1Q,mBAAgBgE,SAAS0M,eAAe,mBActC1Q,KAAK2Q,aAAe,IAAI7I,MAG1BjE,WACE7D,KAAKiQ,OACLjQ,KAAK4Q,QAAU,CACb,CAAC1E,KAAQ,UAAWiB,IAAO,MAC3B,CAACjB,KAAQ,UAAWiB,IAAO,MAC3B,CAACjB,KAAQ,UAAWiB,IAAO,MAC3B,CAACjB,KAAQ,UAAWiB,IAAO,MAC3B,CAACjB,KAAQ,UAAWiB,IAAO,MAC3B,CAACjB,KAAQ,UAAWiB,IAAO,OAIjC0D,YAAYhF,GACV7L,KAAK8Q,WAAa9Q,KAAK+Q,UAAUC,MAE5BhR,KAAK8Q,aACR9Q,KAAKiR,WAAW/M,UAAUgN,OAAO,6BACjClR,KAAKmR,aAAenN,SAAS+I,cAAc,KAC3C/M,KAAKmR,aAAaC,MAAMC,WAAa,OACrCrR,KAAKsR,iBAAmBtN,SAASuN,eAAevR,KAAK8Q,WAAa,0BAClE9Q,KAAKmR,aAAaK,YAAYxR,KAAKsR,kBACnCtR,KAAKiR,WAAWO,YAAYxR,KAAKmR,eAGnC,QAAQrF,EAAI,EAAGA,EAAI9L,KAAK8Q,WAAYhF,IAClC9L,KAAKyR,IAAMzN,SAAS+I,cAAc,OAClC/M,KAAKyR,IAAItE,IAAMuE,IAAIC,gBAAgB9F,EAAM+F,OAAOZ,MAAMlF,IACtD9L,KAAKyR,IAAIvN,UAAU2N,IAAI,qBACvB7R,KAAKiR,WAAWO,YAAYxR,KAAKyR,KAIrChB,YAAY5E,GAIV,GAHA7L,KAAK8R,cAAgBjG,EAAM+F,OAAOZ,MAElChR,KAAK+R,SAAW,GACZ/R,KAAK8R,eAAiB9R,KAAK8R,cAAc,GAAI,CAC/C,MAAMhG,EAAgB9L,KAAK8R,cAAc1D,OACzC,QAASrC,EAAI,EAAGA,EAAID,EAAeC,IAAK,CACtC,MAAMC,EAAS,IAAIgG,WAEnBhG,EAAOgB,OAAUwB,IACfxO,KAAK+R,SAAShE,KAAKS,EAAEoD,OAAOK,SAG9BjG,EAAOkG,cAAclS,KAAK8R,cAAc/F,MAKvCyE,OAAO3E,EAAOC,EAAgBC,GACnC,GAAIF,EAAM+F,OAAOZ,OAASnF,EAAM+F,OAAOZ,MAAM5C,OAAS,EAAG,CACvD,MAAMpC,EAAOH,EAAM+F,OAAOZ,MAAM,GAChChR,KAAKmS,QAAQtC,QAAQ7P,KAAKoS,UAAUC,uBAAuBrG,IAC3DhM,KAAK2Q,aAAanG,KAAM,CAAClE,OAAQ0J,UACjChQ,KAAKmS,QAAQ7D,WAAWtC,EAAMF,EAAQC,GAAOlH,UAC3C2J,IACE,GAAIA,GAAsB,IAAdA,EAAKG,KACf,OAAQH,EAAKG,WACN/F,oBACH5I,KAAK2Q,aAAanG,KAAM,CAAClE,OAAQ0J,cAAgCsC,WAAYrE,KAAKsE,MAAO/D,EAAKgE,OAAShE,EAAKiE,MAAS,OACrH,WACG7J,cACH5I,KAAKiQ,OACLjQ,KAAK0S,UAAUC,cAAcxG,MAAQ,GACrCnM,KAAK2Q,aAAanG,KAAM,CAAClE,OAAQ0J,eAMzCxB,IACExO,KAAK0S,UAAUC,cAAcxG,MAAQ,GACrCnM,KAAK2Q,aAAanG,KAAM,CAAClE,OAAQ0J,aAMzCC,OAAejQ,KAAKmQ,QAAU,IAAIvP,KAAKwP,+CAtG1BrI,GAAeD,sEAAfC,EAAe/C,0qBDb5B8C,iBACEA,iBAAOA,uDAAqDA,QAC1DA,iBACEA,cAAIA,8BAAsCA,QAC1CA,kBAAMA,iCAAUgE,+BACZhE,yBAKJA,QACFA,QACFA,eAXOA,2DAECA,gDAEwBA,28DEJhCA,iBAAuBA,8BAAsCA,eAAtCA,iDCWlB,gBAA8BpF,IAKnC7C,YAAsBgM,GAA6BI,QAA7BjM,WAHtBA,mBAAgB,IAAIgI,KAKpBnE,WACE7D,KAAK4S,OAAS,IAAI5J,IAClBhJ,KAAK6S,iBAGPC,OACE9S,KAAK2E,IAAIoO,WAAwB/S,KAAK4S,OAAQ,eAC7CrL,MAAK,OAAUvH,KAAKgT,gBAAgBnO,UAAWgH,IAC3CA,GAAM7L,KAAKqP,MAAM,+IAIxBwD,iBACE7S,KAAK2E,IAAIC,UAAuB,kBAC/B2C,MAAK,OAAUvH,KAAKgT,gBAAgBnO,UAAWgH,IAC3CA,IACH7L,KAAK4S,OAAS/G,EAAK,IACnBzF,QAAQ6E,IAAIY,4CAxBLpE,GAAeK,qCAAfL,EAAezC,wgCDZ5B8C,iBACEA,0BACAA,iBACEA,iBACEA,kBACEA,eAAKA,eAA8BA,QACnCA,4BACEA,qBAAOA,sFAAPA,QACAA,gBAA+EA,2CAAKA,QACtFA,QACFA,QACFA,QAEAA,mBACEA,mBACEA,gBAAKA,iBAA6BA,QAClCA,6BACEA,wBAAOA,qFAAPA,QACAA,gBAA6EA,2CAAKA,QACpFA,QACFA,QACFA,QAEAA,mBACEA,mBACEA,gBAAKA,iBAA4BA,QACjCA,6BACEA,wBAAOA,oFAAPA,QACAA,gBAA2EA,2CAAKA,QAClFA,QACFA,QACFA,QAEAA,mBACEA,mBACEA,gBAAKA,iBAA6BA,QAClCA,6BACEA,wBAAOA,qFAAPA,QACAA,gBAA6EA,2CAAKA,QACpFA,QACFA,QACFA,QAEAA,mBACEA,mBACEA,mBACEA,iBAA0BA,iBAAqBA,QACjDA,QACAA,6BACEA,wBAAOA,qFAAPA,QACAA,gBAA6EA,2CAAKA,QACpFA,QACFA,QACFA,QAEAA,mBACEA,mBACEA,gBAAKA,iBAA2BA,QAChCA,6BACEA,wBAAOA,oFAAPA,QACAA,gBAA2EA,2CAAKA,QAClFA,QACFA,QACFA,QAEFA,QAEIA,mBACEA,sBAAQA,gCAASgE,WACfhE,6CACFA,QACFA,QAEFA,eAxEMA,iCAMgFA,0EAAzEA,oCACJA,gDAAyB,iCASsDA,yEAA3EA,mCACJA,+CAAwB,gCASoDA,wEAAxEA,kCACJA,8CAAuB,+BASwDA,yEAA3EA,mCACJA,+CAAwB,gCAWuDA,yEAA3EA,mCACJA,+CAAwB,gCASoDA,wEAAxEA,kCACJA,8CAAuB,wiDE3DlCA,iBAAiDA,8BAAqCA,eAArCA,uEAChBA,mBAAqBA,8BAAqCA,eAArCA,uEA0C5CA,kBAAuDA,8BAA0CA,eAA1CA,+EACvDA,kBAAoGA,SAAmBA,wCAAnBA,4EAlBxGA,iBACEA,kBACEA,kBACAA,mBAAwBA,kCAA8BA,QACtDA,kBAQAA,sBAEOA,6DAAUA,EAAVyI,OAAUC,SAAe,QAAO/B,KAFvC3G,QAKAA,yBACAA,0BACFA,QACAA,kBAAOA,UAAcA,QACvBA,+CAlB4BA,kCAKnBA,+EAFAA,mBAWkBA,0CACGA,sEAErBA,iEA3CbA,cACEA,iBACEA,iBACEA,iBAQAA,qBAEOA,6DAAUA,EAAVyI,MAAUC,SAAe,WAAU/B,KAF1C3G,QAIFA,QACAA,kBACEA,kBACEA,SACFA,QACFA,QACFA,QACAA,iBACEA,0BAsBFA,QACFA,8CAvCWA,wFAFAA,mBAaHA,kFAKkBA,mCCVvB,iBAA6BpF,IAelC7C,YAAmBgM,EAAgCC,EACzCC,GACRE,QAFiBjM,aAAgCA,qBACzCA,iBANVA,mBAAgB,EAChBA,6BAA0B,EAOxBA,KAAK2Q,aAAe,IAAI7I,MAG1BjE,WACE7D,KAAKmD,iBAAkBnD,KAAKiQ,OAG9B9M,iBACQnD,KAAK+C,MAAMkQ,YAefjT,KAAKiT,WAAazO,KAAKC,MAAMD,KAAK0O,UAAUlT,KAAK+C,MAAMkQ,aACvDjT,KAAKmT,cAAgB,KACrBnT,KAAKiT,WAAWG,QAAQvH,IACtBA,EAAEwH,YAAc,iCAAmCxH,EAAEiD,KAAO,OAC5DjD,EAAEkD,MAAMqE,QAAQtH,IACdA,EAAIwH,SAAW,wBAA0BxH,EAAIgD,KAAO,aAnBxD9O,KAAKiT,WAAa,KAClBjT,KAAK2E,IAAIC,UAA6B,kBACnC2C,MAAK,OAAUvH,KAAKgT,gBACpBnO,UAAUgH,IACT7L,KAAKiT,WAAapH,EAClB7L,KAAK+C,MAAMkQ,WAAazO,KAAKC,MAAMD,KAAK0O,UAAUlT,KAAKiT,aACvDjT,KAAKiT,WAAWG,QAAQtH,IACtBA,EAAEuH,YAAc,iCAAmCvH,EAAEgD,KAAO,OAC5DhD,EAAEiD,MAAMqE,QAAQrH,IACdA,EAAIuH,SAAW,wBAA0BvH,EAAI+C,KAAO,cAcxD9O,KAAK+C,MAAMwQ,YACfvT,KAAKwT,gBAITA,gBACMxT,KAAK+C,MAAMgI,SAAkC,MAAvB/K,KAAK+C,MAAMgI,QACnC/K,KAAK2E,IAAI+F,gBAA4B,gBAAiB+I,OAAOzT,KAAK+C,MAAMgI,UACrExD,MAAK,OAAUvH,KAAKgT,gBACpBnO,UAAUgH,IACT7L,KAAK+C,MAAMwQ,WAAa1H,KAI5B7L,KAAK+C,MAAMwQ,WAAa,IAAI9R,IAC5BzB,KAAK+C,MAAMwQ,WAAWG,UAAY,iCAClC1T,KAAK+C,MAAMwQ,WAAWxI,QAAU,GAI7ByF,OAAO3E,EAAOC,EAAQC,GAC3B,GAAIF,EAAM+F,OAAOZ,OAASnF,EAAM+F,OAAOZ,MAAM5C,OAAS,EAAG,CACvD,MAAMpC,EAAOH,EAAM+F,OAAOZ,MAAM,GAChChR,KAAK2T,cAAc9D,QAAQ7P,KAAKoS,UAAUC,uBAAuBrG,IACjEhM,KAAK2Q,aAAanG,KAAM,CAAClE,OAAQ0J,UACjChQ,KAAK2T,cAAcrF,WAAWtC,EAAMF,EAAQC,GAAOlH,UACjD2J,IACE,GAAIA,EACF,OAAQA,EAAKG,WACN/F,oBACH5I,KAAK2Q,aAAanG,KAAM,CAAClE,OAAQ0J,cAAgCsC,WAAYrE,KAAKsE,MAAO/D,EAAKgE,OAAShE,EAAKiE,MAAS,OACrH,WACG7J,cACH5I,KAAK0S,UAAUC,cAAcxG,MAAQ,GACrCnM,KAAK2Q,aAAanG,KAAM,CAAClE,OAAQ0J,aACjChQ,KAAKO,OAAOC,SAAS,CAAC,kBACtBR,KAAK+C,MAAM6Q,uBAKnBpF,IACExO,KAAK0S,UAAUC,cAAcxG,MAAQ,GACrCnM,KAAK2Q,aAAanG,KAAM,CAAClE,OAAQ0J,aAMzC6D,eAAehI,GACb,OAAG7L,KAAK8T,UACC9T,KAAK+T,YAAc,IAAM/T,KAAK8T,WAEvC1N,QAAQ6E,IAAIY,EAAIwH,aACTrT,KAAK+T,aAEPC,eAAenI,GACpB7L,KAAK+T,YAAclI,EACnB7L,KAAK8T,WAAa,IAAIlT,MAAQqT,UAGhCL,qBACE,IAAI/H,EAAa7L,KAAKO,OAAOJ,IAC7BH,KAAKO,OAAO2T,cAAc,IAAK,CAACC,oBAAoB,IAAO3S,KAAK,KAC5DxB,KAAKO,OAAOC,SAAS,CAACqL,MAI5BoE,OACEjQ,KAAKmQ,QAAU,IAAIvP,KAAKwP,gDAvHfgE,IAActM,2DAAdsM,GAAcpP,swCDjB3B8C,iBAAqBA,iCAAUgE,yBAC7BhE,0BACAA,wCACAA,cACEA,wBA+CFA,QACFA,+BAnDUA,gDAA8B,cAGjBA,44GEQhB,SAMLjI,YAAoBgM,EAAuCC,GAAvC9L,eAAuCA,iBACzDA,KAAK2Q,aAAe,IAAI7I,MAGnB0I,OAAO3E,EAAOC,GACnB,GAAID,EAAM+F,OAAOZ,OAASnF,EAAM+F,OAAOZ,MAAM5C,OAAS,EAAG,CACvD,MAAMrC,EAAOF,EAAM+F,OAAOZ,MAAM,GAChChR,KAAKmS,QAAQtC,QAAQ7P,KAAKoS,UAAUC,uBAAuBtG,IAC3D/L,KAAK2Q,aAAanG,KAAM,CAAClE,OAAQ0J,UACjChQ,KAAKmS,QAAQ7D,WAAWvC,EAAMD,GAAQjH,UACpCmH,IACE,GAAIA,EACF,OAAQA,EAAK2C,WACN/F,oBACH5I,KAAK2Q,aAAanG,KAAM,CAAClE,OAAQ0J,cAAgCsC,WAAYrE,KAAKsE,MAAOvG,EAAKwG,OAASxG,EAAKyG,MAAS,OACrH,WACG7J,cACH5I,KAAK0S,UAAUC,cAAcxG,MAAQ,GACrCnM,KAAK2Q,aAAanG,KAAM,CAAClE,OAAQ0J,aACjChQ,KAAKqU,gBAAkB,wMAK/BrI,IACEhM,KAAK0S,UAAUC,cAAcxG,MAAQ,GACrCnM,KAAK2Q,aAAanG,KAAM,CAAClE,OAAQ0J,qDAhC9BsE,IAAexM,gDAAfwM,GAAetP,qcCZ5B8C,iBACEA,oBAAuFA,kDAASyM,UAAmBzM,4DAAQA,QAC3HA,qBAGEA,kCAAUgE,WAAe,UAH3BhE,QAKFA,cANUA,sCAAqB,+PCSxB,SAKLjI,YAAoBgM,kBAClB7L,KAAKwU,eAAiB,IAAI1M,MAGrB2M,WACLzU,KAAKwU,eAAehK,KAAM,CAAClE,OAAQ0J,UACnChQ,KAAKmS,QAAQ1E,aAAazN,KAAK+P,UAAUlL,UACvCgH,IACE,OAAQA,EAAK8C,WACN/F,sBACH5I,KAAKwU,eAAehK,KAAM,CAAClE,OAAQ0J,cAAgCsC,WAAYrE,KAAKsE,MAAO1G,EAAK2G,OAAS3G,EAAK4G,MAAS,OACvH,WACG7J,cACH5I,KAAKwU,eAAehK,KAAM,CAAClE,OAAQ0J,aACnC,MAAMlE,EAAiB,IAAI4I,KAAK,CAAC7I,EAAK5H,MAAO,CAAE0K,KAAM9C,EAAK5H,KAAK0K,OACzD5C,EAAI/H,SAAS+I,cAAc,KACjChB,EAAE4I,aAAa,QAAS,iBACxB3Q,SAASC,KAAKuN,YAAYzF,GAC1BA,EAAE0I,SAAWzU,KAAK+P,SAClBhE,EAAEJ,KAAO+F,IAAIC,gBAAgB7F,GAC7BC,EAAE6F,OAAS,SACX7F,EAAEwI,QACFvQ,SAASC,KAAK2Q,YAAY7I,KAIhCF,IACE7L,KAAKwU,eAAehK,KAAM,CAAClE,OAAQ0J,uCCzC3ClI,aAAyBA,sBAASA,kBAAQA,SAAeA,QAASA,8BAAxBA,8EAOtCA,cACEA,aACEA,iBAAOA,SAAQA,QACfA,0BAA+DA,2DAAkB0M,oBAAwB1M,QAC3GA,QACFA,8CAHWA,kBACOA,0CAAyB,2DDDlC+M,IAAiB/M,oCAAjB+M,GAAiB7P,0NEV9B8C,oBAIEA,gCAASgE,eAAYhE,oBAAQA,eAD7BA,8BAFAA,iDCQK,SASLjI,YAAmBgM,kBAEnBhI,WACE7D,KAAK2P,WAGPmF,aACK9U,KAAKgR,MAAM5C,OAAS,GAAGpO,KAAK+U,YAGzBpF,WACN3P,KAAKmS,QAAQxC,WAAW9K,UACtBgH,IACE7L,KAAKgR,MAAQnF,IAKnBkJ,YACE,QAASlJ,EAAQ,EAAGA,EAAQ7L,KAAKgR,MAAM5C,OAAQvC,IAAS,CACtD,MAAMC,EAAU9L,KAAKgR,MAAMnF,GAC3BzF,QAAQ6E,IAAIa,IAIT0I,eAAe3I,GACpB,OAAQA,EAAMvF,aACP0J,QACHhQ,KAAKgV,mBAAoB,EACzB,WACGhF,cACHhQ,KAAKiV,cAAe,EACpBjV,KAAKsS,WAAazG,EAAMyG,WACxB,WACGtC,WACHhQ,KAAKiV,cAAe,EACpB,WACGjF,QACHhQ,KAAKiV,cAAe,EACpBjV,KAAKgV,mBAAoB,GAKxBrE,aAAa9E,GAClB,OAAQA,EAAMvF,aACP0J,QACHhQ,KAAKkV,iBAAkB,EACvB,WACGlF,cACHhQ,KAAKiV,cAAe,EACpBjV,KAAKsS,WAAazG,EAAMyG,WACxB,WACGtC,WACHhQ,KAAKiV,cAAe,EACpBjV,KAAK2P,WACL,WACGK,QACHhQ,KAAKiV,cAAe,EACpBjV,KAAKkV,iBAAkB,2CApElBC,IAAoBrN,oCAApBqN,GAAoBnQ,kSFTjC8C,wBAAsCA,wCAAgBgE,oBAAsBhE,QAC5EA,sBAEAA,mBAAmDA,2JAA4BA,QAC/EA,mBAAiDA,qJAA2BA,QAE5EA,iBACEA,gBACEA,uBAMFA,QACFA,eAfYA,iCACRA,sCAEiBA,8CACAA,4CAIIA,kEGazB,MAAMsN,GACJ,CACE,CACAjU,KAAM,GAAIkU,UAAWtM,EACnBuM,SACA,CACE,CACEnU,KAAK,OAAQkU,UAAWhF,GAE1B,CACElP,KAAK,QAASkU,UAAWjB,IAE3B,CACEjT,KAAK,SAAUkU,UAAWtN,GAE5B,CACE5G,KAAK,SAAUkU,UAAW5N,IAG9B8N,sBAAuB,WA6BtB,iDAAMC,iEAFA,CAACpQ,GAAsBiD,SAXzB,CACPoN,cAAsBL,IACtBpU,KACAD,IACA2U,KACAC,KACAC,IACAC,KACAA,KACAjN,eAnBAG,EAAe,qBACfsH,EAGA+D,GAFArM,EACAN,GAAe,eAFf4I,EAAa,MAMb8E,IAAoB,oBAApBA,GAAoB,CAFpBb,GAAetT,UACf6T,IAAiB,wfCPrB,MAAM/U,EAAmB,CACvBgW,KACA/M,KACA0M,KACAG,KACAF,KACAC,KACAE,KACA9Q,KACA6D,KACAxD,KACAsD,KACA7C,KACAkQ,KACApP,KACA0J,KACAL,KACAxI,KACAqB,MACAC,MACAR,MACAW,MACAlB,KACAC,KACAC,KACAe,KACAK,KACAE,KACAb,KACAb,KACAiB,MACAkB,MACAvC,KAEI1H,EAAc,CAClB2C,KACAoF,KACA/G,KACAG,KACAuB,KACAuT,KACAlS,KACAyE,KACAkB,KACA7B,MAYK,iDAAM1H,4DATF,CACPH,EACAD,GAdF4C,KACAoF,KACA/G,KACAG,KACAuB,KACAuT,KACAlS,KACAyE,KACAkB,KACA7B,KA3CAkO,KACA/M,KACA0M,KACAG,KACAF,KACAC,KACAE,KACA9Q,KACA6D,KACAxD,KACAsD,KACA7C,KACAkQ,KACApP,KACA0J,KACAL,KACAxI,KACAqB,MACAC,MACAR,MACAW,MACAlB,KACAC,KACAC,KACAe,KACAK,KACAE,KACAb,KACAb,KACAiB,MACAkB,MACAvC,kCCzDK,mDAAMwO,gEAXA,CACLjV,KACAd,EACA2C,KAEAA,KAEAC,qBCaD,mDAAMoT,iEAFE,GAAE7N,SAlBJ,CACLrH,KACA6B,KACAA,KACA3C,EACA+V,GACAnT,kBAIA9B,KACA6B,KACAA,KACA3C,EACA+V,GACAnT,sGCLRqT,OAAOC,UAAUC,YAAc,SAAUtN,GACrC,MAAO,GAAGA,IAAY/I,QAE1BsW,MAAMF,UAAUG,QAAU,WACtB,SAAMvW,MAASA,KAAKoO,QAAU,IAKlCkI,MAAMF,UAAUI,MAAQ,SAAkBf,GACtC,MAAMG,EAAM,GAENF,EAAce,OAAOC,KAAKjB,GAC1BE,EAASc,OAAOC,KAAK1W,KAAK,IAChC,YAAKoT,QAAQyC,IACT,MAAM9Q,EAAMP,KAAKC,MAAMD,KAAK0O,UAAUuC,IACtCE,EAAOvC,QAAQxK,IACP8M,EAAYiB,KAAKvR,GAAMA,IAAOwD,KAC9B7D,EAAI6D,GAAOiN,EAAKjN,MAGxBgN,EAAI7H,KAAKhJ,KAEN6Q,GAEXgB,IAAIR,UAAUS,WAAa,SAAmC9N,EAAQ0M,GAClE,IAAIG,GAAQ,EACZ,OAAsB,IAAlB5V,KAAK8W,IAAI/N,KACT/I,KAAKmH,IAAI4B,EAAK,IACd6M,GAAQ,GAGZ5V,KADwB4P,IAAI7G,GACtBgF,KAAK0H,GACJG,wEClCJ,QAcH/V,cAZAG,mBAAgB,IAAI0C,UAahB1C,KAAK2E,IAAMlC,iBAAuB1B,KAClCf,KAAKO,OAASkC,iBAAuBzB,MACrChB,KAAK6J,cAAgBpH,iBAAuBqF,MAC5C9H,KAAK+W,UAAYtU,iBAAuBvB,MACxClB,KAAK2F,OAASlD,iBAAuBqB,MACrC9D,KAAKgX,UAAYvU,iBAAuB8F,MACxCvI,KAAKiX,QAAUxU,iBAAuBgH,KAE1CyN,cACIlX,KAAKgT,cAAcmE,OACnBnX,KAAKgT,cAAcoE,WAEvBvT,YAEAD,GAAG6R,GACa,WAARA,EAIJzV,KAAKO,OAAOC,SAAS,CAAC,IAAIiV,MAHtBzV,KAAK+W,UAAUM,OAKvB9T,UAAUkS,GACN,OAAOzV,KAAK6J,cAAc7D,QAAQyP,GAEtC6B,OAEI,MAAM1B,EADO,MACUS,YAAY,WACnCjQ,QAAQ6E,IAAI2K,GAEZ,MAAMD,EADM,CAAC,OACGY,UAChBnQ,QAAQ6E,IAAI0K,GAEhB/L,aAAa6L,GACT,MAAMG,EAAY5V,KAAK2F,OAAOC,KAAKoQ,KACnCJ,EAAU9P,kBAAkB8D,aAAa6L,GACzCG,EAAUzP,cAActB,UAAU6Q,IACf,OAAXA,GACF1V,KAAKyK,iBAMfA,gBAEA4E,MAAMoG,GACFzV,KAAKgX,UAAUpR,KAAK6P,EAAS,KAAM,CAC/B8B,SAAU,MAGlBC,aAAa/B,EAASG,EAAgBF,GAC9BD,aAAmBa,MACnBb,EAAQrC,QAAQ,CAACuC,EAASE,KACtB/I,WAAW,KACP9M,KAAKgX,UAAUpR,KAAK+P,EAAQ8B,KAAM7B,EAAQ,CACtC2B,SAAU,IACVG,iBAAkB,SAClBC,mBAAoB,MACpBC,WAAY,CAAClC,MAET,KAATG,KAGP7V,KAAKgX,UAAUpR,KAAK6P,EAAQgC,KAAM7B,EAAQ,CACtC2B,SAAU,IACVG,iBAAkB,SAClBC,mBAAoB,MACpBC,WAAY,CAAClC,4CAlFhBI,8BAAa9Q,qEAHX4C,gBAAMA,uBAAWA,mICJhC,MAAMiQ,EACHC,IACC,MAAMC,EAAQD,EAAwBE,SAASC,KAAKH,GACpD,MAAoB,mBAATC,EACDtV,GAAuBsV,EAAKtV,GAEGqV,GAGhCI,EACVC,GACmB,MAAdA,GAA4C,IAAtBA,EAAW/J,OAC5B,KAEFgK,aAAmBD,EAAWE,IAAIR,mBCdvC,QAyCJhY,YACUsY,EACAG,GADAtY,kBACAA,uBAxCVA,mBAAgB,IAAIuY,KAGVvY,iBAAc,IAAIwY,MAInBxY,eAAoB,EACpBA,aAAkB,EAClBA,eAAoB,EACpBA,cAAmB,OAMnBA,eAAoB,EAQpBA,eAAoB,sBACpBA,gBAAqB,oBACrBA,gBAAqB,oBAEvBA,cAAW,CAChByY,MAAO,2DACPtY,IAAK,iEACLuY,OAAQ,oBACRC,UAAW,iBACXC,aAAc,eACdC,WAAY,kBACZC,OAAQ,SACRC,OAAQ,qCAfNC,iBACF,OAAOhZ,KAAKiZ,SAoBd/B,cACKlX,KAAKgT,gBAENhT,KAAKgT,cAAcmE,OACnBnX,KAAKgT,cAAcoE,YAGvBvT,YAEAqV,OAAOC,GACLnZ,KAAKmM,MAAQgN,EACbnZ,KAAKoZ,YAAY5O,KAAK2O,GAEdnB,WDzCV,EAACG,EAA4BG,IACnBe,GAEFf,EAEKgB,EADkChB,EAClCgB,CAAeD,GAQpBlB,KACKoB,MAZsBrB,EAAkBC,EAAlBD,CAA8BmB,KActDE,QAAG,MC0BJvB,CAAShY,KAAKmY,WAAYnY,KAAKsY,gBAA/BN,CAAgDhY,KAAKwZ,MAAMH,SACnE,OAAO,KAEDI,cACFzZ,KAAKmM,OAASnM,KAAKgZ,YAAchZ,KAAK0Z,SAAS1Z,KAAKgZ,aAAehZ,KAAKwZ,MAAMH,QAAQM,QAC5E,IAAIC,OAAO5Z,KAAK0Z,SAAS1Z,KAAKgZ,aAC/B1B,KAAKtX,KAAKmM,MAAMyC,aACzB5O,KAAKwZ,MAAMH,QAAQQ,UAAU,CAAEC,SAAS,KAItCC,YACF/Z,KAAKga,KAAOvG,OAAOzT,KAAKmM,OAASsH,OAAOzT,KAAKga,MAC/Cha,KAAKwZ,MAAMH,QAAQQ,UAAU,CAAEG,KAAK,IAClCha,KAAKia,KAAOxG,OAAOzT,KAAKmM,OAASsH,OAAOzT,KAAKia,MAC/Cja,KAAKwZ,MAAMH,QAAQQ,UAAU,CAAEI,KAAK,IAE7BH,cAIT,OAHA9Z,KAAKyZ,cACgB,UAAjBzZ,KAAKka,UACPla,KAAK+Z,YACgB,MAAnB/Z,KAAKgY,WACA,KAEFhY,KAAKgY,WAAWzQ,QAAK8Q,KAAI/H,GAAKmG,OAAOC,KAAKpG,GAAK,IAAIlC,OAAS,IAE1D+L,eACT,OAAuB,MAAnBna,KAAKgY,WACA,KAEFhY,KAAKgY,WAAWzQ,QAAK8Q,KAAI/H,GAAKmG,OAAOC,KAAKpG,GAAG+H,IAAI3P,GDrDrC,EAACoP,EAA6BsC,KACnD,OAAQA,OACD,WACH,MAAO,2BACJ,UACH,MAAO,4CACJ,YACH,MAAO,iCACJ,YACH,MAAO,8CACJ,MACH,MAAO,qCACJ,MACH,MAAO,8BAEX,MACO,iBADQtC,EAAUsC,GAENtC,EAAUsC,GAElB,sBAAsBA,KCkC8B7U,CAAQ+K,EAAG5H,6CAzFtD2R,GAAoBC,MA0ClBhE,OAAKgE,MACAhE,iCA3CP+D,EAAoBE,mWCAnC,QACHvC,SAAStJ,GAEL,IAAKA,EAAQvC,MACT,OAAO,KAEX,MAAMmD,EAAQZ,EAAQvC,MAAMqO,OAC5B,MALmB,oBAKJlD,KAAKhI,GACT,KAEJ,CAAEmL,YAAa,0FChBxB3S,eAAsCA,SAAWA,kCAAXA,yDDM/BiB,8BAAyB/D,+DAJvB,CACP,CAAEkD,QAAShH,KAAewZ,YAAa3R,EAA2BX,OAAO,QCO1E,+CAAMwN,8BAAmB5Q,oJAX5B8C,iBACEA,uBACFA,eAD2BA,4WCOzB,gBAA+BuS,EAInCxa,YAGEsY,EAGAG,GACArM,MAAMkM,EAAYG,0CAXTqC,GAAeL,MAMhBM,KAAa,SAGbC,KAAmB,6BATlBF,EAAe3V,gEACf8V,KAAO,qGALP,CACT,CAAE5S,QAAS6S,KAAmBL,YAAaC,EAAiBvS,OAAO,KACpEkS,gICVHA,oBAOIA,sBAA0HA,SAASA,QACvIA,eAPQA,mBACAA,qBACAA,6BACAA,gFAGMA,0FAAgHA,irCCKvH,QAEeN,QAAItL,GACtB1O,KAAKgb,WAAa9Z,SAAe+Z,SAASvM,EAAO,KAE5CsJ,SAAStJ,GACd,OAAO1O,KAAKgb,WAAWtM,0CANdhG,8BAAY1D,4IARZ,CACT,CACEkD,QAAShH,KACTwZ,YAAahS,EACbN,OAAO,QAuBN,QAEe6R,QAAIvL,GACtB1O,KAAKgb,WAAa9Z,SAAe+Z,SAASvM,EAAO,KAE5CsJ,SAAStJ,GACd,OAAO1O,KAAKgb,WAAWtM,2BC5BnB4L,kBAAqCA,eAAEA,kCAwBvCA,kBACIA,gBAAMA,SAAQA,QAClBA,yCAFyDA,oCAC/CA,iDAGNA,gBACIA,8BACJA,+BADIA,2FAEJA,gBACIA,8BACJA,+BADIA,0FAEJA,gBACIA,8BACJA,+BADIA,mIAEJA,gBACIA,8BACJA,+BADIA,mIAEJA,gBACIA,8BACJA,+BADIA,+IAdRA,kBACIA,yBAGAA,yBAGAA,yBAGAA,0BAGAA,0BAGJA,yCAhBgEA,sCACrDA,yCAGAA,sEAGAA,0EAGAA,0EAGAA,6IDlBNzU,8BAAYb,4IARZ,CACT,CACEkD,QAAShH,KACTwZ,YAAa7U,EACbuC,OAAO,QEZP,iBAA8BiS,EA0ChCxa,YACuCsY,EACMG,EACjC4C,GAERjP,MAAMkM,EAAYG,GAFVtY,WAzBHA,kBAAuB,KACvBA,gBAAqB,EACpBA,uBAAuC,IAAIwY,MA0B5CxY,KAAKmb,eACNnb,KAAKmb,aAAe,MA/C5BC,OACIpb,KAAKqb,QAAUrb,KAAKqb,OAExBC,gBACItb,KAAKqb,QAAS,EACdrX,SAAS0M,eAAe1Q,KAAKkM,MAAMqP,QAEvCC,qBACSxb,KAAKmM,OAAuB,IAAdnM,KAAKmM,SACpBnM,KAAKqb,QAAS,GAgBlBI,gBAAYtP,GACZ,GAAIA,GAA0B,UAAjBnM,KAAKka,UAAoE,SAA5Cla,KAAK0b,UAAU9M,WAAWpJ,cAA0B,CAC1F,IAAImW,EAAQxP,EAAMyC,WAAWnI,MAAM,KACnCkV,EAAM,GAAKA,EAAM,GAAGjV,QAAQ,KAAM,IAAIA,QAAQ,wBAAyB,KACvE1G,KAAKmM,MAAQwP,EAAMtN,KAAK,UAGxBrO,KAAKmM,MAAQA,EAEjBsP,kBACA,MAAqB,UAAjBzb,KAAKka,UAAoE,SAA5Cla,KAAK0b,UAAU9M,WAAWpJ,cAChDiO,OAAOzT,KAAKmM,MAAMzF,QAAQ,KAAM,KAEpC1G,KAAKmM,MAYhByP,SAASzP,GACDA,GAA0B,UAAjBnM,KAAKka,UAAoE,SAA5Cla,KAAK0b,UAAU9M,WAAWpJ,eAChExF,KAAKoZ,YAAY5O,KAAKxK,KAAKmM,MAAMzF,QAAQ,KAAM,KAC/C1G,KAAK6b,kBAAkBrR,KAAKxK,KAAKyb,eAGjCzb,KAAKmM,MAAQ2P,mBAAkC9b,KAAKmM,OACpDnM,KAAKoZ,YAAY5O,KAAKxK,KAAKmM,OAC3BnM,KAAK6b,kBAAkBrR,KAAKxK,KAAKyb,sDA5DhCM,IAAczB,MA2CCM,KAAa,SACbC,KAAmB,yCA5ClCkB,GAAc/W,+DAuBZ8V,KAAO,iRA5BP,CACP,CAAE5S,QAAS6S,KAAmBL,YAAaqB,GAAgB3T,OAAO,KACrEkS,glBDZLA,iBACIA,iBAGKA,gCAAS0B,mBAAT1B,CAAyB,0BAChB0B,mBADT1B,CAAyB,6BAEb0B,uBAEb1B,kBAA+CA,SAASA,QACxDA,yBACJA,QACAA,iBACIA,qBAAOA,gCAAS0B,mBAAT1B,CAAyB,6BACb0B,sBADZ1B,CAAyB,gDAAzBA,CAAyB,gDAAzBA,CAAyB,oCAoBR0B,iBApBxB1B,QAqBAA,uBAGAA,wBAiBJA,QArDJA,+BAAqBA,oCACZA,6CAA0C,iBAA1CA,CAA0C,iDAOzBA,uCAA6BA,wBAC3BA,kCAMbA,qCAA2B,8BAE3BA,yBACAA,mBAEAA,6BAEAA,qBACAA,+BACAA,mBACAA,mBACAA,+BAEAA,6BAEAA,qCACAA,2BAZAA,yBAAmB,mBAcGA,0CAGCA,qvEE4F/B,SChHA,IAAIvO,wCDgHED,6DAHE,GACVzD,SA5EQ,CACLW,KACA0M,KACAnM,KACA1B,KACAmC,MACAvC,KACAhG,KACA1B,KACAG,KACA2C,KACAoF,KACAnF,MACA6S,KACAM,KACAC,MACA+F,MACAC,MACAC,MACA/H,MACAgI,MACAC,MACAH,MACA5H,MACAgI,MACAzH,MACA0H,MACAC,MACA1c,KACAqV,MACAsH,MACArH,MACAI,MACAlF,KACAtI,KACA6D,KACAxC,KAGAL,KACA0M,KACAnM,KACA1B,KACAmC,MACAvC,KACAhG,KACA1B,KACAG,KACA2C,KACAC,MACA6S,KACAM,KACAC,MACA+F,MACAC,MACAC,MACA/H,MACAgI,MACAC,MACAH,MACA5H,MACAgI,MACAzH,MACA0H,MACAC,MACA1c,KACAqV,MACAsH,MACArH,MACAI,MACAlF,KACAtI,KACA6D,KACAxC,OC1GR,MAQMmF,EAAY,CACdpJ,KAuBG,QACHvF,YAAoB6O,mBAChB3C,EAAc/L,KAAK0H,0BAGnB,MAAO,CACHgV,SAAUjO,EACVkO,UAAW,IAAInO,2CAPdC,GAAc3G,uCAAd2G,iCAJE,IACJD,GACNnG,SAhBQ,CACLrH,KACAE,KACA6G,KACA+D,EACApJ,MAGA1B,KACAE,KAEA4K,EACApJ,0CCvCD,MAAM1B,EAAc,CACvB4b,YAAY,EACZC,QAAS,KACTC,SAAU,mFCAVlU,eACA,WAGJ5H,OAAyB+b,gBAAgB7b,KACpC8b,MAAMhH,GAAO5P,QAAQC,MAAM2P,qBCZhC,IAAYhV,8BAAiB,KACzB0B,qBACAA,qBACAA,6CACAA,4DCJJ,IAAY1B,IAcA0B,4BAdAoF,QAAS,KACjBA,eACAA,qBACAA,mCACAA,uBACAA,yBACAA,mBACAA,6BACAA,6CACAA,uDACAA,6DACAA,sDAGJ,SAAYA,GACRA,mBACAA,qBACAA,yBACAA,uBAJJ,CAAYpF,MAAe,mECZpB,QAoDL7C,cACEG,KAAKid,IAAM,EACXjd,KAAKkd,UAAY,GACjBld,KAAKmd,GAAK,EACVnd,KAAKod,MAAQ,EACbpd,KAAKsG,OAAS,EACdtG,KAAKqd,WAAa,KAClBrd,KAAKsd,aAAe,GACpBtd,KAAKud,cAAgB,EACrBvd,KAAKwd,gBAAkB,EACvBxd,KAAKyd,eAAiB,EACtBzd,KAAK0d,cAAgB,EACrB1d,KAAK2d,eAAiB,EACtB3d,KAAK4d,UAAY,EACjB5d,KAAK6d,WAAa,EAClB7d,KAAK8d,cAAgB,EACrB9d,KAAK+d,YAAc,GACnB/d,KAAKge,WAAa,EAClBhe,KAAKie,YAAc,GACnBje,KAAKke,cAAgB,GACrBle,KAAKme,aAAe,GACpBne,KAAKoe,gBAAkB,GACvBpe,KAAKqe,cAAgB,GACrBre,KAAKse,cAAgB,GACrBte,KAAKue,gBAAkB,EACvBve,KAAKwe,QAAU,EACfxe,KAAK+K,QAAU,GACf/K,KAAK0T,UAAY,GACjB1T,KAAKye,aAAe,GACpBze,KAAK0e,KAAO,GACZ1e,KAAK2e,WAAa,GAClB3e,KAAK4e,SAAW,KAChB5e,KAAK6e,SAAW,EAChB7e,KAAK8e,KAAO,GACZ9e,KAAK+e,WAAa,GAClB/e,KAAKgf,aAAe,EACpBhf,KAAKif,aAAe,EACpBjf,KAAKkf,IAAM,EACXlf,KAAKmf,aAAe,GACpBnf,KAAKof,SAAU,EACfpf,KAAKqf,YAAc,KACnBrf,KAAKsf,oBAAsB,MAIxB,QA4BLzf,cACEG,KAAKid,IAAM,EACXjd,KAAKuf,OAAS,EACdvf,KAAKwf,SAAW,EAChBxf,KAAKod,MAAQ,EACbpd,KAAKyd,eAAiB,EACtBzd,KAAK0d,cAAgB,EACrB1d,KAAK4d,UAAY,EACjB5d,KAAK8d,cAAgB,EACrB9d,KAAK+d,YAAc,GACnB/d,KAAKie,YAAc,GAEnBje,KAAK0T,UAAY,GACjB1T,KAAKye,aAAe,GACpBze,KAAK2e,WAAa,GAClB3e,KAAK4e,SAAW,EAChB5e,KAAKsd,aAAe,GAEpBtd,KAAKyf,cAAgB,GACrBzf,KAAKqf,YAAc,EACnBrf,KAAK0f,UAAY,GACjB1f,KAAK2f,WAAa,GAIf,QAWL9f,cAEEG,KAAK4f,aAAe,EACpB5f,KAAKkM,KAAO,GAEZlM,KAAK6f,IAAM,EACX7f,KAAK8f,UAAY,EACjB9f,KAAK+f,IAAM,IAGR,4CC7KA,4CCAA,QAUHlgB,cACIG,KAAKggB,UAAU,GACfhgB,KAAKigB,SAAS,GACdjgB,KAAKkgB,QAAQ,GACblgB,KAAKmgB,SAAS,GACdngB,KAAKogB,SAAS,GACdpgB,KAAKqgB,QAAQ,uCChBd,gDCAKvc,0FAAS,KACjB2R,iBACAA,qBACAA,mBACAA,sECiBG,QA6BL5V,YACS+V,EACCF,EACAC,EACDE,GAHA7V,WACCA,aACAA,aACDA,cARFA,iBAAsB,EAE7BA,cAAW,GASX6D,WACE7D,KAAKsgB,SACHtgB,KAAKugB,MAAMC,aAAexgB,KAAKugB,MAAMC,YAAYlL,SACjDtV,KAAKygB,cAAczgB,KAAKugB,MAAMC,YAAYlL,UAC1C,GAIJmL,cAAc7K,GACZ,OAAQA,EACL8K,OAAOhL,GAASA,EAAMiL,MACtBtI,IAAI,EAAGlX,OAAO,GAAIwf,WAAY,CAC7Bxf,KAAMuU,EACNkL,MAAOjL,EAAKiL,MACZC,KAAMlL,EAAKkL,QAIjBC,aAAalL,GACX,MAAMF,EAAaE,EAAImL,eAAeC,MAEtC,OAAOhhB,KAAKO,OAAO0gB,SAASvL,EAAWwL,SAAS,GAG3C/d,iBACL,OAAOnD,KAAK2E,IAAIC,UAA6B,kBAAkB2C,QAC7DO,KAAK8N,IACH5V,KAAKiT,WAAa2C,EACX5V,KAAKiT,gBAEdlS,KAAY6U,MACHlT,MAAG,QAGTye,4BACL,OAAOnhB,KAAK2E,IAAIC,UAA6B,6BAA6B2C,QACxEO,KAAK8N,IACH5V,KAAKiT,WAAa2C,EACX5V,KAAKiT,gBAEdlS,KAAY6U,MACHlT,MAAG,QAGT0e,YACLphB,KAAKiT,WAAa,GAClBjT,KAAKqhB,MAAQ,GACbrhB,KAAKshB,WAAa,KAClBthB,KAAKuhB,aAAe,GACpBvhB,KAAKwhB,YAAc,GAerBC,mBACEzhB,KAAKuhB,aAAe,KACpBvhB,KAAKuhB,aAAe,GACpB,MAAM3L,EAAS,IAAI5U,KACnBhB,KAAKuhB,aAAaxT,KAAK6H,GACvB5V,KAAKuhB,aAAa,GAAGjb,OAASpF,SAC9BlB,KAAKuhB,aAAa,GAAGxC,WAAatc,sBAClCzC,KAAKuhB,aAAa,GAAG1C,SAAW7e,KAAK0hB,UAAU5S,KAC/C9O,KAAKuhB,aAAa,GAAG5C,WAAa3e,KAAK0hB,UAAUxV,KACjDlM,KAAK2hB,YAAc,IAAI3L,KAElBhT,aAEL,GADAhD,KAAK4hB,MAAMC,WAAW,WACjB7hB,KAAK6K,QACR,OAAO,KAET7K,KAAK2E,IAAI+F,gBAA8B,UAAW,GAAG7F,UAAU+Q,IAE7D,OADA5V,KAAK6K,QAAU+K,EACP5V,KAAK6K,QAAQiX,sBACdhe,OACH9D,KAAK+hB,SAAS,QACd,WACGje,QACH9D,KAAK+hB,SAAS,SACd,WACGje,OACH9D,KAAK+hB,SAAS,QACd,WACGje,SACH9D,KAAK+hB,SAAS,UAGlB/hB,KAAK4hB,MAAMle,kBAAkB1D,KAAK6K,QAAS,aAG/CP,sBACEtK,KAAK2E,IAAIC,UAAe,6BAA6BC,UAAW+Q,IAC9D5V,KAAKgiB,uBAAyBpM,IAGlCmM,SAASnM,GACP,GAAKA,EAIE,CACL,IAAIF,EAAuB1V,KAAK4hB,MAAM7d,QAAQ,SAC1C2R,GACF1R,SAASie,gBAAgB/d,UAAUgN,OAAOwE,GAE5C1V,KAAK4hB,MAAMle,kBAAkBkS,EAAO,SACpC5R,SAASie,gBAAgB/d,UAAU2N,IAAI+D,QATvCA,EAAQ,SACR5V,KAAK4hB,MAAMle,kBAAkBkS,EAAO,SACpC5R,SAASie,gBAAgB/d,UAAU2N,IAAI+D,GASzC5V,KAAKkiB,aAAetM,EAGtBuM,YAAYvM,GACV,OAAQA,QACD,EACH5V,KAAKO,OAAOC,SAAS,CAAC,iBACtB,WACG,EACHR,KAAKO,OAAOC,SAAS,CAAC,kBACtB,WACG,EACHR,KAAKO,OAAOC,SAAS,CAAC,mBACtB,WACG,EACDR,KAAKO,OAAOC,SAAS,CAAC,mBACxB,cAEAR,KAAKO,OAAOC,SAAS,CAAC,aAKrBoT,qBACL,IAAIgC,EAAa5V,KAAKO,OAAOJ,IAC7BH,KAAKO,OAAO2T,cAAc,IAAK,CAACC,oBAAoB,IAAO3S,KAAK,KAC5DxB,KAAKO,OAAOC,SAAS,CAACoV,6CAnLjB7M,GAAgBR,0EAAhBQ,EAAgB9H,QAAhB8H,EAAgB,qBAFf,2HCPP,QASLlJ,YAAoB4J,EAAkC7B,GAAlC5H,WAAkCA,aAR9CA,iBAAc,IACdA,cAAW,SACXA,wBAAqB,mBACtBA,iBAAa,EAGbA,cAAW,IAAI0C,UAKtB0f,oBAAoB3Y,EAAkB7B,GACpC,IAAIkO,EACJ,SAAO9V,KAAKqiB,MAAM3B,OAChB3X,GAAKhI,mBAAkCgI,EAAEmD,QAAUnL,mBAAkC0I,IACnF1I,mBAAkCgI,EAAEuZ,YAAcvhB,mBAAkC6G,IAEpE,IAApBkO,EAAS1H,QACPpO,KAAKuiB,YAAa,EAClBviB,KAAKwiB,aAAe1M,EAAK,IAEzB9V,KAAKuiB,YAAa,EAEbviB,KAAKuiB,WAEdliB,iBACE,OAAOL,KAAKuiB,WAEdE,iBACE,OAAOziB,KAAK0iB,YAEdpiB,eAAemJ,GACbzJ,KAAK0iB,YAAcjZ,EAErBhJ,cACE,OAAOT,KAAK8c,SAEd6F,kBACE,OAAO3iB,KAAKwiB,aAEdI,wBACE,OAAO5iB,KAAK6iB,mBAEdC,aACE9iB,KAAKuiB,YAAa,EAEpBQ,YAAYtZ,EAAO7B,GACjB,IAAIkO,EAAY,IAAIlV,KAAK6I,GAGzB,OAFc,IAAI7I,KAAKgH,GACJqM,UAAY6B,EAAU7B,WAC1B,MAEjB+O,iBACEhjB,KAAKijB,SAAS9L,OACdnX,KAAKijB,SAAS7L,WACVpX,KAAKkjB,mBACPljB,KAAKkjB,kBAAkBC,cAEzBnjB,KAAKojB,aAEPA,aACEpjB,KAAKkjB,mBAAoB,OAAM,MAC5B3b,MACC,OAAUvH,KAAKijB,WAEhBpe,UAAU,KACTR,OAAOqH,SAAS2X,kDAnEXvf,GAAW5C,kDAAX4C,EAAW7C,QAAX6C,EAAW,qBAFV,yDCRP,QAAwBwf,sBACEviB,GACzB,IAAMA,EACF,OAAOA,EAEX,QADIG,EAAI,GACCuB,EAAI,EAAGA,GAAK1B,EAAKqN,OAAQ3L,IAC9B,GAAI1B,EAAK0B,GACL,OAAQ1B,EAAK0B,SACJ0T,OAAOoN,aAAa,MACrBriB,GAAQiV,OAAOoN,aAAa,MAC5B,WACCpN,OAAOoN,aAAa,WACpBpN,OAAOoN,aAAa,MACrBriB,GAAQiV,OAAOoN,aAAa,MAC5B,cAEAriB,GAAKH,EAAK0B,GAK1B,OAAMvB,GACKH,yCAtBN2B,gCAAkBzB,QAAlByB,EAAkB,kFCOxB,QAAe4gB,+BAuDoBtN,GAClC,MAAMlS,EAAsB,GAE5B,GAAIkS,aAAgBtT,KAAkB,CAClC,GAAI1C,KAAKwjB,eAAexN,GACpBlS,EAAUiK,KAAK,GAAG/N,KAAKyjB,0BAA0BzjB,KAAK0jB,8BAA8B1jB,KAAK2jB,8BACtF,CACH,MAAMpb,EAAiBvI,KAAK4jB,gBAAgB5N,GAE5C,GAAIzN,IAA6C,iBAAnBA,GAA+BA,aAA0BkO,QACnF,UAAWhN,KAAOlB,EACVkB,EACA3F,EAAUiK,KAAK,GAAGtE,IAAMzJ,KAAK0jB,8BAA8Bnb,EAAekB,MACnElB,EAAekB,IACtB3F,EAAUiK,KAAKxF,EAAekB,GAAKmF,YAM9C9K,EAAUsK,SACN4H,EAAa/R,MACdH,EAAUiK,KAAK,SAAUiI,EAAa/R,QAGrC+R,EAAa3P,OACdvC,EAAUiK,KAAK,UAAWiI,EAAa3P,UAiBnD,GAZKvC,EAAUsK,SACPpO,KAAK4jB,gBAAgB5N,GACrBlS,EAAUiK,KAAK/N,KAAK4jB,gBAAgB5N,GAAMpH,YAE1C9K,EAAUiK,KAAKiI,EAAKpH,aAIxB5O,KAAK6jB,kBAAkB7N,IACvBlS,EAAUggB,OAAO,EAAG,EAAG,GAAG9jB,KAAK+jB,6BAA6B/jB,KAAK0jB,8BAA8B1jB,KAAKgkB,6BAGpGhkB,KAAKikB,cAAcjO,GAAO,CAC1B,IAAIzN,EAAU,GAAGvI,KAAKkkB,yBAAyBlkB,KAAK0jB,8BAA8B1jB,KAAKmkB,wBACnFnO,EAAK7V,MACLoI,GAAW,KAAKyN,EAAK7V,OAGzB2D,EAAUggB,OAAO,EAAG,EAAGvb,GAG3B,OAAOzE,gCAG0BkS,GAQjC,OANIjV,EAAUqjB,wBAAwBrjB,EAAU0iB,wBAAyBzN,IACrEjV,EAAUqjB,wBAAwBrjB,EAAUmjB,uBAAwBlO,IACpEjV,EAAUqjB,wBAAwB,oBAAqBpO,IACvDjV,EAAUqjB,wBAAwB,QAASpO,IAC3CjV,EAAUsjB,wBAAwBrO,GAAM3H,sCAKV2H,EAAuBlS,EAA+ByE,GAAqB,EAAMkB,GAAyB,GAC5I,MAAM7B,EAAeoO,EAAcxQ,cAC7BsQ,EAAe9V,KAAKqkB,wBAAwBvgB,GAElD,UAAWiF,KAAW+M,EAAc,CAChC,MAAML,EAAc1U,EAAUujB,WAAWvb,EAAS/I,KAAK0jB,4BAEvD,GAAIjO,EAAY8O,YAA2E,IAA9D9O,EAAY8O,UAAU/e,cAAcgf,QAAQ5c,GACrE,OAAO6B,EAAyBV,EAAU0M,EAAYgP,YAAchP,EAAY8O,UAIxF,IAAKhc,EACD,UAAWQ,KAAW+M,EAClB,IAAoD,IAAhD/M,EAAQvD,cAAcgf,QAAQ5c,GAAsB,CACpD,GAAI6B,EACA,OAAOV,EACJ,CACH,MAAM0M,EAAc1U,EAAUujB,WAAWvb,EAAS/I,KAAK0jB,4BACvD,OAAOjO,EAAYgP,YAAchP,EAAY8O,WAM7D,OAAO,4BAGmBvO,GAC1B,OAAIA,aAAoBtT,KACbsT,EAAS/R,KAGhB+R,aAAoBtT,KACbsT,EAAS3P,OAAS2P,EAASzQ,SAAWyQ,EAAS0O,gBAD1D,EAC0DpB,sBAIjCtN,GACzB,OAAIA,aAAoBtT,MACO,IAApBsT,EAAS1P,OAGbgd,yBAGqBtN,GAC5B,OAAIA,aAAoBtT,MACO,MAApBsT,EAAS1P,OAGbgd,qBAGiBtN,GACxB,OAAIA,aAAoBtT,MACO,MAApBsT,EAAS1P,OAGbgd,wBAGoBtN,EAAalS,GACxC,GAAIkS,EAAK,CACL,MAAMzN,EAAW,IAAImJ,IAAIsE,EAAKlS,GAC9B,MAA6B,cAAtByE,EAASoc,UAAkD,cAAtBpc,EAASoc,SAGzD,OAAO,kCAG4B3O,GACnC,IAAKA,EACD,OAAO,KAGX,MAAMlS,EAAoC,GAE1C,UAAWyE,KAASyN,EAAYvP,MAAM,KAAM,CACxC,MAAMgD,EAAW1I,EAAUujB,WAAW/b,EAAO,KAC7CzE,EAAO2F,EAAS8a,WAAa9a,EAASgb,WAG1C,OAAO3gB,oBAGckS,EAAclS,GACnC,MAAMyE,EAAiByN,EAAKwO,QAAQ1gB,GAEpC,IAAuB,IAAnByE,EACA,MAAO,CAAEgc,UAAWvO,EAAMyO,WAAY,MAM1C,MAAO,CAAEF,UAHKvO,EAAK4O,OAAO,EAAGrc,GAAgBiS,OAGlBiK,WAFbzO,EAAK4O,OAAOrc,EAAiB,GAAGiS,QAEP8I,qBAGftN,GACxB,IAAIlS,EAEJ,IACI,SAASU,KAAK0O,UAAU8C,GACjBlS,QACF2F,IAGT,MAAMlB,EAAe,GAErB,UAAWkB,KAAQuM,GACVA,EAAO6O,eAAepb,IAGG,iBAAlBuM,EAAOvM,IAGW,mBAAlBuM,EAAOvM,KAGnBlB,EAAakB,GAAQuM,EAAOvM,IAGhC,SAAS,6BAA+BjF,KAAK0O,UAAU3K,GAEhDzE,sBAGgBkS,GACvB,IACI,OAAOxR,KAAKC,MAAMuR,SACblS,GACL,MAAc,cAAVkS,OACA,EAEGA,4BAIiBA,GAC5B,UAAWlS,KAAQkS,EACf,GAAIA,EAAI6O,eAAe/gB,GACnB,OAAO,EAIf,OAAO,yBAGmBkS,GAC1B,YAAwB,IAAVA,EAAUsN,oBAIDtN,GACvB,MAAwB,iBAAVA,GAAsBA,aAAiBG,oCAGrBH,GAChC,OAAIA,GACOA,EAAKhI,OAAO,GAAG8W,cAAgB9O,EAAK+O,MAAM,sBAM/B/O,GACtB,OAAOA,EAAKtP,QAAQ,SAAW5C,GACpBA,EAAUkK,OAAO,GAAG8W,cAAgBhhB,EAAU8gB,OAAO,GAAGpf,kCAM7CwQ,GACtB,GAAIA,aAAiBM,MAAO,CACxB,MAAMxS,EAAyB,GAE/B,QAASyE,EAAI,EAAGA,EAAIyN,EAAM5H,OAAQ7F,IAC9BzE,EAAayE,GAAKyN,EAAMzN,GAAG/C,cAG/B,OAAO1B,KACiB,iBAAVkS,GAAsBA,aAAiBG,OACrD,OAAOH,EAAMxQ,gCAKjB,OAAOxF,KAAKglB,aAAa,IAAS,KAASpW,+BAGpBoH,EAAalS,GACpC,OAAOmK,KAAKC,MAAMD,KAAKE,UAAYrK,EAAMkS,EAAM,GAAKA,oBAIpD,IAAIA,EAAO,GAEX,OACIA,EADA3R,OAAOqH,SAASuZ,OACT5gB,OAAOqH,SAASuZ,OAEhB5gB,OAAOqH,SAASwZ,SAAW,KAAO7gB,OAAOqH,SAASiZ,UAAYtgB,OAAOqH,SAASyZ,KAAO,IAAM9gB,OAAOqH,SAASyZ,KAAO,IAGtHnP,EAAKtP,QAAQ,MAAO,yBAGHsP,GACxBA,EAAO,IAAIpV,KAAKoV,GAEhB,MAAMlS,EAAW,IAAIwS,MAAM,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,YACvF/N,EAAa,IAAI+N,MAAM,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YAErI7M,EAAYuM,EAAKoP,SACjBxd,EAAaoO,EAAKnV,UACxB,IAAIiV,EAAM,GACV,MAAM/M,EAAQiN,EAAKqP,WACb5P,EAAOO,EAAKsP,cAElB,OACIxP,EADe,IAAflO,GAAmC,KAAfA,GAAoC,KAAfA,EACnC,KACgB,IAAfA,GAAmC,KAAfA,EACrB,KACgB,IAAnBA,GAAuC,KAAfA,EACrB,KAEA,KAGS9D,EAAS2F,GAAa,KAAO7B,EAAakO,EAAM,IAAMvN,EAAWQ,GAAS,IAAM0M,uBAK3EO,GAGxB,IAAIlS,EAAS,GACTyE,GAHJyN,EAAO,IAAIpV,KAAKoV,IAGEuP,aAAa3W,WAC3BnF,EAAOuM,EAAKlV,WAEhB,SAAS2I,EAAO,GAAK,KAAO,KAEf,IAATA,IACAA,EAAO,IAEPA,EAAO,KACPA,GAAc,IAGI,IAAlBlB,EAAO6F,SACP7F,EAAS,IAAMA,GAGAkB,EAAO,IAAMlB,EAAS,IAAMzE,mBAK3BkS,EAAYlS,EAAY,MAC5C,MAAO,GAAG/C,EAAUykB,cAAcxP,MAASlS,KAAa/C,EAAU0kB,cAAczP,8BAGpDA,EAAYlS,EAAY,KACpD,MAAMyE,EAAQ,IAAI3H,KAAQ2H,EAAMmd,SAAS,EAAG,EAAG,EAAG,GAClD,MAAMjc,EAAY,IAAI7I,KAAK2H,GAAQkB,EAAUkc,QAAQlc,EAAU5I,UAAY,GAC3E,MAAM+G,EAAO,IAAIhH,KAAKoV,EAAKsP,cAAetP,EAAKqP,WAAYrP,EAAKnV,WAEhE,OAAI+G,EAAKge,iBAAmBrd,EAAMqd,eACvB,SAAS9hB,KAAa/C,EAAU0kB,cAAczP,KAErDpO,EAAKge,iBAAmBnc,EAAUmc,eAC3B,aAAa9hB,KAAa/C,EAAU0kB,cAAczP,KAElDjV,EAAU8kB,UAAU7P,EAAMlS,yBAIZkS,EAAYlS,EAAY,IAAKyE,EAAoB,KAC1E,IAAIkB,EAAMuM,EAAKnV,UAAU+N,WACrBhH,GAASoO,EAAKqP,WAAa,GAAGzW,WAClC,MAAMkH,EAAOE,EAAKsP,cAElB,OAAmB,IAAf7b,EAAI2E,SACJ3E,EAAM,IAAMA,GAGK,IAAjB7B,EAAMwG,SACNxG,EAAQ,IAAMA,GAGX,GAAGA,IAAQ9D,IAAY2F,IAAM3F,IAAYgS,KAAQvN,KAAqBxH,EAAU0kB,cAAczP,sBAGjFA,GACpB,GAAIA,EAAM,CACN,GAAIA,aAAgBpV,KAChB,OAAOoV,EAGX,GAAoB,iBAATA,GAAqBA,aAAgBG,OAC5C,OAAkC,IAA9BH,EAAK8P,OAAO,gBACZ9P,GAAc,KAGX,IAAIpV,KAAKoV,GAGpB,GAAoB,iBAATA,GAAqBA,aAAgBvC,OAC5C,OAAO,IAAI7S,KAAKoV,yBAKAA,EAAalS,GACrCkS,EAAQ,IAAIpV,KAAKoV,GACjBlS,EAAM,IAAIlD,KAAKkD,GAGf,IAAIyE,EAAQ0F,KAAK8X,IAAI/P,EAAMgQ,UAAYliB,EAAIkiB,WAAa,IAGxD,MAAMvc,EAAOwE,KAAKC,MAAM3F,EAAQ,OAChCA,GAAgB,MAAPkB,EAGT,MAAM7B,EAAQqG,KAAKC,MAAM3F,EAAQ,MAAQ,GACzCA,GAAiB,KAARX,EAGT,MAAMkO,EAAU7H,KAAKC,MAAM3F,EAAQ,IAAM,GACzCA,GAAmB,GAAVuN,EAGT,MAAM/M,EAAUR,EAAQ,GAExB,IAAIkN,EAAc,GAElB,OAAIhM,IACAgM,EAAc,GAAGhM,UAGjB7B,IACA6N,GAAeA,EAAc,KAAK7N,UAAgB,GAAGA,WAGrDkO,IACAL,GAAeA,EAAc,KAAKK,YAAoB,GAAGA,aAGzD/M,IACA0M,GAAeA,EAAc,QAAQ1M,YAAoB,GAAGA,aAG3D0M,IACDA,EAAc,KAGXA,gBAGUO,EAAWlS,GAC5BkS,EAAY,IAAIpV,KAAKoV,GAGrB,IAAIzN,GAFJzE,EAAY,IAAIlD,KAAKkD,IAEEwhB,cAAgBtP,EAAUsP,cAEjD,OAAIxhB,EAAUuhB,WAAarP,EAAUqP,YACjCvhB,EAAUuhB,aAAerP,EAAUqP,YAAcvhB,EAAUjD,UAAYmV,EAAUnV,YACjF0H,IAGGA,qBAGeyN,EAAoBlS,KAA2ByE,GACrE,IAAKyN,EACD,OAAO,EAGX,IAAIvM,EAASuM,EAAWwE,OACpB5S,EAAOW,EAAO8F,OAElB,OAAKvK,IACD2F,EAASA,EAAOjE,cAChBoC,EAAOA,EAAKpC,gBAGgB,IAAzBoC,EAAK4c,QAAQ/a,GAAY6Z,qBAGRtN,EAAclS,EAAUyE,GAChD,KAAIzE,EAAW,GAQf,IAJIyE,EAAW,IACXA,GAAYyN,EAAM5H,QAGlB7F,GAAYyN,EAAM5H,OAAQ,CAC1B,IAAI3E,EAAIlB,EAAWyN,EAAM5H,OACzB,KAAe,EAAP3E,KACJuM,EAAMjI,UAAK,GAInBiI,EAAM8N,OAAOvb,EAAU,EAAGyN,EAAM8N,OAAOhgB,EAAU,GAAG,4BAG1BkS,GAC1B,OAAKA,GAIEA,EAAKtP,QAAQ,iBAAkB,OACjCA,QAAQ,iBAAkB,OAC1BA,QAAQ,iBAAkB,gCAGHsP,GAE5B,OAAO,IADO4D,OAAO,kBAAmB,KAC/BtC,KAAKtB,+BAGiBA,GAC/B,OAAOjV,EAAUklB,kBAAkBjQ,GAAOA,EAAM,KAAOA,qBAGjCA,GACtB,MAAMlS,EAAUkS,aAAeM,MAE/B,QAAS/N,EAAI,EAAGA,EAAIyN,EAAI5H,OAAQ7F,IACb,OAAXyN,EAAIzN,GACJzE,EAAUkS,EAAI8N,OAAOvb,EAAG,UAAYyN,EAAIzN,GACf,iBAAXyN,EAAIzN,IAClBxH,EAAUmlB,YAAYlQ,EAAIzN,IAG1BzE,GAAWkS,EAAI5H,SAAW7F,GAC1BxH,EAAUmlB,YAAYlQ,GAI9B,OAAOA,kBAGYA,EAAwBlS,EAAcyE,GACzD,IAAIkB,EAEJ,OAAO,WACH,MAAM7B,EAAU5H,KACV8V,EAAQqQ,UAERpd,EAAQ,WACVU,EAAU,KACLlB,GACDyN,EAAKoQ,MAAMxe,EAASkO,IAItBL,EAAUlN,IAAckB,EAE9BwD,aAAaxD,GACbA,EAAUqD,WAAW/D,EAAOjF,GAExB2R,GACAO,EAAKoQ,MAAMxe,EAASkO,KA5kBT/U,6BAA6B,IAC7BA,0BAA0B,aAC1BA,yBAAyB,+BACzBA,6BAA6B,iBAC7BA,4BAA4B,GAC5BA,yBAAyB,YACzBA,wBAAwB,sCAEjCA,UACV,CACIwD,QAAU9B,GACC4jB,mBAAmBriB,SAASsiB,OAAO5f,QAAQ,IAAIkT,OAAO,mBAAqB2M,mBAAmB9jB,GAAMiE,QAAQ,cAAe,QAAU,+BAAgC,QAAU,KAE1L8f,QAAS,CAAC/jB,EAAMuT,EAAQlS,EAAMyE,EAAOkB,EAAS7B,KAC1C,IAAKnF,GAAQ,6CAA6C6U,KAAK7U,GAC3D,OAAO,EAGX,IAAIqT,EAAW,GAEf,GAAIhS,EACA,OAAQA,EAAKjE,kBACJ4T,OACDqC,EAAWhS,IAAS,IAAW,0CAA4C,aAAeA,EAC1F,WACCqS,OACDL,EAAW,aAAehS,EAC1B,WACClD,KACDkV,EAAW,aAAehS,EAAK2iB,cAK3C,gBAASH,OAASC,mBAAmB9jB,GAAQ,IAAM8jB,mBAAmBvQ,GAAUF,GAAYrM,EAAU,YAAcA,EAAU,KAAOlB,EAAQ,UAAYA,EAAQ,KAAOX,EAAU,WAAa,KACxL,GAEX8e,WAAY,CAACjkB,EAAMuT,EAAOlS,MACjBrB,IAGLuB,SAASsiB,OAASC,mBAAmB9jB,GAAQ,4CAA8CqB,EAAU,YAAcA,EAAU,KAAOkS,EAAQ,UAAYA,EAAQ,KACzJ,GAEX2Q,QAAUlkB,GACE,IAAImX,OAAO,cAAgB2M,mBAAmB9jB,GAAMiE,QAAQ,cAAe,QAAU,WAAY4Q,KAAKtT,SAASsiB,QAE3H5P,KAAM,KACF,MAAMjU,EAAQuB,SAASsiB,OAAO5f,QAAQ,0DAA2D,IAAID,MAAM,uBAC3G,QAASuP,EAAO,EAAGA,EAAOvT,EAAM2L,OAAQ4H,IAAUvT,EAAMuT,GAAQqQ,mBAAmB5jB,EAAMuT,IACzF,OAAOvT,0CAnDV1B,gCAASE,QAATF,EAAS,YCKf,QAJPlB,cASUG,cAAqB,GACrBA,eAAY,IAAIgB,KAEhBhB,kBACN,CACE,YACA,gBACA,qBACA,oBACA,oBACA,sBACA,2BACA,2BAwJIA,mCAAiCgW,IACvC,GAAKA,EAAMmD,SAIX,GAAkB,sBAAdnD,EAAMoE,IACJwM,eAAexY,SACjBpO,KAAK6mB,oBAAoB,oBAAqBD,gBAC9CtiB,aAAaoiB,WAAW,8BAEH,sBAAd1Q,EAAMoE,IAA6B,CACvCpa,KAAK8mB,SAAS1Y,QACjBpO,KAAK+mB,eAEP,MAAMjjB,EAAOU,KAAKC,MAAMuR,EAAMmD,UAG9B,UAAW5Q,KAAOzE,EACZ9D,KAAKgnB,iBAAiBze,IACxBvI,KAAKinB,sBAAsB1e,EAAK/D,KAAKC,MAAMX,EAAKyE,KAIpDvI,KAAKknB,iBACkB,wBAAdlR,EAAMoE,IAA+B,CAC9C,MAAMtW,EAAOU,KAAKC,MAAMuR,EAAMmD,UAI9BnZ,KAAKmnB,0BAA0BrjB,EAAK6c,KAAM7c,EAAKsW,SACxB,6BAAdpE,EAAMoE,IACfpa,KAAKonB,+BAA+BpR,EAAMmD,UACnB,4BAAlBnD,EAAUoE,KAAqCwM,eAAexY,OACnEpO,KAAKqnB,8BACkB,kBAAdrR,EAAMoE,IACfpa,KAAKsnB,oBAAoBtR,EAAMmD,UACR,uBAAdnD,EAAMoE,KACfpa,KAAKunB,yBAAyBvR,EAAMmD,WA1LjCjW,iCAC6C,IAA9ChC,EAAkBsmB,0BAItBtmB,EAAkBsmB,yBAA0B,EAC5CnjB,OAAOojB,iBAAiB,UAAWznB,KAAK0nB,+BAA+B,GACvE1nB,KAAK2nB,sBAGAC,kCACLvjB,OAAOwjB,oBAAoB,UAAW7nB,KAAK0nB,+BAA+B,GAC1ExmB,EAAkBsmB,yBAA0B,EAGvCM,kBACL9nB,KAAK+nB,0BACL/nB,KAAKgoB,oBAEA7gB,IAAI6O,EAAKlS,EAAOyE,EAAM,MAC3B,GAAIA,EAAK,CACP,MAAMkB,EAAU,IAAI7I,KACpB6I,EAAQwe,WAAWxe,EAAQye,aAAe3f,GAC1CjE,aAAa6C,IAAI6O,EAAK,CAACvM,EAAS3F,SAEhCQ,aAAa6C,IAAI6O,EAAK,CAAC,KAAMlS,IAG1BikB,0BACL/nB,KAAKqnB,8BACL/iB,aAAaoiB,WAAWxlB,EAAkBinB,iBAE1C7jB,aAAakiB,QAAQ,0BAA2B,UAChDliB,aAAaoiB,WAAW,2BAGnBW,8BACLT,eAAewB,QACfpoB,KAAK8mB,SAAW,GAGXkB,oBACL1jB,aAAa8jB,QAGRC,gBAAgBrS,EAAWlS,EAAM5C,EAAkBonB,iBACxDtoB,KAAKuoB,mBAAmBzkB,GAExB9D,KAAKwoB,mBAAmB1kB,GACxBQ,aAAaoiB,WAAW5iB,GACxB9D,KAAKinB,sBAAsBnjB,EAAKkS,GAG3ByS,sBAAsBzS,EAAWlS,EAAM5C,EAAkBonB,iBAC9DtoB,KAAKuoB,mBAAmBzkB,GAExBQ,aAAaoiB,WAAW5iB,GACxB9D,KAAK0oB,oBAAoB1S,EAAMlS,GAG1BJ,kBAAkBsS,EAAWlS,EAAM5C,EAAkBonB,iBAC1DtoB,KAAKuoB,mBAAmBzkB,GAExB9D,KAAK2oB,yBAAyB7kB,GAC9B9D,KAAK6mB,oBAAoB/iB,EAAKkS,GAGzB4S,yBAAyB5S,EAAM9U,EAAkBonB,iBACtDtoB,KAAKuoB,mBAAmBvS,GAExB,MAAMlS,EAAO9D,KAAK+D,QAAQiS,GAEb,OAATlS,GAIJ9D,KAAKqoB,gBAAgBvkB,EAAMkS,GAGtB6S,+BAA+B7S,EAAM9U,EAAkBonB,iBAC5DtoB,KAAKuoB,mBAAmBvS,GAExB,MAAMlS,EAAO9D,KAAK+D,QAAQiS,GAEb,OAATlS,GAIJ9D,KAAKyoB,sBAAsB3kB,EAAMkS,GAG5B8S,2BAA2B9S,EAAM9U,EAAkBonB,iBACxDtoB,KAAKuoB,mBAAmBvS,GAExB,MAAMlS,EAAO9D,KAAK+D,QAAQiS,GAEb,OAATlS,GAIJ9D,KAAK0D,kBAAkBI,EAAMkS,GAGxB+S,OAAO/S,EAAM9U,EAAkBonB,iBACpC,IAAIxkB,EAAO8iB,eAAeriB,QAAQyR,GAElC,OAAa,OAATlS,IACFA,EAAOQ,aAAaC,QAAQyR,IAGvBlS,EAGFC,QAAQiS,EAAM9U,EAAkBonB,iBACrCtoB,KAAKuoB,mBAAmBvS,GAExB,IAAIlS,EAAO9D,KAAKgpB,sBAAsBhT,GAEtC,OAAa,OAATlS,IACFA,EAAO9D,KAAKipB,oBAAoBjT,IAG3BlS,EAGFolB,cAAiBlT,EAAM9U,EAAkBonB,gBAAiBxkB,GAAa,GAC5E,IAAIyE,EAAOvI,KAAK+D,QAAQiS,GAExB,OAAa,OAATzN,GACEzE,IACFyE,EAAO,IAAI3H,KAAK2H,IAEXA,GAEA,KAIJsZ,WAAW7L,EAAM9U,EAAkBonB,iBACxCtoB,KAAKuoB,mBAAmBvS,GAExBhW,KAAK2oB,yBAAyB3S,GAC9B1R,aAAaoiB,WAAW1Q,GAGnBmT,eACL,OAAOnpB,KAAKopB,UAAUC,eA4ChB1B,qBACNrjB,aAAakiB,QAAQ,oBAAqB,UAC1CliB,aAAaoiB,WAAW,qBAGlBgC,oBAAoB1S,EAAWlS,GACrC9D,KAAKmnB,0BAA0BnR,EAAMlS,GACrC9D,KAAKspB,oBAAoBxlB,GAEzB9D,KAAK6mB,oBAAoB,sBAAuB,CAAEzM,MAAKuG,SACvDrc,aAAaoiB,WAAW,uBAGlBS,0BAA0BnR,EAAWlS,GAC3C9D,KAAKsnB,oBAAoBxjB,GACzB9D,KAAKinB,sBAAsBnjB,EAAKkS,GAG1B2S,yBAAyB3S,GAC/BhW,KAAKonB,+BAA+BpR,GACpChW,KAAKupB,yBAAyBvT,GAE9B1R,aAAakiB,QAAQ,2BAA4BxQ,GACjD1R,aAAaoiB,WAAW,4BAGlBU,+BAA+BpR,GACrC4Q,eAAeF,WAAW1Q,GAC1BhW,KAAKunB,yBAAyBvR,GAGxBuS,mBAAmBvS,GACzB,IAAKA,EACH,MAAM,IAAIwT,MAAM,uBAGlB,GAAIxpB,KAAKypB,aAAa9S,KAAK7S,GAAKA,IAAMkS,GACpC,MAAM,IAAIwT,MAAM,oBAAoBxT,iEAIhCgR,iBAAiBhR,GACvB,OAAOhW,KAAK8mB,SAASnQ,KAAK7S,GAAKA,IAAMkS,GAG/B+Q,eACF/mB,KAAK8mB,SAAS1Y,SAIlBpO,KAAK8mB,SAAW9mB,KAAK0pB,0BAGfA,uBAAuB1T,EAAyB,IACtD,MAAMlS,EAAO9D,KAAKipB,oBAAoB/nB,EAAkBinB,iBAExD,OAAa,OAATrkB,EACKkS,EAEAlS,EAIH6lB,cAAc3T,GACpBhW,KAAKsnB,oBAAoBtR,GACzBhW,KAAKspB,oBAAoBtT,GAEzB1R,aAAakiB,QAAQ,gBAAiBxQ,GACtC1R,aAAaoiB,WAAW,iBAGlB4C,oBAAoBtT,GAC1B,MAAMlS,EAAiB9D,KAAK0pB,yBAEvB5lB,EAAe6S,KAAKpO,GAAKA,IAAMyN,KAClClS,EAAeiK,KAAKiI,GACpBhW,KAAK6mB,oBAAoB3lB,EAAkBinB,gBAAiBrkB,IAIxDylB,yBAAyBvT,GAC/B,MAAMlS,EAAiB9D,KAAK0pB,yBAEtBnhB,EAAQzE,EAAe0gB,QAAQxO,GAEjCzN,GAAQ,IACVzE,EAAeggB,OAAOvb,EAAO,GAC7BvI,KAAK6mB,oBAAoB3lB,EAAkBinB,gBAAiBrkB,IAIxDwjB,oBAAoBtR,GACrBhW,KAAKgnB,iBAAiBhR,IACzBhW,KAAK8mB,SAAS/Y,KAAKiI,GAIfwS,mBAAmBxS,GACzBhW,KAAKunB,yBAAyBvR,GAC9BhW,KAAKupB,yBAAyBvT,GAE9B1R,aAAakiB,QAAQ,qBAAsBxQ,GAC3C1R,aAAaoiB,WAAW,sBAGlBa,yBAAyBvR,GAC/B,MAAMlS,EAAQ9D,KAAK8mB,SAAStC,QAAQxO,GAEhClS,GAAQ,GACV9D,KAAK8mB,SAAShD,OAAOhgB,EAAO,GAIxB+iB,oBAAoB7Q,EAAalS,GACvCQ,aAAakiB,QAAQxQ,EAAKxR,KAAK0O,UAAUpP,IAGnCmjB,sBAAsBjR,EAAalS,GACzC8iB,eAAeJ,QAAQxQ,EAAKxR,KAAK0O,UAAUpP,IAGrCmlB,oBAAoBjT,GAC1B,OAAOjV,eAAuBuD,aAAaC,QAAQyR,IAG7CgT,sBAAsBhT,GAC5B,OAAOjV,eAAuB6lB,eAAeriB,QAAQyR,IAG/CkR,SACNpa,WAAW,KACT9M,KAAKopB,UAAUjS,OACfnX,KAAKopB,UAAUhS,cArVJlW,2BAA0B,EAElBA,kBAAkB,YACjBA,kBAAkB,kDAJ/BA,gCAAiBD,QAAjBC,EAAiB,6FCVvB,QACH0oB,QAAQ9T,EAAmB/M,GACvB,MAAM0M,EAAaK,EAAM+T,OAAO,CAACjU,EAAMF,KAC9BE,EAAKF,EAAI3M,IAGV6M,EAAKF,EAAI3M,IAAQgF,KAAK2H,GAFtBE,EAAKF,EAAI3M,IAAU,CAAC2M,GAIjBE,GACR,IACH,OAAOa,OAAOC,KAAKjB,GAAY4C,IAAIzC,IAAQ,CACvCwE,MACAjO,MAAOsJ,EAAWG,6CAZjB1U,gCAAcD,QAAdC,EAAc,qBAFX,yDCoBT,QAYHrB,YACYiW,EACA/M,EACA0M,EACDG,EACGF,EACHC,EACAE,EACC9Q,GAPA/E,WACAA,eACAA,aACDA,iBACGA,iBACHA,cACAA,cACCA,4BA6BZ8pB,aACQ9pB,KAAK+pB,aACL/pB,KAAK+pB,WAAWC,OAChBhqB,KAAK+pB,WAAa,MAI1BE,YACI,MAAkC,WAA3BC,aAAaC,WAGxBxc,UACI3N,KAAKoqB,qBAAqBC,oBAG9BC,OAAOxU,EAAW/M,GACd,IAAI0M,EAAmB,GACvBA,EAAK1H,KAAK,CACNhI,MAAO+P,EACPyU,aAAcxhB,EACdyhB,IAAK,uCACLC,MAAO,GAAGzqB,KAAK+C,MAAM4B,IAAI0I,uCACzBqd,IAAK,QA2CT1qB,KAAKoqB,qBAAqBO,qBAAqBlV,GAqGnDiL,OAAO5K,GAOH,OANA9V,KAAK4qB,cAAgB,GAIjB5qB,KAAK6qB,eAHH/U,GACoB,MAIlB9V,KAAK6qB,oBACJ,MAQD,QAEA7qB,KAAK4qB,cAAgBnU,OAAOqU,OAAO,GAAI9qB,KAAK+qB,WAAW/qB,KAAK+C,MAAMioB,oBAAoBC,QACtF,MATA,IACC,OACDjrB,KAAK4qB,cAAgBnU,OAAOqU,OAAO,GAAI9qB,KAAK+qB,WAAW/qB,KAAK+C,MAAMioB,oBAAoBC,OAAOvK,OAAO3X,GAAMA,EAAEkU,MAC5G,UACC,OACDjd,KAAK4qB,cAAgBnU,OAAOqU,OAAO,GAAI9qB,KAAK+qB,WAAW/qB,KAAK+C,MAAMioB,oBAAoBC,OAAOvK,OAAO3X,IAAOA,EAAEkU,OAOzHiO,uBACIlrB,KAAK2E,IAAIC,UAAwB,oBAAoBC,UAAWiR,IAC5D,GAAIA,GAAOA,EAAI1H,OAAS,GAAKpO,KAAK+qB,YAAc/qB,KAAK+qB,WAAW3c,OAAS,EACrE,QAASrF,EAAI,EAAGA,EAAI/I,KAAK+qB,WAAW3c,OAAQrF,IACxC+M,EAAI1C,QAAQqC,IACR,MAAMG,EAAO5V,KAAK+qB,WAAWhiB,GAAGkiB,OAAOE,KAAKzV,GAAKA,EAAE3K,UAAY0K,EAAG1K,SAC9D6K,IACAA,EAAKkJ,KAAOrJ,EAAGqJ,UAMvCsM,YACI,IAAItV,EAAQ,IAAIuV,MAChBvV,EAAM3I,IAAM,kCACZ2I,EAAMwV,OACNxV,EAAMyV,OAEVC,aACI,IAAI1V,EAAQ,IAAIuV,MAChBvV,EAAM3I,IAAM,yCACZ2I,EAAMwV,OACNxV,EAAMyV,8CApQD9hB,GAAYzI,sHAAZyI,EAAYxI,QAAZwI,EAAY,qBAHT,0ICRT,QAQL5J,cACEG,KAAKyrB,YAAc,SACnBzrB,KAAK0rB,YAAc,OACnB1rB,KAAK2rB,GAAK,IACV3rB,KAAK4rB,YAAc,OACnB5rB,KAAK6rB,GAAK,GACV7rB,KAAK8rB,MAAQ,GACb9rB,KAAK+rB,GAAK,QAGP,QAGLlsB,cACEG,KAAKyrB,YAAc,SACnBzrB,KAAK0rB,YAAc,mBAGhB,QAGL7rB,cACEG,KAAKyrB,YAAc,SACnBzrB,KAAK0rB,YAAc,cAGhB,QAIL7rB,cACEG,KAAKyrB,YAAc,SACnBzrB,KAAK0rB,YAAc,gBACnB1rB,KAAKgsB,QAAU,MAyBZ,QAGLnsB,YAAoB4V,EAAqCG,EAA2BF,GAAhE1V,iBAAqCA,cAA2BA,eAD7EA,gBAAa,GAGlBisB,UACEjsB,KAAKksB,SAAyBlsB,KAAKmsB,UAAUF,QA3ElC,wBA2EoD5T,IAC5D5C,IACC,IAAIG,EAA6BpR,KAAKC,MAAMgR,EAASkL,MACjDjL,GAAe,EACnB,GAAgB,SAAZE,EAAKwW,GAAe,CACtB,MAAMzW,EAAY3V,KAAK2F,OAAOC,KAAK5E,KACnC2U,EAAU7P,kBAAkBC,MAAQ,2BACpC4P,EAAU7P,kBAAkBG,WAAY,EACxC0P,EAAU7P,kBAAkBP,QAAU,GAAGqQ,EAAKwW,KAC9CzW,EAAUxP,cAActB,UAAUgR,IAChCH,GAAM,EACN1V,KAAKqF,QAAQC,oBAMC,SAAZsQ,EAAKyW,GACP,GAAgB,OAAZzW,EAAKyW,GAAa,CACpB,MAAM1W,EAAY3V,KAAK2F,OAAOC,KAAK5E,KACnC2U,EAAU7P,kBAAkBC,MAAQ,2BACpC4P,EAAU7P,kBAAkBG,WAAY,EACxC0P,EAAU7P,kBAAkBP,QAAU,4MAA4CqQ,EAAK0W,KACvF5W,GAAM,EACNC,EAAUxP,cAActB,UAAUgR,IAChCH,GAAM,EACN1V,KAAKqF,QAAQC,gBAIZ,CACH,MAAMqQ,EAAY3V,KAAK2F,OAAOC,KAAK5E,KACnC2U,EAAU7P,kBAAkBC,MAAQ,2BACpC4P,EAAU7P,kBAAkBG,WAAY,EACxC0P,EAAU7P,kBAAkBP,QAAU,oHACtCoQ,EAAUxP,cAActB,UAAUgR,IAChCH,GAAM,EACN1V,KAAKqF,QAAQC,YAMrB,YAAKD,QAAQC,UACNsQ,2CAlDJE,GAAiBpT,+DAAjBoT,EAAiB7U,QAAjB6U,EAAiB,uECtEvB,QACHjW,YAAoBqB,oBAEpB+D,UAAU/D,GACN,OAAsC,MAAjCA,GACAlB,KAAKuD,UAAUgpB,aAA4D,OAA7CvsB,KAAKuD,UAAUgpB,YAAY/mB,cAEnDtE,EAEJlB,KAAKwsB,gBAAgBtrB,EAAM0N,YAE/B4d,gBAAgBtrB,GACnB,QAAe,IAAXA,EACA,MAAO,GAEX,IAAIuB,EAAMvB,EAAO0N,WAAW4L,OAC5B,MAAY,KAAR/X,EACO,IAEXA,EAAMA,EAAIiE,QAAQ,KAAM,UACxBjE,EAAMA,EAAIiE,QAAQ,KAAM,UACxBjE,EAAMA,EAAIiE,QAAQ,KAAM,UACxBjE,EAAMA,EAAIiE,QAAQ,KAAM,UACxBjE,EAAMA,EAAIiE,QAAQ,KAAM,UACxBjE,EAAMA,EAAIiE,QAAQ,KAAM,UACxBjE,EAAMA,EAAIiE,QAAQ,KAAM,UACxBjE,EAAMA,EAAIiE,QAAQ,KAAM,UACxBjE,EAAMA,EAAIiE,QAAQ,KAAM,UACxBjE,EAAMA,EAAIiE,QAAQ,KAAM,UACjBjE,GAEJgqB,gBAAgBvrB,GACnB,QAAe,IAAXA,EACA,MAAO,GAEX,IAAIuB,EAAMvB,EAAO0N,WAAW4L,OAC5B,MAAY,KAAR/X,EACO,IAEXA,EAAMA,EAAIiE,QAAQ,SAAK,KACvBjE,EAAMA,EAAIiE,QAAQ,SAAK,KACvBjE,EAAMA,EAAIiE,QAAQ,SAAK,KACvBjE,EAAMA,EAAIiE,QAAQ,SAAK,KACvBjE,EAAMA,EAAIiE,QAAQ,SAAK,KACvBjE,EAAMA,EAAIiE,QAAQ,SAAK,KACvBjE,EAAMA,EAAIiE,QAAQ,SAAK,KACvBjE,EAAMA,EAAIiE,QAAQ,SAAK,KACvBjE,EAAMA,EAAIiE,QAAQ,SAAK,KACvBjE,EAAMA,EAAIiE,QAAQ,SAAK,KAChBjE,0CAjDFqF,GAAiB9G,+DAAjB8G,EAAiB4kB,8LCQvB,QAEL7sB,YAAoB6V,EACVC,EACAE,EACE9Q,EACF6D,EACExD,EACFsD,EACA7C,GAPU7F,qBACVA,WACAA,eACEA,qBACFA,cACEA,iBACFA,aACAA,aAEVA,mBAAgB,IAAIgB,UACpBkW,cACElX,KAAKgT,cAAcmE,OACnBnX,KAAKgT,cAAcoE,WAErBgR,MAAM1S,WAIJ,GAFA1V,KAAK2sB,QAAU3sB,KAAKiX,QAAQlT,QAAQ,cAE/B/D,KAAK2sB,UAAuB,QAAZhX,OAAKgX,eAAO,eAAEC,KAAM,IAAO5sB,KAAK2sB,SAA4B,IAAjBjX,EAAO0H,MACrEpd,KAAK6sB,SAASnX,QAGhB,OAAoB,QAAZG,OAAK8W,eAAO,eAAEC,SACf,EAEH,KACG,EAEH,KACG,EAEH,KACG,EACH5sB,KAAK8sB,eAAepX,GACpB,cAEAtP,QAAQ2mB,KAAK,8GAInBD,eAAepX,GACb1V,KAAKgtB,cAAcf,UACnBjsB,KAAKgtB,cAAcd,SAAS/U,KAAK,IAAIrP,MACrC9H,KAAKgtB,cAAcd,SAASrnB,UAAW8Q,IACrC,GAAgB,QAAT,MAAHA,OAAG,EAAHA,EAAKsX,IAAa,CACpB,MAAMpX,EAAY7V,KAAK2F,OAAOC,KAAK1E,KACnC2U,EAAU/P,kBAAkBC,MAAQ,2BACpC8P,EAAU/P,kBAAkBG,WAAY,EACxC4P,EAAU/P,kBAAkBP,QAAU,+FACtCsQ,EAAU1P,cAActB,UAAUE,WAI/B,CACH,MAAM8Q,EAAU,IAAI/N,KACpB+N,EAAQ8V,GAAKjW,EAAO0H,MAAMxO,WAC1B5O,KAAKgtB,cAAcf,UACnBjsB,KAAKgtB,cAAcd,SAAS/U,KAAKtB,GACjC7V,KAAKgtB,cAAcd,SAASrnB,UAAWE,IACrC/E,KAAKgX,UAAUpR,KAAK,GAAI5F,KAAK6J,cAAc7D,QAAQ,oBAAqB,CACtEuR,SAAU,MAEZ7B,EAAOwI,cAAmB,MAAHnZ,OAAG,EAAHA,EAAKunB,GAC5B5W,EAAO0I,gBAAqB,MAAHrZ,OAAG,EAAHA,EAAKqnB,GAC9B1W,EAAOwI,cAAmB,MAAHnZ,OAAG,EAAHA,EAAKunB,GACZ,QAAT,MAAHvnB,OAAG,EAAHA,EAAKsnB,KACPrsB,KAAK6sB,SAASnX,QAKxBmX,SAASnX,GACP1V,KAAK2E,IAAIoO,WAAwB2C,EAAQ,qBACtCnO,QAAKxG,KAAUf,KAAKgT,gBACpBnO,UAAW8Q,IACV3V,KAAKgX,UAAUpR,KAAK,GAAI5F,KAAK6J,cAAc7D,QAAQ,oBAAqB,CACtEuR,SAAU,MAEZvX,KAAKktB,MAAMvX,KAKjBuX,MAAMxX,gBACA1V,KAAK2sB,SAAgC,KAAT,QAAZhX,OAAKgX,eAAO,eAAEC,KAAiC,KAAT,QAAZ/W,OAAK8W,eAAO,eAAEC,KAAiC,KAAT,QAAZ7nB,OAAK4nB,eAAO,eAAEC,KAAiC,KAAT,QAAZhkB,OAAK+jB,eAAO,eAAEC,MAC9G5sB,KAAKmtB,aAAazX,GAGtByX,aAAazX,GACX,MAAMC,EAAa,GACbE,EAAU,IAAI/N,KACpB6N,EAAW5H,KAAK2H,GAChBG,EAAQmW,QAAUrW,EAAWa,MAAM,IAAI9T,MAAgB,GACvDmT,EAAQmW,QAAQvM,cAAgB9J,EAAW,GAAGwJ,aAAa3I,MAAM,IAAI9T,MACrEmT,EAAQmW,QAAQoB,eAAiBptB,KAAK+C,MAAM8H,QAAQwiB,UACpD,UAAWtoB,KAAW8Q,EAAQmW,QAAQvM,cACA,IAAhCzf,KAAK+C,MAAM8H,QAAQyiB,WAAgBvoB,EAAQ+a,WAAa,IAC5D/a,EAAQ8a,IAAM9a,EAAQ8a,IACtBhK,EAAQmW,QAAQzM,QAAUxa,EAAQ8a,IAClChK,EAAQmW,QAAQxM,UAAYza,EAAQ8a,IAAM9a,EAAQ+a,UAAY,GAC9D/a,EAAQ6a,aAAe7a,EAAQ8a,IAAM9a,EAAQ+a,UAAY,GAEtDjK,EAAQmW,QAAQrM,aACnB9J,EAAQmW,QAAQrM,WAAa,GAC/B9J,EAAQmW,QAAQ3M,YAAcxJ,EAAQmW,QAAQrM,WAC9C3f,KAAKgtB,cAAcf,UACnBjsB,KAAKgtB,cAAcd,SAAS/U,KAAKtB,GACjC7V,KAAKgtB,cAAcd,SAASrnB,UAAWE,IAErC,MAAM6D,EAAQ,IAAIlG,KAClBkG,EAAMoV,WAAatI,EAAOsI,WAC1BpV,EAAMqU,IAAMvH,EAAOuH,IACnBrU,EAAM2kB,GAAI,EACVvtB,KAAK2E,IAAIoO,WAAwBnK,EAAO,0BACvCrB,QAAKxG,KAAUf,KAAKgT,gBACpBnO,UAAWO,IACVpF,KAAK+J,cAIXA,UACE/J,KAAK2E,IAAIC,UAA6B,eACnC2C,QAAKxG,KAAUf,KAAKgT,gBACpBnO,UAAW6Q,IACV,IAAKA,EACH,MAAM,IAAI8T,MAAM,IAElBxpB,KAAKqhB,MAAM0J,WAAarV,EACxB1V,KAAU+C,MAAMioB,mBAKdhrB,KAAKqhB,MAAMuJ,cAAgBnU,OAAOqU,OAAO,GAAI9qB,KAAKqhB,MAAM0J,WAAW/qB,KAAK+C,MAAMioB,oBAAoBC,SAJlGjrB,KAAKqhB,MAAMuJ,cAAgBnU,OAAOqU,OAAO,GAAI9qB,KAAKqhB,MAAM0J,WAAW,GAAGE,QACtEjrB,KAAK+C,MAAMioB,mBAAqB,GAKlChrB,KAAKqhB,MAAMmM,WAAY,EAEvBxtB,KAAKqhB,MAAM6J,uBACXlrB,KAAKqhB,MAAMX,OAAO1gB,KAAKqhB,MAAMwJ,yDA5IxBpV,GAAkBhT,wHAAlBgT,EAAkBxU,QAAlBwU,EAAkB,uECXxB,QAGL5V,cACEG,KAAKmqB,WAAanqB,KAAKytB,cAAgB,UAAY,SAG9CA,cACL,MAAO,iBAAkBppB,OAG3BgmB,oBACE,IAAInpB,EAAOlB,KACP,iBAAkBqE,QACpB6lB,aAAaG,kBAAkB,SAAS5nB,GACtC,OAAQvB,EAAKipB,WAAa1nB,IAKhCirB,OAAOxsB,EAAeuB,GACpB,IAAIuT,EAAOhW,KACX,OAAO,IAAIgB,IAAW,SAAS8C,GACvB,iBAAkBO,SACtB+B,QAAQ6E,IAAI,uDACZnH,EAAIsT,YAGkB,YAApBpB,EAAKmU,aACP/jB,QAAQ6E,IACN,qEAEFnH,EAAIsT,YAGN,IAAI7O,EAAU,IAAI2hB,aAAahpB,EAAOuB,GACtC8F,EAAQolB,OAAS,SAASlkB,GACxB,kBAAW,WACTlB,EAAQoB,SACP,MACI7F,EAAIqT,KAAK,CACdyW,aAAcrlB,EACdslB,MAAOpkB,KAIXlB,EAAQulB,QAAU,SAASrkB,GACzB,SAAQE,QACD7F,EAAIqT,KAAK,CACdyW,aAAcrlB,EACdslB,MAAOpkB,KAIXlB,EAAQ2E,QAAU,SAASzD,GACzB,OAAO3F,EAAIuC,MAAM,CACfunB,aAAcrlB,EACdslB,MAAOpkB,KAIXlB,EAAQwlB,QAAU,WAChB,OAAOjqB,EAAIsT,cAKjBuT,qBAAqBzpB,GACI,WAAnBlB,KAAKmqB,YACPjpB,EAAOkS,QAAQ,CAAC3Q,EAAMuT,KACpB,IAAIlS,EAAU,CACZkqB,MAAOvrB,EAAKurB,MACZ/pB,KAAMxB,EAAK8nB,aACX1J,KAAMpe,EAAKoe,KACXoN,MAAOxrB,EAAKwrB,MACZzD,IAAK/nB,EAAK+nB,IACVC,MAAOhoB,EAAKgoB,MACZC,IAAKjoB,EAAKioB,KAEZ5d,WAAW,KACC9M,KAAK0tB,OAAOjrB,EAAKsD,MAAOjC,GAASe,UAAU4E,QAIhD,IAAJuM,4CApFElO,gCAAwB7G,QAAxB6G,EAAwB,6FCIrC,MAAM5G,EAAc,CAClBgG,QAAS,IAAIlG,KAAY,CAAE,eAAgB,qCAKtC,QAMLnB,YAAoBiE,EAA4CyE,GAA5CvI,YAA4CA,gBAC9DA,KAAKqN,OAAS3K,aAAuB1C,KAAKkuB,aAIrCA,aAKL,OAJaluB,KAAKgE,SAAS0H,SAASuZ,QAClCjlB,KAAKgE,SAAS0H,SAASwZ,SAAW,KAAOllB,KAAKgE,SAAS0H,SAASiZ,UAC/D3kB,KAAKgE,SAAS0H,SAASyZ,KAAO,IAAMnlB,KAAKgE,SAAS0H,SAASyZ,KAAO,KAEzDze,QAAQ,MAAO,IAG7BynB,SAAYrqB,GACV,MAAMyE,EAAU,GAAGvI,KAAKqN,cACd7I,KAAK0O,UAAUpP,GACzB,OAAO9D,KAAKouB,KAAKC,KAAQ9lB,EAAS/D,KAAK0O,UAAUpP,GAAO5C,GAG1D0O,MACE,MAAM9L,EAAU,GAAG9D,KAAKqN,SACxB,OAAOrN,KAAKouB,KAAKxe,IAAI9L,EAAS5C,GAGhCotB,eACE,OAAOtuB,KAAKouB,KAAKxe,IAAI,8DAA8DyI,IAAKvU,GAAkBA,EAAI2T,QAGhH8W,eAAkBzqB,EAAiByE,GACjC,MAAMkB,EAAU,GAAG3F,IAAUyE,IAC7B,OAAOvI,KAAKouB,KAAKxe,IAAOnG,EAASvI,GAGnC0D,UAAad,GACX,MAAMyE,EAAU,GAAGvI,KAAKqN,UAAUvJ,IAClC,OAAO9D,KAAKouB,KAAKxe,IAAOrH,EAASrH,GAGnCstB,cAAiB1qB,GACf,MAAMyE,EAAU,GAAGvI,KAAKqN,SAASvJ,IACjC,OAAO9D,KAAKouB,KAAKxe,IAAOrH,EAASrH,GAGnCwJ,gBAAmB5G,EAAgByE,GACjC,MAAMkB,EAAU,GAAGzJ,KAAKqN,UAAUvJ,YAAiByE,IACnD,OAAOvI,KAAKouB,KAAKxe,IAAOnG,EAASvI,GAGnCutB,cAAiB3qB,EAAgByE,GAC/B,MAAMkB,EAAM,GAAGzJ,KAAKqN,SAASvJ,KAAUyE,IACvC,OAAOvI,KAAKouB,KAAKxe,IAAOnG,EAAKvI,GAG/B6R,WAAcjP,EAAMyE,GAClB,MAAMkB,EAAU,GAAGzJ,KAAKqN,UAAU9E,IAC5BX,EAAQpD,KAAK0O,UAAUpP,GAC7B,OAAO9D,KAAKouB,KAAKC,KAAQ5kB,EAAS7B,EAAO1G,GAG3CwtB,aAAgB5qB,EAAYyE,EAAMkB,GAChC,MAAM7B,EAAM,GAAG5H,KAAKqN,SAAS5D,KAAU3F,IACvC,OAAO9D,KAAKouB,KAAKO,IAAO/mB,EAAKW,EAAMrH,GAGrC0tB,aAAgB9qB,EAAYyE,GAC1B,MAAMkB,EAAM,GAAGzJ,KAAKqN,SAAS9E,KAAUzE,IACvC,OAAO9D,KAAKouB,KAAKS,OAAUplB,EAAKvI,0CAxEvBuB,GAAc1B,kBAMqB+G,kCANnCrF,EAAcxB,QAAdwB,EAAc,qBAFb,0FCLP,QACL5C,YAAuBiE,EACbyE,GADavI,iBACbA,eAIHisB,QAAQnoB,GAEb,OAAK9D,KAAK8uB,UACR9uB,KAAK8uB,QAAU9uB,KAAK0tB,OAAO5pB,GAC3BsC,QAAQ6E,IAAI,2BAA6BnH,IAEpC9D,KAAK8uB,QAGNpB,OAAO5pB,GAIb,IAAIyE,EAAK,IAAIwmB,UAAUjrB,GACnB2F,EAAazI,oBAAsB8U,IACrCvN,EAAGymB,UAAYlZ,EAAIqB,KAAKc,KAAKnC,GAC7BvN,EAAG2E,QAAU4I,EAAIzP,MAAM4R,KAAKnC,GAC5BvN,EAAGwlB,QAAUjY,EAAIsB,SAASa,KAAKnC,GACxBvN,EAAGoB,MAAMsO,KAAK1P,KAEnBX,EAAW,CACbuP,KAAOrB,IACDvN,EAAG0mB,aAAeF,UAAUG,OAC9BlvB,KAAKqF,QAAQiC,QACbiB,EAAG4mB,KAAK3qB,KAAK0O,UAAU4C,OAI7B,OAAO9U,iBAAkB4G,EAAU6B,0CAlC1BhH,GAAgBqF,oDAAhBrF,EAAgBxB,QAAhBwB,EAAgB","names":["constructor","x","P","this","canActivate","R","url","authService","isUserLoggedIn","setRedirectUrl","router","navigate","getLoginUrl","canActivateChild","datevalidator","Date","getDate","getHours","u","e","factory","d","path","redirectTo","pathMatch","loadChildren","Promise","then","Z","OrderModule","WaiterorderModule","TableModule","HomeModule","LoginModule","AboutModule","ClubModule","OrdermanagementModule","n","SettingModule","PortalModule","GameModule","PaymentModule","FinalfactorModule","NotFoundModule","c","y","relativeLinkResolution","onSameUrlNavigation","V","ct","share","getSetting","storageManager","initialiseStorageSyncListener","goodsGroupList","setLanguage","sharemodel","language","translate","setDefaultLang","use","savePermanentData","isrtl","go","ngOnInit","s","getData","document","body","classList","contains","isToggledUppercase","window","localStorage","getItem","JSON","parse","getTableList","api","getEntity","subscribe","tableList","F","selectors","transform","opacity","handleError","G","spinner","stopAll","message","toLowerCase","includes","hasShowError","dialog","open","W","componentInstance","title","instant","hasCancel","hasOK","afterClosed","console","error","status","errorCode","errorMessage","split","replace","X","urlValidation","toLocaleLowerCase","intercept","isMultilanguage","sendRequest","clone","headers","set","authToken","handle","start","pipe","Q","j","injector","bootstrap","T","Y","t","$","D","E","provide","useClass","multi","imports","lt","r","loader","useFactory","k","deps","N","nt","tt","b","l","et","idle","timeout","ping","K","enabled","L","registrationStrategy","g","dialogRef","close","confirmation","translateText","callWaiters","refresh","it","sidemenuGarsonCall","checkNotification","headerGarsonCall","hasLogo","hasRefresh","getDigitalMenuCount","refresher","emit","afterConfirm","getFilterEntity","digitalmenuTableId","isToggleOpen","setting","showTablesPage","tableId","lastUrl","log","systemLayer","hideNotification","hasDigitalMenu","IsDigitalAlbumTransfer","isDigitalAlbum","hasTabletOrder","hasPager","exit","location","href","toggle","i","a","C","I","super","name","value","links","isSiteOnline","cWebsite","setActiveTab","hasSwitchTabIndex","selectedtab","imageCompressor","onSelect","selected","cLink","setTimeout","createElement","onload","clearTimeout","onerror","src","baseApiUrl","apiUrl","apiDownloadUrl","apiUploadUrl","apiFileUrl","downloadFile","httpClient","request","reportProgress","responseType","get_unique_string","push","charAt","Math","floor","random","length","join","uploadFile","FormData","H","z","h","type","toString","m","code","goods","append","size","sizeErr","typeErr","fileErr","toast","w","action","ufile","pt","params","getFiles","get","setPath","fileUrl","fileName","J","date","closeAll","DateNow","now","q","v","oxw","upload","selectFiles","getElementById","uploadStatus","sliders","previewImgs","totalFiles","imgUpload","files","imgPreview","remove","previewTitle","style","fontWeight","previewTitleText","createTextNode","appendChild","img","URL","createObjectURL","target","add","selectedFiles","previews","FileReader","result","readAsDataURL","service","sanitizer","bypassSecurityTrustUrl","percentage","round","loaded","total","inputFile","nativeElement","social","getSocialMedia","save","postEntity","ngUnsubscribe","goodsGroup","stringify","selectedgoods","forEach","foodtypeUrl","goodsUrl","orderTable","getTableOrder","Number","tableName","uploadService","reloadCurrentRoute","getLinkPicture","timeStamp","linkPicture","setLinkPicture","getTime","navigateByUrl","skipLocationChange","gt","showUploadState","mt","click","downloadStatus","download","Blob","setAttribute","removeChild","ft","ngOnChange","safeFiles","showDownloadError","showProgress","showUploadError","ut","Pt","component","children","runGuardsAndResolvers","ht","f","O","_","M","A","p","rt","o","ot","at","String","prototype","toAddPrefix","Array","isValid","maper","Object","keys","some","Map","SetInArray","has","_location","_snackBar","storage","ngOnDestroy","next","complete","back","test","duration","openSnackBar","text","verticalPosition","horizontalPosition","panelClass","normalizeValidator","validator","func","validate","bind","composeValidators","validators","Validators","map","asyncValidators","Subject","EventEmitter","email","mobile","telephone","nationalcode","lockserial","number","minMax","patternKey","_pattern","change","newValue","valueChange","control","asyncValidator","of","model","patternIsOk","patterns","valid","RegExp","setErrors","invalid","setMinMax","min","max","textType","failures","key","BaseControlComponent","i0","inputs","trim","hexadecimal","useExisting","ButtonComponent","NG_VALIDATORS","NG_ASYNC_VALIDATORS","NgModel","NG_VALUE_ACCESSOR","_validator","parseInt","cyk","autocomplete","show","isshow","focusFunction","focus","focusOutFunction","numberValue","withComma","parts","onChange","numberValueChange","CorrectYeKeService","InputComponent","ctx","dt","st","vt","Ct","bt","Mt","yt","Tt","Ot","ngModule","providers","production","baseUrl","loginUrl","bootstrapModule","catch","num","FarsiDate","id","price","clubCardNo","creationTime","mergeHeaderId","discountPercent","discountAmount","serviceAmount","servicePercent","taxAmount","taxPercent","roundedAmount","phoneNumber","branchCode","description","transactionNo","errorCodePay","errorMessagePay","merchantIDPay","terminalIDPay","paymentTypeCode","flagPda","customerName","flag","waiterName","guestQty","waiterId","time","sourceFlag","pdaPrintFlag","hasCashPrint","tas","factorDetail","checked","creditPrice","digitalMenuHeaderId","sumQty","sumPrice","invoiceDetail","farsiDate","usedCredit","sumUnitPrice","qty","unitPrice","toz","instagram","telegram","twitter","facebook","whatsApp","website","navLinks","route","routeConfig","buildNavItems","filter","data","label","icon","isLinkActive","linksWithHrefs","first","isActive","urlTree","waiterorderGoodsGroupList","clearData","order","openFactor","waiterFactor","waiterOrder","New_waiterFactor","loginuser","formBuilder","cache","deleteData","digitalMenuThem","setTheme","digitalmenuFactorCount","documentElement","currentTheme","ActivateTab","isUserAuthenticated","users","password","isloggedIn","loggedInUser","getRedirectUrl","redirectUrl","getLoggedInUser","getOrdermanagementUrl","ordermanagementUrl","logoutUser","getDiffDays","onUserActivity","destroy$","timerSubscription","unsubscribe","startTimer","reload","static","fromCharCode","checkNoNetwork","noNetworkMessageCaption","captionAndMessageSeparator","noNetworkMessageDetail","getResponseBody","checkAccessDenied","splice","accessDeniedMessageCaption","accessDeniedMessageDetail","checkNotFound","notFoundMessageCaption","notFoundMessageDetail","findHttpResponseMessage","getHttpResponseMessages","splitInTwo","firstPart","indexOf","secondPart","statusText","hostname","substr","hasOwnProperty","toUpperCase","slice","randomNumber","origin","protocol","port","getDay","getMonth","getFullYear","getMinutes","printDateOnly","printTimeOnly","setHours","setDate","toDateString","printDate","search","abs","valueOf","testIsAbsoluteUrl","removeNulls","arguments","apply","decodeURIComponent","cookie","encodeURIComponent","setItem","toUTCString","removeItem","hasItem","sessionStorage","localStorageSetItem","syncKeys","loadSyncKeys","syncKeysContains","sessionStorageSetItem","onInit","addToSessionStorageHelper","removeFromSessionStorageHelper","clearInstanceSessionStorage","addToSyncKeysHelper","removeFromSyncKeysHelper","syncListenerInitialised","addEventListener","sessionStorageTransferHandler","syncSessionStorage","deinitialiseStorageSyncListener","removeEventListener","clearAllStorage","clearAllSessionsStorage","clearLocalStorage","setSeconds","getSeconds","DBKEY_SYNC_KEYS","clear","saveSessionData","DBKEY_USER_DATA","testForInvalidKeys","removeFromSyncKeys","saveSyncedSessionData","addToSessionStorage","removeFromSessionStorage","moveDataToSessionStorage","moveDataToSyncedSessionStorage","moveDataToPermanentStorage","exists","sessionStorageGetItem","localStorageGetItem","getDataObject","getInitEvent","initEvent","asObservable","addToSyncKeysBackup","removeFromSyncKeysBackup","Error","reservedKeys","getSyncKeysFromStorage","addToSyncKeys","groupby","reduce","disconnect","connection","stop","isEnabled","Notification","permission","_notificationService","requestPermission","notify","alertContent","tag","sound","dir","generateNotification","selectedGroup","selectedFilter","assign","tableGroup","selectedGroupIndex","tables","refreshTableTimeLeft","find","playAudio","Audio","load","play","playNAudio","CompanyName","RequestType","AM","paymentType","ID","GovID","SC","invoice","connect","messages","wsService","ER","RS","SN","currentLang","toPersianNumber","toEnglishNumber","pure","tasvieh","Id","clearing","parsianpayment","warn","parsianSerice","CP","print","ParsianPrint","restaurantName","brandName","currency","pr","forbidden","isSupported","create","onshow","notification","event","onclick","onclose","badge","image","getBaseUrl","getToken","http","post","getIpCliente","testConnection","getWaiterList","getEntityById","updateEntity","put","deleteEntity","delete","subject","WebSocket","onmessage","readyState","OPEN","send"],"sources":["./src/services/authguard.service.ts","./src/app/app-routing.module.ts","./src/app/app.component.html","./src/app/app.component.ts","./src/services/globalerrorhandler.service.ts","./src/providers/authInterceptor.service.ts","./src/app/app.module.ts","./src/app/dialog/dialog.component.html","./src/app/dialog/dialog.component.ts","./src/app/header/header.component.html","./src/app/header/header.component.ts","./src/app/portal/portal.component.html","./src/app/portal/portal.component.ts","./src/app/portal/file-upload/upload-download.service.ts","./src/models/progress-status.model.ts","./src/app/portal/logo/logo.component.html","./src/app/portal/logo/logo.component.ts","./src/app/portal/slider/slider.component.html","./src/app/portal/slider/slider.component.ts","./src/app/portal/social/social.component.html","./src/app/portal/social/social.component.ts","./src/app/portal/goods/goods.component.html","./src/app/portal/goods/goods.component.ts","./src/app/portal/upload/upload.component.ts","./src/app/portal/upload/upload.component.html","./src/app/portal/download/download.component.ts","./src/app/portal/file-manager/file-manager.component.html","./src/app/portal/download/download.component.html","./src/app/portal/file-manager/file-manager.component.ts","./src/app/portal/portal.module.ts","./src/app/material.module.ts","./src/app/header/header.module.ts","./src/app/share.module.ts","./src/core/extended/extensions.ts","./src/core/controls/base.component.ts","./src/core/controls/shared/controls/base/validate.ts","./src/core/controls/shared/controls/base/base-control.component.ts","./src/core/controls/shared/controls/validators/hexadecimal-validator.ts","./src/core/controls/shared/controls/validators/validation.ts","./src/core/controls/shared/controls/button/button.component.ts","./src/core/controls/shared/controls/button/button.component.html","./src/core/controls/shared/controls/base/min.max.directive.ts","./src/core/controls/shared/controls/input/input.component.html","./src/core/controls/shared/controls/input/input.component.ts","./src/core/controls/shared/material.module.ts","./src/core/controls/shared/controls.mudule.ts","./src/environments/environment.ts","./src/main.ts","./src/models/enum/sourceprogram.enum.ts","./src/models/enum/state.enum.ts","./src/models/factor.model.ts","./src/models/share.model.ts","./src/models/socialmedia.model.ts","./src/models/table.model.ts","./src/models/enum/theme.enum.ts","./src/providers/sharedata.service.ts","./src/services/auth.service.ts","./src/services/correctyeke.service.ts","./src/services/utilities.ts","./src/services/local-store-manager.service.ts","./src/providers/groupby.service.ts","./src/services/order.service.ts","./src/services/parsianpos.service.ts","./src/services/persian-number.pipe.ts","./src/services/posclearing.service.ts","./src/services/push.notification.service.ts","./src/services/rest-api.service.ts","./src/services/websocket.service.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { CanActivate, CanActivateChild, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';\r\nimport { AuthService } from './auth.service';\r\n\r\n@Injectable()\r\nexport class AuthGuardService implements CanActivate, CanActivateChild {\r\n constructor(private authService: AuthService, private router: Router) {\r\n }\r\n canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\r\n const url: string = state.url;\r\n/* const request = this.storage.getData('posPaymentModelReq');*/\r\n //const hasUser: UserModel = this.storage.getData('user');\r\n //if (this.authService.isUserLoggedIn() || (hasUser && hasUser.loginDate && this.datevalidator(hasUser.loginDate))) {\r\n if (this.authService.isUserLoggedIn()) {\r\n return true;\r\n }\r\n this.authService.setRedirectUrl(url);\r\n this.router.navigate([this.authService.getLoginUrl()]);\r\n return false;\r\n }\r\n canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\r\n // let loggedInUser= this.authService.getLoggedInUser();\r\n // if (loggedInUser.role ==='ADMIN') {\r\n // return true;\r\n // } else {\r\n // \tconsole.log('Unauthorized to open link: '+ state.url);\r\n // \treturn false;\r\n // }\r\n // }\r\n return false;\r\n }\r\n datevalidator(loginDate: Date): boolean {\r\n const endDate = new Date();\r\n const startDate = new Date(loginDate);\r\n if (endDate.getDate() !== startDate.getDate() && endDate.getHours() > startDate.getHours())\r\n return false;\r\n else\r\n return true;\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\nimport { AuthGuardService } from 'src/services/authguard.service';\r\n\r\nconst routes: Routes = [\r\n { path: '', redirectTo: 'home', pathMatch: 'full' },\r\n // {path: 'home', loadChildren: () => import('./app.module').then(m => m.AppModule)},\r\n { path: 'order', loadChildren: () => import('./order/order.module').then(m => m.OrderModule) },\r\n {\r\n path: 'waiterorder', loadChildren: () => import('./waiterorder/waiterorder.module').then(m => m.WaiterorderModule)\r\n , canActivate: [AuthGuardService]\r\n },\r\n {\r\n path: 'table', loadChildren: () => import('./table/table.module').then(m => m.TableModule)\r\n , canActivate: [AuthGuardService]\r\n },\r\n { path: 'home', loadChildren: () => import('./home/home.module').then(m => m.HomeModule) },\r\n { path: 'login', loadChildren: () => import('./login/login.module').then(m => m.LoginModule) },\r\n { path: 'about', loadChildren: () => import('./about/about.module').then(m => m.AboutModule) },\r\n { path: 'club', loadChildren: () => import('./club/club.module').then(m => m.ClubModule) },\r\n {\r\n path: 'ordermanagement', loadChildren: () => import('./ordermanagement/ordermanagement.module').then(m => m.OrdermanagementModule),\r\n canActivate: [AuthGuardService]\r\n },\r\n {\r\n path: 'pay-setting', loadChildren: () => import('./setting/setting.module').then(m => m.SettingModule)\r\n , canActivate: [AuthGuardService]\r\n },\r\n {\r\n path: 'portal', loadChildren: () => import('./portal/portal.module').then(m => m.PortalModule)\r\n , canActivate: [AuthGuardService]\r\n },\r\n { path: 'game', loadChildren: () => import('./game/game.module').then(m => m.GameModule) },\r\n {\r\n path: 'payment', loadChildren: () => import('./payment/payment.module').then(m => m.PaymentModule)\r\n // , canActivate: [ AuthGuardService ]\r\n },\r\n { path: 'finalfactor', loadChildren: () => import('./finalfactor/finalfactor.module').then(m => m.FinalfactorModule) },\r\n { path: '**', loadChildren: () => import('./notfound/not-found.module').then(m => m.NotFoundModule) },\r\n // {path: 'factor', loadChildren: () => import('./factor/factor.module').then(m => m.FactorModule)},\r\n\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forRoot(routes // , //{\r\n // scrollPositionRestoration: 'enabled',\r\n // anchorScrolling: 'enabled',\r\n // scrollOffset: [0, 64] // [x, y]\r\n // }\r\n , { relativeLinkResolution: 'legacy', onSameUrlNavigation: 'reload' })],\r\n exports: [RouterModule]\r\n})\r\nexport class AppRoutingModule { }\r\n","\r\n\r\n\r\n
\r\n
این نسخه دیجیتال منو برای تست است
\r\n \r\n
\r\n
\r\n ","import { Component, OnInit } from '@angular/core';\r\nimport { trigger, transition, style, animate } from '@angular/animations';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { LocalStoreManager } from '../services/local-store-manager.service';\r\nimport { ShareDataService } from 'src/providers/sharedata.service';\r\nimport { ShareModel } from 'src/models/share.model';\r\nimport { Router } from '@angular/router';\r\nimport { RestApiService } from 'src/services/rest-api.service';\r\nimport { TableModel } from 'src/models/table.model';\r\nimport { Subscription } from 'rxjs-compat';\r\n\r\n@Component({\r\n selector: 'app-root',\r\n templateUrl: './app.component.html',\r\n styleUrls: ['./app.component.scss'],\r\n animations: [\r\n trigger('enterAnimation', [\r\n transition(':enter', [\r\n style({ transform: 'translateY(-20%)', opacity: 0 }),\r\n animate('250ms', style({ transform: 'translateY(0)', opacity: 1 }))\r\n ]),\r\n transition(':leave', [\r\n style({ transform: 'translateY(0)', opacity: 1 }),\r\n animate('250ms', style({ transform: 'translateY(-20%)', opacity: 0 }))\r\n ])\r\n ])\r\n ]\r\n})\r\nexport class AppComponent implements OnInit {\r\n\r\n title = 'SepidzDigitalMenu';\r\n isToggledUppercase = false;\r\n hideComponents = false;\r\n hideGuides = false;\r\n hideCDK = false;\r\n selectedthem = 2;\r\n isTestScreen = false;\r\n subscription: Subscription;\r\n constructor(\r\n public translate: TranslateService,\r\n public share: ShareDataService,\r\n private storageManager: LocalStoreManager,\r\n private router: Router,\r\n private api: RestApiService,\r\n ) {\r\n this.share.getSetting();\r\n this.storageManager.initialiseStorageSyncListener();\r\n this.share.goodsGroupList();\r\n }\r\n setLanguage(lan: string) {\r\n this.share.sharemodel.language = (!lan) ? 'FA' : 'EN';\r\n this.translate.setDefaultLang(lan);\r\n this.translate.use(lan);\r\n this.storageManager.savePermanentData(lan, 'Language');\r\n switch (lan) {\r\n case 'FA': {\r\n this.share.sharemodel.isrtl = true;\r\n break;\r\n }\r\n case 'EN': {\r\n this.share.sharemodel.isrtl = false;\r\n break;\r\n }\r\n default: {\r\n this.translate.setDefaultLang('FA');\r\n this.translate.use('FA');\r\n this.share.sharemodel.isrtl = true;\r\n break;\r\n }\r\n }\r\n }\r\n go(url: string) {\r\n this.router.navigate([url]);\r\n }\r\n ngOnInit() {\r\n this.share.sharemodel = new ShareModel();\r\n this.share.sharemodel.language = this.storageManager.getData(\r\n 'Language'\r\n );\r\n switch (this.storageManager.getData('Language')) {\r\n case 'FA': {\r\n this.translate.setDefaultLang('EN');\r\n this.translate.use('FA');\r\n this.share.sharemodel.isrtl = true;\r\n this.share.sharemodel.language = 'FA';\r\n\r\n break;\r\n }\r\n case 'EN': {\r\n this.translate.setDefaultLang('FA');\r\n this.translate.use('EN');\r\n this.share.sharemodel.isrtl = false;\r\n this.share.sharemodel.language = 'FA';\r\n\r\n break;\r\n }\r\n default: {\r\n this.translate.setDefaultLang('EN');\r\n this.translate.use('FA');\r\n this.share.sharemodel.isrtl = true;\r\n this.share.sharemodel.language = 'FA';\r\n\r\n break;\r\n }\r\n }\r\n\r\n if (document.body.classList.contains('button-uppercase')) {\r\n this.isToggledUppercase = true;\r\n } else if (window.localStorage.getItem('isToggledUppercase')) {\r\n this.isToggledUppercase = JSON.parse(\r\n window.localStorage.getItem('isToggledUppercase')\r\n );\r\n }\r\n }\r\n getTableList() {\r\n this.api.getEntity('AllTables').subscribe(res => {\r\n this.share.tableList = res;\r\n });\r\n }\r\n}\r\n","import { Injectable, ErrorHandler } from '@angular/core';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { MatDialog } from '@angular/material';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { DialogComponent } from 'src/app/dialog/dialog.component';\r\nimport { NgxUiLoaderService } from 'ngx-ui-loader';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GlobalErrorHandlerService implements ErrorHandler {\r\n errorCode: number;\r\n errorMessage: string;\r\n hasShowError: boolean;\r\n constructor(\r\n public dialog: MatDialog,\r\n public translate: TranslateService,\r\n private spinner: NgxUiLoaderService,\r\n ) { }\r\n handleError(error: any) {\r\n if (error instanceof HttpErrorResponse) {\r\n this.spinner.stopAll();\r\n if(error.message.toLowerCase().includes(`web server received an invalid response`)){\r\n this.hasShowError = true;\r\n const dialogRef = this.dialog.open(DialogComponent);\r\n dialogRef.componentInstance.title = this.translate.instant('Message.ConnectionSuccessful');\r\n dialogRef.componentInstance.hasCancel = true;\r\n dialogRef.componentInstance.hasOK = false;\r\n dialogRef.componentInstance.message = `${error.message}`;\r\n dialogRef.afterClosed().subscribe(result => {\r\n this.hasShowError = false;\r\n });\r\n return;\r\n }\r\n // Backend returns unsuccessful response codes such as 404, 500 etc.\r\n console.error('Backend returned status code: ', error.status);\r\n console.error('Response body:', error.message);\r\n this.errorCode = error.status;\r\n switch (error.status) {\r\n case 0:\r\n this.errorMessage = this.translate.instant('Errors.ConnectionFailed');\r\n break;\r\n\r\n default:\r\n this.errorMessage = error.message;\r\n break;\r\n }\r\n if ((error.error)) {\r\n this.errorMessage = error.error.split('at')[0];\r\n }\r\n if (this.errorMessage.toLowerCase().includes('system.exception: object reference not set to an instance of an object.')) {\r\n this.errorMessage = 'مشکلی رخ داده است لطفا صفحه را رفرش کنید.'\r\n }\r\n\r\n if (this.errorMessage.toLowerCase().includes('system.exception:')) {\r\n this.errorMessage = this.errorMessage.replace('System.Exception: ', '');\r\n }\r\n\r\n this.spinner.stopAll();\r\n if (!this.hasShowError) {\r\n this.hasShowError = true;\r\n const dialogRef = this.dialog.open(DialogComponent);\r\n dialogRef.componentInstance.title = this.translate.instant('MessageHeader.Error');\r\n dialogRef.componentInstance.hasCancel = true;\r\n dialogRef.componentInstance.message = `${this.errorMessage}`;\r\n dialogRef.afterClosed().subscribe(result => {\r\n this.hasShowError = false;\r\n });\r\n }\r\n // throw(this.errorMessage);\r\n } else {\r\n // A client-side or network error occurred.\r\n console.error('An error occurred:', error.message);\r\n const err = error.message.toLowerCase();\r\n if (!err.includes('scrollintoview') && !err.includes('minposition') && !err.includes('maxposition') ) {\r\n this.spinner.stopAll();\r\n if (!this.hasShowError) {\r\n this.hasShowError = true;\r\n const dialogRef = this.dialog.open(DialogComponent);\r\n dialogRef.componentInstance.title = this.translate.instant('MessageHeader.Error');\r\n dialogRef.componentInstance.hasCancel = true;\r\n dialogRef.componentInstance.hasOK = false;\r\n dialogRef.componentInstance.message = `${error.message}`;\r\n dialogRef.afterClosed().subscribe(result => {\r\n this.hasShowError = false;\r\n });\r\n }\r\n }\r\n // this.message.showMessage('',error.message);\r\n }\r\n this.spinner.stopAll();\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpInterceptor, HttpHandler, HttpRequest, HttpEvent, HttpResponse, HttpErrorResponse } from '@angular/common/http';\r\nimport { Observable } from 'rxjs-compat';\r\n\r\nimport { AuthService } from 'src/services/auth.service';\r\nimport { LocalStoreManager } from 'src/services/local-store-manager.service';\r\nimport { NgxUiLoaderService } from 'ngx-ui-loader';\r\nimport { tap } from 'rxjs/operators/tap';\r\n\r\nconst TTL = 40;\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AuthInterceptor implements HttpInterceptor {\r\n authToken: string;\r\n constructor(\r\n private auth: AuthService,\r\n private cache: LocalStoreManager,\r\n private spinner: NgxUiLoaderService,\r\n ) {\r\n }\r\n urlValidation(req: HttpRequest): boolean {\r\n const filte = req.url.toLocaleLowerCase();\r\n const validation = filte.includes('i18n') || filte.includes('test') || filte.includes('waiters') || filte.includes('token') || filte.includes('goodsgrouplist') || filte.includes('setting') || filte.includes('savefactor') || filte.includes('tables') || filte.includes('Waiters')\r\n || filte.includes('GetFactor') || filte.includes('IntegratedFactor') || filte.includes('UpdateFactors') || filte.includes('CheckInventory') || filte.includes('TablesGroup') || filte.includes('GetTableFactor')\r\n || filte.includes('UpdateFactorState') || filte.includes('TableHasOrder') || filte.includes('CallWaiters')\r\n || filte.includes('GetTableOrder') || filte.includes('SystemValidation') || filte.includes('GetTableTimeLeft')\r\n || filte.includes('GetDigitalMenuFactorCount') || filte.includes('SystemLanguage') || filte.includes('OnlinePaymentResult')|| filte.includes('SocialMedia')\r\n || filte.includes('AllTables');\r\n return validation;\r\n }\r\n intercept(req: HttpRequest, next: HttpHandler) {\r\n //if (req && !req.url.includes('/i18n/') ) {\r\n // this.spinner.start();\r\n //}\r\n if (!this.urlValidation(req)) {\r\n //this.authToken = this.auth.getAuthorizationToken();\r\n const authReq = req.clone({\r\n headers: req.headers.set('Authorization', 'Bearer ' + this.authToken)\r\n });\r\n if (!this.isMultilanguage(authReq)) {\r\n // this.messge.present();\r\n }\r\n //this.spinner.stopAll();\r\n return next.handle(authReq);\r\n // return this.sendRequest(authReq, next);\r\n } else {\r\n if (!this.isMultilanguage(req)) {\r\n // this.messge.present();\r\n }\r\n // return next.handle(req);\r\n return this.sendRequest(req, next);\r\n }\r\n }\r\n isMultilanguage(req: HttpRequest): boolean {\r\n const filte = req.url.toLocaleLowerCase();\r\n const validation = filte.includes('i18n');\r\n return validation;\r\n }\r\n\r\n sendRequest(\r\n req: HttpRequest,\r\n next: HttpHandler\r\n ): Observable> {\r\n // try {\r\n if (req && !req.url.includes('/i18n/')) {\r\n this.spinner.start();\r\n }\r\n return next.handle(req).pipe(\r\n tap(event => {\r\n if (event instanceof HttpResponse) {\r\n // if (event.url !== 'http://localhost:2121/GoodsGroupList') {\r\n // this.spinner.stop();\r\n // }\r\n this.spinner.stopAll();\r\n }\r\n if (event instanceof HttpErrorResponse) {\r\n this.spinner.stopAll();\r\n }\r\n // this.spinner.stopAll();\r\n })\r\n );\r\n // } catch (error) {\r\n // this.spinner.stopAll();\r\n // return next.handle(req);\r\n // }\r\n }\r\n}\r\n","import { NgModule, ErrorHandler, Injector } from '@angular/core';\r\nimport { AppRoutingModule } from './app-routing.module';\r\nimport { AppComponent } from './app.component';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { HttpClientModule, HttpClient, HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport { TranslateModule, TranslateLoader } from '@ngx-translate/core';\r\nimport { TranslateHttpLoader } from '@ngx-translate/http-loader';\r\nimport { LocalStoreManager } from 'src/services/local-store-manager.service';\r\nimport { DialogComponent } from './dialog/dialog.component';\r\nimport { GlobalErrorHandlerService } from 'src/services/globalerrorhandler.service';\r\nimport { AuthInterceptor } from 'src/providers/authInterceptor.service';\r\nimport { AuthService } from 'src/services/auth.service';\r\nimport { NgxUiLoaderModule } from 'ngx-ui-loader';\r\nimport { AuthGuardService } from 'src/services/authguard.service';\r\nimport { ShareModule } from './share.module';\r\nimport { ControlsModule } from 'src/core/controls/shared/controls.mudule';\r\nimport { ToastrModule } from 'ngx-toastr';\r\nimport { SepidzToastComponent } from 'src/core/controls/shared/controls/toaster/sepidztoast.component';\r\nimport { DescriptionDialogComponent } from './orderdescription/description-dialog.component';\r\nimport { UserIdleModule } from 'angular-user-idle';\r\nimport { WebsocketService } from 'src/services/websocket.service';\r\nimport { ParsianPosService } from 'src/services/parsianpos.service';\r\nimport { PosClearingService } from 'src/services/posclearing.service';\r\nimport { InvoiceComponent } from './invoice/invoice.component';\r\nimport { PortalModule } from './portal/portal.module';\r\nimport { ServiceWorkerModule } from '@angular/service-worker';\r\nimport { environment } from '../environments/environment';\r\nimport { PushNotificationsService } from 'src/services/push.notification.service';\r\n\r\nexport function createTranslateLoader(http: HttpClient) {\r\n return new TranslateHttpLoader(http, './assets/i18n/', '.json');\r\n}\r\n@NgModule({\r\n declarations: [\r\n AppComponent,\r\n DialogComponent,\r\n SepidzToastComponent,\r\n DescriptionDialogComponent,\r\n InvoiceComponent\r\n ],\r\n imports: [\r\n // BrowserModule,\r\n HttpClientModule,\r\n ToastrModule.forRoot(\r\n // {toastComponent: SepidzToastComponent, // added custom toast!\r\n // }\r\n ),\r\n TranslateModule.forRoot({\r\n loader: {\r\n provide: TranslateLoader,\r\n useFactory: createTranslateLoader,\r\n deps: [HttpClient]\r\n }\r\n }),\r\n AppRoutingModule,\r\n BrowserAnimationsModule,\r\n ShareModule,\r\n ControlsModule,\r\n NgxUiLoaderModule,\r\n PortalModule,\r\n UserIdleModule.forRoot({ idle: 15, timeout: 5, ping: 3 }),\r\n ServiceWorkerModule.register('ngsw-worker.js', {\r\n enabled: environment.production,\r\n // Register the ServiceWorker as soon as the app is stable\r\n // or after 30 seconds (whichever comes first).\r\n registrationStrategy: 'registerWhenStable:30000'\r\n })\r\n // SlideshowModule\r\n // ShareModule\r\n ],\r\n providers: [\r\n AuthGuardService,\r\n HttpClientModule,\r\n LocalStoreManager,\r\n GlobalErrorHandlerService,\r\n PushNotificationsService,\r\n AuthService,\r\n WebsocketService,\r\n ParsianPosService,\r\n PosClearingService,\r\n {\r\n provide: ErrorHandler,\r\n useClass: GlobalErrorHandlerService\r\n },\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: AuthInterceptor, multi: true\r\n }\r\n ],\r\n exports: [],\r\n bootstrap: [AppComponent]\r\n})\r\nexport class AppModule {\r\n static injector: Injector;\r\n constructor(injector: Injector) {\r\n AppModule.injector = injector;\r\n }\r\n}\r\n","

{{title}}

\r\n\r\n
\r\n

{{message}}

\r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { MatDialogRef } from '@angular/material';\r\nimport { TranslateService } from '@ngx-translate/core';\r\n\r\n@Component({\r\n selector: 'app-dialog',\r\n templateUrl: './dialog.component.html',\r\n styleUrls: ['./dialog.component.scss']\r\n})\r\nexport class DialogComponent implements OnInit {\r\n title = '';\r\n message = '';\r\n hasCancel: boolean;\r\n hasOK: boolean;\r\n constructor(public dialogRef: MatDialogRef\r\n , protected translateText: TranslateService) {\r\n }\r\n ngOnInit() {\r\n if (!this.message || this.message === '') {\r\n this.dialogRef.close();\r\n }\r\n }\r\n confirmation(middleMessage: string) {\r\n this.hasCancel = true;\r\n this.hasOK = true;\r\n this.title = this.translateText.instant('Public.Attention');\r\n this.message = this.translateText.instant('Message.Confirm');\r\n this.message = this.message.replace('{0}', middleMessage);\r\n }\r\n}\r\n","
\r\n
\r\n \r\n \r\n
\r\n {{this.share.loginuser ? this.share.loginuser.name : ''}}\r\n
\r\n
\r\n
\r\n \"logo\"\r\n
\r\n
\r\n \r\n\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n SEPIDZ\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n
www.SEPIDZ.com 2.1.0801.1
\r\n
\r\n
\r\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\r\nimport { ShareModel } from '../../models/share.model';\r\nimport { LocalStoreManager } from '../../services/local-store-manager.service';\r\nimport { BreakpointObserver } from '@angular/cdk/layout';\r\nimport { ShareDataService } from '../../providers/sharedata.service';\r\nimport { Router } from '@angular/router';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { RestApiService } from 'src/services/rest-api.service';\r\nimport { DialogComponent } from '../dialog/dialog.component';\r\nimport { MatDialog } from '@angular/material';\r\n\r\n@Component({\r\n selector: 'app-header',\r\n templateUrl: './header.component.html',\r\n styleUrls: ['./header.component.scss']\r\n})\r\nexport class HeaderComponent implements OnInit {\r\n @Input('title') title: string;\r\n @Input('url') url?: string;\r\n @Input('hasLogo') hasLogo: boolean;\r\n @Input('hasRefresh') hasRefresh: boolean;\r\n @Input('hasPager') hasPager: boolean;\r\n @Input('hasnotification') hasnotification: boolean;\r\n @Output() refresher: EventEmitter = new EventEmitter();\r\n\r\n isToggledUppercase = false;\r\n hideComponents = false;\r\n hideGuides = false;\r\n hideCDK = false;\r\n selectedthem = 2;\r\n isToggleOpen = false;\r\n currenturl = '';\r\n hideNotification: boolean = false;\r\n sidemenuGarsonCall: boolean; headerGarsonCall: boolean;\r\n constructor(\r\n private breakObserver: BreakpointObserver,\r\n private storageManager: LocalStoreManager,\r\n public share: ShareDataService,\r\n protected router: Router,\r\n protected translate: TranslateService,\r\n protected api: RestApiService,\r\n protected dialog: MatDialog\r\n ) {\r\n this.storageManager.initialiseStorageSyncListener();\r\n }\r\n ngOnInit() {\r\n this.sidemenuGarsonCall = this.checkNotification('sidemenu');\r\n this.headerGarsonCall = this.checkNotification();\r\n if (!(this.hasLogo)) {\r\n this.hasLogo = false;\r\n }\r\n if (!(this.hasRefresh)) {\r\n this.hasRefresh = false;\r\n }\r\n this.share.sharemodel = new ShareModel();\r\n this.share.sharemodel.language = this.storageManager.getData(\r\n 'Language'\r\n );\r\n switch (this.storageManager.getData('Language')) {\r\n case 'FA': {\r\n this.translate.setDefaultLang('EN');\r\n this.translate.use('FA');\r\n this.share.sharemodel.isrtl = true;\r\n this.share.sharemodel.language = 'FA';\r\n\r\n break;\r\n }\r\n case 'EN': {\r\n this.translate.setDefaultLang('FA');\r\n this.translate.use('EN');\r\n this.share.sharemodel.isrtl = false;\r\n this.share.sharemodel.language = 'EN';\r\n\r\n break;\r\n }\r\n default: {\r\n this.translate.setDefaultLang('EN');\r\n this.translate.use('FA');\r\n this.share.sharemodel.isrtl = true;\r\n this.share.sharemodel.language = 'FA';\r\n\r\n break;\r\n }\r\n }\r\n }\r\n setLanguage(lan: string) {\r\n this.share.sharemodel.language = lan;\r\n this.translate.setDefaultLang(lan);\r\n this.translate.use(lan);\r\n this.storageManager.savePermanentData(lan, 'Language');\r\n switch (lan) {\r\n case 'FA': {\r\n this.share.sharemodel.isrtl = true;\r\n break;\r\n }\r\n case 'EN': {\r\n this.share.sharemodel.isrtl = false;\r\n break;\r\n }\r\n default: {\r\n this.translate.setDefaultLang('FA');\r\n this.translate.use('FA');\r\n this.share.sharemodel.isrtl = true;\r\n break;\r\n }\r\n }\r\n }\r\n refresh() {\r\n this.share.getDigitalMenuCount();\r\n this.refresher.emit(this.url);\r\n }\r\n callWaiters() {\r\n this.confirmation(this.translate.instant('MainPage.GarsonCall'));\r\n }\r\n confirmation(title: string) {\r\n const dialogRef = this.dialog.open(DialogComponent);\r\n dialogRef.componentInstance.confirmation(title);\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result === 'Ok') {\r\n this.afterConfirm();\r\n } else {\r\n return;\r\n }\r\n });\r\n }\r\n afterConfirm() {\r\n this.api.getFilterEntity('CallWaiters', this.share.digitalmenuTableId).subscribe((res: number) => {\r\n this.isToggleOpen = false;\r\n });\r\n this.isToggleOpen = false;\r\n }\r\n go(url: string) {\r\n this.isToggleOpen = !this.isToggleOpen;\r\n if (url === 'waiterorder') {\r\n if (this.share.setting.showTablesPage === 0) {\r\n url = 'table';\r\n } else {\r\n url = 'waiterorder';\r\n }\r\n }\r\n if (url === 'order/TableId/' && this.share.tableId && this.share.tableId != '')\r\n url = url + this.share.tableId\r\n if (url === 'order/TableId/' && (!this.share.tableId || this.share.tableId != '')) {\r\n this.share.tableId = '1';\r\n url = url + this.share.tableId;\r\n }\r\n this.share.lastUrl = '/' + url;\r\n console.log(this.share.lastUrl);\r\n this.router.navigate(['/' + url]);\r\n }\r\n\r\n //---- @checkNotification ----\r\n //home و tableid/0 اگر در کنار لایسنس منوی آنلاین ، نسخه کلاینت اندروید در لایسنس موجود بود به جز صفحات \r\n //اگر دیجیتال منو بود یا تبدیل منوی آنلاین به دیجیتال منو بود هم نمایش بده\r\n //تمامی میزها دارای فراخوانی گارسون خواهند بود.\r\n //-----\r\n checkNotification(x?: string): boolean {\r\n let systemLayer = this.share.setting.systemLayer;\r\n if (this.router.url == \"/home\") { this.hideNotification = true; return false; }\r\n if (this.router.url == \"/table\" || this.router.url == \"/setting\" || this.router.url == \"/portal\" || this.router.url == \"/ordermanagement\" || this.router.url == \"/waiterorder\") { this.hideNotification = true; return false; }\r\n\r\n if (this.share.tableId === '0' || this.router.url === \"/order/TableId/0\") {\r\n this.hideNotification = true;\r\n return false;\r\n }\r\n\r\n if (systemLayer.hasDigitalMenu || systemLayer.IsDigitalAlbumTransfer)\r\n this.hideNotification = false;\r\n\r\n if (systemLayer.isDigitalAlbum && systemLayer.hasTabletOrder === false)\r\n this.hideNotification = true;\r\n\r\n if (this.share.tableId === '0')\r\n this.hideNotification = true;\r\n else if (this.share.setting.systemLayer.isDigitalAlbum && this.share.setting.systemLayer.hasTabletOrder)\r\n this.hideNotification = false;\r\n\r\n if (systemLayer.isDigitalAlbum && systemLayer.hasTabletOrder)\r\n this.hideNotification = false;\r\n\r\n if (x == 'sidemenu' && this.hasPager && this.hideNotification)\r\n return true;\r\n if (this.hasPager && this.share.setting.systemLayer.hasDigitalMenu && this.share.tableId !== \"0\")\r\n return true;\r\n\r\n return true;\r\n }\r\n exit() {\r\n window.location.href = '/login';\r\n }\r\n}\r\n","\r\n\r\n
\r\n

portal works!

\r\n\r\n \r\n \r\n\r\n
","import { Component, OnInit } from '@angular/core';\r\nimport { ThemePalette } from '@angular/material/core';\r\nimport { BaseComponent } from 'src/core/controls/base.component';\r\nimport { ShareDataService } from 'src/providers/sharedata.service';\r\nimport { OrderService } from 'src/services/order.service';\r\nimport { ShareModule } from '../share.module';\r\nimport { NgxUiLoaderService } from 'ngx-ui-loader';\r\n\r\n@Component({\r\n selector: 'app-portal',\r\n templateUrl: './portal.component.html',\r\n styleUrls: ['./portal.component.scss'],\r\n})\r\nexport class PortalComponent extends BaseComponent implements OnInit {\r\n title: string = \"Digital-Menu Portal\";\r\n selected: string;\r\n printed: string;\r\n \r\n cWebsite: string;\r\n cLink: boolean=true;\r\n\r\n // LogoFormControl = new FormControl('');\r\n\r\n options = [\r\n { name: \"Logo\", value: 1 },\r\n { name: \"Goods\", value: 2 },\r\n { name: \"Slider\", value: 3 },\r\n { name: \"social media\", value: 4 }\r\n ]\r\n\r\n links: object[] = [\r\n {name: 'کد گروه کالا'},\r\n {name: 'کد لیست کالا'}\r\n ];\r\n canChange = true;\r\n isFinish: boolean = true;\r\n\r\n activeLink = this.links[0];\r\n background: ThemePalette = undefined;\r\n \r\n constructor(\r\n public shared: ShareModule,\r\n public share: ShareDataService,\r\n private order: OrderService,\r\n private spinner: NgxUiLoaderService) {\r\n super();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.share.lastUrl = 'portal';\r\n\r\n this.isSiteOnline(\"https://imageresizer.com/image-compressor\",found =>{\r\n if(found) {\r\n // site is online\r\n this.cWebsite = \"https://imageresizer.com/image-compressor\";\r\n }\r\n else {\r\n this.cWebsite= \"https://www.freeconvert.com/image-converter\";\r\n }\r\n });\r\n }\r\n\r\n setActiveTab(event: any) {\r\n if (event === 1)\r\n this.share.hasSwitchTabIndex = true;\r\n switch (this.share.selectedtab) {\r\n case 0: // index of the tab\r\n this.router.navigate(['/portal/logo']);\r\n break;\r\n case 1:\r\n this.router.navigate(['/portal/goods']);\r\n break;\r\n case 2:\r\n this.router.navigate(['/portal/slider']);\r\n break;\r\n case 3:\r\n this.router.navigate(['/portal/social']);\r\n break;\r\n }\r\n this.imageCompressor();\r\n }\r\n\r\n onSelect(evt: any) {\r\n this.selected = evt.value;\r\n console.log(this.selected);\r\n }\r\n\r\n imageCompressor() { \r\n switch (this.share.selectedtab) {\r\n case 3:\r\n this.cLink = false;\r\n break;\r\n default:\r\n this.cLink = true;\r\n break;\r\n } \r\n }\r\n\r\n isSiteOnline(url,callback) {\r\n // try to load favicon\r\n var timer = setTimeout(function(){\r\n // timeout after 5 seconds\r\n callback(false);\r\n },5000)\r\n\r\n var img = document.createElement(\"img\");\r\n img.onload = function() {\r\n clearTimeout(timer);\r\n callback(true);\r\n }\r\n\r\n img.onerror = function() {\r\n clearTimeout(timer);\r\n callback(false);\r\n }\r\n\r\n img.src = url+\"/favicon.ico\";\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpRequest, HttpEvent, HttpParams } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { BaseComponent } from 'src/core/controls/base.component';\r\nimport { ShareDataService } from 'src/providers/sharedata.service';\r\nimport { GoodsModel } from 'src/models/goods.model';\r\nimport { GoodsGroupModel } from 'src/models/goodsgroup.model';\r\n\r\n@Injectable()\r\nexport class UploadDownloadService extends BaseComponent {\r\n private baseApiUrl: string;\r\n private apiDownloadUrl: string;\r\n private apiUploadUrl: string;\r\n private apiFileUrl: any;\r\n\r\n sizeErr: number;\r\n typeErr: any;\r\n fileErr: string;\r\n\r\n fileUrl: any;\r\n fileName: string;\r\n\r\n gg: GoodsGroupModel;\r\n goods: GoodsModel;\r\n\r\n constructor(private httpClient: HttpClient,public share: ShareDataService) {\r\n super();\r\n this.baseApiUrl = this.api.apiUrl + '/api/';\r\n this.apiDownloadUrl = this.baseApiUrl + 'download';\r\n this.apiUploadUrl = this.baseApiUrl + 'upload';\r\n this.apiFileUrl = this.baseApiUrl + 'files';\r\n }\r\n\r\n public downloadFile(file: string): Observable> {\r\n return this.httpClient.request(new HttpRequest(\r\n 'GET',\r\n `${this.apiDownloadUrl}?file=${file}`,\r\n null,\r\n {\r\n reportProgress: true,\r\n responseType: 'blob'\r\n }));\r\n }\r\n\r\n get_unique_string (strLength, charSet=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\") {\r\n var result = [];\r\n\r\n strLength = strLength || 5;\r\n charSet = charSet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n\r\n while (--strLength) {\r\n result.push(charSet.charAt(Math.floor(Math.random() * charSet.length)));\r\n }\r\n\r\n return result.join('');\r\n }\r\n\r\n public uploadFile(file: Blob, action: string, data?: any): Observable> {\r\n const formData = new FormData();\r\n const emptyData = new FormData();\r\n let aName;\r\n let file_name_array = file.type.toString().split(\"/\");\r\n let file_extension = file_name_array[1];\r\n const actionType = action;\r\n\r\n switch (action) {\r\n case \"default\": aName=action;\r\n action = this.get_unique_string(\"8\")+\".\" + file_extension;\r\n break;\r\n case \"logo\":\r\n aName=action;\r\n action += \".png\";\r\n break;\r\n case \"foodtype\":\r\n aName=action;\r\n if (file_extension !== \"png\") action = data.code + \".\" + 'png'; else action = data.code + \".\" + file_extension;\r\n break;\r\n case \"goods\":\r\n aName=action;\r\n this.goods = data;\r\n action = this.goods.code + \".\"+'jpg';\r\n break;\r\n case \"slider\":\r\n aName=action;\r\n action = data+\".\"+'jpg';\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n formData.append('file', file, action);\r\n \r\n if(aName == \"logo\" && file.size > 150000) {\r\n console.error('LOGO/لوگو is too big! '+ file_extension +' '+ file.size);\r\n this.sizeErr = file.size; this.typeErr = file.type;\r\n this.fileErr = 'حجم لوگو بیشتر از حد مجاز است!';\r\n this.toast( 'حجم لوگو بیشتر از حد مجاز است!');\r\n return this.httpClient.request(new HttpRequest('POST',this.apiUploadUrl,emptyData,{reportProgress: true}));\r\n }\r\n if (aName == \"goods\" && file.size > 500000) { //اگر حجم فایل بزرگ تر از 500 کیلوبایت بود، خطا\r\n console.error('تصویرکالا is too big! '+ file_extension +' '+ file.size);\r\n this.sizeErr = file.size; this.typeErr = file.type;\r\n this.fileErr = 'حجم تصویر بیشتر از حد مجاز است!';\r\n this.toast( 'حجم تصویر بیشتر از حد مجاز است!');\r\n return this.httpClient.request(new HttpRequest('POST',this.apiUploadUrl,emptyData,{reportProgress: true}));\r\n }\r\n if (aName == \"foodtype\" && file.size > 500000) {\r\n console.error('تصویر سرگروه is too big! ' + file_extension + ' ' + file.size);\r\n this.sizeErr = file.size; this.typeErr = file.type;\r\n this.fileErr = 'حجم تصویر بیشتر از حد مجاز است!';\r\n this.toast('حجم تصویر بیشتر از حد مجاز است!');\r\n return this.httpClient.request(new HttpRequest('POST', this.apiUploadUrl, emptyData, { reportProgress: true }));\r\n }\r\n if (aName == \"slider\" && file.size > 500000) {\r\n this.fileErr = 'حجم تصویر اسلاید بیشتر از حد مجاز است!';\r\n this.toast('حجم تصویر اسلاید بیشتر از حد مجاز است!');\r\n return this.httpClient.request(new HttpRequest('POST', this.apiUploadUrl, emptyData, { reportProgress: true }));\r\n }\r\n const fileUpload = new FileUploadModel();\r\n fileUpload.action = actionType;\r\n fileUpload.ufile = file;\r\n let params = new HttpParams();\r\n params.append('Action', '1');\r\n formData.append('Action', actionType);\r\n // .set('password','12345678');\r\n return this.httpClient.request(new HttpRequest(\r\n 'POST',\r\n this.apiUploadUrl,\r\n formData,\r\n {\r\n reportProgress: true,\r\n params: params,\r\n }\r\n ));\r\n }\r\n\r\n\r\n public getFiles(): Observable {\r\n return this.httpClient.get(this.apiFileUrl);\r\n }\r\n\r\n setPath(file: any) {\r\n this.fileUrl = file;\r\n this.fileName = file.name;\r\n }\r\n}\r\nexport class FileUploadModel{\r\n public ufile :any;\r\n public action :any;\r\n}\r\n","export interface ProgressStatus {\r\n status: ProgressStatusEnum;\r\n percentage?: number;\r\n}\r\n \r\nexport enum ProgressStatusEnum {\r\n START, COMPLETE, IN_PROGRESS, ERROR\r\n}","
\r\n {{ 'Portal.Hint.Logo' | translate | persianNumber}}\r\n \"\"\r\n \r\n {{uploadService.typeErr}}\r\n \r\n \r\n {{ 'Portal.Hint.Logo' | translate }}\r\n \r\n \r\n
\r\n","import {Component, OnInit } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { UploadDownloadService } from '../file-upload/upload-download.service';\r\nimport { ShareDataService } from 'src/providers/sharedata.service';\r\nimport { DialogComponent } from 'src/app/dialog/dialog.component';\r\nimport { MatDialog } from '@angular/material/dialog';\r\n\r\n\r\n@Component({\r\n selector: 'app-logo',\r\n templateUrl: './logo.component.html',\r\n styleUrls: ['./logo.component.scss']\r\n})\r\nexport class LogoComponent implements OnInit {\r\n loading: boolean = false;\r\n loader: string;\r\n fileName: string;\r\n selectedFile: FormData;\r\n DateNow: string;\r\n \r\n constructor(public uploadService: UploadDownloadService, public router: Router, public share: ShareDataService,public dialog: MatDialog) { }\r\n \r\n\r\n ngOnInit(): void {\r\n this.date();\r\n }\r\n\r\n confirmation(title: string) {\r\n const dialogRef = this.dialog.open(DialogComponent);\r\n dialogRef.componentInstance.confirmation(title);\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result === 'Ok') {\r\n this.dialog.closeAll();\r\n } else {\r\n return;\r\n }\r\n });\r\n }\r\n date(): void { this.DateNow = `?${Date.now()}`; }\r\n\r\n}\r\n","
\r\n {{ 'Portal.Hint.Images' | translate | persianNumber}}\r\n
\r\n

{{ 'Portal.Menu.Images' | translate }}

\r\n
\r\n
\r\n \r\n +\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n","import { HttpEventType } from '@angular/common/http';\r\nimport { Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { ProgressStatus, ProgressStatusEnum } from 'src/models/progress-status.model';\r\nimport { ShareDataService } from 'src/providers/sharedata.service';\r\nimport { UploadDownloadService } from '../file-upload/upload-download.service';\r\n\r\n@Component({\r\n selector: 'app-slider',\r\n templateUrl: './slider.component.html',\r\n styleUrls: ['./slider.component.scss']\r\n})\r\nexport class SliderComponent implements OnInit {\r\n\r\n imgUpload: any;\r\n previews: string[] = [];\r\n selectedFiles?: FileList;\r\n imgPreview = document.getElementById('img_preview');\r\n imgUploadForm = document.getElementById('img-upload-form');\r\n totalFiles: any;\r\n previewTitle: any;\r\n previewTitleText: any;\r\n img: any;\r\n sliders: object[];\r\n \r\n @Input() public disabled: boolean;\r\n @Output() public uploadStatus: EventEmitter;\r\n @ViewChild('inputFile') inputFile: ElementRef;\r\n @Output() public showUploadState: any;\r\n DateNow: string;\r\n\r\n constructor(public service: UploadDownloadService,public share: ShareDataService,private sanitizer: DomSanitizer,public dialog: MatDialog) { \r\n this.uploadStatus = new EventEmitter();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.date();\r\n this.sliders = [\r\n {'name': 'slider1', 'src': '/1'},\r\n {'name': 'slider2', 'src': '/2'},\r\n {'name': 'slider3', 'src': '/3'},\r\n {'name': 'slider4', 'src': '/4'},\r\n {'name': 'slider5', 'src': '/5'},\r\n {'name': 'slider6', 'src': '/6'}\r\n ]\r\n }\r\n\r\npreviewImgs(event) {\r\n this.totalFiles = this.imgUpload.files;\r\n \r\n if(!!this.totalFiles) {\r\n this.imgPreview.classList.remove('quote-imgs-thumbs--hidden');\r\n this.previewTitle = document.createElement('p');\r\n this.previewTitle.style.fontWeight = 'bold';\r\n this.previewTitleText = document.createTextNode(this.totalFiles + ' Total Images Selected');\r\n this.previewTitle.appendChild(this.previewTitleText);\r\n this.imgPreview.appendChild(this.previewTitle);\r\n }\r\n \r\n for(var i = 0; i < this.totalFiles; i++) {\r\n this.img = document.createElement('img');\r\n this.img.src = URL.createObjectURL(event.target.files[i]);\r\n this.img.classList.add('img-preview-thumb');\r\n this.imgPreview.appendChild(this.img);\r\n }\r\n}\r\n\r\nselectFiles(event: any): void {\r\n this.selectedFiles = event.target.files;\r\n\r\n this.previews = [];\r\n if (this.selectedFiles && this.selectedFiles[0]) {\r\n const numberOfFiles = this.selectedFiles.length;\r\n for (let i = 0; i < numberOfFiles; i++) {\r\n const reader = new FileReader();\r\n\r\n reader.onload = (e: any) => {\r\n this.previews.push(e.target.result);\r\n };\r\n\r\n reader.readAsDataURL(this.selectedFiles[i]);\r\n }\r\n }\r\n}\r\n\r\npublic upload(event, action: string, sdata: string) {\r\n if (event.target.files && event.target.files.length > 0) {\r\n const file = event.target.files[0];\r\n this.service.setPath(this.sanitizer.bypassSecurityTrustUrl(file));\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.START});\r\n this.service.uploadFile(file, action, sdata).subscribe(\r\n data => {\r\n if (data && data.type !== 0) {\r\n switch (data.type) {\r\n case HttpEventType.UploadProgress:\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.IN_PROGRESS, percentage: Math.round((data.loaded / data.total) * 100)});\r\n break;\r\n case HttpEventType.Response:\r\n this.date();\r\n this.inputFile.nativeElement.value = '';\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.COMPLETE});\r\n //this.showUploadState = \"حجم فایل های آپلود شده بیشتر از حد مجاز است!\";\r\n break;\r\n }\r\n }\r\n },\r\n error => {\r\n this.inputFile.nativeElement.value = '';\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.ERROR});\r\n }\r\n );\r\n }\r\n}\r\n\r\ndate(): void { this.DateNow = `?${Date.now()}`; }\r\n\r\n}\r\n","
\r\n {{ 'Portal.Hint.Social' | translate }}\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n نمایش\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n \r\n نمایش\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n \r\n نمایش\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n \r\n نمایش\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n نمایش\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n \r\n \r\n نمایش\r\n \r\n
\r\n
\r\n\r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n
\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { BaseComponent } from 'src/core/controls/base.component';\r\nimport { SocialMedia } from 'src/models/socialmedia.model';\r\nimport { RestApiService } from 'src/services/rest-api.service';\r\n\r\n@Component({\r\n selector: 'app-social',\r\n templateUrl: './social.component.html',\r\n styleUrls: ['./social.component.scss']\r\n})\r\nexport class SocialComponent extends BaseComponent implements OnInit {\r\n\r\n ngUnsubscribe = new Subject();\r\n social: SocialMedia;\r\n\r\n constructor(protected api: RestApiService) { super(); }\r\n\r\n ngOnInit(): void {\r\n this.social = new SocialMedia();\r\n this.getSocialMedia();\r\n }\r\n\r\n save() {\r\n this.api.postEntity(this.social, 'SocialMedia')\r\n .pipe(takeUntil(this.ngUnsubscribe)).subscribe( data => {\r\n if(data) this.toast(\"✓ شبکه های اجتماعی ذخیره شد\");\r\n })\r\n }\r\n\r\n getSocialMedia() {\r\n this.api.getEntity('GetSocialMedia')\r\n .pipe(takeUntil(this.ngUnsubscribe)).subscribe( data => {\r\n if(data)\r\n this.social = data[0];\r\n console.log(data);\r\n });\r\n }\r\n}\r\n","
\r\n {{ 'Portal.Hint.Goods' | translate }}\r\n {{ 'Portal.Hint.Goods' | translate }}\r\n
    \r\n
  • \r\n
    \r\n
    \r\n \"FoodImage\"\r\n \r\n
    \r\n
    \r\n
    \r\n {{gg.nameLatin && !share.sharemodel.isrtl ? gg.nameLatin : gg.name}}\r\n
    \r\n
    \r\n
    \r\n
      \r\n
    • \r\n
      \r\n
      \r\n {{goods.code | persianNumber}}\r\n \"FoodImage\"\r\n \r\n\r\n
      {{ 'Errors.LackOfInventory' | translate }}
      \r\n
      {{goods.discount}}%
      \r\n
      \r\n {{goods.name}}\r\n
    • \r\n
    \r\n
  • \r\n
\r\n
\r\n","import { Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';\r\nimport { BaseComponent } from 'src/core/controls/base.component';\r\nimport { GoodsModel } from 'src/models/goods.model';\r\nimport { GoodsGroupModel } from 'src/models/goodsgroup.model';\r\nimport { TableModel } from 'src/models/table.model';\r\nimport { ShareDataService } from 'src/providers/sharedata.service';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { UploadDownloadService } from '../file-upload/upload-download.service';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { ProgressStatus, ProgressStatusEnum } from 'src/models/progress-status.model';\r\nimport { HttpEventType } from '@angular/common/http';\r\n\r\n@Component({\r\n selector: 'app-goods',\r\n templateUrl: './goods.component.html',\r\n styleUrls: ['./goods.component.scss']\r\n})\r\nexport class GoodsComponent extends BaseComponent implements OnInit {\r\n\r\n @Input() public disabled: boolean;\r\n @Output() public uploadStatus: EventEmitter;\r\n @ViewChild('inputFile') inputFile: ElementRef;\r\n @ViewChild(\"myFoodElem\") myFoodElem: ElementRef;\r\n @ViewChild(\"myFoodtypeElem\") myFoodtypeElem: ElementRef;\r\n goodsGroup: GoodsGroupModel[];\r\n selectedGoodsGroup: GoodsGroupModel;\r\n firstGoodsGroup: GoodsGroupModel;\r\n selectedIndex = 0;\r\n selectedGoodsGroupIndex = 0;\r\n selectedgoods: GoodsModel[]; timeStamp: any; linkPicture: string;\r\n DateNow: string;\r\n\r\n constructor(public share: ShareDataService, public uploadService: UploadDownloadService,\r\n private sanitizer: DomSanitizer) {\r\n super();\r\n this.uploadStatus = new EventEmitter();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.goodsGroupList(); this.date();\r\n }\r\n\r\n goodsGroupList() {\r\n if (!(this.share.goodsGroup)) {\r\n this.goodsGroup = null;\r\n this.api.getEntity('GoodsGroupList')\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(res => {\r\n this.goodsGroup = res;\r\n this.share.goodsGroup = JSON.parse(JSON.stringify(this.goodsGroup));\r\n this.goodsGroup.forEach(e => {\r\n e.foodtypeUrl = '../../../assets/imgs/foodtype/' + e.code + '.png';\r\n e.goods.forEach(ele => {\r\n ele.goodsUrl = '../../../assets/imgs/' + ele.code + '.jpg';\r\n });\r\n });\r\n });\r\n } else {\r\n this.goodsGroup = JSON.parse(JSON.stringify(this.share.goodsGroup));\r\n this.selectedgoods = null;\r\n this.goodsGroup.forEach(e => {\r\n e.foodtypeUrl = '../../../assets/imgs/foodtype/' + e.code + '.png';\r\n e.goods.forEach(ele => {\r\n ele.goodsUrl = '../../../assets/imgs/' + ele.code + '.jpg';\r\n });\r\n });\r\n }\r\n if (!(this.share.orderTable)) {\r\n this.getTableOrder();\r\n }\r\n }\r\n\r\n getTableOrder() {\r\n if (this.share.tableId && this.share.tableId !== '0') {\r\n this.api.getFilterEntity('GetTableOrder', Number(this.share.tableId))\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe(res => {\r\n this.share.orderTable = res;\r\n });\r\n }\r\n else {\r\n this.share.orderTable = new TableModel;\r\n this.share.orderTable.tableName = 'حضوری';\r\n this.share.orderTable.tableId = 0;\r\n }\r\n }\r\n\r\n public upload(event, action, goods) {\r\n if (event.target.files && event.target.files.length > 0) {\r\n const file = event.target.files[0];\r\n this.uploadService.setPath(this.sanitizer.bypassSecurityTrustUrl(file));\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.START});\r\n this.uploadService.uploadFile(file, action, goods).subscribe(\r\n data => {\r\n if (data) {\r\n switch (data.type) {\r\n case HttpEventType.UploadProgress:\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.IN_PROGRESS, percentage: Math.round((data.loaded / data.total) * 100)});\r\n break;\r\n case HttpEventType.Response:\r\n this.inputFile.nativeElement.value = '';\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.COMPLETE});\r\n this.router.navigate(['/portal/goods']);\r\n this.share.reloadCurrentRoute();\r\n break;\r\n }\r\n }\r\n },\r\n error => {\r\n this.inputFile.nativeElement.value = '';\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.ERROR});\r\n }\r\n );\r\n }\r\n }\r\n\r\n getLinkPicture(ftu: GoodsGroupModel) { //foodTypeUrl\r\n if(this.timeStamp) {\r\n return this.linkPicture + '?' + this.timeStamp;\r\n }\r\n console.log(ftu.foodtypeUrl);\r\n return this.linkPicture;\r\n }\r\n public setLinkPicture(url: string) {\r\n this.linkPicture = url;\r\n this.timeStamp = (new Date()).getTime();\r\n }\r\n\r\n reloadCurrentRoute() {\r\n let currentUrl = this.router.url;\r\n this.router.navigateByUrl('/', {skipLocationChange: true}).then(() => {\r\n this.router.navigate([currentUrl]);\r\n });\r\n }\r\n\r\n date(): void {\r\n this.DateNow = `?${Date.now()}`;\r\n }\r\n}\r\n","import { Component, Output, EventEmitter, Input, ViewChild, ElementRef } from '@angular/core';\r\nimport { UploadDownloadService } from '../file-upload/upload-download.service';\r\nimport { HttpEventType } from '@angular/common/http';\r\nimport { ProgressStatus, ProgressStatusEnum } from '../../../models/progress-status.model';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n@Component({\r\n selector: 'app-upload',\r\n templateUrl: 'upload.component.html',\r\n styleUrls: ['./upload.component.scss'],\r\n})\r\n\r\nexport class UploadComponent {\r\n @Input() public disabled: boolean;\r\n @Output() public uploadStatus: EventEmitter;\r\n @ViewChild('inputFile') inputFile: ElementRef;\r\n @Output() public showUploadState: any;\r\n\r\n constructor(private service: UploadDownloadService,private sanitizer: DomSanitizer) {\r\n this.uploadStatus = new EventEmitter();\r\n }\r\n\r\n public upload(event, action) {\r\n if (event.target.files && event.target.files.length > 0) {\r\n const file = event.target.files[0];\r\n this.service.setPath(this.sanitizer.bypassSecurityTrustUrl(file));\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.START});\r\n this.service.uploadFile(file, action).subscribe(\r\n data => {\r\n if (data) {\r\n switch (data.type) {\r\n case HttpEventType.UploadProgress:\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.IN_PROGRESS, percentage: Math.round((data.loaded / data.total) * 100)});\r\n break;\r\n case HttpEventType.Response:\r\n this.inputFile.nativeElement.value = '';\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.COMPLETE});\r\n this.showUploadState = \"حجم فایل آپلود شده بیشتر از حد مجاز است!\";\r\n break;\r\n }\r\n }\r\n },\r\n error => {\r\n this.inputFile.nativeElement.value = '';\r\n this.uploadStatus.emit( {status: ProgressStatusEnum.ERROR});\r\n }\r\n );\r\n }\r\n }\r\n}\r\n","
\r\n \r\n
\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { HttpEventType } from '@angular/common/http';\r\nimport { UploadDownloadService } from '../file-upload/upload-download.service';\r\nimport { ProgressStatus, ProgressStatusEnum } from '../../../models/progress-status.model';\r\n\r\n@Component({\r\n selector: 'app-download',\r\n templateUrl: 'download.component.html'\r\n})\r\n\r\nexport class DownloadComponent {\r\n @Input() public disabled: boolean;\r\n @Input() public fileName: string;\r\n @Output() public downloadStatus: EventEmitter;\r\n\r\n constructor(private service: UploadDownloadService) {\r\n this.downloadStatus = new EventEmitter();\r\n }\r\n\r\n public download() {\r\n this.downloadStatus.emit( {status: ProgressStatusEnum.START});\r\n this.service.downloadFile(this.fileName).subscribe(\r\n data => {\r\n switch (data.type) {\r\n case HttpEventType.DownloadProgress:\r\n this.downloadStatus.emit( {status: ProgressStatusEnum.IN_PROGRESS, percentage: Math.round((data.loaded / data.total) * 100)});\r\n break;\r\n case HttpEventType.Response:\r\n this.downloadStatus.emit( {status: ProgressStatusEnum.COMPLETE});\r\n const downloadedFile = new Blob([data.body], { type: data.body.type });\r\n const a = document.createElement('a');\r\n a.setAttribute('style', 'display:none;');\r\n document.body.appendChild(a);\r\n a.download = this.fileName;\r\n a.href = URL.createObjectURL(downloadedFile);\r\n a.target = '_blank';\r\n a.click();\r\n document.body.removeChild(a);\r\n break;\r\n }\r\n },\r\n error => {\r\n this.downloadStatus.emit( {status: ProgressStatusEnum.ERROR});\r\n }\r\n );\r\n }\r\n}\r\n","\r\n

progress {{percentage}}%

\r\n\r\n\r\n\r\n\r\n
\r\n \r\n
\r\n\r\n","download\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { UploadDownloadService } from '../file-upload/upload-download.service';\r\nimport { ProgressStatusEnum, ProgressStatus } from '../../../models/progress-status.model';\r\n\r\n@Component({\r\n selector: 'app-filemanager',\r\n templateUrl: './file-manager.component.html',\r\n styleUrls: ['./file-manager.component.scss']\r\n})\r\nexport class FileManagerComponent implements OnInit {\r\n\r\n public files: string[];\r\n public fileInDownload: string;\r\n public percentage: number;\r\n public showProgress: boolean;\r\n public showDownloadError: boolean;\r\n public showUploadError: boolean;\r\n\r\n constructor(public service: UploadDownloadService) { }\r\n\r\n ngOnInit() {\r\n this.getFiles();\r\n }\r\n\r\n ngOnChange() {\r\n if(this.files.length > 0) this.safeFiles();\r\n }\r\n\r\n private getFiles() {\r\n this.service.getFiles().subscribe(\r\n data => {\r\n this.files = data;\r\n }\r\n );\r\n }\r\n\r\n safeFiles() {\r\n for (let index = 0; index < this.files.length; index++) {\r\n const element = this.files[index];\r\n console.log(element);\r\n }\r\n }\r\n\r\n public downloadStatus(event: ProgressStatus) {\r\n switch (event.status) {\r\n case ProgressStatusEnum.START:\r\n this.showDownloadError = false;\r\n break;\r\n case ProgressStatusEnum.IN_PROGRESS:\r\n this.showProgress = true;\r\n this.percentage = event.percentage;\r\n break;\r\n case ProgressStatusEnum.COMPLETE:\r\n this.showProgress = false;\r\n break;\r\n case ProgressStatusEnum.ERROR:\r\n this.showProgress = false;\r\n this.showDownloadError = true;\r\n break;\r\n }\r\n }\r\n\r\n public uploadStatus(event: ProgressStatus) {\r\n switch (event.status) {\r\n case ProgressStatusEnum.START:\r\n this.showUploadError = false;\r\n break;\r\n case ProgressStatusEnum.IN_PROGRESS:\r\n this.showProgress = true;\r\n this.percentage = event.percentage;\r\n break;\r\n case ProgressStatusEnum.COMPLETE:\r\n this.showProgress = false;\r\n this.getFiles();\r\n break;\r\n case ProgressStatusEnum.ERROR:\r\n this.showProgress = false;\r\n this.showUploadError = true;\r\n break;\r\n }\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { PortalComponent } from './portal.component';\r\nimport { RouterModule, Routes } from '@angular/router';\r\nimport { ShareModule } from '../share.module';\r\nimport { ControlsModule } from 'src/core/controls/shared/controls.mudule';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { LogoComponent } from './logo/logo.component';\r\nimport { SliderComponent } from './slider/slider.component';\r\nimport { SocialComponent } from './social/social.component';\r\nimport { GoodsComponent } from './goods/goods.component';\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport { UploadComponent } from './upload/upload.component';\r\nimport { DownloadComponent } from './download/download.component';\r\nimport { FileManagerComponent } from './file-manager/file-manager.component';\r\nimport { UploadDownloadService } from './file-upload/upload-download.service';\r\nimport { HintFileSizeComponent } from './upload/hint-file-size/hint-file-size.component';\r\n\r\n\r\nconst routes: Routes = \r\n [\r\n {\r\n path: '', component: PortalComponent,\r\n children: \r\n [\r\n {\r\n path:'logo', component: LogoComponent\r\n },\r\n {\r\n path:'goods', component: GoodsComponent\r\n },\r\n {\r\n path:'slider', component: SliderComponent\r\n },\r\n {\r\n path:'social', component: SocialComponent\r\n }\r\n ],\r\n runGuardsAndResolvers: 'always'\r\n }\r\n ]\r\n\r\n@NgModule({\r\n declarations: [\r\n PortalComponent,\r\n LogoComponent,\r\n SliderComponent,\r\n SocialComponent,\r\n GoodsComponent,\r\n UploadComponent,\r\n DownloadComponent,\r\n FileManagerComponent,\r\n HintFileSizeComponent\r\n ],\r\n imports: [\r\n RouterModule.forChild(routes),\r\n CommonModule,\r\n ShareModule,\r\n MatTabsModule,\r\n MatMenuModule,\r\n ControlsModule,\r\n ReactiveFormsModule,\r\n FormsModule,\r\n HttpClientModule\r\n ],\r\n providers: [UploadDownloadService]\r\n})\r\nexport class PortalModule { }\r\n","import { A11yModule } from '@angular/cdk/a11y';\r\nimport { BidiModule } from '@angular/cdk/bidi';\r\nimport { LayoutModule } from '@angular/cdk/layout';\r\nimport { ObserversModule } from '@angular/cdk/observers';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { PlatformModule } from '@angular/cdk/platform';\r\nimport { PortalModule } from '@angular/cdk/portal';\r\nimport { ScrollDispatchModule } from '@angular/cdk/scrolling';\r\nimport { CdkStepperModule } from '@angular/cdk/stepper';\r\nimport { CdkTableModule } from '@angular/cdk/table';\r\nimport { NgModule } from '@angular/core';\r\nimport {\r\n MatAutocompleteModule,\r\n MatButtonModule,\r\n MatButtonToggleModule,\r\n MatCardModule,\r\n MatCheckboxModule,\r\n MatChipsModule,\r\n MatDatepickerModule,\r\n MatDialogModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatGridListModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatListModule,\r\n MatMenuModule,\r\n MatNativeDateModule,\r\n MatProgressBarModule,\r\n MatProgressSpinnerModule,\r\n MatRadioModule,\r\n MatRippleModule,\r\n MatSelectModule,\r\n MatSidenavModule,\r\n MatSliderModule,\r\n MatSlideToggleModule,\r\n MatSnackBarModule,\r\n MatTabsModule,\r\n MatToolbarModule,\r\n MatTooltipModule,\r\n MatStepperModule,\r\n MatBottomSheetModule,\r\n MatBadgeModule\r\n} from '@angular/material';\r\n\r\nconst MATERIAL_MODULES = [\r\n MatAutocompleteModule,\r\n MatButtonModule,\r\n MatButtonToggleModule,\r\n MatCardModule,\r\n MatCheckboxModule,\r\n MatChipsModule,\r\n MatDatepickerModule,\r\n MatDialogModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatGridListModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatListModule,\r\n MatMenuModule,\r\n MatProgressBarModule,\r\n MatProgressSpinnerModule,\r\n MatRadioModule,\r\n MatRippleModule,\r\n MatSelectModule,\r\n MatSidenavModule,\r\n MatSlideToggleModule,\r\n MatSliderModule,\r\n MatSnackBarModule,\r\n MatTabsModule,\r\n MatToolbarModule,\r\n MatTooltipModule,\r\n MatGridListModule,\r\n MatStepperModule,\r\n MatNativeDateModule,\r\n MatBottomSheetModule,\r\n MatBadgeModule\r\n];\r\nconst CDK_MODULES = [\r\n A11yModule,\r\n BidiModule,\r\n LayoutModule,\r\n ObserversModule,\r\n OverlayModule,\r\n PlatformModule,\r\n PortalModule,\r\n ScrollDispatchModule,\r\n CdkStepperModule,\r\n CdkTableModule\r\n];\r\n@NgModule({\r\n imports: [\r\n CDK_MODULES,\r\n MATERIAL_MODULES\r\n ],\r\n exports: [\r\n CDK_MODULES,\r\n MATERIAL_MODULES\r\n ]\r\n})\r\nexport class MaterialModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HeaderComponent } from './header.component';\r\nimport { MaterialModule } from '../material.module';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\n\r\n@NgModule({\r\n declarations: [HeaderComponent],\r\n imports: [\r\n CommonModule,\r\n MaterialModule,\r\n FormsModule,\r\n // ToastrModule.forRoot(),\r\n ReactiveFormsModule,\r\n // ShareModule\r\n TranslateModule.forChild(),\r\n ],\r\n exports: [HeaderComponent],\r\n})\r\nexport class HeaderModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { HeaderModule } from './header/header.module';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MaterialModule } from './material.module';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { PersianNumberPipe } from 'src/services/persian-number.pipe';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MaterialModule,\r\n HeaderModule,\r\n TranslateModule.forChild(),\r\n ],\r\n declarations: [PersianNumberPipe,],\r\n exports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MaterialModule,\r\n HeaderModule,\r\n TranslateModule,\r\n PersianNumberPipe,\r\n ],\r\n providers: []\r\n})\r\nexport class ShareModule { }\r\n","\r\nimport { TableModule } from 'src/app/table/table.module';\r\nimport { TableModel } from 'src/models/table.model';\r\n\r\ndeclare global {\r\n interface String {\r\n toAddPrefix(prefix: string): string;\r\n }\r\n interface Array {\r\n isValid(): boolean;\r\n // map(T, value: boolean): Array;\r\n }\r\n interface Array {\r\n maper(TModel: T): Array;\r\n }\r\n interface Map {\r\n SetInArray(this: Map, key: K, value: V): boolean;\r\n }\r\n}\r\nString.prototype.toAddPrefix = function (prefixStr: string) {\r\n return `${prefixStr}${this}`;\r\n};\r\nArray.prototype.isValid = function (): boolean {\r\n if (!(this) || this.length <= 0) {\r\n return false;\r\n }\r\n return true;\r\n};\r\nArray.prototype.maper = function maper(destination_model: T): Array {\r\n const arr = [];\r\n // //var destination_model = new T();\r\n const destination = Object.keys(destination_model);\r\n const source = Object.keys(this[0]);\r\n this.forEach(item => {\r\n const obj = JSON.parse(JSON.stringify(destination_model));\r\n source.forEach(key => {\r\n if (destination.some(el => el === key)) {\r\n obj[key] = item[key];\r\n }\r\n });\r\n arr.push(obj);\r\n });\r\n return arr;\r\n};\r\nMap.prototype.SetInArray = function (this: Map, key: K, value: V): boolean {\r\n let isNew = false;\r\n if (this.has(key) === false) {\r\n this.set(key, []);\r\n isNew = true;\r\n }\r\n const items: V[] = this.get(key)!;\r\n items.push(value);\r\n return isNew;\r\n};\r\n\r\nexport { };\r\n","import { Router } from '@angular/router';\r\nimport { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport { Subject } from 'rxjs-compat';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { RestApiService } from 'src/services/rest-api.service';\r\nimport { Location } from '@angular/common';\r\nimport '../extended/extensions';\r\nimport { TableModel } from 'src/models/table.model';\r\nimport { AppModule } from 'src/app/app.module';\r\nimport { DialogComponent } from 'src/app/dialog/dialog.component';\r\nimport { MatDialog, MatSnackBar } from '@angular/material';\r\nimport { LocalStoreManager } from 'src/services/local-store-manager.service';\r\n\r\n@Component({\r\n selector: 'app-base',\r\n template: 'mock widget'\r\n})\r\n\r\nexport class BaseComponent implements OnInit, OnDestroy {\r\n\r\n ngUnsubscribe = new Subject();\r\n table: TableModel;\r\n protected dialog: MatDialog;\r\n protected _snackBar: MatSnackBar;\r\n protected confirmState: number;\r\n protected DialogComponent: DialogComponent;\r\n protected router: Router;\r\n protected translateText: TranslateService;\r\n protected api: RestApiService;\r\n protected _location: Location;\r\n protected storage: LocalStoreManager;\r\n\r\n constructor() {\r\n this.api = AppModule.injector.get(RestApiService);\r\n this.router = AppModule.injector.get(Router);\r\n this.translateText = AppModule.injector.get(TranslateService);\r\n this._location = AppModule.injector.get(Location);\r\n this.dialog = AppModule.injector.get(MatDialog);\r\n this._snackBar = AppModule.injector.get(MatSnackBar);\r\n this.storage = AppModule.injector.get(LocalStoreManager);\r\n }\r\n ngOnDestroy(): void {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n ngOnInit(): void {\r\n }\r\n go(url: string) {\r\n if (url === 'goback') {\r\n this._location.back();\r\n return;\r\n }\r\n this.router.navigate([`/${url}`]);\r\n }\r\n translate(str: string): string {\r\n return this.translateText.instant(str);\r\n }\r\n test() {\r\n const str0 = 'str';\r\n const prefixStr = str0.toAddPrefix('prefix_');\r\n console.log(prefixStr); // prefix_str\r\n const arr = ['str'];\r\n const val = arr.isValid();\r\n console.log(val);\r\n }\r\n confirmation(title: string) {\r\n const dialogRef = this.dialog.open(DialogComponent);\r\n dialogRef.componentInstance.confirmation(title);\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result === 'Ok') {\r\n this.afterConfirm();\r\n } else {\r\n return;\r\n }\r\n });\r\n }\r\n afterConfirm() {\r\n }\r\n toast(message: string) {\r\n this._snackBar.open(message, null, {\r\n duration: 1000,\r\n });\r\n }\r\n openSnackBar(message, action: string, className: string) {\r\n if (message instanceof Array) {\r\n message.forEach((message, index) => {\r\n setTimeout(() => {\r\n this._snackBar.open(message.text, action, {\r\n duration: 2000,\r\n verticalPosition: 'bottom', // 'top' | 'bottom'\r\n horizontalPosition: 'end', //'start' | 'center' | 'end' | 'left' | 'right'\r\n panelClass: [className],\r\n });\r\n }, index * (2000 + 500)); // 500 => timeout between two messages\r\n });\r\n } else {\r\n this._snackBar.open(message.text, action, {\r\n duration: 1000,\r\n verticalPosition: 'bottom', // 'top' | 'bottom'\r\n horizontalPosition: 'end', //'start' | 'center' | 'end' | 'left' | 'right'\r\n panelClass: [className],\r\n\r\n });\r\n }\r\n }\r\n}\r\n","import {\r\n AbstractControl,\r\n AsyncValidatorFn,\r\n Validator,\r\n Validators,\r\n ValidatorFn,\r\n} from '@angular/forms';\r\nimport { Observable, of } from 'rxjs';\r\nexport type ValidationResult = { [validator: string]: string | boolean };\r\nexport type AsyncValidatorArray = Array;\r\nexport type ValidatorArray = Array;\r\nconst normalizeValidator =\r\n (validator: Validator | ValidatorFn): ValidatorFn | AsyncValidatorFn => {\r\n const func = (validator as Validator).validate.bind(validator);\r\n if (typeof func === 'function') {\r\n return (c: AbstractControl) => func(c);\r\n } else {\r\n return validator;\r\n }\r\n };\r\nexport const composeValidators =\r\n (validators: ValidatorArray): AsyncValidatorFn | ValidatorFn => {\r\n if (validators == null || validators.length === 0) {\r\n return null;\r\n }\r\n return Validators.compose(validators.map(normalizeValidator));\r\n };\r\nexport const validate =\r\n (validators: ValidatorArray, asyncValidators: AsyncValidatorArray) => {\r\n return (control: AbstractControl) => {\r\n const synchronousValid = () => composeValidators(validators)(control);\r\n if (asyncValidators) {\r\n const asyncValidator = composeValidators(asyncValidators);\r\n return asyncValidator(control);\r\n //return asyncValidator(control).bind( v => {\r\n // const secondary = synchronousValid();\r\n // if (secondary || v) { // compose async and sync validator results\r\n // return Object.assign({}, secondary, v);\r\n // }\r\n //});\r\n }\r\n if (validators) {\r\n return of(synchronousValid());\r\n }\r\n return of(null);\r\n };\r\n };\r\nexport const message = (validator: ValidationResult, key: string): string => {\r\n switch (key) {\r\n case 'required':\r\n return 'Please enter a value';\r\n case 'pattern':\r\n return 'Value does not match required pattern';\r\n case 'minlength':\r\n return 'Value must be N characters';\r\n case 'maxlength':\r\n return 'Value must be a maximum of N characters';\r\n case 'min':\r\n return 'Value must be a grater than N ';\r\n case 'max':\r\n return 'Value must be a less than N';\r\n }\r\n switch (typeof validator[key]) {\r\n case 'string':\r\n return validator[key];\r\n default:\r\n return `Validation failed: ${key}`;\r\n }\r\n};\r\n","import { OnInit, EventEmitter, Output, Input, Directive, OnDestroy } from '@angular/core';\r\nimport { NgModel } from '@angular/forms';\r\nimport { Observable, Subject } from 'rxjs';\r\nimport {\r\n ValidationResult,\r\n validate,\r\n message,\r\n} from './validate';\r\nimport { map } from 'rxjs/operators';\r\n// @Directive()\r\n@Directive()\r\nexport abstract class BaseControlComponent implements OnInit,OnDestroy {\r\n protected abstract model: NgModel;\r\n //value: T;\r\n ngUnsubscribe = new Subject();\r\n _pattern: string;\r\n value: any;\r\n @Output() valueChange = new EventEmitter();\r\n @Input() label: string;\r\n @Input() name: string;\r\n @Input() id: string;\r\n @Input() required: boolean = false;\r\n @Input() hidden: boolean = false;\r\n @Input() disabled: boolean = false;\r\n @Input() textType: string = \"text\";\r\n @Input() minLength: string;\r\n @Input() maxLength: string;\r\n @Input() min: number;\r\n @Input() max: number;\r\n @Input() placeholder: string;\r\n @Input() multiple: boolean = false;\r\n @Input() pattern: string;\r\n // @Input() set patternKey(value: string) {\r\n // this._pattern = value;\r\n // }\r\n get patternKey(): string {\r\n return this._pattern;\r\n }\r\n @Input() mainclass: string = 'col-lg-12 col-sm-12';\r\n @Input() labelclass: string = 'col-lg-3 col-sm-3';\r\n @Input() inputclass: string = 'col-lg-9 col-sm-9';\r\n //private _formBuilder: FormBuilder;\r\n public patterns = {\r\n email: \"([a-zA-Z0-9_\\.\\-])+\\@(([a-zA-Z0-9\\-])+\\.)+([a-zA-Z0-9]{2,4})+\",\r\n url: \"(https?)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]\",\r\n mobile: \"^[0-0][9-9]\\\\d{9}\",\r\n telephone: \"^[1-9]\\\\d{3,7}\",\r\n nationalcode: \"^[0-9]\\\\d{9}\",\r\n lockserial: \"^\\d{4}-\\d{4}-\\d{4}\",\r\n number: \"^\\\\d+$\",\r\n minMax: \"^$|^([0-9]|[1-9][0-9]|[1][0][0])?\"\r\n };\r\n constructor(\r\n private validators: Array,\r\n private asyncValidators: Array) {\r\n }\r\n ngOnDestroy(): void {\r\n if(this.ngUnsubscribe)\r\n {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n }\r\n ngOnInit() {\r\n }\r\n change(newValue: any) {\r\n this.value = newValue;\r\n this.valueChange.emit(newValue);\r\n }\r\n protected validate(): Observable {\r\n var v = validate(this.validators, this.asyncValidators)(this.model.control);\r\n return null;\r\n }\r\n private patternIsOk() {\r\n if (this.value && this.patternKey && this.patterns[this.patternKey] && this.model.control.valid) {\r\n var regex = new RegExp(this.patterns[this.patternKey]);\r\n if (!regex.test(this.value.toString())) {\r\n this.model.control.setErrors({ invalid: true });\r\n }\r\n }\r\n }\r\n private setMinMax() {\r\n if (this.min && Number(this.value) < Number(this.min))\r\n this.model.control.setErrors({ min: true });\r\n if (this.max && Number(this.value) > Number(this.max))\r\n this.model.control.setErrors({ max: true });\r\n }\r\n public get invalid(): Observable {\r\n this.patternIsOk();\r\n if (this.textType == 'number')\r\n this.setMinMax();\r\n if (this.validate() == null) {\r\n return null;\r\n }\r\n return this.validate().pipe(map(v => Object.keys(v || {}).length > 0));\r\n }\r\n public get failures(): Observable> {\r\n if (this.validate() == null) {\r\n return null;\r\n }\r\n return this.validate().pipe(map(v => Object.keys(v).map(k => message(v, k))));\r\n }\r\n}\r\n","import { Directive } from '@angular/core';\r\nimport {\r\n NG_VALIDATORS,\r\n AbstractControl,\r\n} from '@angular/forms';\r\n@Directive({\r\n selector: '[hexadecimal][ngModel]',\r\n providers: [\r\n { provide: NG_VALIDATORS, useExisting: HexadecimalValueValidator, multi: true }\r\n ]\r\n})\r\nexport class HexadecimalValueValidator {\r\n validate(control: AbstractControl): { [validator: string]: string } {\r\n const expression = /^([0-9a-fA-F]+)$/i;\r\n if (!control.value) { // the [required] validator will check presence, not us\r\n return null;\r\n }\r\n const value = control.value.trim();\r\n if (expression.test(value)) {\r\n return null;\r\n }\r\n return { hexadecimal: 'Please enter a hexadecimal value (alphanumeric, 0-9 and A-F)' };\r\n }\r\n}\r\n","import { Component, Input } from '@angular/core';\r\n@Component({\r\n selector: 'validation',\r\n template: `\r\n
\r\n
{{message}}
\r\n
\r\n `,\r\n styles: [`\r\n .validation {\r\n color: #999;\r\n margin: 12px;\r\n }`\r\n ]\r\n})\r\nexport class ValidationComponent {\r\n @Input() messages: Array;\r\n}\r\n","import { Component, ViewChild, Optional, Inject, Input } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, NG_VALIDATORS, NgModel, NG_ASYNC_VALIDATORS, ControlContainer, NgForm } from '@angular/forms';\r\nimport { BaseControlComponent } from '../base/base-control.component';\r\n@Component({\r\n // moduleId: module.id,\r\n selector: 'sep-button',\r\n templateUrl: 'button.component.html',\r\n styleUrls: ['button.component.scss'],\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: ButtonComponent, multi: true }\r\n ]\r\n})\r\nexport class ButtonComponent extends BaseControlComponent {\r\n @ViewChild(NgModel) model: NgModel;\r\n @Input() icon: string;\r\n @Input() size: string;\r\n constructor(\r\n @Optional()\r\n @Inject(NG_VALIDATORS)\r\n validators: Array,\r\n @Optional()\r\n @Inject(NG_ASYNC_VALIDATORS)\r\n asyncValidators: Array) {\r\n super(validators, asyncValidators);\r\n }\r\n}\r\n","\r\n","import { Directive, Input } from \"@angular/core\";\r\nimport { NG_VALIDATORS, Validator, ValidatorFn, AbstractControl, Validators } from \"@angular/forms\";\r\n@Directive({\r\n selector: \"[min][formControlName],[min][formControl],[min][ngModel]\",\r\n providers: [\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: MinDirective,\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class MinDirective implements Validator {\r\n private _validator: ValidatorFn;\r\n @Input() public set min(value: string) {\r\n this._validator = Validators.min(parseInt(value, 10));\r\n }\r\n public validate(control: AbstractControl): { [key: string]: any } {\r\n return this._validator(control);\r\n }\r\n}\r\n@Directive({\r\n selector: \"[max][formControlName],[max][formControl],[max][ngModel]\",\r\n providers: [\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: MaxDirective,\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class MaxDirective implements Validator {\r\n private _validator: ValidatorFn;\r\n @Input() public set max(value: string) {\r\n this._validator = Validators.max(parseInt(value, 10));\r\n }\r\n public validate(control: AbstractControl): { [key: string]: any } {\r\n return this._validator(control);\r\n }\r\n}\r\n","
\r\n
\r\n {{label}}\r\n * \r\n
\r\n
\r\n \r\n
\r\n {{hint}}\r\n
\r\n
\r\n \r\n {{label}} {{'Errors.Required'| translate}}\r\n \r\n \r\n {{label}} {{'Errors.Pattern' | translate}}\r\n \r\n \r\n {{('Errors.Minlength'| translate ).replace( '[0]' , label).replace( '[1]' , minLength) }}\r\n \r\n \r\n {{('Errors.Maxlength'| translate ).replace( '[0]' , label).replace( '[1]' , minLength) }}\r\n \r\n \r\n {{('Errors.Length'| translate ).replace( '[0]' , label).replace( '[1]' , min).replace( '[2]' , max) }}\r\n \r\n
\r\n
\r\n","import { Component, ViewChild, Optional, Inject, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\r\nimport { BaseControlComponent } from \"../base/base-control.component\";\r\nimport { NG_VALUE_ACCESSOR, NgModel, NG_VALIDATORS, NG_ASYNC_VALIDATORS } from '@angular/forms';\r\nimport { retry } from 'rxjs/operators';\r\nimport { CorrectYeKeService } from 'src/services/correctyeke.service';\r\n@Component({\r\n //moduleId: module.id,\r\n selector: 'sep-input',\r\n styleUrls: ['input.component.scss'],\r\n templateUrl: 'input.component.html',\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: InputComponent, multi: true }\r\n ],\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n})\r\nexport class InputComponent extends BaseControlComponent {\r\n isshow: boolean;\r\n show() {\r\n this.isshow = !this.isshow;\r\n }\r\n focusFunction() {\r\n this.isshow = true;\r\n document.getElementById(this.name).focus();\r\n }\r\n focusOutFunction() {\r\n if (!this.value || this.value == '') {\r\n this.isshow = false;\r\n }\r\n }\r\n // @HostBinding('class') @Input('class') classList: string = '';\r\n\r\n @Input() class: string\r\n @Input() name: string;\r\n @Input() hint: string;\r\n @Input() icon: string;\r\n @Input() autocomplete: string = \"on\";\r\n @Input() withComma: boolean = true;\r\n @Output() numberValueChange: EventEmitter = new EventEmitter();\r\n @ViewChild(NgModel) model: NgModel;\r\n @Input() inputMask: string;\r\n _value: number;\r\n @Input()\r\n set numberValue(value: any) {\r\n if (value && this.textType == 'number' && this.withComma.toString().toLowerCase() === 'true') {\r\n var parts = value.toString().split(\".\");\r\n parts[0] = parts[0].replace(/,/g, \"\").replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n this.value = parts.join(\".\");\r\n }\r\n else\r\n this.value = value as any;\r\n }\r\n get numberValue(): any {\r\n if (this.textType == 'number' && this.withComma.toString().toLowerCase() === 'true') {\r\n return Number(this.value.replace(/,/g, \"\"));\r\n }\r\n return this.value as any;\r\n }\r\n constructor(\r\n @Optional() @Inject(NG_VALIDATORS) validators: Array,\r\n @Optional() @Inject(NG_ASYNC_VALIDATORS) asyncValidators: Array,\r\n private cyk: CorrectYeKeService\r\n ) {\r\n super(validators, asyncValidators);\r\n if (!this.autocomplete) {\r\n this.autocomplete = \"on\";\r\n }\r\n }\r\n onChange(value: any) {\r\n if (value && this.textType == 'number' && this.withComma.toString().toLowerCase() === 'true') {\r\n this.valueChange.emit(this.value.replace(/,/g, \"\"));\r\n this.numberValueChange.emit(this.numberValue)\r\n }\r\n else {\r\n this.value = CorrectYeKeService.getCorrectYeKe(this.value);\r\n this.valueChange.emit(this.value);\r\n this.numberValueChange.emit(this.numberValue)\r\n }\r\n }\r\n}\r\n","import {\r\n DateAdapter,\r\n MAT_DATE_FORMATS,\r\n MAT_DATE_LOCALE\r\n} from '@angular/material/core';\r\n\r\n// import {A11yModule} from '@angular/cdk/a11y';\r\n// import {DragDropModule} from '@angular/cdk/drag-drop';\r\n// import {PortalModule} from '@angular/cdk/portal';\r\n// import {ScrollingModule} from '@angular/cdk/scrolling';\r\n// import {CdkStepperModule} from '@angular/cdk/stepper';\r\nimport { CdkTableModule } from '@angular/cdk/table';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\nimport { MatBottomSheetModule } from '@angular/material/bottom-sheet';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatStepperModule } from '@angular/material/stepper';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatGridListModule } from '@angular/material/grid-list';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatNativeDateModule, MatRippleModule } from '@angular/material/core';\r\nimport { MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSidenavModule } from '@angular/material/sidenav';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatSortModule } from '@angular/material/sort';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatTreeModule } from '@angular/material/tree';\r\n\r\nimport { NgModule } from '@angular/core';\r\n\r\n@NgModule({\r\n imports: [\r\n MatAutocompleteModule,\r\n MatButtonModule,\r\n MatBottomSheetModule,\r\n MatButtonToggleModule,\r\n MatCardModule,\r\n MatCheckboxModule,\r\n MatChipsModule,\r\n MatDatepickerModule,\r\n MatDialogModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatGridListModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatListModule,\r\n MatMenuModule,\r\n MatNativeDateModule,\r\n MatPaginatorModule,\r\n MatProgressBarModule,\r\n MatProgressSpinnerModule,\r\n MatRadioModule,\r\n MatRippleModule,\r\n MatSelectModule,\r\n MatSidenavModule,\r\n MatSliderModule,\r\n MatSlideToggleModule,\r\n MatSnackBarModule,\r\n MatStepperModule,\r\n MatSortModule,\r\n MatTableModule,\r\n MatTabsModule,\r\n MatToolbarModule,\r\n MatTooltipModule,\r\n CdkTableModule,\r\n MatTreeModule,\r\n MatBadgeModule\r\n ],\r\n exports: [\r\n MatAutocompleteModule,\r\n MatButtonModule,\r\n MatBottomSheetModule,\r\n MatButtonToggleModule,\r\n MatCardModule,\r\n MatCheckboxModule,\r\n MatChipsModule,\r\n MatDatepickerModule,\r\n MatDialogModule,\r\n MatExpansionModule,\r\n MatGridListModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatListModule,\r\n MatMenuModule,\r\n MatNativeDateModule,\r\n MatPaginatorModule,\r\n MatProgressBarModule,\r\n MatProgressSpinnerModule,\r\n MatRadioModule,\r\n MatRippleModule,\r\n MatSelectModule,\r\n MatSidenavModule,\r\n MatSliderModule,\r\n MatSlideToggleModule,\r\n MatSnackBarModule,\r\n MatStepperModule,\r\n MatSortModule,\r\n MatTableModule,\r\n MatTabsModule,\r\n MatToolbarModule,\r\n MatTooltipModule,\r\n CdkTableModule,\r\n MatTreeModule,\r\n MatBadgeModule\r\n ],\r\n providers: [\r\n ]\r\n})\r\nexport class MaterialModule { }\r\n","import { NgModule, ModuleWithProviders, Injector, ErrorHandler } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TranslateModule, TranslateLoader } from '@ngx-translate/core';\r\nimport {\r\n HexadecimalValueValidator,\r\n ValidationComponent,\r\n ButtonComponent,\r\n InputComponent,\r\n} from './controls';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';\r\nimport { MinDirective, MaxDirective } from './controls/base/min.max.directive';\r\nimport { MaterialModule } from './material.module';\r\nimport { PersianNumberPipe } from 'src/services/persian-number.pipe';\r\nimport { CorrectYeKeService } from 'src/services/correctyeke.service';\r\n\r\nexport let AppInjector: Injector;\r\nconst components = [\r\n HexadecimalValueValidator,\r\n ValidationComponent,\r\n MinDirective,\r\n MaxDirective,\r\n ButtonComponent,\r\n InputComponent,\r\n]\r\nconst providers = [\r\n CorrectYeKeService\r\n\r\n]\r\n@NgModule({\r\n declarations: [...components],\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n HttpClientModule,\r\n MaterialModule,\r\n TranslateModule\r\n ],\r\n exports: [\r\n CommonModule,\r\n FormsModule,\r\n ...components,\r\n MaterialModule,\r\n TranslateModule,\r\n ],\r\n providers: [\r\n ...providers,\r\n ]\r\n})\r\nexport class ControlsModule {\r\n constructor(private injector: Injector) {\r\n AppInjector = this.injector;\r\n }\r\n static forRoot(): ModuleWithProviders {\r\n return {\r\n ngModule: ControlsModule,\r\n providers: [...providers]\r\n };\r\n }\r\n}\r\n","// This file can be replaced during build by using the `fileReplacements` array.\r\n// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`.\r\n// The list of file replacements can be found in `angular.json`.\r\n\r\nexport const environment = {\r\n production: false,\r\n baseUrl: null, // Change this to the address of your backend API if different from frontend address\r\n loginUrl: '/Login'\r\n};\r\n\r\n/*\r\n * For easier debugging in development mode, you can import the following file\r\n * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.\r\n *\r\n * This import should be commented out in production mode because it will have a negative impact\r\n * on performance if an error is thrown.\r\n */\r\n// import 'zone.js/plugins/zone-error'; // Included with Angular CLI.\r\n","import 'hammerjs';\r\nimport { enableProdMode } from '@angular/core';\r\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\r\n\r\nimport { AppModule } from './app/app.module';\r\nimport { environment } from './environments/environment';\r\n\r\nif (environment.production) {\r\n enableProdMode();\r\n}\r\n\r\nplatformBrowserDynamic().bootstrapModule(AppModule)\r\n .catch(err => console.error(err));\r\n","export enum SourceProgramEnum {\r\n Tablet = 2,\r\n Kiosk = 4,\r\n DigitalMeuOffline = 5,\r\n DigitalMeuOnline = 6\r\n}\r\n","export enum StateEnum {\r\n Add = 0,\r\n Merge = 1,\r\n DeletedMerge = 2,\r\n Edited = 3,\r\n Deleted = 4,\r\n Save = 5,\r\n SaveMerge = 6,\r\n EditWithoutChange = 7, // 2ستونی\r\n EditWithChangeIncrease = 8, // 3ستونی\r\n DeletedForDuplicateFactor = 9,\r\n DeletedForTabletMerge = 10\r\n}\r\n\r\nexport enum ActionStateEnum {\r\n Save = 0,\r\n Merge = 1,\r\n Deleted = 2,\r\n Edited = 3,\r\n}\r\n","import { FactorDetailsModel } from './factordetails.model';\r\n\r\nexport class FactorModel {\r\n num: number;\r\n id: number;\r\n price?: number;\r\n status: number;\r\n mergeHeaderId?: number;\r\n discountPercent?: number;\r\n discountAmount?: number;\r\n serviceAmount?: number;\r\n servicePercent?: number;\r\n taxAmount?: number;\r\n taxPercent?: number;\r\n roundedAmount?: number;\r\n phoneNumber: string;\r\n fireLevel?: number;\r\n printAsh?: number;\r\n branchCode: number;\r\n description: string;\r\n transactionNo: string;\r\n errorCodePay: string;\r\n errorMessagePay: string;\r\n merchantIDPay: string;\r\n terminalIDPay: string;\r\n paymentTypeCode: number;\r\n flagPda?: number;\r\n tableId: string;\r\n tableName: string;\r\n customerName: string;\r\n flag: string;\r\n pard: number;\r\n waiterName: string;\r\n guestQty?: number;\r\n waiterId?: number;\r\n time: string;\r\n sourceFlag: string;\r\n pdaPrintFlag?: number;\r\n hasCashPrint?: number;\r\n tas?: number;\r\n creationTime: string;\r\n checked: boolean;\r\n redirectUrl: string;\r\n clubCardNo: number;\r\n usedCredit: number;\r\n creditUsedPersent: number;\r\n creditUsedRial: number;\r\n creditPersent: number;\r\n credit: number;\r\n creditPrice?: number;\r\n factorDetail?: FactorDetailsModel[];\r\n digitalMenuHeaderId?: number;\r\n FarsiDate: string;\r\n isOrderPrint?: number;\r\n constructor() {\r\n this.num = 0;\r\n this.FarsiDate = '';\r\n this.id = 0;\r\n this.price = 0;\r\n this.status = 0;\r\n this.clubCardNo = null;\r\n this.creationTime = \"\";\r\n this.mergeHeaderId = 0;\r\n this.discountPercent = 0;\r\n this.discountAmount = 0;\r\n this.serviceAmount = 0;\r\n this.servicePercent = 0;\r\n this.taxAmount = 0;\r\n this.taxPercent = 0;\r\n this.roundedAmount = 0;\r\n this.phoneNumber = '';\r\n this.branchCode = 0;\r\n this.description = '';\r\n this.transactionNo = '';\r\n this.errorCodePay = '';\r\n this.errorMessagePay = '';\r\n this.merchantIDPay = '';\r\n this.terminalIDPay = '';\r\n this.paymentTypeCode = 0;\r\n this.flagPda = 0;\r\n this.tableId = '';\r\n this.tableName = '';\r\n this.customerName = '';\r\n this.flag = '';\r\n this.waiterName = '';\r\n this.guestQty = null;\r\n this.waiterId = 0;\r\n this.time = '';\r\n this.sourceFlag = '';\r\n this.pdaPrintFlag = 0;\r\n this.hasCashPrint = 0;\r\n this.tas = 0;\r\n this.factorDetail = [];\r\n this.checked = false;\r\n this.creditPrice = null;\r\n this.digitalMenuHeaderId = null;\r\n }\r\n}\r\n\r\nexport class InvoiceModel {\r\n // شماره فاکتور \r\n num: number;\r\n // مبلغ قابل پرداخت\r\n price?: number;\r\n //تخفیف\r\n discountAmount?: number;\r\n serviceAmount?: number;\r\n taxAmount?: number;\r\n roundedAmount?: number;\r\n phoneNumber: string;\r\n description: string;\r\n //transactionNo: string;\r\n tableName: string;\r\n customerName: string;\r\n waiterName: string;\r\n // تعداد نفرات\r\n guestQty?: number;\r\n time: string;\r\n creationTime: string;\r\n // اعتبار باشگاه\r\n usedCredit: number;\r\n creditPrice?: number;\r\n sumQty: number;\r\n sumPrice: number;\r\n restaurantName: string;\r\n farsiDate: string;\r\n invoiceDetail?: InvoiceDetailsModel[];\r\n constructor() {\r\n this.num = 0;\r\n this.sumQty = 0;\r\n this.sumPrice = 0;\r\n this.price = 0;\r\n this.discountAmount = 0;\r\n this.serviceAmount = 0;\r\n this.taxAmount = 0;\r\n this.roundedAmount = 0;\r\n this.phoneNumber = '';\r\n this.description = '';\r\n //this.transactionNo = '';\r\n this.tableName = '';\r\n this.customerName = '';\r\n this.waiterName = '';\r\n this.guestQty = 0;\r\n this.creationTime = '';\r\n //this.time = '';\r\n this.invoiceDetail = [];\r\n this.creditPrice = 0;\r\n this.farsiDate = '';\r\n this.usedCredit = 0;\r\n\r\n }\r\n}\r\nexport class InvoiceDetailsModel {\r\n //radif: number;\r\n // نام کالا\r\n name: string;\r\n //unit: string;\r\n // تعداد\r\n qty?: number;\r\n unitPrice: number;\r\n // توضیحات\r\n toz: string;\r\n sumUnitPrice: number;\r\n constructor() {\r\n //this.radif = 0;\r\n this.sumUnitPrice = 0;\r\n this.name = '';\r\n //this.unit = '';\r\n this.qty = 0;\r\n this.unitPrice = 0;\r\n this.toz = '';\r\n }\r\n}\r\nexport class PrintInvoiceModel {\r\n num: number;\r\n pr: number;\r\n branchCode: number;\r\n printTime: string;\r\n}\r\n","export class ShareModel {\r\n language: string;\r\n isrtl: boolean;\r\n}\r\n","export class SocialMedia {\r\n id?: number;\r\n branchCode?: number;\r\n instagram?: string;\r\n telegram?: string;\r\n twitter?: string;\r\n facebook?: string;\r\n whatsApp?: string;\r\n website?: string;\r\n\r\n constructor() {\r\n this.instagram=\"\";\r\n this.telegram=\"\";\r\n this.twitter=\"\";\r\n this.facebook=\"\";\r\n this.whatsApp=\"\";\r\n this.website=\"\";\r\n\r\n }\r\n}\r\n","export class TableModel {\r\n tableId: number;\r\n tableName: string;\r\n nameGroup: string;\r\n tableCategoryId: number;\r\n num: number;\r\n time: string;\r\n waiterId?: number;\r\n waiterName: string;\r\n customerName: string;\r\n phoneNumber: string;\r\n guestQty: number;\r\n branchCode: number;\r\n isTas: number;\r\n fireLevel: number;\r\n printAsh: number;\r\n hasCashPrint: number;\r\n isOrderPrint?: number;\r\n}\r\n","export enum ThemeEnum {\r\n Dark = 0,\r\n Light = 1,\r\n Blue = 2,\r\n Orange = 3,\r\n}\r\n//export enum ThemeColor {\r\n// Dark = \"dark\",\r\n// Light = \"light\",\r\n// Blue = \"blue\",\r\n// Orange = \"orange\"\r\n//}\r\n","import { Injectable } from '@angular/core';\r\nimport { GoodsModel } from 'src/models/goods.model';\r\nimport { GoodsGroupModel } from 'src/models/goodsgroup.model';\r\nimport { SettingModel } from 'src/models/setting.model';\r\nimport { ShareModel } from 'src/models/share.model';\r\nimport { TableModel } from 'src/models/table.model';\r\nimport { UserModel } from 'src/models/user.model';\r\nimport { FactorModel } from 'src/models/factor.model';\r\nimport { LocalStoreManager } from '../services/local-store-manager.service';\r\nimport { RestApiService } from 'src/services/rest-api.service';\r\nimport { Observable, of } from 'rxjs';\r\nimport { catchError, map } from 'rxjs/operators';\r\nimport { StateEnum } from '../models/enum/state.enum';\r\nimport { SourceProgramEnum } from '../models/enum/sourceprogram.enum';\r\nimport { FormBuilder} from '@angular/forms';\r\nimport { ThemeEnum } from 'src/models/enum/theme.enum';\r\nimport { ActivatedRoute, Router, RouterLinkActive, Routes } from '@angular/router';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ShareDataService {\r\n public goodsGroup: GoodsGroupModel[];\r\n public order: GoodsModel[];\r\n public setting: SettingModel;\r\n public sharemodel: ShareModel;\r\n public filterTableList: TableModel[];\r\n public tableList: TableModel[];\r\n public orderTable: TableModel;\r\n public loginuser: UserModel;\r\n public openFactor: FactorModel;\r\n public waiterFactor: FactorModel[];\r\n public waiterOrder: GoodsModel[];\r\n public imageUrls: any[];\r\n public lastUrl: string;\r\n public validations_form: any;\r\n public formBuilder: FormBuilder;\r\n public digitalmenuFactorCount: Number;\r\n public selectedTableGroupIndex: number;\r\n public digitalmenuTableId: number;\r\n public hasSwitchTabIndex: boolean;\r\n public isClub: boolean;\r\n public tableId: string;\r\n public BranchCode: number;\r\n public currentTheme: string;\r\n public selectedGroupIndex?: number;\r\n public selectedtab: number = 0;\r\n \r\n navLinks = [];\r\n \r\n constructor(\r\n public api: RestApiService,\r\n private cache: LocalStoreManager,\r\n private route: ActivatedRoute,\r\n public router: Router,\r\n ) {\r\n }\r\n ngOnInit() {\r\n this.navLinks = (\r\n this.route.routeConfig && this.route.routeConfig.children ?\r\n this.buildNavItems(this.route.routeConfig.children) :\r\n []\r\n );\r\n }\r\n\r\n buildNavItems(routes: Routes) {\r\n return (routes)\r\n .filter(route => route.data)\r\n .map(({ path = '', data }) => ({\r\n path: path,\r\n label: data.label,\r\n icon: data.icon\r\n }));\r\n }\r\n\r\n isLinkActive(rla: RouterLinkActive): boolean {\r\n const routerLink = rla.linksWithHrefs.first;\r\n \r\n return this.router.isActive(routerLink.urlTree, false);\r\n }\r\n \r\n public goodsGroupList(): Observable {\r\n return this.api.getEntity('GoodsGroupList').pipe(\r\n map((res: GoodsGroupModel[]) => {\r\n this.goodsGroup = res;\r\n return this.goodsGroup;\r\n }),\r\n catchError((err) => {\r\n return of(null);\r\n }));\r\n } \r\n public waiterorderGoodsGroupList(): Observable {\r\n return this.api.getEntity('WaiterorderGoodsGroupList').pipe(\r\n map((res: GoodsGroupModel[]) => {\r\n this.goodsGroup = res;\r\n return this.goodsGroup;\r\n }),\r\n catchError((err) => {\r\n return of(null);\r\n }));\r\n }\r\n public clearData() {\r\n this.goodsGroup = [];\r\n this.order = [];\r\n this.openFactor = null;\r\n this.waiterFactor = [];\r\n this.waiterOrder = [];\r\n }\r\n // public getSetting(): Observable {\r\n // if ((this.setting)) {\r\n // return;\r\n // }\r\n // return this.api.getFilterEntity(\"Setting\", 0).pipe(\r\n // map((res: SettingModel) => {\r\n // this.setting = res;\r\n // return this.setting;\r\n // }),\r\n // catchError((err) => {\r\n // return of(null);\r\n // }));\r\n // }\r\n New_waiterFactor() {\r\n this.waiterFactor = null;\r\n this.waiterFactor = [];\r\n const factor = new FactorModel();\r\n this.waiterFactor.push(factor);\r\n this.waiterFactor[0].status = StateEnum.Save;\r\n this.waiterFactor[0].sourceFlag = SourceProgramEnum.Tablet.toString();\r\n this.waiterFactor[0].waiterId = this.loginuser.code;\r\n this.waiterFactor[0].waiterName = this.loginuser.name;\r\n this.formBuilder = new FormBuilder();\r\n }\r\n public getSetting(): Observable {\r\n this.cache.deleteData('setting');\r\n if ((this.setting)) {\r\n return null;\r\n }\r\n this.api.getFilterEntity('Setting', 0).subscribe(res => {\r\n this.setting = res;\r\n switch (this.setting.digitalMenuThem) {\r\n case ThemeEnum.Dark:\r\n this.setTheme('dark');\r\n break;\r\n case ThemeEnum.Light:\r\n this.setTheme('light');\r\n break;\r\n case ThemeEnum.Blue:\r\n this.setTheme('blue');\r\n break;\r\n case ThemeEnum.Orange:\r\n this.setTheme('orange');\r\n break;\r\n }\r\n this.cache.savePermanentData(this.setting, 'setting');\r\n });\r\n }\r\n getDigitalMenuCount() {\r\n this.api.getEntity('GetDigitalMenuFactorCount').subscribe((res: Number) => {\r\n this.digitalmenuFactorCount = res;\r\n });\r\n }\r\n setTheme(theme: string) {\r\n if (!theme) {\r\n theme = 'custom';\r\n this.cache.savePermanentData(theme, 'Theme');\r\n document.documentElement.classList.add(theme);\r\n } else {\r\n let currentTheme: string = this.cache.getData('Theme');\r\n if (currentTheme) {\r\n document.documentElement.classList.remove(currentTheme);\r\n }\r\n this.cache.savePermanentData(theme, 'Theme');\r\n document.documentElement.classList.add(theme);\r\n }\r\n this.currentTheme = theme;\r\n }\r\n\r\n ActivateTab(key: any) {\r\n switch (key) {\r\n case 0: // index of the tab\r\n this.router.navigate(['/portal/logo']);\r\n break;\r\n case 1:\r\n this.router.navigate(['/portal/goods']);\r\n break;\r\n case 2:\r\n this.router.navigate(['/portal/slider']);\r\n break;\r\n case 3:\r\n this.router.navigate(['/portal/social']);\r\n break;\r\n default:\r\n this.router.navigate(['/portal']);\r\n break;\r\n }\r\n }\r\n\r\n public reloadCurrentRoute() {\r\n let currentUrl = this.router.url;\r\n this.router.navigateByUrl('/', {skipLocationChange: true}).then(() => {\r\n this.router.navigate([currentUrl]);\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { timer } from 'rxjs';\r\nimport { Subject, Subscription } from 'rxjs-compat';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { UserModel } from 'src/models/user.model';\r\nimport { ShareDataService } from '../providers/sharedata.service';\r\nimport { CorrectYeKeService } from './correctyeke.service';\r\nimport { RestApiService } from './rest-api.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AuthService {\r\n private redirectUrl = '/';\r\n private loginUrl = '/login';\r\n private ordermanagementUrl = '/ordermanagement';\r\n public isloggedIn = false;\r\n public loggedInUser: UserModel;\r\n public users: UserModel[];\r\n public destroy$ = new Subject();\r\n public timerSubscription: Subscription;\r\n constructor(private api: RestApiService, private share: ShareDataService) {\r\n\r\n }\r\n isUserAuthenticated(username: string, password: string): boolean {\r\n let user: any;\r\n user = this.users.filter(\r\n u => CorrectYeKeService.getCorrectYeKe(u.name) === CorrectYeKeService.getCorrectYeKe(username) &&\r\n CorrectYeKeService.getCorrectYeKe(u.password) === CorrectYeKeService.getCorrectYeKe(password)\r\n );\r\n if (user.length !== 0) {\r\n this.isloggedIn = true;\r\n this.loggedInUser = user[0];\r\n } else {\r\n this.isloggedIn = false;\r\n }\r\n return this.isloggedIn;\r\n }\r\n isUserLoggedIn(): boolean {\r\n return this.isloggedIn;\r\n }\r\n getRedirectUrl(): string {\r\n return this.redirectUrl;\r\n }\r\n setRedirectUrl(url: string): void {\r\n this.redirectUrl = url;\r\n }\r\n getLoginUrl(): string {\r\n return this.loginUrl;\r\n }\r\n getLoggedInUser(): UserModel {\r\n return this.loggedInUser;\r\n }\r\n getOrdermanagementUrl(): string {\r\n return this.ordermanagementUrl;\r\n }\r\n logoutUser(): void {\r\n this.isloggedIn = false;\r\n }\r\n getDiffDays(sDate, eDate) {\r\n var startDate = new Date(sDate);\r\n var endDate = new Date(eDate);\r\n var Time = endDate.getTime() - startDate.getTime();\r\n return Time / (1000 * 3600 * 24);\r\n }\r\n onUserActivity() {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n if (this.timerSubscription) {\r\n this.timerSubscription.unsubscribe();\r\n }\r\n this.startTimer();\r\n }\r\n startTimer() {\r\n this.timerSubscription = timer(20 * 60 * 1000)\r\n .pipe(\r\n takeUntil(this.destroy$)\r\n )\r\n .subscribe(() => {\r\n window.location.reload();\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n@Injectable()\r\nexport class CorrectYeKeService {\r\n public static getCorrectYeKe(text: string): string {\r\n if (!(text))\r\n return text;\r\n var s = \"\";\r\n for (var i = 0; i <= text.length; i++) {\r\n if (text[i]) {\r\n switch (text[i]) {\r\n case String.fromCharCode(1705):\r\n s = s + String.fromCharCode(1603);\r\n break;\r\n case String.fromCharCode(1609):\r\n case String.fromCharCode(1740):\r\n s = s + String.fromCharCode(1610);\r\n break;\r\n default:\r\n s += text[i];\r\n break;\r\n }\r\n }\r\n }\r\n if (!(s))\r\n return text;\r\n return s;\r\n }\r\n}\r\n","// ===========================================\r\n// Email: info@ebenmonney.com\r\n// www.ebenmonney.com/templates\r\n// ===========================================\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { HttpResponseBase, HttpResponse, HttpErrorResponse } from '@angular/common/http';\r\n\r\n@Injectable()\r\nexport class Utilities {\r\n public static readonly captionAndMessageSeparator = ':';\r\n public static readonly noNetworkMessageCaption = 'No Network';\r\n public static readonly noNetworkMessageDetail = 'The server cannot be reached';\r\n public static readonly accessDeniedMessageCaption = 'Access Denied!';\r\n public static readonly accessDeniedMessageDetail = '';\r\n public static readonly notFoundMessageCaption = 'Not Found';\r\n public static readonly notFoundMessageDetail = 'The target resource cannot be found';\r\n\r\n public static cookies =\r\n {\r\n getItem: (sKey) => {\r\n return decodeURIComponent(document.cookie.replace(new RegExp('(?:(?:^|.*;)\\\\s*' + encodeURIComponent(sKey).replace(/[\\-\\.\\+\\*]/g, '\\\\$&') + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$'), '$1')) || null;\r\n },\r\n setItem: (sKey, sValue, vEnd, sPath, sDomain, bSecure) => {\r\n if (!sKey || /^(?:expires|max\\-age|path|domain|secure)$/i.test(sKey)) {\r\n return false;\r\n }\r\n\r\n let sExpires = '';\r\n\r\n if (vEnd) {\r\n switch (vEnd.constructor) {\r\n case Number:\r\n sExpires = vEnd === Infinity ? '; expires=Fri, 31 Dec 9999 23:59:59 GMT' : '; max-age=' + vEnd;\r\n break;\r\n case String:\r\n sExpires = '; expires=' + vEnd;\r\n break;\r\n case Date:\r\n sExpires = '; expires=' + vEnd.toUTCString();\r\n break;\r\n }\r\n }\r\n\r\n document.cookie = encodeURIComponent(sKey) + '=' + encodeURIComponent(sValue) + sExpires + (sDomain ? '; domain=' + sDomain : '') + (sPath ? '; path=' + sPath : '') + (bSecure ? '; secure' : '');\r\n return true;\r\n },\r\n removeItem: (sKey, sPath, sDomain) => {\r\n if (!sKey) {\r\n return false;\r\n }\r\n document.cookie = encodeURIComponent(sKey) + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT' + (sDomain ? '; domain=' + sDomain : '') + (sPath ? '; path=' + sPath : '');\r\n return true;\r\n },\r\n hasItem: (sKey) => {\r\n return (new RegExp('(?:^|;\\\\s*)' + encodeURIComponent(sKey).replace(/[\\-\\.\\+\\*]/g, '\\\\$&') + '\\\\s*\\\\=')).test(document.cookie);\r\n },\r\n keys: () => {\r\n const aKeys = document.cookie.replace(/((?:^|\\s*;)[^\\=]+)(?=;|$)|^\\s*|\\s*(?:\\=[^;]*)?(?:\\1|$)/g, '').split(/\\s*(?:\\=[^;]*)?;\\s*/);\r\n for (let nIdx = 0; nIdx < aKeys.length; nIdx++) { aKeys[nIdx] = decodeURIComponent(aKeys[nIdx]); }\r\n return aKeys;\r\n }\r\n };\r\n\r\n public static getHttpResponseMessages(data: HttpResponseBase | any): string[] {\r\n const responses: string[] = [];\r\n\r\n if (data instanceof HttpResponseBase) {\r\n if (this.checkNoNetwork(data)) {\r\n responses.push(`${this.noNetworkMessageCaption}${this.captionAndMessageSeparator} ${this.noNetworkMessageDetail}`);\r\n } else {\r\n const responseObject = this.getResponseBody(data);\r\n\r\n if (responseObject && (typeof responseObject === 'object' || responseObject instanceof Object)) {\r\n for (const key in responseObject) {\r\n if (key) {\r\n responses.push(`${key}${this.captionAndMessageSeparator} ${responseObject[key]}`);\r\n } else if (responseObject[key]) {\r\n responses.push(responseObject[key].toString());\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!responses.length) {\r\n if ((data as any).body) {\r\n responses.push(`body: ${(data as any).body}`);\r\n }\r\n\r\n if ((data as any).error) {\r\n responses.push(`error: ${(data as any).error}`);\r\n }\r\n }\r\n }\r\n\r\n if (!responses.length) {\r\n if (this.getResponseBody(data)) {\r\n responses.push(this.getResponseBody(data).toString());\r\n } else {\r\n responses.push(data.toString());\r\n }\r\n }\r\n\r\n if (this.checkAccessDenied(data)) {\r\n responses.splice(0, 0, `${this.accessDeniedMessageCaption}${this.captionAndMessageSeparator} ${this.accessDeniedMessageDetail}`);\r\n }\r\n\r\n if (this.checkNotFound(data)) {\r\n let message = `${this.notFoundMessageCaption}${this.captionAndMessageSeparator} ${this.notFoundMessageDetail}`;\r\n if (data.url) {\r\n message += `. ${data.url}`;\r\n }\r\n\r\n responses.splice(0, 0, message);\r\n }\r\n\r\n return responses;\r\n }\r\n\r\n public static getHttpResponseMessage(data: HttpResponseBase | any): string {\r\n const httpMessage =\r\n Utilities.findHttpResponseMessage(Utilities.noNetworkMessageCaption, data) ||\r\n Utilities.findHttpResponseMessage(Utilities.notFoundMessageCaption, data) ||\r\n Utilities.findHttpResponseMessage('error_description', data) ||\r\n Utilities.findHttpResponseMessage('error', data) ||\r\n Utilities.getHttpResponseMessages(data).join();\r\n\r\n return httpMessage;\r\n }\r\n\r\n public static findHttpResponseMessage(messageToFind: string, data: HttpResponse | any, seachInCaptionOnly = true, includeCaptionInResult = false): string {\r\n const searchString = messageToFind.toLowerCase();\r\n const httpMessages = this.getHttpResponseMessages(data);\r\n\r\n for (const message of httpMessages) {\r\n const fullMessage = Utilities.splitInTwo(message, this.captionAndMessageSeparator);\r\n\r\n if (fullMessage.firstPart && fullMessage.firstPart.toLowerCase().indexOf(searchString) !== -1) {\r\n return includeCaptionInResult ? message : fullMessage.secondPart || fullMessage.firstPart;\r\n }\r\n }\r\n\r\n if (!seachInCaptionOnly) {\r\n for (const message of httpMessages) {\r\n if (message.toLowerCase().indexOf(searchString) !== -1) {\r\n if (includeCaptionInResult) {\r\n return message;\r\n } else {\r\n const fullMessage = Utilities.splitInTwo(message, this.captionAndMessageSeparator);\r\n return fullMessage.secondPart || fullMessage.firstPart;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public static getResponseBody(response: HttpResponseBase) {\r\n if (response instanceof HttpResponse) {\r\n return response.body;\r\n }\r\n\r\n if (response instanceof HttpErrorResponse) {\r\n return response.error || response.message || response.statusText;\r\n }\r\n }\r\n\r\n public static checkNoNetwork(response: HttpResponseBase) {\r\n if (response instanceof HttpResponseBase) {\r\n return response.status === 0;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public static checkAccessDenied(response: HttpResponseBase) {\r\n if (response instanceof HttpResponseBase) {\r\n return response.status === 403;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public static checkNotFound(response: HttpResponseBase) {\r\n if (response instanceof HttpResponseBase) {\r\n return response.status === 404;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public static checkIsLocalHost(url: string, base?: string) {\r\n if (url) {\r\n const location = new URL(url, base);\r\n return location.hostname === 'localhost' || location.hostname === '127.0.0.1';\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public static getQueryParamsFromString(paramString: string) {\r\n if (!paramString) {\r\n return null;\r\n }\r\n\r\n const params: { [key: string]: string } = {};\r\n\r\n for (const param of paramString.split('&')) {\r\n const keyValue = Utilities.splitInTwo(param, '=');\r\n params[keyValue.firstPart] = keyValue.secondPart;\r\n }\r\n\r\n return params;\r\n }\r\n\r\n public static splitInTwo(text: string, separator: string): { firstPart: string, secondPart: string } {\r\n const separatorIndex = text.indexOf(separator);\r\n\r\n if (separatorIndex === -1) {\r\n return { firstPart: text, secondPart: null };\r\n }\r\n\r\n const part1 = text.substr(0, separatorIndex).trim();\r\n const part2 = text.substr(separatorIndex + 1).trim();\r\n\r\n return { firstPart: part1, secondPart: part2 };\r\n }\r\n\r\n public static safeStringify(object) {\r\n let result: string;\r\n\r\n try {\r\n result = JSON.stringify(object);\r\n return result;\r\n } catch (error) {\r\n }\r\n\r\n const simpleObject = {};\r\n\r\n for (const prop in object) {\r\n if (!object.hasOwnProperty(prop)) {\r\n continue;\r\n }\r\n if (typeof (object[prop]) === 'object') {\r\n continue;\r\n }\r\n if (typeof (object[prop]) === 'function') {\r\n continue;\r\n }\r\n simpleObject[prop] = object[prop];\r\n }\r\n\r\n result = '[***Sanitized Object***]: ' + JSON.stringify(simpleObject);\r\n\r\n return result;\r\n }\r\n\r\n public static JsonTryParse(value: string) {\r\n try {\r\n return JSON.parse(value);\r\n } catch (e) {\r\n if (value === 'undefined') {\r\n return void 0;\r\n }\r\n return value;\r\n }\r\n }\r\n\r\n public static TestIsObjectEmpty(obj: any) {\r\n for (const prop in obj) {\r\n if (obj.hasOwnProperty(prop)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public static TestIsUndefined(value: any) {\r\n return typeof value === 'undefined';\r\n // return value ===undefined;\r\n }\r\n\r\n public static TestIsString(value: any) {\r\n return typeof value === 'string' || value instanceof String;\r\n }\r\n\r\n public static capitalizeFirstLetter(text: string) {\r\n if (text) {\r\n return text.charAt(0).toUpperCase() + text.slice(1);\r\n } else {\r\n return text;\r\n }\r\n }\r\n\r\n public static toTitleCase(text: string) {\r\n return text.replace(/\\w\\S*/g, (subString) => {\r\n return subString.charAt(0).toUpperCase() + subString.substr(1).toLowerCase();\r\n });\r\n }\r\n\r\n public static toLowerCase(items: string);\r\n public static toLowerCase(items: string[]);\r\n public static toLowerCase(items: any): string | string[] {\r\n if (items instanceof Array) {\r\n const loweredRoles: string[] = [];\r\n\r\n for (let i = 0; i < items.length; i++) {\r\n loweredRoles[i] = items[i].toLowerCase();\r\n }\r\n\r\n return loweredRoles;\r\n } else if (typeof items === 'string' || items instanceof String) {\r\n return items.toLowerCase();\r\n }\r\n }\r\n\r\n public static uniqueId() {\r\n return this.randomNumber(1000000, 9000000).toString();\r\n }\r\n\r\n public static randomNumber(min: number, max: number) {\r\n return Math.floor(Math.random() * (max - min + 1) + min);\r\n }\r\n\r\n public static baseUrl() {\r\n let base = '';\r\n\r\n if (window.location.origin) {\r\n base = window.location.origin;\r\n } else {\r\n base = window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port : '');\r\n }\r\n\r\n return base.replace(/\\/$/, '');\r\n }\r\n\r\n public static printDateOnly(date: Date) {\r\n date = new Date(date);\r\n\r\n const dayNames = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');\r\n const monthNames = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');\r\n\r\n const dayOfWeek = date.getDay();\r\n const dayOfMonth = date.getDate();\r\n let sup = '';\r\n const month = date.getMonth();\r\n const year = date.getFullYear();\r\n\r\n if (dayOfMonth === 1 || dayOfMonth === 21 || dayOfMonth === 31) {\r\n sup = 'st';\r\n } else if (dayOfMonth === 2 || dayOfMonth === 22) {\r\n sup = 'nd';\r\n } else if (dayOfMonth === 3 || dayOfMonth === 23) {\r\n sup = 'rd';\r\n } else {\r\n sup = 'th';\r\n }\r\n\r\n const dateString = dayNames[dayOfWeek] + ', ' + dayOfMonth + sup + ' ' + monthNames[month] + ' ' + year;\r\n\r\n return dateString;\r\n }\r\n\r\n public static printTimeOnly(date: Date) {\r\n date = new Date(date);\r\n\r\n let period = '';\r\n let minute = date.getMinutes().toString();\r\n let hour = date.getHours();\r\n\r\n period = hour < 12 ? 'AM' : 'PM';\r\n\r\n if (hour === 0) {\r\n hour = 12;\r\n }\r\n if (hour > 12) {\r\n hour = hour - 12;\r\n }\r\n\r\n if (minute.length === 1) {\r\n minute = '0' + minute;\r\n }\r\n\r\n const timeString = hour + ':' + minute + ' ' + period;\r\n\r\n return timeString;\r\n }\r\n\r\n public static printDate(date: Date, separator = 'at') {\r\n return `${Utilities.printDateOnly(date)} ${separator} ${Utilities.printTimeOnly(date)}`;\r\n }\r\n\r\n public static printFriendlyDate(date: Date, separator = '-') {\r\n const today = new Date(); today.setHours(0, 0, 0, 0);\r\n const yesterday = new Date(today); yesterday.setDate(yesterday.getDate() - 1);\r\n const test = new Date(date.getFullYear(), date.getMonth(), date.getDate());\r\n\r\n if (test.toDateString() === today.toDateString()) {\r\n return `Today ${separator} ${Utilities.printTimeOnly(date)}`;\r\n }\r\n if (test.toDateString() === yesterday.toDateString()) {\r\n return `Yesterday ${separator} ${Utilities.printTimeOnly(date)}`;\r\n } else {\r\n return Utilities.printDate(date, separator);\r\n }\r\n }\r\n\r\n public static printShortDate(date: Date, separator = '/', dateTimeSeparator = '-') {\r\n let day = date.getDate().toString();\r\n let month = (date.getMonth() + 1).toString();\r\n const year = date.getFullYear();\r\n\r\n if (day.length === 1) {\r\n day = '0' + day;\r\n }\r\n\r\n if (month.length === 1) {\r\n month = '0' + month;\r\n }\r\n\r\n return `${month}${separator}${day}${separator}${year} ${dateTimeSeparator} ${Utilities.printTimeOnly(date)}`;\r\n }\r\n\r\n public static parseDate(date) {\r\n if (date) {\r\n if (date instanceof Date) {\r\n return date;\r\n }\r\n\r\n if (typeof date === 'string' || date instanceof String) {\r\n if (date.search(/[a-su-z+]/i) === -1) {\r\n date = date + 'Z';\r\n }\r\n\r\n return new Date(date);\r\n }\r\n\r\n if (typeof date === 'number' || date instanceof Number) {\r\n return new Date(date as any);\r\n }\r\n }\r\n }\r\n\r\n public static printDuration(start: Date, end: Date) {\r\n start = new Date(start);\r\n end = new Date(end);\r\n\r\n // get total seconds between the times\r\n let delta = Math.abs(start.valueOf() - end.valueOf()) / 1000;\r\n\r\n // calculate (and subtract) whole days\r\n const days = Math.floor(delta / 86400);\r\n delta -= days * 86400;\r\n\r\n // calculate (and subtract) whole hours\r\n const hours = Math.floor(delta / 3600) % 24;\r\n delta -= hours * 3600;\r\n\r\n // calculate (and subtract) whole minutes\r\n const minutes = Math.floor(delta / 60) % 60;\r\n delta -= minutes * 60;\r\n\r\n // what's left is seconds\r\n const seconds = delta % 60; // in theory the modulus is not required\r\n\r\n let printedDays = '';\r\n\r\n if (days) {\r\n printedDays = `${days} days`;\r\n }\r\n\r\n if (hours) {\r\n printedDays += printedDays ? `, ${hours} hours` : `${hours} hours`;\r\n }\r\n\r\n if (minutes) {\r\n printedDays += printedDays ? `, ${minutes} minutes` : `${minutes} minutes`;\r\n }\r\n\r\n if (seconds) {\r\n printedDays += printedDays ? ` and ${seconds} seconds` : `${seconds} seconds`;\r\n }\r\n\r\n if (!printedDays) {\r\n printedDays = '0';\r\n }\r\n\r\n return printedDays;\r\n }\r\n\r\n public static getAge(birthDate, otherDate) {\r\n birthDate = new Date(birthDate);\r\n otherDate = new Date(otherDate);\r\n\r\n let years = (otherDate.getFullYear() - birthDate.getFullYear());\r\n\r\n if (otherDate.getMonth() < birthDate.getMonth() ||\r\n otherDate.getMonth() === birthDate.getMonth() && otherDate.getDate() < birthDate.getDate()) {\r\n years--;\r\n }\r\n\r\n return years;\r\n }\r\n\r\n public static searchArray(searchTerm: string, caseSensitive: boolean, ...values: any[]) {\r\n if (!searchTerm) {\r\n return true;\r\n }\r\n\r\n let filter = searchTerm.trim();\r\n let data = values.join();\r\n\r\n if (!caseSensitive) {\r\n filter = filter.toLowerCase();\r\n data = data.toLowerCase();\r\n }\r\n\r\n return data.indexOf(filter) !== -1;\r\n }\r\n\r\n public static moveArrayItem(array: any[], oldIndex, newIndex) {\r\n if (oldIndex < 0) {\r\n return;\r\n }\r\n\r\n if (newIndex < 0) {\r\n newIndex += array.length;\r\n }\r\n\r\n if (newIndex >= array.length) {\r\n let k = newIndex - array.length;\r\n while ((k--) + 1) {\r\n array.push(undefined);\r\n }\r\n }\r\n\r\n array.splice(newIndex, 0, array.splice(oldIndex, 1)[0]);\r\n }\r\n\r\n public static expandCamelCase(text: string) {\r\n if (!text) {\r\n return text;\r\n }\r\n\r\n return text.replace(/([A-Z][a-z]+)/g, ' $1')\r\n .replace(/([A-Z][A-Z]+)/g, ' $1')\r\n .replace(/([^A-Za-z ]+)/g, ' $1');\r\n }\r\n\r\n public static testIsAbsoluteUrl(url: string) {\r\n const r = new RegExp('^(?:[a-z]+:)?//', 'i');\r\n return r.test(url);\r\n }\r\n\r\n public static convertToAbsoluteUrl(url: string) {\r\n return Utilities.testIsAbsoluteUrl(url) ? url : '//' + url;\r\n }\r\n\r\n public static removeNulls(obj) {\r\n const isArray = obj instanceof Array;\r\n\r\n for (let k = 0; k < obj.length; k++) {\r\n if (obj[k] === null) {\r\n isArray ? obj.splice(k, 1) : delete obj[k];\r\n } else if (typeof obj[k] === 'object') {\r\n Utilities.removeNulls(obj[k]);\r\n }\r\n\r\n if (isArray && obj.length === k) {\r\n Utilities.removeNulls(obj);\r\n }\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n public static debounce(func: (...args) => any, wait: number, immediate?: boolean) {\r\n let timeout;\r\n\r\n return function () {\r\n const context = this;\r\n const args_ = arguments;\r\n\r\n const later = function () {\r\n timeout = null;\r\n if (!immediate) {\r\n func.apply(context, args_);\r\n }\r\n };\r\n\r\n const callNow = immediate && !timeout;\r\n\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n\r\n if (callNow) {\r\n func.apply(context, args_);\r\n }\r\n };\r\n }\r\n}\r\n","// ===========================================\r\n// Email: info@ebenmonney.com\r\n// www.ebenmonney.com/templates\r\n// ===========================================\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\nimport { Utilities } from './utilities';\r\n\r\n@Injectable()\r\n/**\r\n* Provides a wrapper for accessing the web storage API and synchronizing session storage across tabs/windows.\r\n*/\r\nexport class LocalStoreManager {\r\n private static syncListenerInitialised = false;\r\n\r\n public static readonly DBKEY_USER_DATA = 'user_data';\r\n private static readonly DBKEY_SYNC_KEYS = 'sync_keys';\r\n private syncKeys: string[] = [];\r\n private initEvent = new Subject();\r\n\r\n private reservedKeys: string[] =\r\n [\r\n 'sync_keys',\r\n 'addToSyncKeys',\r\n 'removeFromSyncKeys',\r\n 'getSessionStorage',\r\n 'setSessionStorage',\r\n 'addToSessionStorage',\r\n 'removeFromSessionStorage',\r\n 'clearAllSessionsStorage'\r\n ];\r\n\r\n public initialiseStorageSyncListener() {\r\n if (LocalStoreManager.syncListenerInitialised === true) {\r\n return;\r\n }\r\n\r\n LocalStoreManager.syncListenerInitialised = true;\r\n window.addEventListener('storage', this.sessionStorageTransferHandler, false);\r\n this.syncSessionStorage();\r\n }\r\n\r\n public deinitialiseStorageSyncListener() {\r\n window.removeEventListener('storage', this.sessionStorageTransferHandler, false);\r\n LocalStoreManager.syncListenerInitialised = false;\r\n }\r\n\r\n public clearAllStorage() {\r\n this.clearAllSessionsStorage();\r\n this.clearLocalStorage();\r\n }\r\n public set(key, value, ttl = null) {\r\n if (ttl) {\r\n const expires = new Date();\r\n expires.setSeconds(expires.getSeconds() + ttl);\r\n localStorage.set(key, [expires, value]);\r\n } else {\r\n localStorage.set(key, [null, value]);\r\n }\r\n }\r\n public clearAllSessionsStorage() {\r\n this.clearInstanceSessionStorage();\r\n localStorage.removeItem(LocalStoreManager.DBKEY_SYNC_KEYS);\r\n\r\n localStorage.setItem('clearAllSessionsStorage', '_dummy');\r\n localStorage.removeItem('clearAllSessionsStorage');\r\n }\r\n\r\n public clearInstanceSessionStorage() {\r\n sessionStorage.clear();\r\n this.syncKeys = [];\r\n }\r\n\r\n public clearLocalStorage() {\r\n localStorage.clear();\r\n }\r\n\r\n public saveSessionData(data: any, key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n this.removeFromSyncKeys(key);\r\n localStorage.removeItem(key);\r\n this.sessionStorageSetItem(key, data);\r\n }\r\n\r\n public saveSyncedSessionData(data: any, key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n localStorage.removeItem(key);\r\n this.addToSessionStorage(data, key);\r\n }\r\n\r\n public savePermanentData(data: any, key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n this.removeFromSessionStorage(key);\r\n this.localStorageSetItem(key, data);\r\n }\r\n\r\n public moveDataToSessionStorage(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n const data = this.getData(key);\r\n\r\n if (data === null) {\r\n return;\r\n }\r\n\r\n this.saveSessionData(data, key);\r\n }\r\n\r\n public moveDataToSyncedSessionStorage(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n const data = this.getData(key);\r\n\r\n if (data === null) {\r\n return;\r\n }\r\n\r\n this.saveSyncedSessionData(data, key);\r\n }\r\n\r\n public moveDataToPermanentStorage(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n const data = this.getData(key);\r\n\r\n if (data === null) {\r\n return;\r\n }\r\n\r\n this.savePermanentData(data, key);\r\n }\r\n\r\n public exists(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n let data = sessionStorage.getItem(key);\r\n\r\n if (data === null) {\r\n data = localStorage.getItem(key);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n public getData(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n let data = this.sessionStorageGetItem(key);\r\n\r\n if (data === null) {\r\n data = this.localStorageGetItem(key);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n public getDataObject(key = LocalStoreManager.DBKEY_USER_DATA, isDateType = false): T {\r\n let data = this.getData(key);\r\n\r\n if (data !== null) {\r\n if (isDateType) {\r\n data = new Date(data);\r\n }\r\n return data as T;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n public deleteData(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n this.removeFromSessionStorage(key);\r\n localStorage.removeItem(key);\r\n }\r\n\r\n public getInitEvent(): Observable<{}> {\r\n return this.initEvent.asObservable();\r\n }\r\n\r\n private sessionStorageTransferHandler = (event: StorageEvent) => {\r\n if (!event.newValue) {\r\n return;\r\n }\r\n\r\n if (event.key === 'getSessionStorage') {\r\n if (sessionStorage.length) {\r\n this.localStorageSetItem('setSessionStorage', sessionStorage);\r\n localStorage.removeItem('setSessionStorage');\r\n }\r\n } else if (event.key === 'setSessionStorage') {\r\n if (!this.syncKeys.length) {\r\n this.loadSyncKeys();\r\n }\r\n const data = JSON.parse(event.newValue);\r\n // console.info(\"Set => Key: Transfer setSessionStorage\" + \", data: \" + JSON.stringify(data));\r\n\r\n for (const key in data) {\r\n if (this.syncKeysContains(key)) {\r\n this.sessionStorageSetItem(key, JSON.parse(data[key]));\r\n }\r\n }\r\n\r\n this.onInit();\r\n } else if (event.key === 'addToSessionStorage') {\r\n const data = JSON.parse(event.newValue);\r\n\r\n // console.warn(\"Set => Key: Transfer addToSessionStorage\" + \", data: \" + JSON.stringify(data));\r\n\r\n this.addToSessionStorageHelper(data.data, data.key);\r\n } else if (event.key === 'removeFromSessionStorage') {\r\n this.removeFromSessionStorageHelper(event.newValue);\r\n } else if (event.key === 'clearAllSessionsStorage' && sessionStorage.length) {\r\n this.clearInstanceSessionStorage();\r\n } else if (event.key === 'addToSyncKeys') {\r\n this.addToSyncKeysHelper(event.newValue);\r\n } else if (event.key === 'removeFromSyncKeys') {\r\n this.removeFromSyncKeysHelper(event.newValue);\r\n }\r\n }\r\n\r\n private syncSessionStorage() {\r\n localStorage.setItem('getSessionStorage', '_dummy');\r\n localStorage.removeItem('getSessionStorage');\r\n }\r\n\r\n private addToSessionStorage(data: any, key: string) {\r\n this.addToSessionStorageHelper(data, key);\r\n this.addToSyncKeysBackup(key);\r\n\r\n this.localStorageSetItem('addToSessionStorage', { key, data });\r\n localStorage.removeItem('addToSessionStorage');\r\n }\r\n\r\n private addToSessionStorageHelper(data: any, key: string) {\r\n this.addToSyncKeysHelper(key);\r\n this.sessionStorageSetItem(key, data);\r\n }\r\n\r\n private removeFromSessionStorage(keyToRemove: string) {\r\n this.removeFromSessionStorageHelper(keyToRemove);\r\n this.removeFromSyncKeysBackup(keyToRemove);\r\n\r\n localStorage.setItem('removeFromSessionStorage', keyToRemove);\r\n localStorage.removeItem('removeFromSessionStorage');\r\n }\r\n\r\n private removeFromSessionStorageHelper(keyToRemove: string) {\r\n sessionStorage.removeItem(keyToRemove);\r\n this.removeFromSyncKeysHelper(keyToRemove);\r\n }\r\n\r\n private testForInvalidKeys(key: string) {\r\n if (!key) {\r\n throw new Error('key cannot be empty');\r\n }\r\n\r\n if (this.reservedKeys.some(x => x === key)) {\r\n throw new Error(`The storage key \"${key}\" is reserved and cannot be used. Please use a different key`);\r\n }\r\n }\r\n\r\n private syncKeysContains(key: string) {\r\n return this.syncKeys.some(x => x === key);\r\n }\r\n\r\n private loadSyncKeys() {\r\n if (this.syncKeys.length) {\r\n return;\r\n }\r\n\r\n this.syncKeys = this.getSyncKeysFromStorage();\r\n }\r\n\r\n private getSyncKeysFromStorage(defaultValue: string[] = []): string[] {\r\n const data = this.localStorageGetItem(LocalStoreManager.DBKEY_SYNC_KEYS);\r\n\r\n if (data === null) {\r\n return defaultValue;\r\n } else {\r\n return data as string[];\r\n }\r\n }\r\n\r\n private addToSyncKeys(key: string) {\r\n this.addToSyncKeysHelper(key);\r\n this.addToSyncKeysBackup(key);\r\n\r\n localStorage.setItem('addToSyncKeys', key);\r\n localStorage.removeItem('addToSyncKeys');\r\n }\r\n\r\n private addToSyncKeysBackup(key: string) {\r\n const storedSyncKeys = this.getSyncKeysFromStorage();\r\n\r\n if (!storedSyncKeys.some(x => x === key)) {\r\n storedSyncKeys.push(key);\r\n this.localStorageSetItem(LocalStoreManager.DBKEY_SYNC_KEYS, storedSyncKeys);\r\n }\r\n }\r\n\r\n private removeFromSyncKeysBackup(key: string) {\r\n const storedSyncKeys = this.getSyncKeysFromStorage();\r\n\r\n const index = storedSyncKeys.indexOf(key);\r\n\r\n if (index > -1) {\r\n storedSyncKeys.splice(index, 1);\r\n this.localStorageSetItem(LocalStoreManager.DBKEY_SYNC_KEYS, storedSyncKeys);\r\n }\r\n }\r\n\r\n private addToSyncKeysHelper(key: string) {\r\n if (!this.syncKeysContains(key)) {\r\n this.syncKeys.push(key);\r\n }\r\n }\r\n\r\n private removeFromSyncKeys(key: string) {\r\n this.removeFromSyncKeysHelper(key);\r\n this.removeFromSyncKeysBackup(key);\r\n\r\n localStorage.setItem('removeFromSyncKeys', key);\r\n localStorage.removeItem('removeFromSyncKeys');\r\n }\r\n\r\n private removeFromSyncKeysHelper(key: string) {\r\n const index = this.syncKeys.indexOf(key);\r\n\r\n if (index > -1) {\r\n this.syncKeys.splice(index, 1);\r\n }\r\n }\r\n\r\n private localStorageSetItem(key: string, data: any) {\r\n localStorage.setItem(key, JSON.stringify(data));\r\n }\r\n\r\n private sessionStorageSetItem(key: string, data: any) {\r\n sessionStorage.setItem(key, JSON.stringify(data));\r\n }\r\n\r\n private localStorageGetItem(key: string) {\r\n return Utilities.JsonTryParse(localStorage.getItem(key));\r\n }\r\n\r\n private sessionStorageGetItem(key: string) {\r\n return Utilities.JsonTryParse(sessionStorage.getItem(key));\r\n }\r\n\r\n private onInit() {\r\n setTimeout(() => {\r\n this.initEvent.next();\r\n this.initEvent.complete();\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GroupByService {\r\n groupby(value: Array, field: string): Array {\r\n const groupedObj = value.reduce((prev, cur) => {\r\n if (!prev[cur[field]]) {\r\n prev[cur[field]] = [cur];\r\n } else {\r\n prev[cur[field]].push(cur);\r\n }\r\n return prev;\r\n }, {});\r\n return Object.keys(groupedObj).map(key => ({\r\n key,\r\n value: groupedObj[key]\r\n }));\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { FactorModel } from 'src/models/factor.model';\r\nimport { TableGroupModel } from 'src/models/tablegroup.model';\r\n\r\nimport { TableModel } from 'src/models/table.model';\r\nimport { RestApiService } from './rest-api.service';\r\nimport { NgxUiLoaderService } from 'ngx-ui-loader';\r\nimport { StateEnum } from 'src/models/enum/state.enum';\r\nimport { ShareDataService } from '../providers/sharedata.service';\r\nimport { GroupByService } from '../providers/groupby.service';\r\nimport { state } from '@angular/animations';\r\nimport { MatSnackBar } from '@angular/material';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { Router } from '@angular/router';\r\nimport { debug } from 'console';\r\nimport { PushNotificationsService } from './push.notification.service';\r\nimport { SwPush } from '@angular/service-worker';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\n\r\nexport class OrderService {\r\n private connection: signalR.HubConnection;\r\n tableGroup: TableGroupModel[];\r\n selectedGroup: TableModel[];\r\n groupFactors: any[];\r\n selectedFilter: string;\r\n factors: FactorModel[];\r\n selecteditem: any;\r\n tableCall: string;\r\n //selecteditem: boolean;\r\n forbidden: boolean;\r\n isConnect : boolean;\r\n constructor(\r\n private api: RestApiService,\r\n private spinner: NgxUiLoaderService,\r\n private share: ShareDataService,\r\n public grouplist: GroupByService,\r\n protected _snackBar: MatSnackBar,\r\n public toastr: ToastrService,\r\n public router: Router,\r\n private _notificationService: PushNotificationsService\r\n ) {\r\n // this._notificationService.requestPermission();\r\n }\r\n // public hubConnection: signalR.HubConnection;\r\n // public startConnection = () => {\r\n // if (!this.connection && !this.isConnect ) {\r\n // // this.getSetting();\r\n // this.hubConnection = new signalR.HubConnectionBuilder()\r\n // .withUrl(this.api.apiUrl + '/TableHub')\r\n // .configureLogging(signalR.LogLevel.Trace)\r\n // .build();\r\n // this.hubConnection.serverTimeoutInMilliseconds = 1000 * 60 * 1.2; // 1 second * 60 * 10 = 10 minutes.\r\n // this.hubConnection\r\n // .start()\r\n // .then(() => { console.log('Connection started'); this.isConnect = true; this.addTransferDataListener(); })\r\n // .catch(err => console.log('Error while starting connection: ' + err));\r\n // }\r\n // this.hubConnection.keepAliveIntervalInMilliseconds = 31104000000;\r\n // this.hubConnection\r\n // .onclose(() => {\r\n // setTimeout(() => {\r\n // if (!this.forbidden) {\r\n // this.isConnect = false;\r\n // this.startConnection();\r\n // }\r\n // }, 2000);\r\n // });\r\n // }\r\n disconnect() {\r\n if (this.connection) {\r\n this.connection.stop();\r\n this.connection = null;\r\n }\r\n }\r\n\r\n isEnabled() {\r\n return Notification.permission == \"granted\" ? true : false;\r\n }\r\n\r\n request() {\r\n this._notificationService.requestPermission();\r\n }\r\n\r\n notify(t: string, c: string) {\r\n let data: Array = [];\r\n data.push({\r\n title: t,\r\n alertContent: c,\r\n tag: \"گارسون\",\r\n sound: `${this.share.api.apiUrl}/assets/audio/notification.mp3`,\r\n dir: \"rtl\"\r\n });\r\n // data.push({\r\n // title: \"2 Title with badge\",\r\n // badge: \"https://img.icons8.com/plasticine/2x/google-logo.png\",\r\n // tag: \"tag_2\"\r\n // });\r\n\r\n // data.push({\r\n // title: \"3 Title, badge & body\",\r\n // alertContent: \"Notification body\",\r\n // badge: \"https://img.icons8.com/plasticine/2x/google-logo.png\",\r\n // tag: \"tag_3\"\r\n // });\r\n // data.push({\r\n // title: \"4 Tile, badge, body & icon\",\r\n // alertContent: \"Notification body\",\r\n // badge: \"https://img.icons8.com/plasticine/2x/google-logo.png\",\r\n // icon: \"https://avatars1.githubusercontent.com/u/28635252?s=400&v=4\",\r\n // tag: \"tag_4\"\r\n // });\r\n // data.push({\r\n // title: \"5 Title, badge, body, icon & image\",\r\n // alertContent: \"Notification body\",\r\n // badge: \"https://img.icons8.com/plasticine/2x/google-logo.png\",\r\n // icon: \"https://avatars1.githubusercontent.com/u/28635252?s=400&v=4\",\r\n // image: \"https://live.staticflickr.com/4134/4897775884_0d3b982b2f_b.jpg\",\r\n // tag: \"tag_5\"\r\n // });\r\n // data.push({\r\n // title: \"4 Tile, badge, body & icon\",\r\n // alertContent: \"Notification body - updated!\",\r\n // badge: \"https://img.icons8.com/plasticine/2x/google-logo.png\",\r\n // icon: \"https://avatars1.githubusercontent.com/u/28635252?s=400&v=4\",\r\n // tag: \"tag_4\"\r\n // });\r\n // data.push({\r\n // title: \"6 Tile, badge, body & icon\",\r\n // alertContent: \"Notification body - Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.\",\r\n // badge: \"https://img.icons8.com/plasticine/2x/google-logo.png\",\r\n // icon: \"https://avatars1.githubusercontent.com/u/28635252?s=400&v=4\",\r\n // tag: \"tag_6\"\r\n // });\r\n this._notificationService.generateNotification(data);\r\n }\r\n\r\n\r\n // addTransferDataListener = () => {\r\n // this.hubConnection.on('transferNotification', (res: number) => {\r\n // // for (let i = 0; i < this.tableGroup.length; i++) {\r\n // // const find = this.tableGroup[i].tables.find(f => f.tableId === res);\r\n // // if (find && find.tableName && find.tableName !== '') {\r\n // // this.tableCall = find.tableName;\r\n // // break;\r\n // // }\r\n // // }\r\n // const find = this.selectedGroup.find(f => f.tableId === res);\r\n // if (find && find.tableName && find.tableName !== '') {\r\n // this.request();\r\n // this.notify(find.tableName);\r\n // this.playAudio();\r\n // this.toastr.warning(`${find.tableName} در خواست مراجعه دارد`, 'توجه', { timeOut: 1000000, closeButton: true, positionClass: 'toast-bottom-right', });\r\n // }\r\n // });\r\n // this.hubConnection.on('transferOrderData', (data: FactorModel) => {\r\n // if (data.status != 0 && ((this.tableGroup) && (data.status === StateEnum.Save || data.status === StateEnum.SaveMerge))) {\r\n // for (let i = 0; i < this.tableGroup.length; i++) {\r\n // const find = this.tableGroup[i].tables.filter(f => f.tableId.toString() === data.tableId && f.branchCode === data.branchCode)[0];\r\n // if ((find)) {\r\n // if (data.tas && data.tas === 1) {\r\n // find.waiterId = null;\r\n // find.waiterName = '';\r\n // find.customerName = '';\r\n // find.time = null;\r\n // find.num = null;\r\n // if (this.share.filterTableList && this.share.tableList) {\r\n // const find = this.share.tableList.find(f => f.tableId.toString() === data.tableId);\r\n // if (!this.share.filterTableList.some(s => find.tableId === s.tableId))\r\n // this.share.filterTableList.push(find);\r\n // }\r\n // this.filter(this.selectedFilter);\r\n // break;\r\n // } else {\r\n // find.waiterId = data.waiterId;\r\n // find.waiterName = data.waiterName;\r\n // find.customerName = data.customerName;\r\n // find.time = data.time;\r\n // find.num = data.num;\r\n // if (this.share.filterTableList) {\r\n // const findIndex = this.share.filterTableList.findIndex(f => f.tableId === Number(data.tableId));\r\n // if ((findIndex))\r\n // this.share.filterTableList.splice(findIndex, 1);\r\n // }\r\n // this.filter(this.selectedFilter);\r\n // break;\r\n // }\r\n // }\r\n // }\r\n // if (this.share.setting?.systemLayer?.hasTabletOrder) {\r\n // this.refreshTableTimeLeft();\r\n // }\r\n // }\r\n // if ((data.id) && data.id !== 0 && (this.groupFactors) && data.status === StateEnum.Add) {\r\n // if (!this.groupFactors.some(s => s.key === data.tableId) && data.status === StateEnum.Add) {\r\n // this.factors.push(data);\r\n // this.groupFactors = this.grouplist.groupby(this.factors, 'tableId');\r\n // if (this.groupFactors.length === 1)\r\n // this.selecteditem = this.groupFactors[0].value;\r\n // }\r\n // else {\r\n // for (let j = 0; j < this.groupFactors.length; j++) {\r\n // if (!this.groupFactors.some(s => s.key === data.tableId)) {\r\n // this.factors.push(data);\r\n // this.groupFactors = this.grouplist.groupby(this.factors, 'tableId');\r\n // break;\r\n // }\r\n // if (this.groupFactors[j].value[0].tableId === data.tableId) {\r\n // if (data.status === StateEnum.Add) {\r\n // this.factors.push(data);\r\n // if (this.selecteditem[0].tableId === data.tableId)\r\n // this.selecteditem.push(data);\r\n // this.groupFactors = this.grouplist.groupby(this.factors, 'tableId');\r\n // break;\r\n // }\r\n // if (data.status === StateEnum.Deleted || data.status === StateEnum.Save || data.status === StateEnum.SaveMerge) {\r\n // this.groupFactors.splice(j, 1);\r\n // break;\r\n // }\r\n // }\r\n // }\r\n // //if (!this.groupFactors || this.groupFactors.length <= 0) {\r\n // // this.selecteditem = false;\r\n // //}\r\n // }\r\n // if (this.share.loginuser && this.share.loginuser.code)\r\n // this.playAudio();\r\n // }\r\n // this.spinner.stopAll();\r\n // this.share.getDigitalMenuCount();\r\n // });\r\n // this.hubConnection.on('RedirectResult', (data: any) => {\r\n // this.router.navigate([`/payment`]);\r\n // });\r\n // }\r\n filter(event: string) {\r\n this.selectedGroup = [];\r\n if (!(event)) {\r\n this.selectedFilter = 'All';\r\n } else {\r\n this.selectedFilter = event;\r\n }\r\n switch (this.selectedFilter) {\r\n case 'All':\r\n this.selectedGroup = Object.assign([], this.tableGroup[this.share.selectedGroupIndex].tables);\r\n break;\r\n case 'Busy':\r\n this.selectedGroup = Object.assign([], this.tableGroup[this.share.selectedGroupIndex].tables.filter(f => (f.num)));\r\n break;\r\n case 'Free':\r\n this.selectedGroup = Object.assign([], this.tableGroup[this.share.selectedGroupIndex].tables.filter(f => !(f.num)));\r\n break;\r\n default:\r\n this.selectedGroup = Object.assign([], this.tableGroup[this.share.selectedGroupIndex].tables);\r\n break;\r\n }\r\n }\r\n refreshTableTimeLeft() {\r\n this.api.getEntity('GetTableTimeLeft').subscribe((res: TableModel[]) => {\r\n if (res && res.length > 0 && this.tableGroup && this.tableGroup.length > 0) {\r\n for (let i = 0; i < this.tableGroup.length; i++) {\r\n res.forEach(el => {\r\n const find = this.tableGroup[i].tables.find(f => f.tableId === el.tableId);\r\n if (find)\r\n find.time = el.time;\r\n });\r\n }\r\n }\r\n });\r\n }\r\n playAudio() {\r\n let audio = new Audio();\r\n audio.src = \"../../../assets/audio/alarm.mp4\";\r\n audio.load();\r\n audio.play();\r\n }\r\n playNAudio() {\r\n let audio = new Audio();\r\n audio.src = \"../../../assets/audio/notification.mp3\";\r\n audio.load();\r\n audio.play();\r\n }\r\n //stopConnection() {\r\n // this.hubConnection.stop();\r\n //}\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { MatDialog } from \"@angular/material\";\r\nimport { NgxUiLoaderService } from \"ngx-ui-loader\";\r\nimport { Subject } from \"rxjs/Rx\";\r\nimport { DialogComponent } from \"src/app/dialog/dialog.component\";\r\nimport { InvoiceModel } from \"../models/factor.model\";\r\nimport { WebsocketService } from \"./websocket.service\";\r\n\r\nconst CHAT_URL = \"ws://127.0.0.1:1372/\";\r\n//const CHAT_URL = \"ws://192.168.247.65:1372/\";\r\n\r\nexport class ParsianPaymentModel {\r\n CompanyName: string;\r\n RequestType: string;\r\n AM: string;\r\n paymentType: string;\r\n GovID: string;\r\n SC: string;\r\n ID: string;\r\n constructor() {\r\n this.CompanyName = \"SEPIDZ\";\r\n this.RequestType = \"Sale\";\r\n this.AM = \"0\";\r\n this.paymentType = \"CARD\";\r\n this.ID = \"\";\r\n this.GovID = \"\";\r\n this.SC = \"4020\";\r\n }\r\n}\r\nexport class ParsianPosInfoModel {\r\n CompanyName: string;\r\n RequestType: string;\r\n constructor() {\r\n this.CompanyName = \"SEPIDZ\";\r\n this.RequestType = 'getMerchantInfo';\r\n }\r\n}\r\nexport class ParsianHasPaperModel {\r\n CompanyName: string;\r\n RequestType: string;\r\n constructor() {\r\n this.CompanyName = \"SEPIDZ\";\r\n this.RequestType = 'checkPaper';\r\n }\r\n}\r\nexport class ParsianReceiptBitMapModel {\r\n CompanyName: string;\r\n RequestType: string;\r\n invoice: InvoiceModel;\r\n constructor() {\r\n this.CompanyName = \"SEPIDZ\";\r\n this.RequestType = 'receiptBitMap';\r\n this.invoice = null;\r\n }\r\n}\r\nexport class ParsianResponseModel {\r\n compName: string;\r\n trxType: string;\r\n RS: any;\r\n CN: any;\r\n RN: any;\r\n SN: any;\r\n TN: any;\r\n DT: any;\r\n AM: any;\r\n PS: any;\r\n CP: any;\r\n GI: any;\r\n TO: any;\r\n BR: any;\r\n MI: any;\r\n TS: any;\r\n TF: any;\r\n ER: any;\r\n RC: any;\r\n}\r\n@Injectable()\r\nexport class ParsianPosService {\r\n public messages: Subject;\r\n public factorPrin = '';\r\n constructor(private wsService: WebsocketService, private dialog: MatDialog, private spinner: NgxUiLoaderService) { }\r\n\r\n connect(){\r\n this.messages = >this.wsService.connect(CHAT_URL).map(\r\n (response: MessageEvent): ParsianResponseModel => {\r\n let data: ParsianResponseModel = JSON.parse(response.data);\r\n let res: boolean = false;\r\n if (data.ER !== 'null') {\r\n const dialogRef = this.dialog.open(DialogComponent);\r\n dialogRef.componentInstance.title = 'توجه';\r\n dialogRef.componentInstance.hasCancel = true;\r\n dialogRef.componentInstance.message = `${data.ER}`;\r\n dialogRef.afterClosed().subscribe(result => {\r\n res = false;\r\n this.spinner.stopAll();\r\n return;\r\n\r\n });\r\n }\r\n else {\r\n if (data.RS !== 'null') {\r\n if (data.RS === '00') {\r\n const dialogRef = this.dialog.open(DialogComponent);\r\n dialogRef.componentInstance.title = 'توجه';\r\n dialogRef.componentInstance.hasCancel = true;\r\n dialogRef.componentInstance.message = `پرداخت با موفقیت انجام شد شماره پیگیری : ${data.SN}`;\r\n res = true;\r\n dialogRef.afterClosed().subscribe(result => {\r\n res = true;\r\n this.spinner.stopAll();\r\n\r\n });\r\n }\r\n else {\r\n const dialogRef = this.dialog.open(DialogComponent);\r\n dialogRef.componentInstance.title = 'توجه';\r\n dialogRef.componentInstance.hasCancel = true;\r\n dialogRef.componentInstance.message = `پرداخت با خطا روبرو شد `;\r\n dialogRef.afterClosed().subscribe(result => {\r\n res = false;\r\n this.spinner.stopAll();\r\n });\r\n }\r\n }\r\n }\r\n\r\n this.spinner.stopAll();\r\n return data;\r\n }\r\n );\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { TranslateService } from '@ngx-translate/core';\r\n\r\n@Pipe({\r\n name: 'persianNumber',\r\n pure: false\r\n})\r\nexport class PersianNumberPipe implements PipeTransform {\r\n constructor(private translate: TranslateService) { }\r\n\r\n transform(value: any): string {\r\n if ((value === undefined || value === null) ||\r\n (this.translate.currentLang && this.translate.currentLang.toLowerCase() !== \"fa\")) {\r\n // return this.toEnglishNumber(value.toString());\r\n return value;\r\n }\r\n return this.toPersianNumber(value.toString());\r\n }\r\n public toPersianNumber(number: string): string {\r\n if (number === undefined) {\r\n return '';\r\n }\r\n let str = number.toString().trim();\r\n if (str === '') {\r\n return '';\r\n }\r\n str = str.replace(/0/g, '۰');\r\n str = str.replace(/1/g, '۱');\r\n str = str.replace(/2/g, '۲');\r\n str = str.replace(/3/g, '۳');\r\n str = str.replace(/4/g, '۴');\r\n str = str.replace(/5/g, '۵');\r\n str = str.replace(/6/g, '۶');\r\n str = str.replace(/7/g, '۷');\r\n str = str.replace(/8/g, '۸');\r\n str = str.replace(/9/g, '۹');\r\n return str;\r\n }\r\n public toEnglishNumber(number: string): string {\r\n if (number === undefined) {\r\n return '';\r\n }\r\n let str = number.toString().trim();\r\n if (str === '') {\r\n return '';\r\n }\r\n str = str.replace('۰', '0');\r\n str = str.replace('۱', '1');\r\n str = str.replace('۲', '2');\r\n str = str.replace('۳', '3');\r\n str = str.replace('۴', '4');\r\n str = str.replace('۵', '5');\r\n str = str.replace('۶', '6');\r\n str = str.replace('۷', '7');\r\n str = str.replace('۸', '8');\r\n str = str.replace('۹', '9');\r\n return str;\r\n }\r\n}\r\n","import { Injectable, OnDestroy } from \"@angular/core\";\r\nimport { Subject } from \"rxjs-compat\";\r\nimport { FactorModel, InvoiceDetailsModel, InvoiceModel, PrintInvoiceModel } from \"src/models/factor.model\";\r\nimport { LocalStoreManager } from \"./local-store-manager.service\";\r\nimport { ParsianHasPaperModel, ParsianPaymentModel, ParsianPosService, ParsianReceiptBitMapModel, ParsianResponseModel } from \"./parsianpos.service\";\r\nimport { RestApiService } from \"./rest-api.service\";\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { MatDialog, MatSnackBar } from '@angular/material';\r\nimport { DialogComponent } from \"../app/dialog/dialog.component\";\r\nimport { TranslateService } from \"@ngx-translate/core\";\r\nimport { TableGroupModel } from \"../models/tablegroup.model\";\r\nimport { OrderService } from \"./order.service\";\r\nimport { ShareDataService } from \"../providers/sharedata.service\";\r\n\r\n@Injectable()\r\nexport class PosClearingService implements OnDestroy {\r\n tasvieh: any;\r\n constructor(private parsianSerice: ParsianPosService,\r\n private api: RestApiService,\r\n private storage: LocalStoreManager,\r\n protected translateText: TranslateService,\r\n private dialog: MatDialog,\r\n protected _snackBar: MatSnackBar,\r\n private order: OrderService,\r\n private share: ShareDataService) {\r\n }\r\n ngUnsubscribe = new Subject();\r\n ngOnDestroy(): void {\r\n this.ngUnsubscribe.next();\r\n this.ngUnsubscribe.complete();\r\n }\r\n clear(factor?: FactorModel,) {\r\n\r\n this.tasvieh = this.storage.getData('Settlement');\r\n // Matin Req For zero Price Print\r\n if ((this.tasvieh && this.tasvieh?.Id <= 1) || !this.tasvieh || factor.price === 0) {\r\n this.clearing(factor);\r\n return;\r\n }\r\n switch (this.tasvieh?.Id) {\r\n case 2:\r\n this.parsianpayment(factor);\r\n break;\r\n case 3:\r\n this.parsianpayment(factor);\r\n break;\r\n case 4:\r\n this.parsianpayment(factor);\r\n break;\r\n case 5:\r\n this.parsianpayment(factor);\r\n break;\r\n default:\r\n console.warn('نحوه پرداخت پیدا نشد');\r\n break;\r\n }\r\n }\r\n parsianpayment(factor: FactorModel) {\r\n this.parsianSerice.connect();\r\n this.parsianSerice.messages.next(new ParsianHasPaperModel);\r\n this.parsianSerice.messages.subscribe((res: ParsianResponseModel) => {\r\n if (res?.CP === '-1') {\r\n const dialogRef = this.dialog.open(DialogComponent);\r\n dialogRef.componentInstance.title = 'توجه';\r\n dialogRef.componentInstance.hasCancel = true;\r\n dialogRef.componentInstance.message = `پرینتر کاغذ ندارد`;\r\n dialogRef.afterClosed().subscribe(result => {\r\n return;\r\n });\r\n }\r\n else {\r\n const payment = new ParsianPaymentModel();\r\n payment.AM = factor.price.toString();\r\n this.parsianSerice.connect();\r\n this.parsianSerice.messages.next(payment);\r\n this.parsianSerice.messages.subscribe((res: ParsianResponseModel) => {\r\n this._snackBar.open('', this.translateText.instant('Message.SaveData'), {\r\n duration: 10000,\r\n });\r\n factor.transactionNo = res?.SN;\r\n factor.errorMessagePay = res?.ER;\r\n factor.transactionNo = res?.SN;\r\n if (res?.RS === '00')\r\n this.clearing(factor);\r\n });\r\n }\r\n });\r\n }\r\n clearing(factor: FactorModel) {\r\n this.api.postEntity(factor, 'UpdateFactorState')\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe((res: FactorModel) => {\r\n this._snackBar.open('', this.translateText.instant('Message.SaveData'), {\r\n duration: 10000,\r\n });\r\n this.print(res)\r\n\r\n }\r\n );\r\n }\r\n print(factor: FactorModel) {\r\n if (this.tasvieh && this.tasvieh?.Id === 2 || this.tasvieh?.Id === 3 || this.tasvieh?.Id === 4 || this.tasvieh?.Id === 5) { //2_saman & 4_irankish also use the same method as parsian\r\n this.ParsianPrint(factor)\r\n }\r\n }\r\n ParsianPrint(factor: FactorModel) {\r\n const factorList = [];\r\n const payment = new ParsianReceiptBitMapModel();\r\n factorList.push(factor);\r\n payment.invoice = factorList.maper(new InvoiceModel())[0];\r\n payment.invoice.invoiceDetail = factorList[0].factorDetail.maper(new InvoiceDetailsModel());\r\n payment.invoice.restaurantName = this.share.setting.brandName;\r\n for (const element of payment.invoice.invoiceDetail) {\r\n if (this.share.setting.currency === 1) element.unitPrice /= 10; //if Toman, convert price to toman\r\n element.qty = element.qty ;\r\n payment.invoice.sumQty += element.qty;\r\n payment.invoice.sumPrice += element.qty * element.unitPrice * 10;\r\n element.sumUnitPrice = element.qty * element.unitPrice * 10;\r\n }\r\n if (!payment.invoice.usedCredit)\r\n payment.invoice.usedCredit = 0;\r\n payment.invoice.creditPrice = payment.invoice.usedCredit;\r\n this.parsianSerice.connect();\r\n this.parsianSerice.messages.next(payment);\r\n this.parsianSerice.messages.subscribe((res: ParsianResponseModel) => {\r\n //this.dialogRef.close();\r\n const print = new PrintInvoiceModel();\r\n print.branchCode = factor.branchCode;\r\n print.num = factor.num;\r\n print.pr =1;\r\n this.api.postEntity(print, 'UpdateInvoicePrintFlag')\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe((res: FactorModel) => {\r\n this.refresh();\r\n });\r\n });\r\n }\r\n refresh() {\r\n this.api.getEntity('TablesGroup')\r\n .pipe(takeUntil(this.ngUnsubscribe))\r\n .subscribe((res: TableGroupModel[]) => {\r\n if (!res) {\r\n throw new Error('');\r\n }\r\n this.order.tableGroup = res;\r\n if (!this.share.selectedGroupIndex) {\r\n this.order.selectedGroup = Object.assign([], this.order.tableGroup[0].tables);\r\n this.share.selectedGroupIndex = 0;\r\n }\r\n else {\r\n this.order.selectedGroup = Object.assign([], this.order.tableGroup[this.share.selectedGroupIndex].tables);\r\n }\r\n this.order.forbidden = false;\r\n // this.order.startConnection();\r\n this.order.refreshTableTimeLeft();\r\n this.order.filter(this.order.selectedFilter);\r\n //this.tabGroup.selectedIndex = this.share.selectedGroupIndex;\r\n });\r\n }\r\n}\r\n","import { Observable } from \"rxjs\";\r\nimport { Injectable } from \"@angular/core\";\r\n\r\n@Injectable()\r\nexport class PushNotificationsService {\r\n public permission: Permission;\r\n\r\n constructor() {\r\n this.permission = this.isSupported() ? \"default\" : \"denied\";\r\n }\r\n\r\n public isSupported(): boolean {\r\n return \"Notification\" in window;\r\n }\r\n\r\n requestPermission(): void {\r\n let self = this;\r\n if (\"Notification\" in window) {\r\n Notification.requestPermission(function(status) {\r\n return (self.permission = status);\r\n });\r\n }\r\n }\r\n\r\n create(title: string, options?: PushNotification): any {\r\n let self = this;\r\n return new Observable(function(obs) {\r\n if (!(\"Notification\" in window)) {\r\n console.log(\"Notifications are not available in this environment\");\r\n obs.complete();\r\n }\r\n\r\n if (self.permission !== \"granted\") {\r\n console.log(\r\n \"The user hasn't granted you permission to send push notifications\"\r\n );\r\n obs.complete();\r\n }\r\n\r\n let _notify = new Notification(title, options);\r\n _notify.onshow = function(e) {\r\n setTimeout(function() {\r\n _notify.close();\r\n }, 7500);\r\n return obs.next({\r\n notification: _notify,\r\n event: e\r\n });\r\n };\r\n\r\n _notify.onclick = function(e) {\r\n _notify.close();\r\n return obs.next({\r\n notification: _notify,\r\n event: e\r\n });\r\n };\r\n\r\n _notify.onerror = function(e) {\r\n return obs.error({\r\n notification: _notify,\r\n event: e\r\n });\r\n };\r\n\r\n _notify.onclose = function() {\r\n return obs.complete();\r\n };\r\n });\r\n }\r\n\r\n generateNotification(source: Array): void {\r\n if (this.permission == \"granted\") {\r\n source.forEach((item, i) => {\r\n let options = {\r\n badge: item.badge,\r\n body: item.alertContent,\r\n icon: item.icon,\r\n image: item.image,\r\n tag: item.tag,\r\n sound: item.sound,\r\n dir: item.dir\r\n };\r\n setTimeout(() => {\r\n let ref = this.create(item.title, options).subscribe(res => {\r\n // console.log(\"res\", res);\r\n });\r\n // console.log(\"ref\", ref);\r\n }, i * 3000);\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport declare type Permission = \"denied\" | \"granted\" | \"default\";\r\n\r\nexport interface PushNotification {\r\n body?: string;\r\n icon?: string;\r\n tag?: string;\r\n data?: any;\r\n renotify?: boolean;\r\n silent?: boolean;\r\n sound?: string;\r\n noscreen?: boolean;\r\n sticky?: boolean;\r\n dir?: \"auto\" | \"ltr\" | \"rtl\";\r\n lang?: string;\r\n vibrate?: number[];\r\n}\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { SettingModel } from 'src/models/setting.model';\r\nimport { LocalStoreManager } from './local-store-manager.service';\r\nimport { environment } from 'src/environments/environment';\r\nimport { DOCUMENT } from '@angular/common';\r\n\r\nconst httpOptions = {\r\n headers: new HttpHeaders({ 'Content-Type': 'application/json; charset=utf-8' })\r\n};\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RestApiService {\r\n\r\n apiUrl: string;\r\n setting: SettingModel;\r\n protected storage: LocalStoreManager;\r\n\r\n constructor(private http: HttpClient, @Inject(DOCUMENT) private document: Document) {\r\n this.apiUrl = environment.baseUrl || this.getBaseUrl();\r\n }\r\n\r\n\r\n public getBaseUrl(): string {\r\n const base = this.document.location.origin ||\r\n this.document.location.protocol + '//' + this.document.location.hostname +\r\n (this.document.location.port ? ':' + this.document.location.port : '');\r\n\r\n return base.replace(/\\/$/, '');\r\n }\r\n\r\n getToken(data: any): Observable {\r\n const fullUrl = `${this.apiUrl}Token`;\r\n const a = JSON.stringify(data);\r\n return this.http.post(fullUrl, JSON.stringify(data), httpOptions);\r\n }\r\n\r\n get(): Observable {\r\n const fullUrl = `${this.apiUrl}`;\r\n return this.http.get(fullUrl, httpOptions);\r\n }\r\n\r\n getIpCliente(): Observable {\r\n return this.http.get('http://api.ipify.org/?format=jsonp&callback=JSONP_CALLBACK').map((res: Response) => res.text());\r\n }\r\n\r\n testConnection(testUrl: string, CntUrl: string): Observable {\r\n const fullUrl = `${testUrl}${CntUrl}`;\r\n return this.http.get(fullUrl, httpOptions);\r\n }\r\n\r\n getEntity(CntUrl: string): Observable {\r\n const fullUrl = `${this.apiUrl}/${CntUrl}`;\r\n return this.http.get(fullUrl, httpOptions);\r\n }\r\n\r\n getWaiterList(CntUrl: string): Observable {\r\n const fullUrl = `${this.apiUrl}${CntUrl}`;\r\n return this.http.get(fullUrl, httpOptions);\r\n }\r\n\r\n getFilterEntity(CntUrl: string, filter: any): Observable {\r\n const fullUrl = `${this.apiUrl}/${CntUrl}?Filter=${filter}`;\r\n return this.http.get(fullUrl, httpOptions);\r\n }\r\n\r\n getEntityById(CntUrl: string, id: number): Observable {\r\n const url = `${this.apiUrl}${CntUrl}/${id}`;\r\n return this.http.get(url, httpOptions);\r\n }\r\n\r\n postEntity(data, CntUrl: string): Observable {\r\n const fullUrl = `${this.apiUrl}/${CntUrl}`;\r\n const jason = JSON.stringify(data);\r\n return this.http.post(fullUrl, jason, httpOptions);\r\n }\r\n\r\n updateEntity(id: string, data, CntUrl: string): Observable {\r\n const url = `${this.apiUrl}${CntUrl}/${id}`;\r\n return this.http.put(url, data, httpOptions);\r\n }\r\n\r\n deleteEntity(id: string, CntUrl: string): Observable<{}> {\r\n const url = `${this.apiUrl}${CntUrl}/${id}`;\r\n return this.http.delete(url, httpOptions);\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { MatSnackBar } from \"@angular/material\";\r\nimport * as Rx from \"rxjs/Rx\";\r\nimport { NgxUiLoaderService } from 'ngx-ui-loader';\r\n\r\n\r\n@Injectable()\r\nexport class WebsocketService {\r\n constructor( protected _snackBar: MatSnackBar,\r\n private spinner: NgxUiLoaderService,) {}\r\n\r\n private subject: Rx.Subject;\r\n\r\n public connect(url): Rx.Subject {\r\n //const url = \"ws://localhost:1372/\"\r\n if (!this.subject) {\r\n this.subject = this.create(url);\r\n console.log(\"Successfully connected: \" + url);\r\n }\r\n return this.subject;\r\n }\r\n\r\n private create(url): Rx.Subject {\r\n // const url = \"ws://localhost:1372/\"\r\n\r\n\r\n let ws = new WebSocket(url);\r\n let observable = Rx.Observable.create((obs: Rx.Observer) => {\r\n ws.onmessage = obs.next.bind(obs);\r\n ws.onerror = obs.error.bind(obs);\r\n ws.onclose = obs.complete.bind(obs);\r\n return ws.close.bind(ws);\r\n });\r\n let observer = {\r\n next: (data: Object) => {\r\n if (ws.readyState === WebSocket.OPEN) {\r\n this.spinner.start();\r\n ws.send(JSON.stringify(data));\r\n }\r\n }\r\n };\r\n return Rx.Subject.create(observer, observable);\r\n }\r\n}\r\n"],"sourceRoot":"webpack:///","file":"main.js"}