iobroker.admin 6.2.16 → 6.2.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["components/UploadImage.jsx","dialogs/CameraIntroDialog.jsx","components/IntroCard.jsx","dialogs/EditIntroLinkDialog.jsx","tabs/Intro.jsx","../node_modules/@mui/icons-material/Create.js"],"names":["cropperStyles","styles","theme","UploadImage","props","style","acceptedFiles","maxSize","t","onChange","file","reader","ext","base64","data","byte","disabled","classes","icon","removeIconFunc","accept","error","crop","uploadFile","anchorEl","cropHandler","errors","getRootProps","getInputProps","e","imageElement","el","EditIntroLinkDialog","url","parts","adapter","instance","result","Dialog","DialogTitle","Typography","IconButton","Close","DialogContent","DialogActions","Button","boxShadow","boxShadowHover","blue","grey","red","IntroCard","CameraIntroDialog","Error","editClass","buttonTitle","Check","Delete","state","list","cameraList","promises","obj","cam","link","m","Grid","FormControl","InputLabel","Select","MenuItem","TextField","oldLinkName","FormControlLabel","Checkbox","Slider","interval","Add","formatInfo","Intro","events","alive","hostsId","event","hostsData","id","results","res","systemConfig","_systemConfig","introLinks","linkName","deactivated","pos","hasUnsavedChanges","enabled","linkText","isShowInstance","inst","hostData","i","item","buttons","Create","changed","hostId","isAlive","resolve","reject","states","hosts","webReverseProxyPath","instances","_obj","o","regExp","common","instanceId","objects","introInstances","_urls","lll","update","a","b","links","key","_deactivated","nodeUpdate","npmUpdate","Utils","value","acom","_hosts","newState","TabContainer","TabContent","_interopRequireDefault","exports","_createSvgIcon","_jsxRuntime","_default"],"mappings":"smBAgBA,MAAMA,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmThBC,GAASC,IAAU,CACrB,SAAU,CACN,MAAO,OACP,OAAQ,IACR,SAAU,UACd,EACA,cAAe,CAEf,EACA,MAAO,CACH,UAAW,UACX,OAAQ,OACR,QAAS,OACT,MAAO,OACP,OAAQ,MACZ,EAEA,UAAW,CACP,SAAU,WACV,MAAO,OACP,OAAQ,IACR,QAAS,GACT,UAAW,GACX,OAAQ,UACR,QAAS,MACb,EACA,kBAAmB,CACf,QAAS,EACT,WAAY,uBAChB,EAEA,gBAAiB,CACb,OAAQ,EACR,OAAQ,kBACR,aAAc,EACd,MAAO,oBACP,OAAQ,oBACR,SAAU,WACV,QAAS,MACb,EACA,iBAAkB,CACd,WAAY,GACZ,MAAO,GACP,OAAQ,EACZ,EACA,iBAAkB,CACd,SAAU,EACd,EACA,wBAAyB,CACrB,UAAW,SACX,SAAU,WACV,IAAK,EACL,OAAQ,EACR,KAAM,EACN,MAAO,EACP,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,QAEpB,EACA,gBAAiB,CACb,QAAS,GACT,OAAQ,SACZ,EACA,oBAAqB,CACjB,SAAU,WACV,OAAQ,IACR,MAAO,CACX,EACA,kBAAmB,CACf,SAAU,WACV,OAAQ,IACR,MAAO,EACP,IAAK,EACT,EACA,MAAO,CACH,OAAQ,eACZ,CACJ,GAEA,MAAMC,UAAoB,WAAU,CAChC,YAAYC,EAAO,CASf,GARA,MAAMA,CAAK,EACX,KAAK,MAAQ,CACT,WAAY,GACZ,SAAU,KACV,YAAa,EACjB,EACA,KAAK,Y,EAAa,aAAU,EAExB,CAAC,OAAO,SAAS,eAAe,8BAA8B,EAAG,CACjE,MAAMC,EAAQ,OAAO,SAAS,cAAc,OAAO,EACnDA,EAAM,aAAa,KAAM,8BAA8B,EACvDA,EAAM,UAAYL,EAClB,OAAO,SAAS,KAAK,YAAYK,CAAK,CAC1C,CACJ,CAEA,OAAOC,EAAe,CAClB,KAAM,CAAE,QAAAC,EAAS,EAAAC,EAAG,SAAAC,CAAS,EAAI,KAAK,MAEhCC,EAAOJ,EAAc,GACrBK,EAAS,IAAI,WAEnBA,EAAO,QAAU,IAAM,QAAQ,IAAI,0BAA0B,EAC7DA,EAAO,QAAU,IAAM,QAAQ,IAAI,yBAAyB,EAC5DA,EAAO,OAAS,IAAM,CAClB,IAAIC,EAAM,SAAWF,EAAK,KAAK,MAAM,GAAG,EAAE,IAAI,EAAE,YAAY,EAM5D,GALIE,IAAQ,YACRA,EAAM,aACCA,EAAI,SAAS,KAAK,IACzBA,EAAM,iBAENF,EAAK,KAAOH,EACZ,OAAO,OAAO,MAAMC,EAAE,oDAAqD,KAAK,MAAMD,EAAU,IAAI,CAAC,CAAC,EAE1G,MAAMM,EAAS,QAAQD,YAAc,KACjC,IAAI,WAAWD,EAAO,MAAM,EACvB,OAAO,CAACG,EAAMC,IAASD,EAAO,OAAO,aAAaC,CAAI,EAAG,EAAE,CAAC,IAErEN,EAASI,CAAM,CACnB,EACAF,EAAO,kBAAkBD,CAAI,CACjC,CAEA,QAAS,CACL,KAAM,CAAE,SAAAM,EAAU,QAAAT,EAAS,QAAAU,EAAS,KAAAC,EAAM,EAAAV,EAAG,eAAAW,EAAgB,OAAAC,EAAQ,MAAAC,EAAO,KAAAC,EAAM,SAAAb,CAAS,EAAI,KAAK,MAC9F,CAAE,WAAAc,EAAY,SAAAC,EAAU,YAAAC,CAAY,EAAI,KAAK,MACnD,OAAO,gBAAC,UAAQ,CACZ,SAAUT,GAAYS,EACtB,IAAI,WACJ,SAAU,GACV,OAAAL,EACA,QAAAb,EACA,YAAa,IAAM,KAAK,SAAS,CAAE,WAAY,UAAW,CAAC,EAC3D,YAAa,IAAM,KAAK,SAAS,CAAE,WAAY,EAAK,CAAC,EACrD,OAAQ,CAACD,EAAeoB,IAAW,CAE/B,GADA,KAAK,SAAS,CAAE,WAAY,EAAM,CAAC,EAC/B,CAACpB,EAAc,OACf,OAAO,MAAOoB,GAAUA,EAAO,IAAMA,EAAO,GAAG,QAAUA,EAAO,GAAG,OAAO,IAAMA,EAAO,GAAG,OAAO,GAAG,SAAYlB,EAAE,kBAAkB,CAAC,MAErI,QAAO,KAAK,OAAOF,CAAa,CAExC,GAEC,CAAC,CAAE,aAAAqB,EAAc,cAAAC,CAAc,IAAM,gBAAC,SACnC,UAAW,gBACPX,EAAQ,UACRM,IAAe,YAAcN,EAAQ,kBACrCA,EAAQ,SACRD,GAAYC,EAAQ,gBACpB,CAACC,GAAQD,EAAQ,aACrB,GACIU,EAAa,CAAC,EAClB,gBAAC,aAAUC,EAAc,CAAC,CAAE,EAC5B,gBAAC,OAAI,UAAW,gBAAWX,EAAQ,gBAAiBI,GAASJ,EAAQ,KAAK,GACpEC,EAOEC,GAAkB,CAACM,GAAe,gBAAC,OAAI,UAAWR,EAAQ,qBACtD,gBAAC,UAAO,CAAC,MAAOT,EAAE,UAAU,GACxB,gBAAC,IAAU,CAAC,KAAK,QAAQ,QAASqB,GAAK,CACnCV,GAAkBA,EAAe,EACjCU,EAAE,gBAAgB,CACtB,GAAG,gBAAC,WAAS,IAAC,CACd,CACJ,CACJ,EAfK,gBAAC,OAAI,UAAWZ,EAAQ,yBACzB,gBAAC,eAAU,CAAC,UAAWA,EAAQ,iBAAkB,EACjD,gBAAC,OAAI,UAAWA,EAAQ,kBACQT,EAA5Be,IAAe,WAAe,oBACxB,kEAD2C,CACyB,CAClF,EAYHL,GAAQI,GAAQ,gBAAC,OAAI,UAAWL,EAAQ,mBACrC,gBAAC,UAAO,CAAC,MAAOT,EAAE,SAAS,GACvB,gBAAC,IAAU,CAAC,KAAK,QAAQ,QAASqB,GAAK,CAC9BJ,EAGD,KAAK,SAAS,CAAE,SAAUI,EAAE,aAAc,CAAC,EAF3C,KAAK,SAAS,CAAE,YAAa,EAAK,CAAC,EAIvCA,EAAE,gBAAgB,CACtB,GAAG,gBAAC,WAAQ,CAAC,MAAOJ,EAAc,UAAY,UAAW,CACzD,CACJ,EACA,gBAAC,OAAI,CACD,SAAAD,EACA,YAAW,GACX,KAAM,QAAQA,CAAQ,EACtB,QAAS,IAAM,KAAK,SAAS,CAAE,SAAU,IAAK,CAAC,GAE/C,gBAAC,WAAQ,CAAC,QAAS,IAAM,KAAK,SAAS,CAAE,SAAU,KAAM,YAAa,EAAM,EAAG,IAAM,CAngBjH,SAogBgC,MAAMM,IAAe,WAAK,aAAL,cAAiB,UAAjB,eAA0B,QAC/CrB,EAASqB,GAAa,iBAAiB,EAAE,UAAU,CAAC,CACxD,CAAC,GAAItB,EAAE,SAAS,CAAE,EAClB,gBAAC,WAAQ,CAAC,QAAS,IAAM,KAAK,SAAS,CAAE,SAAU,KAAM,YAAa,EAAM,CAAC,GAAIA,EAAE,UAAU,CAAE,CACnG,CACJ,EACCU,GAAQ,CAACO,EAAc,gBAAC,OAAI,IAAKP,EAAM,UAAWD,EAAQ,MAAO,IAAI,OAAO,EAAK,KAEjFC,GAAQI,GAAQG,EAAc,gBAAC,UAAO,CACnC,IAAK,KAAK,WACV,UAAWR,EAAQ,MACnB,IAAKC,EACL,mBAAoB,EACpB,SAAU,EACV,OAAQ,GACR,iBAAkB,GAClB,gBAAiB,GACjB,WAAY,GACZ,iBAAkB,GACtB,EAAK,IACT,CACJ,CACJ,CACJ,CACJ,CAEAf,EAAY,aAAe,CACvB,SAAU,GACV,QAAS,GAAK,KACd,KAAM,KACN,eAAgB,KAChB,OAAQ,CAAE,UAAW,CAAC,CAAE,EACxB,MAAO,GACP,SAAUU,GAAU,QAAQ,IAAIA,CAAM,EACtC,EAAGkB,GAAMA,EACT,KAAM,EACV,EAEA5B,EAAY,UAAY,CACpB,QAAS,WACT,QAAS,WACT,SAAU,SACV,KAAM,SACN,MAAO,SACP,SAAU,SACV,OAAQ,WACR,EAAG,QACP,EAEA,K,EAAe,cAAWF,EAAM,EAAEE,CAAW,C,wYCriB7C,MAAMF,EAASC,IAAU,CACrB,SAAU,CACN,SAAU,CACd,EACA,YAAa,CACT,SAAU,WACV,MAAOA,EAAM,QAAQ,CAAC,EACtB,IAAKA,EAAM,QAAQ,CAAC,EACpB,MAAOA,EAAM,QAAQ,KAAK,IAC9B,EACA,MAAO,CAEP,EACA,WAAY,CACR,aAAc,EAClB,EACA,IAAK,CACD,MAAO,OACP,OAAQ,OACR,UAAW,SACf,CACJ,GAEA,MAAM8B,UAA4B,WAAU,CAExC,YAAY5B,EAAO,CACf,MAAMA,CAAK,EAEX,KAAK,kBAAoB,KACzB,KAAK,W,EAAY,aAAU,CAC/B,CAEA,mBAAoB,CACZ,KAAK,MAAM,QAAU,KAAK,MAAM,SAAW,SAC3C,KAAK,kBAAoB,YAAY,IAAM,KAAK,aAAa,EAAG,KAAK,IAAI,SAAS,KAAK,MAAM,SAAU,EAAE,EAAG,GAAG,CAAC,EAChH,KAAK,aAAa,EAE1B,CAEA,sBAAuB,CACnB,KAAK,mBAAqB,cAAc,KAAK,iBAAiB,EAC9D,KAAK,kBAAoB,IAC7B,CAEA,cAAe,CACX,GAAI,KAAK,UAAU,QACf,GAAI,KAAK,MAAM,SAAW,SAAU,CAChC,IAAI6B,EAAM,KAAK,MAAM,SACjB,KAAK,MAAM,QACPA,EAAI,SAAS,GAAG,EAChBA,GAAO,OAAS,KAAK,IAAI,EAEzBA,GAAO,OAAS,KAAK,IAAI,GAGjC,KAAK,UAAU,QAAQ,IAAMA,CACjC,KAAO,CACH,MAAMC,EAAQ,KAAK,MAAM,OAAO,MAAM,GAAG,EACnCC,EAAUD,EAAM,MAAM,EACtBE,EAAWF,EAAM,MAAM,EAC7B,KAAK,MAAM,OAAO,OAAOC,EAAU,IAAMC,EAAU,QAAS,CAAE,KAAMF,EAAM,IAAI,EAAG,MAAO,KAAK,UAAU,QAAQ,KAAM,CAAC,EACjH,KAAKG,GAAU,CACRA,GAAUA,EAAO,MAAQ,KAAK,UAAU,UACxC,KAAK,UAAU,QAAQ,IAAM,0BAA4BA,EAAO,KAExE,CAAC,CACT,CAER,CAEA,QAAS,CACL,KAAM,CAAE,QAAApB,CAAQ,EAAI,KAAK,MAEzB,OACI,kBAACqB,GAAA,EAAM,CACH,QAAS,IAAM,KAAK,MAAM,QAAQ,EAClC,KAAM,GACN,SAAS,KACT,UAAW,GACX,WAAY,GACZ,QAAS,CAAE,MAAOrB,EAAQ,KAAM,GAEhC,kBAACsB,EAAA,EAAW,KACR,kBAACC,EAAA,EAAU,CAAC,UAAU,KAAK,QAAQ,KAAK,QAAS,CAAE,KAAMvB,EAAQ,UAAW,GACvE,KAAK,MAAM,KACZ,kBAACwB,EAAA,EAAU,CAAC,KAAK,QAAQ,UAAWxB,EAAQ,YAAa,QAAS,IAAM,KAAK,MAAM,QAAQ,GACvF,kBAACyB,EAAA,QAAS,IAAC,CACf,CACJ,CACJ,EACA,kBAACC,EAAA,EAAa,CAAC,SAAQ,IACnB,kBAAC,OAAI,UAAW,KAAK,MAAM,QAAQ,IAAK,IAAI,GAAG,IAAI,SAAS,IAAK,KAAK,UAAW,CACrF,EACA,kBAACC,EAAA,EAAa,KACV,kBAACC,EAAA,EAAM,CACH,QAAQ,YACR,UAAS,GACT,QAAShB,GAAK,CACVA,EAAE,gBAAgB,EAClB,KAAK,MAAM,QAAQ,CACvB,EACA,MAAM,UACN,UAAW,kBAACa,EAAA,QAAS,IAAC,GAErB,KAAK,MAAM,EAAE,OAAO,CACzB,CACJ,CACJ,CAER,CACJ,CAEAV,EAAoB,UAAY,CAC5B,EAAG,oBACH,OAAQ,WACR,OAAQ,WACR,SAAU,WACV,QAAS,mBACb,EAEA,O,EAAe,cAAW/B,CAAM,EAAE+B,CAAmB,E,UCzGrD,MAAMc,EAAY,iGACZC,EAAiB,iEAEjB,EAAS7C,IAAU,CACrB,KAAM,CACF,QAAS,SACT,CAACA,EAAM,YAAY,GAAG,IAAI,GAAI,CAC1B,KAAM,SACV,CACJ,EACA,KAAM,CACF,QAAS,OACT,UAAW,QACX,SAAU,WACV,SAAU,SACV,UAAW,OACX,UAAW,CACP,UAAW,OACX,UAAW6C,CACf,CACJ,EACA,SAAU,CACN,QAAS,OACT,UAAW,QACX,SAAU,WACV,SAAU,UACV,UAAW,OACX,cAAe,SACf,UAAW,CAEP,UAAWA,CACf,CACJ,EACA,aAAc,CACV,SAAU,SACV,IAAK,EACL,WAAY7C,EAAM,QAAQ,WAAW,QACrC,QAAS,OACT,MAAO,OACP,eAAgB,gBAChB,aAAc,YACd,QAAS,iBACb,EACA,KAAM,CACF,QAAS,KACT,WAAY,OACZ,cAAe,MACnB,EACA,MAAO,CACH,gBAAiB,UACjB,SAAU,KACd,EACA,IAAK,CACD,MAAO,QACP,OAAQ,OACR,QAAS,aACT,SAAU,MACd,EACA,iBAAkB,CACd,QAAS,OACT,cAAe,SACf,KAAM,CACV,EACA,QAAS,CACL,OAAQ,QACR,SAAU,EACV,UAAW,QACf,EACA,OAAQ,CACJ,UAAW,OACX,QAAS,WACb,EACA,OAAQ,CACJ,SAAU,WACV,MAAO,OACP,OAAQ,MACZ,EACA,SAAU,CACN,UAAW,OACX,gBAAiB,UACjB,SAAU,WACV,MAAO,MAUX,EACA,MAAO,CACH,MAAO,MACX,EACA,KAAM,CACF,MAAO,MACX,EACA,QAAS,CACL,MAAO,UACP,gBAAiB8C,EAAK,QAAL,KACjB,SAAU,WACV,IAAK9C,EAAM,QAAQ,CAAC,EACpB,MAAOA,EAAM,QAAQ,CAAC,EACtB,UAAA4C,EACA,UAAW,CACP,gBAAiBE,EAAK,QAAL,IACrB,EACA,UAAW,CACP,gBAAiBA,EAAK,QAAL,IACrB,CACJ,EACA,SAAU,CACN,MAAO,UACP,gBAAiBC,EAAA,OACjB,SAAU,WACV,IAAK/C,EAAM,QAAQ,CAAC,EACpB,MAAOA,EAAM,QAAQ,CAAC,EACtB,UAAA4C,EACA,UAAW,CACP,gBAAiBG,EAAA,MACrB,EACA,UAAW,CACP,gBAAiBA,EAAA,MACrB,CACJ,EACA,WAAY,CACR,MAAO,UACP,gBAAiBA,EAAA,OACjB,SAAU,WACV,IAAK,SAAS/C,EAAM,QAAQ,CAAC,EAAG,EAAE,EAAI,GACtC,MAAOA,EAAM,QAAQ,CAAC,EACtB,UAAA4C,EACA,UAAW,CACP,gBAAiBG,EAAA,MACrB,EACA,UAAW,CACP,gBAAiBA,EAAA,MACrB,CACJ,EACA,aAAc,CACV,MAAO,UACP,gBAAiBC,EAAA,OACjB,SAAU,WACV,IAAK,SAAShD,EAAM,QAAQ,CAAC,EAAG,EAAE,EAAI,GAAK,GAC3C,MAAOA,EAAM,QAAQ,CAAC,EACtB,UAAA4C,EACA,UAAW,CACP,gBAAiBI,EAAA,MACrB,EACA,UAAW,CACP,gBAAiBA,EAAA,MACrB,CAEJ,EACA,UAAW,CACP,MAAO,OACP,OAAQ,OACR,SAAU,IACV,UAAW,IACX,UAAW,SACf,EACA,aAAc,CACV,OAAQ,MACZ,EACA,OAAQ,CACJ,QAAS,MACb,EACA,YAAa,CACT,OAAQ,MACZ,EACA,YAAa,CACT,UAAW,SACf,EACA,YAAa,CACT,MAAO,SACX,CACJ,GAEA,MAAMC,UAAkB,WAAU,CAC9B,YAAY/C,EAAO,CACf,MAAMA,CAAK,EAEX,KAAK,MAAQ,CACT,MAAO,GACP,SAAU,GACV,OAAQ,GACR,OAAQ,EACZ,EAEA,KAAK,W,EAAY,aAAU,EAC3B,KAAK,kBAAoB,KAEzB,KAAK,SAAW,KAAK,MAAM,SAC3B,KAAK,OAAS,KAAK,MAAM,OACzB,KAAK,EAAIA,EAAM,CACnB,CAEA,cAAe,CACX,GAAI,KAAK,UAAU,QACf,GAAI,KAAK,MAAM,SAAW,SAAU,CAChC,IAAI6B,EAAM,KAAK,MAAM,SACjB,KAAK,MAAM,QACPA,EAAI,SAAS,GAAG,EAChBA,GAAO,OAAS,KAAK,IAAI,EAEzBA,GAAO,OAAS,KAAK,IAAI,GAGjC,KAAK,UAAU,QAAQ,IAAMA,CACjC,KAAO,CACH,MAAMC,EAAQ,KAAK,MAAM,OAAO,MAAM,GAAG,EACnCC,EAAUD,EAAM,MAAM,EACtBE,EAAWF,EAAM,MAAM,EAC7B,KAAK,MAAM,OAAO,OAAOC,EAAU,IAAMC,EAAU,QAAS,CAAE,KAAMF,EAAM,IAAI,EAAG,MAAO,KAAK,UAAU,QAAQ,KAAM,CAAC,EACjH,KAAKG,GAAU,CACRA,GAAUA,EAAO,MAAQ,KAAK,UAAU,UACxC,KAAK,UAAU,QAAQ,IAAM,0BAA4BA,EAAO,KAExE,CAAC,EACA,MAAMR,GAAK,OAAO,MAAM,4BAA8BA,CAAC,CAAC,CACjE,CAER,CAEA,mBAAoB,CACZ,KAAK,MAAM,QAAU,KAAK,MAAM,SAAW,SAC3C,KAAK,kBAAoB,YAAY,IAAM,KAAK,aAAa,EAAG,KAAK,IAAI,SAAS,KAAK,MAAM,SAAU,EAAE,EAAG,GAAG,CAAC,EAChH,KAAK,aAAa,EAE1B,CAEA,sBAAuB,CACnB,KAAK,mBAAqB,cAAc,KAAK,iBAAiB,EAC9D,KAAK,kBAAoB,IAC7B,CAEA,oBAAqB,CACjB,OAAK,KAAK,MAAM,OAGL,gBAACuB,EAAiB,CACrB,OAAQ,KAAK,MAAM,OACnB,OAAQ,KAAK,MAAM,OACnB,KAAM,KAAK,MAAM,MACjB,EAAG,KAAK,MAAM,EACd,QAAS,IAAM,CACP,KAAK,MAAM,QAAU,KAAK,MAAM,SAAW,SAC3C,KAAK,mBAAqB,cAAc,KAAK,iBAAiB,EAC9D,KAAK,kBAAoB,YAAY,IAAM,KAAK,aAAa,EAAG,KAAK,IAAI,SAAS,KAAK,MAAM,SAAU,EAAE,EAAG,GAAG,CAAC,EAChH,KAAK,aAAa,GAGtB,KAAK,SAAS,CAAE,OAAQ,EAAM,CAAC,CACnC,GAEC,KAAK,MAAM,QAChB,EAlBO,IAoBf,CAEA,OAAO,yBAAyBhD,EAAO,CACnC,OAAIA,EAAM,KACC,CAAE,SAAU,EAAM,EAElB,IAEf,CAEA,mBAAoB,CAChB,KAAK,SAAS,CAAE,SAAU,CAAC,KAAK,MAAM,QAAS,CAAC,CACpD,CAEA,iBAAkB,CACT,KAAK,MAAM,QACZ,KAAK,SAAS,CACV,OAAQ,GACR,MAAO,EACX,CAAC,CAET,CAEA,kBAAmB,CACV,KAAK,MAAM,OACZ,KAAK,SAAS,CACV,OAAQ,GACR,MAAO,EACX,CAAC,CAET,CAEA,eAAgB,CACZ,KAAM,CAAE,QAAAa,CAAQ,EAAI,KAAK,MAEzB,GAAI,CAAC,KAAK,MAAM,QAAU,KAAK,MAAM,SAAW,OAC5C,OAAO,KAAK,MAAM,SACf,GAAI,KAAK,MAAM,SAAW,SAAU,CAEvC,IAAIgB,EAAM,KAAK,MAAM,SAErB,OAAI,KAAK,MAAM,QACPA,EAAI,SAAS,GAAG,EAChBA,GAAO,OAAS,KAAK,IAAI,EAEzBA,GAAO,OAAS,KAAK,IAAI,GAI1B,gBAAC,OAAI,CACR,KAAI,GACJ,UAAS,GACT,UAAWhB,EAAQ,aACnB,eAAe,SACf,WAAW,UAEX,gBAAC,OACG,IAAK,KAAK,UACV,IAAKgB,EACL,IAAI,SACJ,UAAW,KAAK,MAAM,QAAU,CAAC,KAAK,MAAM,MAAQhB,EAAQ,UAAYA,EAAQ,OAChF,OAAQ,IAAM,KAAK,gBAAgB,EACnC,QAAS,IAAM,KAAK,iBAAiB,EACzC,EACC,CAAC,KAAK,MAAM,QAAU,CAAC,KAAK,MAAM,OAC/B,gBAAC,WAAQ,CACL,OAAO,OACP,MAAM,OACN,UAAU,OACV,UAAWA,EAAQ,YACvB,EAEH,KAAK,MAAM,OACR,gBAACoC,GAAA,QAAS,CAAC,SAAS,QAAQ,CAEpC,CACJ,SAAW,KAAK,MAAM,OAAO,WAAW,UAAU,EAC9C,OAAO,gBAAC,OAAI,IAAK,KAAK,UAAW,IAAI,GAAG,IAAI,SAAS,UAAW,KAAK,MAAM,QAAQ,UAAW,CAEtG,CAEA,QAAS,CACL,KAAM,CAAE,QAAApC,CAAQ,EAAI,KAAK,MACnBqC,EAAY,KAAK,MAAM,KAAO,IAAMrC,EAAQ,KAAO,GAErD,KAAK,MAAM,QAAU,KAAK,MAAM,SAAW,OACvC,KAAK,WAAa,KAAK,MAAM,WAC7B,KAAK,SAAW,KAAK,MAAM,SAC3B,KAAK,mBAAqB,cAAc,KAAK,iBAAiB,EAC9D,KAAK,kBAAoB,YAAY,IAAM,KAAK,aAAa,EAAG,KAAK,IAAI,SAAS,KAAK,MAAM,SAAU,EAAE,EAAG,GAAG,CAAC,GAE7G,KAAK,oBACZ,cAAc,KAAK,iBAAiB,EACpC,KAAK,kBAAoB,MAG7B,IAAIsC,EAAc,KAAK,MAAM,OAAO,MAAQ,KAAK,MAAM,EAAE,MAAM,EAC/D,OAAI,OAAOA,GAAgB,WACvBA,EAAcA,EAAY,KAAK,MAAM,OAASA,EAAY,IAGvD,gBAAC,OAAI,CACR,KAAI,GACJ,GAAI,GACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,UAAWtC,EAAQ,MAEnB,gBAAC,OAAI,CACD,KAAM,CAAC,KAAK,MAAM,MAAQ,KAAK,MAAM,QAAU,KAAK,MAAM,OAAO,KAAO,KAAK,MAAM,OAAO,KAAO,KACjG,UAAU,OACV,OAAO,SACP,IAAI,uBAEJ,gBAAC,OAAI,CACD,UAAWA,EAAQ,KACnB,QAASY,GAAK,CACVA,EAAE,gBAAgB,EACd,CAAC,KAAK,MAAM,MAAQ,KAAK,MAAM,QAAU,KAAK,MAAM,SAAW,SAC/D,KAAK,mBAAqB,cAAc,KAAK,iBAAiB,EAC9D,KAAK,kBAAoB,KACzB,KAAK,SAAS,CAAE,OAAQ,EAAK,CAAC,EAEtC,GAGI,KAAK,MAAM,QAAU,CAAC,KAAK,MAAM,SACjC,gBAAC,SAAM,CACH,UAAWZ,EAAQ,OAASqC,EAC5B,QAAQ,YACR,KAAK,QACL,SAAU,KAAK,MAAM,SACrB,QAAS,IAAM,KAAK,kBAAkB,EACtC,MAAM,WAEL,KAAK,MAAM,EAAE,MAAM,CACxB,EAEJ,gBAAC,OAAI,UAAWrC,EAAQ,MAAQqC,EAAW,MAAO,CAAE,gBAAiB,KAAK,MAAM,KAAM,GAClF,gBAAC,YAAS,CACN,UAAWrC,EAAQ,IACnB,UAAU,MACV,MAAO,KAAK,MAAM,MACtB,CACJ,EACA,gBAAC,OAAI,UAAWA,EAAQ,iBAAmBqC,CAAA,EACvC,gBAAC,cAAW,CAAC,UAAWrC,EAAQ,SAC5B,gBAAC,OAAI,CACD,UAAS,GACT,UAAU,SACV,KAAK,SACL,UAAWA,EAAQ,aAEnB,gBAAC,aAAU,CAAC,aAAY,GAAC,QAAQ,KAAK,UAAU,MAC3C,KAAK,MAAM,KAChB,EACC,KAAK,cAAc,CACxB,CACJ,EAEI,KAAK,MAAM,QAAU,KAAK,MAAM,OAAO,MACvC,gBAAC,UAAO,IAAC,EAGT,KAAK,MAAM,QAAU,KAAK,MAAM,OAAO,MACvC,gBAAC,cAAW,CAAC,UAAWA,EAAQ,QAC5B,gBAAC,OAAI,UAAWA,EAAQ,aACnBsC,CACL,CACJ,CAER,EAEI,KAAK,MAAM,QACX,gBAAC,WAAQ,CACL,UAAWtC,EAAQ,SACnB,GAAI,KAAK,MAAM,SACf,QAAQ,OACR,cAAa,IAEb,gBAAC,OAAI,CAAC,UAAWA,EAAQ,UACrB,gBAAC,OAAI,UAAWA,EAAQ,cACpB,gBAAC,aAAU,CAAC,aAAY,GAAC,QAAQ,KAAK,UAAU,MAC3C,KAAK,MAAM,EAAE,MAAM,CACxB,EACA,gBAAC,WACG,gBAAC,aAAU,CAAC,KAAK,QAAQ,QAAS,IAAM,CACpC,IAAK,KAAK,MAAM,sBAAsB,EAAE,GAAI,CACxC,OAAQ,YACZ,CAAC,EACD,KAAK,MAAM,iBAAiB,CAChC,GACI,gBAAC,WAAQ,IAAC,CACd,EACA,gBAAC,aAAU,CAAC,KAAK,QAAQ,QAAS,IAAM,KAAK,kBAAkB,GAC3D,gBAACyB,EAAA,QAAS,IAAC,CACf,CACJ,CACJ,EACA,gBAAC,cAAW,KACP,KAAK,MAAM,sBAAsB,EAAE,EAExC,CACJ,CACJ,EAGA,KAAK,MAAM,MAAQ,KAAK,MAAM,kBAC9B,gBAAC,aAAU,CAAC,KAAK,QAAQ,UAAW,KAAK,MAAM,QAAUzB,EAAQ,QAAUA,EAAQ,SAAU,QAAS,IAAM,KAAK,MAAM,iBAAiB,GACpI,gBAACuC,GAAA,QAAS,IAAC,CACf,EAGA,KAAK,MAAM,MAAQ,KAAK,MAAM,QAC9B,gBAAC,aAAU,CAAC,KAAK,QAAQ,UAAWvC,EAAQ,WAAY,QAAS,IAAM,KAAK,MAAM,OAAO,GACrF,gBAAC,KAAQ,IAAC,CACd,EAGA,KAAK,MAAM,MAAQ,KAAK,MAAM,UAC9B,gBAAC,aAAU,CAAC,KAAK,QAAQ,UAAWA,EAAQ,aAAc,QAAS,IAAM,KAAK,MAAM,SAAS,GACzF,gBAACwC,GAAA,QAAU,IAAC,CAChB,EAEH,KAAK,mBAAmB,CAC7B,CACJ,CACJ,CACJ,CACJ,CAEAN,EAAU,UAAY,CAClB,OAAQ,WACR,MAAO,SACP,SAAU,WACV,MAAO,SACP,UAAW,WACX,YAAa,WACb,qBAAsB,SACtB,OAAQ,SACR,OAAQ,WACR,QAAS,SACT,EAAG,SACH,KAAM,UACV,EAEA,O,EAAe,cAAW,CAAM,EAAEA,CAAS,E,2ICzf3C,MAAM,GAASjD,IAAU,CACrB,YAAa,CACT,UAAWA,EAAM,QAAQ,CAAC,CAC9B,EACA,SAAU,CACN,SAAU,CACd,EACA,YAAa,CACT,SAAU,WACV,MAAOA,EAAM,QAAQ,CAAC,EACtB,IAAKA,EAAM,QAAQ,CAAC,EACpB,MAAOA,EAAM,QAAQ,KAAK,IAC9B,EACA,MAAO,CAEP,EACA,WAAY,CACR,aAAc,EAClB,EACA,SAAU,CACN,UAAWA,EAAM,QAAQ,CAAC,CAC9B,EACA,eAAgB,CACZ,UAAWA,EAAM,QAAQ,CAAC,CAC9B,EACA,YAAa,CACT,UAAWA,EAAM,QAAQ,CAAC,EAC1B,SAAU,MACd,EACA,UAAW,CACP,MAAO,MACX,EACA,SAAU,CACN,MAAO,OACP,OAAQ,IACR,SAAU,UACd,EACA,cAAe,CAEf,EACA,MAAO,CACH,OAAQ,OACR,MAAO,OACP,UAAW,SACf,EAEA,UAAW,CACP,SAAU,WACV,MAAO,OACP,OAAQ,IACR,QAAS,EACb,EACA,kBAAmB,CACf,QAAS,CACb,EAEA,gBAAiB,CACb,OAAQ,EACR,OAAQ,kBACR,aAAc,EACd,MAAO,oBACP,OAAQ,oBACR,SAAU,UACd,EACA,iBAAkB,CACd,WAAY,GACZ,MAAO,GACP,OAAQ,EACZ,EACA,iBAAkB,CACd,SAAU,EACd,EACA,wBAAyB,CACrB,UAAW,SACX,SAAU,WACV,IAAK,EACL,OAAQ,EACR,KAAM,EACN,MAAO,CACX,CACJ,GAEA,MAAM,WAA4B,WAAU,CAExC,YAAYE,EAAO,CACf,MAAMA,CAAK,EAEX,IAAIsD,EAAQ,OAAO,OAAO,CACtB,MAAO,GACP,KAAMtD,EAAM,EAAE,UAAU,EACxB,KAAM,UACN,SAAU,GACV,MAAO,GACP,KAAM,GACN,QAAS,GACT,MAAO,GACP,SAAU,IACV,OAAQ,OACR,WAAY,CAAC,CACjB,EAAGA,EAAM,IAAI,EAEb,KAAK,MAAQsD,CACjB,CAEA,mBAAoB,CAChB,KAAK,oBAAoB,CAC7B,CAEA,qBAAsB,CAClB,KAAK,MAAM,OAAO,oBAAoB,UAAW,EAAI,EAChD,KAAKC,GAAQ,CAEV,MAAMC,EAAa,CAAC,EACdC,EAAW,CAAC,EAClBF,EAAK,QAAQG,GAAO,CAChB,MAAM1B,EAAW0B,EAAI,IAAI,QAAQ,kBAAmB,EAAE,EAElDA,EAAI,QAAUA,EAAI,OAAO,SACzBD,EAAS,KAEL,KAAK,MAAM,OAAO,SAASC,EAAI,IAAM,QAAQ,EAExC,KAAKJ,GAASA,GAASA,EAAM,KAAO,KAAK,MAAM,OAAO,OAAOtB,EAAU,OAAQ,IAAI,CAAC,EACpF,KAAKC,GACFA,GAAUA,EAAO,MAAQA,EAAO,KAAK,QAAQ0B,GACzCH,EAAW,KAAK,CAAE,GAAIG,EAAI,GAAI,KAAM,GAAGA,EAAI,SAAS3B,KAAY2B,EAAI,OAAQ,CAAC,CAAC,CAAC,CAAC,CAGxG,CAAC,EAED,QAAQ,IAAIF,CAAQ,EACf,KAAK,IACF,KAAK,SAAS,CAAE,WAAAD,CAAW,CAAC,CAAC,CACzC,CAAC,CACT,CAEA,oBAAoBI,EAAM,CACtB,MAAMC,EAAID,EAAK,KAAK,EAAE,MAAM,6BAA6B,EACzD,GAAIC,EACA,OAAOA,EAAE,IAAMA,EAAE,IAAM,GAE/B,CAEA,QAAS,CACL,KAAM,CAAE,QAAAhD,CAAQ,EAAI,KAAK,MAEzB,OACI,kBAACqB,GAAA,EAAM,CACH,QAAS,IAAM,KAAK,MAAM,QAAQ,EAClC,KAAM,KAAK,MAAM,KACjB,SAAS,KACT,UAAW,GACX,QAAS,CAAE,MAAOrB,EAAQ,KAAM,GAEhC,kBAACsB,EAAA,EAAW,KACR,kBAACC,EAAA,EAAU,CAAC,UAAU,KAAK,QAAQ,KAAK,QAAS,CAAE,KAAMvB,EAAQ,UAAW,GACvE,KAAK,MAAM,MAAQ,KAAK,MAAM,EAAE,gBAAgB,EAAI,KAAK,MAAM,EAAE,WAAW,EAC7E,kBAACwB,EAAA,EAAU,CAAC,KAAK,QAAQ,UAAWxB,EAAQ,YAAa,QAAS,IAAM,KAAK,MAAM,QAAQ,GACvF,kBAACyB,EAAA,QAAS,IAAC,CACf,CACJ,CACJ,EACA,kBAACC,EAAA,EAAa,CAAC,SAAQ,IAEnB,kBAACuB,EAAA,GAAI,CACD,UAAW,KAAK,MAAM,QAAQ,SAC9B,UAAS,GACT,UAAU,OAEV,kBAACA,EAAA,GAAI,CAAC,KAAI,GACN,GAAI,GACJ,GAAI,EACJ,GAAI,EACJ,GAAI,GACJ,kBAACA,EAAA,GAAI,CACD,UAAS,GACT,UAAU,UAEV,kBAACC,GAAA,EAAW,CAAC,QAAQ,WAAW,UAAWlD,EAAQ,aAC/C,kBAACmD,GAAA,EAAU,CAAC,GAAG,uBAAuB,KAAK,MAAM,EAAE,WAAW,CAAE,EAChE,kBAACC,GAAA,EAAM,CACH,QAAQ,WACR,QAAQ,sBACR,MAAO,KAAK,MAAM,OAClB,SAAUxC,GAAK,KAAK,SAAS,CAAE,OAAQA,EAAE,OAAO,KAAM,CAAC,GAEvD,kBAACyC,GAAA,EAAQ,CAAC,MAAM,OAAO,IAAI,QAAO,kBAAC,UAAI,KAAK,MAAM,EAAE,aAAa,CAAE,CAAK,EACvE,KAAK,MAAM,WAAW,IAAIP,GAAO,kBAACO,GAAA,EAAQ,CAAC,IAAKP,EAAI,GAAI,MAAOA,EAAI,IAAKA,EAAI,IAAK,CAAW,EAC7F,kBAACO,GAAA,EAAQ,CAAC,MAAM,SAAS,IAAI,UAAU,KAAK,MAAM,EAAE,mBAAmB,CAAE,CAC7E,CACJ,EAEA,kBAACC,EAAA,EAAS,CACN,QAAQ,WACR,MAAO,KAAK,MAAM,EAAE,KAAK,EACzB,MAAO,KAAK,MAAM,KAClB,UAAW,KAAK,MAAM,QAAQ,SAC9B,SAAU1C,GAAK,CACX,MAAM2C,EAAc,KAAK,oBAAoB,KAAK,MAAM,IAAI,EACxDA,IAAgB,CAAC,KAAK,MAAM,UAAYA,IAAgB,KAAK,MAAM,UACnE,KAAK,SAAS,CAAE,KAAM3C,EAAE,OAAO,MAAO,SAAU,KAAK,oBAAoBA,EAAE,OAAO,KAAK,CAAE,CAAC,EAE1F,KAAK,SAAS,CAAE,KAAMA,EAAE,OAAO,KAAM,CAAC,CAE9C,EACJ,EAEA,kBAAC0C,EAAA,EAAS,CACN,QAAQ,WACR,UAAW,KAAK,MAAM,QAAQ,SAC9B,MAAO,KAAK,MAAM,EAAE,MAAM,EAC1B,MAAO,KAAK,MAAM,MAAQ,GAC1B,SAAU1C,GAAK,KAAK,SAAS,CAAE,KAAMA,EAAE,OAAO,KAAM,CAAC,EACzD,EAEC,KAAK,MAAM,KAAO,kBAAC0C,EAAA,EAAS,CAAC,QAAQ,WAAW,UAAW,KAAK,MAAM,QAAQ,SAAU,MAAO,KAAK,MAAM,EAAE,WAAW,EAAG,MAAO,KAAK,MAAM,UAAY,GAAI,SAAU1C,GAAK,KAAK,SAAS,CAAE,SAAUA,EAAE,OAAO,KAAM,CAAC,EAAG,EAAK,KAE7N,KAAK,MAAM,SAAW,UAAY,KAAK,MAAM,SAAW,OAAS,kBAAC0C,EAAA,EAAS,CAAC,QAAQ,WAAW,UAAW,KAAK,MAAM,QAAQ,SAAU,MAAO,KAAK,MAAM,SAAW,SAAW,KAAK,MAAM,EAAE,YAAY,EAAI,KAAK,MAAM,EAAE,aAAa,EAAG,MAAO,KAAK,MAAM,MAAQ,GAAI,SAAU1C,GAAK,KAAK,SAAS,CAAE,KAAMA,EAAE,OAAO,KAAM,CAAC,EAAG,EAAK,KAEpU,KAAK,MAAM,SAAW,SAAW,kBAAC4C,GAAA,EAAgB,CAAC,UAAW,KAAK,MAAM,QAAQ,SAC9E,QAAS,kBAACC,GAAA,EAAQ,CAAC,QAAS,KAAK,MAAM,MAAO,SAAU7C,GAAK,KAAK,SAAS,CAAE,MAAOA,EAAE,OAAO,OAAQ,CAAC,EAAG,EACzG,MAAO,KAAK,MAAM,EAAE,sBAAsB,EAC9C,EAAK,KAEJ,KAAK,MAAM,SAAW,OAAS,kBAACW,EAAA,EAAU,CAAC,UAAW,KAAK,MAAM,QAAQ,YAAa,aAAY,IAAC,wBAEhG,EAAgB,KACnB,KAAK,MAAM,SAAW,OAAS,kBAACmC,GAAA,GAAM,CACnC,UAAW,KAAK,MAAM,QAAQ,eAC9B,MAAO,KAAK,MAAM,SAClB,iBAAkB,IAAM,KAAK,MAAM,SAAW,KAC9C,SAAU,CAAC9C,EAAG+C,IAAa,KAAK,SAAS,CAAE,SAAAA,CAAS,CAAC,EACrD,KAAM,IACN,IAAK,IACL,IAAK,IACL,kBAAkB,KACtB,EAAK,KAEL,kBAAC,OAAI,MAAO,CAAE,MAAO,EAAG,EAAG,UAAW,KAAK,MAAM,QAAQ,UACrD,kBAACL,EAAA,EAAS,CAAC,QAAQ,WAAW,UAAW,GAAM,MAAO,KAAK,MAAM,EAAE,OAAO,EAAG,UAAW,KAAK,MAAM,UAAW,KAAK,QAAQ,MAAO,KAAK,MAAM,MAAO,SAAU1C,GAAK,KAAK,SAAS,CAAE,MAAOA,EAAE,OAAO,KAAM,CAAC,EAAG,CACjN,EACA,kBAAC1B,GAAA,EAAW,CACR,SAAU,GACV,KAAI,GACJ,QAAS,IAAM,KACf,KAAM,KAAK,MAAM,MACjB,eAAgB,IAAM,KAAK,SAAS,CAAE,MAAO,EAAG,CAAC,EACjD,SAAWU,GAAW,KAAK,SAAS,CAAE,MAAOA,CAAO,CAAC,EACrD,EAAG,KAAK,MAAM,EAClB,CACJ,CACJ,EACA,kBAAC,EAAS,CACN,SAAU,KAAK,MAAM,SACrB,OAAQ,KAAK,MAAM,OACnB,MAAO,KAAK,MAAM,MAClB,MAAO,KAAK,MAAM,MAClB,MAAO,KAAK,MAAM,KAClB,OAAQ,KAAK,MAAM,OACnB,OAAQ,CAAE,KAAM,KAAK,MAAM,KAAM,KAAM,KAAK,MAAM,QAAS,EAC3D,EAAG,KAAK,MAAM,EACd,MAAO,KAAK,MAAM,MAClB,QAAS,IAER,KAAK,MAAM,MAAQ,EACxB,CACJ,CACJ,EACA,kBAAC+B,EAAA,EAAa,KACV,kBAACC,EAAA,EAAM,CACH,QAAQ,YACR,UAAS,GACT,QAAS,IAAM,CACX,KAAK,MAAM,QAAQ,CACf,KAAM,KAAK,MAAM,KACjB,KAAM,KAAK,MAAM,KACjB,KAAM,KAAK,MAAM,KACjB,SAAU,KAAK,MAAM,SACrB,MAAO,KAAK,MAAM,MAClB,MAAO,KAAK,MAAM,MAClB,MAAO,KAAK,MAAM,MAClB,OAAQ,KAAK,MAAM,OACnB,SAAU,KAAK,MAAM,QACzB,CAAC,CACL,EACA,MAAM,UACN,UAAW,KAAK,MAAM,MAAQ,kBAACgC,EAAA,QAAO,MAAK,kBAACrB,GAAA,QAAS,OAEpD,KAAK,MAAM,MAAQ,KAAK,MAAM,EAAE,KAAK,EAAI,KAAK,MAAM,EAAE,MAAM,CACjE,EACA,kBAACX,EAAA,EAAM,CACH,QAAQ,YACR,QAAS,IAAM,KAAK,MAAM,QAAQ,EAClC,MAAM,OACN,UAAW,kBAACH,EAAA,QAAS,IAAC,GAErB,KAAK,MAAM,EAAE,OAAO,CACzB,CACJ,CACJ,CAER,CACJ,CAEA,GAAoB,UAAY,CAC5B,EAAG,oBACH,OAAQ,sBACR,KAAM,sBACN,KAAM,oBACN,KAAM,sBACN,QAAS,oBACT,MAAO,QACX,EAEA,Q,EAAe,cAAW,EAAM,EAAE,EAAmB,E,ueCpUrD,MAAM,GAASxC,IAAU,CACrB,KAAM,CACF,MAAO,OACP,OAAQ,MACZ,EACA,OAAQ,CACJ,SAAU,WACV,OAAQA,EAAM,QAAQ,CAAC,EACvB,MAAOA,EAAM,QAAQ,CAAC,CAC1B,EACA,WAAY,CACR,gBAAiBA,EAAM,QAAQ,QAAQ,KACvC,MAAOA,EAAM,QAAQ,EAAE,EACvB,UAAW,CACP,gBAAiBA,EAAM,QAAQ,QAAQ,IAC3C,CACJ,EACA,UAAW,CACP,gBAAiBA,EAAM,QAAQ,UAAU,KACzC,MAAOA,EAAM,QAAQ,EAAE,EACvB,UAAW,CACP,gBAAiBA,EAAM,QAAQ,UAAU,IAC7C,CACJ,EACA,YAAa,CACT,gBAAiBA,EAAM,QAAQ,MAAM,KACrC,UAAW,CACP,gBAAiBA,EAAM,QAAQ,MAAM,IACzC,CACJ,EACA,KAAM,CACF,WAAY,MAChB,EACA,UAAW,CACP,UAAW,MACf,EACA,YAAa,CACT,MAAO,SACX,EACA,aAAc,CACV,MAAO,UACP,YAAa,CACjB,EACA,SAAU,CACN,MAAO,UACP,YAAa,CACjB,EACA,WAAY,CACR,QAAS,EACb,EACA,eAAgB,CACZ,QAAS,GACT,SAAU,EACd,CACJ,GAEM4E,GAAa,CACf,OAAiB,kBACjB,gBAAiB,kBACjB,IAAiB,cACjB,MAAiB,gBACjB,YAAiB,gBACjB,YAAiB,eACrB,EAEA,MAAMC,WAAc,WAAU,CAC1B,YAAY3E,EAAO,CACf,MAAMA,CAAK,EA+Cf,2BAAmB4E,GAAU,CACzB,IAAIC,EAAQ,KAAK,MAAM,KAAK,UAAU,KAAK,MAAM,KAAK,CAAC,EACnDC,EAAU,CAAC,EAGf,GAAIF,EAAO,KAAKG,GAASA,EAAM,OAAS,QAAQ,EAE5C,OAAO,KAAK,eAAe,EAW/B,GARIH,EAAO,QAAQG,GAAS,CACf,CAAC,CAACF,EAAME,EAAM,KAAU,CAAC,CAACA,EAAM,QACjCF,EAAME,EAAM,IAAMA,EAAM,MACxBD,EAAQ,KAAKC,EAAM,EAAE,EAE7B,CAAC,EAGDD,EAAQ,OAAQ,CAChB,MAAME,EAAY,KAAK,MAAM,KAAK,UAAU,KAAK,MAAM,SAAS,CAAC,EAEjE,QAAQ,IAAIF,EAAQ,IAAIG,GAAM,KAAK,YAAYA,EAAIJ,EAAMI,EAAG,CAAC,CAAC,EACzD,KAAKC,GAAW,CACbA,EAAQ,QAAQC,GAAOH,EAAUG,EAAI,IAAMA,EAAI,IAAI,EACnD,KAAK,SAAS,CAAE,MAAAN,EAAO,UAAAG,CAAU,CAAC,CACtC,CAAC,CACT,CACJ,CAAC,EAED,sBAAc,CAACJ,EAAQlB,IAAQ,CACtB,MAAM,QAAQkB,CAAM,IACrBA,EAAS,CAAC,CAAE,GAAIA,EAAQ,IAAAlB,EAAK,KAAMA,EAAM,UAAY,QAAS,CAAC,GAEnE,IAAIoB,EAAU,CAAC,EAGf,GAAIF,EAAO,KAAKG,GAAS,CAACA,EAAM,GAAG,EAC/B,OAAO,KAAK,eAAe,EAI/B,GAFID,EAAUF,EAAO,IAAIG,GAASA,EAAM,EAAE,EAEtCD,EAAQ,OAAQ,CAChB,MAAME,EAAY,KAAK,MAAM,KAAK,UAAU,KAAK,MAAM,SAAS,CAAC,EAEjE,QAAQ,IAAIF,EAAQ,IAAIG,GAAM,KAAK,YAAYA,CAAE,CAAC,CAAC,EAC9C,KAAKC,GAAW,CACbA,EAAQ,QAAQC,GAAOH,EAAUG,EAAI,IAAMA,EAAI,IAAI,EACnD,KAAK,SAAS,CAAE,UAAAH,CAAU,CAAC,CAC/B,CAAC,CACT,CACJ,CAAC,EA6pBD,yBAAiB,IAAM,CACnB,KAAK,gBAAkB,aAAa,KAAK,cAAc,EACvD,KAAK,eAAiB,WAAW,IAAM,CACnC,KAAK,eAAiB,KACtB,KAAK,QAAQ,EAAI,CACrB,EAAG,GAAG,CACV,CAAC,EAlwBG,KAAK,MAAQ,CACT,UAAW,KACX,YAAa,CAAC,EACd,KAAM,GAEN,WAAY,CAAC,EACb,SAAU,GACV,cAAe,GACf,aAAc,GACd,kBAAmB,GACnB,aAAc,KACd,MAAO,CAAC,EACR,UAAW,CAAC,CAChB,EAEA,KAAK,iBAAmB,OAAO,SAAS,SACxC,KAAK,SAAW,CAAC,EAEjB,KAAK,mBAAqB,KAC1B,KAAK,oBAAsB,KAE3B,KAAK,EAAIhF,EAAM,CACnB,CAEA,mBAAoB,CAChB,KAAK,QAAQ,EACR,KAAK,IAAM,CACR,KAAK,MAAM,gBAAgB,gBAAgB,KAAK,cAAc,EAC9D,KAAK,MAAM,YAAY,gBAAgB,KAAK,WAAW,EACvD,KAAK,MAAM,YAAY,qBAAqB,KAAK,gBAAgB,EAEjE,KAAK,MAAM,OAAO,UAAU,kBAAoB,KAAK,MAAM,aAAa,EACnE,KAAK0D,GAAI,CA3H9B,MA4HwB,YAAK,SAAS,CAAE,eAAc,EAAAA,GAAA,YAAAA,EAAK,SAAL,cAAa,eAAgB,CAAC,CAAE,CAAC,EAAC,CAC5E,CAAC,CACT,CAEA,sBAAuB,CACnB,KAAK,gBAAkB,aAAa,KAAK,cAAc,EAEvD,KAAK,MAAM,gBAAgB,kBAAkB,KAAK,cAAc,EAChE,KAAK,MAAM,YAAY,kBAAkB,KAAK,WAAW,EACzD,KAAK,MAAM,YAAY,uBAAuB,KAAK,gBAAgB,CACvE,CAsDA,kBAAmB,CACf,IAAI0B,EACJ,KAAK,MAAM,OAAO,gBAAgB,EAAI,EACjC,KAAKC,IACFD,EAAeC,EACR,KAAK,aAAa,GAAM,KAAMD,CAAY,EACpD,EACA,KAAK1E,GAAQ,CACV,MAAM4E,EAAaF,GAAgBA,EAAa,QAAUA,EAAa,OAAO,WAAaA,EAAa,OAAO,WAAa,CAAC,EAE7H,KAAK,mBAAqB,KAAK,MAAM,KAAK,UAAUE,CAAU,CAAC,EAC/D,KAAK,oBAAuB,KAAK,MAAM,KAAK,UAAU5E,EAAK,WAAW,CAAC,EAEvE,KAAK,SAAS,CACV,UAAWA,EAAK,UAChB,YAAaA,EAAK,YAClB,KAAM,GACN,WAAA4E,EACA,kBAAmB,EACvB,CAAC,CACL,CAAC,CACT,CAEA,oBAAqB,CACZ,KAAK,MAAM,kBAKhB,KAAK,SAAS,CACV,YAAa,KAAK,oBAClB,WAAY,KAAK,mBACjB,kBAAmB,GACnB,KAAM,EACV,EAAG,IAAM,CACL,KAAK,oBAAsB,KAC3B,KAAK,mBAAqB,IAC9B,CAAC,CACL,CAEA,WAAWL,EAAIM,EAAU,CACrB,GAAI,CAAC,KAAK,MAAM,WAAa,CAAC,KAAK,MAAM,UAAU,OAC/C,OAGJ,MAAMC,EAAc,KAAK,MAAM,KAAK,UAAU,KAAK,MAAM,WAAW,CAAC,EAE/DC,EAAMD,EAAY,QAAQ,GAAGP,KAAMM,GAAU,EAE/CE,IAAQ,GACRD,EAAY,OAAOC,EAAK,CAAC,GAEzBD,EAAY,KAAK,GAAGP,KAAMM,GAAU,EACpCC,EAAY,KAAK,GAGrB,MAAME,EAAoB,KAAK,UAAUF,CAAW,IAAM,KAAK,UAAU,KAAK,mBAAmB,GAC7F,KAAK,UAAU,KAAK,MAAM,UAAU,IAAM,KAAK,UAAU,KAAK,kBAAkB,EAEpF,KAAK,SAAS,CAAE,YAAAA,EAAa,kBAAAE,CAAkB,CAAC,CACpD,CAEA,mBAAoB,CAChB,OAAO,KAAK,MAAM,UAAU,IAAI1D,GAAY,CACxC,MAAM2D,EAAU,CAAC,KAAK,MAAM,YAAY,SAAS,GAAG3D,EAAS,MAAMA,EAAS,UAAU,EACtF,GAAI2D,GAAW,KAAK,MAAM,KAAM,CAC5B,IAAIC,EAAW5D,EAAS,KAAOA,EAAS,KAAK,QAAQ,eAAgB,EAAE,EAAI,GAC3E,MAAMyD,EAAMG,EAAS,QAAQ,GAAG,EAC5BH,IAAQ,KACRG,EAAWA,EAAS,UAAU,EAAGH,CAAG,GAGxC,IAAII,EAAiB,SAAS7D,EAAS,GAAG,MAAM,GAAG,EAAE,IAAI,CAAC,EACtD6D,IAEAA,EAAiB,CAAC,CAAC,KAAK,MAAM,UAAU,KAAKC,GACzCA,EAAK,KAAO9D,EAAS,IAAMA,EAAS,OAAS8D,EAAK,MAAQ9D,EAAS,GAAG,MAAM,GAAG,EAAE,KAAO8D,EAAK,GAAG,MAAM,GAAG,EAAE,EAAE,GAGrH,MAAMC,EAAW,KAAK,MAAM,UAAY,KAAK,MAAM,UAAU/D,EAAS,IAAM,KAE5E,OAAO,gBAAC,EAAS,CACb,IAAK,GAAGA,EAAS,MAAMA,EAAS,OAChC,OAAQ,KAAK,MAAM,OACnB,MAAOA,EAAS,MAChB,MAAO,gCAAE,gBAAC,YAAMA,EAAS,IAAK,EAAQ6D,EAAiB,gBAAC,QAAK,UAAW,KAAK,MAAM,QAAQ,gBAAgB,IAAE7D,EAAS,GAAG,MAAM,GAAG,EAAE,IAAI,CAAE,EAAU,IAAK,EACzJ,OAAQ,CAAE,KAAMA,EAAS,KAAM,KAAM4D,CAAS,EAC9C,EAAG,KAAK,MAAM,EACd,KAAM,KAAK,MAAM,KACjB,MAAO5D,EAAS,MAChB,OAAQA,EAAS,KACjB,KAAM,KAAK,MAAM,KACjB,aAAc,KAAK,MAAM,aACzB,QAAS+D,GAAYA,EAAS,QAAU,GACxC,QAAAJ,EACA,SAAU,CAACI,GAAY,OAAOA,GAAa,SAC3C,sBAAuB,IAAM,KAAK,sBAAsB/D,EAAS,EAAE,EACnE,iBAAkB,IAAM,KAAK,WAAWA,EAAS,GAAIA,EAAS,QAAQ,EACtE,iBAAkB,IAAM,KAAK,SAAS,CAAE,aAAc,EAAK,CAAC,GAE1DA,EAAS,aAAe,KAAK,mBAAmBA,EAAS,EAAE,CACjE,CACJ,KACI,QAAO,IAEf,CAAC,CACL,CAEA,eAAegE,EAAG,CACd,MAAMV,EAAa,KAAK,MAAM,KAAK,UAAU,KAAK,MAAM,UAAU,CAAC,EAEnEA,EAAWU,GAAG,QAAU,CAACV,EAAWU,GAAG,QAEvC,MAAMN,EAAoB,KAAK,UAAU,KAAK,MAAM,WAAW,IAAM,KAAK,UAAU,KAAK,mBAAmB,GACxG,KAAK,UAAUJ,CAAU,IAAM,KAAK,UAAU,KAAK,kBAAkB,EAEzE,KAAK,SAAS,CAAE,WAAAA,EAAY,kBAAAI,CAAkB,CAAC,CACnD,CAEA,cAAe,CACX,OAAO,KAAK,MAAM,WAAW,IAAI,CAACO,EAAMD,IAChC,CAACC,EAAK,SAAW,CAAC,KAAK,MAAM,KACtB,KAEA,gBAAC,EAAS,CACb,IAAK,OAASD,EACd,MAAOC,EAAK,MACZ,MAAOA,EAAK,KACZ,OAAQ,CAAE,KAAMA,EAAK,KAAM,KAAMA,EAAK,QAAS,EAC/C,EAAG,KAAK,MAAM,EACd,OAAQ,KAAK,MAAM,OACnB,MAAOA,EAAK,MACZ,KAAM,KAAK,MAAM,KACjB,SAAUA,EAAK,SACf,OAAQA,EAAK,OACb,MAAOA,EAAK,MAEZ,OAAQ,IAAM,KAAK,SAAS,CACxB,SAAU,GACV,cAAeD,EACf,KAAM,KAAK,MAAM,KAAK,UAAU,KAAK,MAAM,WAAWA,EAAE,CAAC,CAC7D,CAAC,EAED,SAAU,IAAM,CACZ,MAAMV,EAAa,KAAK,MAAM,KAAK,UAAU,KAAK,MAAM,UAAU,CAAC,EACnEA,EAAW,OAAOU,EAAG,CAAC,EACtB,MAAMN,EAAoB,KAAK,UAAU,KAAK,MAAM,WAAW,IAAM,KAAK,UAAU,KAAK,mBAAmB,GACxG,KAAK,UAAUJ,CAAU,IAAM,KAAK,UAAU,KAAK,kBAAkB,EACzE,KAAK,SAAS,CAAE,WAAAA,EAAY,kBAAAI,CAAkB,CAAC,CACnD,EAEA,QAASO,EAAK,QACd,iBAAkB,IAAM,KAAK,eAAeD,CAAC,GAE3CC,EAAK,MAAQ,EACnB,CAEP,CACL,CAEA,cAAe,CACX,OAAI,KAAK,MAAM,SACJ,gBAAC,GAAmB,CACvB,KAAM,KAAK,MAAM,SACjB,KAAM,KAAK,MAAM,KACjB,OAAQ,KAAK,MAAM,OACnB,MAAO,KAAK,MAAM,gBAAkB,GACpC,EAAG,KAAK,MAAM,EACd,KAAM,KAAK,MAAM,KACjB,QAASrC,GAAQ,CACb,GAAIA,EAAM,CACN,MAAM0B,EAAa,KAAK,MAAM,KAAK,UAAU,KAAK,MAAM,UAAU,CAAC,EAC/D,KAAK,MAAM,gBAAkB,IAC7B1B,EAAK,QAAU,GACf0B,EAAW,KAAK1B,CAAI,IAEpBA,EAAK,QAAU0B,EAAW,KAAK,MAAM,eAAe,QACpDA,EAAW,KAAK,MAAM,eAAiB1B,GAE3C,MAAM8B,EAAoB,KAAK,UAAU,KAAK,MAAM,WAAW,IAAM,KAAK,UAAU,KAAK,mBAAmB,GACxG,KAAK,UAAUJ,CAAU,IAAM,KAAK,UAAU,KAAK,kBAAkB,EAEzE,KAAK,SAAS,CAAE,WAAAA,EAAY,SAAU,GAAO,kBAAAI,EAAmB,KAAM,IAAK,CAAC,CAChF,MACI,KAAK,SAAS,CAAE,SAAU,EAAM,CAAC,CAEzC,EAAG,EAEA,IAEf,CAEA,WAAW7E,EAAS,CAChB,MAAMqF,EAAU,CAAC,EAEjB,OAAI,KAAK,MAAM,MACXA,EAAQ,KAAK,gBAAC,MAAG,CACb,IAAI,MACJ,MAAM,UACN,UAAW,GAAGrF,EAAQ,UAAUA,EAAQ,YACxC,QAAS,IACL,KAAK,SAAS,CACV,SAAU,GACV,cAAe,GACf,KAAM,CAAC,CACX,CAAC,GAEL,gBAAC4D,EAAA,QAAO,IAAC,CACb,CAAM,EAENyB,EAAQ,KAAK,gBAAC,MAAG,CACb,IAAI,OACJ,MAAM,UACN,SAAU,CAAC,KAAK,MAAM,kBACtB,UAAW,GAAGrF,EAAQ,UAAUA,EAAQ,aACxC,QAAS,IAAM,KAAK,UAAU,GAE9B,gBAACuC,GAAA,QAAS,IAAC,CACf,CAAM,EAEN8C,EAAQ,KAAK,gBAAC,MAAG,CACb,IAAI,QACJ,MAAM,UACN,UAAW,GAAGrF,EAAQ,UAAUA,EAAQ,cACxC,QAAS,IAAM,KAAK,mBAAmB,GAEvC,gBAACyB,EAAA,QAAS,IAAC,CACf,CAAM,GAEN4D,EAAQ,KAAK,gBAAC,MAAG,CACb,MAAM,UACN,IAAI,OACJ,UAAWrF,EAAQ,OACnB,QAAS,IAAM,KAAK,iBAAiB,GAErC,gBAACsF,GAAA,EAAU,IAAC,CAChB,CAAM,EAGHD,CACX,CAEA,WAAY,CACR,OAAO,KAAK,MAAM,OAAO,gBAAgB,EAAI,EACxC,KAAKd,GAAgB,CAClB,IAAIgB,EAAU,GAEV,KAAK,UAAUhB,EAAa,OAAO,KAAK,IAAM,KAAK,UAAU,KAAK,MAAM,WAAW,IACnFA,EAAa,OAAO,MAAQ,KAAK,MAAM,YACvCgB,EAAU,IAGV,CAACA,GAAW,KAAK,UAAUhB,EAAa,OAAO,UAAU,IAAM,KAAK,UAAU,KAAK,MAAM,UAAU,IACnGgB,EAAU,GACVhB,EAAa,OAAO,WAAa,KAAK,MAAM,YAG5CgB,EACA,KAAK,MAAM,OAAO,gBAAgBhB,CAAY,EACzC,KAAK,IAAM,KAAK,MAAM,UAAU,UAAW,SAAS,CAAC,EACrD,MAAMnE,GAAS,CACZ,QAAQ,IAAIA,CAAK,EACjB,KAAK,MAAM,UAAUA,EAAO,OAAO,CACvC,CAAC,EACA,KAAK,IAAM,KAAK,SAAS,CAAE,KAAM,EAAM,CAAC,CAAC,EAE9C,KAAK,SAAS,CAAE,KAAM,EAAM,CAAC,CAErC,CAAC,CACT,CAEA,YAAYoF,EAAQC,EAAS,CACzB,OAAO,IAAI,QAAQ,CAACC,EAASC,IACrBF,IAAY,OACLC,EAAQ,CAAE,IAAKD,CAAQ,CAAC,EAExB,KAAK,MAAM,OAAO,SAASD,EAAS,QAAQ,EAC9C,KAAK/C,GAASiD,EAAQjD,CAAK,CAAC,EAC5B,MAAM7B,GAAK+E,EAAO/E,CAAC,CAAC,CAEhC,EACI,KAAKoD,GACEA,GAASA,EAAM,IACR,KAAK,MAAM,OAAO,YAAYwB,EAAQ,GAAO,GAAK,EAElD,CAAE,MAAO,EAAM,CAE7B,EACA,MAAMpF,IACH,QAAQ,MAAMA,CAAK,EACZA,EACV,EACA,KAAKP,IACEA,GAAQ,OAAOA,GAAS,UAAYA,EAAK,QAAU,KACnDA,EAAK,MAAQ,IAGV,KAAK,MAAM,OAAO,iBAAiB,GAAG2F,cAAmB,EAC3D,KAAKI,IACF,OAAO,KAAKA,CAAM,EAAE,QAAQxB,GACxBvE,EAAK,IAAMuE,EAAG,MAAM,GAAG,EAAE,IAAI,GAAKwB,EAAOxB,GAAI,GAAG,EAC7CvE,EACV,EACR,EACA,KAAKA,IACD,CAAE,GAAI2F,EAAQ,KAAA3F,CAAK,EAAE,CAClC,CAEA,aAAagG,EAAO,CAChB,MAAMjD,EAAWiD,EAAM,IAAIhD,GAAO,KAAK,YAAYA,EAAI,GAAG,CAAC,EAE3D,OAAO,QAAQ,IAAID,CAAQ,EACtB,KAAKyB,GAAW,CACb,MAAMF,EAAY,CAAC,EACbH,EAAQ,CAAC,EACf,OAAAK,EAAQ,QAAQC,GAAO,CACnBH,EAAUG,EAAI,IAAMA,EAAI,KACxBN,EAAMM,EAAI,IAAMA,EAAI,KAAK,KAC7B,CAAC,EACM,CAAE,UAAAH,EAAW,MAAAH,CAAM,CAC9B,CAAC,CACT,CAEA,kBAAkB8B,EAAqBC,EAAW5E,EAAU,CACxD2E,GAAuBA,EAAoB,MAAM,QAAQV,GAAQ,CAhgBzE,MAigBY,GAAIA,EAAK,WAAajE,EAAS,GAC3BA,EAAS,KAAOiE,EAAK,aACdA,EAAK,SAAS,WAAW,MAAM,EAAG,CAEzC,MAAMY,EAAOD,EAAU,KAAKE,GAAKA,EAAE,MAAQ,kBAAkBb,EAAK,UAAU,EAC5E,KAAI,EAAAY,GAAA,YAAAA,EAAM,SAAN,cAAc,QAAS7E,EAAS,MAAQA,EAAS,KAAK,SAAS,IAAM6E,EAAK,OAAO,IAAI,EAAG,CAExF,MAAME,EAAS,IAAI,OAAO,OAAOF,EAAK,OAAO,OAAO,EAChD7E,EAAS,KACTA,EAAS,KAAOA,EAAS,KAAK,QAAQ+E,EAAQd,EAAK,IAAI,EAChDjE,EAAS,MAChBA,EAAS,IAAMA,EAAS,IAAI,QAAQ+E,EAAQd,EAAK,IAAI,GAEzD,QAAQ,IAAIjE,EAAS,MAAQA,EAAS,GAAG,CAC7C,CACJ,CACJ,CAAC,CACL,CAEA,SAAS4B,EAAMoD,EAAQC,EAAYjF,EAAUkF,EAASR,EAAOE,EAAWO,EAAgB,CACpF,MAAMC,EAAQ,gBAAkBxD,EAAMoD,EAAO,KAAMC,EAAY,CAC3D,QAAAC,EACA,SAAe,KAAK,MAAM,SAC1B,SAAe,KAAK,MAAM,SAC1B,KAAe,KAAK,MAAM,KAC1B,cAAe,KAAK,MAAM,cAC1B,MAAAR,CACJ,CAAC,GAAK,CAAC,EAEP,IAAIC,EAIJ,GAHI,KAAK,MAAM,cAAgB,KAAK,MAAM,aAAa,SACnDA,EAAsB,KAAK,MAAM,aAAa,KAAKV,GAAQA,EAAK,aAAe,KAAK,gBAAgB,GAEpGmB,EAAM,SAAW,EAAG,CACpBpF,EAAS,KAAOoF,EAAM,GAAG,IACzBpF,EAAS,KAAOoF,EAAM,GAAG,KAEzB,KAAK,kBAAkBT,EAAqBC,EAAW5E,CAAQ,EAG/D,MAAMqF,EAAMF,EAAe,KAAKlB,GAAQA,EAAK,OAASjE,EAAS,IAAI,EAC9DqF,EAGD,QAAQ,IAAI,kBAAkBrF,EAAS,YAAYqF,EAAI,KAAK,EAF5DF,EAAe,KAAKnF,CAAQ,CAIpC,MAAWoF,EAAM,OAAS,GACtBA,EAAM,QAAQvF,GAAO,CACjB,MAAMwF,EAAMF,EAAe,KAAKlB,GAAQA,EAAK,OAASpE,EAAI,GAAG,EAC7D,KAAK,kBAAkB8E,EAAqBC,EAAW/E,CAAG,EAErDwF,EAGD,QAAQ,IAAI,kBAAkBrF,EAAS,YAAYqF,EAAI,KAAK,EAF5DF,EAAe,KAAK,SAAInF,CAAQ,EAAZ,CAAc,KAAMH,EAAI,IAAK,KAAMA,EAAI,IAAI,CAAC,EAIxE,CAAC,CAET,CAEA,aAAayF,EAAQZ,EAAOtB,EAAc,CACtC,OAAAsB,EAAQA,GAAS,KAAK,MAAM,MAErB,KAAK,MAAM,OAAO,oBAAoB,GAAIY,CAAM,EAClD,KAAKV,GAAa,CACf,IAAIpB,EAAcJ,EAAa,OAAO,OAAS,CAAC,EAC3C,MAAM,QAAQI,CAAW,IAC1BA,EAAc,OAAO,KAAKA,CAAW,EACrCA,EAAY,KAAK,GAErB,MAAM2B,EAAiB,CAAC,EAClBD,EAAU,CAAC,EACjBN,EAAU,QAAQlD,GAAOwD,EAAQxD,EAAI,KAAOA,CAAG,EAE/CkD,EAAU,KAAK,CAACW,EAAGC,KACfD,EAAIA,GAAKA,EAAE,OACXC,EAAIA,GAAKA,EAAE,OACXD,EAAIA,GAAK,CAAC,EACVC,EAAIA,GAAK,CAAC,EAEND,EAAE,QAAU,QAAaC,EAAE,QAAU,OACjCD,EAAE,KAAK,YAAY,EAAIC,EAAE,KAAK,YAAY,EAAU,EACpDD,EAAE,KAAK,YAAY,EAAIC,EAAE,KAAK,YAAY,EAAU,GACjD,EACAD,EAAE,QAAU,OACZ,GACAC,EAAE,QAAU,QAGfD,EAAE,MAAQC,EAAE,MAFT,EAGHD,EAAE,MAAQC,EAAE,MAAc,GAC1BD,EAAE,KAAK,YAAY,EAAIC,EAAE,KAAK,YAAY,EAAU,EACpDD,EAAE,KAAK,YAAY,EAAIC,EAAE,KAAK,YAAY,EAAU,GACjD,EAEd,EAEDZ,EAAU,QAAQlD,GAAO,CACrB,GAAI,CAACA,EACD,OAEJ,MAAMsD,EAAatD,EAAI,QAAU,KAE3BuD,EADavD,EAAI,IAAI,MAAM,GAAG,EACX,IAAI,EAE7B,GAAI,EAAAsD,EAAO,MAAQA,EAAO,OAAS,SAAWA,EAAO,aAAe,KAAK,MAAM,UAAY,KAEpF,KAAIA,EAAO,MAAQA,EAAO,OAAS,MACtC,OACG,GAAIA,EAAO,MAAQA,EAAO,OAAS,iBAAmBA,EAAO,KAAK,MAAM,OAAO,EAClF,OACG,GAAIA,EAAO,MAAQA,EAAO,KAAK,MAAM,SAAS,EACjD,OACG,GAAIA,IAAWA,EAAO,SAAWA,EAAO,WAAaA,EAAO,YAAcA,EAAO,WAAY,CAChG,IAAIS,EAAQT,EAAO,YAAcA,EAAO,WAAa,GACjD,OAAOS,GAAU,WACjBA,EAAQ,CAAE,SAAUA,CAAM,GAG9B,OAAO,KAAKA,CAAK,EAAE,QAAQlC,GAAY,CACnC,IAAI3B,EAAO6D,EAAMlC,GACjB,MAAMvD,EAAW,CAAC,EACd,OAAO4B,GAAS,WAChBA,EAAO,CAAE,KAAAA,CAAK,GAGlB5B,EAAS,GAAc0B,EAAI,IAAI,QAAQ,kBAAmB,EAAE,GAAK6B,IAAa,WAAa,GAAK,IAAMA,GACtGvD,EAAS,MAAegF,EAAO,UAAYA,EAAO,UAAU,KAAK,MAAM,OAASA,EAAO,UAAU,GAAKA,EAAO,QAAUzB,IAAa,WAAa,GAAK,IAAMA,GAC5JvD,EAAS,MAAc4B,EAAK,OAAS,GACrC5B,EAAS,YAAcgF,EAAO,MAAQ,OAAOA,EAAO,MAAS,SAAYA,EAAO,KAAK,KAAK,MAAM,OAASA,EAAO,KAAK,GAAMA,EAAO,MAAQ,GAC1IhF,EAAS,MAAcgF,EAAO,KAAO,WAAWA,EAAO,QAAQA,EAAO,OAAS,mBAS/E,KAAK,SAASpD,EAAK,KAAMoD,EAAQC,EAAYjF,EAAUkF,EAASR,EAAOE,EAAWO,CAAc,CACpG,CAAC,CACL,EACA,GAAIH,IAAWA,EAAO,SAAWA,EAAO,UAAYA,EAAO,OAAS,UAAYA,EAAO,eAAiBA,EAAO,kBAAmB,CAC9H,IAAIS,EAAQ,CAAC,EACbT,EAAO,eAAiBS,EAAM,KAAKT,EAAO,aAAa,EACvDA,EAAO,kBAAoBS,EAAM,KAAKT,EAAO,gBAAgB,EAE7DS,EAAM,QAAQ7D,GAAQ,CAClB,MAAM5B,EAAW,CAAC,EAClBA,EAAS,GAAc0B,EAAI,IAAI,QAAQ,kBAAmB,EAAE,EAAI,IAAME,EAAK,KAC3E5B,EAAS,KAAc4B,EAAK,MAAQ,OAAOA,EAAK,MAAS,SAAYA,EAAK,KAAK,KAAK,MAAM,OAASA,EAAK,KAAK,GAAMA,EAAK,MAAQ,GAChI5B,EAAS,MAAc4B,EAAK,OAAS,GACrC5B,EAAS,YAAcgF,EAAO,MAAQ,OAAOA,EAAO,MAAS,SAAYA,EAAO,KAAK,KAAK,MAAM,OAASA,EAAO,KAAK,GAAMA,EAAO,MAAQ,GAC1IhF,EAAS,MAAcgF,EAAO,KAAO,WAAWA,EAAO,QAAQA,EAAO,OAAS,mBAC/EhF,EAAS,MAAc4B,EAAK,MAE5B,KAAK,SAAS,0CAA0CA,EAAK,OAAQoD,EAAQC,EAAYjF,EAAUkF,EAASR,EAAOE,EAAWO,CAAc,CAChJ,CAAC,CACL,EACJ,CAAC,EAEDA,EAAe,QAAQnF,GAAY,CAC3BA,EAAS,OACTA,EAAS,SAAWA,EAAS,KAAK,QAAQ,WAAY,EAAE,EAAE,QAAQ,UAAW,EAAE,EAAE,QAAQ,UAAW,EAAE,EAE9G,CAAC,EAEDmF,EAAe,KAAK,CAACI,EAAGC,IAAM,CAC1B,GAAID,EAAE,QAAU,QAAaC,EAAE,QAAU,OAAW,CAGhD,GAFAD,EAAE,MAAQA,EAAE,QAAU,OAAY,IAAOA,EAAE,MAC3CC,EAAE,MAAQA,EAAE,QAAU,OAAY,IAAOA,EAAE,MACvCD,EAAE,MAAQC,EAAE,MACZ,MAAO,GACJ,GAAID,EAAE,MAAQC,EAAE,MACnB,MAAO,EAEf,CAEA,OAAID,EAAE,GAAKC,EAAE,GACF,EAEPD,EAAE,GAAKC,EAAE,GACF,GAEJ,CACX,CAAC,EAED,OAAO,KAAKd,CAAK,EAAE,QAAQgB,GAAO,CAC9B,MAAMhE,EAAMgD,EAAMgB,GACZV,EAAStD,GAAOA,EAAI,OAE1B,GAAIsD,EAAQ,CACR,MAAMhF,EAAc,CAAC,EACrBA,EAAS,GAAW0B,EAAI,IACxB1B,EAAS,KAAWgF,EAAO,MAAQ,OAAOA,EAAO,MAAS,SAAYA,EAAO,KAAK,KAAK,MAAM,OAASA,EAAO,KAAK,GAAOA,EAAO,MAAQ,GACxIhF,EAAS,MAAW,GACpBA,EAAS,MAAWgF,EAAO,MAAQ,mBACnChF,EAAS,KAAW,KAAK,EAAE,MAAM,EACjCA,EAAS,SAAW,GAEpBmF,EAAe,KAAKnF,CAAQ,CAChC,CACJ,CAAC,EAED,MAAM2F,EAAe,CAAC,EACtB,OAAAnC,EAAY,QAAQP,GAAM,CAClBkC,EAAe,KAAKnF,GAAYiD,IAAO,GAAGjD,EAAS,MAAMA,EAAS,UAAU,GAC5E2F,EAAa,KAAK1C,CAAE,CAE5B,CAAC,EACDO,EAAcmC,EAEP,CAAE,UAAWR,EAAgB,YAAA3B,CAAY,CACpD,CAAC,EACA,MAAMvE,IACH,QAAQ,IAAIA,CAAK,EACV,CAAE,UAAW,CAAC,EAAI,YAAa,CAAC,CAAE,EAC5C,CACT,CAEA,mBAAmBgE,EAAI,CACnB,KAAM,CAAE,QAAApE,CAAQ,EAAI,KAAK,MACnBkF,EAAW,KAAK,MAAM,UAAY,KAAK,MAAM,UAAUd,GAAM,KAEnE,GAAIc,GAAYA,EAAS,QAAU,GAC/B,OAAO,gBAAC,OAAI,UAAW,KAAK,MAAM,QAAQ,aAAc,KAAK,MAAM,EAAE,SAAS,CAAE,EAGpF,IAAI6B,EAAa,GACbC,EAAY,GAChB,GAAI9B,EAAU,CACV,GAAI,CACIA,EAAS,aAAkBA,EAAS,YAAc,OAAUA,EAAS,YAAgBA,EAAS,WAAW,QAAQ,KAAM,EAAE,CAAC,IAC1H6B,EAAa7B,EAAS,YAE9B,OAAStE,EAAP,CAEF,CACA,GAAI,CACIsE,EAAS,cAAmBA,EAAS,iBACrCA,EAAS,iBACTA,EAAS,YACTA,EAAS,aACT,OAAUA,EAAS,gBAAoBA,EAAS,WAAW,QAAQ,KAAM,EAAE,CAAC,GAC5E,OAAUA,EAAS,gBAAoBA,EAAS,WAAc,IAE9D6B,IAAeA,EAAa,MAAQ,IAAM7B,EAAS,gBAE3D,OAAStE,EAAP,CAEF,CACImG,IACAA,EAAa,gBAAC,UAAO,CAAC,MAAO,KAAK,MAAM,EAAE,wBAAwB,GAAG,gBAAC,QAAK,UAAW,KAAK,MAAM,QAAQ,YAAY,IAAEA,EAAW,GAAC,CAAO,GAG9I,GAAI,CACI7B,EAAS,YAAiBA,EAAS,KAAU,OAAUA,EAAS,WAAeA,EAAS,GAAM,IAC9F8B,EAAY9B,EAAS,WAE7B,OAAStE,EAAP,CAEF,CACA,GAAI,CACIsE,EAAS,aAAkBA,EAAS,gBACpCA,EAAS,gBACTA,EAAS,KACTA,EAAS,YACT,OAAUA,EAAS,eAAmBA,EAAS,GAAM,GACrD,OAAUA,EAAS,eAAmBA,EAAS,UAAa,IAE5D8B,IAAcA,EAAY,MAAQ,IAAM9B,EAAS,eAEzD,OAAStE,EAAP,CAEF,CACIoG,IACAA,EAAY,gBAAC,UAAO,CAAC,MAAO,KAAK,MAAM,EAAE,wBAAwB,GAAG,gBAAC,QAAK,UAAW,KAAK,MAAM,QAAQ,YAAY,IAAEA,EAAU,GAAC,CAAO,EAEhJ,CAEA,OAAO9B,GAAY,OAAOA,GAAa,SAC/B,gBAAC,MAAG,MAAO,CAAE,cAAe,MAAM,GAC9B,gBAAC,UACG,gBAAC,YACG,gBAAC,QAAK,UAAWlF,EAAQ,MAAO,KAAK,EAAE,UAAU,EAAE,IAAE,EACpDkF,EAAS,UAAe,IAC7B,CACJ,EACA,gBAAC,UACG,gBAAC,YACG,gBAAC,QAAK,UAAWlF,EAAQ,MAAO,KAAK,EAAE,KAAK,EAAE,IAAE,EAC/C6D,GAAW,IAAOqB,EAAS,GAAM,CACtC,CACJ,EACA,gBAAC,UACG,gBAAC,YACG,gBAAC,QAAK,UAAWlF,EAAQ,MAAO,KAAK,EAAE,SAAS,EAAE,IAAE,EACpD,gBAAC,QAAK,UAAWiH,GAAA,aAAiBF,EAAa,KAAK,MAAM,QAAQ,aAAe,KAAK,MAAM,QAAQ,QAAQ,GAAI7B,EAAS,YAAc,IAAK,EAC3I6B,CACL,CACJ,EACA,gBAAC,UACG,gBAAC,YACG,gBAAC,QAAK,UAAW/G,EAAQ,MAAO,KAAK,EAAE,KAAK,EAAE,IAAE,EAChD,gBAAC,QAAK,UAAWiH,GAAA,aAAiBD,EAAY,KAAK,MAAM,QAAQ,aAAe,KAAK,MAAM,QAAQ,QAAQ,GAAI9B,EAAS,KAAU,IAAK,EACtI8B,CACL,CACJ,CACJ,EAEA,gBAAC,UACG,gBAAC,WAAQ,IAAC,EACV,gBAAC,WAAQ,IAAC,EACV,gBAAC,WAAQ,IAAC,EACV,gBAAC,WAAQ,IAAC,CACd,CACZ,CAEA,sBAAsB5C,EAAI,CACtB,KAAM,CAAE,QAAApE,CAAQ,EAAI,KAAK,MACnBkF,EAAW,KAAK,MAAM,UAAY,KAAK,MAAM,UAAUd,GAAM,KAEnE,MAAO,CACH,gBAAC,MAAG,MAAO,CAAE,cAAe,MAAM,GAC7Bc,GAAY,OAAOA,GAAa,UAAY,OAAO,KAAKA,CAAQ,EAC5D,OAAOd,GAAM,CAACA,EAAG,WAAW,GAAG,CAAC,EAChC,IAAI8C,GAAS,gBAAC,MAAG,IAAKA,CAAA,EAClBhC,GAAY,OAAOA,GAAa,SAC7B,gBAAC,YACG,gBAAC,QAAK,UAAWlF,EAAQ,MAAO,KAAK,EAAEkH,CAAK,EAAE,IAAE,EAC9CrD,GAAWqD,GAASrD,GAAWqD,GAAOhC,EAASgC,GAAQ,KAAK,CAAC,EAAIhC,EAASgC,IAAU,IAC1F,EAEA,gBAAC,WAAQ,IAAC,CAElB,CAAK,CAEb,EACAhC,GAAY,OAAOA,GAAa,UAAY,OAAO,KAAKA,CAAQ,EAAE,OAAO,CAACiC,EAAM/B,IAAS+B,EAAO,GAAG,KAAK,EAAE/B,CAAI,KAAMvB,GAAWuB,GAAQvB,GAAWuB,GAAMF,EAASE,GAAO,KAAK,CAAC,EAAIF,EAASE,IAAS;AAAA,CAAS,CACjN,CACJ,CAUA,QAAQqB,EAAQ,CACZ,IAAIZ,EACAtB,EAEJ,OAAO,KAAK,MAAM,OAAO,gBAAgBkC,CAAM,EAC1C,KAAKjC,IACFD,EAAeC,EACR,KAAK,MAAM,OAAO,gBAAgBiC,CAAM,EAClD,EACA,KAAKW,IACFvB,EAAQuB,EACD,KAAK,aAAaX,EAAQZ,EAAOtB,CAAY,EACvD,EACA,KAAK1E,IACF,KAAK,SAAS,CACV,UAAWA,EAAK,UAChB,MAAAgG,EACA,YAAahG,EAAK,YAClB,WAAY0E,GAAgBA,EAAa,QAAUA,EAAa,OAAO,WAAaA,EAAa,OAAO,WAAa,CAAC,CAC1H,CAAC,EAEM,KAAK,aAAasB,CAAK,EACjC,EACA,KAAKwB,GACF,IAAI,QAAQ3B,GACR,KAAK,SAAS2B,EAAU,IACpB3B,EAAQ,CAAC,CAAC,CAAC,EACtB,MAAMtF,GAAS,OAAO,MAAM,oBAAoBA,GAAO,CAAC,CACjE,CAEA,QAAS,CACL,GAAI,CAAC,KAAK,MAAM,UACZ,OAAO,gBAAC,iBAAc,IAAC,EAG3B,KAAM,CAAE,QAAAJ,CAAQ,EAAI,KAAK,MAEzB,OAAO,gBAACsH,EAAA,EAAY,CAChB,UAAW,EACX,SAAS,WAET,gBAAC,WAAQ,CACL,aAAc,CACV,SAAU,SACV,WAAY,MAChB,EACA,KAAM,KAAK,MAAM,aACjB,iBAAkB,IAClB,QAAS,IAAM,KAAK,SAAS,CAAE,aAAc,EAAM,CAAC,EACpD,QAAS,KAAK,EAAE,QAAQ,EAC5B,EACA,gBAACC,EAAA,EAAU,CAAC,QAAS,CAAE,KAAMvH,EAAQ,SAAU,GAC3C,gBAAC,OAAI,CAAC,UAAS,GAAC,QAAS,GACpB,KAAK,kBAAkB,EACvB,KAAK,aAAa,CACvB,EACC,KAAK,WAAWA,CAAO,EACvB,KAAK,aAAa,CACvB,CACJ,CACJ,CACJ,CAEA8D,GAAM,UAAY,CAKd,OAAQ,WACR,SAAU,SACV,MAAO,WACP,KAAM,SACN,QAAS,SACT,OAAQ,WACR,MAAO,WACP,OAAQ,SACR,MAAO,WACP,EAAG,SACH,KAAM,WACN,iBAAkB,SAClB,gBAAiB,WACjB,YAAa,WAEb,SAAU,WACV,SAAU,WACV,KAAM,WACN,cAAe,UACnB,EAEA,Q,EAAe,cAAW,EAAM,EAAEA,EAAK,C,8BCt7BnC0D,EAAyB,EAAQ,KAA8C,EAEnF,EAA6C,CAC3C,MAAO,EACT,EACAC,EAAQ,EAAU,OAElB,IAAIC,EAAiBF,EAAuB,EAAQ,KAAuB,CAAC,EAExEG,EAAc,EAAQ,KAAmB,EAEzCC,G,EAAeF,EAAe,U,EAA2BC,EAAY,KAAK,OAAQ,CACpF,EAAG,sJACL,CAAC,EAAG,QAAQ,EAEZF,EAAQ,EAAUG,C","file":"static/js/2261.5341bfce.chunk.js","sourcesContent":["import { Component, createRef } from 'react';\nimport PropTypes from 'prop-types';\nimport Dropzone from 'react-dropzone';\nimport { Cropper } from 'react-cropper';\n\nimport { withStyles } from '@mui/styles';\nimport { Menu, MenuItem, Tooltip } from '@mui/material';\nimport IconButton from '@mui/material/IconButton';\n\nimport IconClose from '@mui/icons-material/Close';\nimport CropIcon from '@mui/icons-material/Crop';\nimport { FaFileUpload as UploadIcon } from 'react-icons/fa';\n\nimport Utils from '@iobroker/adapter-react-v5/Components/Utils';\n\n// import 'cropperjs/dist/cropper.css';\nconst cropperStyles = `\n/*!\n * Cropper.js v1.5.12\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2021-06-12T08:00:11.623Z\n */\n\n.cropper-container {\n direction: ltr;\n font-size: 0;\n line-height: 0;\n position: relative;\n -ms-touch-action: none;\n touch-action: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.cropper-container img {\n display: block;\n height: 100%;\n image-orientation: 0deg;\n max-height: none !important;\n max-width: none !important;\n min-height: 0 !important;\n min-width: 0 !important;\n width: 100%;\n}\n\n.cropper-wrap-box,\n.cropper-canvas,\n.cropper-drag-box,\n.cropper-crop-box,\n.cropper-modal {\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n}\n\n.cropper-wrap-box,\n.cropper-canvas {\n overflow: hidden;\n}\n\n.cropper-drag-box {\n background-color: #fff;\n opacity: 0;\n}\n\n.cropper-modal {\n background-color: #000;\n opacity: 0.5;\n}\n\n.cropper-view-box {\n display: block;\n height: 100%;\n outline: 1px solid #39f;\n outline-color: rgba(51, 153, 255, 0.75);\n overflow: hidden;\n width: 100%;\n}\n\n.cropper-dashed {\n border: 0 dashed #eee;\n display: block;\n opacity: 0.5;\n position: absolute;\n}\n\n.cropper-dashed.dashed-h {\n border-bottom-width: 1px;\n border-top-width: 1px;\n height: calc(100% / 3);\n left: 0;\n top: calc(100% / 3);\n width: 100%;\n}\n\n.cropper-dashed.dashed-v {\n border-left-width: 1px;\n border-right-width: 1px;\n height: 100%;\n left: calc(100% / 3);\n top: 0;\n width: calc(100% / 3);\n}\n\n.cropper-center {\n display: block;\n height: 0;\n left: 50%;\n opacity: 0.75;\n position: absolute;\n top: 50%;\n width: 0;\n}\n\n.cropper-center::before,\n.cropper-center::after {\n background-color: #eee;\n content: ' ';\n display: block;\n position: absolute;\n}\n\n.cropper-center::before {\n height: 1px;\n left: -3px;\n top: 0;\n width: 7px;\n}\n\n.cropper-center::after {\n height: 7px;\n left: 0;\n top: -3px;\n width: 1px;\n}\n\n.cropper-face,\n.cropper-line,\n.cropper-point {\n display: block;\n height: 100%;\n opacity: 0.1;\n position: absolute;\n width: 100%;\n}\n\n.cropper-face {\n background-color: #fff;\n left: 0;\n top: 0;\n}\n\n.cropper-line {\n background-color: #39f;\n}\n\n.cropper-line.line-e {\n cursor: ew-resize;\n right: -3px;\n top: 0;\n width: 5px;\n}\n\n.cropper-line.line-n {\n cursor: ns-resize;\n height: 5px;\n left: 0;\n top: -3px;\n}\n\n.cropper-line.line-w {\n cursor: ew-resize;\n left: -3px;\n top: 0;\n width: 5px;\n}\n\n.cropper-line.line-s {\n bottom: -3px;\n cursor: ns-resize;\n height: 5px;\n left: 0;\n}\n\n.cropper-point {\n background-color: #39f;\n height: 5px;\n opacity: 0.75;\n width: 5px;\n}\n\n.cropper-point.point-e {\n cursor: ew-resize;\n margin-top: -3px;\n right: -3px;\n top: 50%;\n}\n\n.cropper-point.point-n {\n cursor: ns-resize;\n left: 50%;\n margin-left: -3px;\n top: -3px;\n}\n\n.cropper-point.point-w {\n cursor: ew-resize;\n left: -3px;\n margin-top: -3px;\n top: 50%;\n}\n\n.cropper-point.point-s {\n bottom: -3px;\n cursor: s-resize;\n left: 50%;\n margin-left: -3px;\n}\n\n.cropper-point.point-ne {\n cursor: nesw-resize;\n right: -3px;\n top: -3px;\n}\n\n.cropper-point.point-nw {\n cursor: nwse-resize;\n left: -3px;\n top: -3px;\n}\n\n.cropper-point.point-sw {\n bottom: -3px;\n cursor: nesw-resize;\n left: -3px;\n}\n\n.cropper-point.point-se {\n bottom: -3px;\n cursor: nwse-resize;\n height: 20px;\n opacity: 1;\n right: -3px;\n width: 20px;\n}\n\n@media (min-width: 768px) {\n .cropper-point.point-se {\n height: 15px;\n width: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .cropper-point.point-se {\n height: 10px;\n width: 10px;\n }\n}\n\n@media (min-width: 1200px) {\n .cropper-point.point-se {\n height: 5px;\n opacity: 0.75;\n width: 5px;\n }\n}\n\n.cropper-point.point-se::before {\n background-color: #39f;\n bottom: -50%;\n content: ' ';\n display: block;\n height: 200%;\n opacity: 0;\n position: absolute;\n right: -50%;\n width: 200%;\n}\n\n.cropper-invisible {\n opacity: 0;\n}\n\n.cropper-bg {\n background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC');\n}\n\n.cropper-hide {\n display: block;\n height: 0;\n position: absolute;\n width: 0;\n}\n\n.cropper-hidden {\n display: none !important;\n}\n\n.cropper-move {\n cursor: move;\n}\n\n.cropper-crop {\n cursor: crosshair;\n}\n\n.cropper-disabled .cropper-drag-box,\n.cropper-disabled .cropper-face,\n.cropper-disabled .cropper-line,\n.cropper-disabled .cropper-point {\n cursor: not-allowed;\n}\n`;\n\nconst styles = theme => ({\n dropZone: {\n width: '100%',\n height: 100,\n position: 'relative',\n },\n dropZoneEmpty: {\n\n },\n image: {\n objectFit: 'contain',\n margin: 'auto',\n display: 'flex',\n width: '100%',\n height: '100%',\n },\n\n uploadDiv: {\n position: 'relative',\n width: '100%',\n height: 300,\n opacity: 0.9,\n marginTop: 30,\n cursor: 'pointer',\n outline: 'none'\n },\n uploadDivDragging: {\n opacity: 1,\n background: 'rgba(128,255,128,0.1)'\n },\n\n uploadCenterDiv: {\n margin: 5,\n border: '3px dashed grey',\n borderRadius: 5,\n width: 'calc(100% - 10px)',\n height: 'calc(100% - 10px)',\n position: 'relative',\n display: 'flex'\n },\n uploadCenterIcon: {\n paddingTop: 10,\n width: 48,\n height: 48,\n },\n uploadCenterText: {\n fontSize: 16,\n },\n uploadCenterTextAndIcon: {\n textAlign: 'center',\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center'\n\n },\n disabledOpacity: {\n opacity: 0.3,\n cursor: 'default'\n },\n buttonRemoveWrapper: {\n position: 'absolute',\n zIndex: 222,\n right: 0\n },\n buttonCropWrapper: {\n position: 'absolute',\n zIndex: 222,\n right: 0,\n top: 50\n },\n error: {\n border: '2px solid red'\n }\n});\n\nclass UploadImage extends Component {\n constructor(props) {\n super(props);\n this.state = {\n uploadFile: false,\n anchorEl: null,\n cropHandler: false,\n };\n this.cropperRef = createRef();\n\n if (!window.document.getElementById('cropper-style-json-component')) {\n const style = window.document.createElement('style');\n style.setAttribute('id', 'cropper-style-json-component');\n style.innerHTML = cropperStyles;\n window.document.head.appendChild(style);\n }\n }\n\n onDrop(acceptedFiles) {\n const { maxSize, t, onChange } = this.props;\n\n const file = acceptedFiles[0];\n const reader = new FileReader();\n\n reader.onabort = () => console.log('file reading was aborted');\n reader.onerror = () => console.log('file reading has failed');\n reader.onload = () => {\n let ext = 'image/' + file.name.split('.').pop().toLowerCase();\n if (ext === 'image/jpg') {\n ext = 'image/jpeg';\n } else if (ext.includes('svg')) {\n ext = 'image/svg+xml';\n }\n if (file.size > maxSize) {\n return window.alert(t('ra_File is too big. Max %sk allowed. Try use SVG.', Math.round(maxSize / 1024)));\n }\n const base64 = `data:${ext};base64,${btoa(\n new Uint8Array(reader.result)\n .reduce((data, byte) => data + String.fromCharCode(byte), ''))}`;\n\n onChange(base64);\n };\n reader.readAsArrayBuffer(file);\n }\n\n render() {\n const { disabled, maxSize, classes, icon, t, removeIconFunc, accept, error, crop, onChange } = this.props;\n const { uploadFile, anchorEl, cropHandler } = this.state;\n return <Dropzone\n disabled={disabled || cropHandler}\n key=\"dropzone\"\n multiple={false}\n accept={accept}\n maxSize={maxSize}\n onDragEnter={() => this.setState({ uploadFile: 'dragging' })}\n onDragLeave={() => this.setState({ uploadFile: true })}\n onDrop={(acceptedFiles, errors) => {\n this.setState({ uploadFile: false });\n if (!acceptedFiles.length) {\n window.alert((errors && errors[0] && errors[0].errors && errors[0].errors[0] && errors[0].errors[0].message) || t('ra_Cannot upload'));\n } else {\n return this.onDrop(acceptedFiles);\n }\n }}\n >\n {({ getRootProps, getInputProps }) => <div\n className={Utils.clsx(\n classes.uploadDiv,\n uploadFile === 'dragging' && classes.uploadDivDragging,\n classes.dropZone,\n disabled && classes.disabledOpacity,\n !icon && classes.dropZoneEmpty\n )}\n {...getRootProps()}>\n <input {...getInputProps()} />\n <div className={Utils.clsx(classes.uploadCenterDiv, error && classes.error)}>\n {!icon ? <div className={classes.uploadCenterTextAndIcon}>\n <UploadIcon className={classes.uploadCenterIcon} />\n <div className={classes.uploadCenterText}>{\n uploadFile === 'dragging' ? t('ra_Drop file here') :\n t('ra_Place your files here or click here to open the browse dialog')}</div>\n </div>\n :\n removeIconFunc && !cropHandler && <div className={classes.buttonRemoveWrapper}>\n <Tooltip title={t('ra_Clear')}>\n <IconButton size=\"large\" onClick={e => {\n removeIconFunc && removeIconFunc();\n e.stopPropagation();\n }}><IconClose />\n </IconButton>\n </Tooltip>\n </div>\n }\n {icon && crop && <div className={classes.buttonCropWrapper}>\n <Tooltip title={t('ra_Crop')}>\n <IconButton size=\"large\" onClick={e => {\n if (!cropHandler) {\n this.setState({ cropHandler: true });\n } else {\n this.setState({ anchorEl: e.currentTarget });\n }\n e.stopPropagation();\n }}><CropIcon color={cropHandler ? 'primary' : 'inherit'} />\n </IconButton>\n </Tooltip>\n <Menu\n anchorEl={anchorEl}\n keepMounted\n open={Boolean(anchorEl)}\n onClose={() => this.setState({ anchorEl: null })}\n >\n <MenuItem onClick={() => this.setState({ anchorEl: null, cropHandler: false }, () => {\n const imageElement = this.cropperRef?.current?.cropper;\n onChange(imageElement.getCroppedCanvas().toDataURL());\n })}>{t('ra_Save')}</MenuItem>\n <MenuItem onClick={() => this.setState({ anchorEl: null, cropHandler: false })}>{t('ra_Close')}</MenuItem>\n </Menu>\n </div>}\n {icon && !cropHandler ? <img src={icon} className={classes.image} alt=\"icon\" /> : null}\n\n {icon && crop && cropHandler ? <Cropper\n ref={this.cropperRef}\n className={classes.image}\n src={icon}\n initialAspectRatio={1}\n viewMode={1}\n guides={false}\n minCropBoxHeight={10}\n minCropBoxWidth={10}\n background={false}\n checkOrientation={false}\n /> : null}\n </div>\n </div>}\n </Dropzone>;\n }\n}\n\nUploadImage.defaultProps = {\n disabled: false,\n maxSize: 10 * 1024,\n icon: null,\n removeIconFunc: null,\n accept: { 'image/*': [] },\n error: false,\n onChange: base64 => console.log(base64),\n t: el => el,\n crop: false,\n};\n\nUploadImage.propTypes = {\n classes: PropTypes.object,\n maxSize: PropTypes.number,\n disabled: PropTypes.bool,\n crop: PropTypes.bool,\n error: PropTypes.bool,\n onChange: PropTypes.func,\n accept: PropTypes.object,\n t: PropTypes.func,\n};\n\nexport default withStyles(styles)(UploadImage);\n","import React, { createRef, Component } from 'react';\n\nimport { withStyles } from '@mui/styles';\n\nimport PropTypes from 'prop-types';\n\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport IconButton from '@mui/material/IconButton';\nimport Typography from '@mui/material/Typography';\n\nimport CloseIcon from '@mui/icons-material/Close';\n\nconst styles = theme => ({\n rootGrid: {\n flexGrow: 1,\n },\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n },\n paper: {\n //minWidth: 600\n },\n typography: {\n paddingRight: 30\n },\n img: {\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n }\n});\n\nclass EditIntroLinkDialog extends Component {\n\n constructor(props) {\n super(props);\n\n this.cameraUpdateTimer = null;\n this.cameraRef = createRef();\n }\n\n componentDidMount() {\n if (this.props.camera && this.props.camera !== 'text') {\n this.cameraUpdateTimer = setInterval(() => this.updateCamera(), Math.max(parseInt(this.props.interval, 10), 500));\n this.updateCamera();\n }\n }\n\n componentWillUnmount() {\n this.cameraUpdateTimer && clearInterval(this.cameraUpdateTimer);\n this.cameraUpdateTimer = null;\n }\n\n updateCamera() {\n if (this.cameraRef.current) {\n if (this.props.camera === 'custom') {\n let url = this.props.children;\n if (this.props.addTs) {\n if (url.includes('?')) {\n url += '&ts=' + Date.now();\n } else {\n url += '?ts=' + Date.now();\n }\n }\n this.cameraRef.current.src = url;\n } else {\n const parts = this.props.camera.split('.');\n const adapter = parts.shift();\n const instance = parts.shift();\n this.props.socket.sendTo(adapter + '.' + instance, 'image', { name: parts.pop(), width: this.cameraRef.current.width })\n .then(result => {\n if (result && result.data && this.cameraRef.current) {\n this.cameraRef.current.src = 'data:image/jpeg;base64,' + result.data;\n }\n });\n }\n }\n }\n\n render() {\n const { classes } = this.props;\n\n return (\n <Dialog\n onClose={() => this.props.onClose()}\n open={true}\n maxWidth=\"xl\"\n fullWidth={true}\n fullScreen={true}\n classes={{ paper: classes.paper }}\n >\n <DialogTitle>\n <Typography component=\"h2\" variant=\"h6\" classes={{ root: classes.typography }}>\n {this.props.name}\n <IconButton size=\"large\" className={classes.closeButton} onClick={() => this.props.onClose()}>\n <CloseIcon />\n </IconButton>\n </Typography>\n </DialogTitle>\n <DialogContent dividers>\n <img className={this.props.classes.img} src=\"\" alt=\"camera\" ref={this.cameraRef} />\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n autoFocus\n onClick={e => {\n e.stopPropagation();\n this.props.onClose();\n }}\n color=\"primary\"\n startIcon={<CloseIcon />}\n >\n {this.props.t('Close')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n\nEditIntroLinkDialog.propTypes = {\n t: PropTypes.func.isRequired,\n camera: PropTypes.string,\n socket: PropTypes.object,\n interval: PropTypes.string,\n onClose: PropTypes.func.isRequired,\n};\n\nexport default withStyles(styles)(EditIntroLinkDialog);","import { createRef, Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@mui/styles';\nimport copy from '@iobroker/adapter-react-v5/Components/copy-to-clipboard';\n\nimport { Button } from '@mui/material';\nimport { Card } from '@mui/material';\nimport { CardActions } from '@mui/material';\nimport { CardContent } from '@mui/material';\nimport { CardMedia } from '@mui/material';\nimport { Collapse } from '@mui/material';\nimport { Divider } from '@mui/material';\nimport { Grid } from '@mui/material';\nimport { IconButton } from '@mui/material';\nimport { Link } from '@mui/material';\nimport { Typography } from '@mui/material';\nimport { Skeleton } from '@mui/material';\n\nimport CheckIcon from '@mui/icons-material/Check';\nimport EditIcon from '@mui/icons-material/Create';\nimport ErrorIcon from '@mui/icons-material/Error';\nimport CloseIcon from '@mui/icons-material/Close';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport SaveIcon from '@iobroker/adapter-react-v5/icons/IconCopy';\n\nimport blue from '@mui/material/colors/blue';\nimport grey from '@mui/material/colors/grey';\nimport { red } from '@mui/material/colors';\n\nimport CameraIntroDialog from '../dialogs/CameraIntroDialog';\n\nconst boxShadow = '0 2px 2px 0 rgba(0, 0, 0, .14),0 3px 1px -2px rgba(0, 0, 0, .12),0 1px 5px 0 rgba(0, 0, 0, .2)';\nconst boxShadowHover = '0 8px 17px 0 rgba(0, 0, 0, .2),0 6px 20px 0 rgba(0, 0, 0, .19)';\n\nconst styles = theme => ({\n root: {\n padding: '.75rem',\n [theme.breakpoints.up('xl')]: {\n flex: '0 1 20%'\n }\n },\n card: {\n display: 'flex',\n minHeight: '235px',\n position: 'relative',\n overflow: 'hidden',\n maxHeight: '235p',\n '&:hover': {\n overflowY: 'auto',\n boxShadow: boxShadowHover\n }\n },\n cardInfo: {\n display: 'flex',\n minHeight: '235px',\n position: 'relative',\n overflow: 'initial',\n maxHeight: '235p',\n flexDirection: 'column',\n '&:hover': {\n // overflowY: 'auto',\n boxShadow: boxShadowHover\n }\n },\n cardInfoHead: {\n position: 'sticky',\n top: 0,\n background: theme.palette.background.default,\n display: 'flex',\n width: '100%',\n justifyContent: 'space-between',\n borderBottom: '1px solid',\n padding: '5px 5px 0px 5px'\n },\n edit: {\n opacity: '.6',\n userSelect: 'none',\n pointerEvents: 'none'\n },\n media: {\n backgroundColor: '#e2e2e2',\n maxWidth: '30%'\n },\n img: {\n width: '120px',\n height: 'auto',\n padding: '2rem .5rem',\n maxWidth: '100%'\n },\n contentContainer: {\n display: 'flex',\n flexDirection: 'column',\n flex: 1\n },\n content: {\n height: '170px',\n flexGrow: 1,\n overflowY: 'hidden'\n },\n action: {\n minHeight: '49px',\n padding: '16px 24px'\n },\n expand: {\n position: 'absolute',\n right: '10px',\n bottom: '10px'\n },\n collapse: {\n minHeight: '100%',\n backgroundColor: '#ffffff',\n position: 'absolute',\n width: '100%',\n // '& button': {\n // position: 'absolute',\n // top: '10px',\n // color: '#000000',\n // '&:focus': {\n // color: '#ffffff',\n // backgroundColor: blue[500]\n // }\n // }\n },\n close: {\n right: '10px'\n },\n save: {\n right: '50px'\n },\n enabled: {\n color: '#ffffff',\n backgroundColor: blue[500],\n position: 'absolute',\n top: theme.spacing(1),\n right: theme.spacing(1),\n boxShadow,\n '&:hover': {\n backgroundColor: blue[300]\n },\n '&:focus': {\n backgroundColor: blue[500]\n }\n },\n disabled: {\n color: '#ffffff',\n backgroundColor: grey[500],\n position: 'absolute',\n top: theme.spacing(1),\n right: theme.spacing(1),\n boxShadow,\n '&:hover': {\n backgroundColor: grey[300]\n },\n '&:focus': {\n backgroundColor: grey[500]\n }\n },\n editButton: {\n color: '#ffffff',\n backgroundColor: grey[500],\n position: 'absolute',\n top: parseInt(theme.spacing(2), 10) + 48, // 48 is the height of button\n right: theme.spacing(1),\n boxShadow,\n '&:hover': {\n backgroundColor: grey[300]\n },\n '&:focus': {\n backgroundColor: grey[500]\n }\n },\n deleteButton: {\n color: '#ffffff',\n backgroundColor: red[500],\n position: 'absolute',\n top: parseInt(theme.spacing(3), 10) + 48 + 48, // 48 is the height of button\n right: theme.spacing(1),\n boxShadow,\n '&:hover': {\n backgroundColor: red[300]\n },\n '&:focus': {\n backgroundColor: red[500]\n }\n\n },\n cameraImg: {\n width: '100%',\n height: '100%',\n maxWidth: 200,\n maxHeight: 200,\n objectFit: 'contain',\n },\n imgContainer: {\n height: '100%'\n },\n hidden: {\n display: 'none'\n },\n contentGrid: {\n height: '100%'\n },\n imgSkeleton: {\n transform: 'initial'\n },\n colorOrange: {\n color: '#ffcc80'\n }\n});\n\nclass IntroCard extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n error: false,\n expanded: false,\n dialog: false,\n loaded: false\n };\n\n this.cameraRef = createRef();\n this.cameraUpdateTimer = null;\n\n this.interval = this.props.interval;\n this.camera = this.props.camera;\n this.t = props.t;\n }\n\n updateCamera() {\n if (this.cameraRef.current) {\n if (this.props.camera === 'custom') {\n let url = this.props.children;\n if (this.props.addTs) {\n if (url.includes('?')) {\n url += '&ts=' + Date.now();\n } else {\n url += '?ts=' + Date.now();\n }\n }\n this.cameraRef.current.src = url;\n } else {\n const parts = this.props.camera.split('.');\n const adapter = parts.shift();\n const instance = parts.shift();\n this.props.socket.sendTo(adapter + '.' + instance, 'image', { name: parts.pop(), width: this.cameraRef.current.width })\n .then(result => {\n if (result && result.data && this.cameraRef.current) {\n this.cameraRef.current.src = 'data:image/jpeg;base64,' + result.data;\n }\n })\n .catch(e => window.alert('Cannot send to instance: ' + e));\n }\n }\n }\n\n componentDidMount() {\n if (this.props.camera && this.props.camera !== 'text') {\n this.cameraUpdateTimer = setInterval(() => this.updateCamera(), Math.max(parseInt(this.props.interval, 10), 500));\n this.updateCamera();\n }\n }\n\n componentWillUnmount() {\n this.cameraUpdateTimer && clearInterval(this.cameraUpdateTimer);\n this.cameraUpdateTimer = null;\n }\n\n renderCameraDialog() {\n if (!this.state.dialog) {\n return null;\n } else {\n return <CameraIntroDialog\n socket={this.props.socket}\n camera={this.props.camera}\n name={this.props.title}\n t={this.props.t}\n onClose={() => {\n if (this.props.camera && this.props.camera !== 'text') {\n this.cameraUpdateTimer && clearInterval(this.cameraUpdateTimer);\n this.cameraUpdateTimer = setInterval(() => this.updateCamera(), Math.max(parseInt(this.props.interval, 10), 500));\n this.updateCamera();\n }\n\n this.setState({ dialog: false });\n }}\n >\n {this.props.children}\n </CameraIntroDialog>;\n }\n }\n\n static getDerivedStateFromProps(props) {\n if (props.edit) {\n return { expanded: false };\n } else {\n return null;\n }\n }\n\n handleExpandClick() {\n this.setState({ expanded: !this.state.expanded });\n }\n\n handleImageLoad() {\n if (!this.state.loaded) {\n this.setState({\n loaded: true,\n error: false\n });\n }\n }\n\n handleImageError() {\n if (!this.state.error) {\n this.setState({\n loaded: false,\n error: true\n });\n }\n }\n\n renderContent() {\n const { classes } = this.props;\n\n if (!this.props.camera || this.props.camera === 'text') {\n return this.props.children\n } else if (this.props.camera === 'custom') {\n\n let url = this.props.children;\n\n if (this.props.addTs) {\n if (url.includes('?')) {\n url += '&ts=' + Date.now();\n } else {\n url += '?ts=' + Date.now();\n }\n }\n\n return <Grid\n item\n container\n className={classes.imgContainer}\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <img\n ref={this.cameraRef}\n src={url}\n alt=\"Camera\"\n className={this.state.loaded && !this.state.error ? classes.cameraImg : classes.hidden}\n onLoad={() => this.handleImageLoad()}\n onError={() => this.handleImageError()}\n />\n {!this.state.loaded && !this.state.error &&\n <Skeleton\n height=\"100%\"\n width=\"100%\"\n animation=\"wave\"\n className={classes.imgSkeleton}\n />\n }\n {this.state.error &&\n <ErrorIcon fontSize=\"large\" />\n }\n </Grid>;\n } else if (this.props.camera.startsWith('cameras.')) {\n return <img ref={this.cameraRef} src=\"\" alt=\"camera\" className={this.props.classes.cameraImg} />;\n }\n }\n\n render() {\n const { classes } = this.props;\n const editClass = this.props.edit ? ' ' + classes.edit : '';\n\n if (this.props.camera && this.props.camera !== 'text') {\n if (this.interval !== this.props.interval) {\n this.interval = this.props.interval;\n this.cameraUpdateTimer && clearInterval(this.cameraUpdateTimer);\n this.cameraUpdateTimer = setInterval(() => this.updateCamera(), Math.max(parseInt(this.props.interval, 10), 500));\n }\n } else if (this.cameraUpdateTimer) {\n clearInterval(this.cameraUpdateTimer);\n this.cameraUpdateTimer = null;\n }\n\n let buttonTitle = this.props.action.text || this.props.t('Link');\n if (typeof buttonTitle === 'object') {\n buttonTitle = buttonTitle[this.props.lang] || buttonTitle.en;\n }\n\n return <Grid\n item\n xs={12}\n sm={6}\n md={4}\n lg={3}\n className={classes.root}\n >\n <Link\n href={!this.props.edit && this.props.action && this.props.action.link ? this.props.action.link : null}\n underline=\"none\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <Card\n className={classes.card}\n onClick={e => {\n e.stopPropagation();\n if (!this.props.edit && this.props.camera && this.props.camera !== 'text') {\n this.cameraUpdateTimer && clearInterval(this.cameraUpdateTimer);\n this.cameraUpdateTimer = null;\n this.setState({ dialog: true });\n }\n }}\n >\n {\n this.props.reveal && !this.props.offline &&\n <Button\n className={classes.expand + editClass}\n variant=\"contained\"\n size=\"small\"\n disabled={this.props.disabled}\n onClick={() => this.handleExpandClick()}\n color=\"primary\"\n >\n {this.props.t('Info')}\n </Button>\n }\n <div className={classes.media + editClass} style={{ backgroundColor: this.props.color }}>\n <CardMedia\n className={classes.img}\n component=\"img\"\n image={this.props.image}\n />\n </div>\n <div className={classes.contentContainer + editClass}>\n <CardContent className={classes.content}>\n <Grid\n container\n direction=\"column\"\n wrap=\"nowrap\"\n className={classes.contentGrid}\n >\n <Typography gutterBottom variant=\"h5\" component=\"h5\">\n {this.props.title}\n </Typography>\n {this.renderContent()}\n </Grid>\n </CardContent>\n {\n this.props.action && this.props.action.link &&\n <Divider />\n }\n {\n this.props.action && this.props.action.link &&\n <CardActions className={classes.action}>\n <div className={classes.colorOrange}>\n {buttonTitle}\n </div>\n </CardActions>\n }\n </div>\n {\n this.props.reveal &&\n <Collapse\n className={classes.collapse}\n in={this.state.expanded}\n timeout=\"auto\"\n unmountOnExit\n >\n <Card className={classes.cardInfo}>\n <div className={classes.cardInfoHead}>\n <Typography gutterBottom variant=\"h5\" component=\"h5\">\n {this.props.t('Info')}\n </Typography>\n <div>\n <IconButton size=\"small\" onClick={() => {\n copy(this.props.getHostDescriptionAll()[1], {\n format: 'text/plain'\n });\n this.props.openSnackBarFunc();\n }}>\n <SaveIcon />\n </IconButton>\n <IconButton size=\"small\" onClick={() => this.handleExpandClick()}>\n <CloseIcon />\n </IconButton>\n </div>\n </div>\n <CardContent >\n {this.props.getHostDescriptionAll()[0]}\n {/* { this.props.reveal } */}\n </CardContent>\n </Card>\n </Collapse>\n }\n {\n this.props.edit && this.props.toggleActivation &&\n <IconButton size=\"large\" className={this.props.enabled ? classes.enabled : classes.disabled} onClick={() => this.props.toggleActivation()}>\n <CheckIcon />\n </IconButton>\n }\n {\n this.props.edit && this.props.onEdit &&\n <IconButton size=\"large\" className={classes.editButton} onClick={() => this.props.onEdit()}>\n <EditIcon />\n </IconButton>\n }\n {\n this.props.edit && this.props.onRemove &&\n <IconButton size=\"large\" className={classes.deleteButton} onClick={() => this.props.onRemove()}>\n <DeleteIcon />\n </IconButton>\n }\n {this.renderCameraDialog()}\n </Card>\n </Link>\n </Grid>;\n }\n}\n\nIntroCard.propTypes = {\n camera: PropTypes.string,\n addTs: PropTypes.bool,\n interval: PropTypes.number,\n ready: PropTypes.bool,\n instances: PropTypes.object,\n updateIntro: PropTypes.string,\n openLinksInNewWindow: PropTypes.bool,\n onEdit: PropTypes.func,\n socket: PropTypes.object,\n offline: PropTypes.bool,\n t: PropTypes.func,\n lang: PropTypes.string,\n};\n\nexport default withStyles(styles)(IntroCard);","import React, { Component } from 'react';\n\nimport { withStyles } from '@mui/styles';\n\nimport PropTypes from 'prop-types';\n\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport TextField from '@mui/material/TextField';\nimport Grid from '@mui/material/Grid';\nimport IconButton from '@mui/material/IconButton';\nimport Typography from '@mui/material/Typography';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Checkbox from '@mui/material/Checkbox';\nimport Slider from '@mui/material/Slider';\nimport InputLabel from '@mui/material/InputLabel';\nimport MenuItem from '@mui/material/MenuItem';\nimport FormControl from '@mui/material/FormControl';\nimport Select from '@mui/material/Select';\n\nimport CloseIcon from '@mui/icons-material/Close';\n\n// icons\nimport IntroCard from '../components/IntroCard';\nimport UploadImage from '../components/UploadImage';\nimport AddIcon from '@mui/icons-material/Add';\nimport CheckIcon from '@mui/icons-material/Check';\n\n\nconst styles = theme => ({\n formControl: {\n marginTop: theme.spacing(4)\n },\n rootGrid: {\n flexGrow: 1,\n },\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n },\n paper: {\n //minWidth: 600\n },\n typography: {\n paddingRight: 30\n },\n editItem: {\n marginTop: theme.spacing(1),\n },\n editItemSlider: {\n marginTop: theme.spacing(3),\n },\n labelSlider: {\n marginTop: theme.spacing(2),\n fontSize: '1rem',\n },\n editColor: {\n width: '100%',\n },\n dropZone: {\n width: '100%',\n height: 100,\n position: 'relative',\n },\n dropZoneEmpty: {\n\n },\n image: {\n height: '100%',\n width: 'auto',\n objectFir: 'contain'\n },\n\n uploadDiv: {\n position: 'relative',\n width: '100%',\n height: 100,\n opacity: 0.9,\n },\n uploadDivDragging: {\n opacity: 1,\n },\n\n uploadCenterDiv: {\n margin: 5,\n border: '3px dashed grey',\n borderRadius: 5,\n width: 'calc(100% - 10px)',\n height: 'calc(100% - 10px)',\n position: 'relative',\n },\n uploadCenterIcon: {\n paddingTop: 10,\n width: 48,\n height: 48,\n },\n uploadCenterText: {\n fontSize: 16,\n },\n uploadCenterTextAndIcon: {\n textAlign: 'center',\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n }\n});\n\nclass EditIntroLinkDialog extends Component {\n\n constructor(props) {\n super(props);\n\n let state = Object.assign({\n image: '',\n name: props.t('New link'),\n link: 'http://',\n linkName: '',\n color: '',\n desc: '',\n enabled: true,\n addTs: true,\n interval: 5000,\n camera: 'text',\n cameraList: []\n }, props.link);\n\n this.state = state;\n }\n\n componentDidMount() {\n this.getCamerasInstances();\n }\n\n getCamerasInstances() {\n this.props.socket.getAdapterInstances('cameras', true)\n .then(list => {\n\n const cameraList = [];\n const promises = [];\n list.forEach(obj => {\n const instance = obj._id.replace('system.adapter.', '');\n\n if (obj.common && obj.common.enabled) {\n promises.push(\n // if instance is alive\n this.props.socket.getState(obj._id + '.alive')\n // get the list of cameras\n .then(state => state && state.val && this.props.socket.sendTo(instance, 'list', null))\n .then(result =>\n result && result.list && result.list.forEach(cam =>\n cameraList.push({ id: cam.id, name: `${cam.desc} [${instance}/${cam.name}]` }))));\n\n }\n });\n\n Promise.all(promises)\n .then(() =>\n this.setState({ cameraList }));\n });\n }\n\n getLinkNameFromLink(link) {\n const m = link.trim().match(/^https?:\\/\\/([^/:]+)(:\\d+)?/);\n if (m) {\n return m[1] + (m[2] || '');\n }\n }\n\n render() {\n const { classes } = this.props;\n\n return (\n <Dialog\n onClose={() => this.props.onClose()}\n open={this.props.open}\n maxWidth=\"md\"\n fullWidth={true}\n classes={{ paper: classes.paper }}\n >\n <DialogTitle>\n <Typography component=\"h2\" variant=\"h6\" classes={{ root: classes.typography }}>\n {this.props.isNew ? this.props.t('Add new link: ') : this.props.t('Edit link')}\n <IconButton size=\"large\" className={classes.closeButton} onClick={() => this.props.onClose()}>\n <CloseIcon />\n </IconButton>\n </Typography>\n </DialogTitle>\n <DialogContent dividers>\n\n <Grid\n className={this.props.classes.rootGrid}\n container\n direction=\"row\"\n >\n <Grid item\n xs={12}\n sm={6}\n md={8}\n lg={9}>\n <Grid\n container\n direction=\"column\"\n >\n <FormControl variant=\"standard\" className={classes.formControl}>\n <InputLabel id=\"select-helper-label\">{this.props.t('Link type')}</InputLabel>\n <Select\n variant=\"standard\"\n labelId=\"select-helper-label\"\n value={this.state.camera}\n onChange={e => this.setState({ camera: e.target.value })}\n >\n <MenuItem value=\"text\" key=\"desc\"><em>{this.props.t('Description')}</em></MenuItem>\n {this.state.cameraList.map(cam => <MenuItem key={cam.id} value={cam.id}>{cam.name}</MenuItem>)}\n <MenuItem value=\"custom\" key=\"custom\">{this.props.t('Custom camera URL')}</MenuItem>\n </Select>\n </FormControl>\n\n <TextField\n variant=\"standard\"\n label={this.props.t('URL')}\n value={this.state.link}\n className={this.props.classes.editItem}\n onChange={e => {\n const oldLinkName = this.getLinkNameFromLink(this.state.link);\n if (oldLinkName && (!this.state.linkName || oldLinkName === this.state.linkName)) {\n this.setState({ link: e.target.value, linkName: this.getLinkNameFromLink(e.target.value) });\n } else {\n this.setState({ link: e.target.value });\n }\n }}\n />\n\n <TextField\n variant=\"standard\"\n className={this.props.classes.editItem}\n label={this.props.t('Name')}\n value={this.state.name || ''}\n onChange={e => this.setState({ name: e.target.value })}\n />\n\n {this.state.link ? <TextField variant=\"standard\" className={this.props.classes.editItem} label={this.props.t('Link name')} value={this.state.linkName || ''} onChange={e => this.setState({ linkName: e.target.value })} /> : null}\n\n {this.state.camera === 'custom' || this.state.camera === 'text' ? <TextField variant=\"standard\" className={this.props.classes.editItem} label={this.state.camera === 'custom' ? this.props.t('Camera URL') : this.props.t('Description')} value={this.state.desc || ''} onChange={e => this.setState({ desc: e.target.value })} /> : null}\n\n {this.state.camera === 'custom' ? <FormControlLabel className={this.props.classes.editItem}\n control={<Checkbox checked={this.state.addTs} onChange={e => this.setState({ addTs: e.target.checked })} />}\n label={this.props.t('Add timestamp to URL')}\n /> : null}\n\n {this.state.camera !== 'text' ? <Typography className={this.props.classes.labelSlider} gutterBottom>\n Polling interval in ms\n </Typography> : null}\n {this.state.camera !== 'text' ? <Slider\n className={this.props.classes.editItemSlider}\n value={this.state.interval}\n getAriaValueText={() => this.state.interval + 'ms'}\n onChange={(e, interval) => this.setState({ interval })}\n step={100}\n min={500}\n max={60000}\n valueLabelDisplay=\"on\"\n /> : null}\n\n <div style={{ width: 50 }} className={this.props.classes.editItem}>\n <TextField variant=\"standard\" fullWidth={true} label={this.props.t('Color')} className={this.props.editColor} type=\"color\" value={this.state.color} onChange={e => this.setState({ color: e.target.value })} />\n </div>\n <UploadImage\n disabled={false}\n crop\n maxSize={256 * 1024}\n icon={this.state.image}\n removeIconFunc={() => this.setState({ image: '' })}\n onChange={(base64) => this.setState({ image: base64 })}\n t={this.props.t}\n />\n </Grid>\n </Grid>\n <IntroCard\n interval={this.state.interval}\n camera={this.state.camera}\n addTs={this.state.addTs}\n image={this.state.image}\n title={this.state.name}\n socket={this.props.socket}\n action={{ link: this.state.link, text: this.state.linkName }}\n t={this.props.t}\n color={this.state.color}\n enabled={true}\n >\n {this.state.desc || ''}\n </IntroCard>\n </Grid>\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n autoFocus\n onClick={() => {\n this.props.onClose({\n link: this.state.link,\n name: this.state.name,\n desc: this.state.desc,\n linkName: this.state.linkName,\n color: this.state.color,\n image: this.state.image,\n addTs: this.state.addTs,\n camera: this.state.camera,\n interval: this.state.interval,\n });\n }}\n color=\"primary\"\n startIcon={this.props.isNew ? <AddIcon/> : <CheckIcon/>}\n >\n {this.props.isNew ? this.props.t('Add') : this.props.t('Save')}\n </Button>\n <Button\n variant=\"contained\"\n onClick={() => this.props.onClose()}\n color=\"grey\"\n startIcon={<CloseIcon />}\n >\n {this.props.t('Close')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n}\n\nEditIntroLinkDialog.propTypes = {\n t: PropTypes.func.isRequired,\n socket: PropTypes.object.isRequired,\n lang: PropTypes.string.isRequired,\n open: PropTypes.bool.isRequired,\n link: PropTypes.object.isRequired,\n onClose: PropTypes.func.isRequired,\n isNew: PropTypes.bool,\n};\n\nexport default withStyles(styles)(EditIntroLinkDialog);","import { Component } from 'react';\n\nimport PropTypes from 'prop-types';\nimport semver from 'semver';\n\nimport { withStyles } from '@mui/styles';\n\nimport { Fab, Snackbar, Tooltip, Grid, LinearProgress, Skeleton } from '@mui/material';\n\nimport AddIcon from '@mui/icons-material/Add';\nimport CheckIcon from '@mui/icons-material/Check';\nimport CloseIcon from '@mui/icons-material/Close';\nimport CreateIcon from '@mui/icons-material/Create';\n\nimport UtilsCommon from '@iobroker/adapter-react-v5/Components/Utils';\n\nimport Utils from '../Utils';\nimport IntroCard from '../components/IntroCard';\nimport TabContainer from '../components/TabContainer';\nimport TabContent from '../components/TabContent';\nimport EditIntroLinkDialog from '../dialogs/EditIntroLinkDialog';\n\nconst styles = theme => ({\n root: {\n width: '100%',\n height: '100%'\n },\n button: {\n position: 'absolute',\n bottom: theme.spacing(2),\n right: theme.spacing(2),\n },\n saveButton: {\n backgroundColor: theme.palette.success.main,\n right: theme.spacing(10),\n '&:hover': {\n backgroundColor: theme.palette.success.dark\n }\n },\n addButton: {\n backgroundColor: theme.palette.secondary.main,\n right: theme.spacing(18),\n '&:hover': {\n backgroundColor: theme.palette.secondary.dark\n }\n },\n closeButton: {\n backgroundColor: theme.palette.error.main,\n '&:hover': {\n backgroundColor: theme.palette.error.dark\n }\n },\n bold: {\n fontWeight: 'bold'\n },\n container: {\n overflowY: 'auto'\n },\n hostOffline: {\n color: '#bb0000'\n },\n updateExists: {\n color: '#c28700',\n marginRight: 4,\n },\n updateNo: {\n color: '#00b204',\n marginRight: 4,\n },\n nodeUpdate: {\n opacity: 0.6,\n },\n instanceNumber: {\n opacity: 0.7,\n fontSize: 16,\n }\n});\n\nconst formatInfo = {\n 'Uptime': Utils.formatSeconds,\n 'System uptime': Utils.formatSeconds,\n 'RAM': Utils.formatRam,\n 'Speed': Utils.formatSpeed,\n 'Disk size': Utils.formatBytes,\n 'Disk free': Utils.formatBytes\n};\n\nclass Intro extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n instances: null,\n deactivated: {},\n edit: false,\n\n introLinks: [],\n editLink: false,\n editLinkIndex: -1,\n openSnackBar: false,\n hasUnsavedChanges: false,\n reverseProxy: null,\n alive: {},\n hostsData: {}\n };\n\n this.currentProxyPath = window.location.pathname; // e.g. /admin/\n this.promises = {};\n\n this.introLinksOriginal = null;\n this.deactivatedOriginal = null;\n\n this.t = props.t;\n }\n\n componentDidMount() {\n this.getData()\n .then(() => {\n this.props.instancesWorker.registerHandler(this.getDataDelayed);\n this.props.hostsWorker.registerHandler(this.updateHosts);\n this.props.hostsWorker.registerAliveHandler(this.updateHostsAlive);\n // read reverse proxy settings\n this.props.socket.getObject('system.adapter.' + this.props.adminInstance)\n .then(obj =>\n this.setState({ reverseProxy: obj?.native?.reverseProxy || [] }));\n });\n }\n\n componentWillUnmount() {\n this.getDataTimeout && clearTimeout(this.getDataTimeout);\n\n this.props.instancesWorker.unregisterHandler(this.getDataDelayed);\n this.props.hostsWorker.unregisterHandler(this.updateHosts);\n this.props.hostsWorker.unregisterAliveHandler(this.updateHostsAlive);\n }\n\n updateHostsAlive = events => {\n let alive = JSON.parse(JSON.stringify(this.state.alive));\n let hostsId = [];\n\n // if some host deleted\n if (events.find(event => event.type === 'delete')) {\n // get all information anew\n return this.getDataDelayed();\n } else {\n // update alive status\n events.forEach(event => {\n if ((!!alive[event.id]) !== (!!event.alive)) {\n alive[event.id] = event.alive;\n hostsId.push(event.id);\n }\n });\n }\n\n if (hostsId.length) {\n const hostsData = JSON.parse(JSON.stringify(this.state.hostsData));\n\n Promise.all(hostsId.map(id => this.getHostData(id, alive[id])))\n .then(results => {\n results.forEach(res => hostsData[res.id] = res.data);\n this.setState({ alive, hostsData });\n });\n }\n };\n\n updateHosts = (events, obj) => {\n if (!Array.isArray(events)) {\n events = [{ id: events, obj, type: obj ? 'changed' : 'delete' }];\n }\n let hostsId = [];\n\n // if host deleted\n if (events.find(event => !event.obj)) {\n return this.getDataDelayed();\n } else {\n hostsId = events.map(event => event.id);\n }\n if (hostsId.length) {\n const hostsData = JSON.parse(JSON.stringify(this.state.hostsData));\n\n Promise.all(hostsId.map(id => this.getHostData(id)))\n .then(results => {\n results.forEach(res => hostsData[res.id] = res.data);\n this.setState({ hostsData });\n });\n }\n };\n\n activateEditMode() {\n let systemConfig;\n this.props.socket.getSystemConfig(true)\n .then(_systemConfig => {\n systemConfig = _systemConfig;\n return this.getInstances(true, null, systemConfig);\n })\n .then(data => {\n const introLinks = systemConfig && systemConfig.native && systemConfig.native.introLinks ? systemConfig.native.introLinks : [];\n\n this.introLinksOriginal = JSON.parse(JSON.stringify(introLinks));\n this.deactivatedOriginal = JSON.parse(JSON.stringify(data.deactivated));\n\n this.setState({\n instances: data.instances,\n deactivated: data.deactivated,\n edit: true,\n introLinks,\n hasUnsavedChanges: false,\n });\n });\n }\n\n deactivateEditMode() {\n if (!this.state.hasUnsavedChanges) {\n // todo: implement confirmation dialog\n }\n\n // restore old state\n this.setState({\n deactivated: this.deactivatedOriginal,\n introLinks: this.introLinksOriginal,\n hasUnsavedChanges: false,\n edit: false\n }, () => {\n this.deactivatedOriginal = null;\n this.introLinksOriginal = null;\n });\n }\n\n toggleCard(id, linkName) {\n if (!this.state.instances || !this.state.instances.length) {\n return;\n }\n\n const deactivated = JSON.parse(JSON.stringify(this.state.deactivated));\n\n const pos = deactivated.indexOf(`${id}_${linkName}`);\n\n if (pos !== -1) {\n deactivated.splice(pos, 1);\n } else {\n deactivated.push(`${id}_${linkName}`);\n deactivated.sort();\n }\n\n const hasUnsavedChanges = JSON.stringify(deactivated) !== JSON.stringify(this.deactivatedOriginal) ||\n JSON.stringify(this.state.introLinks) !== JSON.stringify(this.introLinksOriginal);\n\n this.setState({ deactivated, hasUnsavedChanges });\n }\n\n getInstancesCards() {\n return this.state.instances.map(instance => {\n const enabled = !this.state.deactivated.includes(`${instance.id}_${instance.linkName}`);\n if (enabled || this.state.edit) {\n let linkText = instance.link ? instance.link.replace(/^https?:\\/\\//, '') : '';\n const pos = linkText.indexOf('/');\n if (pos !== -1) {\n linkText = linkText.substring(0, pos);\n }\n\n let isShowInstance = isFinite(instance.id.split('.').pop());\n if (isShowInstance) {\n // try to find second instance of same type\n isShowInstance = !!this.state.instances.find(inst =>\n inst.id !== instance.id && instance.name === inst.name && instance.id.split('.')[0] === inst.id.split('.')[0]);\n }\n\n const hostData = this.state.hostsData ? this.state.hostsData[instance.id] : null;\n\n return <IntroCard\n key={`${instance.id}_${instance.link}`}\n socket={this.props.socket}\n image={instance.image}\n title={<><span>{instance.name}</span>{isShowInstance ? <span className={this.props.classes.instanceNumber}>.{instance.id.split('.').pop()}</span> : null}</>}\n action={{ link: instance.link, text: linkText }}\n t={this.props.t}\n lang={this.props.lang}\n color={instance.color}\n reveal={instance.info}\n edit={this.state.edit}\n reverseProxy={this.state.reverseProxy}\n offline={hostData && hostData.alive === false}\n enabled={enabled}\n disabled={!hostData || typeof hostData !== 'object'}\n getHostDescriptionAll={() => this.getHostDescriptionAll(instance.id)}\n toggleActivation={() => this.toggleCard(instance.id, instance.linkName)}\n openSnackBarFunc={() => this.setState({ openSnackBar: true })}\n >\n { instance.description || this.getHostDescription(instance.id)}\n </IntroCard>;\n } else {\n return null;\n }\n });\n }\n\n toggleLinkCard(i) {\n const introLinks = JSON.parse(JSON.stringify(this.state.introLinks));\n\n introLinks[i].enabled = !introLinks[i].enabled;\n\n const hasUnsavedChanges = JSON.stringify(this.state.deactivated) !== JSON.stringify(this.deactivatedOriginal) ||\n JSON.stringify(introLinks) !== JSON.stringify(this.introLinksOriginal);\n\n this.setState({ introLinks, hasUnsavedChanges });\n }\n\n getLinkCards() {\n return this.state.introLinks.map((item, i) => {\n if (!item.enabled && !this.state.edit) {\n return null;\n } else {\n return <IntroCard\n key={'link' + i}\n image={item.image}\n title={item.name}\n action={{ link: item.link, text: item.linkName }}\n t={this.props.t}\n socket={this.props.socket}\n color={item.color}\n edit={this.state.edit}\n interval={item.interval}\n camera={item.camera}\n addTs={item.addTs}\n\n onEdit={() => this.setState({\n editLink: true,\n editLinkIndex: i,\n link: JSON.parse(JSON.stringify(this.state.introLinks[i]))\n })}\n\n onRemove={() => {\n const introLinks = JSON.parse(JSON.stringify(this.state.introLinks));\n introLinks.splice(i, 1);\n const hasUnsavedChanges = JSON.stringify(this.state.deactivated) !== JSON.stringify(this.deactivatedOriginal) ||\n JSON.stringify(introLinks) !== JSON.stringify(this.introLinksOriginal);\n this.setState({ introLinks, hasUnsavedChanges });\n }}\n\n enabled={item.enabled}\n toggleActivation={() => this.toggleLinkCard(i)}\n >\n { item.desc || ''}\n </IntroCard>;\n }\n });\n }\n\n editLinkCard() {\n if (this.state.editLink) {\n return <EditIntroLinkDialog\n open={this.state.editLink}\n link={this.state.link}\n socket={this.props.socket}\n isNew={this.state.editLinkIndex === -1}\n t={this.props.t}\n lang={this.props.lang}\n onClose={link => {\n if (link) {\n const introLinks = JSON.parse(JSON.stringify(this.state.introLinks));\n if (this.state.editLinkIndex === -1) {\n link.enabled = true;\n introLinks.push(link);\n } else {\n link.enabled = introLinks[this.state.editLinkIndex].enabled;\n introLinks[this.state.editLinkIndex] = link;\n }\n const hasUnsavedChanges = JSON.stringify(this.state.deactivated) !== JSON.stringify(this.deactivatedOriginal) ||\n JSON.stringify(introLinks) !== JSON.stringify(this.introLinksOriginal);\n\n this.setState({ introLinks, editLink: false, hasUnsavedChanges, link: null });\n } else {\n this.setState({ editLink: false });\n }\n }} />;\n } else {\n return null;\n }\n }\n\n getButtons(classes) {\n const buttons = [];\n\n if (this.state.edit) {\n buttons.push(<Fab\n key=\"add\"\n color=\"primary\"\n className={`${classes.button} ${classes.addButton}`}\n onClick={() =>\n this.setState({\n editLink: true,\n editLinkIndex: -1,\n link: {}\n })}\n >\n <AddIcon />\n </Fab>);\n\n buttons.push(<Fab\n key=\"save\"\n color=\"primary\"\n disabled={!this.state.hasUnsavedChanges}\n className={`${classes.button} ${classes.saveButton}`}\n onClick={() => this.saveCards()}\n >\n <CheckIcon />\n </Fab>);\n\n buttons.push(<Fab\n key=\"close\"\n color=\"primary\"\n className={`${classes.button} ${classes.closeButton}`}\n onClick={() => this.deactivateEditMode()}\n >\n <CloseIcon />\n </Fab>);\n } else {\n buttons.push(<Fab\n color=\"primary\"\n key=\"edit\"\n className={classes.button}\n onClick={() => this.activateEditMode()}\n >\n <CreateIcon />\n </Fab>);\n }\n\n return buttons;\n }\n\n saveCards() {\n return this.props.socket.getSystemConfig(true)\n .then(systemConfig => {\n let changed = false;\n\n if (JSON.stringify(systemConfig.common.intro) !== JSON.stringify(this.state.deactivated)) {\n systemConfig.common.intro = this.state.deactivated;\n changed = true;\n }\n\n if (!changed && JSON.stringify(systemConfig.native.introLinks) !== JSON.stringify(this.state.introLinks)) {\n changed = true;\n systemConfig.native.introLinks = this.state.introLinks;\n }\n\n if (changed) {\n this.props.socket.setSystemConfig(systemConfig)\n .then(() => this.props.showAlert('Updated', 'success'))\n .catch(error => {\n console.log(error);\n this.props.showAlert(error, 'error');\n })\n .then(() => this.setState({ edit: false }));\n } else {\n this.setState({ edit: false });\n }\n });\n }\n\n getHostData(hostId, isAlive) {\n return new Promise((resolve, reject) => {\n if (isAlive !== undefined) {\n return resolve({ val: isAlive });\n } else {\n return this.props.socket.getState(hostId + '.alive')\n .then(state => resolve(state))\n .catch(e => reject(e));\n }\n })\n .then(alive => {\n if (alive && alive.val) {\n return this.props.socket.getHostInfo(hostId, false, 10000);\n } else {\n return { alive: false };\n }\n })\n .catch(error => {\n console.error(error);\n return error;\n })\n .then(data => {\n if (data && typeof data === 'object' && data.alive !== false) {\n data.alive = true;\n }\n\n return this.props.socket.getForeignStates(`${hostId}.versions.*`)\n .then(states => {\n Object.keys(states).forEach(id =>\n data['_' + id.split('.').pop()] = states[id].val);\n return data;\n });\n })\n .then(data =>\n ({ id: hostId, data }));\n }\n\n getHostsData(hosts) {\n const promises = hosts.map(obj => this.getHostData(obj._id));\n\n return Promise.all(promises)\n .then(results => {\n const hostsData = {};\n const alive = {};\n results.forEach(res => {\n hostsData[res.id] = res.data;\n alive[res.id] = res.data.alive;\n });\n return { hostsData, alive };\n });\n }\n\n applyReverseProxy(webReverseProxyPath, instances, instance) {\n webReverseProxyPath && webReverseProxyPath.paths.forEach(item => {\n if (item.instance === instance.id) {\n instance.link = item.path;\n } else if (item.instance.startsWith('web.')) {\n // if this is a web instance, check if it is the same as the current instance\n const _obj = instances.find(o => o._id === `system.adapter.${item.instance}`);\n if (_obj?.native?.port && (instance.link || instance.url).includes(':' + _obj.native.port)) {\n // replace\n const regExp = new RegExp(`^.*:${_obj.native.port}/`);\n if (instance.link) {\n instance.link = instance.link.replace(regExp, item.path);\n } else if (instance.url) {\n instance.url = instance.url.replace(regExp, item.path);\n }\n console.log(instance.link || instance.url);\n }\n }\n });\n }\n\n addLinks(link, common, instanceId, instance, objects, hosts, instances, introInstances) {\n const _urls = Utils.replaceLink(link, common.name, instanceId, {\n objects,\n hostname: this.props.hostname,\n protocol: this.props.protocol,\n port: this.props.port,\n adminInstance: this.props.adminInstance,\n hosts,\n }) || [];\n\n let webReverseProxyPath;\n if (this.state.reverseProxy && this.state.reverseProxy.length) {\n webReverseProxyPath = this.state.reverseProxy.find(item => item.globalPath === this.currentProxyPath);\n }\n if (_urls.length === 1) {\n instance.link = _urls[0].url;\n instance.port = _urls[0].port;\n\n this.applyReverseProxy(webReverseProxyPath, instances, instance);\n\n // if link already exists => ignore\n const lll = introInstances.find(item => item.link === instance.link);\n if (!lll) {\n introInstances.push(instance);\n } else {\n console.log(`Double links: \"${instance.id}\" and \"${lll.id}\"`);\n }\n } else if (_urls.length > 1) {\n _urls.forEach(url => {\n const lll = introInstances.find(item => item.link === url.url);\n this.applyReverseProxy(webReverseProxyPath, instances, url);\n\n if (!lll) {\n introInstances.push({...instance, link: url.url, port: url.port});\n } else {\n console.log(`Double links: \"${instance.id}\" and \"${lll.id}\"`);\n }\n });\n }\n }\n\n getInstances(update, hosts, systemConfig) {\n hosts = hosts || this.state.hosts;\n\n return this.props.socket.getAdapterInstances('', update)\n .then(instances => {\n let deactivated = systemConfig.common.intro || [];\n if (!Array.isArray(deactivated)) {\n deactivated = Object.keys(deactivated);\n deactivated.sort();\n }\n const introInstances = [];\n const objects = {};\n instances.forEach(obj => objects[obj._id] = obj);\n\n instances.sort((a, b) => {\n a = a && a.common;\n b = b && b.common;\n a = a || {};\n b = b || {};\n\n if (a.order === undefined && b.order === undefined) {\n if (a.name.toLowerCase() > b.name.toLowerCase()) return 1;\n if (a.name.toLowerCase() < b.name.toLowerCase()) return -1;\n return 0;\n } else if (a.order === undefined) {\n return -1;\n } else if (b.order === undefined) {\n return 1;\n } else {\n if (a.order > b.order) return 1;\n if (a.order < b.order) return -1;\n if (a.name.toLowerCase() > b.name.toLowerCase()) return 1;\n if (a.name.toLowerCase() < b.name.toLowerCase()) return -1;\n return 0;\n }\n });\n\n instances.forEach(obj => {\n if (!obj) {\n return;\n }\n const common = obj.common || null;\n const objId = obj._id.split('.');\n const instanceId = objId.pop();\n\n if (common.name && common.name === 'admin' && common.localLink === (this.props.hostname || '')) {\n return;\n } else if (common.name && common.name === 'web') {\n return;\n } else if (common.name && common.name !== 'vis-web-admin' && common.name.match(/^vis-/)) {\n return;\n } else if (common.name && common.name.match(/^icons-/)) {\n return;\n } else if (common && (common.enabled || common.onlyWWW) && (common.localLinks || common.localLink)) {\n let links = common.localLinks || common.localLink || '';\n if (typeof links === 'string') {\n links = { _default: links };\n }\n\n Object.keys(links).forEach(linkName => {\n let link = links[linkName];\n const instance = {};\n if (typeof link === 'string') {\n link = { link };\n }\n\n instance.id = obj._id.replace('system.adapter.', '') + (linkName === '_default' ? '' : ' ' + linkName);\n instance.name = (common.titleLang ? common.titleLang[this.props.lang] || common.titleLang.en : common.title) + (linkName === '_default' ? '' : ' ' + linkName);\n instance.color = link.color || '';\n instance.description = common.desc && typeof common.desc === 'object' ? (common.desc[this.props.lang] || common.desc.en) : common.desc || '';\n instance.image = common.icon ? `adapter/${common.name}/${common.icon}` : 'img/no-image.png';\n\n /*let protocol = this.props.protocol;\n let port = this.props.port;\n let hostname = Intro.getHostname(obj, objects, hosts, this.props.hostname, this.adminInstance);\n\n if (!hostname) {\n return;\n }*/\n this.addLinks(link.link, common, instanceId, instance, objects, hosts, instances, introInstances);\n });\n }\n if (common && (common.enabled || common.onlyWWW) && common.name !== 'admin' && (common.welcomeScreen || common.welcomeScreenPro)) {\n let links = [];\n common.welcomeScreen && links.push(common.welcomeScreen);\n common.welcomeScreenPro && links.push(common.welcomeScreenPro);\n\n links.forEach(link => {\n const instance = {};\n instance.id = obj._id.replace('system.adapter.', '') + '/' + link.link;\n instance.name = link.name && typeof link.name === 'object' ? (link.name[this.props.lang] || link.name.en) : link.name || '';\n instance.color = link.color || '';\n instance.description = common.desc && typeof common.desc === 'object' ? (common.desc[this.props.lang] || common.desc.en) : common.desc || '';\n instance.image = common.icon ? `adapter/${common.name}/${common.icon}` : 'img/no-image.png';\n instance.order = link.order;\n\n this.addLinks(`%web_protocol%://%web_bind%:%web_port%/${link.link}`, common, instanceId, instance, objects, hosts, instances, introInstances);\n });\n }\n });\n\n introInstances.forEach(instance => {\n if (instance.link) {\n instance.linkName = instance.link.replace('https://', '').replace('http://', '').replace(/^[^_]+:/, '');\n }\n });\n\n introInstances.sort((a, b) => {\n if (a.order !== undefined || b.order !== undefined) {\n a.order = a.order === undefined ? 1000 : a.order;\n b.order = b.order === undefined ? 1000 : b.order;\n if (a.order < b.order) {\n return -1;\n } else if (a.order > b.order) {\n return 1;\n }\n }\n\n if (a.id > b.id) {\n return 1;\n }\n if (a.id < b.id) {\n return -1;\n }\n return 0;\n })\n\n Object.keys(hosts).forEach(key => {\n const obj = hosts[key];\n const common = obj && obj.common;\n\n if (common) {\n const instance = {};\n instance.id = obj._id;\n instance.name = common.name && typeof common.name === 'object' ? (common.name[this.props.lang] || common.name.en) : (common.name || '');\n instance.color = '';\n instance.image = common.icon || 'img/no-image.png';\n instance.info = this.t('Info');\n instance.linkName = '';\n\n introInstances.push(instance);\n }\n });\n\n const _deactivated = [];\n deactivated.forEach(id => {\n if (introInstances.find(instance => id === `${instance.id}_${instance.linkName}`)) {\n _deactivated.push(id);\n }\n });\n deactivated = _deactivated;\n\n return { instances: introInstances, deactivated };\n })\n .catch(error => {\n console.log(error);\n return { instances: [], deactivated: [] };\n });\n }\n\n getHostDescription(id) {\n const { classes } = this.props;\n const hostData = this.state.hostsData ? this.state.hostsData[id] : null;\n\n if (hostData && hostData.alive === false) {\n return <div className={this.props.classes.hostOffline}>{this.props.t('Offline')}</div>;\n }\n\n let nodeUpdate = '';\n let npmUpdate = '';\n if (hostData) {\n try {\n if (hostData['_nodeNewest'] && hostData['Node.js'] && semver.gt(hostData['_nodeNewest'], hostData['Node.js'].replace(/^v/, ''))) {\n nodeUpdate = hostData['_nodeNewest'];\n }\n } catch (e) {\n // ignore\n }\n try {\n if (hostData['_nodeNewest'] !== hostData['_nodeNewestNext'] &&\n hostData['_nodeNewestNext'] &&\n hostData['Node.js'] &&\n hostData['_nodeNewest'] &&\n semver.gt(hostData['_nodeNewestNext'], hostData['Node.js'].replace(/^v/, '')) &&\n semver.gt(hostData['_nodeNewestNext'], hostData['_nodeNewest'])\n ) {\n nodeUpdate += (nodeUpdate ? ' / ' : '') + hostData['_nodeNewestNext'];\n }\n } catch (e) {\n // ignore\n }\n if (nodeUpdate) {\n nodeUpdate = <Tooltip title={this.props.t('Some updates available')}><span className={this.props.classes.nodeUpdate}>({nodeUpdate})</span></Tooltip>;\n }\n\n try {\n if (hostData['_npmNewest'] && hostData['NPM'] && semver.gt(hostData['_npmNewest'], hostData['NPM'])) {\n npmUpdate = hostData['_npmNewest'];\n }\n } catch (e) {\n // ignore\n }\n try {\n if (hostData['_npmNewest'] !== hostData['_npmNewestNext'] &&\n hostData['_npmNewestNext'] &&\n hostData['NPM'] &&\n hostData['_npmNewest'] &&\n semver.gt(hostData['_npmNewestNext'], hostData['NPM']) &&\n semver.gt(hostData['_npmNewestNext'], hostData['_npmNewest'])\n ) {\n npmUpdate += (npmUpdate ? ' / ' : '') + hostData['_npmNewestNext'];\n }\n } catch (e) {\n // ignore\n }\n if (npmUpdate) {\n npmUpdate = <Tooltip title={this.props.t('Some updates available')}><span className={this.props.classes.nodeUpdate}>({npmUpdate})</span></Tooltip>;\n }\n }\n\n return hostData && typeof hostData === 'object' ?\n <ul style={{ textTransform: 'none'}}>\n <li>\n <span>\n <span className={classes.bold}>{this.t('Platform')}: </span>\n {hostData['Platform'] || '--'}\n </span>\n </li>\n <li>\n <span>\n <span className={classes.bold}>{this.t('RAM')}: </span>\n {formatInfo['RAM'](hostData['RAM'])}\n </span>\n </li>\n <li>\n <span>\n <span className={classes.bold}>{this.t('Node.js')}: </span>\n <span className={UtilsCommon.clsx(nodeUpdate ? this.props.classes.updateExists : this.props.classes.updateNo)}>{hostData['Node.js'] || '--'}</span>\n {nodeUpdate}\n </span>\n </li>\n <li>\n <span>\n <span className={classes.bold}>{this.t('NPM')}: </span>\n <span className={UtilsCommon.clsx(npmUpdate ? this.props.classes.updateExists : this.props.classes.updateNo)}>{hostData['NPM'] || '--'}</span>\n {npmUpdate}\n </span>\n </li>\n </ul>\n :\n <ul>\n <Skeleton />\n <Skeleton />\n <Skeleton />\n <Skeleton />\n </ul>;\n }\n\n getHostDescriptionAll(id) {\n const { classes } = this.props;\n const hostData = this.state.hostsData ? this.state.hostsData[id] : null;\n\n return [\n <ul style={{ textTransform: 'none'}}>\n {hostData && typeof hostData === 'object' && Object.keys(hostData)\n .filter(id => !id.startsWith('_'))\n .map(value => <li key={value}>\n {hostData && typeof hostData === 'object' ?\n <span>\n <span className={classes.bold}>{this.t(value)}: </span>\n {(formatInfo[value] ? formatInfo[value](hostData[value], this.t) : hostData[value] || '--')}\n </span>\n :\n <Skeleton />\n }\n </li>)\n }\n </ul>,\n hostData && typeof hostData === 'object' && Object.keys(hostData).reduce((acom, item) => acom + `${this.t(item)}:${(formatInfo[item] ? formatInfo[item](hostData[item], this.t) : hostData[item] || '--')}\\n`)\n ];\n }\n\n getDataDelayed = () => {\n this.getDataTimeout && clearTimeout(this.getDataTimeout);\n this.getDataTimeout = setTimeout(() => {\n this.getDataTimeout = null;\n this.getData(true);\n }, 300);\n }\n\n getData(update) {\n let hosts;\n let systemConfig;\n\n return this.props.socket.getSystemConfig(update)\n .then(_systemConfig => {\n systemConfig = _systemConfig;\n return this.props.socket.getCompactHosts(update);\n })\n .then(_hosts => {\n hosts = _hosts;\n return this.getInstances(update, hosts, systemConfig);\n })\n .then(data => {\n this.setState({\n instances: data.instances,\n hosts,\n deactivated: data.deactivated,\n introLinks: systemConfig && systemConfig.native && systemConfig.native.introLinks ? systemConfig.native.introLinks : []\n });\n // hosts data could last a long time, so show some results to user now and then get the info about hosts\n return this.getHostsData(hosts);\n })\n .then(newState =>\n new Promise(resolve =>\n this.setState(newState, () =>\n resolve())))\n .catch(error => window.alert(`Cannot get data: ${error}`));\n }\n\n render() {\n if (!this.state.instances) {\n return <LinearProgress />;\n }\n\n const { classes } = this.props;\n\n return <TabContainer\n elevation={0}\n overflow=\"visible\"\n >\n <Snackbar\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n open={this.state.openSnackBar}\n autoHideDuration={3000}\n onClose={() => this.setState({ openSnackBar: false })}\n message={this.t('copied')}\n />\n <TabContent classes={{ root: classes.container }}>\n <Grid container spacing={2}>\n {this.getInstancesCards()}\n {this.getLinkCards()}\n </Grid>\n {this.getButtons(classes)}\n {this.editLinkCard()}\n </TabContent>\n </TabContainer>;\n }\n}\n\nIntro.propTypes = {\n /**\n * Link and text\n * {link: 'https://example.com', text: 'example.com'}\n */\n action: PropTypes.object,\n children: PropTypes.node,\n color: PropTypes.string,\n edit: PropTypes.bool,\n enabled: PropTypes.bool,\n socket: PropTypes.object,\n image: PropTypes.string,\n reveal: PropTypes.node,\n title: PropTypes.string,\n t: PropTypes.func,\n lang: PropTypes.string,\n toggleActivation: PropTypes.func,\n instancesWorker: PropTypes.object,\n hostsWorker: PropTypes.object,\n\n hostname: PropTypes.string,\n protocol: PropTypes.string,\n port: PropTypes.number,\n adminInstance: PropTypes.string,\n};\n\nexport default withStyles(styles)(Intro);","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _jsxRuntime = require(\"react/jsx-runtime\");\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/(0, _jsxRuntime.jsx)(\"path\", {\n d: \"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34a.9959.9959 0 0 0-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z\"\n}), 'Create');\n\nexports.default = _default;"],"sourceRoot":""}