3 lines
381 KiB
JavaScript
3 lines
381 KiB
JavaScript
"use strict";Array.prototype.remove=function(){for(var e,t,n=arguments,i=n.length;i&&this.length;)for(e=n[--i];-1!==(t=this.indexOf(e));)this.splice(t,1);return this},console.debug||(console.debug=console.log),"undefined"==typeof Number&&(console.log("define Number"),Number=function(e){return parseFloat(e)}),Object.assign||(Object.assign=$.extend);var $iframeDialog=null,configNotSaved=null,showConfig=null,defaults={},customPostInits={},FORBIDDEN_CHARS=/[\]\[*,;'"`<>\\\s?]/g,adapterRedirect=function(e,t){e&&setTimeout(function(){e+=document.location.pathname,e+=document.location.hash,document.location.href=e},t||5e3)},gMain=null;function detectIE(){var e=window.navigator.userAgent,t=e.indexOf("MSIE ");if(0<t)return parseInt(e.substring(t+5,e.indexOf(".",t)),10);if(0<e.indexOf("Trident/")){var n=e.indexOf("rv:");return parseInt(e.substring(n+3,e.indexOf(".",n)),10)}var i=e.indexOf("Edge/");return 0<i&&parseInt(e.substring(i+5,e.indexOf(".",i)),10)}function Adapters(e){var H=this;function t(){H.$grid.show(),H.$tiles.html("").hide(),H.$tab.find("#main-toolbar-table-types-btn").hide(),H.$grid.data("inited")?(H.$tab.find("#btn_collapse_adapters").show(),H.$tab.find("#btn_expand_adapters").show(),H.$tab.find("#btn_list_adapters").show()):(H.$grid.data("inited",!0),H.$grid.fancytree({extensions:["table","gridnav","filter","themeroller"],checkbox:!1,strings:{noData:_("No data")},table:{indentation:5},show:function(e,t,n){H.sortTree()},source:H.tree,renderColumns:function(e,t){var n=t.node,i=$(n.tr).find(">td"),a=H.data[n.key];function s(e){return'<div class="text-ellipsis">'+e+"</div>"}if(a){i.eq(0).css({overflow:"hidden","white-space":"nowrap"});var o=a.desc.indexOf("<div"),r=0<=o?a.desc.substr(0,o):a.desc;i.eq(1).html(s(a.desc)).attr("title",r).css({"white-space":"nowrap",position:"relative","font-weight":a.bold?"bold":null}).find(">div>div").css("height: 22px !important"),u(2,a.keywords).attr("title",a.keywords),i.eq(3).html(a.installed),i.eq(4).html(a.version),u(5,a.license),u(6,a.install),H.initButtons(n.key),H.isCollapsed[a.group]&&(H.isCollapsed[a.group]=!1,H.main.saveConfig("adaptersIsCollapsed",JSON.stringify(H.isCollapsed)))}else{i.eq(0).css({"font-weight":"bold"}),i.eq(0).find("img").remove(),i.eq(0).find("span.fancytree-title").attr("style","padding-left: 0px !important");for(var c=0;c<H.tree.length;c++)if(H.tree[c].key===n.key){i.eq(1).html(H.tree[c].desc||"").css({overflow:"hidden","white-space":"nowrap",position:"relative"});for(var l=0,d=0;d<H.tree[c].children.length;d++)H.data[H.tree[c].children[d].key].installed&&l++;H.tree[c].installed=l,n.data.installed=l,'[<span title="'+_("Installed from group")+'">'+l+'</span> / <span title="'+_("Total count in group")+'">'+H.tree[c].children.length+"</span>]",i.eq(1).html(s('<span class="dark-green">'+l+"</span> "+_("of")+'<span class="dark-blue"> '+H.tree[c].children.length+"</span> "+_("Adapters from this Group installed")));break}}function u(e,t){return i.eq(e).html(s(t))}},gridnav:{autofocusInput:!1,handleCursorKeys:!0},filter:{mode:"hide",autoApply:!0},collapse:function(e,t){H.isCollapsed[t.node.key]||(H.isCollapsed[t.node.key]=!0,H.main.saveConfig("adaptersIsCollapsed",JSON.stringify(H.isCollapsed)))}}),H.$tab.find("#btn_collapse_adapters").show().off("click").on("click",function(){H.$tab.find(".process-adapters").show(),setTimeout(function(){H.$grid.fancytree("getRootNode").visit(function(e){(!H.filterVals.length||e.match||e.subMatch)&&e.setExpanded(!1)}),H.$tab.find(".process-adapters").hide()},100)}),H.$tab.find("#btn_expand_adapters").show().off("click").on("click",function(){H.$tab.find(".process-adapters").show(),setTimeout(function(){H.$grid.fancytree("getRootNode").visit(function(e){(!H.filterVals.length||e.match||e.subMatch)&&e.setExpanded(!0)}),H.$tab.find(".process-adapters").hide()},100)}),H.$tab.find("#btn_list_adapters").show().off("click").on("click",function(){var e=H.$tab.find(".process-adapters");e.show(),H.isList=!H.isList,H.isList?(H.$tab.find("#btn_list_adapters").addClass("red lighten-3"),H.$tab.find("#btn_expand_adapters").hide(),H.$tab.find("#btn_collapse_adapters").hide(),$(this).attr("title",_("list"))):(H.$tab.find("#btn_list_adapters").removeClass("red lighten-3"),H.$tab.find("#btn_expand_adapters").show(),H.$tab.find("#btn_collapse_adapters").show(),$(this).attr("title",_("tree"))),H.main.saveConfig("adaptersIsList",H.isList),e.show(),setTimeout(function(){H._postInit(!0),e.hide()},200)})),H.isList?(H.$tab.find("#btn_list_adapters").addClass("red lighten-3").attr("title",_("tree")),H.$tab.find("#btn_expand_adapters").hide(),H.$tab.find("#btn_collapse_adapters").hide()):(H.$tab.find("#btn_list_adapters").removeClass("red lighten-3").attr("title",_("list")),H.$tab.find("#btn_expand_adapters").show(),H.$tab.find("#btn_collapse_adapters").show()),H.$tab.find(".filter-input").trigger("change")}function n(){H.$grid.hide(),H.$tiles.show(),H.$tab.find("#main-toolbar-table-types-btn").show(),H.$tab.find("#btn_list_adapters").hide(),H.$tab.find("#btn_collapse_adapters").hide(),H.$tab.find("#btn_expand_adapters").hide(),H.$tab.find(".filter-input").trigger("change")}function i(){H.onlyUpdatable?(H.$tab.find("#btn_filter_updates").addClass("red lighten-3"),H.$tab.find("#btn_upgrade_all").show()):(H.$tab.find("#btn_upgrade_all").hide(),H.$tab.find("#btn_filter_updates").removeClass("red lighten-3"))}function a(){H.main.config.expertMode?(H.$tab.find("#btn_adapters_expert_mode").addClass("red lighten-3"),H.$tab.find("#btn_upgrade_all").show()):(H.$tab.find("#btn_adapters_expert_mode").removeClass("red lighten-3"),i())}function B(){var t=!1;H.currentFilter?H.$tiles.find(".tile").each(function(){var e=$(this);(!H.currentType||e.hasClass("class-"+H.currentType))&&G({key:e.data("id")})?(t=!0,e.show()):e.hide()}):H.currentType?(H.$tiles.find(".tile").hide(),H.$tiles.find(".class-"+H.currentType).show(),H.$tiles.find(".tile").each(function(){if($(this).is(":visible"))return!(t=!0)})):H.$tiles.find(".tile").show().each(function(){if($(this).is(":visible"))return!(t=!0)}),t?H.$tiles.find(".filtered-out").hide():H.$tiles.find(".filtered-out").show()}function G(e){if(H.currentFilter){if(!H.data[e.key])return!1;var t=H.data[e.key].title;t&&"object"==typeof t&&(t=t[systemLang]||t.en);var n=H.data[e.key].desc;return n&&"object"==typeof n&&(n=n[systemLang]||n.en),!!(H.data[e.key].name&&-1!==H.data[e.key].name.toLowerCase().indexOf(H.currentFilter)||t&&-1!==t.toLowerCase().indexOf(H.currentFilter)||H.data[e.key].keywords&&-1!==H.data[e.key].keywords.toLowerCase().indexOf(H.currentFilter)||n&&-1!==n.toLowerCase().indexOf(H.currentFilter))}return!0}function F(e,t){var n="";if(t.news)for(var i in t.news)if(t.news.hasOwnProperty(i)){if(systemLang===i&&(n+=(n?"\n":"")+t.news[i]),"en"===i||"cn"===i)continue;if(i===e)break;n+=(n?"\n":"")+(t.news[i][systemLang]||t.news[i].en)}return n}function Z(e){if(!e)return"";var t;if(e instanceof Array){t={};for(var n=0;n<e.length;n++)if("string"!=typeof e[n])for(var i in e[n])e[n].hasOwnProperty(i)&&(t[i]=e[n][i])}else t=e;for(var a in t)if(t.hasOwnProperty(a))if("js-controller"===a){if(!semver.satisfies(H.main.objects["system.host."+H.main.currentHost].common.installedVersion,t[a]))return _("Invalid version of %s. Required %s",a,t[a])}else{if(!H.main.objects["system.adapter."+a]||!H.main.objects["system.adapter."+a].common||!H.main.objects["system.adapter."+a].common.installedVersion)return _("No version of %s",a);if(!semver.satisfies(H.main.objects["system.adapter."+a].common.installedVersion,t[a]))return _("Invalid version of %s",a)}return""}function J(e,t,n,i,a,s,o){if(o=o||Date.now(),!e)return"";"string"!=typeof e&&"number"!=typeof e||(e=new Date(e));var r=o.getTime()-e.getTime(),c=Math.floor(r/864e5);if(0===c)return o.getDate()===e.getDate()?t:n;if(1===c)return o.getDate()-e.getDate()==1?n:a.replace("%d",c+1);var l=c%10,d=c%100;return(d<10||20<d)&&2<=l&&l<=4?a.replace("%d",c):(d<10||20<d)&&1===l?i.replace("%d",c):s.replace("%d",c)}function W(e,t,n){var i="";return t||"string"==typeof e?(t||(i+='<div class="group-upload-progress"'),!0):(n=e,e=null),n&&(i+='<table style="height: 3px; " title="'+_("Upload")+" "+n+'%" class="no-space" style="width:100%; height: 100%; opacity: 0.7"><tr style="height: 100%" class="no-space"><td class="no-space" style="width:'+n+'%;background: blue"></td><td style="width:'+(100-n)+'%;opacity: 0.1" class="no-space"></td></tr></table>'),i}this.curRepository=null,this.curRepoLastUpdate=null,this.curInstalled=null,this.curRepoLastHost=null,this.list=[],this.$tab=$("#tab-adapters"),this.$grid=this.$tab.find("#grid-adapters"),this.$tiles=this.$tab.find("#grid-adapters-tiles"),this.$installDialog=$("#dialog-install-url"),this.main=e,this.tree=[],this.data={},this.urls={},this.groupImages={"common adapters_group":"img/common.png",general_group:"img/common.png",hardware_group:"img/hardware.png",lighting_group:"img/hardware.png",energy_group:"img/hardware.png",household_group:"img/hardware.png","iot-systems_group":"img/hardware.png","climate-control_group":"img/hardware.png",infrastructure_group:"img/hardware.png",garden_group:"img/hardware.png",alarm_group:"img/hardware.png",script_group:"img/script.png",logic_group:"img/script.png",media_group:"img/media.png",multimedia_group:"img/media.png",communication_group:"img/communication.png",protocols_group:"img/communication.png",network_group:"img/communication.png",messaging_group:"img/communication.png",visualisation_group:"img/visualisation.png",visualization_group:"img/visualisation.png","visualization-icons_group":"img/visualisation.png","visualization-widgets_group":"img/visualisation.png",storage_group:"img/storage.png",weather_group:"img/weather.png",schedule_group:"img/schedule.png",vis_group:"img/vis.png","date-and-time_group":"img/service.png",geoposition_group:"img/service.png",utility_group:"img/service.png","misc-data_group":"img/service.png",service_group:"img/service.png","third-party_group":"img/service.png"},this.inited=!1,this.isList=!1,this.filterVals={length:0},this.onlyInstalled=!1,this.onlyUpdatable=!1,this.currentFilter="",this.currentType="",this.isCollapsed={},this.isTiles=!0,this.types={occ:"schedule"},this.prepare=function(){this.$tab.find("#btn_switch_adapters").off("click").on("click",function(){H.$tab.find(".process-adapters").show(),H.isTiles=!H.isTiles,H.isTiles?(H.$tab.removeClass("view-table").addClass("view-tiles"),$(this).find("i").text("view_list")):($(this).find("i").text("view_module"),H.$tab.removeClass("view-tiles").addClass("view-table")),H.main.saveConfig("adaptersIsTiles",H.isTiles),setTimeout(function(){H.isTiles?n():t(),H._postInit(!0),H.$tab.find(".process-adapters").hide()},50)}),this.$tab.find("#btn_filter_adapters").off("click").on("click",function(){H.$tab.find(".process-adapters").show(),H.onlyInstalled=!H.onlyInstalled,H.onlyInstalled?H.$tab.find("#btn_filter_adapters").addClass("red lighten-3"):H.$tab.find("#btn_filter_adapters").removeClass("red lighten-3"),H.main.saveConfig("adaptersOnlyInstalled",H.onlyInstalled),setTimeout(function(){H._postInit(!0),H.$tab.find(".process-adapters").hide()},50)}),this.$tab.find("#btn_filter_updates").off("click").on("click",function(){H.$tab.find(".process-adapters").show(),H.onlyUpdatable=!H.onlyUpdatable,i(),H.main.saveConfig("adaptersOnlyUpdatable",H.onlyUpdatable),setTimeout(function(){H._postInit(!0),H.$tab.find(".process-adapters").hide()},200)}),this.$tab.find("#btn_filter_custom_url").off("click").on("click",function(){var e,t='<option value="">'+_("none")+"</option>",n=[];for(e in H.urls)H.urls.hasOwnProperty(e)&&n.push(e);n.sort();for(var i=0;i<n.length;i++){var a=H.urls[n[i]].match(/\.com\/([-_$§A-Za-z0-9]+)\/([-._$§A-Za-z0-9]+)\//);a&&2<=a.length&&(H.main.config.expertMode||-1===n[i].indexOf("js-controller"))&&(t+='<option value="https://git.spacen.net/'+a[1]+"/yunkong2."+n[i]+"/tarball/master "+n[i]+'">'+n[i]+"</option>")}H.$installDialog.find("#install-github-link").html(t).val(H.main.config.adaptersGithub||""),H.$installDialog.modal(),H.$installDialog.find(".btn-install").off("click").on("click",function(){var e,t,n;if(!H.$installDialog.find('a[href="#tabs-install-github"]').hasClass("active"))(e=H.$installDialog.find("#install-url-link").val()).startsWith("http")&&e.endsWith(".git")&&(e="git+"+e),t=H.$installDialog.find("#install-url-debug").prop("checked")?" --debug":"",n="";else{var i=H.$installDialog.find("#install-github-link").val().split(" ");e=i[0],t=H.$installDialog.find("#install-github-debug").prop("checked")?" --debug":"",n=" "+i[1]}e?H.main.cmdExec(null,'url "'+e+'"'+n+t,function(e){e||H.init(!0,!0)}):H.main.showError(_("Invalid link"))}),H.$installDialog.find("#install-github-link").select(),H.$installDialog.find('input[type="checkbox"]+span').off("click").on("click",function(){var e=$(this).prev();e.prop("disabled")||e.prop("checked",!e.prop("checked")).trigger("change")}),H.$installDialog.modal("open"),H.$installDialog.find(".tabs").mtabs({nShow:function(e){e&&H.main.saveConfig("adaptersInstallTab",$(e).attr("id"))}}),H.main.config.adaptersInstallTab&&!H.main.noSelect&&H.$installDialog.find(".tabs").mtabs("select",H.main.config.adaptersInstallTab)}),this.$tab.find("#btn_upgrade_all").off("click").on("click",function(){H.main.confirmMessage(_("Do you want to upgrade all adapters?"),_("Please confirm"),"help",function(e){e&&H.main.cmdExec(null,"upgrade",function(e){e||H._postInit(!0)})})}),this.$tab.find("#btn_adapters_expert_mode").on("click",function(){H.main.config.expertMode=!H.main.config.expertMode,H.main.saveConfig("expertMode",H.main.config.expertMode),H.updateExpertMode(),H.main.tabs.instances.updateExpertMode()}),H.main.config.expertMode&&H.$tab.find("#btn_adapters_expert_mode").addClass("red lighten-3"),this.$installDialog.find("#install-github-link").on("change",function(){H.main.saveConfig("adaptersGithub",$(this).val())}),this.$installDialog.find("#install-url-link").on("keyup",function(e){13===e.which&&H.$installDialog.find("#dialog-install-url-button").trigger("click")}),this.isTiles=void 0===this.main.config.adaptersIsTiles||null===this.main.config.adaptersIsTiles||this.main.config.adaptersIsTiles,this.isList=this.main.config.adaptersIsList||!1,this.onlyInstalled=this.main.config.adaptersOnlyInstalled||!1,this.onlyUpdatable=this.main.config.adaptersOnlyUpdatable||!1,this.currentFilter=this.main.config.adaptersCurrentFilter||"",this.currentType=this.main.config.adaptersCurrentType||"",this.currentOrder=this.main.config.adaptersCurrentOrder||"a-z",this.isCollapsed=this.main.config.adaptersIsCollapsed?JSON.parse(this.main.config.adaptersIsCollapsed):{},this.currentFilter?(this.$tab.find(".filter-input").addClass("input-not-empty").val(H.currentFilter),this.$tab.find(".filter-clear").show()):this.$tab.find(".filter-clear").hide(),this.onlyInstalled?this.$tab.find("#btn_filter_adapters").addClass("red lighten-3"):this.$tab.find("#btn_filter_adapters").removeClass("red lighten-3"),this.onlyUpdatable?this.$tab.find("#btn_filter_updates").addClass("red lighten-3"):this.$tab.find("#btn_filter_updates").removeClass("red lighten-3"),"ie"===this.main.browser&&this.main.browserVersion<=10&&(this.isTiles=!1,this.$tab.find("#btn_switch_adapters").hide()),a(),this.$tab.find("#btn_refresh_adapters").on("click",function(){H.init(!0,!0)}),this.$tab.find(".filter-input").on("keyup",function(){$(this).trigger("change")}).on("change",function(e){H.filterTimer&&clearTimeout(H.filterTimer),H.filterTimer=setTimeout(function(){H.filterTimer=null,H.currentFilter=H.$tab.find(".filter-input").val().toLowerCase(),e&&e.target&&$(e.target)[H.currentFilter?"addClass":"removeClass"]("input-not-empty"),H.currentFilter?H.$tab.find(".filter-clear").show():H.$tab.find(".filter-clear").hide(),H.main.saveConfig("adaptersCurrentFilter",H.currentFilter),H.isTiles?B():H.$grid.fancytree("getTree").filterNodes(G,!1)},400)}),this.$tab.find(".filter-clear").on("click",function(){H.$tab.find(".filter-input").val("").trigger("change")}),this.isTiles?(this.$tab.find("#btn_switch_adapters").find("i").text("view_list"),H.$tab.removeClass("view-table").addClass("view-tiles"),n()):(H.$tab.removeClass("view-tiles").addClass("view-table"),t())},this.updateExpertMode=function(){this.init(!0),a()},this.getAdaptersInfo=function(e,t,n,i){if(e){if(!i)throw"Callback cannot be null or undefined";t&&(!this.curRepoLastUpdate||1e3<(new Date).getTime()-this.curRepoLastUpdate)&&(this.curRepository=null,this.curInstalled=null),this.curRunning?this.curRunning.push(i):(this.curRepository&&this.curRepoLastHost===e||(this.curRepository=null,this.main.socket.emit("sendToHost",e,"getRepository",{repo:this.main.systemConfig.common.activeRepo,update:n},function(e){"permissionError"===e&&(console.error('May not read "getRepository"'),e={}),H.curRepository=e||{},H.curRepository&&H.curInstalled&&H.curRunning&&(H.curRepoLastUpdate=(new Date).getTime(),setTimeout(function(){for(var e=0;e<H.curRunning.length;e++)H.curRunning[e](H.curRepository,H.curInstalled);H.curRunning=null},0))})),this.curInstalled&&this.curRepoLastHost===e||(this.curInstalled=null,this.main.socket.emit("sendToHost",e,"getInstalled",null,function(e){"permissionError"===e&&(console.error('May not read "getInstalled"'),e={}),H.curInstalled=e||{},H.curRepository&&H.curInstalled&&(H.curRepoLastUpdate=(new Date).getTime(),setTimeout(function(){for(var e=0;e<H.curRunning.length;e++)H.curRunning[e](H.curRepository,H.curInstalled);H.curRunning=null},0))})),this.curRepoLastHost=e,this.curInstalled&&this.curRepository?setTimeout(function(){if(H.curRunning){for(var e=0;e<H.curRunning.length;e++)H.curRunning[e](H.curRepository,H.curInstalled);H.curRunning=null}i&&i(H.curRepository,H.curInstalled)},0):this.curRunning=[i])}},this.enableColResize=function(){$.fn.colResizable&&this.$grid.is(":visible")&&this.$grid.colResizable({liveDrag:!0})},this.sortTree=function(){H.$grid.fancytree("getRootNode").sortChildren(function(e,t){var n=e.data.installed||0,i=(t.data.installed||0)-n;if(i)return i;var a=e.titleLang||e.title||"";"object"==typeof a&&(a=a[systemLang]||a.en);var s=t.titleLang||t.title||"";return"object"==typeof s&&(s=s[systemLang]||s.en),a=a.toLowerCase(),(s=s.toLowerCase())<a?1:a<s?-1:0},!0)},this._postInit=function(e,t){void 0!==this.$grid?(H.$tab.find(".process-adapters").show(),this.$grid.find("tbody").html(""),this.getAdaptersInfo(this.main.currentHost,e,t,function(e,t){var n,i,a,o,s=0,r=[],c=[],l=new Date,d={"add instance":_("add instance"),update:_("update"),upload:_("upload"),"Available version:":_("Available version:"),"Active instances":_("Active instances"),"Installed version":_("Installed version"),readme:_("readme"),"delete adapter":_("delete adapter"),"install specific version":_("install specific version"),all:_("all"),"Last update":_("Last update"),"Installations counter":_("Installation counter"),today:_("today"),yesterday:_("yesterday"),"1 %d days ago":_("1 %d days ago"),"2 %d days ago":_("2 %d days ago"),"5 %d days ago":_("5 %d days ago")};if(t){for(o in t)t.hasOwnProperty(o)&&(n=t[o])&&!n.controller&&"hosts"!==o&&r.push(o);r.sort()}for(o in H.urls={},e)e.hasOwnProperty(o)&&(t&&t[o]&&!t[o].versionDate&&(t[o].versionDate=e[o].versionDate),e[o].nogit||(H.urls[o]=e[o].meta),(n=e[o])&&!n.controller&&(i="",t&&t[o]||c.push(o)));function u(e,t,n,i){var a=function(e){if(e){var t=e.split(".");e="0"===t[0]&&"0"===t[1]&&"0"===t[2]?"planned":"0"===t[0]&&"0"===t[1]?"alpha":"0"===t[0]?"beta":"npm error"===e?"error":"stable"}return e}(e),s=a+"\n\r"+(n||"");return e='<table style="cursor: alias; width: 100%; text-align: center; border: 0; border-spacing: 0;'+(n?"color: blue;":"")+'" cellspacing="0" cellpadding="0" class="ui-widget"><tr class="'+a+'Bg"><td title="'+d["Available version:"]+" "+s+'" class="actual-version">'+e+'</td><td style="border: 0; padding: 0; width: 30px" class="update-version">',t&&(e+='<button class="adapter-update-submit small-button m" data-adapter-name="'+o+'" '+(i?' disabled title="'+i+'"':'title="'+d.update+'"')+'><i class="material-icons">refresh</i></button>'),e+="</td></tr></table>"}c.sort(),H.tree=[],H.data={};for(var m=0;m<r.length;m++)if(o=r[m],(n=t?t[o]:null)&&!n.controller&&"hosts"!==o){var g="",h="",f=n.icon;i="",e[o]&&e[o].version&&(i=e[o].version),e[o]&&e[o].extIcon&&(f=e[o].extIcon);var p=0,b=0;if(n.version){var M="",y=!1,v="";H.main.upToDate(i,n.version)||(M=F(n.version,e[o]),y=!0,v=Z(e[o].dependencies),s++),g='<table style="min-width: 80px; text-align: center; border: 0; border-spacing: 0;" cellspacing="0" cellpadding="0" class="ui-widget"><tr>';for(var w=0;w<H.main.instances.length;w++)H.main.objects[H.main.instances[w]]&&H.main.objects[H.main.instances[w]].common.name===o&&(p++,H.main.objects[H.main.instances[w]].common.enabled&&b++);if(p?(g+='<td style="border: 0; text-align: center; padding: 0; width: 40px">',b!==p&&(g+='<span title="'+_("Installed instances")+'">'+p+"</span>",b&&(g+=" ~ ")),b&&(g+='<span title="'+d["Active instances"]+'" class="true">'+b+"</span>"),g+="</td>"):g+='<td style="border: 0; padding: 0; width: 40px"></td>',g+='<td style="border: 0; padding: 0; width: 50px" title="'+d["Installed version"]+'">'+n.version+"</td>",h='<span class="installed" title="'+d["Installed version"]+'">'+n.version+"</span>",g+="</tr></table>",!y&&H.onlyUpdatable)continue}i=u(a=i,y,M,v);var j=(n.type||H.types[o]||"common adapters")+"_group";C=(C="object"==typeof n.desc?n.desc[systemLang]||n.desc.en:n.desc)||"",C+=W(j,o,H.main.states["system.adapter."+o+".upload"]?H.main.states["system.adapter."+o+".upload"].val:0);var N=n.titleLang||n.title;if(N="object"==typeof N?N[systemLang]||N.en:N,H.data[o]={image:f?'<img onerror="this.src=\'img/info-big.png\';" src="'+f+'" class="adapter-table-icon" />':"",icon:f||"",stat:e[o]?e[o].stat:0,name:o,title:(N||"").replace("yunkong2 Visualisation - ",""),desc:C,news:M,updatableError:v,keywords:n.keywords?n.keywords.join(" "):"",version:i,installed:g,rawVersion:a,instances:p,rawInstalled:h,versionDate:n.versionDate,updatable:y,bold:n.highlight||!1,install:'<button data-adapter-name="'+o+'" class="adapter-install-submit small-button m" title="'+d["add instance"]+'" data-adapter-desc="'+C+'"><i class="material-icons">add_circle_outline</i></button><button '+(n.readme?"":'disabled="disabled" ')+'data-adapter-name="'+o+'" data-adapter-url="'+(n.readme||"")+'" class="adapter-readme-submit small-button" title="'+d.readme+'"><i class="material-icons">help_outline</i></button>'+(H.main.config.expertMode?'<button data-adapter-name="'+o+'" class="adapter-upload-submit small-button" title="'+d.upload+'"><i class="material-icons">file_upload</i></button>':"")+"<button "+(g?"":'disabled="disabled" ')+'data-adapter-name="'+o+'" class="adapter-delete-submit small-button" title="'+d["delete adapter"]+'"><i class="material-icons">delete_forever</i></button>'+(H.main.config.expertMode?'<button data-adapter-name="'+o+'" data-target="adapters-menu" class="adapter-update-custom-submit small-button" title="'+d["install specific version"]+'"><i class="material-icons">add_to_photos</i></button>':""),group:j,license:n.license||"",licenseUrl:n.licenseUrl||""},n.type||console.log('"'+o+'": "common adapters",'),n.type&&H.types[o]&&console.log('Adapter "'+o+'" has own type. Remove from admin.'),H.isList)H.tree.push({icon:f,title:H.data[o].title||o,key:o});else{for(var T=-1,L=0;L<H.tree.length;L++)if(H.tree[L].key===H.data[o].group){T=L;break}T<0&&(d[H.data[o].group]||(d[H.data[o].group]=_(H.data[o].group)),H.tree.push({title:d[H.data[o].group],desc:W(j),key:H.data[o].group,folder:!0,expanded:!H.isCollapsed[H.data[o].group],children:[],icon:H.groupImages[H.data[o].group]}),T=H.tree.length-1),H.tree[T].children.push({icon:f,title:H.data[o].title||o,key:o})}}if(!H.onlyInstalled&&!H.onlyUpdatable)for(m=0;m<c.length;m++)if((n=e[o=c[m]])&&!n.controller&&(i="",!t||!t[o])){n&&n.version&&(i=u(a=i=n.version));var C;j=(n.type||H.types[o]||"common adapters")+"_group";if(C=(C="object"==typeof n.desc?n.desc[systemLang]||n.desc.en:n.desc)||"",C+=W(j,o,H.main.states["system.adapter."+o+".upload"]?H.main.states["system.adapter."+o+".upload"].val:0),N="object"==typeof(N=n.titleLang||n.title)?N[systemLang]||N.en:N,H.data[o]={image:n.extIcon?'<img onerror="this.src=\'img/info-big.png\';" src="'+n.extIcon+'" class="adapter-table-icon" />':"",icon:n.extIcon,stat:n.stat,name:o,title:(N||"").replace("yunkong2 Visualisation - ",""),desc:C,keywords:n.keywords?n.keywords.join(" "):"",rawVersion:a,version:i,bold:n.highlight,installed:"",versionDate:n.versionDate,install:'<button data-adapter-name="'+o+'" class="adapter-install-submit small-button" title="'+d["add instance"]+'" data-adapter-desc="'+C+'"><i class="material-icons">add_circle_outline</i></button><button '+(n.readme?"":'disabled="disabled" ')+' data-adapter-name="'+o+'" data-adapter-url="'+(n.readme||"")+'" class="adapter-readme-submit small-button" title="'+d.readme+'"><i class="material-icons">help_outline</i></button><button data-adapter-name="'+o+'" class="adapter-delete-submit small-button hide" title="'+d["delete adapter"]+'"><i class="material-icons">delete_forever</i></button>'+(H.main.config.expertMode?'<button data-adapter-name="'+o+'" data-target="adapters-menu" class="adapter-update-custom-submit small-button" title="'+d["install specific version"]+'"><i class="material-icons">add_to_photos</i></button>':""),license:n.license||"",licenseUrl:n.licenseUrl||"",group:j},n.type||console.log('"'+o+'": "common adapters",'),n.type&&H.types[o]&&console.log('Adapter "'+o+'" has own type. Remove from admin.'),H.isList)H.tree.push({icon:n.extIcon,title:H.data[o].title||o,key:o});else{for(var D=-1,I=0;I<H.tree.length;I++)if(H.tree[I].key===H.data[o].group){D=I;break}D<0&&(d[H.data[o].group]||(d[H.data[o].group]=_(H.data[o].group)),H.tree.push({title:d[H.data[o].group],key:H.data[o].group,folder:!0,expanded:!H.isCollapsed[H.data[o].group],children:[],icon:H.groupImages[H.data[o].group]}),D=H.tree.length-1),H.tree[D].children.push({title:H.data[o].title||o,icon:n.extIcon,desc:W(j),key:o})}}if("popular"===H.currentOrder||"updated"===H.currentOrder){var k=Object.keys(H.data);"popular"===H.currentOrder?k.sort(function(e,t){return H.data[e].stat>H.data[t].stat?-1:H.data[e].stat<H.data[t].stat?1:0}):"updated"===H.currentOrder&&k.sort(function(e,t){return H.data[e].versionDate&&!H.data[t].versionDate?-1:!H.data[e].versionDate&&H.data[t].versionDate?1:H.data[e].versionDate>H.data[t].versionDate?-1:H.data[e].versionDate<H.data[t].versionDate?1:t<e?-1:e<t?1:0});for(var O={},E=0;E<k.length;E++)O[k[E]]=H.data[k[E]];H.data=O}if(H.isTiles&&("ie"!==H.main.browser||10<H.main.browserVersion)){var z="",A=[];for(var x in H.data)if(H.data.hasOwnProperty(x)){var S=H.data[x];-1===A.indexOf(S.group)&&A.push(S.group),z+='<div class="col s12 m6 l4 xl3 tile class-'+S.group+'" data-id="'+S.name+'">',z+=' <div class="card hoverable card-adapters">',z+=' <div class="card-header '+(S.updatable?"updatable":S.installed?"installed":"")+'"></div>',z+=' <div class="card-content">',z+=' <img onerror="this.src=\'img/info-big.png\';" class="card-profile-image" src="'+S.icon+'">',z+=' <span class="card-title grey-text text-darken-4">'+S.title+"</span>",z+=' <a title="info" class="btn-floating activator btnUp blue lighten-2 z-depth-3"><i class="material-icons">more_vert</i></a>',z+=' <ul class="ver">',z+=" <li>"+d["Available version:"]+' <span class="data '+(S.updatable?"updatable":"")+'" '+(S.news?' title="'+S.news+'"':"")+">"+S.rawVersion+"</span>"+(S.updatable?'<button class="adapter-update-submit small-button" data-adapter-name="'+x+'" '+(v?' disabled title="'+S.updatableError+'"':'title="'+d.update+'"')+'><i class="material-icons">refresh</i></button>':"")+"</li>",S.installed&&(z+=" <li>"+d["Installed version"]+': <span class="data">'+S.rawInstalled+"</span></li>"),S.instances&&(z+=" <li>"+_("Installed instances")+': <span class="data">'+S.instances+"</span></li>"),z+=" </ul>",z+=" </div>",z+=' <div class="footer right-align"></div>',z+=' <div class="card-reveal">',z+=' <i class="card-title material-icons right">close</i>',z+=" <p>"+S.desc+"</p>",z+=' <div class="card-reveal-buttons">',z+=S.install,z+=" </div>",z+=" </div>","popular"===H.currentOrder&&S.stat?z+=' <div class="stat" title="'+d["Installations counter"]+'">'+S.stat+"</div>":"updated"===H.currentOrder&&S.versionDate&&(z+=' <div class="last-update" title="'+d["Last update"]+'">'+J(S.versionDate,d.today,d.yesterday,d["1 %d days ago"],d["2 %d days ago"],d["5 %d days ago"],l)+"</div>"),z+=" </div>",z+="</div>"}for(var Y in z+='<div class="col s12 m6 l4 xl3 filtered-out">',z+=' <div class="card hoverable card-adapters">',z+=' <div class="card-header"></div>',z+=' <div class="card-content">',z+=' <span class="card-title grey-text text-darken-4">'+_("Filtered out")+"</span>",z+=" </div>",z+=' <div class="footer right-align"></div>',z+=" </div>",z+="</div>",H.$tiles.html(z),H.data)H.data.hasOwnProperty(Y)&&H.initButtons(Y);for(var R='<li class="main-toolbar-table-types-item" data-type=""><a>'+d.all+"</a></li>\n",Q=0;Q<A.length;Q++)R+='<li class="main-toolbar-table-types-item" data-type="'+A[Q]+'"><a>'+_(A[Q])+"</a></li>\n";var P=H.$tab.find("#main-toolbar-table-types");P.html(R),P.find(".main-toolbar-table-types-item").show().off("click").on("click",function(){H.currentType=$(this).data("type")||"",B(),H.$tab.find("#main-toolbar-table-types-btn").html(_(H.currentType||"all")),H.main.saveConfig("adaptersCurrentType",H.currentType)}),H.currentType&&!d[H.currentType]&&(d[H.currentType]=_(H.currentType)),H.$tab.find("#main-toolbar-table-types-btn").html(d[H.currentType||"all"]).dropdown({constrainWidth:!1,gutter:0}),(P=H.$tab.find("#main-toolbar-table-order")).find(".main-toolbar-table-order-item").off("click").on("click",function(){H.currentOrder=$(this).data("type")||"",H.$tab.find("#main-toolbar-table-order-btn").html(_(H.currentOrder||"a-z")),H.main.saveConfig("adaptersCurrentOrder",H.currentOrder),H._postInit()}),H.currentOrder&&!d[H.currentOrder]&&(d[H.currentOrder]=_(H.currentOrder)),H.$tab.find("#main-toolbar-table-order-btn").show().html(d[H.currentOrder||"a-z"]).dropdown({constrainWidth:!1,gutter:0}),B()}else{H.$tab.find("#main-toolbar-table-types-btn").hide(),H.$tab.find("#main-toolbar-table-order-btn").hide(),H.$grid.fancytree("getTree").reload(H.tree),H.$grid.find(".fancytree-icon").each(function(){$(this).attr("src")&&$(this).css({width:18,height:18}),$(this).on("hover",function(){var e='<div class="icon-large" style="left: '+Math.round($(this).position().left+$(this).width()+5)+'px;"><img src="'+$(this).attr("src")+'"/></div>',t=$(e);t.insertAfter($(this)),$(this).data("big",t[0]);var n=parseFloat(t.height()),i=Math.round($(this).position().top-(n-parseFloat($(this).height()))/2);n+i>(window.innerHeight||document.documentElement.clientHeight)&&(i=(window.innerHeight||document.documentElement.clientHeight)-n),t.css({top:i})},function(){var e=$(this).data("big");$(e).remove(),$(this).data("big",void 0)})}),H.currentFilter&&H.$grid.fancytree("getTree").filterNodes(G,!1),H.sortTree(),H.enableColResize();var U=["tab-adapters-table-name","tab-adapters-table-description","tab-adapters-table-keywords","tab-adapters-table-installed","tab-adapters-table-available","tab-adapters-table-license","tab-adapters-table-install"];H.$grid.find("tbody tr").each(function(){var e=0;$(this).find("td").each(function(){$(this).addClass(U[e]),e++})})}H.$tab.find(".grid-main-div").removeClass("order-a-z order-popular order-updated").addClass(H.currentOrder?"order-"+H.currentOrder:""),H.$tab.find(".process-adapters").hide(),H.updateCounter(s)})):this.enableColResize(),this.restoreScroll()},this.saveScroll=function(){this.scrollTop=this.$tab.find(".grid-main-div").scrollTop()},this.restoreScroll=function(){this.scrollTop&&this.$tab.find(".grid-main-div").scrollTop(this.scrollTop)},this.updateCounter=function(e){if(void 0===e)this.getAdaptersInfo(this.main.currentHost,!1,!1,function(e,t){var n=0;for(var i in t)if(t.hasOwnProperty(i)){var a=t?t[i]:null;if(a&&!a.controller&&"hosts"!==i){var s="";e[i]&&e[i].version&&(s=e[i].version),a.version&&!H.main.upToDate(s,a.version)&&n++}}H.updateCounter(n)});else if(e){var t=$("#updates-for-adapters");t.length?t.text(e):$('<span id="updates-for-adapters" title="'+_("updates")+'" class="new badge updates-for-adapters" data-badge-caption="">'+e+"</span>").appendTo('.admin-sidemenu-items[data-tab="tab-adapters"] a')}else $("#updates-for-adapters").remove()},this.init=function(e,t){this.inited&&!e||(this.main.objectsLoaded?(this.inited||(this.inited=!0,this.main.subscribeObjects("system.host.*"),this.main.subscribeStates("system.host.*")),this.main.tabs.hosts.getHosts(function(){H._postInit(e,t)})):setTimeout(function(){H.init(e,t)},250))},this.destroy=function(){this.inited&&(this.saveScroll(),this.inited=!1,this.main.unsubscribeObjects("system.host.*"),this.main.unsubscribeStates("system.host.*"))},this.initButtons=function(r){this.$tab.find('.adapter-install-submit[data-adapter-name="'+r+'"]').off("click").on("click",function(){var s=$(this).attr("data-adapter-name"),e=$(this).attr("data-adapter-desc");!function(e,t,n){if(H.main.tabs.hosts.list.length<=1&&!H.main.config.expertMode)return n(!0,H.main.currentHost,"");var i=$("#dialog-add-instance");i.find(".dialog-add-instance-name").html(e),i.find(".dialog-add-description").html(t);for(var a="",s=0;s<H.main.tabs.hosts.list.length;s++){var o=H.main.tabs.hosts.list[s];a+="<option "+(o.name===H.main.currentHost?"selected":"")+' value="'+o.name+'">'+o.name+"</option>"}H.main.tabs.hosts.list.length<=1?i.find(".dialog-add-instance-host").addClass("disabled").prop("disabled",!0):i.find(".dialog-add-instance-host").removeClass("disabled").prop("disabled",!1),i.find(".dialog-add-instance-host").html(a).select();for(var r=-1,c=[],l=0;l<H.main.tabs.instances.list.length;l++){var d=H.main.tabs.instances.list[l].split(".");if(d[d.length-2]===e){var u=parseInt(d[d.length-1],10);c.push(u),r<u&&(r=u)}}r+=10,a='<option selected value="">'+_("auto")+"</option>";for(var m=0;m<r;m++)-1===c.indexOf(m)&&(a+='<option value="'+m+'">'+m+"</option>");i.find(".dialog-add-instance-number").html(a).select(),i.find(".dialog-add-install-btn").off("click").on("click",function(e){n&&(n(!0,i.find(".dialog-add-instance-host").val(),i.find(".dialog-add-instance-number").val()),n=null),i.find(".dialog-add-cancel-btn").off("click"),i.find(".dialog-add-instance-number").off("click")}),i.find(".dialog-add-cancel-btn").off("click").on("click",function(e){n&&(n(!1),n=null),i.find(".dialog-add-cancel-btn").off("click"),i.find(".dialog-add-instance-number").off("click")}),i.modal({dismissible:!1,complete:function(){i.find(".dialog-add-instance-name").html("")}}).modal("open")}(s,e,function(e,i,a){e&&H.getAdaptersInfo(i,!1,!1,function(e,t){var n=e[s];n||(n=t[s]),n&&(n.license&&"MIT"!==n.license?function(i,a){var s=$("#dialog-license");if(!H.data[i].installed&&H.data[i].licenseUrl){var o=setTimeout(function(){a(!(o=null))},1e4);"object"==typeof H.data[i].licenseUrl&&(H.data[i].licenseUrl=H.data[i].licenseUrl[systemLang]||H.data[i].licenseUrl.en),H.main.socket.emit("httpGet",H.data[i].licenseUrl,function(e,t,n){o&&(clearTimeout(o),o=null,!e&&n?(s.css({"z-index":200}),n=(n=n.toString().replace(/\r\n/g,"<br>")).replace(/\n/g,"<br>"),s.find(".license_text").html(n),s.find(".license_agreement_name").text(_(" for %s",i)),s.modal({dismissible:!1,complete:function(){s.find(".license_text").html("")}}).modal("open"),s.find(".license_agree").off("click").on("click",function(e){a&&(a(!0),a=null),s.find(".license_agree").off("click"),s.find(".license_non_agree").off("click")}),s.find(".license_non_agree").off("click").on("click",function(e){a&&(a(!1),a=null),s.find(".license_agree").off("click"),s.find(".license_non_agree").off("click")})):(a&&a(!0),a=null))})}else a(!0)}(s,function(e){e&&H.main.cmdExec(null,"add "+s+" "+a+" --host "+i,function(e){e||H._postInit(!0)})}):H.main.cmdExec(null,"add "+s+" "+a+" --host "+i,function(e){e||H._postInit(!0)}))})})}),this.$tab.find('.adapter-delete-submit[data-adapter-name="'+r+'"]').off("click").on("click",function(){var t=$(this).attr("data-adapter-name");H.main.confirmMessage(_("Are you sure you want to delete adapter %s?",t),_("Please confirm"),"help",function(e){e&&H.main.cmdExec(null,"del "+t,function(e){e||H._postInit(!0)})})}),this.$tab.find('.adapter-readme-submit[data-adapter-name="'+r+'"]').off("click").on("click",function(){H.main.navigate({tab:"adapters",dialog:"readme",params:$(this).data("adapter-name")})}),this.$tab.find('.adapter-update-submit[data-adapter-name="'+r+'"]').off("click").on("click",function(){var e=$(this).attr("data-adapter-name");"admin"===e&&(H.main.waitForRestart=!0),H.main.cmdExec(null,"upgrade "+e,function(e){e||H._postInit(!0)})}),this.$tab.find('.adapter-upload-submit[data-adapter-name="'+r+'"]').off("click").on("click",function(){var e=$(this).attr("data-adapter-name");H.main.cmdExec(null,"upload "+e,function(e){e||H._postInit(!0)})});var e=this.$tab.find('.adapter-update-custom-submit[data-adapter-name="'+r+'"]');e.off("click").on("click",function(){var e=[];if(H.main.objects["system.adapter."+r].common.news){var t=H.main.objects["system.adapter."+r].common.news;for(var n in t)t.hasOwnProperty(n)&&e.push(n)}else e.push(H.main.objects["system.adapter."+r].common.version);for(var i='<div class="collection">',a=0;a<e.length;a++){var s=t[e[a]]?t[e[a]][systemLang]||t[e[a]].en:"";i+='<a data-version="'+e[a]+'" data-position="left" data-delay="50" title="'+s+'" data-adapter-name="'+$(this).data("adapter-name")+'" class="collection-item adapters-versions-link tooltipped"><span class="adapters-versions-link-version">'+e[a]+'</span> - <div class="adapters-versions-link-history">'+s+"</div></a>"}i+="</div>";var o=$("#adapters-menu");o.length||((o=$('<div id="adapters-menu" class="modal modal-fixed-footer"><div class="modal-content"><h4>Modal Header</h4><p></p></div><div class="modal-footer"><a class="modal-action modal-close waves-effect waves-green btn-flat ">'+_("Close")+"</a></div></div>")).appendTo($(".materialize-dialogs").first()),o.modal()),o.data("trigger",this),o.find("p").html(i),o.find("h4").html(_("Versions of %s",r)),o.find(".adapters-versions-link").off("click").on("click",function(){o.modal("close");var e=$(this).data("adapter-name"),t=$(this).data("version");t&&e&&H.main.cmdExec(null,"upgrade "+e+"@"+t,function(e){e||H._postInit(!0)})}),o.modal("open")}),H.main.objects["system.adapter."+r]||e.hide()},this.objectChange=function(e,t){if(e.match(/^system\.adapter\.[a-zA-Z0-9-_]+$/)){if(t)-1===this.list.indexOf(e)&&this.list.push(e);else{var n=this.list.indexOf(e);-1!==n&&this.list.splice(n,1)}void 0!==this.$grid&&this.$grid[0]._isInited&&this.init(!0)}},this.stateChange=function(e,t){if(e&&t){var n=e.match(/^system\.adapter\.([\w\d-]+)\.upload$/);if(n){var i=this.$tab.find('.adapter-upload-progress[data-adapter-name="'+n[1]+'"]'),a=W(t.val);i.html(a).css({opacity:t.val?.7:0}),this.$tab.find('.group-upload-progress[data-adapter-group="'+i.data("adapter-group")+'"]').html(a).css({opacity:t.val?.7:0})}}}}function Config(e){var t=this;this.$dialog=$("#dialog-config"),this.$configFrame=this.$dialog.find("#config-iframe"),this.main=e,this.prepare=function(){$iframeDialog=this},this.init=function(){if(!this.inited){this.inited=!0;var e=this.main.navigateGetParams(),t=e.split(".");this.main.objects[e]&&this.main.objects[e].common&&this.main.objects[e].common.materialize?this.$configFrame.attr("src","adapter/"+t[2]+"/index_m.html?"+t[3]):this.$configFrame.attr("src","adapter/"+t[2]+"/?"+t[3]);var n=e.replace(/^system\.adapter\./,"");this.$dialog.data("name",n),this.$dialog.find(".title").html(_("Adapter configuration")+": "+n)}},this.allStored=function(){return!window.frames["config-iframe"].changed},this.close=function(){t.main.navigate()},this.destroy=function(){if(this.inited&&(this.inited=!1,this.$configFrame.attr("src",""),void 0!==showConfig&&showConfig&&showConfig.length)){var e=showConfig.shift();setTimeout(function(){t.main.navigate({tab:"instances",dialog:"config",params:e})},1e3)}}}function Customs(C){var m,g,h,f,L,D,I,k,O,E,z,A,x="__different__",S=this;function Y(e){if(e)S.historyTimeout&&clearTimeout(S.historyTimeout);else if(S.historyTimeout)return;S.historyTimeout=setTimeout(function(){S.historyTimeout=null,z&&S.loadHistoryTable(z.data("id"),!0)},e||5e3)}function R(t,n){$.ajax({headers:{Accept:"text/html"},cache:!0,url:"/adapter/"+t+"/custom_m.html",success:function(e){n(null,e)},error:function(e){$.ajax({headers:{Accept:"text/html"},cache:!0,url:"/adapter/"+t+"/custom.html",success:function(e){n(null,e)},error:function(e){n(e.responseText)}})}})}function Q(e){e.stopPropagation(),e.preventDefault();var t=S.$dialog.find("#customs-tabs"),c=t.data("ids");S.currentCustoms=null;var l=_(x);if(t.find("input, select").each(function(){var e=$(this).data("instance"),t=$(this).data("field");if(t){var n;if("checkbox"===$(this).attr("type")){if(this.indeterminate)return;n=$(this).prop("checked")}else n=$(this).val();if(n!==l){null===n&&(n=""),void 0===n&&(n=""),"false"===n&&(n=!1),"true"===n&&(n=!0);var i=parseFloat(n);n.toString().replace(/^\+/,"").replace(/([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/,"$1")===i.toString()&&(n=i);for(var a=0;a<c.length;a++){var s=S.main.objects[c[a]].common.custom;if(void 0===(s=S.main.objects[c[a]].common.custom=s||{})[e]){var o,r=e.split(".")[0];o=defaults[r]?"function"==typeof defaults[r]?defaults[r](S.main.objects[c[a]],S.main.objects["system.adapter."+e]):defaults[r]:S.defaults[r],s[e]=o||{}}s[e][t]=n}}}}),c){S.$dialog.find(".dialog-system-buttons .btn-save").addClass("disabled");for(var n=0;n<c.length;n++){var i=!1,a=S.main.objects[c[n]].common.custom;for(var s in a)a.hasOwnProperty(s)&&(a[s].enabled?i=!0:delete a[s]);i||(S.main.objects[c[n]].common.custom=null)}S.setCustoms(c,function(){S.loadHistoryChart(),S.main.navigate()})}}function P(e){switch(e){case"tab-customs-settings":S.loadHistoryChart();break;case"tab-customs-table":z.select(),S.loadHistoryChart();break;case"tab-customs-chart":S.$dialog.find("#tab-customs-chart .select-instance").select();var t=S.$dialog.find("#tabs-customs");S.loadHistoryChart(t.data("id"))}}return this.main=C,this.$dialog=$("#dialog-customs"),this.customEnabled=null,this.currentCustoms=null,this.check=function(){for(var e=0;e<this.main.instances.length;e++)if(this.main.objects[this.main.instances[e]].common&&("storage"===this.main.objects[this.main.instances[e]].common.type||this.main.objects[this.main.instances[e]].common.supportCustoms)&&this.main.objects[this.main.instances[e]].common.enabled)return null!==this.customEnabled&&!0!==this.customEnabled?(this.customEnabled=!0,this.inited&&this.init(null,!0)):this.customEnabled=!0,void!0;null!==this.customEnabled&&!1!==this.customEnabled?(this.customEnabled=!1,this.inited&&this.init(null,!0)):this.customEnabled=!1},this.stateChange=function(e){this.currentCustoms===e&&Y()},this.initCustomsTabs=function(e,t){var s=this.$dialog.find("#customs-tabs");e=e||[],s.html("");var o=_(x);this.defaults={};var n=this.main.config["object-customs-collapsed"];n=n?n.split(","):[];for(var r={},i=null,a=null,c=0;c<t.length;c++){var l=t[c].replace(/^system\.adapter\./,"");r[l]={};for(var d=0;d<e.length;d++){var u=C.objects[e[d]].common.custom,m=u?u[l]:null;if(C.objects[e[d]].common&&(null===i?i=C.objects[e[d]].common.type:""!==i&&i!==C.objects[e[d]].common.type&&(i=""),null===a?a=C.objects[e[d]].common.role:""!==a&&a!==C.objects[e[d]].common.role&&(a="")),m)for(var g in m)m.hasOwnProperty(g)&&(void 0===r[l][g]?r[l][g]=m[g]:r[l][g]!==m[g]&&(r[l][g]=x));else{var h=l.split(".")[0],f=null;for(var p in f=defaults[h]?"function"==typeof defaults[h]?defaults[h](S.main.objects[e[d]],S.main.objects["system.adapter."+l]):defaults[h]:this.defaults[h])f.hasOwnProperty(p)&&(void 0===r[l][p]?r[l][p]=f[p]:r[l][p]!==f[p]&&(r[l][p]=x))}}}for(var b=0;b<t.length;b++){var y=t[b].split("."),v=y[2],w=y[3],j=v+"."+w,N=this.main.objects["system.adapter."+v].common.icon;N="/adapter/"+v+"/"+N;var T='<li data-adapter="'+j+'" class="'+(-1===n.indexOf(j)?"active":"")+'"> <div class="collapsible-header"> <img src="'+N+'" />'+_("Settings for %s",j)+' <span class="activated" data-adapter="'+j+'" style="opacity: '+(!r[j]||!0!==r[j].enabled&&r[j].enabled!==x?"0":"1")+'">'+_("active")+'</span> </div> <div class="customs-settings collapsible-body">'+$('script[data-template-name="'+v+'"]').html()+" </div></li>",L=$(T);this.defaults[v]={},L.find("input, select").each(function(){var e=$(this);e.attr("data-instance",v+"."+w);var t=e.attr("data-field"),n=e.attr("data-default");"true"===n&&(n=!0),"false"===n&&(n=!1),void 0!==n&&n.toString().replace(/\+/,"")===parseFloat(n).toString()&&(n=parseFloat(n)),S.defaults[v][t]=n,"enabled"===t&&e.on("click",function(e){e.stopPropagation(),$(this).prop("checked")})}),s.append(L),customPostInits.hasOwnProperty(v)&&"function"==typeof customPostInits[v]&&customPostInits[v](L,r[v+"."+w],S.main.objects["system.adapter."+v+"."+w],i,a)}s.find("input, select").each(function(){var e,n=$(this),t=n.data("instance"),i=t.split(".")[0],a=n.data("field");void 0!==r[t][a]?"checkbox"===n.attr("type")?r[t][a]===x?n[0].indeterminate=!0:n.prop("checked",r[t][a]):r[t][a]===x?("number"===n.attr("type")&&n.attr("type","text"),"SELECT"===n.prop("tagName").toUpperCase()?(n.prepend('<option value="'+o+'">'+o+"</option>"),n.val(o)):n.val("").attr("placeholder",o)):n.val(r[t][a]):(S.defaults[i]&&void 0!==S.defaults[i][a]&&(e=S.defaults[i][a]),void 0!==e&&("checkbox"===n.attr("type")?n.prop("checked",e):n.val(e)));"checkbox"===n.attr("type")?n.on("change",function(){if(S.$dialog.find(".dialog-system-buttons .btn-save").removeClass("disabled"),"enabled"===$(this).data("field")){var e=n.data("instance"),t=s.find('.activated[data-adapter="'+e+'"]');$(this).prop("checked")?t.css("opacity",1):t.css("opacity",0)}}):n.on("change",function(){S.$dialog.find(".dialog-system-buttons .btn-save").removeClass("disabled")}).on("keyup",function(){$(this).trigger("change")})}),this.showCustomsData(1<e.length?null:e[0]),this.$dialog.find(".dialog-system-buttons .btn-save").addClass("disabled"),translateAll("#dialog-customs"),S.$dialog.find(".collapsible").collapsible({onOpenEnd:function(e){var t=S.main.config["object-customs-collapsed"];t=t?t.split(","):[];var n=$(e).data("adapter"),i=t.indexOf(n);-1!==i&&t.splice(i,1),S.main.saveConfig("object-customs-collapsed",t.join(","))},onCloseEnd:function(e){var t=S.main.config["object-customs-collapsed"];t=t?t.split(","):[];var n=$(e).data("adapter");-1===t.indexOf(n)&&t.push(n),S.main.saveConfig("object-customs-collapsed",t.join(","))}}),S.$dialog.find('input[type="checkbox"]+span').off("click").on("click",function(){var e=$(this).prev();e.prop("disabled")||(e[0].indeterminate?(e[0].indeterminate=!1,e.prop("checked",!0).trigger("change")):e.prop("checked",!e.prop("checked")).trigger("change"))}),s.find("select").select(),M.updateTextFields("#dialog-customs"),this.resizeHistory()},this.loadHistoryTable=function(e,t,l){g=g||S.$dialog.find("#grid-history"),m=m||S.$dialog.find("#grid-history-body"),t||m.html('<tr><td colspan="5" style="text-align: center">'+_("Loading...")+"</td></tr>");var n={aggregate:"none",instance:z.val(),from:!0,ack:!0,q:!0};L||(L=this.$dialog.find("#tab-customs-table .datepicker.date-from"),D=this.$dialog.find("#tab-customs-table .datepicker.date-to"),I=this.$dialog.find("#tab-customs-table .timepicker.time-from"),k=this.$dialog.find("#tab-customs-table .timepicker.time-to"));var d,i=L.val()?M.Datepicker.getInstance(L).toString("yyyy.mm.dd"):"",a=I.val(),s=D.val()?M.Datepicker.getInstance(D).toString("yyyy.mm.dd"):"",o=k.val(),r=!0;if(s?(r=!1,(s=new Date(s)).setHours(23),s.setMinutes(59),s.setSeconds(59),s.setMilliseconds(999)):s=new Date,o){var c=o.split(":");s.setHours(c[0]),s.setMinutes(c[1]),s.setSeconds(59),s.setMilliseconds(999),r=!1}if(s=s.getTime(),r&&(s+=1e4),n.end=s,i||a){if(i=new Date(i||s),a){var u=a.split(":");i.setHours(u[0]),i.setMinutes(u[1])}else i.setHours(0),i.setMinutes(0);i.setSeconds(0),i.setMilliseconds(0),n.start=i.getTime()}else n.count=50;l&&(d=new Date(s).toISOString()+"_"+(n.start?new Date(n.start):n.count+"points")+"_"+e+"__"+n.instance+".csv"),C.socket.emit("getHistory",e,n,function(r,c){setTimeout(function(){var e,t,n,i="value;acknowledged;from;timestamp;lastchanged;\n";if(r)console.error(r),m.html('<tr><td colspan="5" style="text-align: center" class="error">'+r+"</td></tr>");else{var a="";if(c&&c.length){for(var s=c.length-1;0<=s;s--){var o=(c[s].from||"").replace("system.adapter.","").replace("system.","");a+='<tr class="'+(c[s].ts>f?"highlight":"")+'"> <td>'+c[s].val+"</td> <td>"+c[s].ack+"</td> <td>"+o+"</td> <td>"+C.formatDate(c[s].ts)+"</td> <td>"+C.formatDate(c[s].lc)+"</td></tr>\n",l&&(i+=c[s].val+";"+c[s].ack+";"+(o||"")+";"+(c[s].ts?new Date(c[s].ts).toISOString():"")+";"+(c[s].lc?new Date(c[s].lc).toISOString():"")+";\n")}f=c[c.length-1].ts}else a='<tr><td colspan="5" style="text-align: center">'+_("No data")+"</td></tr>";m.html(a)}!function e(){$.fn.colResizable&&(g.is(":visible")?(g.data("inited")||((h=new IobListHeader("grid-history-header",{list:g,colWidthOffset:1,prefix:"log-filter"})).add("text","val"),h.add("text","ack"),h.add("text","from"),h.add("text","ts"),h.add("text","lc")),g.colResizable({liveDrag:!0,partialRefresh:!0,marginLeft:5,postbackSafe:!0,onResize:function(e){return h.syncHeader()}}),h.syncHeader()):setTimeout(function(){e()},200))}(),l&&(e=d,t=i,(n=document.createElement("a")).setAttribute("href","data:text/plain;charset=utf-8,"+encodeURIComponent(t)),n.setAttribute("download",e),n.style.display="none",document.body.appendChild(n),n.click(),document.body.removeChild(n))},0)})},this.loadHistoryChart=function(e){if(O||(O=this.$dialog.find("#tab-customs-chart .datepicker.date-from"),E=this.$dialog.find("#tab-customs-chart .datepicker.date-to")),e){for(var t=0,n=!1,i=!1,a=0;a<this.main.instances.length&&("flot"===this.main.objects[C.instances[a]].common.name&&this.main.objects[this.main.instances[a]].common.enabled?n="flot":!n&&"rickshaw"===this.main.objects[C.instances[a]].common.name&&this.main.objects[this.main.instances[a]].common.enabled?n="rickshaw":"web"===this.main.objects[this.main.instances[a]].common.name&&this.main.objects[this.main.instances[a]].common.enabled&&(t=this.main.objects[this.main.instances[a]].native.port,i=this.main.objects[this.main.instances[a]].native.secure),"flot"!==n||!t);a++);var s=this.$dialog.find("#iframe-history-chart"),o="http{isSecure}://{hostname}:{port}/{chart}/index.html?range=1440&zoom=true&axeX=lines&axeY=inside&hoverDetail=true&aggregate=onchange&chartType=step&live=30&instance={instance}&l%5B0%5D%5Bid%5D={id}&l%5B0%5D%5Boffset%5D=0&l%5B0%5D%5Baggregate%5D=minmax&l%5B0%5D%5Bcolor%5D=%231868a8&l%5B0%5D%5Bthickness%5D=1&l%5B0%5D%5Bshadowsize%5D=1&l%5B0%5D%5Bsmoothing%5D=0&l%5B0%5D%5BafterComma%5D=0&l%5B0%5D%5BignoreNull%5D=false&aggregateType=step&aggregateSpan=300&relativeEnd=now&timeType=relative&noBorder=noborder&bg=rgba(0%2C0%2C0%2C0)&timeFormat=%25H%3A%25M&useComma={comma}&noedit=false&animation=0";o=(o=(o=(o=(o=(o=(o=o.replace("{isSecure}",i?"s":"")).replace("{hostname}",location.hostname)).replace("{port}",t)).replace("{chart}",n)).replace("{instance}",S.$dialog.find("#tab-customs-chart .select-instance").val())).replace("{id}",encodeURI(e))).replace("{comma}",S.main.systemConfig&&S.main.systemConfig.common&&S.main.systemConfig.isFloatComma),s.attr("src",o)}else this.$dialog.find("#iframe-history-chart").attr("src","")},this.showCustomsData=function(e){var t=this.$dialog.find("#tabs-customs"),n=0,i=!1;if(P("tab-customs-settings"),e){t.data("id",e);for(var a=0;a<C.instances.length&&("flot"===C.objects[C.instances[a]].common.name&&C.objects[C.instances[a]].common.enabled?i="flot":!i&&"rickshaw"===C.objects[C.instances[a]].common.name&&C.objects[C.instances[a]].common.enabled?i="rickshaw":"web"===C.objects[C.instances[a]].common.name&&C.objects[C.instances[a]].common.enabled&&(n=C.objects[C.instances[a]].native.port),"flot"!==i||!n);a++);S.loadHistoryTable(e),t.find(".tabs .tab-table").removeClass("disabled"),n&&i&&S.currentCustoms?t.find(".tabs .tab-chart").removeClass("disabled"):t.find(".tabs .tab-chart").addClass("disabled")}else t.find(".tabs .tab-table").addClass("disabled"),t.find(".tabs .tab-chart").addClass("disabled")},this.setCustoms=function(t,n){var e=t.pop();e?(this.$dialog.find("#tab-customs-settings .title").html(_("Adapter settings for %s states",t.length)),S.main.socket.emit("setObject",e,this.main.objects[e],function(e){e?S.main.showMessage(_(e),_("Error"),"error_outline"):setTimeout(function(){S.setCustoms(t,n)},50)})):n&&n()},this.resizeHistory=function(){var e=this.$dialog.find("#iframe-history-chart");if(e.attr("src")){var t=e.data("timeout");t&&clearTimeout(t),e.data("timeout",setTimeout(function(){S.$dialog.find("#iframe-history-chart").data("timeout",null),S.loadHistoryChart(S.$dialog.find("#tabs-customs").data("id"))},1e3))}},this.allStored=function(){return S.$dialog.find(".dialog-system-buttons .btn-save").hasClass("disabled")},this.init=function(e,t){if(!this.inited||t){var n=this.main.navigateGetParams();n&&(n=n.split(",")),n&&n.length||(n=this.ids,this.ids=void 0);var i=[];this.defaults={};for(var a=0,s="",o=[],r=0;r<this.main.instances.length;r++){var c=this.main.objects[this.main.instances[r]];if(c&&c.common&&("storage"===c.common.type||c.common.supportCustoms)){i.push(this.main.instances[r]);var l=this.main.instances[r].split(".");-1===o.indexOf(l[2])&&(o.push(l[2]),a++,R(l[2],function(e,t){e&&console.error(e),t&&(s+=t),--a||(S.$dialog.find("#customs-templates").html(s),S.initCustomsTabs(n,i))}))}}var d,u=[];if(n)for(var m=n.length-1;0<=m;m--)if(this.main.objects[n[m]]){var g=this.main.objects[n[m]].common.custom;if(g){var h=!1;for(var f in g)g.hasOwnProperty(f)&&(!1===g[f].enabled?delete g[f]:(1===n.length&&u.push(f),h=!0));h||delete this.main.objects[n[m]].common.custom}}else console.warn("Null object: "+n[m]),n.splice(m,1);z=this.$dialog.find("#tab-customs-table .select-instance"),A=this.$dialog.find("#tab-customs-chart .select-instance");var p=this.$dialog.find("#tab-customs-table .refresh"),b=this.$dialog.find("#tab-customs-table .download"),M=this.$dialog.find("#tab-customs-chart .refresh");if(n&&1===n.length){d=_("Storage of %s",n[0]),this.currentCustoms=u.length?n[0]:null;for(var y="",v=0;v<u.length;v++){var w=this.main.objects["system.adapter."+u[v]];w&&w.common&&(w.common.enabled||this.main.states["system.adapter."+u[v]+".alive"]&&this.main.states["system.adapter."+u[v]+".alive"].val)&&(y+='<option value="'+u[v]+'" '+(v?"":"selected")+" >"+u[v]+"</option>\n")}if(y){z.data("id",n[0]).html(y).show().off("change").on("change",function(){S.main.saveConfig("object-history-table",z.val()),S.loadHistoryTable($(this).data("id"))}).select(),A.data("id",n[0]).html(y).show().off("change").on("change",function(){S.main.saveConfig("object-history-chart",A.val()),S.loadHistoryChart($(this).data("id"))}).select(),void 0!==this.main.config["object-history-table"]&&z.val(this.main.config["object-history-table"]),void 0!==this.main.config["object-history-chart"]&&A.val(this.main.config["object-history-chart"]),p.data("id",n[0]).show().off("click").on("click",function(){S.$dialog.find("#grid-history-body").html(""),S.loadHistoryTable($(this).data("id"))}),M.data("id",n[0]).show().off("click").on("click",function(){S.loadHistoryChart($(this).data("id"))}),b.data("id",n[0]).show().off("click").on("click",function(){S.loadHistoryTable($(this).data("id"),!1,!0)});var j=new Date;j.setDate(j.getDate()-1);for(var N={today:_("Today"),clear:_("Clear"),done:_("Ok"),months:[_("January"),_("February"),_("March"),_("April"),_("May"),_("June"),_("July"),_("August"),_("September"),_("October"),_("November"),_("December")],monthsShort:[_("Jan"),_("Feb"),_("Mar"),_("Apr"),_("May"),_("Jun"),_("Jul"),_("Aug"),_("Sep"),_("Oct"),_("Nov"),_("Dec")],weekdaysShort:[_("Sun"),_("Mon"),_("Tue"),_("Wed"),_("Thu"),_("Fri"),_("Sat")],weekdays:[_("Sunday"),_("Monday"),_("Tuesday"),_("Wednesday"),_("Thursday"),_("Friday"),_("Saturday")],weekdaysAbbrev:["S","M","T","W","T","F","S"]},T=0;T<N.weekdaysAbbrev.length;T++)N.weekdaysAbbrev[T]=N.weekdaysShort[T][0];L||(L=this.$dialog.find("#tab-customs-table .datepicker.date-from"),D=this.$dialog.find("#tab-customs-table .datepicker.date-to"),I=this.$dialog.find("#tab-customs-table .timepicker.time-from"),k=this.$dialog.find("#tab-customs-table .timepicker.time-to"),O=this.$dialog.find("#tab-customs-chart .datepicker.date-from"),E=this.$dialog.find("#tab-customs-chart .datepicker.date-to")),L.datepicker({defaultDate:j,showDaysInNextAndPreviousMonths:!0,minYear:2014,maxYear:2032,i18n:N,setDefaultDate:!0,firstDay:1,onSelect:function(e){L.datepicker("setInputValue"),L.datepicker("close")}}),L.on("change",function(){Y(1e3)}),I.timepicker({defaultTime:"00:00",twelveHour:!1,doneText:_("Ok"),clearText:_("Clear"),cancelText:_("Cancel"),autoClose:!0}),I.on("change",function(){Y(1e3)}),k.timepicker({defaultTime:"now",twelveHour:!1,doneText:_("Ok"),clearText:_("Clear"),cancelText:_("Cancel"),autoClose:!0}),k.on("change",function(){Y(1e3)}),D.datepicker({defaultDate:new Date,showDaysInNextAndPreviousMonths:!0,minYear:2014,maxYear:2032,i18n:N,setDefaultDate:!0,firstDay:1,onSelect:function(e){D.datepicker("setInputValue"),D.datepicker("close")}}),D.on("change",function(){Y(1e3)}),O.datepicker({defaultDate:j,showDaysInNextAndPreviousMonths:!0,minYear:2014,maxYear:2032,i18n:N,setDefaultDate:!0,firstDay:1,onSelect:function(e){O.datepicker("setInputValue"),O.datepicker("close")}}),O.on("change",function(){S.loadHistoryChart(A.data("id"))}),E.datepicker({defaultDate:new Date,showDaysInNextAndPreviousMonths:!0,minYear:2014,maxYear:2032,i18n:N,setDefaultDate:!0,firstDay:1,onSelect:function(e){E.datepicker("setInputValue"),E.datepicker("close")}}),E.on("change",function(){S.loadHistoryChart(A.data("id"))})}else z.hide(),A.hide(),p.hide(),M.hide(),b.hide();this.currentCustoms&&S.main.subscribeStates(this.currentCustoms),this.$dialog.find("#tab-customs-table .title").html(_("Values of %s",n[0])),this.$dialog.find("#tab-customs-chart .title").html(_("Chart for %s",n[0]))}else n&&(z.hide(),A.hide(),p.hide(),M.hide(),b.hide(),d=_("Storage of %s states",n.length),this.currentCustoms=null);this.$dialog.find("#tab-customs-settings .title").html(d),this.$dialog.find("#tabs-customs").find(".tabs").mtabs({onShow:function(e){e&&P($(e).attr("id"))}}),this.$dialog.find("#customs-tabs").data("ids",n),S.$dialog.find(".dialog-system-buttons .btn-save").off("click").on("click",Q),S.$dialog.find(".dialog-system-buttons .btn-cancel").off("click").on("click",function(e){e.stopPropagation(),e.preventDefault(),S.$dialog.find(".dialog-system-buttons .btn-save").hasClass("disabled")?(S.loadHistoryChart(),S.main.navigate()):S.main.confirmMessage(_("Are you sure? Changes are not saved."),_("Please confirm"),"error_outline",function(e){e&&(S.$dialog.find(".dialog-system-buttons .btn-save").addClass("disabled"),S.loadHistoryChart(),S.main.navigate())})})}},this.destroy=function(){this.inited&&(this.$dialog.find(".collapsible").collapsible("destroy"),this.inited=!1,this.loadHistoryChart(),this.currentCustoms&&S.main.unsubscribeStates(this.currentCustoms))},this}function EditObject(e){var c=this;function a(e,t,n,i){var a="";for(var s in t)if(t.hasOwnProperty(s)&&("common"!==n||"name"!==s&&"icon"!==s)){a+='<div class="row">\n<div class="col s11">\n',"state"===i&&"common"===n&&"type"===s?a+='<select class="object-tab-edit-string" data-attr="'+s+'"><option value="boolean" '+("boolean"===t[s]?"selected":"")+">"+_("boolean")+'</option><option value="string" '+("string"===t[s]?"selected":"")+">"+_("string")+'</option><option value="number" '+("number"===t[s]?"selected":"")+">"+_("number")+'</option><option value="array" '+("array"===t[s]?"selected":"")+">"+_("array")+'</option><option value="object" '+("object"===t[s]?"selected":"")+">"+_("object")+'</option><option value="mixed" '+("mixed"===t[s]?"selected":"")+">"+_("mixed")+"</option></select>":"string"==typeof t[s]?a+='<input type="text" class="object-tab-edit-string" data-attr="'+s+'" value="'+t[s]+'" />\n':"number"==typeof t[s]?a+='<input type="text" class="object-tab-edit-number" data-attr="'+s+'" value="'+t[s]+'" />\n':"boolean"==typeof t[s]?a+='<input type="checkbox" class="object-tab-edit-boolean filled-in" data-attr="'+s+'" '+(t[s]?"checked":"")+" />\n":a+='<textarea class="object-tab-edit-object" style="width: 100%" rows="3" data-attr="'+s+'">'+JSON.stringify(t[s],null,2)+"</textarea>\n";var o=s;"common"===n&&systemDictionary["common_"+s]&&systemDictionary["common_"+s][systemLang]&&(o=_("common_"+s)),"boolean"==typeof t[s]?a+="<span>"+o+"</span>\n":a+="<label>"+o+"</label>\n",a+='</div>\n<div class="col s1"><a class="btn-floating waves-effect waves-light red object-tab-field-delete" data-attr="'+s+'" data-part="'+n+'"><i class="material-icons">delete</i></a></div>\n',a+="</div>\n"}c.$dialog.find(e).html(a)}function n(e,t){var n=c.$dialog.find(e);n.find(".object-tab-edit-string").each(function(){t[$(this).data("attr")]=$(this).val()}),n.find(".object-tab-edit-number").each(function(){t[$(this).data("attr")]=parseFloat($(this).val())}),n.find(".object-tab-edit-boolean").each(function(){t[$(this).data("attr")]=$(this).prop("checked")});var i=null;if(n.find(".object-tab-edit-object").each(function(){try{t[$(this).data("attr")]=JSON.parse($(this).val())}catch(e){return i=$(this).data("attr"),!1}}),void 0!==t.write&&("false"!==t.write&&"0"!==t.write&&0!==t.write||(t.write=!1),"true"!==t.write&&"1"!==t.write&&1!==t.write||(t.write=!0)),void 0!==t.read&&("false"!==t.read&&"0"!==t.read&&0!==t.read||(t.read=!1),"true"!==t.read&&"1"!==t.read&&1!==t.read||(t.read=!0)),null===t.min&&delete t.min,void 0!==t.min){var a=parseFloat(t.min);a.toString()===t.min.toString()&&(t.min=a),"false"===t.min&&(t.min=!1),"true"===t.min&&(t.min=!0)}if(null===t.max&&delete t.max,void 0!==t.max){var s=parseFloat(t.max);s.toString()===t.max.toString()&&(t.max=s),"false"===t.max&&(t.max=!1),"true"===t.max&&(t.max=!0)}if(null===t.def&&delete t.def,void 0!==t.def){var o=parseFloat(t.def);o.toString()===t.def.toString()&&(t.def=o),"false"===t.def&&(t.def=!1),"true"===t.def&&(t.def=!0)}if(-1!==e.indexOf("common"))for(var r in t)t.hasOwnProperty(r)&&("true"===t[r]&&(t[r]=!0),"false"===t[r]&&(t[r]=!1),parseFloat(t[r]).toString()===t[r]&&(t[r]=parseFloat(t[r])));return i}function s(e,t,n){"boolean"==typeof t&&(n=t,t=3e3),c.main.showToast(c.$dialog,e,null,t,n)}this.$dialog=$("#dialog-editobject"),this.$dialogNewField=$("#dialog-new-field"),this.main=e,this.prepared=!1,this.inited=!1,this.$dialogSave=this.$dialog.find(".dialog-editobject-buttons .btn-save"),this.iconVal=null,this._prepare=function(){this.prepared||(this.prepared=!0,this.$dialogSave.on("click",function(){c.save()}),this.$dialog.find(".dialog-editobject-buttons .btn-cancel").on("click",function(){c.editor.setValue(""),c.$dialogSave.addClass("disabled"),c.main.navigate()}),this.$dialog.find(".btn-add-common").on("click",function(){c.$dialogNewField.find(".object-tab-new-icon").show(),c.$dialogNewField.modal("open");var e=c.$dialogNewField.find(".object-tab-new-name");e.data("type","common").focus(),e.hasClass("autocomplete")||(e.addClass("autocomplete"),e.mautocomplete({data:{type:null,desc:null,min:null,max:null,def:null,role:null,unit:null,read:null,write:null,states:null},minLength:0})),e.focus()}),this.$dialog.find(".btn-add-native").on("click",function(){c.$dialogNewField.find(".object-tab-new-icon").hide(),c.$dialogNewField.modal("open");var e=c.$dialogNewField.find(".object-tab-new-name");e.hasClass("autocomplete")&&(e.mautocomplete("destroy"),e.removeClass("autocomplete")),M.updateTextFields("#dialog-new-field"),e.data("type","native").focus()}),this.$dialogNewField.find(".object-tab-new-name").keypress(function(e){13===e.which&&c.$dialogNewField.find(".btn-add").trigger("click")}),this.editor||(this.editor=ace.edit("view-object-raw"),this.editor.getSession().setMode("ace/mode/json"),this.editor.$blockScrolling=!0,this.editor.getSession().on("change",function(){c.$dialogSave.removeClass("disabled")})),this.$dialogNewField.modal(),this.$dialog.find(".tabs").mtabs({onShow:function(e){if(e){var t=$(e).attr("id");if("object-tab-common"===t)s(_("Drop the icons here"));else if("object-tab-raw"===t){var n=c.saveFromTabs();if(!n)return!1;c.editor.setValue(JSON.stringify(n,null,2))}else if("object-tab-raw"===t){var i;try{i=JSON.parse(c.editor.getValue())}catch(e){return c.main.showMessage(e,_("Parse error"),"error_outline"),c.main.noSelect||c.$dialog.find(".tabs").mtabs("select","object-tab-raw"),!1}c.load(i)}return c.main.saveConfig("object-edit-active",t),!0}}}),this.$dialogNewField.find(".btn-add").on("click",function(e){e.preventDefault(),e.stopPropagation();var t=c.$dialogNewField.find(".object-tab-new-name"),n=t.data("type")||"common",i=t.val().trim(),a=c.saveFromTabs();i&&-1===i.indexOf(" ")?void 0===a[n][i]?(a[n][i]="",c.load(a),c.$dialogNewField.find(".object-tab-new-name").val(""),c.$dialogNewField.modal("close"),c.$dialogSave.removeClass("disabled")):c.main.showError(_("Field %s yet exists!",i)):c.main.showError(_("Invalid field name: %s",i))}),this.$dialogNewField.find(".btn-cancel").on("click",function(e){c.$dialogNewField.find(".object-tab-new-name").val("")}),this.$dialog.find(".edit-object-name").on("change",function(){c.$dialogSave.removeClass("disabled")}).on("keyup",function(){$(this).trigger("change")}),this.$dialog.find(".edit-object-type").on("change",function(){c.$dialogSave.removeClass("disabled")}),this.$dialog.find(".object-tab-rights input").on("change",function(){c.$dialogSave.removeClass("disabled")}),installFileUpload(this.$dialog.find("#object-tab-common"),5e4,function(e,t){if(e)s(e,!0);else{if(!t.match(/^data:image\//))return void s(_("Unsupported image format"),!0);c.$dialogSave.removeClass("disabled"),c.iconVal=t;var n=c.$dialog.find(".icon-editor");n.find(".icon").show().html('<img class="treetable-icon" />'),n.find(".icon .treetable-icon").attr("src",t)}}),this.$dialog.find(".icon-editor .icon-upload").off("click").on("click",function(){c.$dialog.find(".drop-file").trigger("click")}),this.$dialog.find(".icon-editor .icon-clear").off("click").on("click",function(){c.iconVal&&(c.iconVal=null,c.$dialog.find(".icon-editor").hide().appendTo(c.$dialog),c.$dialogSave.removeClass("disabled"))}))},this.init=function(){if(this._prepare(),!this.inited){this.inited=!0;var e=c.main.navigateGetParams(),t=!!(e||"").match(/,def$/);e=e.replace(/,def$/,"");var n=this.main.objects[e];if(n){void 0===this.main.config["object-edit-active"]||c.main.noSelect||this.$dialog.find(".tabs").mtabs("select",this.main.config["object-edit-active"]);for(var i,a="",s=0;s<this.main.tabs.users.list.length;s++)i=translateName(this.main.objects[this.main.tabs.users.list[s]].common.name),a+='<option value="'+this.main.tabs.users.list[s]+'">'+(i||this.main.tabs.users.list[s])+"</option>";for(this.$dialog.find(".object-tab-acl-owner").html(a),a="",s=0;s<this.main.tabs.users.groups.length;s++)i=translateName(this.main.objects[this.main.tabs.users.groups[s]].common.name),a+='<option value="'+this.main.tabs.users.groups[s]+'">'+(i||this.main.tabs.users.groups[s])+"</option>";this.$dialog.find(".object-tab-acl-group").html(a),this.load(n),t?this.$dialog.data("cb",function(n){"state"===n.type&&c.main.socket.emit("getState",n._id,function(e,t){t&&null!==t.val&&void 0!==t.val||c.main.socket.emit("setState",n._id,void 0===n.common.def?null:n.common.def,!0)})}):this.$dialog.data("cb",null),c.$dialogSave.addClass("disabled")}}},this.destroy=function(){this.inited&&(this.inited=!1)},this.load=function(e){if(e){e.common=e.common||{},e.native=e.native||{},e.acl=e.acl||{},this.$dialog.find(".title-id").text(e._id),this.$dialog.find(".edit-object-name").val(e.common?translateName(e.common.name):e._id),this.$dialog.find(".edit-object-type").val(e.type),this.$dialog.find(".object-tab-acl-owner").val(e.acl.owner||"system.user.admin"),this.$dialog.find(".object-tab-acl-group").val(e.acl.ownerGroup||"system.group.administrator"),this.$dialog.find(".icon-editor").hide().appendTo(this.$dialog),a(".object-tab-common-table",e.common||{},"common",e.type),a(".object-tab-native-table",e.native||{},"native",e.type),void 0!==e.common.icon?(this.iconVal=e.common.icon,this.$dialog.find(".object-tab-common-table").prepend(this.$dialog.find(".icon-editor").show()),this.$dialog.find(".icon-editor .icon").html(c.main.getIconFromObj(e))):this.iconVal=null,this.$dialog.find(".object-tab-field-delete").on("click",function(){var n=$(this).data("part"),i=$(this).data("attr");c.main.confirmMessage(_("Delete attribute"),_("Please confirm"),"error_outline",function(e){if(e){var t=c.saveFromTabs();delete t[n][i],c.load(t)}})}),e.acl=e.acl||{},void 0===e.acl.object&&(e.acl.object=1638),this.$dialog.find("#object-tab-acl-obj-owner-read").prop("checked",1024&e.acl.object),this.$dialog.find("#object-tab-acl-obj-owner-write").prop("checked",512&e.acl.object),this.$dialog.find("#object-tab-acl-obj-group-read").prop("checked",64&e.acl.object),this.$dialog.find("#object-tab-acl-obj-group-write").prop("checked",32&e.acl.object),this.$dialog.find("#object-tab-acl-obj-every-read").prop("checked",4&e.acl.object),this.$dialog.find("#object-tab-acl-obj-every-write").prop("checked",2&e.acl.object),"state"!==e.type?this.$dialog.find(".object-tab-acl-state").hide():(this.$dialog.find(".object-tab-acl-state").show(),void 0===e.acl.state&&(e.acl.state=1638),this.$dialog.find("#object-tab-acl-state-owner-read").prop("checked",1024&e.acl.state),this.$dialog.find("#object-tab-acl-state-owner-write").prop("checked",512&e.acl.state),this.$dialog.find("#object-tab-acl-state-group-read").prop("checked",64&e.acl.state),this.$dialog.find("#object-tab-acl-state-group-write").prop("checked",32&e.acl.state),this.$dialog.find("#object-tab-acl-state-every-read").prop("checked",4&e.acl.state),this.$dialog.find("#object-tab-acl-state-every-write").prop("checked",2&e.acl.state));var t=JSON.parse(JSON.stringify(e));if(this.editor.setValue(JSON.stringify(t,null,2)),t._id&&delete t._id,t.common&&delete t.common,t.type&&delete t.type,t.native&&delete t.native,t.acl&&delete t.acl,this.$dialog.find("#view-object-rest").val(JSON.stringify(t,null," ")),this.$dialog.find("select").select(),this.$dialog.find('input[type="checkbox"]+span').off("click").on("click",function(){var e=$(this).prev();e.prop("disabled")||e.prop("checked",!e.prop("checked")).trigger("change")}),this.$dialog.find("input").on("change",function(){c.$dialogSave.removeClass("disabled")}).on("keyup",function(){$(this).trigger("change")}),this.$dialog.find("select").on("change",function(){c.$dialogSave.removeClass("disabled")}),this.$dialog.find("textarea").on("change",function(){c.$dialogSave.removeClass("disabled")}).on("keyup",function(){$(this).trigger("change")}),void 0!==e.common.color){var n=Date.now(),i=this.$dialog.find('.object-tab-edit-string[data-attr="color"]').parent();i.prepend('<i class="material-icons prefix tab-enums-dialog-new-color-icon">color_lens</i><a class="btn edit-color translate">'+_("Color")+"</a>"),i.colorpicker({component:".btn",color:i,container:!0}).colorpicker("setValue",e.common.color||"#fff").on("showPicker.colorpicker",function(){}).on("changeColor.colorpicker",function(e){100<Date.now()-n&&i.find("input").val(e.color.toHex()).trigger("change")})}}},this.saveFromTabs=function(){var e;try{e=(e=this.$dialog.find("#view-object-rest").val())?JSON.parse(e):{}}catch(t){return this.main.showMessage(_("Cannot parse."),_("Error in %s",t),"error_outline"),!1}e.common={},e.native={},e.acl={},e._id=this.$dialog.find(".title-id").text(),e.common.name=this.$dialog.find(".edit-object-name").val(),e.type=this.$dialog.find(".edit-object-type").val();var t=n(".object-tab-common-table",e.common);return t?(this.main.showMessage(_("Cannot parse."),_("Error in %s",t),"error_outline"),!1):(t=n(".object-tab-native-table",e.native))?(this.main.showMessage(_("Cannot parse."),_("Error in %s",t),"error_outline"),!1):(e.acl.object=0,e.acl.object|=this.$dialog.find("#object-tab-acl-obj-owner-read").prop("checked")?1024:0,e.acl.object|=this.$dialog.find("#object-tab-acl-obj-owner-write").prop("checked")?512:0,e.acl.object|=this.$dialog.find("#object-tab-acl-obj-group-read").prop("checked")?64:0,e.acl.object|=this.$dialog.find("#object-tab-acl-obj-group-write").prop("checked")?32:0,e.acl.object|=this.$dialog.find("#object-tab-acl-obj-every-read").prop("checked")?4:0,e.acl.object|=this.$dialog.find("#object-tab-acl-obj-every-write").prop("checked")?2:0,e.acl.owner=this.$dialog.find(".object-tab-acl-owner").val(),e.acl.ownerGroup=this.$dialog.find(".object-tab-acl-group").val(),"state"===e.type&&(e.acl.state=0,e.acl.state|=this.$dialog.find("#object-tab-acl-state-owner-read").prop("checked")?1024:0,e.acl.state|=this.$dialog.find("#object-tab-acl-state-owner-write").prop("checked")?512:0,e.acl.state|=this.$dialog.find("#object-tab-acl-state-group-read").prop("checked")?64:0,e.acl.state|=this.$dialog.find("#object-tab-acl-state-group-write").prop("checked")?32:0,e.acl.state|=this.$dialog.find("#object-tab-acl-state-every-read").prop("checked")?4:0,e.acl.state|=this.$dialog.find("#object-tab-acl-state-every-write").prop("checked")?2:0),null!==this.iconVal&&void 0!==this.iconVal&&(e.common.icon=this.iconVal),e)},this.saveFromRaw=function(){var e;try{e=JSON.parse(this.editor.getValue())}catch(e){return this.main.showMessage(e,_("Parse error"),"error_outline"),c.main.noSelect||this.$dialog.find(".tabs").mtabs("select","object-tab-raw"),!1}return e},this.save=function(){if("object-tab-raw"===this.main.config["object-edit-active"]){var n=this.saveFromRaw();if(!n)return;this.main.socket.emit("setObject",n._id,n,function(e){if(e)c.main.showError(e);else{var t=c.$dialog.data("cb");t&&t(n),c.$dialogSave.addClass("disabled"),c.main.navigate()}})}else{var i=c.saveFromTabs();if(!i)return;this.main.socket.emit("getObject",i._id,function(e,t){if(e)return c.main.showError(e);t.common=i.common,t.native=i.native,t.acl=i.acl,c.main.socket.emit("setObject",i._id,t,function(e){if(e)c.main.showError(e);else{var t=c.$dialog.data("cb");t&&t(i),c.$dialogSave.addClass("disabled"),c.main.navigate()}})})}},this.allStored=function(){return c.$dialogSave.hasClass("disabled")}}function Enums(t){var g=this;this.main=t,this.list=[],this.$gridEnum=$("#tab-enums"),this.$gridList=this.$gridEnum.find(".tab-enums-list"),this.$grid=this.$gridEnum.find(".tab-enums-objects"),this.updateTimers=null,this.editMode=!1,this.isTiles=!1;var d=[],a={"enum.rooms":{_id:"enum.rooms",common:{icon:"home",name:{en:"Rooms",cn:"场景"},desc:{en:"List of the rooms",cn:"List of the rooms"},members:[],dontDelete:!0},type:"enum"},"enum.functions":{_id:"enum.functions",common:{icon:"lightbulb_outline",name:{en:"Functions",cn:"功能"},desc:{en:"List of the functions",cn:"List of the functions"},members:[],dontDelete:!0},type:"enum"},"enum.favorites":{_id:"enum.favorites",common:{icon:"favorite_border",name:{en:"Favorites",cn:"收藏"},desc:{en:"List of favorites objects",cn:"List of favorites objects"},members:[]},type:"enum"}},s={"enum.rooms":{"enum.rooms.living_room":{_id:"enum.rooms.living_room",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDQ4MC4wNDYgNDgwLjA0NiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwLjA0NiA0ODAuMDQ2OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGc+PGc+PHBhdGggZD0iTTMyOC4wMzQsMzIwLjA0NmgtMjR2LTg4YzAtNC40MTgtMy41ODItOC04LThoLTI1NmMtNC40MTgsMC04LDMuNTgyLTgsOHY4OGgtMjRjLTQuNDE4LDAtOCwzLjU4Mi04LDh2MTI4YzAsNC40MTgsMy41ODIsOCw4LDhoMjR2MTZoMTZ2LTE2aDI0MHYxNmgxNnYtMTZoMjRjNC40MTgsMCw4LTMuNTgyLDgtOHYtMTI4QzMzNi4wMzQsMzIzLjYyOCwzMzIuNDUyLDMyMC4wNDYsMzI4LjAzNCwzMjAuMDQ2eiBNODAuMDM0LDQ0OC4wNDZoLTY0di0xMTJoNjRWNDQ4LjA0NnogTTI0MC4wMzQsNDQ4LjA0NmgtMTQ0di02NGgxNDRWNDQ4LjA0NnogTTI0MC4wMzQsMzI4LjA0NnY0MGgtMTQ0di00MGMwLTQuNDE4LTMuNTgyLTgtOC04aC00MHYtODBoMjQwdjgwaC00MEMyNDMuNjE1LDMyMC4wNDYsMjQwLjAzNCwzMjMuNjI4LDI0MC4wMzQsMzI4LjA0NnogTTMyMC4wMzQsNDQ4LjA0NmgtNjR2LTExMmg2NFY0NDguMDQ2eiIvPjwvZz48L2c+PGc+PGc+PHBhdGggZD0iTTQ3OS45NTQsMTUxLjE2NmwtMTYtMTQ0Yy0wLjQ0Ny00LjA0MS0zLjg1NC03LjEwNC03LjkyLTcuMTJoLTExMmMtNC4wOTYtMC4wMjUtNy41NDksMy4wNDktOCw3LjEybC0xNiwxNDRjLTAuMjc2LDIuMjU4LDAuNDIyLDQuNTI4LDEuOTIsNi4yNGMxLjU1LDEuNzE4LDMuNzY3LDIuNjgsNi4wOCwyLjY0aDY0djI3MmgtMzJjLTQuNDE4LDAtOCwzLjU4Mi04LDh2MzJjMCw0LjQxOCwzLjU4Miw4LDgsOGg4MGM0LjQxOCwwLDgtMy41ODIsOC04di0zMmMwLTQuNDE4LTMuNTgyLTgtOC04aC0zMnYtMjcyaDY0YzIuMjg1LDAuMDE3LDQuNDY5LTAuOTQzLDYtMi42NEM0NzkuNTMyLDE1NS42OTQsNDgwLjIzLDE1My40MjUsNDc5Ljk1NCwxNTEuMTY2eiBNNDMyLjAzNCw0NDguMDQ2djE2aC02NHYtMTZINDMyLjAzNHogTTMzNi45OTQsMTQ0LjA0NmwxNC4yNC0xMjhoOTcuNmwxNC4yNCwxMjhIMzM2Ljk5NHoiLz48L2c+PC9nPjxnPjxnPjxwYXRoIGQ9Ik0yNzIuMDM0LDQ4LjA0NmgtNTIuNzJsLTQ1LjYtNDUuNjhjLTMuMTExLTMuMTM3LTguMTc3LTMuMTU4LTExLjMxNC0wLjA0NmMtMC4wMTYsMC4wMTUtMC4wMzEsMC4wMzEtMC4wNDYsMC4wNDZsLTQ1LjYsNDUuNjhoLTUyLjcyYy00LjQxOCwwLTgsMy41ODItOCw4djEyOGMwLDQuNDE4LDMuNTgyLDgsOCw4aDIwOGM0LjQxOCwwLDgtMy41ODIsOC04di0xMjhDMjgwLjAzNCw1MS42MjgsMjc2LjQ1Miw0OC4wNDYsMjcyLjAzNCw0OC4wNDZ6IE0xNjguMDM0LDE5LjMyNmwyOC43MiwyOC43MmgtNTcuNDRMMTY4LjAzNCwxOS4zMjZ6IE0yNjQuMDM0LDE3Ni4wNDZoLTE5MnYtMTEyaDE5MlYxNzYuMDQ2eiIvPjwvZz48L2c+PGc+PGc+PHBhdGggZD0iTTg4LjAzNCw4MC4wNDZ2ODBoMTYwdi04MEg4OC4wMzR6IE0yMzIuMDM0LDE0NC4wNDZoLTEyOHYtNDhoMTI4VjE0NC4wNDZ6Ii8+PC9nPjwvZz48L3N2Zz4=",name:{en:"Living room"},members:[]},type:"enum"},"enum.rooms.sleeping_room":{_id:"enum.rooms.sleeping_room",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNDgwIDQ4MCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwIDQ4MDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHBhdGggZD0iTTQ2NCwyNjRWODhIMTZ2MTc2SDB2ODBoNDh2NDhoNjR2LTQ4aDI1NnY0OGg2NHYtNDhoNDh2LTgwSDQ2NHogTTMyLDEwNGg0MTZ2MTYwaC0xNnYtMjRjMC0yMi4wOTEtMTcuOTA5LTQwLTQwLTQwDQoJCWgtMTIuNDhjMi45MDgtNC44MzIsNC40NTYtMTAuMzYsNC40OC0xNmMwLTE3LjY3My0xNC4zMjctMzItMzItMzJoLTY0Yy0xNy42NzMsMC0zMiwxNC4zMjctMzIsMzINCgkJYzAuMDI0LDUuNjQsMS41NzIsMTEuMTY4LDQuNDgsMTZoLTQwLjk2YzIuOTA4LTQuODMyLDQuNDU2LTEwLjM2LDQuNDgtMTZjMC0xNy42NzMtMTQuMzI3LTMyLTMyLTMyaC02NA0KCQljLTE3LjY3MywwLTMyLDE0LjMyNy0zMiwzMmMwLjAyNCw1LjY0LDEuNTcyLDExLjE2OCw0LjQ4LDE2SDg4Yy0yMi4wOTEsMC00MCwxNy45MDktNDAsNDB2MjRIMzJWMTA0eiBNMzkyLDIxNg0KCQljMTMuMjU1LDAsMjQsMTAuNzQ1LDI0LDI0djI0SDY0di0yNGMwLTEzLjI1NSwxMC43NDUtMjQsMjQtMjRIMzkyeiBNMTEyLDE4NGMwLTguODM3LDcuMTYzLTE2LDE2LTE2aDY0YzguODM3LDAsMTYsNy4xNjMsMTYsMTYNCgkJcy03LjE2MywxNi0xNiwxNmgtNjRDMTE5LjE2MywyMDAsMTEyLDE5Mi44MzcsMTEyLDE4NHogTTI3MiwxODRjMC04LjgzNyw3LjE2My0xNiwxNi0xNmg2NGM4LjgzNywwLDE2LDcuMTYzLDE2LDE2DQoJCXMtNy4xNjMsMTYtMTYsMTZoLTY0QzI3OS4xNjMsMjAwLDI3MiwxOTIuODM3LDI3MiwxODR6IE05NiwzNzZINjR2LTMyaDMyVjM3NnogTTQxNiwzNzZoLTMydi0zMmgzMlYzNzZ6IE00NjQsMzI4SDE2di00OGg0NDhWMzI4DQoJCXoiLz4NCjwvZz4NCjxnPg0KCTxyZWN0IHg9IjQ4IiB5PSIxMjAiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIvPg0KPC9nPg0KPGc+DQoJPHJlY3QgeD0iNDE2IiB5PSIxMjAiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIvPg0KPC9nPg0KPGc+DQoJPHJlY3QgeD0iODAiIHk9IjEyMCIgd2lkdGg9IjMyMCIgaGVpZ2h0PSIxNiIvPg0KPC9nPg0KPGc+DQoJPHJlY3QgeD0iNDgiIHk9IjE1MiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjQwIi8+DQo8L2c+DQo8Zz4NCgk8cmVjdCB4PSI0MTYiIHk9IjE1MiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjQwIi8+DQo8L2c+DQoNCjwvc3ZnPg0K",name:{en:"Sleeping room"},members:[]},type:"enum"},"enum.rooms.kitchen":{_id:"enum.rooms.kitchen",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNDgwIDQ4MCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwIDQ4MDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHBhdGggZD0iTTAsMjA4djQ4aDE2djIyNGg0NDhWMjU2aDE2di00OEgweiBNMjA4LDQ2NEgzMlYyNTZoMTc2VjQ2NHogTTI4OCw0NjRoLTY0VjMyMGg2NFY0NjR6IE0zNjgsNDY0aC02NFYzMjBoNjRWNDY0eg0KCQkgTTQ0OCw0NjRoLTY0VjMyMGg2NFY0NjR6IE00NDgsMzA0SDIyNHYtNDhoMjI0VjMwNHogTTQ2NCwyNDBIMTZ2LTE2aDQ0OFYyNDB6Ii8+DQo8L2c+DQo8Zz4NCgk8cGF0aCBkPSJNNDgsMzM2djExMmgxNDRWMzM2SDQ4eiBNMTc2LDQzMkg2NHYtODBoMTEyVjQzMnoiLz4NCjwvZz4NCjxnPg0KCTxwYXRoIGQ9Ik03MiwyNzJjLTEzLjI1NSwwLTI0LDEwLjc0NS0yNCwyNHMxMC43NDUsMjQsMjQsMjRzMjQtMTAuNzQ1LDI0LTI0Uzg1LjI1NSwyNzIsNzIsMjcyeiBNNzIsMzA0Yy00LjQxOCwwLTgtMy41ODItOC04DQoJCQlzMy41ODItOCw4LThzOCwzLjU4Miw4LDhTNzYuNDE4LDMwNCw3MiwzMDR6Ii8+DQo8L2c+DQo8Zz4NCgk8cGF0aCBkPSJNMTY4LDI3MmMtMTMuMjU1LDAtMjQsMTAuNzQ1LTI0LDI0czEwLjc0NSwyNCwyNCwyNHMyNC0xMC43NDUsMjQtMjRTMTgxLjI1NSwyNzIsMTY4LDI3MnogTTE2OCwzMDRjLTQuNDE4LDAtOC0zLjU4Mi04LTgNCgkJczMuNTgyLTgsOC04czgsMy41ODIsOCw4UzE3Mi40MTgsMzA0LDE2OCwzMDR6Ii8+DQo8L2c+DQo8Zz4NCgk8cmVjdCB4PSIzMDQiIHk9IjI3MiIgd2lkdGg9IjY0IiBoZWlnaHQ9IjE2Ii8+DQo8L2c+DQo8Zz4NCgk8cmVjdCB4PSIyNTYiIHk9IjMzNiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+DQo8L2c+DQo8Zz4NCgk8cmVjdCB4PSIzMzYiIHk9IjM2OCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjMyIi8+DQo8L2c+DQo8Zz4NCgk8cmVjdCB4PSI0MDAiIHk9IjM2OCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjMyIi8+DQo8L2c+DQo8Zz4NCgk8cGF0aCBkPSJNMjA4LDB2ODYuMDhsLTI0LTQ4VjBINDB2MzguMDhMMC44OCwxMTYuNGMtMS45ODgsMy45NDYtMC40MDEsOC43NTYsMy41NDQsMTAuNzQ0QzUuNTM0LDEyNy43MDMsNi43NTgsMTI3Ljk5Niw4LDEyOGg0NzINCgkJVjBIMjA4eiBNNTYsMTZoMTEydjE2SDU2VjE2eiBNMjAuOTYsMTEybDMyLTY0aDExOC4wOGwzMiw2NEgyMC45NnogTTMzNiwxMTJIMjI0VjE2aDExMlYxMTJ6IE00NjQsMTEySDM1MlYxNmgxMTJWMTEyeiIvPg0KPC9nPg0KPGc+DQoJPHJlY3QgeD0iMzA0IiB5PSI4MCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+DQo8L2c+DQo8Zz4NCgk8cmVjdCB4PSIzNjgiIHk9IjgwIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiLz4NCjwvZz4NCjxnPg0KCTxyZWN0IHg9Ijk2IiB5PSIzNjgiIHdpZHRoPSI0OCIgaGVpZ2h0PSIxNiIvPg0KPC9nPg0KPC9zdmc+DQo=",name:{en:"Kitchen"},members:[]},type:"enum"},"enum.rooms.office":{_id:"enum.rooms.office",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNDgwIDQ4MCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwIDQ4MDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJCTxwYXRoIGQ9Ik0yMjQsMTIwdjExMmgyMjRWMTIwSDIyNHogTTQzMiwyMTZIMjQwdi04MGgxOTJWMjE2eiIvPg0KPC9nPg0KPGc+DQoJCTxwYXRoIGQ9Ik0zMzYsMTUyYy0xMy4yNTUsMC0yNCwxMC43NDUtMjQsMjRzMTAuNzQ1LDI0LDI0LDI0czI0LTEwLjc0NSwyNC0yNFMzNDkuMjU1LDE1MiwzMzYsMTUyeiBNMzM2LDE4NGMtNC40MTgsMC04LTMuNTgyLTgtOA0KCQkJczMuNTgyLTgsOC04czgsMy41ODIsOCw4UzM0MC40MTgsMTg0LDMzNiwxODR6Ii8+DQo8L2c+DQo8Zz4NCgkJPHBhdGggZD0iTTE3Niw4OFY0OGMwLTQuNDE4LTMuNTgyLTgtOC04aC04VjE2YzAtNC40MTgtMy41ODItOC04LThINDBjLTQuNDE4LDAtOCwzLjU4Mi04LDh2MjRoLThjLTQuNDE4LDAtOCwzLjU4Mi04LDh2NDBIMHYzODQNCgkJCWgyMDhWMjY0aDIwOHYyMDhoNjRWODhIMTc2eiBNNDgsMjRoOTZ2MTZINDhWMjR6IE0zMiw1NmgxMjh2MzJIMzJWNTZ6IE0xOTIsNDU2SDE2VjIwMGgxNzZWNDU2eiBNMTkyLDE4NEgxNnYtODBoMTc2VjE4NHoNCgkJCSBNNDY0LDQ1NmgtMzJWMjY0aDMyVjQ1NnogTTQ2NCwyNDhIMjA4VjEwNGgyNTZWMjQ4eiIvPg0KPC9nPg0KPGc+DQoJCTxyZWN0IHg9IjgwIiB5PSIxMzYiIHdpZHRoPSI0OCIgaGVpZ2h0PSIxNiIvPg0KPC9nPg0KPGc+DQoJCTxwYXRoIGQ9Ik0xNTIsMjE2Yy0xMy4yNTUsMC0yNCwxMC43NDUtMjQsMjRzMTAuNzQ1LDI0LDI0LDI0czI0LTEwLjc0NSwyNC0yNFMxNjUuMjU1LDIxNiwxNTIsMjE2eiBNMTUyLDI0OGMtNC40MTgsMC04LTMuNTgyLTgtOA0KCQkJczMuNTgyLTgsOC04czgsMy41ODIsOCw4UzE1Ni40MTgsMjQ4LDE1MiwyNDh6Ii8+DQo8L2c+DQo8L3N2Zz4NCg==",name:{en:"Office"},members:[]},type:"enum"},"enum.rooms.nursery":{_id:"enum.rooms.nursery",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNDgwIDQ4MCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwIDQ4MDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHBhdGggZD0iTTQwLDQzMmMtMTMuMjU1LDAtMjQsMTAuNzQ1LTI0LDI0czEwLjc0NSwyNCwyNCwyNHMyNC0xMC43NDUsMjQtMjRTNTMuMjU1LDQzMiw0MCw0MzJ6IE00MCw0NjRjLTQuNDE4LDAtOC0zLjU4Mi04LTgNCgkJczMuNTgyLTgsOC04czgsMy41ODIsOCw4UzQ0LjQxOCw0NjQsNDAsNDY0eiIvPg0KPC9nPg0KPGc+DQoJPHBhdGggZD0iTTQ0MCw0MzJjLTEzLjI1NSwwLTI0LDEwLjc0NS0yNCwyNHMxMC43NDUsMjQsMjQsMjRzMjQtMTAuNzQ1LDI0LTI0UzQ1My4yNTUsNDMyLDQ0MCw0MzJ6IE00NDAsNDY0Yy00LjQxOCwwLTgtMy41ODItOC04DQoJCXMzLjU4Mi04LDgtOHM4LDMuNTgyLDgsOFM0NDQuNDE4LDQ2NCw0NDAsNDY0eiIvPg0KPC9nPg0KPGc+DQoJPHBhdGggZD0iTTQxNiwxMTJ2NDhINjR2LTQ4SDE2djMyMGg0OHYtNDhoMzUydjQ4aDQ4VjExMkg0MTZ6IE00OCw0MTZIMzJWMTI4aDE2VjQxNnogTTY0LDIwOGgyNHY4MEg2NFYyMDh6IE02NCwzMDRoMjR2MzJINjRWMzA0DQoJCXogTTQxNiwzNjhINjR2LTE2aDM1MlYzNjh6IE0xMjAsMzA0djMyaC0xNnYtMzJIMTIweiBNMTA0LDI4OHYtODBoMTZ2ODBIMTA0eiBNMTUyLDMwNHYzMmgtMTZ2LTMySDE1MnogTTEzNiwyODh2LTgwaDE2djgwSDEzNnoNCgkJIE0xODQsMzA0djMyaC0xNnYtMzJIMTg0eiBNMTY4LDI4OHYtODBoMTZ2ODBIMTY4eiBNMjE2LDMwNHYzMmgtMTZ2LTMySDIxNnogTTIwMCwyODh2LTgwaDE2djgwSDIwMHogTTI0OCwzMDR2MzJoLTE2di0zMkgyNDh6DQoJCSBNMjMyLDI4OHYtODBoMTZ2ODBIMjMyeiBNMjgwLDMwNHYzMmgtMTZ2LTMySDI4MHogTTI2NCwyODh2LTgwaDE2djgwSDI2NHogTTMxMiwzMDR2MzJoLTE2di0zMkgzMTJ6IE0yOTYsMjg4di04MGgxNnY4MEgyOTZ6DQoJCSBNMzQ0LDMwNHYzMmgtMTZ2LTMySDM0NHogTTMyOCwyODh2LTgwaDE2djgwSDMyOHogTTM3NiwzMDR2MzJoLTE2di0zMkgzNzZ6IE0zNjAsMjg4di04MGgxNnY4MEgzNjB6IE00MTYsMzM2aC0yNHYtMzJoMjRWMzM2eg0KCQkgTTQxNiwyODhoLTI0di04MGgyNFYyODh6IE00MTYsMTkySDY0di0xNmgzNTJWMTkyeiBNNDQ4LDQxNmgtMTZWMTI4aDE2VjQxNnoiLz4NCjwvZz4NCjxnPg0KCTxwYXRoIGQ9Ik0yOTYsNTAuNzJjLTQuNTA5LDAuMDM0LTguOTE3LDEuMzM3LTEyLjcyLDMuNzZjLTEwLjMxMy03LjY4MS0yMi40OTUtMTIuNDYtMzUuMjgtMTMuODRWMGgtMTZ2NDAuNjQNCgkJYy0xMi43ODUsMS4zOC0yNC45NjcsNi4xNTktMzUuMjgsMTMuODRjLTMuODAzLTIuNDIzLTguMjExLTMuNzI2LTEyLjcyLTMuNzZjLTEzLjI1NSwwLTI0LDEwLjc0NS0yNCwyNGMwLDEzLjI1NSwxMC43NDUsMjQsMjQsMjQNCgkJczI0LTEwLjc0NSwyNC0yNGMtMC4wMTUtMi43MjMtMC40NzUtNS40MjUtMS4zNi04YzE5Ljg1NS0xNC41NjUsNDYuODY1LTE0LjU2NSw2Ni43MiwwYy0wLjg4NSwyLjU3NS0xLjM0NSw1LjI3Ny0xLjM2LDgNCgkJYzAsMTMuMjU1LDEwLjc0NSwyNCwyNCwyNHMyNC0xMC43NDUsMjQtMjRDMzIwLDYxLjQ2NSwzMDkuMjU1LDUwLjcyLDI5Niw1MC43MnogTTE4NCw4Mi43MmMtNC40MTgsMC04LTMuNTgyLTgtOA0KCQljMC00LjQxOCwzLjU4Mi04LDgtOHM4LDMuNTgyLDgsOEMxOTIsNzkuMTM4LDE4OC40MTgsODIuNzIsMTg0LDgyLjcyeiBNMjk2LDgyLjcyYy00LjQxOCwwLTgtMy41ODItOC04YzAtNC40MTgsMy41ODItOCw4LTgNCgkJczgsMy41ODIsOCw4QzMwNCw3OS4xMzgsMzAwLjQxOCw4Mi43MiwyOTYsODIuNzJ6Ii8+DQo8L2c+DQoNCjwvc3ZnPg0K",name:{en:"Nursery"},members:[]},type:"enum"},"enum.rooms.wc":{_id:"enum.rooms.wc",common:{icon:"data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTkuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDUxMiA1MTIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUxMiA1MTI7IiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjU2cHgiIGhlaWdodD0iMjU2cHgiPgo8Zz4KCTxnPgoJCTxwYXRoIGQ9Ik00NTEsMzE3di0zMGMwLTI0LjgxMy0yMC4xODctNDUtNDUtNDVIMjI2Yy01LjI1OSwwLTEwLjMwNSwwLjkxNS0xNSwyLjU4Vjg3LjQyYzE3LjQ1OS02LjE5MiwzMC0yMi44NjUsMzAtNDIuNDIgICAgYzAtMjQuODEzLTIwLjE4Ny00NS00NS00NUg3NmMtOC4yODQsMC0xNSw2LjcxNi0xNSwxNWMwLDI3LjcxLDAsMjQ2LjM4NSwwLDI3MmMwLDE5LjU1NSwxMi41NDEsMzYuMjI4LDMwLDQyLjQyVjM3NyAgICBjMCwyNy41MTksMTAuODU1LDUzLjkyNywzMCw3My40ODJWNDk3YzAsOC4yODQsNi43MTYsMTUsMTUsMTVjMTcuMzMsMCwyNTQuODQ2LDAsMjcwLDBjOC4yODQsMCwxNS02LjcxNiwxNS0xNXMtNi43MTYtMTUtMTUtMTUgICAgaC00NXYtMTcuOTkxQzQxNS45ODgsNDM1Ljk0Myw0NTEsMzc5LjI4Myw0NTEsMzE3eiBNMjI2LDI3MmgxODBjOC4yNzEsMCwxNSw2LjcyOSwxNSwxNXYxNUgyMTF2LTE1ICAgIEMyMTEsMjc4LjcyOSwyMTcuNzI5LDI3MiwyMjYsMjcyeiBNOTEsMzBoMTA1YzguMjcxLDAsMTUsNi43MjksMTUsMTVzLTYuNzI5LDE1LTE1LDE1SDkxVjMweiBNMTA2LDMwMmMtOC4yNzEsMC0xNS02LjcyOS0xNS0xNSAgICBWOTBoOTBjMCwxNy4zOSwwLDIwMC4yNzEsMCwyMTJIMTA2eiBNMzM5Ljk5NCw0NDAuNzczYy01LjQ2MywyLjM4Ny04Ljk5NCw3Ljc4My04Ljk5NCwxMy43NDVWNDgySDE1MXYtMzcuOTE3ICAgIGMwLTQuMjY3LTEuODE3LTguMzMyLTQuOTk2LTExLjE3N0MxMzAuMTEzLDQxOC42ODQsMTIxLDM5OC4zMDcsMTIxLDM3N3YtNDUuMWMzNC41MzUsMCwyOTYuNTQ1LDAsMjk5LjE2OCwwICAgIEM0MTQuODY0LDM3OS40OTMsMzg0LjU3NSw0MjEuMjk1LDMzOS45OTQsNDQwLjc3M3oiIGZpbGw9IiMwMDAwMDAiLz4KCTwvZz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K",name:{en:"WC"},members:[]},type:"enum"},"enum.rooms.garage":{_id:"enum.rooms.kitchen",common:{icon:"data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTkuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDQ4MC4wMTMgNDgwLjAxMyIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwLjAxMyA0ODAuMDEzOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgd2lkdGg9IjI1NnB4IiBoZWlnaHQ9IjI1NnB4Ij4KPGc+Cgk8Zz4KCQk8cGF0aCBkPSJNMzkwLjk5OSwzMTYuOTUybC0zMC4yOTYtMjQuMjMyYy0xLjExMy0wLjg4Ny0xLjk2OS0yLjA1NS0yLjQ4LTMuMzg0bC0xMS42OC01NC40ICAgIGMtMi40MzItMTEuMDItMTIuMTc5LTE4Ljg4My0yMy40NjQtMTguOTI4SDE1Ni44MDdjLTExLjI2OC0wLjA1Mi0yMS4wMzYsNy43ODgtMjMuNDI0LDE4LjhsLTEyLDUzLjk1MiAgICBjLTAuNDAzLDEuNzgzLTEuMzk5LDMuMzc2LTIuODI0LDQuNTJsLTI5LjYsMjMuNjhjLTUuNjg3LDQuNTUyLTguOTg0LDExLjQ1Mi04Ljk1MiwxOC43MzZ2ODAuMzEyICAgIGMwLjAyMSw2Ljc4OCwyLjkzLDEzLjI0Niw4LDE3Ljc2djMwLjI0YzAsOC44MzcsNy4xNjMsMTYsMTYsMTZoMzJjOC44MzcsMCwxNi03LjE2MywxNi0xNnYtMjRoMTc2djI0YzAsOC44MzcsNy4xNjMsMTYsMTYsMTZoMzIgICAgYzguODM3LDAsMTYtNy4xNjMsMTYtMTZ2LTMwLjI0YzUuMDctNC41MTQsNy45NzktMTAuOTcyLDgtMTcuNzZ2LTgwLjMxMkM0MDAuMDI0LDMyOC40LDM5Ni43MDcsMzIxLjQ5NiwzOTAuOTk5LDMxNi45NTJ6ICAgICBNMjE4LjE0MywyMzguMzI4bDAtMC4wMDhsNC4yMDgtNi4zMmgxMDAuNzI4YzMuNzcyLTAuMDAxLDcuMDMyLDIuNjMyLDcuODI0LDYuMzJsMTAuNzA0LDQ5LjY4OEgyMjQuNzAzICAgIGM1Ljg4OC0xMS4wOTgsMy44NzEtMjQuNzM2LTQuOTc2LTMzLjY1NkMyMTUuNDYxLDI1MC4wNjQsMjE0Ljc5OSwyNDMuMzY4LDIxOC4xNDMsMjM4LjMyOHogTTE4NC4wNzksMjM4LjMyOHYtMC4wMDhsNC4yMDgtNi4zMiAgICBoMTUuMTQ0Yy01Ljg4LDExLjEwMS0zLjg2MSwyNC43MzYsNC45ODQsMzMuNjU2YzQuMjU4LDQuMjgsNC45MjYsMTAuOTYyLDEuNiwxNmwtNC4yMDgsNi4zMmgtMTUuMTYgICAgYzUuODgtMTEuMTAxLDMuODYxLTI0LjczNi00Ljk4NC0zMy42NTZDMTgxLjQxNCwyNTAuMDM3LDE4MC43NTMsMjQzLjM2MSwxODQuMDc5LDIzOC4zMjh6IE0xNDkuMDM5LDIzOC4yNjQgICAgYzAuNzkyLTMuNjU1LDQuMDI4LTYuMjYyLDcuNzY4LTYuMjU2aDEyLjU2Yy01Ljg4LDExLjEwMS0zLjg2MSwyNC43MzYsNC45ODQsMzMuNjU2YzQuMjU4LDQuMjgsNC45MjYsMTAuOTYyLDEuNiwxNmwtNC4yMDgsNi4zMiAgICBoLTMzLjc2TDE0OS4wMzksMjM4LjI2NHogTTEzNi4wMDcsNDY0LjAwOGgtMzJ2LTI0aDMyVjQ2NC4wMDh6IE0zNzYuMDA3LDQ2NC4wMDhoLTMydi0yNGgzMlY0NjQuMDA4eiBNMzg0LjAwNyw0MTYuMDA4ICAgIGMwLDQuNDE4LTMuNTgyLDgtOCw4aC0yNzJjLTQuNDE4LDAtOC0zLjU4Mi04LTh2LThoMjg4VjQxNi4wMDh6IE0zODQuMDA3LDM5Mi4wMDhoLTI4OHYtNTYuMzEyICAgIGMtMC4wMDYtMi40MzEsMS4xMDMtNC43MywzLjAwOC02LjI0bDI5LjYtMjMuNjhjMC42NDktMC41NTYsMS4yNjktMS4xNDYsMS44NTYtMS43NjhoMjE4LjkyOGMwLjQzMiwwLjQsMC44LDAuOCwxLjI5NiwxLjIgICAgbDMwLjMwNCwyNC4yNGMxLjksMS41MTcsMy4wMDcsMy44MTYsMy4wMDgsNi4yNDhWMzkyLjAwOHoiIGZpbGw9IiMwMDAwMDAiLz4KCTwvZz4KPC9nPgo8Zz4KCTxnPgoJCTxwYXRoIGQ9Ik0xMzIuMDA3LDMyOC4wMDhjLTE1LjQ2NCwwLTI4LDEyLjUzNi0yOCwyOGMwLDE1LjQ2NCwxMi41MzYsMjgsMjgsMjhzMjgtMTIuNTM2LDI4LTI4ICAgIEMxNjAuMDA3LDM0MC41NDQsMTQ3LjQ3MSwzMjguMDA4LDEzMi4wMDcsMzI4LjAwOHogTTEzMi4wMDcsMzY4LjAwOGMtNi42MjcsMC0xMi01LjM3My0xMi0xMmMwLTYuNjI3LDUuMzczLTEyLDEyLTEyICAgIGM2LjYyNywwLDEyLDUuMzczLDEyLDEyQzE0NC4wMDcsMzYyLjYzNSwxMzguNjM0LDM2OC4wMDgsMTMyLjAwNywzNjguMDA4eiIgZmlsbD0iIzAwMDAwMCIvPgoJPC9nPgo8L2c+CjxnPgoJPGc+CgkJPHBhdGggZD0iTTM0OC4wMDcsMzI4LjAwOGMtMTUuNDY0LDAtMjgsMTIuNTM2LTI4LDI4YzAsMTUuNDY0LDEyLjUzNiwyOCwyOCwyOGMxNS40NjQsMCwyOC0xMi41MzYsMjgtMjggICAgQzM3Ni4wMDcsMzQwLjU0NCwzNjMuNDcxLDMyOC4wMDgsMzQ4LjAwNywzMjguMDA4eiBNMzQ4LjAwNywzNjguMDA4Yy02LjYyNywwLTEyLTUuMzczLTEyLTEyYzAtNi42MjcsNS4zNzMtMTIsMTItMTIgICAgYzYuNjI3LDAsMTIsNS4zNzMsMTIsMTJDMzYwLjAwNywzNjIuNjM1LDM1NC42MzQsMzY4LjAwOCwzNDguMDA3LDM2OC4wMDh6IiBmaWxsPSIjMDAwMDAwIi8+Cgk8L2c+CjwvZz4KPGc+Cgk8Zz4KCQk8cGF0aCBkPSJNMjg4LjAwNywzMjguMDA4aC05NmMtOC44MzcsMC0xNiw3LjE2My0xNiwxNnYyNGMwLDguODM3LDcuMTYzLDE2LDE2LDE2aDk2YzguODM3LDAsMTYtNy4xNjMsMTYtMTZ2LTI0ICAgIEMzMDQuMDA3LDMzNS4xNzEsMjk2Ljg0NCwzMjguMDA4LDI4OC4wMDcsMzI4LjAwOHogTTI4OC4wMDcsMzY4LjAwOGgtOTZ2LTI0aDk2VjM2OC4wMDh6IiBmaWxsPSIjMDAwMDAwIi8+Cgk8L2c+CjwvZz4KPGc+Cgk8Zz4KCQk8cGF0aCBkPSJNNDc1Ljg3MSwxMjlsLTIzMi0xMjhjLTIuNDA1LTEuMzI3LTUuMzIzLTEuMzI3LTcuNzI4LDBsLTIzMiwxMjhjLTMuODcsMi4xMzEtNS4yODEsNi45OTYtMy4xNSwxMC44NjYgICAgYzEuNDA3LDIuNTU2LDQuMDk1LDQuMTQ0LDcuMDEzLDQuMTQyaDh2MzM2aDQ4di0yOTZoMzUydjI5Nmg0OHYtMzM2aDhjNC40MTgsMC4wMDMsOC4wMDMtMy41NzYsOC4wMDYtNy45OTUgICAgQzQ4MC4wMTUsMTMzLjA5NSw0NzguNDI3LDEzMC40MDcsNDc1Ljg3MSwxMjl6IE0yNDAuMDA3LDE3LjE1MmwyMDAuOTM2LDExMC44NTZIMzkuMDcxTDI0MC4wMDcsMTcuMTUyeiBNNDQ4LjAwNyw0NjQuMDA4aC0xNiAgICB2LTI5NmgtMzg0djI5NmgtMTZ2LTMyMGg0MTZWNDY0LjAwOHoiIGZpbGw9IiMwMDAwMDAiLz4KCTwvZz4KPC9nPgo8Zz4KCTxnPgoJCTxwYXRoIGQ9Ik0xNjguMDA3LDc1LjA2NHY0NC45NDRoNjRWNDMuMDY0TDE2OC4wMDcsNzUuMDY0eiBNMjE2LjAwNywxMDQuMDA4aC0zMlY4NC45NTJsMzItMTZWMTA0LjAwOHoiIGZpbGw9IiMwMDAwMDAiLz4KCTwvZz4KPC9nPgo8Zz4KCTxnPgoJCTxwYXRoIGQ9Ik0yNDguMDA3LDQzLjA2NHY3Ni45NDRoNjRWNzUuMDY0TDI0OC4wMDcsNDMuMDY0eiBNMjk2LjAwNywxMDQuMDA4aC0zMlY2OC45NTJsMzIsMTZWMTA0LjAwOHoiIGZpbGw9IiMwMDAwMDAiLz4KCTwvZz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K",name:{en:"Garage"},members:[]},type:"enum"}},"enum.functions":{"enum.functions.light":{_id:"enum.functions.light",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgJy0vL1czQy8vRFREIFNWRyAxLjEvL0VOJyAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUxMiA1MTIiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIj4KICA8Zz4KICAgIDxnPgogICAgICA8cGF0aCBkPSJtMjU2LDkyLjNjLTc0LjIsMC0xMjcuOCw1NS4zLTEzNi4zLDExNC43LTUuMywzOS42IDcuNSw3OC4yIDM0LjEsMTA3LjQgMjMuNCwyNSAzNi4yLDU4LjQgMzYuMiw5Mi44bC0uMSw1NC4yYzAsMjEuOSAxOC4xLDM5LjYgNDAuNSwzOS42aDUyLjJjMjIuNCwwIDQwLjUtMTcuNyA0MC41LTM5LjZsLjEtNTQuMmMwLTM1LjQgMTEuNy02Ny44IDM0LjEtOTAuNyAyNC41LTI1IDM3LjMtNTcuMyAzNy4zLTkwLjctMC4xLTc0LjEtNjMtMTMzLjUtMTM4LjYtMTMzLjV6bTQ2LjgsMzY5LjFjMCwxMC40LTguNSwxOC44LTE5LjIsMTguOGgtNTIuMmMtMTAuNywwLTE5LjItOC4zLTE5LjItMTguOHYtMjRoOTAuNXYyNHptMzkuNi0xNTkuNWMtMjYuNiwyNy4xLTQwLjUsNjQuNi00MC41LDEwNS4zdjkuNGgtOTAuNXYtOS40YzAtMzguNi0xNi03Ny4xLTQyLjYtMTA2LjMtMjMuNC0yNS0zMy01Ny4zLTI4LjgtOTAuNyA3LjUtNTAgNTQtOTcgMTE2LjEtOTcgNjUsMCAxMTcuMiw1MS4xIDExNy4yLDExMi42IDAsMjguMS0xMC43LDU1LjItMzAuOSw3Ni4xeiIvPgogICAgICA8cmVjdCB3aWR0aD0iMjEuMyIgeD0iMjQ1LjMiIHk9IjExIiBoZWlnaHQ9IjUwIi8+CiAgICAgIDxwb2x5Z29uIHBvaW50cz0iMzg1LjEsMTA3LjQgNDAwLDEyMi4zIDQzNi41LDg3LjIgNDIxLjUsNzIuMyAgICIvPgogICAgICA8cmVjdCB3aWR0aD0iNTIuMiIgeD0iNDQ4LjgiIHk9IjIzNi4yIiBoZWlnaHQ9IjIwLjkiLz4KICAgICAgPHJlY3Qgd2lkdGg9IjUyLjIiIHg9IjExIiB5PSIyMzYuMiIgaGVpZ2h0PSIyMC45Ii8+CiAgICAgIDxwb2x5Z29uIHBvaW50cz0iOTAuMSw3Mi4yIDc1LjEsODcuMSAxMTEuNiwxMjIuMiAxMjYuNSwxMDcuMyAgICIvPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==",name:{en:"Light"},members:[]},type:"enum"},"enum.functions.blinds":{_id:"enum.functions.blinds",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTEyIDUxMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJCTxwYXRoIGQ9Ik0wLDB2NTEyaDUxMlYwSDB6IE00ODIsNDgySDMwVjMwaDQ1MlY0ODJ6Ii8+DQo8L2c+DQo8Zz4NCgkJPHBhdGggZD0iTTYwLDYwdjM5MmgzOTJWNjBINjB6IE0yNDEsNDIySDkwVjI3MWgxNTFWNDIyeiBNMjQxLDI0MUg5MFY5MGgxNTFWMjQxeiBNNDIyLDQyMkgyNzFWMjcxaDE1MVY0MjJ6IE00MjIsMjQxSDI3MVY5MGgxNTENCgkJCVYyNDF6Ii8+DQo8L2c+DQo8L3N2Zz4NCg==",name:{en:"Blinds"},members:[]},type:"enum"},"enum.functions.weather":{_id:"enum.functions.weather",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNjAgNjAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDYwIDYwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8cGF0aCBkPSJNNTQuOTQ5LDI4LjI1MWMwLjAxOC0wLjA2OSwwLjAzOS0wLjEzNSwwLjA0Mi0wLjIwN0M1NC45OTIsMjguMDI5LDU1LDI4LjAxNiw1NSwyOEM1NSwxNC41NSw0NC4zMjMsMy41NTMsMzEsMy4wMjVWMQ0KCWMwLTAuNTUzLTAuNDQ4LTEtMS0xcy0xLDAuNDQ3LTEsMXYyLjAyNUMxNS42NzcsMy41NTMsNSwxNC41NSw1LDI4YzAsMC4wMTYsMC4wMDgsMC4wMjksMC4wMDksMC4wNDUNCgljMC4wMDMsMC4wNzEsMC4wMjMsMC4xMzcsMC4wNDIsMC4yMDdjMC4wMTYsMC4wNTksMC4wMjUsMC4xMTgsMC4wNSwwLjE3MmMwLjAyNSwwLjA1MywwLjA2NCwwLjA5NywwLjA5OCwwLjE0NQ0KCWMwLjA0MiwwLjA1OSwwLjA4MSwwLjExOCwwLjEzNSwwLjE2N2MwLjAxMSwwLjAxLDAuMDE2LDAuMDI1LDAuMDI4LDAuMDM1YzAuMDM2LDAuMDMsMC4wOCwwLjA0LDAuMTE4LDAuMDY0DQoJYzAuMDU5LDAuMDM3LDAuMTE1LDAuMDc0LDAuMTgyLDAuMDk4YzAuMDcsMC4wMjYsMC4xNDEsMC4wMzQsMC4yMTMsMC4wNDNDNS45MTgsMjguOTgsNS45NTYsMjksNiwyOQ0KCWMwLjAxNSwwLDAuMDI3LTAuMDA4LDAuMDQyLTAuMDA4YzAuMDc2LTAuMDAzLDAuMTQ3LTAuMDI0LDAuMjItMC4wNDRjMC4wNTQtMC4wMTUsMC4xMDktMC4wMjMsMC4xNTgtMC4wNDcNCgljMC4wNTctMC4wMjYsMC4xMDQtMC4wNjgsMC4xNTYtMC4xMDVjMC4wNTUtMC4wNCwwLjExMS0wLjA3NywwLjE1Ny0wLjEyN2MwLjAxMS0wLjAxMiwwLjAyNi0wLjAxNywwLjAzNy0wLjAzDQoJQzguMTgsMjYuOTM3LDEwLjAzOCwyNiwxMiwyNnMzLjgyLDAuOTM3LDUuMjMsMi42MzljMC4wMTksMC4wMjMsMC4wNDgsMC4wMzIsMC4wNjksMC4wNTNjMC4wMjQsMC4wMjQsMC4wMzYsMC4wNTYsMC4wNjMsMC4wNzgNCgljMC4wNCwwLjAzMywwLjA4OCwwLjA0NSwwLjEzLDAuMDcxYzAuMDUxLDAuMDMxLDAuMDk4LDAuMDYyLDAuMTUyLDAuMDgyYzAuMDgyLDAuMDMyLDAuMTY0LDAuMDQ1LDAuMjQ5LDAuMDU0DQoJQzE3LjkzLDI4Ljk4MSwxNy45NjQsMjksMTgsMjljMC4wMTYsMCwwLjAzMS0wLjAwNywwLjA0Ni0wLjAwOGMwLjA1MS0wLjAwMiwwLjA5OC0wLjAxNSwwLjE0OC0wLjAyNQ0KCWMwLjA2OS0wLjAxNCwwLjEzNS0wLjAzLDAuMi0wLjA1OWMwLjA1LTAuMDIyLDAuMDk1LTAuMDUsMC4xNDEtMC4wODFjMC4wMzMtMC4wMjEsMC4wNy0wLjAzMiwwLjEwMS0wLjA1OA0KCWMwLjAyNC0wLjAyLDAuMDM1LTAuMDQ4LDAuMDU3LTAuMDdjMC4wMjMtMC4wMjMsMC4wNTQtMC4wMzUsMC4wNzUtMC4wNjFDMjAuMTgsMjYuOTM3LDIyLjAzOCwyNiwyNCwyNmMxLjg2LDAsMy42MiwwLjg1LDUsMi4zODZWNTUNCgljMCwxLjY1NC0xLjM0NiwzLTMsM3MtMy0xLjM0Ni0zLTNjMC0wLjU1My0wLjQ0OC0xLTEtMXMtMSwwLjQ0Ny0xLDFjMCwyLjc1NywyLjI0Myw1LDUsNXM1LTIuMjQzLDUtNVYyOC4zODYNCglDMzIuMzgsMjYuODUsMzQuMTQsMjYsMzYsMjZjMS45NjIsMCwzLjgyLDAuOTM3LDUuMjMsMi42MzljMC4wMTksMC4wMjMsMC4wNDgsMC4wMzIsMC4wNjksMC4wNTMNCgljMC4wMjQsMC4wMjQsMC4wMzYsMC4wNTYsMC4wNjMsMC4wNzhjMC4wNCwwLjAzMywwLjA4OCwwLjA0NCwwLjEzLDAuMDdjMC4wNTEsMC4wMzEsMC4wOTgsMC4wNjIsMC4xNTMsMC4wODMNCgljMC4wODEsMC4wMzEsMC4xNjMsMC4wNDUsMC4yNDksMC4wNTRDNDEuOTMsMjguOTgxLDQxLjk2NCwyOSw0MiwyOWMwLjAxNiwwLDAuMDMxLTAuMDA3LDAuMDQ2LTAuMDA4DQoJYzAuMDUxLTAuMDAyLDAuMDk5LTAuMDE1LDAuMTQ5LTAuMDI2YzAuMDY4LTAuMDE0LDAuMTM0LTAuMDMsMC4xOTktMC4wNThjMC4wNTEtMC4wMjIsMC4wOTYtMC4wNTEsMC4xNDItMC4wODENCgljMC4wMzMtMC4wMjEsMC4wNy0wLjAzMiwwLjEwMS0wLjA1N2MwLjAyNC0wLjAyLDAuMDM1LTAuMDQ4LDAuMDU2LTAuMDdjMC4wMjMtMC4wMjMsMC4wNTQtMC4wMzUsMC4wNzYtMC4wNjENCglDNDQuMTgsMjYuOTM3LDQ2LjAzOCwyNiw0OCwyNnMzLjgyLDAuOTM3LDUuMjMsMi42MzljMC4wMSwwLjAxMiwwLjAyNCwwLjAxNSwwLjAzNSwwLjAyN2MwLjA3LDAuMDc3LDAuMTU0LDAuMTM1LDAuMjQ1LDAuMTg4DQoJYzAuMDMxLDAuMDE4LDAuMDU1LDAuMDQ1LDAuMDg4LDAuMDU5QzUzLjcyMSwyOC45NjcsNTMuODU2LDI5LDU0LDI5aDBoMGMwLjEyMywwLDAuMjQ1LTAuMDI3LDAuMzYxLTAuMDczDQoJYzAuMDQ1LTAuMDE4LDAuMDgyLTAuMDQ3LDAuMTI0LTAuMDcxYzAuMDUxLTAuMDI5LDAuMTA2LTAuMDQ4LDAuMTUyLTAuMDg3YzAuMDEyLTAuMDEsMC4wMTctMC4wMjQsMC4wMjgtMC4wMzUNCgljMC4wNTQtMC4wNDksMC4wOTItMC4xMDcsMC4xMzUtMC4xNjdjMC4wMzQtMC4wNDgsMC4wNzMtMC4wOTMsMC4wOTgtMC4xNDVDNTQuOTI0LDI4LjM2OSw1NC45MzQsMjguMzEsNTQuOTQ5LDI4LjI1MXogTTQ4LDI0DQoJYy0yLjIxOCwwLTQuMzEyLDAuODk1LTYsMi41MzRDNDAuMzEyLDI0Ljg5NSwzOC4yMTgsMjQsMzYsMjRzLTQuMzEyLDAuODk1LTYsMi41MzRDMjguMzEyLDI0Ljg5NSwyNi4yMTgsMjQsMjQsMjQNCglzLTQuMzEyLDAuODk1LTYsMi41MzRDMTYuMzEyLDI0Ljg5NSwxNC4yMTgsMjQsMTIsMjRjLTEuNzUsMC0zLjQxOCwwLjU2Ni00Ljg3NSwxLjYwNUM4LjMyNywxNC4wNDQsMTguMTI3LDUsMzAsNQ0KCXMyMS42NzMsOS4wNDQsMjIuODc1LDIwLjYwNUM1MS40MTgsMjQuNTY2LDQ5Ljc1LDI0LDQ4LDI0eiIvPg0KPC9zdmc+DQo=",name:{en:"Weather"},members:[]},type:"enum"},"enum.functions.heating":{_id:"enum.functions.heating",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTEyIDUxMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHBhdGggZD0iTTQ0MC4zNzEsMTU5LjI5MWM4LjA1MSwwLDE1LjQwMy0zLjAzNSwyMC45ODMtOC4wMTZINTA0LjVjNC4xNDIsMCw3LjUtMy4zNTgsNy41LTcuNWMwLTQuMTQyLTMuMzU4LTcuNS03LjUtNy41aC0zMy43NjMNCgkJYzAuNzY0LTIuNzE2LDEuMTgyLTUuNTc2LDEuMTgyLTguNTMzYzAtMi45NTctMC40MTgtNS44MTYtMS4xODItOC41MzJINTA0LjVjNC4xNDIsMCw3LjUtMy4zNTgsNy41LTcuNQ0KCQljMC00LjE0Mi0zLjM1OC03LjUtNy41LTcuNWgtNDMuMTQ2Yy01LjU4LTQuOTgxLTEyLjkzMi04LjAxNi0yMC45ODMtOC4wMTZjLTYuMTMzLDAtMTEuODU5LDEuNzY1LTE2LjcwNyw0LjgwNQ0KCQljLTEuMzQyLTExLjcxMS0xMS4zMDktMjAuODM3LTIzLjM3My0yMC44MzdoLTI0LjA0OWMtMTAuMzU0LDAtMTkuMTYsNi43MjQtMjIuMywxNi4wMzJoLTE5LjUzDQoJCWMtMy4xMzktOS4zMDgtMTEuOTQ2LTE2LjAzMi0yMi4zLTE2LjAzMmgtMjQuMDQ4Yy0xMC4zNTQsMC0xOS4xNiw2LjcyNC0yMi4zLDE2LjAzMmgtMTkuNTMNCgkJYy0zLjEzOS05LjMwOC0xMS45NDYtMTYuMDMyLTIyLjMtMTYuMDMyaC0yNC4wNDhjLTEwLjM1NCwwLTE5LjE2LDYuNzI0LTIyLjMsMTYuMDMyaC0xOS41Mw0KCQljLTMuMTM5LTkuMzA4LTExLjk0Ni0xNi4wMzItMjIuMy0xNi4wMzJoLTI0LjA0OWMtMTAuMzU0LDAtMTkuMTYsNi43MjQtMjIuMywxNi4wMzJINjkuODgNCgkJYy0zLjEzOS05LjMwOC0xMS45NDYtMTYuMDMyLTIyLjMtMTYuMDMySDIzLjUzMkMxMC41NTcsODAuMTYxLDAsOTAuNzE4LDAsMTAzLjY5M3YzMDQuNjEzYzAsMTIuOTc2LDEwLjU1NywyMy41MzIsMjMuNTMyLDIzLjUzMg0KCQlINDcuNThjMTAuMzU0LDAsMTkuMTYtNi43MjQsMjIuMy0xNi4wMzJoMTkuNTNjMy4xMzksOS4zMDgsMTEuOTQ2LDE2LjAzMiwyMi4zLDE2LjAzMmgyNC4wNDljMTAuMzU0LDAsMTkuMTYtNi43MjQsMjIuMy0xNi4wMzINCgkJaDE5LjUzYzMuMTM5LDkuMzA4LDExLjk0NiwxNi4wMzIsMjIuMywxNi4wMzJoMjQuMDQ4YzEwLjM1NCwwLDE5LjE2LTYuNzI0LDIyLjMtMTYuMDMyaDE5LjUzDQoJCWMzLjEzOSw5LjMwOCwxMS45NDYsMTYuMDMyLDIyLjMsMTYuMDMyaDI0LjA0OGMxMC4zNTQsMCwxOS4xNi02LjcyNCwyMi4zLTE2LjAzMmgxOS41M2MzLjEzOSw5LjMwOCwxMS45NDYsMTYuMDMyLDIyLjMsMTYuMDMyDQoJCWgyNC4wNDljMTIuOTc2LDAsMjMuNTMyLTEwLjU1NywyMy41MzItMjMuNTMydi0wLjUxNkg1MDQuNWM0LjE0MiwwLDcuNS0zLjM1OCw3LjUtNy41YzAtNC4xNDItMy4zNTgtNy41LTcuNS03LjVoLTgwLjY3N3YtMTcuMDY1DQoJCUg1MDQuNWM0LjE0MiwwLDcuNS0zLjM1OCw3LjUtNy41YzAtNC4xNDItMy4zNTgtNy41LTcuNS03LjVoLTgwLjY3N1YxNTQuNTg3QzQyOC42MzcsMTU3LjU2Niw0MzQuMzA2LDE1OS4yOTEsNDQwLjM3MSwxNTkuMjkxeg0KCQkgTTQ0MC4zNzEsMTExLjE5M2M5LjEyNSwwLDE2LjU0OCw3LjQyMywxNi41NDgsMTYuNTQ4cy03LjQyMywxNi41NDktMTYuNTQ4LDE2LjU0OXMtMTYuNTQ4LTcuNDI0LTE2LjU0OC0xNi41NDkNCgkJUzQzMS4yNDYsMTExLjE5Myw0NDAuMzcxLDExMS4xOTN6IE02My42MTMsMzM2LjY3NmMtNC4xNDIsMC03LjUsMy4zNTgtNy41LDcuNXY2NC4xM2MwLDQuNzA1LTMuODI4LDguNTMzLTguNTMyLDguNTMzSDIzLjUzMg0KCQljLTQuNzA1LDAtOC41MzItMy44MjgtOC41MzItOC41MzJWMTAzLjY5M2MwLTQuNzA1LDMuODI4LTguNTMyLDguNTMyLTguNTMySDQ3LjU4YzQuNzA1LDAsOC41MzIsMy44MjgsOC41MzIsOC41MzJWMzEyLjExDQoJCWMwLDQuMTQyLDMuMzU4LDcuNSw3LjUsNy41YzQuMTQyLDAsNy41LTMuMzU4LDcuNS03LjVWMTU5LjI5aDE3LjA2NHYxOTMuNDE5SDcxLjExM3YtOC41MzMNCgkJQzcxLjExMywzNDAuMDM0LDY3Ljc1NSwzMzYuNjc2LDYzLjYxMywzMzYuNjc2eiBNODguMTc3LDQwMC44MDZINzEuMTEzdi0zMy4wOTdoMTcuMDY0VjQwMC44MDZ6IE04OC4xNzcsMTQ0LjI5SDcxLjExM3YtMzMuMDk3DQoJCWgxNy4wNjRWMTQ0LjI5eiBNMTQ0LjI5LDQwOC4zMDZjMC4wMDEsNC43MDUtMy44MjcsOC41MzMtOC41MzIsOC41MzNoLTI0LjA0OWMtNC43MDUsMC04LjUzMi0zLjgyOC04LjUzMi04LjUzMlYxMDMuNjkzDQoJCWMwLTQuNzA1LDMuODI4LTguNTMyLDguNTMyLTguNTMyaDI0LjA0OWM0LjcwNSwwLDguNTMyLDMuODI4LDguNTMyLDguNTMyVjQwOC4zMDZ6IE0xNzYuMzU1LDQwMC44MDZoLTE3LjA2NHYtMzMuMDk3aDE3LjA2NA0KCQlWNDAwLjgwNnogTTE3Ni4zNTUsMzUyLjcxaC0xNy4wNjRWMTU5LjI5MWgxNy4wNjRWMzUyLjcxeiBNMTc2LjM1NSwxNDQuMjkxaC0xNy4wNjR2LTMzLjA5N2gxNy4wNjRWMTQ0LjI5MXogTTIzMi40NjgsNDA4LjMwNg0KCQljMCw0LjcwNS0zLjgyOCw4LjUzMy04LjUzMiw4LjUzM2gtMjQuMDQ4Yy00LjcwNSwwLTguNTMyLTMuODI4LTguNTMyLTguNTMyVjEwMy42OTNjMC00LjcwNSwzLjgyOC04LjUzMiw4LjUzMi04LjUzMmgyNC4wNDgNCgkJYzQuNzA1LDAsOC41MzIsMy44MjgsOC41MzIsOC41MzJWNDA4LjMwNnogTTI2NC41MzIsNDAwLjgwNmgtMTcuMDY0di0zMy4wOTdoMTcuMDY0VjQwMC44MDZ6IE0yNjQuNTMyLDM1Mi43MWgtMTcuMDY0VjE1OS4yOTENCgkJaDE3LjA2NFYzNTIuNzF6IE0yNjQuNTMyLDE0NC4yOTFoLTE3LjA2NHYtMzMuMDk3aDE3LjA2NFYxNDQuMjkxeiBNMzIwLjY0NSw0MDguMzA2YzAsNC43MDUtMy44MjgsOC41MzMtOC41MzIsOC41MzNoLTI0LjA0OA0KCQljLTQuNzA1LDAtOC41MzItMy44MjgtOC41MzItOC41MzJWMTAzLjY5M2MwLTQuNzA1LDMuODI4LTguNTMyLDguNTMyLTguNTMyaDI0LjA0OGM0LjcwNSwwLDguNTMyLDMuODI4LDguNTMyLDguNTMyVjQwOC4zMDZ6DQoJCSBNMzM1LjY0NSwxMTEuMTkzaDE3LjA2NHYzMy4wOTdoLTE3LjA2NFYxMTEuMTkzeiBNMzUyLjcwOSw0MDAuODA3aC0xNy4wNjRWMzY3LjcxaDE3LjA2NFY0MDAuODA3eiBNNDA4LjgyMyw0MDguMzA3DQoJCWMwLDQuNzA1LTMuODI4LDguNTMyLTguNTMyLDguNTMyaC0yNC4wNDljLTQuNzA1LDAtOC41MzItMy44MjgtOC41MzItOC41MzJWMTk5Ljg5YzAtNC4xNDItMy4zNTgtNy41LTcuNS03LjUNCgkJYy00LjE0MiwwLTcuNSwzLjM1OC03LjUsNy41djE1Mi44MmgtMTcuMDY0VjE1OS4yOTFoMTcuMDY0djguNTMzYzAsNC4xNDIsMy4zNTgsNy41LDcuNSw3LjVjNC4xNDIsMCw3LjUtMy4zNTgsNy41LTcuNXYtNjQuMTMNCgkJYzAtNC43MDUsMy44MjgtOC41MzIsOC41MzItOC41MzJoMjQuMDQ5YzQuNzA1LDAsOC41MzIsMy44MjgsOC41MzIsOC41MzJWNDA4LjMwN3oiLz4NCjwvZz4NCjwvc3ZnPg0K",name:{en:"Heating"},members:[]},type:"enum"},"enum.functions.backlight":{_id:"enum.functions.backlight",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNTExLjk5MSA1MTEuOTkxIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MTEuOTkxIDUxMS45OTE7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik05MS40OSwzMzYuNTcybC0yMS4zMzMsNDIuNjY3Yy0yLjYyNCw1LjI2OS0wLjQ5MSwxMS42NjksNC43NzksMTQuMzE1YzEuNTM2LDAuNzQ3LDMuMTU3LDEuMTA5LDQuNzU3LDEuMTA5DQoJCWMzLjkwNCwwLDcuNjU5LTIuMTc2LDkuNTM2LTUuODg4bDIxLjMzMy00Mi42NjdjMi42NDUtNS4yNjksMC41MTItMTEuNjY5LTQuNzU3LTE0LjMxNQ0KCQlDMTAwLjU1NywzMjkuMTY5LDk0LjE1NywzMzEuMzI0LDkxLjQ5LDMzNi41NzJ6Ii8+DQoJPHBhdGggZD0iTTUwNy41NTQsMTgzLjM1NmMtMi43NzMtMi4wMjctNi4zMzYtMi41MzktOS42LTEuNDkzbC00OS40MDgsMTYuNDY5Yy0xMy4wOTksNC4zNzMtMjEuODg4LDE2LjU3Ni0yMS44ODgsMzAuMzc5djM2Ljg4NQ0KCQljLTI0LjMyLTQuOTQ5LTQyLjY2Ny0yNi40OTYtNDIuNjY3LTUyLjI0NXYtODUuMzMzYzAtMzEuMjMyLTEyLjEzOS02MC43MTUtMzQuMzA0LTgzLjExNQ0KCQljLTIyLjMxNS0yMi4xMDEtNTEuNzk3LTM0LjI0LTgzLjAyOS0zNC4yNGMtNjQuNjgzLDAtMTE3LjMzMyw1Mi42NTEtMTE3LjMzMywxMTcuMzMzdjUzLjMzM2gtMzJjLTE3LjY0MywwLTMyLDE0LjM1Ny0zMiwzMg0KCQl2NDAuMTQ5TDEuMTIyLDQyMS45MDVjLTEuNjQzLDMuMzA3LTEuNDcyLDcuMjMyLDAuNDQ4LDEwLjM2OGMxLjk2MywzLjEzNiw1LjM5Nyw1LjA1Niw5LjA4OCw1LjA1Nmg3NS43NTUNCgkJYzUuMjI3LDM2LjA5NiwzNi4wNzUsNjQsNzMuNTc5LDY0czY4LjM1Mi0yNy45MDQsNzMuNTc5LTY0aDc1Ljc1NWMwLjE0OSwwLDAuMzIsMC4wMjEsMC40MjcsMA0KCQljNS44ODgsMCwxMC42NjctNC43NzksMTAuNjY3LTEwLjY2N2MwLTIuNzUyLTEuMDI0LTUuMjQ4LTIuNzMxLTcuMTI1bC04My4wMjktMTY2LjA1OXYtNDAuMTQ5YzAtMTcuNjQzLTE0LjM1Ny0zMi0zMi0zMmgtMzINCgkJdi01My4zMzNjMC01Mi45MjgsNDMuMDcyLTk2LDk2LTk2YzI1LjU1NywwLDQ5LjcyOCw5Ljk2Myw2Ny45NDcsMjcuOTg5YzE4LjA5MSwxOC4yODMsMjguMDUzLDQyLjQ1MywyOC4wNTMsNjguMDExdjg1LjMzMw0KCQljMCwzNy41MDQsMjcuOTA0LDY4LjM1Miw2NCw3My41Nzl2MzkuMDRjMCwxMy43ODEsOC43ODksMjYuMDA1LDIxLjg2NywzMC4zNTdsNDkuNDA4LDE2LjQ2OQ0KCQljMS4xMzEsMC4zNjMsMi4yNjEsMC41NTUsMy4zOTIsMC41NTVjMi4yMTksMCw0LjM5NS0wLjY4Myw2LjIyOS0yLjAyN2MyLjc5NS0xLjk4NCw0LjQzNy01LjIwNSw0LjQzNy04LjY0VjE5MS45OTYNCgkJQzUxMS45OTEsMTg4LjU2MSw1MTAuMzQ5LDE4NS4zNCw1MDcuNTU0LDE4My4zNTZ6IE0xNTkuOTkxLDQ3OS45OTZjLTI1Ljc0OSwwLTQ3LjMxNy0xOC4zNDctNTIuMjY3LTQyLjY2N2gxMDQuNTMzDQoJCUMyMDcuMzA5LDQ2MS42NDksMTg1Ljc0MSw0NzkuOTk2LDE1OS45OTEsNDc5Ljk5NnogTTI5Mi4wODcsNDE1Ljk5NmgtNjguMDk2aC0xMjhIMjcuOTE3bDc0LjY2Ny0xNDkuMzMzaDExNC44MzcNCgkJTDI5Mi4wODcsNDE1Ljk5NnogTTIwMi42NTgsMjAyLjY2MmM1Ljg2NywwLDEwLjY2Nyw0LjgsMTAuNjY3LDEwLjY2N3YzMkgxMDYuNjU4di0zMmMwLTUuODY3LDQuOC0xMC42NjcsMTAuNjY3LTEwLjY2N0gyMDIuNjU4eg0KCQkgTTQ5MC42NTgsMzQ3Ljg3OGwtMzUuMzcxLTExLjgxOWMtNC4zNzMtMS40MjktNy4yOTYtNS41MDQtNy4yOTYtMTAuMTEydi05Ny4yNTljMC00LjYwOCwyLjkyMy04LjY2MSw3LjI5Ni0xMC4xMTINCgkJbDM1LjM3MS0xMS43OTdWMzQ3Ljg3OHoiLz4NCjwvZz4NCjwvc3ZnPg0K",name:{en:"Backlight"},members:[]},type:"enum"},"enum.functions.household":{_id:"enum.functions.household",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgJy0vL1czQy8vRFREIFNWRyAxLjEvL0VOJyAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUxMiA1MTIiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIj4KICA8Zz4KICAgIDxnPgogICAgICA8cGF0aCBkPSJtMjU2LDkyLjNjLTc0LjIsMC0xMjcuOCw1NS4zLTEzNi4zLDExNC43LTUuMywzOS42IDcuNSw3OC4yIDM0LjEsMTA3LjQgMjMuNCwyNSAzNi4yLDU4LjQgMzYuMiw5Mi44bC0uMSw1NC4yYzAsMjEuOSAxOC4xLDM5LjYgNDAuNSwzOS42aDUyLjJjMjIuNCwwIDQwLjUtMTcuNyA0MC41LTM5LjZsLjEtNTQuMmMwLTM1LjQgMTEuNy02Ny44IDM0LjEtOTAuNyAyNC41LTI1IDM3LjMtNTcuMyAzNy4zLTkwLjctMC4xLTc0LjEtNjMtMTMzLjUtMTM4LjYtMTMzLjV6bTQ2LjgsMzY5LjFjMCwxMC40LTguNSwxOC44LTE5LjIsMTguOGgtNTIuMmMtMTAuNywwLTE5LjItOC4zLTE5LjItMTguOHYtMjRoOTAuNXYyNHptMzkuNi0xNTkuNWMtMjYuNiwyNy4xLTQwLjUsNjQuNi00MC41LDEwNS4zdjkuNGgtOTAuNXYtOS40YzAtMzguNi0xNi03Ny4xLTQyLjYtMTA2LjMtMjMuNC0yNS0zMy01Ny4zLTI4LjgtOTAuNyA3LjUtNTAgNTQtOTcgMTE2LjEtOTcgNjUsMCAxMTcuMiw1MS4xIDExNy4yLDExMi42IDAsMjguMS0xMC43LDU1LjItMzAuOSw3Ni4xeiIvPgogICAgICA8cmVjdCB3aWR0aD0iMjEuMyIgeD0iMjQ1LjMiIHk9IjExIiBoZWlnaHQ9IjUwIi8+CiAgICAgIDxwb2x5Z29uIHBvaW50cz0iMzg1LjEsMTA3LjQgNDAwLDEyMi4zIDQzNi41LDg3LjIgNDIxLjUsNzIuMyAgICIvPgogICAgICA8cmVjdCB3aWR0aD0iNTIuMiIgeD0iNDQ4LjgiIHk9IjIzNi4yIiBoZWlnaHQ9IjIwLjkiLz4KICAgICAgPHJlY3Qgd2lkdGg9IjUyLjIiIHg9IjExIiB5PSIyMzYuMiIgaGVpZ2h0PSIyMC45Ii8+CiAgICAgIDxwb2x5Z29uIHBvaW50cz0iOTAuMSw3Mi4yIDc1LjEsODcuMSAxMTEuNiwxMjIuMiAxMjYuNSwxMDcuMyAgICIvPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==",name:{en:"Household"},members:[]},type:"enum"},"enum.functions.audio":{_id:"enum.functions.audio",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNDc3LjIxNiA0NzcuMjE2IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0NzcuMjE2IDQ3Ny4yMTY7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik00NTMuODU4LDEwNS4xMTZ2LTkxLjZjMC00LjMtMi4xLTguNC01LjUtMTAuOWMtMy41LTIuNS04LTMuMy0xMi4xLTJsLTI3Mi45LDg2LjdjLTUuNiwxLjgtOS40LDctOS40LDEyLjl2OTEuN3YwLjF2MTc1LjMNCgkJYy0xNC4zLTkuOS0zMi42LTE1LjMtNTEuOC0xNS4zYy0yMC4zLDAtMzkuNiw2LjEtNTQuMywxNy4xYy0xNS44LDExLjktMjQuNSwyOC0yNC41LDQ1LjVzOC43LDMzLjYsMjQuNSw0NS41DQoJCWMxNC43LDExLDMzLjksMTcuMSw1NC4zLDE3LjFzMzkuNi02LjEsNTQuMy0xNy4xYzE1LjgtMTEuOSwyNC41LTI4LDI0LjUtNDUuNXYtMjEyLjhsMjQ1LjktNzguMnYxNTYuNg0KCQljLTE0LjMtOS45LTMyLjYtMTUuMy01MS44LTE1LjNjLTIwLjMsMC0zOS42LDYuMS01NC4zLDE3LjFjLTE1LjgsMTEuOS0yNC41LDI4LTI0LjUsNDUuNXM4LjcsMzMuNiwyNC41LDQ1LjUNCgkJYzE0LjcsMTEsMzMuOSwxNy4xLDU0LjMsMTcuMXMzOS42LTYuMSw1NC4zLTE3LjFjMTUuOC0xMS45LDI0LjUtMjgsMjQuNS00NS41di0yMjIuMw0KCQlDNDUzLjg1OCwxMDUuMTE2LDQ1My44NTgsMTA1LjExNiw0NTMuODU4LDEwNS4xMTZ6IE0xMDIuMTU4LDQ1MC4yMTZjLTI4LjEsMC01MS44LTE2LjMtNTEuOC0zNS42YzAtMTkuMywyMy43LTM1LjYsNTEuOC0zNS42DQoJCXM1MS44LDE2LjMsNTEuOCwzNS42QzE1My45NTgsNDM0LjAxNiwxMzAuMjU4LDQ1MC4yMTYsMTAyLjE1OCw0NTAuMjE2eiBNMTgwLjk1OCwxNzMuNDE2di02My40bDI0NS45LTc4LjF2NjMuNEwxODAuOTU4LDE3My40MTZ6DQoJCSBNMzc1LjE1OCwzNjMuMTE2Yy0yOC4xLDAtNTEuOC0xNi4zLTUxLjgtMzUuNmMwLTE5LjMsMjMuNy0zNS42LDUxLjgtMzUuNnM1MS44LDE2LjMsNTEuOCwzNS42DQoJCUM0MjYuODU4LDM0Ni44MTYsNDAzLjE1OCwzNjMuMTE2LDM3NS4xNTgsMzYzLjExNnoiLz4NCjwvZz4NCjwvc3ZnPg0K",name:{en:"Audio/Music"},members:[]},type:"enum"},"enum.functions.security":{_id:"enum.functions.security",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTEyIDUxMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHBhdGggZD0iTTI1Niw0MC4wMWMtNS41MzgsMC05Ljk5LDQuNDYtOS45OSw5Ljk5YzAsNS4xNDcsMy44NzIsOS40Myw4Ljk5LDkuOTM4YzUuOTI1LDAuNTg4LDEwLjk5LTQuMDI3LDEwLjk5LTkuOTM4DQoJCUMyNjUuOTksNDQuNDYyLDI2MS41Myw0MC4wMSwyNTYsNDAuMDF6Ii8+DQo8L2c+DQo8Zz4NCgk8cGF0aCBkPSJNNDU2LDYwYy0yNy41NywwLTUwLTIyLjQzLTUwLTUwYzAtNS41MjItNC40NzgtMTAtMTAtMTBIMTE2Yy01LjUyMiwwLTEwLDQuNDc4LTEwLDEwYzAsMjcuNTctMjIuNDMsNTAtNTAsNTANCgkJYy01LjUyMiwwLTEwLDQuNDc4LTEwLDEwdjE2My4xOWMwLDEyNy4xNzcsODIuODk1LDI0MS4xMzUsMjA3LjEyOCwyNzguMzg5YzAuOTM3LDAuMjgsMS45MDQsMC40MjEsMi44NzIsMC40MjENCgkJYzAuOTY4LDAsMS45MzctMC4xNDEsMi44NzMtMC40MjJDMzgwLjQxNSw0NzUuMTE5LDQ2NiwzNjMuMTQ5LDQ2NiwyMzMuMTlWNzBDNDY2LDY0LjQ3OCw0NjEuNTIyLDYwLDQ1Niw2MHogTTQ0NiwyMzMuMTkNCgkJYzAsMTE5LjQ0OC03Ni4yMjEsMjIyLjg5Mi0xOTAsMjU4LjM1M0MxNDMuMTI4LDQ1Ni4zNjUsNjYsMzUxLjk4NCw2NiwyMzMuMTlWNzkuMjg4Qzk2LjYxMSw3NC44OSwxMjAuODksNTAuNjExLDEyNS4yODgsMjANCgkJaDI2MS40MjRDMzkxLjExLDUwLjYxMSw0MTUuMzg5LDc0Ljg5LDQ0Niw3OS4yODhWMjMzLjE5eiIvPg0KPC9nPg0KPGc+DQoJPHBhdGggZD0iTTQyMC4wMTIsOTIuNDljLTIwLjg1NC05LjEzMy0zNy4zNjktMjUuNjQ4LTQ2LjUwMi00Ni41MDJDMzcxLjkxNiw0Mi4zNSwzNjguMzIyLDQwLDM2NC4zNSw0MGgtNjguMzcNCgkJYy01LjUyMiwwLTEwLDQuNDc4LTEwLDEwczQuNDc4LDEwLDEwLDEwaDYyLjA0N2MxMC41NjUsMjAuNjgxLDI3LjI5MiwzNy40MDcsNDcuOTczLDQ3Ljk3M1YyMzMuMTkNCgkJYzAsOTcuODYzLTU4Ljc0OSwxODIuMzAzLTE1MCwyMTYuMTA0Yy05MS4yNTEtMzMuODAyLTE1MC0xMTguMjQxLTE1MC0yMTYuMTA0VjEwNy45NzNDMTI2LjY4MSw5Ny40MDcsMTQzLjQwNyw4MC42ODEsMTUzLjk3Myw2MA0KCQloNjIuMDQ3YzUuNTIyLDAsMTAtNC40NzgsMTAtMTBzLTQuNDc4LTEwLTEwLTEwaC02OC4zN2MtMy45NzIsMC03LjU2NiwyLjM1MS05LjE2LDUuOTg4DQoJCWMtOS4xMzMsMjAuODU0LTI1LjY0OCwzNy4zNjktNDYuNTAyLDQ2LjUwMkM4OC4zNTEsOTQuMDg0LDg2LDk3LjY3OSw4NiwxMDEuNjV2MTMxLjU0YzAsMTA3LjIxMyw2Ni4zMTEsMjAwLjY1MywxNjYuNjY0LDIzNi4xNjYNCgkJYzEuMDc5LDAuMzgyLDIuMjA3LDAuNTczLDMuMzM2LDAuNTczYzEuMTI5LDAsMi4yNTctMC4xOTEsMy4zMzYtMC41NzNDMzU5LjYwNSw0MzMuODczLDQyNiwzNDAuNDksNDI2LDIzMy4xOVYxMDEuNjUNCgkJQzQyNiw5Ny42NzgsNDIzLjY0OSw5NC4wODQsNDIwLjAxMiw5Mi40OXoiLz4NCjwvZz4NCjxnPg0KCTxwYXRoIGQ9Ik0yNTYsMTQ2Yy00OS42MjYsMC05MCw0MC4zNzQtOTAsOTBjMCw0OS42MjYsNDAuMzc0LDkwLDkwLDkwYzQ5LjYyNiwwLDkwLTQwLjM3NCw5MC05MEMzNDYsMTg2LjM3NCwzMDUuNjI2LDE0NiwyNTYsMTQ2eg0KCQkgTTI1NiwzMDZjLTM4LjU5OCwwLTcwLTMxLjQwMi03MC03MGMwLTM4LjU5OCwzMS40MDItNzAsNzAtNzBjMzguNTk4LDAsNzAsMzEuNDAyLDcwLDcwQzMyNiwyNzQuNTk4LDI5NC41OTgsMzA2LDI1NiwzMDZ6Ii8+DQo8L2c+DQo8Zz4NCgk8cGF0aCBkPSJNMzAzLjA3MSwyMDguOTI4Yy0zLjkwNi0zLjkwNC0xMC4yMzYtMy45MDQtMTQuMTQzLDBMMjQ2LDI1MS44NTdsLTEyLjkyOS0xMi45MjhjLTMuOTA2LTMuOTA0LTEwLjIzNi0zLjkwNC0xNC4xNDMsMA0KCQljLTMuOTA1LDMuOTA1LTMuOTA1LDEwLjIzNywwLDE0LjE0M2wyMCwyMEMyNDAuODgyLDI3NS4wMjMsMjQzLjQ0LDI3NiwyNDYsMjc2czUuMTE4LTAuOTc3LDcuMDcxLTIuOTI5bDUwLTUwDQoJCUMzMDYuOTc2LDIxOS4xNjYsMzA2Ljk3NiwyMTIuODM0LDMwMy4wNzEsMjA4LjkyOHoiLz4NCjwvZz4NCg0KPC9zdmc+DQo=",name:{en:"Security"},members:[]},type:"enum"}}},o=function(){if(g.$grid&&g.$grid.selectId)return o=g.$grid.selectId.bind(g.$grid),g.$grid.selectId.apply(g.$grid,arguments)};function h(e,t,n,i){if(d.length){var a=d.shift();"delObject"===a.name?g.main.socket.emit(a.name,a.id,function(){setTimeout(function(){h(void 0,void 0,void 0,i)},0)}):g.main.socket.emit(a.name,a.id,a.obj,function(){setTimeout(function(){h(void 0,void 0,void 0,i)},0)})}else!function a(s,o,r,c){if(s!==o&&g.main.objects[o])b(_("Name yet exists!"),!0),g.init(!0),c&&c();else if(s===o)!r||void 0===r.name&&void 0===r.icon&&void 0===r.color||d.push({name:"extendObject",id:s,obj:{common:r}}),c&&c();else if(g.main.objects[s]&&g.main.objects[s].common&&g.main.objects[s].common.nondeletable)b(_('Change of enum\'s id "%s" is not allowed!',s),!0),g.init(!0),c&&c();else{for(var e=s.length+1,l=[],t=0;t<g.list.length;t++)g.list[t].substring(0,e)===s+"."&&l.push(g.list[t]);g.main.socket.emit("getObject",s,function(e,i){setTimeout(function(){if(i){i._id=o,i._rev&&delete i._rev,r&&void 0!==r.name&&(i.common.name=r.name),r&&void 0!==r.icon&&(i.common.icon=r.icon),r&&void 0!==r.color&&(i.common.color=r.color),d.push({name:"delObject",id:s}),d.push({name:"setObject",id:o,obj:i});for(var e=0,t=0;t<l.length;t++){var n=l[t].replace(s+".",o+".");e++,a(l[t],n,null,function(){!--e&&c&&c()})}!l.length&&c&&c()}},0)})}}(e,t,n,function(){d.length?h(void 0,void 0,void 0,i):i&&i()})}function f(e){var t,n="";if(e){var i=e.replace(/[.#\\\/&?]+/g,"-");if(s[e])for(t in s[e])s[e].hasOwnProperty(t)&&-1===g.list.indexOf(t)&&(n+='<li class="new-group-item" data-id="'+t+'" data-enum="'+e+'"><a>'+g.main.getIconFromObj(s[e][t])+p(s[e][t])+"</a></li>");n&&(n+='<li class="divider"></li>'),n+='<li class="new-group-item" data-enum="'+e+'"><a><i class="material-icons">control_point</i><span>'+_("custom group")+"</span></a></li>",g.$gridEnum.find("#btn-new-group-"+i).html(n),g.$gridEnum.find('.btn-new-group-btn[data-target="btn-new-group-'+i+'"]').dropdown({constrainWidth:!1}),g.$gridEnum.find("#btn-new-group-"+i).find(".new-group-item").off("click").on("click",function(){var e=$(this).data("id"),t=$(this).data("enum");if(e){var n=t.replace(/[.#\\\/&?]+/g,"-");g.main.saveConfig("enums-active","enum-"+n),g.main.socket.emit("setObject",e,s[t][e],function(e){e&&g.main.showError(e)})}else v(null,t)})}else{for(t in a)a.hasOwnProperty(t)&&-1===g.list.indexOf(t)&&(n+='<li class="new-enum-item" data-id="'+t+'"><a>'+g.main.getIconFromObj(a[t])+p(a[t])+"</a></li>");n&&(n+='<li class="divider"></li>'),n+='<li class="new-enum-item"><a><i class="material-icons">control_point</i><span>'+_("custom enum")+"</span></a></li>",g.$gridEnum.find("#btn-new-enum").html(n),g.$gridEnum.find(".btn-new-enum-btn").dropdown({constrainWidth:!1}),g.$gridEnum.find(".new-enum-item").off("click").on("click",function(){var e=$(this).data("id");if(e){var t=e.replace(/[.#\\\/&?]+/g,"-");g.main.saveConfig("enums-active","enum-"+t),g.main.socket.emit("setObject",e,a[e],function(e){e&&g.main.showError(e)})}else v(null)})}}function p(e,t){var n;(n=t?e[t]:e)&&n.common&&n.common.name?n=translateName(n.common.name):n=(n=t.split(".").pop())[0].toUpperCase()+n.substring(1).toLowerCase();return n}function r(e,t,n){var i,a,s,o=g.main.objects[e],r=e.replace(/[.#\\\/&?]+/g,"-"),c='<div class="row enum-buttons" data-id="'+e+'"> <div class="col s12 "> <a class="btn-floating waves-effect waves-light blue btn-small dropdown-trigger btn-new-group-btn" title="'+_("New enum")+'" data-target="btn-new-group-'+r+'"><i class="material-icons">library_add</i></a> <ul id="btn-new-group-'+r+'" class="dropdown-content" data-id="'+e+'"></ul> <a class="btn-floating waves-effect waves-light btn-small btn-edit-category" title="'+_("Edit category")+'" data-id="'+e+'"> <i class="material-icons">edit</i> </a> <a class="btn-floating waves-effect btn-small waves-light red lighten-2 btn-del-category '+(o&&o.common&&(o.common.dontDelete||o.common["object-non-deletable"])?"disabled":"")+'" title="'+_("Delete category")+'" data-id="'+e+'"> <i class="material-icons">delete</i> </a> <div class="input-field"><input type="text" class="filter-input autocomplete" placeholder="'+_("Filter")+'"><label></label>\n <a class="filter-clear btn-floating btn-very-small red lighten-3" title="'+_("clear")+'"><i class="material-icons">clear</i></a></div>\n </div></div>';c+='<div class="row enum-body"><div class="col s12 enum-collection" data-id="'+e+'"><ul class="collection">';for(var l=0;l<g.list.length;l++)if(g.list[l].substring(0,e.length+1)===e+"."){var d=g.main.objects[g.list[l]],u="";if(d&&d.common&&d.common.color&&(u="background: "+d.common.color+"; ",g.main.invertColor(d.common.color)&&(!0,u+="color: white;")),c+='<li class="collection-item avatar" data-id="'+g.list[l]+'" style="'+u+'">'+g.main.getIcon(g.list[l],null,null,"icon")+'<span class="title">'+p(g.main.objects,g.list[l])+"</span><p>"+g.list[l]+"</p><br>",d&&d.common&&d.common.members&&d.common.members.length)for(var m=0;m<d.common.members.length;m++)c+=(i=d.common.members[m],a=g.list[l],s=void 0,s="",s+='<div class="chip" title="'+i+'">'+g.main.getIcon(i)+'<span><span class="chip-name">'+p(g.main.objects,i)+'</span></span><i class="close material-icons" data-enum="'+a+'" data-id="'+i+'">close</i></div>');c+='<a class="edit-content" data-id="'+g.list[l]+'"><i class="material-icons">edit</i></a>',c+='<a class="delete-content '+(d&&d.common&&(d.common.dontDelete||d.common["object-non-deletable"])?"disabled":"")+'" data-id="'+g.list[l]+'"><i class="material-icons">delete</i></a>',c+="</li>"}c+="</ul></div></div>",t.html(c),f(e),n&&t.find(".enum-collection").scrollTop(n),function(n){for(var e=g.$gridList.find('.enum-buttons[data-id="'+n+'"] .filter-input'),t={},i=0;i<g.list.length;i++){var a=g.list[i];if(a.substring(0,n.length+1)===n+"."){var s=p(g.main.objects,a),o=null;g.main.objects[a]&&g.main.objects[a].common&&g.main.objects[a].common.icon&&(o=g.main.objects[a].common.icon),t[s]=o}}var r=g.$gridList.find('.enum-buttons[data-id="'+n+'"] .filter-clear');e.mautocomplete({data:t,minLength:0,limit:10}).on("change",function(){var i,a,e,t=$(this).val();i=n,a=t,e=g.$gridList.find('.enum-collection[data-id="'+i+'"] .collection-item'),a?(a=a.toLowerCase(),e.each(function(){var e=$(this),t=e.data("id"),n=p(g.main.objects,t);-1!==n.toLowerCase().indexOf(a)?e.show():-1!==t.substring(i.length).toLowerCase().indexOf(a)?e.show():e.hide()})):e.show(),$(this).val()?r.show():r.hide(),g.main.saveConfig("filter-"+n,t)}).on("keyup",function(){$(this).trigger("change")}),r.off("click").on("click",function(){e.val("").trigger("change")}),g.main.config["filter-"+n]?e.val(g.main.config["filter-"+n]).trigger("change"):r.hide()}(e)}function n(){var e=g.$gridList.find(".tree-table-body");g.$gridList.removeClass("tree-table-list").addClass("tree-table-tiles"),g.$gridList.find(".tree-table-buttons").remove(),g.$gridList.prepend('<div class="row tree-table-buttons">\n <a class="btn-floating btn-small translateT btn-switch-tiles" title="'+_("change view mode")+'"><i class="material-icons">view_list</i></a>\n <a class="btn-floating waves-effect waves-light btn-small blue dropdown-trigger btn-new-enum-btn translationT" title="'+_("New enum")+'" data-target="btn-new-enum"><i class="material-icons">note_add</i></a>\n <ul id="btn-new-enum" class="dropdown-content"></ul>\n <a class="btn-floating waves-effect waves-light blue btn-small btn-edit translateT" title="'+_("Edit")+'" id="tab-enums-list-edit">\n <i class="material-icons">queue_play_next</i>\n </a>\n </div>');var t='<div class="col s12 cron-main-tab">';t+='<ul class="tabs">';for(var n=0;n<g.list.length;n++)if(2===g.list[n].split(".").length){var i=p(g.main.objects,g.list[n]);t+='<li class="tab col"><a href="#enum-'+encodeURIComponent(g.list[n]).replace(/[.%]/g,"-")+'">'+g.main.getIcon(g.list[n])+'<span class="name">'+i+"</span></a></li>"}t+="</ul>",t+="</div>";for(var a=0;a<g.list.length;a++)2===g.list[a].split(".").length&&(t+='<div id="enum-'+encodeURIComponent(g.list[a]).replace(/[.%]/g,"-")+'" class="col s12 page" data-id="'+g.list[a]+'" data-type="second">',t+="</div>");var s={};e.find(".enum-collection").each(function(){s[$(this).data("id")]=$(this).scrollTop()});try{var o=g.$gridEnum.find(".tree-table-body .collection").find(".collection-item");try{o.droppable("instance")&&o.droppable("destroy")}catch(n){console.error(n)}}catch(n){}e.html(t),0<e.find(".tabs li").length&&(e.find(".tabs").mtabs({onShow:function(e){g.main.saveConfig("enums-active",$(e).attr("id"))}}),g.main.config["enums-active"]&&!g.main.noSelect&&e.find(".tabs").mtabs("select",g.main.config["enums-active"])),e.find(".page").each(function(){r($(this).data("id"),$(this),s[$(this).data("id")])}),e.find(".btn-new-category").on("click",function(){v(null,$(this).data("id"))}),e.find(".btn-edit-category").on("click",function(){v($(this).data("id"))}),e.find(".btn-del-category").on("click",function(){l($(this).data("id"))}),e.find(".edit-content").on("click",function(){v($(this).data("id"))}),e.find(".delete-content").on("click",function(){l($(this).data("id"))}),e.find(".close").on("click",function(){u($(this).data("id"),$(this).data("enum"))}),g.$gridList.find(".btn-edit").off("click").on("click",function(){w(!g.editMode)}),g.$gridList.find(".btn-switch-tiles").off("click").on("click",function(){g.isTiles=!1,g.main.saveConfig("enumIsTiles",g.isTiles),setTimeout(function(){c()},50)}),f(),y(g.$gridEnum.find(".tree-table-body .collection"))}function c(){try{var e=g.$gridEnum.find(".tree-table-main").find("tbody>tr.treetable-enum");e.droppable("instance")&&e.droppable("destroy")}catch(e){console.log(e)}g.$gridList.html("").removeClass("tree-table-tiles").addClass("tree-table-list"),g.$gridList.treeTable({objects:g.main.objects,root:"enum",columns:["title","name"],members:!0,colors:!0,icons:!0,widths:["calc(100% - 250px)","250px"],name:"enums",buttonsWidth:"40px",buttons:[{text:!1,icons:{primary:"ui-icon-trash"},click:function(t,e,n){g.main.objects[t]?"enum"===g.main.objects[t].type?e?g.main.confirmMessage(_("All sub-enums of %s will be deleted too?",t),null,"help",function(e){e&&g.main._delObjects(t,!0,function(e){e?b(_("Error: %s",e),!0):b(_("Deleted"))})}):g.main.confirmMessage(_("Are you sure to delete %s?",t),null,"help",function(e){e&&g.main._delObjects(t,!0,function(e){e?b(_("Error: %s",e),!0):b(_("Deleted"))})}):u(t,n):g.main.objects[n]&&"enum"===g.main.objects[n].type?u(t,n):b(_('Object "<b>%s</b>" does not exists. Update the page.',t))},width:26,height:20},{text:!1,icons:{primary:"ui-icon-pencil"},match:function(e){return g.main.objects[e]&&"enum"===g.main.objects[e].type},click:function(e,t,n){v(e)},width:26,height:20}],panelButtons:[{id:"tab-enums-btn-switch-tiles",title:_("change view mode"),icon:"view_module",click:function(){g.isTiles=!0,g.main.saveConfig("enumIsTiles",g.isTiles),setTimeout(function(){n()},50)}},{id:"tab-enums-list-new-enum",title:_("New enum"),icon:"note_add",click:function(){v(null)}},{id:"tab-enums-list-new-category",title:_("New category"),icon:"library_add",click:function(){v(null,g.enumEdit)}},{id:"tab-enums-list-edit",title:_("Edit"),icon:"edit",click:function(){w(!g.editMode)}}],onChange:function(e,t){if(e!==t){g.enumEdit=e;var n=g.main.objects[e];if(n&&"enum"===n.type)$("#tab-enums-list-new-enum").removeClass("disabled").attr("title",_("Create new enum, like %s","enum.newCategory")),2===e.split(".").length?g.$gridList.find("#tab-enums-list-new-category").removeClass("disabled").attr("title",_("Create new category, like %s",e+".newEnum")):g.$gridList.find("#tab-enums-list-new-category").addClass("disabled");else g.$gridList.find("#tab-enums-list-new-enum").addClass("disabled"),g.$gridList.find("#tab-enums-list-new-category").addClass("disabled")}},onReady:m}),g.$gridList.find(".tree-table-buttons a").addClass("btn-small"),g.$gridList.find("#tab-enums-list-new-enum").addClass("disabled"),g.$gridList.find("#tab-enums-list-new-category").addClass("disabled")}function l(t){if("enum"===g.main.objects[t].type){var e=function(e){for(var t=e.split("."),n=[],i=new RegExp("^"+e.replace(/\./g,"\\.")+"\\."),a=0;a<g.list.length;a++)g.list[a].split(".").length===t.length+1&&i.test(g.list[a])&&n.push(g.list[a]);return n}(t);e&&e.length?g.main.confirmMessage(_("All sub-enums of %s will be deleted too?",t),null,"help",function(e){e&&g.main._delObjects(t,!0,function(e){e?b(_("Error: %s",e),!0):b(_("Deleted"))})}):g.main.confirmMessage(_("Are you sure to delete %s?",t),null,"help",function(e){e&&g.main._delObjects(t,!0,function(e){e?b(_("Error: %s",e),!0):b(_("Deleted"))})})}}function u(i,e){g.main.socket.emit("getObject",e,function(e,t){if(t&&t.common&&t.common.members){var n=t.common.members.indexOf(i);-1!==n?(t.common.members.splice(n,1),g.main.socket.emit("setObject",t._id,t,function(e){e?b(_("Error: %s",e),!0):b(_("Removed"))})):b(_("%s is not in the list"))}})}function i(n,e){g.main.socket.emit("getObject",e,function(e,t){t&&t.common&&(t.common.members=t.common.members||[],-1===t.common.members.indexOf(n)?(t.common.members.push(n),t.common.members.sort(),g.main.socket.emit("setObject",t._id,t,function(e){e?b(_("Error: %s",e),!0):b(_("%s added to %s",n,t._id))})):b(_("Is yet in the list")))})}function b(e,t,n){"boolean"==typeof t&&(n=t,t=3e3),g.main.showToast(g.$gridEnum.find(".tree-table-buttons"),e,null,t,n)}function m(e){g.editMode&&(e||(e=g.$gridEnum.find(".tree-table-main")),e.find("tbody>tr.treetable-enum").droppable({accept:".fancytree-type-draggable",over:function(e,t){if($(this).addClass("tab-accept-item"),$(this).hasClass("not-empty")&&!$(this).hasClass("expanded")){var n;$(this).data("tt-id");(n=$(this).data("timer"))&&clearTimeout(n),$(this).data("timer",setTimeout(function(){g.$gridList.treeTable("expand",$(this).data("tt-id"))},1e3))}},out:function(e,t){var n;$(this).removeClass("tab-accept-item"),(n=$(this).data("timer"))&&(clearTimeout(n),$(this).data("timer",null))},tolerance:"pointer",drop:function(e,t){$(this).removeClass("tab-accept-item"),i(t.draggable.data("id"),$(this).data("tt-id"))}}))}function y(e){if(g.editMode){var t=(e=e||g.$gridEnum.find(".tree-table-body .collection")).find(".collection-item");try{t.droppable("instance")&&t.droppable("destroy")}catch(e){console.error(e)}t.droppable({accept:".fancytree-type-draggable",over:function(e,t){$(this).addClass("tab-accept-item")},out:function(e,t){$(this).removeClass("tab-accept-item")},tolerance:"pointer",drop:function(e,t){$(this).removeClass("tab-accept-item"),i(t.draggable.data("id"),$(this).data("id"))}})}}function v(e,a){var i=!1,s=g.$gridEnum.find("#tab-enums-dialog-new"),o="",t="",n="",r="",c="",l="",d=!0;if(installFileUpload(s,5e4,function(e,t){if(e)b(e,!0);else{if(!t.match(/^data:image\//))return void b(_("Unsupported image format"),!0);s.find(".tab-enums-dialog-create").removeClass("disabled"),c=t,s.find(".tab-enums-dialog-new-icon").show().html('<img class="" />'),s.find(".tab-enums-dialog-new-icon img").attr("src",t),s.find(".tab-enums-dialog-new-icon-clear").show()}}),d=e?(g.main.objects[e]&&g.main.objects[e].common&&(t=translateName(g.main.objects[e].common.name),c=g.main.objects[e].common.icon,l=g.main.objects[e].common.color),n=o=e,s.find("#tab-enums-dialog-preserve-id").prop("checked",!0),!1):(s.find("#tab-enums-dialog-preserve-id").prop("checked",!1),!0),s.find(".tab-enums-dialog-new-title").text(_(a?"Create new category":n?"Rename":"Create new enum")),n){var u=n.split(".");u.length<=2&&(e=!0),n=u.pop(),a=u.join("."),r=n}s.find("#tab-enums-dialog-new-name").val(t).off("change").on("change",function(){var e=s.find("#tab-enums-dialog-new-id"),t=e.val(),n=$(this).val();n=n.replace(FORBIDDEN_CHARS,"_").replace(/\./g,"_").trim().toLowerCase(),!d||t&&i||(e.val(n),s.find("#tab-enums-dialog-new-preview").val((a||"enum")+"."+(n||"#")),M.updateTextFields("#tab-enums-dialog-new")),e.val()&&!e.val().match(/[.\s]/)?(s.find(".tab-enums-dialog-create").removeClass("disabled"),e.removeClass("wrong")):(s.find(".tab-enums-dialog-create").addClass("disabled"),e.addClass("wrong"))}).off("keyup").on("keyup",function(){$(this).trigger("change")}),s.find("#tab-enums-dialog-new-id").val(n).off("change").on("change",function(){if(!s.find("#tab-enums-dialog-preserve-id").prop("checked")){i=!0;var e=$(this).val();s.find("#tab-enums-dialog-new-preview").val((a||"enum")+"."+($(this).val()||"#")),M.updateTextFields("#tab-enums-dialog-new"),e&&!e.match(/[.\s]/)?(s.find(".tab-enums-dialog-create").removeClass("disabled"),$(this).removeClass("wrong")):(s.find(".tab-enums-dialog-create").addClass("disabled"),$(this).addClass("wrong"))}}).off("keyup").on("keyup",function(){$(this).trigger("change")}),s.find("#tab-enums-dialog-new-id").prop("disabled",!d),s.find(".tab-enums-dialog-create").addClass("disabled").off("click").text(_(o?"Change":"Create")).on("click",function(){var e,t,n,i;o?(s.find("#tab-enums-dialog-preserve-id").prop("checked")?(e="object"==typeof g.main.objects[o].common.name?g.main.objects[o].common.name:{en:o.split(".").pop()})[systemLang]=s.find("#tab-enums-dialog-new-name").val():e=s.find("#tab-enums-dialog-new-name").val(),h(o,a+"."+s.find("#tab-enums-dialog-new-id").val(),{name:e,icon:c,color:l},function(e){e?b(_("Error: %s",e),!0):b(_("Updated"))})):(t=(a||"enum")+"."+s.find("#tab-enums-dialog-new-id").val(),n={name:s.find("#tab-enums-dialog-new-name").val(),icon:c,color:l},i=function(e){e?b(_("Error: %s",e),!0,5e3):b(_("Updated"))},g.main.objects[t]?b(_("Name yet exists!"),!0):g.main.socket.emit("setObject",t,{_id:t,common:{name:n.name,members:[],icon:n.icon,color:n.color},type:"enum"},i))}),s.find("#tab-enums-dialog-new-preview").val((a||"enum")+"."+(n||"#")),c?(s.find(".tab-enums-dialog-new-icon").show().html(g.main.getIcon(o)),s.find(".tab-enums-dialog-new-icon-clear").show()):(s.find(".tab-enums-dialog-new-icon").hide(),s.find(".tab-enums-dialog-new-icon-clear").hide()),(l=l||!1)?s.find(".tab-enums-dialog-new-color").val(l):s.find(".tab-enums-dialog-new-color").val(),M.updateTextFields("#tab-enums-dialog-new"),g.main.showToast(s,_("Drop the icons here")),s.find(".tab-enums-dialog-new-upload").off("click").on("click",function(){s.find(".drop-file").trigger("click")}),s.find(".tab-enums-dialog-new-icon-clear").off("click").on("click",function(){c&&(c="",s.find(".tab-enums-dialog-new-icon").hide(),s.find(".tab-enums-dialog-create").removeClass("disabled"),s.find(".tab-enums-dialog-new-icon-clear").hide())}),s.find(".tab-enums-dialog-new-color-clear").off("click").on("click",function(){l&&(s.find(".tab-enums-dialog-create").removeClass("disabled"),s.find(".tab-enums-dialog-new-color-clear").hide(),s.find(".tab-enums-dialog-new-colorpicker").colorpicker({component:".btn",color:l,container:s.find(".tab-enums-dialog-new-colorpicker")}).colorpicker("setValue",""),l="")});var m=Date.now();try{s.find(".tab-enums-dialog-new-colorpicker").colorpicker("destroy")}catch(e){}s.find(".tab-enums-dialog-new-colorpicker").colorpicker({component:".btn",color:l,container:s.find(".tab-enums-dialog-new-colorpicker")}).colorpicker("setValue",l).on("showPicker.colorpicker",function(){var e=s.find(".modal-content");e[0].scrollTop=e[0].scrollHeight}).on("changeColor.colorpicker",function(e){100<Date.now()-m&&(l=e.color.toHex(),s.find(".tab-enums-dialog-create").removeClass("disabled"),s.find(".tab-enums-dialog-new-icon-clear").show())}),l?s.find(".tab-enums-dialog-new-color-clear").show():s.find(".tab-enums-dialog-new-color-clear").hide(),s.find("#tab-enums-dialog-preserve-id").off("change").on("change",function(){$(this).prop("checked")?(s.find("#tab-enums-dialog-new-id").prop("disabled",!0).val(r),n=r,d=!1):(g.main.objects[e]&&g.main.objects[e].common&&(d=!g.main.objects[e].common["object-non-deletable"]&&!g.main.objects[e].common.dontDelete),d&&(n=(n=s.find("#tab-enums-dialog-new-name").val()).replace(FORBIDDEN_CHARS,"_").replace(/\./g,"_").trim().toLowerCase(),s.find("#tab-enums-dialog-new-id").prop("disabled",!1).val(n))),i=!1,s.find("#tab-enums-dialog-new-preview").val((a||"enum")+"."+(n||"#"))}),s.find('input[type="checkbox"]+span').off("click").on("click",function(){var e=$(this).prev();e.prop("disabled")||e.prop("checked",!e.prop("checked")).trigger("change")}),s.modal().modal("open")}function w(e){g.editMode=e;var t=g.$gridEnum.find("#tab-enums-list-edit");if(g.editMode)t.removeClass("blue").addClass("red"),g.$gridEnum.addClass("tab-enums-edit"),g._initObjectTree(),b(_("You can drag&drop the devices, channels and states to enums")),g.isTiles?y():m();else{o("destroy");try{var n=g.$gridEnum.find(".collection-item");n.droppable("instance")&&n.droppable("destroy")}catch(e){console.error(e)}try{var i=g.$gridEnum.find("tbody>tr.treetable-enum");i.droppable("instance")&&i.droppable("destroy")}catch(e){console.error(e)}t.removeClass("red").addClass("blue"),g.$gridEnum.removeClass("tab-enums-edit")}}this.prepare=function(){this.isTiles=void 0===this.main.config.enumIsTiles||null===this.main.config.enumIsTiles||this.main.config.enumIsTiles},this._initObjectTree=function(){var e={objects:t.objects,noDialog:!0,draggable:["device","channel","state"],name:"enum-objects",expertModeRegEx:/^system\.|^yunkong2\.|^_|^[\w-]+$|^enum\.|^[\w-]+\.admin|^script\./,texts:{select:_("Select"),cancel:_("Cancel"),all:_("All"),id:_("ID"),ID:_("ID"),name:_("Name"),role:_("Role"),room:_("Room"),function:_("Function"),value:_("Value"),type:_("Type"),selectid:_("Select ID"),from:_("From"),lc:_("Last changed"),ts:_("Time stamp"),wait:_("Processing..."),ack:_("Acknowledged"),edit:_("Edit"),push:_("Trigger event"),ok:_("Ok"),with:_("With"),without:_("Without"),copyToClipboard:_("Copy to clipboard"),expertMode:_("Toggle expert mode"),refresh:_("Update"),sort:_("Sort alphabetically"),button:_("Settings"),noData:_("No data")},filter:{type:"state"},columns:["ID","name","type","role"]};o("init",e).selectId("show"),function(){var e=g.$gridEnum.find(".fancytree-container>tbody");try{e.sortable("instance")&&e.sortable("destroy")}catch(e){console.error(e)}g.$gridEnum.find(".fancytree-container>tbody").sortable({connectWith:"#tab-enums .tab-enums-list .tree-table-main.treetable",items:".fancytree-type-draggable",appendTo:g.$gridEnum,refreshPositions:!0,helper:function(e,t){return $('<div class="fancytree-drag-helper">'+t.find(".fancytree-title").text()+"</div>")},zIndex:999990,revert:!1,scroll:!1,start:function(e,t){var n=t.item.prev();t.item.data("prev",n),g.$gridEnum.addClass("dragging")},stop:function(e,t){g.$gridEnum.removeClass("dragging")},update:function(e,t){var n=t.item.data("prev");n&&n.length?$(n).after(t.item):$(this).prepend(t.item)}}).disableSelection()}()},this._postInit=function(){void 0!==this.$gridList&&(this.main.objects["enum.rooms"]||(this.main.objects["enum.rooms"]={_id:"enum.rooms",common:{icon:"home",name:{en:"Rooms",de:"Räume",ru:"Комнаты",pt:"Quartos",nl:"Kamers",fr:"Pièces",it:"Camere",es:"Habitaciones",pl:"Pokoje"},desc:{en:"List of the rooms",de:"Liste der Räumen",ru:"Список комнат",pt:"Lista dos quartos",nl:"Lijst met kamers",fr:"Liste des chambres",it:"Elenco delle stanze",es:"Lista de las habitaciones",pl:"Lista pokoi"},members:[],dontDelete:!0},type:"enum",acl:{owner:"system.user.admin",ownerGroup:"system.group.administrator",permissions:1911}},g.main.socket.emit("setObject","enum.rooms",this.main.objects["enum.rooms"]),this.list.unshift("enum.rooms")),this.main.objects["enum.functions"]||(this.main.objects["enum.functions"]={_id:"enum.functions",common:{icon:"lightbulb_outline",name:{en:"Functions",de:"Funktionen",ru:"функции",pt:"Funções",nl:"functies",fr:"Les fonctions",it:"funzioni",es:"Funciones",pl:"Funkcje"},desc:{en:"List of the functions",de:"Liste der Funktionen",ru:"Список функций",pt:"Lista das funções",nl:"Lijst met functies",fr:"Liste des fonctions",it:"Elenco delle funzioni",es:"Lista de las funciones",pl:"Lista funkcji"},members:[],dontDelete:!0},type:"enum",acl:{owner:"system.user.admin",ownerGroup:"system.group.administrator",permissions:1911}},this.list.unshift("enum.functions"),g.main.socket.emit("setObject","enum.functions",this.main.objects["enum.functions"])),this.isTiles?n():c(),this.editMode?this._initObjectTree():o("destroy"))},this.init=function(e){this.inited&&!e||(this.main&&this.main.objectsLoaded?(this._postInit(),this.inited||(this.inited=!0,this.main.subscribeObjects("enum.*"))):setTimeout(function(){g.init(e)},250))},this.destroy=function(){this.inited&&(this.inited=!1,this.main.unsubscribeObjects("enum.*")),w(!1),this.$gridList.treeTable("destroy")},this.objectChange=function(e,t,n){if(e.match(/^enum\./)){if(t)-1===this.list.indexOf(e)&&this.list.push(e);else{var i=this.list.indexOf(e);-1!==i&&this.list.splice(i,1)}this.updateTimers&&clearTimeout(this.updateTimers),this.updateTimers=setTimeout(function(){g.updateTimers=null,g._postInit()},200)}this.$grid&&o("object",e,t,n)}}function Events(g){var h=this;this.main=g,this.$tab=$("#tab-events");var e,f,p,t,b,M="yunkong2.net"===location.hostname||"yunkong2.pro"===location.hostname,y={count:0,start:0,limit:500},n=null,v={list:[],mode:!1,counter:0,overflow:!1,$counterSpan:null},w={done:!1,timer:null};this.prepare=function(){t=this.$tab.find("#event-outer"),p=this.$tab.find("#event-table"),b=this.$tab.find("#event-pause"),e=this.$tab.find("#events-table-tr"),(f=new IobListHeader(e,{list:t,colWidthOffset:1,prefix:"event-filter"})).doFilter=i,f.add("combobox","type"),f.add("edit","id","ID"),f.add("edit","val","value"),f.add("combobox","ack","ack",[{val:"",name:"all"},{val:"true",name:"ack"},{val:"false",name:"not ack"}]),f.add("combobox","from","from"),f.add("text","ts"),f.add("text","lc"),Object.defineProperty(f,"getValues",{value:function(){f.ID.selectedVal=f.ID.selectedVal.toLocaleLowerCase(),"true"===f.ack.selectedVal&&(f.ack.selectedVal=!0),"false"===f.ack.selectedVal&&(f.ack.selectedVal=!1)},enumerateble:!1}),b.on("click",function(){h.pause()}),this.$tab.find("#event-clear").off("click").on("click",function(){y.count=0,y.start=0,h.$tab.find("#event-table").html("")})},this.init=function(){M?h.$tab.find("#grid-events").html(_("You can't see events via cloud")+'<br><i class="large material-icons">cloud_off</i>').addClass("no-cloud-events"):f&&(this.inited||(!function e(){if(!$.fn.colResizable)return;t.is(":visible")?(t.colResizable({liveDrag:!0,partialRefresh:!0,marginLeft:5,postbackSafe:!0,onResize:function(e){return f.syncHeader()}}),f.syncHeader()):setTimeout(function(){e()},200)}(),this.inited=!0,this.main.subscribeObjects("*"),this.main.subscribeStates("*")))};var j=!(this.destroy=function(){this.inited&&(this.inited=!1,this.main.unsubscribeObjects("*"),this.main.unsubscribeStates("*"))});function N(){w.timer=null,$(window).trigger("resize.JColResizer")}function i(){n&&(clearTimeout(n),n=null),f.getValues&&f.getValues(),p&&p.find(".event-line").each(function(e){var t=!0,n=$(this);f.type.selectedVal&&!n.hasClass("event-type-"+f.type.selectedVal)?t=!1:f.from.selectedVal&&!n.hasClass("event-from-"+f.from.selectedVal)?t=!1:""===f.ack.selectedVal||n.hasClass("event-ack-"+f.ack.selectedVal)?f.ID.selectedVal&&-1===$(this).find("td.event-column-id").text().toLocaleLowerCase().indexOf(f.ID.selectedVal)?t=!1:""!==f.value.selectedVal&&-1===$(this).find("td.event-column-value").text().indexOf(f.value.selectedVal)&&(t=!1):t=!1,t?n.show():n.hide()})}this.add=function(e,t,n,i){if(!M){var a,s,o,r,c=i?"stateChange":n?"message":"objChange",l="";if(f&&(f.getValues&&f.getValues(),f.type.checkAddOption(c)),w.done||(w.timer||(w.timer=setTimeout(N,1e3)),20<y.count&&(w.done=!0)),!v.mode)if(y.count>=h.limit){y.start++;var d=document.getElementById("event_"+y.start);d&&(d.outerHTML="")}else y.count++;n||i?i&&(t?(t.from=t.from||"",t.from=t.from.replace("system.adapter.",""),t.from=t.from.replace("system.",""),f&&f.from.checkAddOption(t.from,function(e){return{val:e.replace(/\./g,"-"),name:e}}),l=t.from,void 0!==(a=JSON.stringify(t.val))&&30<a.length&&(a='<div title="'+a.replace(/"/g,"")+'">'+a.substring(0,30)+"...</div>"),s=t.ack?"true":"false",o=g.formatDate(t.ts),r=g.formatDate(t.lc)):(a="deleted",o=g.formatDate(new Date))):o=t?(void 0!==(a=JSON.stringify(t,"\n",2))&&30<a.length&&(a='<span title="'+a.replace(/"/g,"'")+'">'+a.substring(0,30)+"...</span>"),g.formatDate(t.ts)):(a="deleted",g.formatDate(new Date));var u=!0;f&&(f.type.selectedVal&&f.type.selectedVal!==c?u=!1:f.ID.selectedVal&&-1===e.toLocaleLowerCase().indexOf(f.ID.selectedVal)?u=!1:""!==f.value.selectedVal&&null!=a&&-1===a.indexOf(f.value.selectedVal)?u=!1:""!==f.ack.selectedVal&&f.ack.selectedVal!==s?u=!1:f.from.selectedVal&&f.from.selectedVal!==l&&(u=!1));var m='<tr id="event_'+(y.start+y.count)+'" class="event-line event-type-'+c+" event-from-"+l.replace(".","-")+" event-ack-"+s+'" style="'+(u?"":"display:none")+'">';m+="<td>"+c+"</td>",m+='<td class="event-column-id">'+e+"</td>",isNaN(a)?m+='<td class="event-column-value">'+(a||"")+"</td>":m+='<td class="event-column-value" style="text-align: right; padding-right: 5px;">'+(a||"")+"</td>",m+="<td>"+(s||"")+"</td>",m+="<td>"+(l||"")+"</td>",m+="<td>"+(o||"")+"</td>",m+="<td>"+(r||"")+"</td>",m+="</tr>",v.mode?(v.list.push(m),v.counter++,v.counter>y.limit&&(v.overflow||(b.addClass("red lighten3").attr("title",_("Message buffer overflow. Losing oldest")),v.overflow=!0),v.list.shift()),v.$counterSpan.html(v.counter)):p&&(p.prepend(m),j||"#tab-events"!==window.location.hash&&"#events"!==window.location.hash||(f&&f.syncHeader(),j=!0))}},this.pause=function(){if(v.mode){v.mode=!1;for(var e=0;e<v.list.length;e++){if(500<=y.count){y.start++;var t=document.getElementById("event_"+y.start);t&&(t.outerHTML="")}else y.count++;p.prepend(v.list[e])}v.overflow=!1,v.list=[],v.counter=0,b.removeClass("yellow btn-pause-button-active").html('<i class="material-icons">pause</i>')}else b.addClass("yellow btn-pause-button-active"),v.$counterSpan=b,v.$counterSpan.html("0"),v.counter=0,v.mode=!0}}function fileHandler(e){e.preventDefault();var t=e.dataTransfer?e.dataTransfer.files[0]:e.target.files[0],n=$(this).find(".drop-zone"),i=$(this).data("drop-zone-cb"),a=$(this).data("limit");if(t.size>(a||1e4))return i&&i(_("File is too big!")),n.hide(),!1;n.show();var s=new FileReader;s.onload=function(e){n.hide(),i&&i(null,e.target.result)},s.readAsDataURL(t)}function installFileUpload(e,t,n){if(void 0!==window.FileReader&&!e.data("installed")){e.data("installed",!0),e.prepend('<div class="drop-zone" style="display: none"><input type="file" class="drop-file" style="display: none" /></div>');var i=e.find(".drop-zone");e[0].ondragover=function(){return i.off("click"),i.show(),!1},i[0].ondragleave=function(){return i.hide(),!1},i[0].ondrop=fileHandler.bind(e[0])}e.data("drop-zone-cb",n),e.data("limit",t),e.find(".drop-file").on("change",fileHandler.bind(e[0]))}function Hosts(s){var r=this;function n(e){var t=$("#dialog-host-update");if(e){var n=e.path,i=(n=n.replace(/\\/g,"/")).split("/");i.pop(),i.pop(),"linux"===e.platform||"darwin"===e.platform||"freebsd"===e.platform||"lin"===e.platform?t.find("#dialog-host-update-instructions").val("cd "+i.join("/")+"\nsudo yunkong2 stop\nsudo yunkong2 update\nsudo yunkong2 upgrade self\nsudo yunkong2 start"):t.find("#dialog-host-update-instructions").val("cd "+i.join("\\")+"\nyunkong2 stop\nyunkong2 update\nyunkong2 upgrade self\nyunkong2 start")}else t.find("#dialog-host-update-instructions").val("cd /opt/yunkong2\nsudo yunkong2 stop\nsudo yunkong2 update\nsudo yunkong2 upgrade self\nsudo yunkong2 start");t.data("inited")||(t.data("inited",!0),t.modal()),t.modal("open")}function i(e){if(e=(e||"").toLowerCase().trim()){var t=!1;r.$tab.find(".hosts-host").each(function(){-1!==$(this).data("host-filter").toLowerCase().indexOf(e)?($(this).show(),t=!0):$(this).hide()}),t?r.$tab.find(".hosts-host-filtered-out").hide():r.$tab.find(".hosts-host-filtered-out").show()}else r.$tab.find(".hosts-host").show(),r.$tab.find(".hosts-host-filtered-out").hide()}function a(e){var t=r.main.objects[r.list[e].id],n=r.main.states[t._id+".alive"]&&r.main.states[t._id+".alive"].val&&"null"!==r.main.states[t._id+".alive"].val;t.common=t.common||{},t.native=t.native||{};var i='<tr class="hosts-host" data-host-id="'+t._id+'" data-host-filter="'+(t.common.title||"")+" "+(t.common.hostname||"")+" "+(t.common.name||"")+'">';i+='<td class="tab-hosts-header-led"><div class="hosts-led '+(n?"led-green":"led-red")+'" data-host-id="'+t._id+'"></div></td>',i+='<td class="hosts-icon">'+r.main.getHostIcon(t)+"</td>",i+='<td class="hosts-name" style="font-weight: bold">'+t.common.hostname+"</td>",i+='<td class="tab-hosts-header-type">'+t.common.type+"</td>";var a=t.common.titleLang||t.common.title;return"object"==typeof a&&(a=a[systemLang]||a.en),i+='<td class="tab-hosts-header-title">'+a+"</td>",i+='<td class="tab-hosts-header-os">'+(t.native.os?t.native.os.platform:_("unknown"))+"</td>",i+='<td class="tab-hosts-header-available"><span data-host-id="'+t._id+'" data-type="'+t.common.type+'" class="hosts-version-available"></span><button class="small-button host-update-submit" data-host-name="'+t.common.hostname+'" style="display: none; opacity: 0;" title="'+_("update")+'"><i class="material-icons">refresh</i></button><button class="small-button host-update-hint-submit" data-host-name="'+t.common.hostname+'" style="display: none;" title="'+_("update")+'"><i class="material-icons">refresh</i></button></td>',i+='<td class="hosts-version-installed tab-hosts-header-installed" data-host-id="'+t._id+'">'+t.common.installedVersion+"</td>",r.main.states[t._id+".inputCount"]?i+='<td class="tab-hosts-header-events" style="text-align: center"><span title="in" data-host-id="'+t._id+'" class="host-in">⇥'+r.main.states[t._id+".inputCount"].val+'</span> / <span title="out" data-host-id="'+t._id+'" class="host-out">↦'+r.main.states[t._id+".outputCount"].val+"</span></td>":i+='<td class="tab-hosts-header-events" style="text-align: center"><span title="in" data-host-id="'+t._id+'" class="host-in"></span> / <span title="out" data-host-id="'+t._id+'" class="host-out"></span></td>',i+='<td class="tab-hosts-header-restart"><button class="small-button host-restart-submit" style="'+(n?"":"display: none")+'" data-host-id="'+t._id+'" title="'+_("restart")+'"><i class="material-icons">autorenew</i></button></td>',i+="</tr>"}function o(e){var t,n=r.main.objects[r.list[e].id],i=r.main.states[n._id+".alive"]&&r.main.states[n._id+".alive"].val&&"null"!==r.main.states[n._id+".alive"].val;n.common=n.common||{},n.native=n.native||{},n.common.color&&(t=r.main.invertColor(n.common.color));var a=' <div class="col s12 hosts-host" data-host-id="'+n._id+'" data-host-filter="'+(n.common.title||"")+" "+(n.common.hostname||"")+" "+(n.common.name||"")+'"> <div class="host z-depth-1 hoverable"> <div class="image center"> '+r.main.getHostIcon(n," ")+' <div class="hosts-led '+(i?"led-green":"led-red")+'" data-host-id="'+n._id+'"></div> </div> <div class="system" style="'+(n.common.color?"color: "+(t?"white":"black")+"; background: "+n.common.color:"")+'"> <span class="nameHost" title="name">'+n.common.hostname+'</span> <ul> <li class="tab-hosts-header-title"><span class="title-val">'+r.words.Type+':</span> <span class="type">'+n.common.type+'</span></li> <li><span class="title-val">'+r.words.Title+':</span> <span class="title">'+n.common.title+'</span></li> <li><span class="title-val">'+r.words.OS+':</span> <span class="os">'+(n.native.os?n.native.os.platform:_("unknown"))+'</span></li> <li><span class="title-val">'+r.words.Available+':</span> <span class="available hosts-version-available"></span></li> <li><span class="title-val">'+r.words.Installed+':</span> <span class="installed"> '+n.common.installedVersion+"</span></li>";return r.main.states[n._id+".inputCount"]?a+='<li class="tab-hosts-header-events"><span class="title-val">'+r.words.Events+':</span> <span title="in" data-host-id="'+n._id+'" class="host-in">⇥'+r.main.states[n._id+".inputCount"].val+'</span> / <span title="out" data-host-id="'+n._id+'" class="host-out">↦'+r.main.states[n._id+".outputCount"].val+"</span></li>":a+='<li class="tab-hosts-header-events"><span class="title-val">'+r.words.Events+':</span> <span title="in" data-host-id="'+n._id+'" class="host-in"></span> / <span title="out" data-host-id="'+n._id+'" class="host-out"></span></li>',a+='</ul> </div> <div class="icon center"> <i class="material-icons host-edit" data-host-id="'+n._id+'">edit</i> <i class="material-icons host-restart-submit" data-host-name="'+n.common.hostname+'" title="'+_("restart")+'">autorenew</i>',n.common.hostname!==r.main.currentHost&&(a+=' <i class="material-icons host-delete" data-host-name="'+n.common.hostname+'" title="'+_("remove")+'">delete</i>'),a+=' <i class="material-icons host-update-hint-submit" data-host-name="'+n.common.hostname+'" style="display: none">refresh</i> <i class="material-icons host-update-submit" data-host-name="'+n.common.hostname+'" style="display: none; opacity: 0">refresh</i> </div> </div> </div>'}this.main=s,this.list=[],this.$tab=$("#tab-hosts"),this.$grid=this.$tab.find("#hosts"),this.$table=this.$tab.find("#grid-hosts"),this.inited=!1,this.isTiles=!0,this.words={},this.prepare=function(){this.isTiles=void 0===this.main.config.hostsIsTiles||null===this.main.config.hostsIsTiles||this.main.config.hostsIsTiles,"ie"===this.main.browser&&this.main.browserVersion<=10&&(this.isTiles=!1,this.$tab.find(".btn-switch-tiles").hide()),this.$tab.find(".btn-reload").attr("title",_("Update")).on("click",function(){r.init(!0)}),this.$tab.find(".btn-switch-tiles").off("click").on("click",function(){r.isTiles=!r.isTiles,r.isTiles?$(this).find("i").text("view_list"):$(this).find("i").text("view_module"),r.main.saveConfig("hostsIsTiles",r.isTiles),setTimeout(function(){r._postInit()},50)}),this.isTiles?this.$tab.find(".btn-switch-tiles").find("i").text("view_list"):this.$tab.find(".btn-switch-tiles").find("i").text("view_module"),this.$tab.find(".filter-clear").on("click",function(){r.$tab.find(".filter-input").val("").trigger("change")});var e=this.$tab.find(".filter-input");e.on("change",function(){var e=$(this).val();e?($(this).addClass("input-not-empty"),r.$tab.find(".filter-clear").show()):(r.$tab.find(".filter-clear").hide(),$(this).removeClass("input-not-empty")),r.main.saveConfig("hostsFilter",e),i(e)}).on("keyup",function(){r.filterTimeout&&clearTimeout(r.filterTimeout),r.filterTimeout=setTimeout(function(){r.$tab.find(".filter-input").trigger("change")},300)}),this.main.config.hostsFilter&&"{"!==this.main.config.hostsFilter[0]?(e.val(r.main.config.hostsFilter).addClass("input-not-empty"),this.$tab.find(".filter-clear").show()):this.$tab.find(".filter-clear").hide(),this.words.Title=_("Title"),this.words.OS=_("OS"),this.words.Available=_("Available"),this.words.Installed=_("Installed"),this.words.Events=_("Events"),this.words.Title=_("Title"),r.words.Type=_("Type")},this.initButtons=function(e){var t=e?'[data-host-id="'+e+'"]':"";this.$tab.find(".host-update-submit"+t).off("click").on("click",function(){r.main.cmdExec($(this).attr("data-host-name"),"upgrade self",function(e){e||r.init(!0)})}),this.$tab.find(".host-restart-submit"+t).off("click").on("click",function(){r.main.waitForRestart=!0,r.main.cmdExec($(this).attr("data-host-name"),"_restart")}),this.$tab.find(".host-delete"+t).off("click").on("click",function(){r.main.cmdExec(r.main.currentHost,"host remove "+$(this).attr("data-host-name"))}),this.$tab.find(".host-edit"+t).off("click").on("click",function(){!function(t){var n=$("#tab-host-dialog-edit"),e="",i="",a="";installFileUpload(n,5e4,function(e,t){if(e)r.main.showToast(n,e);else{if(!t.match(/^data:image\//))return void r.main.showToast(n,_("Unsupported image format"));n.find(".tab-host-dialog-ok").removeClass("disabled"),i=t,n.find(".tab-host-dialog-edit-icon").show().html('<img class="" />'),n.find(".tab-host-dialog-edit-icon img").attr("src",t),n.find(".tab-host-dialog-edit-icon-clear").show()}}),r.main.objects[t]&&r.main.objects[t].common&&("object"==typeof(e=r.main.objects[t].common.title)&&(e=e[systemLang]||e.en),i=r.main.objects[t].common.icon,a=r.main.objects[t].common.color);n.find("#tab-host-dialog-edit-title").val(e).off("change").on("change",function(){n.find(".tab-host-dialog-ok").removeClass("disabled")}).off("keyup").on("keyup",function(){$(this).trigger("change")}),n.find(".tab-host-dialog-ok").addClass("disabled").off("click").on("click",function(){var e=JSON.parse(JSON.stringify(r.main.objects[t]));e.common.title=n.find("#tab-host-dialog-edit-title").val(),e.common.icon=i,e.common.color=a,JSON.stringify(e)!==JSON.stringify(r.main.objects[t])?r.main.socket.emit("setObject",e._id,e,function(e){r.main.showToast(n,_("Updated"))}):r.main.showToast(n,_("Nothing changed"))}),i?(n.find(".tab-host-dialog-edit-icon").show().html(r.main.getIcon(t)),n.find(".tab-host-dialog-edit-icon-clear").show()):(n.find(".tab-host-dialog-edit-icon").hide(),n.find(".tab-host-dialog-edit-icon-clear").hide());(a=a||!1)?n.find(".tab-host-dialog-edit-color").val(a):n.find(".tab-host-dialog-edit-color").val();M.updateTextFields("#tab-host-dialog-edit"),r.main.showToast(n,_("Drop the icons here")),n.find(".tab-host-dialog-edit-upload").off("click").on("click",function(){n.find(".drop-file").trigger("click")}),n.find(".tab-host-dialog-edit-icon-clear").off("click").on("click",function(){i&&(i="",n.find(".tab-host-dialog-edit-icon").hide(),n.find(".tab-host-dialog-ok").removeClass("disabled"),n.find(".tab-host-dialog-edit-icon-clear").hide())}),n.find(".tab-host-dialog-edit-color-clear").off("click").on("click",function(){a&&(n.find(".tab-host-dialog-ok").removeClass("disabled"),n.find(".tab-host-dialog-edit-color-clear").hide(),n.find(".tab-host-dialog-edit-colorpicker").colorpicker({component:".btn",color:a,container:n.find(".tab-host-dialog-edit-colorpicker")}).colorpicker("setValue",""),a="")});var s=Date.now();try{n.find(".tab-host-dialog-edit-colorpicker").colorpicker("destroy")}catch(e){}n.find(".tab-host-dialog-edit-colorpicker").colorpicker({component:".btn",color:a,container:n.find(".tab-host-dialog-edit-colorpicker")}).colorpicker("setValue",a).on("showPicker.colorpicker",function(){var e=n.find(".modal-content");e[0].scrollTop=e[0].scrollHeight}).on("changeColor.colorpicker",function(e){100<Date.now()-s&&(a=e.color.toHex(),n.find(".tab-host-dialog-ok").removeClass("disabled"),n.find(".tab-host-dialog-edit-icon-clear").show())}),a?n.find(".tab-host-dialog-edit-color-clear").show():n.find(".tab-host-dialog-edit-color-clear").hide();n.modal().modal("open")}($(this).attr("data-host-id"))}),this.$tab.find(".host-update-hint-submit"+t).off("click").on("click",function(){var t=setTimeout(function(){n(),t=null},1e3);r.main.socket.emit("sendToHost",$(this).attr("data-host-name"),"getLocationOnDisk",null,function(e){t&&clearTimeout(t),t=null,n(e)})})},this.updateCounter=function(e){if(void 0===e)this.main.tabs.adapters.getAdaptersInfo(this.main.currentHost,!1,!1,function(e,t){var n=0;if(t&&t.hosts){for(var i in t.hosts)if(t.hosts.hasOwnProperty(i)){var a=r.main.objects["system.host."+i];if(a&&a.common){var s=a.common.installedVersion,o=a.common&&e&&e[a.common.type]?e[a.common.type].version:"";s&&o&&!r.main.upToDate(o,s)&&(i="system.host."+i.trim().replace(FORBIDDEN_CHARS,"_").replace(/\./g,"_"),r.main.states[i+".alive"]&&r.main.states[i+".alive"].val&&"null"!==r.main.states[i+".alive"].val&&n++)}}r.updateCounter(n)}});else if(e){var t=$("#updates-for-hosts");t.length?t.text(e):$('<span id="updates-for-hosts" title="'+_("updates")+'" class="new badge updates-for-hosts" data-badge-caption="">'+e+"</span>").appendTo('.admin-sidemenu-items[data-tab="tab-hosts"] a')}else $("#updates-for-hosts").remove()},this._postInit=function(){if(void 0!==r.$grid){this.isTiles?function(){for(var e="",t=0;t<r.list.length;t++)e+=o(t);r.$table.html(""),r.$tab.find(".hosts-table").hide(),r.$grid.html(e).show(),r.$grid.append('<div class="col s12 hosts-host-filtered-out"><div class="host z-depth-1 hoverable">'+_("Filtered out")+"</div></div>")}():function(){for(var e="",t=0;t<r.list.length;t++)e+=a(t);r.$grid.html("").hide(),r.$table.html(e),r.$tab.find(".hosts-table").show(),r.$table.append('<tr class="hosts-host-filtered-out"><td colspan="9">'+_("Filtered out")+"</td></tr>")}(),i(this.$tab.find(".filter-input").val());var s=setTimeout(function(){console.warn("Timeout for repository"),s=null,r.initButtons()},2e3),e=r.main.currentHost;if(!e)for(var t=0;t<r.list.length;t++)if(r.main.states[r.list[t].id+".alive"]&&r.main.states[r.list[t].id+".alive"].val){e=r.list[t].id;break}r.main.tabs.adapters.getAdaptersInfo(e,!0,!1,function(a,e){if(e&&e.hosts){for(var t in e.hosts)if(e.hosts.hasOwnProperty(t)){var n=r.main.objects["system.host."+t],i=e.hosts[t].version;i!==e.hosts[t].runningVersion&&(i+="("+_("Running: ")+e.hosts[t].runningVersion+")"),!i&&n.common&&n.common.installedVersion&&(i=n.common.installedVersion),t="system.host."+t.trim().replace(FORBIDDEN_CHARS,"_").replace(/\./g,"_"),r.$tab.find('.hosts-version-installed[data-host-id="'+t+'"]').html(i)}r.$tab.find(".hosts-host").each(function(){var e=$(this).data("host-id"),t=r.main.objects[e],n=t.common.installedVersion,i=t.common&&a&&a[t.common.type]?a[t.common.type].version:"";n&&i&&(r.main.upToDate(i,n)||r.main.states[e+".alive"]&&r.main.states[e+".alive"].val&&"null"!==r.main.states[e+".alive"].val&&($(this).find(".host-update-submit").show(),$(this).find(".host-update-hint-submit").show(),$(this).find(".hosts-version-installed").addClass("updateReady"),$(this).find(".hosts-version-available").addClass("hosts-version-available-updatable"))),i&&$(this).find(".hosts-version-available").html(i)}),s&&(clearTimeout(s),s=null),r.initButtons()}})}},this.init=function(e){this.inited&&!e||(this.getHosts(function(){r._postInit()}),this.inited||(this.inited=!0,this.main.subscribeObjects("system.host.*"),this.main.subscribeStates("system.host.*")))},this.destroy=function(){this.inited&&(this.inited=!1,this.main.unsubscribeObjects("system.host.*"),this.main.unsubscribeStates("system.host.*"))},this.addHost=function(e){var t=null;if(e.native.hardware&&e.native.hardware.networkInterfaces)for(var n in e.native.hardware.networkInterfaces)if(e.native.hardware.networkInterfaces.hasOwnProperty(n)){for(var i=0;i<e.native.hardware.networkInterfaces[n].length;i++)if(!e.native.hardware.networkInterfaces[n][i].internal){t=e.native.hardware.networkInterfaces[n][i].address;break}if(t)break}t?this.list.push({name:e.common.hostname,address:t,id:e._id}):this.list.push({name:e.common.hostname,address:"127.0.0.1",id:e._id})},this.getHosts=function(a){this.main.socket.emit("getForeignObjects","system.host.*","state",function(e,t){for(var n in t)t.hasOwnProperty(n)&&(r.main.objects[n]=t[n]);r.main.socket.emit("getForeignStates","system.host.*",function(e,t){for(var n in t)t.hasOwnProperty(n)&&(r.main.states[n]=t[n]);r.main.socket.emit("getForeignObjects","system.host.*","host",function(e,t){for(var n in r.list=[],t)if(t.hasOwnProperty(n)){var i=t[n];"host"===(r.main.objects[n]=i).type&&r.addHost(i)}s.initHostsList(),a&&a()})})})},this.objectChange=function(e,t,n){if(e.match(/^system\.host\.[-\w]+$/)){var i,a=!1;for(i=0;i<this.list.length;i++)if(this.list[i].id===e){a=!0;break}t?a||this.list.push({id:e,address:t.common.address?t.common.address[0]:"",name:t.common.name}):a&&this.list.splice(i,1),this.updateTimer&&clearTimeout(this.updateTimer),this.updateTimer=setTimeout(function(){r.updateTimer=null,r._postInit()},200)}},this.stateChange=function(e,t){e.match(/^system\.host\..+\.alive$/)?(e=e.substring(0,e.length-6),t&&t.val?this.$tab.find('.hosts-led[data-host-id="'+e+'"]').removeClass("led-red").addClass("led-green"):(this.$tab.find('.hosts-led[data-host-id="'+e+'"]').removeClass("led-green").addClass("led-red"),this.$tab.find('.host-update-submit[data-host-id="'+e+'"]').hide(),this.$tab.find('.host-update-hint-submit[data-host-id="'+e+'"]').hide(),this.$tab.find('.host-restart-submit[data-host-id="'+e+'"]').hide(),this.$tab.find('.hosts-version-available[data-host-id="'+e+'"]').removeClass("hosts-version-available-updatable"))):e.match(/^system\.host\..+\.outputCount$/)?(e=e.substring(0,e.length-12),this.$tab.find('.host-out[data-host-id="'+e+'"]').html('<span class="highlight">↦'+t.val+"</span>")):e.match(/^system\.host\..+\.inputCount$/)&&(e=e.substring(0,e.length-11),this.$tab.find('.host-in[data-host-id="'+e+'"]').html('<span class="highlight">↦'+t.val+"</span>"))}}function Instances(i){var p=this;function b(e,t,n,i,a){if("protocol"===n&&(n="secure"),"ip"===e)i=i.replace("%"+e+"%",location.hostname);else if("instance"===e)i=i.replace("%"+e+"%",a);else if(t){n.match(/^native_/)&&(n=n.substring(7));var s=t.native[n];"bind"!==e||s&&"0.0.0.0"!==s||(s=location.hostname),i="secure"===n?i.replace("%"+e+"%",s?"https":"http"):-1===i.indexOf("%"+e+"%")?i.replace("%native_"+e+"%",s):i.replace("%"+e+"%",s)}else i="secure"===n?i.replace("%"+e+"%","http"):-1===i.indexOf("%"+e+"%")?i.replace("%native_"+e+"%",""):i.replace("%"+e+"%","");return i}function o(e,t,n){var i,a,s,o=e.match(/%(\w+)%/g);if(o){for(a=o.length-1;0<=a;a--)s=(i=(i=o[a]).replace(/%/g,"")).split("_"),i.match(/^native_/)?(e=b(i,p.main.objects["system.adapter."+t+"."+n],i,e,n),o.splice(a,1)):1===s.length?(e=b(i,p.main.objects["system.adapter."+t+"."+n],s[0],e,n),o.splice(a,1)):s[0].match(/\.[0-9]+$/)&&(e=b(i,p.main.objects["system.adapter."+s[0]],s[1],e,n),o.splice(a,1));var r,c,l={},d=s[0];for(a=0;a<o.length;a++){if((i=(i=o[a]).replace(/%/g,"")).match(/^native_/)&&(i=i.substring(7)),s=i.split("_"),!r){r=[];for(var u=0;u<10;u++)p.main.objects["system.adapter."+d+"."+u]&&r.push(u)}for(var m=0;m<r.length;m++)l[d+"."+m]={instance:d+"."+m,link:b(i,p.main.objects["system.adapter."+d+"."+m],s[1],l[d+"."+m]?l[d+"."+m].link:e,m)}}if(r){c={};var g=0,h="";for(var f in l)l.hasOwnProperty(f)&&(c[l[f].instance]=l[f].link,h||(h=l[f].link),g++);g<2&&(e=h,c=null)}}return c||e}function f(e){var t=e.split("."),n=t[2],i=t[3],a=p.$tab.find('.instance-led[data-instance-id="'+e+'"]'),s=p.main.objects[e]&&p.main.objects[e].common||{},o="daemon"===s.mode?"green":"blue",r="";if(!s.enabled||s.webExtension&&p.main.objects[e].native.webInstance){if(o="daemon"===s.mode?"gray":"blue",r='<table style="border: 0">',r+='<tr style="border: 0"><td style="border: 0">'+_("Connected to host: ")+'</td><td style="border: 0">',p.main.states[e+".connected"]&&p.main.states[e+".connected"].val?r+='<span style="color: green">'+_("true")+"</span>":r+=_("false"),r+='</td></tr><tr style="border: 0">',r+='<td style="border: 0">'+_("Heartbeat: ")+'</td><td style="border: 0">',p.main.states[e+".alive"]&&p.main.states[e+".alive"].val?r+='<span style="color: green">'+_("true")+"</span>":r+=_("false"),r+="</td></tr>",p.main.states[n+"."+i+".info.connection"]||p.main.objects[n+"."+i+".info.connection"])r+='<tr style="border: 0"><td style="border: 0">'+_("Connected to %s: ",n)+"</td><td>",r+=(c=!!p.main.states[n+"."+i+".info.connection"]&&p.main.states[n+"."+i+".info.connection"].val)?!0===c?'<span style="color: green">'+_("true")+"</span>":'<span style="color: green">'+c+"</span>":_("false"),r+="</td></tr>";r+="</table>"}else{var c;if(r='<table style="border: 0">',r+='<tr style="border: 0"><td style="border: 0">'+_("Connected to host: ")+'</td><td style="border: 0">',p.main.states[e+".connected"]&&p.main.states[e+".connected"].val?r+='<span style="color: green">'+_("true")+"</span>":(r+="daemon"===s.mode?'<span style="color: red">'+_("false")+"</span>":_("false"),o="daemon"===s.mode?"red":"blue"),r+='</td></tr><tr style="border: 0"><td style="border: 0">'+_("Heartbeat: ")+'</td><td style="border: 0">',p.main.states[e+".alive"]&&p.main.states[e+".alive"].val?r+='<span style="color: green">'+_("true")+"</span>":(r+="daemon"===s.mode?'<span style="color: red">'+_("false")+"</span>":_("false"),o="daemon"===s.mode?"red":"blue"),r+="</td></tr>",p.main.states[n+"."+i+".info.connection"]||p.main.objects[n+"."+i+".info.connection"])r+='<tr style="border: 0"><td style="border: 0">'+_("Connected to %s: ",n)+"</td><td>",(c=!!p.main.states[n+"."+i+".info.connection"]&&p.main.states[n+"."+i+".info.connection"].val)?r+=!0===c?'<span style="color: green">'+_("true")+"</span>":'<span style="color: green">'+c+"</span>":(o="red"===o?"red":"orange",r+='<span style="color: red">'+_("false")+"</span>"),r+="</td></tr>";r+="</table>"}o="blue"===o?"":o,a.removeClass("led-red led-green led-orange led-blue").addClass("led-"+o).data("title",r),a.data("inited")||"gray"===o||(a.data("inited",!0),a.hover(function(){var e='<div class="instance-state-hover" style="left: '+Math.round($(this).position().left+$(this).width()+5)+'px;">'+$(this).data("title")+"</div>",t=$(e);t.insertAfter($(this)),$(this).data("big",t[0]);var n=parseFloat(t.height()),i=Math.round($(this).position().top-(n-parseFloat($(this).height()))/2);n+i>(window.innerHeight||document.documentElement.clientHeight)&&(i=(window.innerHeight||document.documentElement.clientHeight)-n),i<0&&(i=0),t.css({top:i}).on("click",function(){var e=$(this).data("big");$(e).remove(),$(this).data("big",void 0)})},function(){var e=$(this).data("big");$(e).remove(),$(this).data("big",void 0)}).on("click",function(){$(this).trigger("hover")}))}function r(){for(var e=p.main.states["system.host."+p.main.currentHost+".memRss"],t=1,n=e?e.val:0,i=0;i<p.list.length;i++){var a=p.main.objects[p.list[i]];if(a&&a.common&&(a.common.host===p.main.currentHost&&a.common.enabled&&"daemon"===a.common.mode)){var s=p.main.states[a._id+".memRss"];n+=s?s.val:0,t++}}n=Math.round(n);var o=p.$tab.find("#totalRam");n.toString()!==o.text()&&o.html('<span class="highlight">'+n+"</span>");var r=_("%s processes",t),c=p.$tab.find("#running_processes");r!==c.text()&&c.html('<span class="highlight">'+r+"</span>")}function c(){p.main.states["system.host."+p.main.currentHost+".memAvailable"]?p.memState="memAvailable":p.main.states["system.host."+p.main.currentHost+".freemem"]&&(p.memState="freemem");var e=p.main.states["system.host."+p.main.currentHost+"."+p.memState];if(e){p.totalmem=p.totalmem||p.main.objects["system.host."+p.main.currentHost].native.hardware.totalmem/1048576;var t=Math.round(e.val/p.totalmem*100),n=p.$tab.find("#freeMem"),i=tdp(e.val);i!==n.text()&&(n.html('<span class="highlight '+(t<10?"high-mem":"")+'">'+i+"</span>"),p.$tab.find("#freeMemPercent").html('<span class="highlight">'+t+"%</span>"))}else p.$tab.find(".free-mem-label").hide()}function l(){var e=p.main.states["system.host."+p.main.currentHost+".diskSize"],t=p.main.states["system.host."+p.main.currentHost+".diskFree"],n=p.main.states["system.host."+p.main.currentHost+".diskWarning"];if(t&&t.val&&e&&e.val){n=n?parseFloat(n.val):5;var i=p.$tab.find("#diskFree"),a=Math.round(t.val/e.val*1e3)/10;i.html('<span class="highlight '+(a<n?"system-warning":"")+'">'+a+"</span>"),i.parent().attr("title",_("Size: %s, Free: %s",p.main.formatBytes(1024*e.val*1024),p.main.formatBytes(1024*t.val*1024)))}else p.$tab.find(".tab-instances-info-disk").hide()}function M(e){var t,n=p.main.objects[e]&&p.main.objects[e].common||{};return t=n.enabled&&"daemon"===n.mode&&p.main.states[e+".memRss"]?(t=p.main.states[e+".memRss"].val,t=parseFloat(t)||0,n.memoryLimitMB&&n.memoryLimitMB<=t?'<span class="high-mem">'+t.toFixed(1)+" MB</span>":t.toFixed(1)+" MB"):""}function d(e,t,n,i){var a,s=p.main.objects[t]&&p.main.objects[t].common||{},o=t.split("."),r=o[2],c=o[3];if("tile"===n)a=i?"":'<div class="instance-adapter" data-instance-id="'+t+'">',a+=i?"":"</div>";else{a=i?"":'<tr class="instance-adapter" data-instance-id="'+t+'">';var l=s.localLinks||s.localLink||"",d=l?p.replaceInLink(l,r,c):"";l&&(l="object"==typeof d?'<a href="'+d.__first+'" target="_blank">':'<a href="'+d+'" target="_blank">'),a+='<td class="instance-state" style="text-align: center"><div class="instance-led" data-instance-id="'+t+'"></div></td>',a+="<td>"+(s.icon?l+'<img src="adapter/'+r+"/"+s.icon+'" class="instance-image" data-instance-id="'+t+'"/>':"")+(l?"</a>":"")+"</td>",a+='<td style="padding-left: 0.5em" data-instance-id="'+t+'" class="instance-name"><b>'+r+"."+c+"</b></td>";var u=s.onlyWWW||s.enabled;a+='<td style="text-align: left;" class="m"><button data-instance-id="'+t+'" class="instance-stop-run small-button '+(s.onlyWWW?"small-button-empty":"")+'" title="dynamic" ><i class="material-icons">pause</i></button><button data-instance-id="'+t+'" class="instance-settings small-button '+(s.noConfig?"small-button-empty":"")+'" title="'+_("config")+'"><i class="material-icons">build</i></button><button data-instance-id="'+t+'" class="instance-reload small-button '+(s.onlyWWW?"small-button-empty":"")+" "+(u?"":"disabled")+'" title="'+_("reload")+'"><i class="material-icons">refresh</i></button>',a+='<button data-instance-id="'+t+'" class="instance-del small-button" title="'+_("delete")+'"><i class="material-icons">delete</i></button>'+(d?'<button data-instance-id="'+t+'" class="instance-web small-button '+(d?"":"small-button-empty")+" "+(u?"":"disabled")+'" title="'+_("open web page")+'" data-link="'+("object"!=typeof d?d:"")+'"><i class="material-icons">input</i></button>':"")+"</td>";var m=s.titleLang||s.title;if("object"==typeof m&&(m=m[systemLang]||m.en),a+='<td title="'+(l?_("Click on icon"):"")+'" style="padding-left: 0.5em" data-name="title" data-value="'+(m||"")+'" class="instance-editable" data-instance-id="'+t+'">'+(m||"")+"</td>",1<p.main.tabs.hosts.list.length){if(!p.hostsText){p.hostsText="";for(var g=0;g<p.main.tabs.hosts.list.length;g++){var h=p.main.tabs.hosts.list[g]||"";p.hostsText+=(p.hostsText?";":"")+h.name}}a+='<td style="padding-left: 0.5em" data-name="host" data-value="'+(s.host||"")+'" class="instance-editable" data-instance-id="'+t+'" data-options="'+p.hostsText+'">'+(s.host||"")+"</td>"}a+='<td data-name="schedule" data-value="'+("schedule"===s.mode&&s.schedule||"")+'" style="text-align: center" class="'+("schedule"===s.mode?"instance-schedule":"")+'" data-instance-id="'+t+'">'+("schedule"===s.mode&&s.schedule||"")+"</td>",p.main.config.expertMode&&(a+='<td data-name="restartSchedule" data-value="'+(s.restartSchedule||"")+'" style="text-align: center" class="instance-schedule m" data-instance-id="'+t+'">'+(s.restartSchedule||"")+"</td>",a+='<td data-name="loglevel" data-value="'+(s.loglevel||"")+'" style="text-align: center" class="instance-editable" data-instance-id="'+t+'" data-options="silly:silly;debug:debug;info:info;warn:warn;error:error">'+(s.loglevel||"")+"</td>",a+='<td data-name="memoryLimitMB" data-value="'+(s.memoryLimitMB||"")+'" style="text-align: center" class="instance-editable" data-instance-id="'+t+'">'+(s.memoryLimitMB||"")+"</td>",u&&p.main.states[t+".inputCount"]&&p.main.states[t+".outputCount"]?a+='<td style="text-align: center"><span title="in" data-instance-id="'+t+'" class="instance-in">⇥'+p.main.states[t+".inputCount"].val+'</span> / <span title="out" data-instance-id="'+t+'" class="instance-out">↦'+p.main.states[t+".outputCount"].val+"</span></td>":a+='<td style="text-align: center"><span title="in" data-instance-id="'+t+'" class="instance-in"></span> / <span title="out" data-instance-id="'+t+'" class="instance-out"></span></td>'),a+='<td class="memUsage" style="text-align: center" data-instance-id="'+t+'">'+M(t)+"</td>",a+=i?"":"</tr>"}i?p.$tab.find('.instance-adapter[data-instance-id="'+t+'"]').html(a):e.append(a),p.initButtons(t,d),f(t),p.$tab.find('.instance-editable[data-instance-id="'+t+'"]').on("click",y).addClass("select-id-quick-edit"),p.$tab.find('.instance-schedule[data-instance-id="'+t+'"]').each(function(){$(this).find("button").length||($(this).append('<button class="instance-schedule-button small-button" data-instance-id="'+t+'" data-name="'+$(this).data("name")+'" title="'+_("Set CRON schedule for restarts")+'"><i class="material-icons">schedule</i></button>'),$(this).find("button").on("click",function(){var n=$(this).data("name"),i=$(this).data("instance-id");!function(e,t){e=(e||"").replace(/"/g,"").replace(/'/g,"");try{setupCron(e,t)}catch(e){alert(_("Cannot parse value as cron"))}}(p.main.objects[i].common[n]||"",function(e){if(null!==e){var t={common:{}};t.common[n]=e,p.main.socket.emit("extendObject",i,t,function(e){e&&p.main.showError(e)})}})}))}),p.$tab.find('.instance-name[data-instance-id="'+t+'"]').on("click",function(){var e=p.$tab.find('.instance-settings[data-instance-id="'+$(this).data("instance-id")+'"]');e.hasClass("small-button-empty")||e.trigger("click")}).css("cursor","pointer")}function u(e){void 0===e&&(e=p.$tab.find(".instances-filter").val());var t=[];if(e)for(var n=new RegExp(e),i=0;i<p.list.length;i++){var a=p.main.objects[p.list[i]];if(a&&a.common){var s="hide",o=a.common.titleLang||a.common.title;"object"==typeof o&&(o=o[systemLang]||o.en),a.common.name&&n.test(a.common.name)?s="show":o&&n.test(o)?s="show":"true"===e?s=p.$grid.find('.instance-adapter[data-instance-id="'+p.list[i]+'"]').find("instance-led").hasClass("led-green")?"show":"hide":"false"===e&&(s=p.$grid.find('.instance-adapter[data-instance-id="'+p.list[i]+'"]').find("instance-led").hasClass("led-green")?"hide":"show"),"show"===s&&p.filterHost&&a.common.host!==p.main.currentHost&&(s="hide"),"hide"===s&&t.push(p.list[i]),p.$grid.find('.instance-adapter[data-instance-id="'+p.list[i]+'"]')[s]()}else p.$grid.find('.instance-adapter[data-instance-id="'+p.list[i]+'"]').hide()}else if(p.filterHost)for(var r=0;r<p.list.length;r++){var c=p.main.objects[p.list[r]];if(c&&c.common){var l="hide";c.common.host===p.main.currentHost&&(l="show"),p.$grid.find('.instance-adapter[data-instance-id="'+p.list[r]+'"]')[l]()}else p.$grid.find('.instance-adapter[data-instance-id="'+p.list[r]+'"]').hide()}else p.$grid.find(".instance-adapter").show();var d=!1;p.$grid.find(".instance-adapter").each(function(){if($(this).is(":visible"))return!(d=!0)}),d?p.$grid.find(".filtered-out").hide():p.$grid.find(".filtered-out").show()}function y(e){var t=$(this),i=t.data("instance-id"),a=t.data("name"),n=t.data("options"),s=t.data("value"),o=this.innerHTML,r=t.css("text-align");t.css("text-align","left"),t.off("click").removeClass("select-id-quick-edit").css("position","relative");var c,l="cursor: pointer; position: absolute;width: 16px; height: 16px; top: 2px; border-radius: 6px; z-index: 3; background-color: lightgray";if(n){var d=n.split(";");c='<select style="width: calc(100% - 50px); z-index: 2">';for(var u=0;u<d.length;u++){var m=d[u].split(":");c+='<option value="'+m[0]+'">'+(m[1]||m[0])+"</option>"}c+="</select>"}c=c||'<input style="width: 100%; z-index: 2" type="text"/>';var g=null;t.html(c+'<div class="ui-icon ui-icon-check select-id-quick-edit-ok" style="margin-top: 0.45em;'+l+';right: 22px"></div><div class="cancel ui-icon ui-icon-close select-id-quick-edit-cancel" style="margin-top: 0.45em;'+l+';right: 2px" title="'+_("cancel")+'" ></div>');var h=n?t.find("select"):t.find("input");t.find(".select-id-quick-edit-cancel").off("click").on("click",function(e){g&&clearTimeout(g),g=null,e.preventDefault(),e.stopPropagation(),t.html(o).off("click").on("click",y).addClass("select-id-quick-edit").css("text-align",r)}),t.find(".select-id-quick-edit-ok").off("click").on("click",function(){t.trigger("blur")}),h.val(s),h.blur(function(){g&&clearTimeout(g),g=setTimeout(function(){g=null;var n=$(this).val();s=JSON.stringify(n)!==JSON.stringify(s)?(p.main.socket.emit("getObject",i,function(e,t){t?(t.common=t.common||{},t.common[a]=n,"title"===a&&t.common.titleLang&&delete t.common.titleLang,p.main.socket.emit("setObject",t._id,t,function(e){e&&p.main.showError(e)})):console.log("Object "+i+" does not exist: "+e)}),'<span style="color: pink">'+s+"</span>"):o,t.html(s).off("click").on("click",y).addClass("select-id-quick-edit").css("text-align",r)}.bind(this),100)}).on("keyup",function(e){13===e.which&&$(this).trigger("blur"),27===e.which&&(void 0===s&&(s=""),t.html(s).off("click").on("click",y).addClass("select-id-quick-edit").css("text-align",r))}),"object"==typeof e&&(e.preventDefault(),e.stopPropagation()),setTimeout(function(){h.focus()},100)}this.$tab=$("#tab-instances"),this.$grid=$("#grid-instances"),this.$gridHead=$("#grid-instances-head"),this.inited=!1,this.main=i,this.list=[],this.hostsText=null,this.filterHost=!1,this.memState="memAvailable",window.tdp||(window.tdp=function(e,t){return isNaN(e)?"":e.toFixed(t||0).replace(".",",").replace(/\B(?=(\d{3})+(?!\d))/g,".")}),this.replaceInLink=function(e,t,n){if("object"!=typeof e)return o(e,t,n);var i,a=JSON.parse(JSON.stringify(e));for(var s in a)a.hasOwnProperty(s)&&(a[s]=o(a[s],t,n),i||(i=a[s]));return a.__first=i,a},this.prepare=function(){var e=p.$tab.find(".instances-filter"),t=p.$tab.find(".instances-filter-clear");e.on("change",function(){var e=$(this).val();e?($(this).addClass("input-not-empty"),t.show()):($(this).removeClass("input-not-empty"),t.hide()),p.main.saveConfig("instancesFilter",e),u(e)}).on("keyup",function(){p.filterTimeout&&clearTimeout(p.filterTimeout),p.filterTimeout=setTimeout(function(){e.trigger("change")},300)}),p.main.config.instancesFilter&&"{"!==p.main.config.instancesFilter[0]?(e.addClass("input-not-empty").val(p.main.config.instancesFilter),t.show()):t.hide(),p.$tab.find(".btn-instances-expert-mode").on("click",function(){p.main.config.expertMode=!p.main.config.expertMode,p.main.saveConfig("expertMode",p.main.config.expertMode),p.updateExpertMode(),p.main.tabs.adapters.updateExpertMode()}),p.main.config.expertMode&&p.$tab.find(".btn-instances-expert-mode").addClass("red lighten-3"),p.$tab.find(".btn-instances-reload").on("click",function(){p.init(!0,!0)}),t.on("click",function(){e.val("").trigger("change")}),this.$tab.find(".btn-instances-host").off("click").on("click",function(){p.filterHost=!p.filterHost,p.filterHost?p.$tab.find(".btn-instances-host").addClass("red lighten-3"):p.$tab.find(".btn-instances-host").removeClass("red lighten-3"),p.main.saveConfig("instancesFilterHost",p.filterHost),setTimeout(function(){u()},50)}),this.filterHost=this.main.config.instancesFilterHost||!1,this.filterHost?this.$tab.find(".btn-instances-host").addClass("red lighten-3"):this.$tab.find(".btn-instances-host").removeClass("red lighten-3")},this.updateExpertMode=function(){p.init(!0),p.main.config.expertMode?p.$tab.find(".btn-instances-expert-mode").addClass("red lighten-3"):p.$tab.find(".btn-instances-expert-mode").removeClass("red lighten-3")},this.replaceLink=function(n,i,a,s){var o;(n=n.replace(/%/g,"")).match(/^native_/)&&(n=n.substring(7)),-1===n.indexOf("_")?o=[i+"."+a,n]:(o=n.split("_"))[0].match(/\.[0-9]+$/)||(o[0]+=".0"),"protocol"===o[1]&&(o[1]="secure"),"instance"!==n?this.main.socket.emit("getObject","system.adapter."+o[0],function(e,t){t&&setTimeout(function(){var e;(e=s?p.$tab.find("#"+s).data("src"):p.$tab.find("#a_"+i+"_"+a).attr("href"))&&(e="secure"===o[1]?e.replace("%"+n+"%",t.native[o[1]]?"https":"http"):-1===e.indexOf("%"+n+"%")?e.replace("%native_"+n+"%",t.native[o[1]]):e.replace("%"+n+"%",t.native[o[1]]),s?p.$tab.find("#"+s).data("src",e):p.$tab.find("#a_"+i+"_"+a).attr("href",e))},0)}):setTimeout(function(){var e;e=(e=s?p.$tab.find("#"+s).data("src"):p.$tab.find("#a_"+i+"_"+a).attr("href")).replace("%instance%",a),s?p.$tab.find("#"+s).data("src",e):p.$tab.find("#a_"+i+"_"+a).attr("href",e)},0)},this._replaceLink=function(n,i,a,s,o){var r;(i=i.replace(/%/g,"")).match(/^native_/)&&(i=i.substring(7)),-1===i.indexOf("_")?r=[a+"."+s,i]:(r=i.split("_"))[0].match(/\.[0-9]+$/)||(r[0]+=".0"),"protocol"===r[1]&&(r[1]="secure"),this.main.socket.emit("getObject","system.adapter."+r[0],function(e,t){n=t&&n?"secure"===r[1]?n.replace("%"+i+"%",t.native[r[1]]?"https":"http"):-1===n.indexOf("%"+i+"%")?n.replace("%native_"+i+"%",t.native[r[1]]):n.replace("%"+i+"%",t.native[r[1]]):(console.log("Cannot get link "+r[1]),n.replace("%"+i+"%","")),setTimeout(function(){o(n,a,s)},0)})},this._replaceLinks=function(e,t,n,i,a){if(!e)return a(e,t,n,i);var s=e.match(/%(\w+)%/g);return s?"%ip%"===s[0]?(e=e.replace("%ip%",location.hostname),void this._replaceLinks(e,t,n,i,a)):"%instance%"===s[0]?(e=e.replace("%instance%",n),void this._replaceLinks(e,t,n,i,a)):void this._replaceLink(e,s[0],t,n,function(e,t,n){this._replaceLinks(e,t,n,i,a)}.bind(this)):a(e,t,n,i)},this._postInit=function(e,t){if(this.main.currentHost&&void 0!==this.$grid&&(!this.$grid.data("inited")||e)){this.$grid.data("inited",!0),this.list.sort();for(var n=[],i=this.list.length-1;0<=i;i--)this.main.objects[this.list[i]]&&this.main.objects[this.list[i]].common&&!this.main.objects[this.list[i]].common.localLink&&!this.main.objects[this.list[i]].common.localLinks&&this.main.objects[this.list[i]].common.noConfig&&(n.push(this.list[i]),this.list.splice(i,1));for(this.list.sort(),n.sort(),i=0;i<n.length;i++)this.list.push(n[i]);o="<tr>",o+='<th style="width: calc(2em - 6px); border-right-color: transparent; overflow: visible"><span style="overflow:visible;" >'+_("instance")+"</span></th>",o+='<th style="width: calc(2em - 6px); border-left-color: transparent; border-right-color: transparent;"></th>',o+='<th style="width: '+(p.main.config.expertMode?10:12)+'em; border-left-color: transparent;"></th>',o+='<th style="width: 12.8em">'+_("actions")+"</th>",o+='<th style="text-align: left">'+_("title")+"</th>",1<p.main.tabs.hosts.list.length&&(o+='<th style="width: 10em">'+_("host")+"</th>"),o+='<th style="width: 8em">'+_("schedule_group")+"</th>",p.main.config.expertMode&&(o+='<th style="width: 8em">'+_("restart")+"</th>",o+='<th style="width: 8em">'+_("loglevel")+"</th>",o+='<th style="width: 8em">'+_("memlimit")+"</th>",o+='<th style="width: 8em">'+_("events")+"</th>"),o+='<th style="width: 8em">'+_("RAM usage")+"</th>",p.$gridHead.html(o),this.$grid.html("");for(var a=Date.now(),s=0;s<this.list.length;s++){this.main.objects[this.list[s]]&&d(this.$grid,this.list[s],this.main.config.instanceForm)}console.log(Date.now()-a),this.$grid.append('<tr class="filtered-out"><td></td><td></td><td colspan="20" style="padding-left: 1em">'+_("Filtered out")+"</td></tr>"),p.$tab.find("#currentHost").html(this.main.currentHost),1<p.main.tabs.hosts.list.length?this.$tab.find(".btn-instances-host").show():(this.$tab.find(".btn-instances-host").hide(),this.filterHost=!1),u(),r(),c(),l(),p.restoreScroll(),t&&p.main.showToast(p.$tab.find(".main-toolbar-table"),_("Updated"))}var o},this.getInstances=function(a){this.main.socket.emit("getForeignObjects","system.adapter.*","state",function(e,t){for(var n in t)t.hasOwnProperty(n)&&(p.main.objects[n]=t[n]);p.main.socket.emit("getForeignStates","*.info.connection",function(e,t){for(var n in t)t.hasOwnProperty(n)&&(p.main.states[n]=t[n]);p.main.socket.emit("getForeignStates","system.adapter.*",function(e,t){for(var n in t)t.hasOwnProperty(n)&&(p.main.states[n]=t[n]);p.main.socket.emit("getForeignObjects","system.adapter.*","instance",function(e,t){for(var n in p.main.instances.splice(0,p.main.instances.length),t)if(t.hasOwnProperty(n)){var i=t[n];"instance"===(p.main.objects[n]=i).type&&p.main.instances.push(n)}a&&a()})})})})},this.init=function(e,t){if(!this.inited||e)if(this.main.objectsLoaded){var n=0;n++,this.getInstances(function(){--n||p._postInit(e,t)}),n++,this.main.tabs.hosts.getHosts(function(){--n||p._postInit(e,t)}),this.inited||(this.inited=!0,this.main.subscribeObjects("system.adapter.*"),this.main.subscribeStates("system.adapter.*"),this.main.subscribeObjects("system.host.*"),this.main.subscribeStates("system.host.*"),this.main.subscribeStates("*.info.connection"))}else setTimeout(function(){p.init(e,t)},250)},this.saveScroll=function(){this.scrollTop=this.$tab.find(".grid-main-div").scrollTop()},this.restoreScroll=function(){this.scrollTop&&this.$tab.find(".grid-main-div").scrollTop(this.scrollTop)},this.destroy=function(){this.inited&&(this.saveScroll(),this.$grid.data("inited",!1),this.inited=!1,this.main.unsubscribeObjects("system.adapter.*"),this.main.unsubscribeStates("system.host.*"),this.main.unsubscribeObjects("system.host.*"),this.main.unsubscribeStates("system.adapter.*"),this.main.unsubscribeStates("*.info.connection"))},this.stateChange=function(e,t){if(this.main.states[e]=t,this.$grid){var n=e.split("."),i=n.pop();if(e=n.join("."),t){if("diskFree"===i||"diskWarning"===i)l();else if(i===p.memState)c();else if("memRss"===i){r();var a=p.$tab.find('.memUsage[data-instance-id="'+e+'"]'),s=M(e);a.length&&a.text()!==s&&a.html('<span class="highlight">'+s+"</span>")}else"outputCount"===i?p.$tab.find('.instance-out[data-instance-id="'+e+'"]').html('<span class="highlight">↦'+t.val+"</span>"):"inputCount"===i&&p.$tab.find('.instance-in[data-instance-id="'+e+'"]').html('<span class="highlight">⇥'+t.val+"</span>");if(-1!==this.list.indexOf(e))return void("alive"!==i&&"connected"!==i||f(e));e="system.adapter."+n[0]+"."+n[1],-1!==this.list.indexOf(e)&&"connection"===i&&f(e)}}},this.objectChange=function(e,t,n){if(e.match(/^system\.adapter\.[-\w]+\.[0-9]+$/))if(t)-1===this.list.indexOf(e)?(this.list.push(e),this.updateTimer&&clearTimeout(this.updateTimer),this.updateTimer=setTimeout(function(){p.updateTimer=null,p.init(!0)},200),t.common.noConfig||setTimeout(function(){-1===window.location.hash.indexOf("/config/")&&p.main.navigate({tab:"instances",dialog:"config",params:e})},2e3)):-1!==e.indexOf(".web.")?(this.updateTimer&&clearTimeout(this.updateTimer),this.updateTimer=setTimeout(function(){p.updateTimer=null,p.init(!0)},200)):this.$grid.find('.instance-adapter[data-instance-id="'+e+'"]').html(d(this.$grid,e,this.main.config.instanceForm,!0));else{var i=this.list.indexOf(e);-1!==i&&(this.list.splice(i,1),this.$grid.find('.instance-adapter[data-instance-id="'+e+'"]').remove())}else e.match(/^system\.host\.[-\w]+$/)&&(this.updateTimer&&clearTimeout(this.updateTimer),this.updateTimer=setTimeout(function(){p.updateTimer=null,p.init(!0)},200))},this.initButtons=function(e,t){e=e?'[data-instance-id="'+e+'"]':"";var n=p.$grid.find(".instance-edit"+e).off("click").on("click",function(){p.onEdit($(this).attr("data-instance-id"))});n.find(".ui-button-icon-primary").length||n.attr("title",_("edit")),(n=p.$grid.find(".instance-settings"+e).off("click").on("click",function(){p.main.navigate({tab:"instances",dialog:"config",params:$(this).data("instance-id")})})).each(function(){var e=$(this).attr("data-instance-id");i.objects[e]&&i.objects[e].common&&i.objects[e].common.noConfig&&$(this).addClass("disabled")}),n=p.$grid.find(".instance-reload"+e).off("click").on("click",function(){p.main.socket.emit("extendObject",$(this).attr("data-instance-id"),{},function(e){e&&p.main.showError(e)})}),n=p.$grid.find(".instance-del"+e).off("click").on("click",function(){var t=$(this).attr("data-instance-id");if(p.main.objects[t]&&p.main.objects[t].common&&p.main.objects[t].common.host){var e=t.replace(/^system\.adapter\./,"");p.main.confirmMessage(_("Are you sure you want to delete the instance <b>%s</b>?",e),null,"help",function(e){e&&p.main.cmdExec(p.main.objects[t].common.host,"del "+t.replace("system.adapter.",""),function(e){e||p.main.tabs.adapters.init(!0)})})}}),n=p.$grid.find(".instance-issue"+e).off("click").on("click",function(){p.main.navigate({tab:"instances",dialog:"issue",params:$(this).data("instance-id")})}),p.$grid.find(".instance-image"+e).each(function(){$(this).data("installed")||($(this).data("installed",!0),$(this).hover(function(){var e='<div class="icon-large" style="left: '+Math.round($(this).position().left+$(this).width()+5)+'px;"><img src="'+$(this).attr("src")+'"/></div>',t=$(e);t.insertAfter($(this)),$(this).data("big",t[0]);var n=parseFloat(t.height()),i=Math.round($(this).position().top-(n-parseFloat($(this).height()))/2);n+i>(window.innerHeight||document.documentElement.clientHeight)&&(i=(window.innerHeight||document.documentElement.clientHeight)-n),i<0&&(i=0),t.css({top:i})},function(){var e=$(this).data("big");$(e).remove(),$(this).data("big",void 0)}))}),(n=p.$grid.find(".instance-stop-run"+e).off("click").on("click",function(){var e=$(this).attr("data-instance-id");$(this).addClass("disabled"),p.main.socket.emit("extendObject",e,{common:{enabled:!p.main.objects[e].common.enabled}},function(e){e&&p.main.showError(e)})})).find(".ui-button-icon-primary").length||n.each(function(){var e=$(this).attr("data-instance-id");p.main.objects[e].common.enabled?n.addClass("instance-running").attr("title",_("Activated. Click to stop.")).find("i").html("pause"):n.removeClass("instance-running").attr("title",_("Deactivated. Click to start.")).find("i").html("play_arrow")}),n=p.$grid.find(".instance-web"+e).off("click").on("click",function(){var e=$(this).data("link");if("object"==typeof e){var t="";for(var n in e)if(e.hasOwnProperty(n)&&"__first"!==n){var i=e[n].match(/^https?:\/\/[-.\w]+:(\d+)\/?/),a=e[n].match(/^https:\/\//);t+='<li data-link="'+e[n]+'" data-instance-id="'+$(this).data("instance-id")+'" class="instances-menu-link"><b>'+n+(i?" :"+i[1]:"")+(a?" - SSL":"")+"</b></li>"}t+='<li class="instances-menu-link">'+_("Close")+"</li>";var s=$("#instances-menu");s.data("inited")&&s.menu("destroy");var o=$(this).position();s.html(t),s.data("inited")||(s.data("inited",!0),s.mouseleave(function(){$(this).hide()})),s.menu().css({left:o.left,top:o.top}).show(),s.find(".instances-menu-link").off("click").on("click",function(){$(this).data("link")&&window.open($(this).data("link"),$(this).data("instance-id")),$("#instances-menu").hide()})}else window.open($(this).data("link"),$(this).data("instance-id"))}),"object"==typeof t&&n.data("link",t)},this.resize=function(e,t){}}function Intro(e){var L=this;function t(e){var t=Math.floor(e/86400);e%=86400;var n=Math.floor(e/3600);n<10&&(n="0"+n),e%=3600;var i=Math.floor(e/60);i<10&&(i="0"+i),e%=60,(e=Math.floor(e))<10&&(e="0"+e);var a="";return t&&(a+=t+" "+_("daysShortText")+" "),a+=n+":"+i+":"+e}this.$tab=$("#tab-intro"),this.$tiles=this.$tab.find(".tab-intro-cards"),this.main=e,this.inited=!1,this.$template=$("#intro-template");var d={Uptime:t,"System uptime":t,RAM:function(e){var t=Math.floor(e/1073741824*10)/10;e%=1073741824;var n=Math.floor(e/1048576*10)/10,i="";return i+=1<t?t+" GB ":n+" MB "},Speed:function(e){return e+" MHz"},"Disk size":L.main.formatBytes,"Disk free":L.main.formatBytes};function u(e){var t=$("<textarea>");$(this).append(t),t.val($(this).data("clippy")),t.trigger("select"),document.execCommand("copy"),t.remove(),e.preventDefault(),e.stopPropagation(),L.main.showToast(L.$tiles,_("copied"))}function C(e){var t,c=L.$template.clone();if(c.removeAttr("id"),c.addClass("card-system-info"),c.find(".btn-small").addClass("disabled"),c.find(".card-titles").text(e.name),c.find(".btn-card-enabled").data("host",e.id),!1===L.main.systemConfig.common.intro[e.id]){if(!L.$tab.hasClass("edit-active"))return null;c.addClass("card-disabled").find(".btn-card-enabled").removeClass("blue").addClass("gray").find("i").text("close")}L.main.objects[e.id]&&L.main.objects[e.id].common&&(t=L.main.objects[e.id].common.icon),c.find(".card-image-img").attr("src",t||"img/no-image.png"),c.find(".card-content-text").html('<div class="preloader-wrapper small active">\n <div class="spinner-layer spinner-green-only">\n <div class="circle-clipper left">\n <div class="circle"></div>\n </div><div class="gap-patch">\n <div class="circle"></div>\n </div><div class="circle-clipper right">\n <div class="circle"></div>\n </div>\n </div>\n </div>');var l=setTimeout(function(){l&&(l=null,c.find(".btn-small").addClass("disabled"),c.find(".card-content-text").html(_("offline")))},6e3);return d["Disk size"]=d["Disk size"]||L.main.formatBytes,d["Disk free"]=d["Disk size"]||L.main.formatBytes,L.main.socket.emit("sendToHost",e.id,"getHostInfo",null,function(e){clearTimeout(l),l=null,"permissionError"===e?console.error('May not read "getHostInfo"'):e?c.find(".btn-small").removeClass("disabled"):console.error('Cannot read "getHostInfo"');var t=L.main.states["system.host."+L.main.currentHost+".diskWarning"];t=t?parseFloat(t.val):5;var n=0<e["Disk size"]&&e["Disk free"]&&Math.round(e["Disk free"]/e["Disk size"]*100)<t,i='<div class="card-content-text">';if(e){for(var a in i+="<ul>",e)!e.hasOwnProperty(a)||"Platform"!==a&&"NPM"!==a&&"RAM"!==a&&"Node.js"!==a||(i+="<li><b>"+_(a)+": </b>",i+='<span class="system-info" data-attribute="'+a+'">'+(d[a]?d[a](e[a]):e[a]||" --")+"</span></li>");n&&(i+="<li><b>"+_("Disk free")+": </b>",i+='<span class="system-info system-warning" data-attribute="Disk free">'+(d["Disk free"]?d["Disk free"](e["Disk free"]):e["Disk free"]||" --")+"</span></li>",i+="<li><b>"+_("Disk size")+": </b>",i+='<span class="system-info" data-attribute="Disk size">'+(d["Disk size"]?d["Disk size"](e["Disk size"]):e["Disk size"]||" --")+"</span></li>"),i+="</ul>"}i+="</div>",c.find(".card-content-text").replaceWith($(i)),i='<div class="card-reveal"><h5>'+_("Info")+'</h5><a class="btn-info" title="'+_("Copy to clipboard")+'"><i class="material-icons">content_copy</i></a><span class="card-title grey-text text-darken-4"><i class="material-icons right">close</i></span>';var s=[];if(e){for(var o in i+="<ul>",e)if(e.hasOwnProperty(o)){i+="<li><b>"+_(o)+": </b>";var r=d[o]?d[o](e[o]):e[o];s.push(o+": "+r),i+="Disk free"===o&&n?'<span class="system-info system-warning" data-attribute="'+o+'">'+r+"</span></li>":'<span class="system-info" data-attribute="'+o+'">'+r+"</span></li>"}i+="</ul>"}i+="</div>",c.find(".card-reveal").replaceWith($(i)),L.$tab.hasClass("edit-active")?c.find(".btn-small").hide():c.find(".btn-info").data("clippy",s.join("\r\n")).on("click",u)}),c}function D(e,t,n,i,a,s,o){var r=L.$template.clone();r.removeAttr("id");var c=a.replace(/^https?:\/\//,""),l=c.indexOf("/");if(-1!==l&&(c=c.substring(0,l)),"admin"===e&&c===location.host)return null;if("web"===e)return null;if("vis-web-admin"!==e&&e.match(/^vis-/))return null;if(e.match(/^icons-/))return null;if(i&&i.noIntro)return null;r.find(".btn-card-enabled").data("instance",e+"."+t+(n&&n.name?"."+n.name:"")).data("web",s),o?r.on("click",function(){L.$tab.hasClass("edit-active")||window.open($(this).find(".url").attr("href"))}):r.addClass("card-disabled").find(".btn-card-enabled").removeClass("blue").addClass("gray").find("i").text("close"),r.find(".url").attr("href","object"==typeof a?a._first:a||"").text(c+(s?" ("+s+")":"")),r.find(".card-image-img").attr("src",i.icon?"adapter/"+e+"/"+i.icon:"img/no-image.png"),n&&n.color&&r.find(".card-image").css("background",n.color);var d=n&&n.name||i.titleLang||i.title;"object"==typeof d&&(d=d[systemLang]||d.en),r.find(".card-titles").text(d||e);var u=i.desc;return"object"==typeof u&&(u=u[systemLang]||u.en),r.find(".card-content-text").text(u||""),r}function n(e,i){!function(e,t){var n,i,a,s=JSON.parse(JSON.stringify(e)),o=[];s.sort(function(e,t){return e=L.main.objects[e]&&L.main.objects[e].common,t=(t=L.main.objects[t]&&L.main.objects[t].common)||{},void 0===(e=e||{}).order&&void 0===t.order?e.name.toLowerCase()>t.name.toLowerCase()?1:e.name.toLowerCase()<t.name.toLowerCase()?-1:0:void 0===e.order?-1:void 0===t.order?1:e.order>t.order?1:e.order<t.order?-1:e.name.toLowerCase()>t.name.toLowerCase()?1:e.name.toLowerCase()<t.name.toLowerCase()?-1:0});var r=L.$tab.hasClass("edit-active"),c=[];for(n=0;n<s.length;n++){var l=L.main.objects[s[n]],d=l&&l.common;if(d&&(d.enabled||d.onlyWWW)&&(d.localLinks||d.localLink)){var u=d.localLinks||d.localLink||"",m=s[n].substring("system.adapter.".length).split("."),g=m[1];m=m[0];var h=u?L.main.tabs.instances.replaceInLink(u,m,g):"";a=null;var f=L.main.systemConfig.common.intro[m+"."+g];if("object"==typeof h){var p=!0;for(var b in h)if(h.hasOwnProperty(b)){if(i=!0,void 0!==f){if(p&&"object"!=typeof f){var M=f;f={},(L.main.systemConfig.common.intro[m+"."+g]=f)[b]=M}!1===f[b]&&(i=!1)}if(p=!1,!r&&!i)continue;-1===c.indexOf(h[b])&&((a=D(m,g,null,d,h[b],b,i))&&o.push(a),c.push(h[b]))}}else{if(i=!0,!r&&void 0!==f){if("object"==typeof f)for(var y in f)if(f.hasOwnProperty(y)){f=f[y],L.main.systemConfig.common.intro[m+"."+g]=f;break}!1===f&&(i=!1)}for(var v=d.welcomeScreen;v;){if(f=L.main.systemConfig.common.intro[m+"."+g+"."+v.name],!r&&void 0!==f){if("object"==typeof f)for(var w in f)if(f.hasOwnProperty(w)){f=f[w],L.main.systemConfig.common.intro[m+"."+g+"."+v.name]=f;break}!1===f&&(i=!1)}if(L.main.systemConfig.common.intro[m+"."+g+"."+v.name]=f,r||i){var j=h,N=j.match(/https?:\/\/[.\w\d-]+:\d+\/(.*)$/);N?j=j.replace(N[1],v.link):j+=v.link,j!==h&&-1===c.indexOf(j)&&((a=D(m,g,v,d,j,null,i))&&o.push(a),c.push(j))}v=v===d.welcomeScreenPro?d.welcomeScreen:null}if(!r&&!i)continue;-1===c.indexOf(h)&&((a=D(m,g,null,d,h,null,i))&&o.push(a),c.push(h))}}}for(var T=0;T<L.main.tabs.hosts.list.length;T++)(a=C(L.main.tabs.hosts.list[T]))&&o.push(a);t(null,o)}(e=e||L.main.instances,function(e,t){L.$tiles.html("");for(var n=0;n<t.length;n++)L.$tiles.append(t[n]);L.$tab.hasClass("edit-active")&&L.$tiles.find(".btn-card-enabled").on("click",function(){!$(this).hasClass("gray")?($(this).removeClass("blue").addClass("gray").find("i").text("close"),$(this).parent().addClass("card-disabled")):($(this).addClass("blue").removeClass("gray").find("i").text("check"),$(this).parent().removeClass("card-disabled"))}),i&&i()})}this.prepare=function(){this.$tab.find(".btn-edit").off("click").on("click",function(){L.$tab.addClass("edit-active"),n()}),this.$tab.find(".btn-edit-ok").off("click").on("click",function(){!function(n){var t=[];L.$tiles.find(".btn-card-enabled").each(function(){var e=$(this).data("instance");e?t.push({id:e,enabled:!$(this).hasClass("gray"),web:$(this).data("web")}):t.push({id:$(this).data("host"),enabled:!$(this).hasClass("gray")})});for(var e=L.main.systemConfig.common.intro,i=!0,a=0;a<t.length;a++){var s,o=t[a].id;if(t[a].web){if(void 0!==e[o]&&"object"!=typeof e[o]){var r=e[o];e[o]={},e[o][t[a].web]=r}s=!e[o]||void 0===e[o][t[a].web]||e[o][t[a].web]}else{if(void 0!==e[o]&&"object"==typeof e[o])for(var c in e[o])if(e[o].hasOwnProperty(c)){e[o]=e[o][c];break}s=void 0===e[o]||e[o]}t[a].enabled!==s&&(i=!0,t[a].web?(e[o]=e[o]||{},e[o][t[a].web]=t[a].enabled):e[o]=t[a].enabled)}i?L.main.socket.emit("getObject","system.config",function(e,t){t?(t.common.intro=L.main.systemConfig.common.intro,L.main.socket.emit("setObject",t._id,t,function(e){n&&n()})):n&&n()}):n&&n()}(function(){L.$tab.removeClass("edit-active"),n(),L.main.showToast(L.$tiles,_("Updated"))})}),this.$tab.find(".btn-edit-cancel").off("click").on("click",function(){L.$tab.removeClass("edit-active"),n()})},this.init=function(e){var i;this.inited&&!e||(this.main.objectsLoaded?(L.main.systemConfig.common.intro=L.main.systemConfig.common.intro||{},i=function(e,t){n(t,function(){L.restoreScroll()})},L.main.socket.emit("getObjectView","system","instance",{startkey:"system.adapter.",endkey:"system.adapter.香"},function(e,t){if(e)i&&i(e,[]);else if(0===t.rows.length)i&&i(e,[]);else{L.main.instances=[];for(var n=0;n<t.rows.length;n++)L.main.instances.push(t.rows[n].id),L.main.objects[t.rows[n].id]=t.rows[n].value;i&&i(e,L.main.instances)}}),this.inited||(this.inited=!0,this.main.subscribeObjects("system.adapter.*"),this.main.subscribeObjects("system.host.*"))):setTimeout(function(){L.init(e)},250))},this.saveScroll=function(){this.scrollTop=this.$tiles.scrollTop()},this.restoreScroll=function(){L.scrollTop&&L.$tiles.scrollTop(L.scrollTop)},this.destroy=function(){this.inited&&(this.saveScroll(),this.inited=!1,this.main.unsubscribeObjects("system.adapter.*"),this.main.unsubscribeObjects("system.host.*"))},this.objectChange=function(e){this.inited&&(e.match(/^system\.adapter\.[a-zA-Z0-9-_]+\.\d+$/)||e.match(/^system\.host\./))&&(this.updateTimeout&&(this.updateTimeout=clearTimeout(this.updateTimeout)),this.updateTimeout=setTimeout(function(){n()},1e3))}}function Issue(e){var a=this;this.$dialogIssue=$("#dialog-issue"),this.main=e,this.prepare=function(){},this.init=function(){if(!this.inited){this.inited=!0,showdown.setFlavor("github");var e=this.main.navigateGetParams(),t=e.replace(/^system\.adapter\./,""),n=this.main.objects[e];if(n&&n.common&&n.common.extIcon){var i=n.common.extIcon.split("/"),r=a.$dialogIssue.find("#result-issue");r.html('<div class="loader"><svg class="spinner" width="100%" height="100%" viewBox="0 0 66 66" xmlns="http://www.w3.org/2000/svg">\n <circle class="path" fill="none" stroke-width="6" stroke-linecap="round" cx="33" cy="33" r="30"></circle>\n</svg></div>');$.getJSON("https://api.github.com/repos/"+i[3]+"/"+i[4]+"/issues",function(e){var t=!1;for(var n in r.empty(),e)if(e.hasOwnProperty(n)){if("remove"===n)break;var i=e[n];if(!i.hasOwnProperty("pull_request")){t=!0;var a=$("#issueTable").children().clone(!0,!0);a.find(".collapsible-header-title").text(i.title),a.find(".goto").attr("href",i.html_url),a.find(".user").text(i.user.login),a.find(".form-row").html((new showdown.Converter).makeHtml(i.body).replace(/src="/g,'class="responsive-img" src="'));var s=new Date(new Date(i.created_at));if(a.find(".created").text(s.toLocaleDateString(systemLang,{weekday:"short",year:"numeric",month:"long",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})),0<i.labels.length)for(var o in i.labels)if(i.labels.hasOwnProperty(o)){if("remove"===o)break;a.find(".category").append('<a class="btn-floating btn-small translateT" style="background:#'+i.labels[o].color+';" title="'+i.labels[o].name+'"><span>'+i.labels[o].name+"</span></a>")}r.append(a),0}}t||r.append($('<li><h3 class="title">'+_("No bug")+"</h3></li>"))}).done(a.$dialogIssue.find(".collapsible").collapsible())}a.$dialogIssue.data("name",t),a.$dialogIssue.find(".title").html(_("Known bugs for")+": "+t),a.$dialogIssue.find(".dialog-system-buttons .btn-add").attr("href","https://github.com/"+i[3]+"/"+i[4]+"/issues/new"),a.$dialogIssue.find(".dialog-system-buttons .btn-cancel").off("click").on("click",function(e){e.stopPropagation(),e.preventDefault(),a.main.navigate()})}},this.destroy=function(){this.inited&&(this.$dialogIssue.find(".collapsible").collapsible("destroy"),this.inited=!1)}}function Logs(t){var c=this;this.main=t,this.$tab=$("#tab-logs");var s,l,o,d,r={count:0,start:0,limit:2e3},u={host:"",severity:"",message:""},m={list:[],mode:!1,counter:0,overflow:!1,$counterSpan:null};this.prepare=function(){l=this.$tab.find("#log-outer"),s=this.$tab.find("#log-table"),o=this.$tab.find("#log-pause"),(d=new IobListHeader("log-outer-header",{list:l,colWidthOffset:1,prefix:"log-filter"})).doFilter=c.filter,d.add("combobox","from","host"),d.add("text","Time"),d.add("combobox","","severity",[{val:"",name:"debug"},{val:"silly",name:"silly"},{val:"info",name:"info"},{val:"warn",name:"warn"},{val:"error",name:"error"}]).$filter.attr("title",_("severity")),d.add("edit","Message","message"),this.$tab.find("#log-clear-on-disk").on("click",function(){c.main.confirmMessage(_("Log file will be deleted. Are you sure?"),null,null,function(e){e&&c.main.socket.emit("sendToHost",t.currentHost,"delLogs",null,function(e){e?c.main.showError(e):c.clear()})})}).addClass("ui-state-error"),this.$tab.find("#log-refresh").on("click",function(){c.clear()}),o.attr("title",_("Pause output")).on("click",function(){c.pause()}),m.$counterSpan=o.find("ui-button-text"),this.$tab.find("#log-clear").on("click",function(){c.clear(!1)}),$("#log-copy-text").on("click",function(){$(this).hide().html("")}),this.$tab.find("#log-copy").on("click",function(){var e='<span class="error">'+_("copy note")+"</span>";$("#log-copy-text").show().html(e+'<br><table style="width: 100%; font-size: 12px" id="log-copy-table">'+s.html()+"</table>");for(var t=c.$tab.find("#log-copy-table").find(".log-column-4"),n=0;n<t.length;n++){var i=$(t[n]);i.html(i.attr("title")),i.attr("title","")}})},this.init=function(e){if(!this.inited||e)if(this.main.currentHost){s.html("");var r=!this.inited;this.inited=!0,this.main.socket.emit("sendToHost",this.main.currentHost,"getLogs",200,function(o){setTimeout(function(){var e={message:"",severity:"debug",from:"",ts:""},t=o?o.pop():-1;-1!==t&&(t=parseInt(t),c.$tab.find("#log-size").html((_("Log size:")+" "+(t/1048576).toFixed(2)+" MB ").replace(/ /g," ")));for(var n=0,i=o.length;n<i;n++)if(o[n]){var a=o[n];if("-"===a[4]&&"-"===a[7]){a=a.replace(/(\[[0-9]+m)/g,""),e.ts=a.substring(0,23);var s=(a=a.substring(27)).indexOf(":");e.severity=a.substring(0,s),27===e.severity.charCodeAt(e.severity.length-1)&&(e.severity=e.severity.substring(0,e.severity.length-1)),27===e.severity.charCodeAt(0)&&(e.severity=e.severity.substring(1)),s=(a=a.substring(s+2)).indexOf(" "),e.from=a.substring(0,s),e.message=a.substring(s)}else e.message=a;c.add(e)}!function e(){$.fn.colResizable&&(l.is(":visible")?(l.colResizable({liveDrag:!0,partialRefresh:!0,marginLeft:5,postbackSafe:!0,onResize:function(e){return d.syncHeader()}}),d&&d.syncHeader()):setTimeout(function(){e()},200))}(),u.host=d.host.val(),u.message=d.message.val(),u.severity=d.severity.val(),r&&c.main.subscribeLogs(!0),c.main.socket.emit("readLogs",function(e,t){if(t&&t.length){var n="";t.reverse();for(var i=0;i<t.length;i++){var a=t[i].split("/").pop().replace(/yunkong2\.?/,"").replace(".log","");a[0]<="9"&&(n+='<li><a data-value="'+t[i]+'">'+a+"</a></li>")}t.sort();for(var s=0;s<t.length;s++){var o=t[s].split("/").pop().replace(/yunkong2\.?/,"").replace(".log","");"9"<o[0]&&(n+='<li><a data-value="'+t[s]+'">'+o+"</a></li>")}c.$tab.find("#log-files-btn").show().dropdown(),c.$tab.find("#log-files").html(n).find("a").on("click",function(){var e=$(this).data("value");e&&($(this).val(""),window.open(e,"_blank").focus())})}else c.$tab.find("#log-files").hide(),c.$tab.find("#log-files-btn").hide()})},0)})}else setTimeout(function(){c.init(e)},100)},this.destroy=function(){this.inited&&(this.inited=!1,this.main.subscribeLogs(!1))},this.add=function(e){if(s){if(e.message.substring(0,e.from.length)===e.from&&(e.message=e.message.substring(e.from.length+1)),m.mode)return m.list.push(e),m.counter++,m.counter>r.limit&&(m.overflow||(o.addClass("ui-state-error").attr("title",_("Message buffer overflow. Losing oldest")),m.overflow=!0),m.list.shift()),void m.$counterSpan.html(tdp(m.counter));if(r.count>=r.limit){var t=document.getElementById("log-line-"+(r.start+1));t&&(t.outerHTML=""),r.start++}else r.count++;e.from&&d&&d.host.checkAddOption(e.from,function(e){return{val:e.replace(/\./g,"-"),name:e}});var n="",i=e.from?e.from.replace(/\./g,"-"):"";u.host&&u.host!==i&&(n="display: none"),!n&&u.severity&&("debug"===u.severity&&"silly"===e.severity?n="display: none":"info"!==u.severity||"debug"!==e.severity&&"silly"!==e.severity?"warn"===u.severity&&"warn"!==e.severity&&"error"!==e.severity?n="display: none":"error"===u.severity&&"error"!==e.severity&&(n="display: none"):n="display: none"),!n&&u.message&&-1===e.message.indexOf(u.message)&&(n="display: none"),"error"===e.severity&&(c.$tabLogs=c.$tabLogs||$('a[href="#tab-logs"]'),c.$tabLogs.addClass("errorLog"));var a='<tr id="log-line-'+(r.start+r.count)+'" class="log-line log-severity-'+e.severity+" "+(i?"log-from-"+i:"")+'" style="'+n+'">';a+='<td class="log-column-1">'+(e.from||"")+"</td>",a+='<td class="log-column-2">'+this.main.formatDate(e.ts)+"</td>",a+='<td class="log-column-3">'+e.severity+"</td>",a+='<td class="log-column-4" title="'+e.message.replace(/"/g,"'")+'">'+e.message.substring(0,200).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")+"</td></tr>",s.prepend(a)}},this.filter=function(){u.host=d.host.val(),u.message=d.message.val(),u.severity=d.severity.val(),"error"===u.severity?(l.find(".log-severity-silly").hide(),l.find(".log-severity-debug").hide(),l.find(".log-severity-info").hide(),l.find(".log-severity-warn").hide()):("warn"===u.severity?(l.find(".log-severity-silly").hide(),l.find(".log-severity-debug").hide(),l.find(".log-severity-info").hide()):("info"===u.severity?(l.find(".log-severity-silly").hide(),l.find(".log-severity-debug").hide()):("silly"===u.severity?l.find(".log-severity-silly").show():l.find(".log-severity-silly").hide(),l.find(".log-severity-debug").show()),l.find(".log-severity-info").show()),l.find(".log-severity-warn").show()),l.find(".log-severity-error").show(),(u.host||u.message)&&l.find(".log-line").each(function(){u.host&&!$(this).hasClass("log-from-"+u.host)?$(this).hide():u.message&&-1===$(this).html().indexOf(u.message)&&$(this).hide()})},this.clear=function(e){void 0===e&&(e=!0),s.html(""),r.count=0,r.start=0,c.$tabLogs=c.$tabLogs||$('a[href="#tab-logs"]'),c.$tabLogs.removeClass("errorLog"),e&&setTimeout(function(){c.init(e)},0)},this.pause=function(){if(m.mode){m.mode=!1;for(var e=0;e<m.list.length;e++)this.add(m.list[e]);m.overflow=!1,m.list=[],m.counter=0,o.removeClass("yellow btn-pause-button-active").html('<i class="material-icons">pause</i>')}else o.addClass("yellow btn-pause-button-active"),m.$counterSpan=o,m.$counterSpan.html("0"),m.counter=0,m.mode=!0}}function Issue(e){var a=this;this.$dialog=$("#dialog-issue"),this.main=e,this.prepare=function(){},this.init=function(){if(!this.inited){this.inited=!0,showdown.setFlavor("github");var e=this.main.navigateGetParams(),t=e.replace(/^system\.adapter\./,""),n=this.main.objects[e];if(n&&n.common&&n.common.extIcon){var i=n.common.extIcon.split("/"),r=$("#result-issue");r.html('<div class="loader"><svg class="spinner" width="100%" height="100%" viewBox="0 0 66 66" xmlns="http://www.w3.org/2000/svg">\n <circle class="path" fill="none" stroke-width="6" stroke-linecap="round" cx="33" cy="33" r="30"></circle>\n</svg></div>');$.getJSON("https://api.github.com/repos/"+i[3]+"/"+i[4]+"/issues",function(e){var t=!1;for(var n in r.empty(),e)if(e.hasOwnProperty(n)){if("remove"===n)break;var i=e[n];if(!i.hasOwnProperty("pull_request")){t=!0;var a=$("#issueTable").children().clone(!0,!0);a.find(".collapsible-header-title").text(i.title),a.find(".goto").attr("href",i.html_url),a.find(".user").text(i.user.login),a.find(".form-row").html((new showdown.Converter).makeHtml(i.body).replace(/src="/g,'class="responsive-img" src="'));var s=new Date(new Date(i.created_at));if(a.find(".created").text(s.toLocaleDateString(systemLang,{weekday:"short",year:"numeric",month:"long",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})),0<i.labels.length)for(var o in i.labels)if(i.labels.hasOwnProperty(o)){if("remove"===o)break;a.find(".category").append('<a class="btn-floating btn-small translateT" style="background:#'+i.labels[o].color+';" title="'+i.labels[o].name+'"><span>'+i.labels[o].name+"</span></a>")}r.append(a),0}}t||r.append($('<li><h3 class="title">'+_("No bug")+"</h3></li>"))}).done(a.$dialog.find(".collapsible").collapsible())}a.$dialog.data("name",t),a.$dialog.find(".title").html(_("Known bugs for")+": "+t),a.$dialog.find(".dialog-system-buttons .btn-add").attr("href","https://github.com/"+i[3]+"/"+i[4]+"/issues/new"),a.$dialog.find(".dialog-system-buttons .btn-cancel").off("click").on("click",function(e){e.stopPropagation(),e.preventDefault(),a.main.navigate()})}},this.destroy=function(){this.inited&&(this.$dialog.find(".collapsible").collapsible("destroy"),this.inited=!1)}}function Objects(e){var c=this;this.$grid=$("#grid-objects"),this.subscribes={},this.main=e;var o=function(){if(c.$grid&&c.$grid.selectId)return o=c.$grid.selectId.bind(c.$grid),c.$grid.selectId.apply(c.$grid,arguments)};function r(t,e,n){for(var i=c.main.tabs.enums.list,a=[],s=0;s<i.length;s++)i[s].substring(0,"enum.".length+e.length+1)==="enum."+e+"."&&a.push(i[s]);!function t(n,i,a,s){if(i&&i.length){var e=i.pop();if(c.main.objects[e]&&c.main.objects[e].common){var o=0;if(c.main.objects[e].common.members&&c.main.objects[e].common.members.length){var r=c.main.objects[e].common.members.indexOf(n);-1!==r&&-1===a.indexOf(e)&&(c.main.objects[e].common.members.splice(r,1),o++,c.main.socket.emit("setObject",e,c.main.objects[e],function(e){e&&c.main.showError(e),--o||setTimeout(function(){t(n,i,a,s)},0)}))}-1===a.indexOf(e)||c.main.objects[e].common.members&&-1!==c.main.objects[e].common.members.indexOf(n)||(c.main.objects[e].common.members=c.main.objects[e].common.members||[],c.main.objects[e].common.members.push(n),o++,c.main.socket.emit("setObject",e,c.main.objects[e],function(e){e&&c.main.showError(e),--o||setTimeout(function(){t(n,i,a,s)},0)}))}o||setTimeout(function(){t(n,i,a,s)},0)}else s&&s()}(t,a,n,function(e){e&&c.main.showError(e),o("object",t,c.main.objects[t])})}function a(e){console.log("Subscribe: "+e),c.main.subscribeStates(e),c.main.socket.emit("getForeignStates",e,function(e,t){if(t)for(var n in t)console.log("Update "+n),t.hasOwnProperty(n)&&(!t[n]&&c.main.states[n]?(c.main.states[n]={val:null},c.stateChange(n,c.main.states[n])):c.main.states[n]&&c.main.states[n].ts===t[n].ts||(c.main.states[n]=t[n],c.stateChange(n,t[n])));else e&&console.error("requestStates error: "+e)})}function n(){for(var e in c.subscribes){if(c.subscribes.hasOwnProperty(e))c.main.objects[e]&&"state"===c.main.objects[e].type?(c.main.unsubscribeStates(e),console.log("Unsubscribe: "+e)):(c.main.unsubscribeStates(e+".*"),console.log("Unsubscribe: "+e+".*"))}}function s(n,i){if(n)for(var e in n)if(n.hasOwnProperty(e)&&n[e]){var a=n[e];return n[e]=null,void c.main.socket.emit("setObject",e,a,function(e){e?c.main.showError(e):"state"===a.type?c.main.socket.emit("getState",a._id,function(e,t){t&&null!==t.val||c.main.socket.emit("setState",a._id,a.common&&void 0!==a.common.def?a.common.def:null,!0),setTimeout(s,0,n,i)}):setTimeout(s,0,n,i)})}i&&i()}this.prepare=function(){$(document).on("click",".jump",function(e){return c.main.navigate({dialog:"editobject",params:$(this).attr("data-jump-to")}),e.preventDefault(),!1}),$("#load_grid-objects").show();var o=$("#dialog-new-object");o.modal(),o.find(".btn-add").off("click").on("click",function(){var e=o.find("#object-tab-new-object-name").val(),t=e.trim(),n=o.find("#object-tab-new-object-parent").val();t=n?n+"."+t:t;var i,a=o.find("#object-tab-new-object-type").val(),s=o.find("#object-tab-new-state-type").val();(t=t.replace(FORBIDDEN_CHARS,"_"),c.main.objects[t])?c.main.showError(_('Object "%s" yet exists!',t)):("state"===a?(i={_id:t,type:"state",common:{name:e,role:"",type:s,read:!0,write:!0,desc:_("Manually created")},native:{}},"boolean"===s?i.common.def=!1:"switch"===s?(i.common.type="boolean",i.common.def=!1,i.common.states="false:no;true:yes"):"string"===s?i.common.def="":"number"===s?(i.common.min=0,i.common.max=100,i.common.def=0,i.common.unit="%"):"enum"===s&&(i.common.type="number",i.common.min=0,i.common.max=5,i.common.def=0,i.common.states="0:zero;1:one;2:two;3:three;4:four;5:five")):i="channel"===a?{_id:t,type:"channel",common:{name:e,role:"",icon:"",desc:_("Manually created")},native:{}}:{_id:t,type:"device",common:{name:e,role:"",icon:"",desc:_("Manually created")},native:{}},c.main.socket.emit("setObject",t,i,function(e){e?c.main.showError(e):setTimeout(function(){c.main.navigate({dialog:"editobject",params:t+",def"})},1e3)}))}),o.find("#object-tab-new-object-type").select(),o.find("#object-tab-new-state-type").select(),o.find("#object-tab-new-object-name").on("keyup",function(){$(this).trigger("change")}).on("change",function(){var e=o.find("#object-tab-new-object-parent").val(),t=o.find("#object-tab-new-object-name").val();t=e?e+"."+t:t,o.find(".title").html(_("Add new object: %s",t))}),o.find("#object-tab-new-object-type").on("change",function(){"state"===$(this).val()?o.find(".object-tabe-new-object-tr").show():o.find(".object-tab-new-object-tr").hide()})},this.stateChange=function(e,t){this.$grid&&o("state",e,t)},this.objectChange=function(e,t,n){this.$grid&&o("object",e,t,n)},this.reinit=function(){this.main.dialogs.customs.check(),this.$grid&&(o("option","useHistory",this.main.dialogs.customs.customEnabled),o("reinit"))},this.saveScroll=function(){this.scrollTop=this.$grid.find(".grid-main-wh-div").scrollTop()},this.restoreScroll=function(){this.scrollTop&&this.$grid.find(".grid-main-wh-div").scrollTop(this.scrollTop)},this.init=function(e){if(!this.inited||e){if(e&&(n(),this.subscribes={}),void 0!==this.$grid){null===this.main.dialogs.customs.customEnabled&&this.main.dialogs.customs.check();var t={objects:this.main.objects,states:this.main.states,noDialog:!0,stats:!0,name:"admin-objects",useValues:["ID","name","value.from","value.q","value.ts","value.lc","value.val","button"],useHistory:this.main.dialogs.customs.customEnabled,showButtonsForNotExistingObjects:!0,expertModeRegEx:/^system\.|^yunkong2\.|^_|^[\w-]+$|^enum\.|^[\w-]+\.admin|^script\./,texts:{select:_("Select"),cancel:_("Cancel"),all:_("All"),id:_("ID"),ID:_("ID"),name:_("Name"),role:_("Role"),room:_("Room"),function:_("Function"),value:_("Value"),type:_("Type"),selectid:_("Select ID"),from:_("From"),lc:_("Last changed"),ts:_("Time stamp"),wait:_("Processing..."),ack:_("Acknowledged"),expand:_("Expand all nodes"),collapse:_("Collapse all nodes"),refresh:_("Rebuild tree"),edit:_("Edit"),push:_("Trigger event"),ok:_("Ok"),with:_("With"),without:_("Without"),copyToClipboard:_("Copy to clipboard"),expertMode:_("Toggle expert mode"),sort:_("Sort alphabetically"),button:_("Settings"),editDialog:_("Edit in dialog"),noData:_("No data"),Objects:_("Objects"),States:_("States"),toggleValues:_("Toggle states view"),user:_("User")},columns:["ID","name","type","role","room","function","value","button"],expandedCallback:function(e,t,n){n&&function(e){"string"==typeof e&&(e=[e]);for(var t=0;t<e.length;t++){if(console.log("Expanded: "+e[t]),c.subscribes[e[t]])return c.subscribes[e[t]]++;for(var n in c.subscribes)if(c.subscribes.hasOwnProperty(n)&&e[t].substring(0,n.length)+"."==n+".")return c.subscribes[n]++;c.subscribes[e[t]]=1;var i=c.main.objects[e[t]];i&&"state"===i.type?a(e[t]):a(e[t]+".*")}}(e)},collapsedCallback:function(e,t,n){!function(e){if(console.log("Collapsed: "+e),c.subscribes[e]){if(c.subscribes[e]--,!c.subscribes[e]){var t=c.main.objects[e];t&&"state"===t.type?(console.log("Unsubscribe: "+e),c.main.unsubscribeStates(e)):(console.log("Unsubscribe: "+e+".*"),c.main.unsubscribeStates(e+".*")),delete c.subscribes[e]}}else for(var n in c.subscribes)if(c.subscribes.hasOwnProperty(n)&&n.substring(0,e.length)+"."==e+"."&&(c.subscribes[n]--,!c.subscribes[n])){var i=c.main.objects[n];i&&"state"===i.type?(c.main.unsubscribeStates(n),console.log("Unsubscribe: "+n)):(c.main.unsubscribeStates(n+".*"),console.log("Unsubscribe: "+n+".*")),delete c.subscribes[n]}}(e)},buttons:[{text:!1,icons:{primary:"ui-icon-pencil"},"material-icon":"edit",click:function(e){c.main.navigate({dialog:"editobject",params:e})},match:function(e){c.main.objects[e]||(this[0].outerHTML='<div class="td-button-placeholder"></div>')},width:26,height:20},{text:!1,icons:{primary:"ui-icon-trash"},"material-icon":"delete",click:function(e){e&&c.main.delObject(c.$grid,e,function(e){e&&c.main.showError(e)})},match:function(e){c.main.objects[e]&&c.main.objects[e].common&&c.main.objects[e].common.dontDelete&&this.hide()},width:26,height:20},{text:!1,icons:{primary:"ui-icon-gear"},"material-icon":"build",click:function(e){c.main.dialogs.customs.ids=null,c.main.navigate({dialog:"customs",params:e})},width:26,height:20,match:function(e){if(c.main.objects[e]&&c.main.dialogs.customs.customEnabled&&!e.match(/\.messagebox$/)&&"state"===c.main.objects[e].type){var t=!1;if(c.main.objects[e]&&c.main.objects[e].common&&c.main.objects[e].common.custom){var n=c.main.objects[e].common.custom;for(var i in void 0!==n.enabled&&(n=c.main.objects[e].common.custom=n.enabled?{"history.0":n}:{}),n)if(n.hasOwnProperty(i)){t=!0;break}}t?this.addClass("custom-enabled").removeClass("custom-disabled"):(delete c.main.objects[e].common.custom,this.addClass("custom-disabled").removeClass("custom-enabled"))}else this.hide()}}],panelButtons:[{text:!1,icons:{primary:"ui-icon-plus"},"material-icon":"add",title:_("Add new child object to selected parent"),click:function(){var e=o("getActual")||"",t=$("#dialog-new-object");t.find("#object-tab-new-object-parent").val(e),t.find("#object-tab-new-object-name").val(_("newObject")),c.main.objects[e]&&"device"===c.main.objects[e].type?t.find("#object-tab-new-object-type").val("channel"):(c.main.objects[e]&&c.main.objects[e].type,t.find("#object-tab-new-object-type").val("state")),t.modal("open"),t.find("h6").html(_("Add new object: %s",(e?e+".":"")+_("newObject"))),t.find("#object-tab-new-object-name").focus()}},{text:!1,id:"add_object_tree","material-icon":"file_upload",icons:{primary:"ui-icon-arrowthickstop-1-n"},title:_("Add Objecttree from JSON File"),click:function(){var e=document.createElement("input");e.setAttribute("type","file"),e.setAttribute("id","files"),e.setAttribute("opacity",0),e.addEventListener("change",function(e){!function(e){var t=e.target.files[0];if(t){var n=new FileReader;n.onload=function(e){var t=e.target.result,n=JSON.parse(t),i=Object.keys(n).length,a=n._id;void 0===a&&1<i?s(n,function(){c.main.showToast(c.$grid.find(".main-toolbar-table"),_("%s object(s) processed",Object.keys(n).length))}):c.main.socket.emit("setObject",n._id,n,function(e){e?c.main.showError(e):("state"===n.type&&c.main.socket.emit("setState",n._id,void 0===n.common.def?null:n.common.def,!0),c.main.showToast(c.$grid.find(".main-toolbar-table"),_("%s was imported",n._id)))})},n.readAsText(t)}else alert("Failed to open JSON File")}(e)},!1),e.click()}},{text:!1,id:"save_object_tree",icons:{primary:"ui-icon-arrowthickstop-1-s"},"material-icon":"file_download",title:_("Save Objecttree as JSON File"),click:function(){var e,t,n,i=o("getActual")||"",a={};$.map(c.main.objects,function(e,t){t.search(i)||(a[t]=e)}),void 0!==a?(e=i+".json",t=a,(n=document.createElement("a")).setAttribute("href","data:application/json;charset=utf-8,"+encodeURIComponent(JSON.stringify(t,null,2))),n.setAttribute("download",e),n.style.display="none",document.body.appendChild(n),n.click(),document.body.removeChild(n)):alert(_("Save of objects-tree is not possible"))}}],quickEdit:["name","value","role","function","room","value.val"],quickEditCallback:function(n,i,a,e,t){if("room"===i)r(n,"rooms",a);else if("function"===i)r(n,"functions",a);else if("value"===i){if(c.main.objects[n]&&c.main.objects[n].common&&c.main.objects[n].common.type)switch(c.main.objects[n].common.type){case"number":var s=parseFloat(a);isNaN(s)&&(s="false"===a?0:~~a),a=s;break;case"boolean":"true"===a&&(a=!0),"false"===a&&(a=!1);break;case"string":a=a.toString();break;default:"true"===a&&(a=!0),"false"===a&&(a=!1),parseFloat(a).toString()===a.toString().replace(/[.,]0*$/,"")&&(a=parseFloat(a))}t=t||!1,c.main.socket.emit("setState",n,{val:a,ack:t},function(e){if(e)return c.main.showError(e)})}else c.main.socket.emit("getObject",n,function(e,t){if(e)return c.main.showError(e);t||(t={type:"meta",common:{typ:"meta.user",role:""},native:{},_id:n}),t.common[i]=a,c.main.socket.emit("setObject",t._id,t,function(e){e&&c.main.showError(e)})})}};this.main.dialogs.customs.customEnabled?t.customButtonFilter={icons:{primary:"ui-icon-gear"},"material-icon":"build",text:!1,callback:function(){for(var e=o("getFilteredIds"),t=[],n=0;n<e.length;n++)c.main.objects[e[n]]&&"state"===c.main.objects[e[n]].type&&t.push(e[n]);t&&t.length?t.length<10?(c.main.dialogs.customs.ids=null,c.main.navigate({dialog:"customs",params:t.join(",")})):(c.main.dialogs.customs.ids=t,c.main.navigate({dialog:"customs"})):c.main.showMessage(_("No states selected!"),"","info_outline")}}:t.customButtonFilter=null,o("init",t).selectId("show",null,null,function(){c.restoreScroll()})}this.inited||(this.inited=!0,this.main.subscribeObjects("*"),function(){for(var e in c.subscribes)c.subscribes.hasOwnProperty(e)&&(c.main.objects[e]&&"state"===c.main.objects[e].type?a(e):a(e+".*"))}())}},this.destroy=function(){this.inited&&(this.saveScroll(),c.main.unsubscribeObjects("*"),this.inited=!1,n())}}function Readme(e){var o=this;function r(e,t){var n=(new showdown.Converter).makeHtml(e);return(n=(n=(n=(n=n.replace(/id="/g,'id="mdid-')).replace(/src="(?!http)/g,'class="responsive-img" src="'+t)).replace(/href="#/g,'href="" class="goto-link" data-goto="#mdid-')).replace(/href="(\S*).md/g,function(e){return'href="" class="md-link" data-url="'+o.mainUrl+e.replace('href="',"")})).replace(/href="http/g,'target="_blank" href="http')}function c(e){for(var t=e.length-1;0<=t&&!e[t];)t--;return t!==e.length-1&&e.splice(t),e}this.$dialog=$("#dialog-readme"),this.$divReadme=this.$dialog.find(".result-readme"),this.$divChangeLog=this.$dialog.find(".result-changelog"),this.$divLicense=this.$dialog.find(".result-license"),this.$divLogo=this.$dialog.find(".result-logo"),this.$tabs=this.$dialog.find(".tabs"),this.mainUrl="",this.main=e,this.prepare=function(){},this.init=function(){if(!this.inited){this.inited=!0,this.$tabs.data("inited")||(this.$tabs.data("inited",!0),this.$tabs.mtabs()),showdown.setFlavor("github");var e=this.main.navigateGetParams(),t=o.main.tabs.adapters.$tab.find('.adapter-readme-submit[data-adapter-name="'+e+'"]').data("adapter-url");if(t||(t=localStorage.getItem("original-md-url")),t){localStorage.setItem("original-md-url",t);var n=(t=t.replace("https://github.com","https://raw.githubusercontent.com").replace("blob/","")).split("/");o.mainUrl="https://raw.githubusercontent.com/"+n[3]+"/"+n[4]+"/master/",o.$dialog.find(".title").html(e),o.$divReadme.empty(),o.fillDiv(t)}o.$dialog.find(".dialog-system-buttons .btn-cancel").off("click").on("click",function(e){e.stopPropagation(),e.preventDefault(),localStorage.removeItem("original-md-url"),o.main.navigate()})}},this.fillDiv=function(i){$.get(i,function(e){var t=i.replace("https://raw.githubusercontent.com","https://github.com").replace("/master/","/blob/master/");o.$dialog.find(".dialog-system-buttons .btn-open-org").attr("href",t);var n=function(e,t){var n={logo:"",readme:[],changeLog:[],license:[]},i=e.trim().split(/\r\n|\n/);i[2].match(/^#\sio/)&&i.splice(2,1),i[1].match(/^#\sio/)&&i.splice(1,1),i[0].match(/!\[[-_\w\d]*]\([-._\w\d\/]+\.png\)/)&&(n.logo=t+i[0].match(/\((.+)\)/)[1],i.splice(0,1));for(var a="readme",s=0;s<i.length;)i[s].match(/^====/)||(i[s].match(/^###?\s+Changelog/)?a="changeLog":i[s].match(/^###?\s+License/)?a="license":(n[a].length||i[s])&&n[a].push(i[s])),s++;return n.logo?o.$divLogo.html('<img src="'+n.logo+'" />').show():o.$divLogo.html("").hide(),c(n.readme),c(n.changeLog),c(n.license),n.readme.length?n.readme=r(n.readme.join("\n"),t):n.readme="",n.changeLog.length?n.changeLog=r(n.changeLog.join("\n"),t):delete n.changeLog,n.license.length?(n.license[0]="## "+n.license[0],n.license=r(n.license.join("\n"),t)):delete n.license,n}(e,i.substring(0,i.lastIndexOf("/")+1));o.$divReadme.html(n.readme),n.changeLog?(o.$divChangeLog.html(n.changeLog),o.$tabs.find(".tab-changelog").show()):(o.$divChangeLog.html(""),o.$tabs.find(".tab-changelog").hide()),n.license?(o.$divLicense.html(n.license),o.$tabs.find(".tab-license").show()):(o.$divLicense.html(""),o.$tabs.find(".tab-license").hide())}).done(function(){o.$divReadme.on("click",".md-link",function(e){e.stopPropagation(),e.preventDefault(),o.fillDiv($(this).data("url"))}),o.$divReadme.on("click",".goto-link",function(e){e.stopPropagation(),e.preventDefault();var t=$($(this).data("goto"));t.length&&o.$divReadme.animate({scrollTop:o.$divReadme.scrollTop()-o.$divReadme.offset().top+t.offset().top},2e3)})})},this.destroy=function(){this.inited&&(localStorage.removeItem("original-md-url"),this.inited=!1)}}function initMap(){gMain.dialogs.system.mapLoaded=!0,gMain.dialogs.system.updateMap(!0)}function System(s){var a,o,r,c,l=this;this.$dialog=$("#dialog-system"),this.main=s,this.systemRepos=null,this.systemCerts=null;var d=!(this.mapLoaded=!1);function u(e,t){if(t.length<700&&(-1!==t.indexOf("/")||-1!==t.indexOf("\\")))return t;if(t.length<"-----BEGIN CERTIFICATE-----==-----END CERTIFICATE-----".length)return h(_('Invalid certificate "%s". To short.',e),!0),"";var n=[];if("-----BEGIN RSA PRIVATE KEY-----"===t.substring(0,"-----BEGIN RSA PRIVATE KEY-----".length)){if("-----END RSA PRIVATE KEY-----"!==t.substring(t.length-"-----END RSA PRIVATE KEY-----".length))return h(_('Certificate "%s" must end with "-----END RSA PRIVATE KEY-----".',e),!0),"";for(t=(t=(t=t.substring("-----BEGIN RSA PRIVATE KEY-----".length)).substring(0,t.length-"-----END RSA PRIVATE KEY-----".length)).replace(/\s/g,"");t.length;)n.push(t.substring(0,64)),t=t.substring(64);return"-----BEGIN RSA PRIVATE KEY-----\r\n"+n.join("\r\n")+"\r\n-----END RSA PRIVATE KEY-----\r\n"}if("-----BEGIN PRIVATE KEY-----"===t.substring(0,"-----BEGIN PRIVATE KEY-----".length)){if("-----END PRIVATE KEY-----"!==t.substring(t.length-"-----END PRIVATE KEY-----".length))return h(_('Certificate "%s" must end with "-----BEGIN PRIVATE KEY-----".',e),!0),"";for(t=(t=(t=t.substring("-----BEGIN PRIVATE KEY-----".length)).substring(0,t.length-"-----END PRIVATE KEY-----".length)).replace(/\s/g,"");t.length;)n.push(t.substring(0,64)),t=t.substring(64);return"-----BEGIN PRIVATE KEY-----\r\n"+n.join("\r\n")+"\r\n-----END PRIVATE KEY-----\r\n"}if("-----BEGIN CERTIFICATE-----"!==t.substring(0,"-----BEGIN CERTIFICATE-----".length))return h(_('Certificate "%s" must start with "-----BEGIN CERTIFICATE-----".',e),!0),"";if("-----END CERTIFICATE-----"!==t.substring(t.length-"-----END CERTIFICATE-----".length))return h(_('Certificate "%s" must end with "-----END CERTIFICATE-----".',e),!0),"";for(var i=t.split("-----END CERTIFICATE-----"),a=i.length-1;0<=a;a--)if(i[a].replace(/[\r\n|\r|\n]+/,"").trim()){for(t=(t=(t=i[a]).substring("-----BEGIN CERTIFICATE-----".length)).replace(/\s/g,""),n=[];t.length;)n.push(t.substring(0,64)),t=t.substring(64);i[a]="-----BEGIN CERTIFICATE-----\r\n"+n.join("\r\n")+"\r\n-----END CERTIFICATE-----\r\n"}else i.splice(a,1);return i.join("")}function m(e,t){for(var n,i=table2values("tab-system-certs"),a=[],s=0;s<i.length;s++)a.push(i[s].name);for(var o=e||_("New"),r=1;(n=-1!==a.indexOf(o+r))&&r++,n;);i.push({name:o+r,certificate:t||""}),values2table("tab-system-certs",i)}function g(){if(l.systemRepos&&l.systemRepos.native.repositories){var e=[];for(var t in l.systemRepos.native.repositories)if(l.systemRepos.native.repositories.hasOwnProperty(t)){var n=l.systemRepos.native.repositories[t];e.push({name:t,link:"object"==typeof n?n.link:n})}if(values2table("tab-system-repo",e,{onChange:function(e){l.$dialog.find(".btn-save").removeClass("disabled"),e&&"name"!==e||function(){var e=l.$dialog.find("#system_activeRepo"),t=e.val(),n=!1;e.html("");for(var i=table2values("tab-system-repo"),a=0;a<i.length;a++)e.append('<option value="'+i[a].name+'">'+i[a].name+"</option>"),t===i[a].name&&(n=!0);n&&e.val(t);e.select()}()}}),l.systemRepos.nonEdit&&l.systemRepos.nonEdit.native&&l.systemRepos.nonEdit.native.repositories){var i=l.$dialog.find("#grid-repos");i.find("input").each(function(){$(this).prop("disabled",!0).addClass("disabled")}),i.find("select").each(function(){$(this).prop("disabled",!0).addClass("disabled")}),i.find(".btn-floating").each(function(){$(this).addClass("disabled")}),l.$dialog.find("#tab-system-repo .table-button-add").addClass("disabled")}}else l.$dialog.find("#tab-system-repo").html(_("permissionError"))}function h(e,t,n){l.main.showToast(l.$dialog.find("#tab-system-certs"),e,null,n,t)}function f(){var n=l.main.systemConfig.common,i=!1,a=!1;!function(){l.main.systemConfig.common.defaultNewAcl=l.main.systemConfig.common.defaultNewAcl||{};var e=l.main.systemConfig.common.defaultNewAcl,t=JSON.stringify(e);e.object=0,e.object|=l.$dialog.find("#tab-system-acl-obj-owner-read").prop("checked")?1024:0,e.object|=l.$dialog.find("#tab-system-acl-obj-owner-write").prop("checked")?512:0,e.object|=l.$dialog.find("#tab-system-acl-obj-group-read").prop("checked")?64:0,e.object|=l.$dialog.find("#tab-system-acl-obj-group-write").prop("checked")?32:0,e.object|=l.$dialog.find("#tab-system-acl-obj-every-read").prop("checked")?4:0,e.object|=l.$dialog.find("#tab-system-acl-obj-every-write").prop("checked")?2:0,e.owner=l.$dialog.find("#tab-system-acl-owner").val(),e.ownerGroup=l.$dialog.find("#tab-system-acl-group").val(),e.state=0,e.state|=l.$dialog.find("#tab-system-acl-state-owner-read").prop("checked")?1024:0,e.state|=l.$dialog.find("#tab-system-acl-state-owner-write").prop("checked")?512:0,e.state|=l.$dialog.find("#tab-system-acl-state-group-read").prop("checked")?64:0,e.state|=l.$dialog.find("#tab-system-acl-state-group-write").prop("checked")?32:0,e.state|=l.$dialog.find("#tab-system-acl-state-every-read").prop("checked")?4:0,e.state|=l.$dialog.find("#tab-system-acl-state-every-write").prop("checked")?2:0,e.file=0,e.file|=l.$dialog.find("#tab-system-acl-file-owner-read").prop("checked")?1024:0,e.file|=l.$dialog.find("#tab-system-acl-file-owner-write").prop("checked")?512:0,e.file|=l.$dialog.find("#tab-system-acl-file-group-read").prop("checked")?64:0,e.file|=l.$dialog.find("#tab-system-acl-file-group-write").prop("checked")?32:0,e.file|=l.$dialog.find("#tab-system-acl-file-every-read").prop("checked")?4:0,e.file|=l.$dialog.find("#tab-system-acl-file-every-write").prop("checked")?2:0,JSON.stringify(e)}(),l.$dialog.find(".system-settings.value").each(function(){var e=$(this),t=e.attr("id");t&&(t=t.substring("system_".length),"checkbox"===e.attr("type")?n[t]=e.prop("checked"):("language"===t&&n.language!==e.val()&&(i=!0),"activeRepo"===t&&n.activeRepo!==e.val()&&(a=!0),n[t]=e.val(),"isFloatComma"===t&&(n[t]="true"===n[t]||!0===n[t])))});var e={};if(l.systemRepos){for(var t in l.systemRepos.native.repositories)l.systemRepos.native.repositories.hasOwnProperty(t)&&"object"==typeof l.systemRepos.native.repositories[t]&&l.systemRepos.native.repositories[t].json&&(e[l.systemRepos.native.repositories[t].link]=l.systemRepos.native.repositories[t].json);l.systemRepos.native.repositories={}}var s=table2values("tab-system-repo");if(l.systemRepos){for(var o=null,r=0;r<s.length;r++)l.systemRepos.native.repositories[s[r].name]={link:s[r].link,json:null},e[s[r].link]&&(l.systemRepos.native.repositories[s[r].name].json=e[s[r].link]),o||(o=s[r].name);o?l.systemRepos.native.repositories[n.activeRepo]||(a=!0,n.activeRepo=o):n.activeRepo&&(a=!0,n.activeRepo="")}if(n.diag=l.$dialog.find("#diagMode").val(),l.systemCerts){l.systemCerts.native.certificates={},s=table2values("tab-system-certs");for(var c=0;c<s.length;c++)l.systemCerts.native.certificates[s[c].name]=u(s[c].name,s[c].certificate);l.$dialog.find(".system-le-settings.value").each(function(){var e=$(this),t=e.data("name");"checkbox"===e.attr("type")?l.systemCerts.native.letsEncrypt[t]=e.prop("checked"):l.systemCerts.native.letsEncrypt[t]=e.val()})}l.$dialog.find(".btn-save").addClass("disabled"),l.main.socket.emit("extendObject","system.config",{common:n},function(e){e?l.main.showError(e):l.main.socket.emit("extendObject","system.repositories",l.systemRepos,function(){l.main.socket.emit("extendObject","system.certificates",l.systemCerts,function(){i?window.location.reload():(l.main.navigate(),a&&setTimeout(function(){l.main.tabs.adapters.init(!0)},0))})})})}function p(e){"tab-system-main"===e&&l.updateMap(),("tab-system-letsencrypt"===e||"tab-system-main"===e||"tab-system-acl"===e)&&window.M&&window.M.toast?(M.updateTextFields("#"+e),l.$dialog.find("optgroup").each(function(){if(!$(this).data("lang")){var e=$(this).attr("label");$(this).data("lang",e),$(this).attr("label",_(e))}}),l.$dialog.find("select").select()):"tab-system-certs"===e&&h(_("Drop the files here"))}this.updateMap=function(e){if(d){if("undefined"==typeof ol)return setTimeout(l.updateMap,200);var t=ol.proj.fromLonLat([parseFloat(r),parseFloat(c)]);l.OSM||(l.OSM={},l.OSM.markerSource=new ol.source.Vector,l.OSM.markerStyle=new ol.style.Style({image:new ol.style.Icon({anchor:[.5,49],anchorXUnits:"fraction",anchorYUnits:"pixels",opacity:.75,src:"img/pin.png"})}),l.OSM.oMap=new ol.Map({target:"map",layers:[new ol.layer.Tile({source:new ol.source.OSM}),new ol.layer.Vector({source:l.OSM.markerSource,style:l.OSM.markerStyle})],view:new ol.View({center:t,zoom:17})}),l.OSM.marker=new ol.Feature({geometry:new ol.geom.Point(t),name:_("Your home")}),l.OSM.markerSource.addFeature(l.OSM.marker),l.OSM.oMap.on("singleclick",function(e){var t=ol.proj.toLonLat(e.coordinate);r=t[0],l.$dialog.find("#system_longitude").val(t[0]),c=t[1],l.$dialog.find("#system_latitude").val(t[1]).trigger("change")}));var n=l.OSM.oMap.getView().getZoom();l.OSM.marker.setGeometry(new ol.geom.Point(t)),l.OSM.oMap.setView(new ol.View({center:t,zoom:n}))}else{if(!this.mapLoaded)return;if(!e)return clearTimeout(a),void(a=setTimeout(function(){l.updateMap(!0)},1e3));if(a&&(clearTimeout(a),a=null),c||r){var i=new google.maps.Map(l.$dialog.find(".map")[0],{zoom:14,center:{lat:parseFloat(c),lng:parseFloat(r)}});new google.maps.Marker({position:{lat:parseFloat(c),lng:parseFloat(r)},map:i,title:_("Your home")})}}},this.init=function(){var a;this.inited||(this.inited=!0,a=function(e){if(e)return console.error(e),void h(e,!0);var t=l.$dialog.find("#system_activeRepo");if(t.html(""),l.systemRepos&&l.systemRepos.native.repositories)for(var n in l.systemRepos.native.repositories)t.append('<option value="'+n+'">'+n+"</option>");else l.$dialog.find("#tab-system-repo").html(_("permissionError"));l.$dialog.find("#diagMode").val(l.main.systemConfig.common.diag).on("change",function(){l.main.socket.emit("sendToHost",l.main.currentHost,"getDiagData",$(this).val(),function(e){l.$dialog.find("#diagSample").html(JSON.stringify(e,null,2))})}).trigger("change");var i=l.$dialog.find("#system_defaultHistory");i.html('<option value=""></option>');for(var a=0;a<l.main.instances.length;a++)"storage"===s.objects[s.instances[a]].common.type&&i.append('<option value="'+l.main.instances[a].substring("system.adapter.".length)+'">'+s.instances[a].substring("system.adapter.".length)+"</option>");r=l.main.systemConfig.common.longitude,c=l.main.systemConfig.common.latitude,o||(o=!0,d?(l.mapLoaded=!0,$.ajax({url:"lib/js/ol.js",dataType:"script",cache:!0}).done(function(){setTimeout(l.updateMap,500)}),$.ajax({url:"lib/css/ol.css",success:function(e){$("head").append("<style>"+e+"</style>")}})):$.ajax({url:"https://maps.googleapis.com/maps/api/js?key=AIzaSyCIrBRZfZAE_0C1OplAUy7OXhiWLoZc3eY&signed_in=true&callback=initMap",dataType:"script",cache:!0})),l.$dialog.find(".system-settings.value").each(function(){var e=$(this),t=e.attr("id");t&&(t=t.substring("system_".length),"checkbox"===e.attr("type")?e.prop("checked",l.main.systemConfig.common[t]):"isFloatComma"===t?e.val(l.main.systemConfig.common[t]?"true":"false"):e.val(l.main.systemConfig.common[t]),l.main.systemConfig.nonEdit&&l.main.systemConfig.nonEdit.common&&void 0!==l.main.systemConfig.nonEdit.common[t]&&(e.addClass("disabled"),e.prop("disabled",!0)))}),l.$dialog.find("#system_latitude").off("change").on("change",function(){c=$(this).val(),l.updateMap()}).off("keyup").on("keyup",function(){$(this).trigger("change")}),l.$dialog.find("#system_longitude").off("change").on("change",function(){r=$(this).val(),l.updateMap()}).off("keyup").on("keyup",function(){$(this).trigger("change")}),l.systemCerts.native.letsEncrypt||(l.systemCerts.native.letsEncrypt={path:"letsencrypt"}),l.$dialog.find(".system-le-settings.value").each(function(){var e=$(this),t=e.data("name");l.systemCerts&&l.systemCerts.native.letsEncrypt&&("checkbox"===e.attr("type")?e.prop("checked",l.systemCerts.native.letsEncrypt[t]):e.val(l.systemCerts.native.letsEncrypt[t])),l.systemCerts.nonEdit&&l.systemCerts.nonEdit.native&&l.systemCerts.nonEdit.native.letsEncrypt&&void 0!==l.systemCerts.nonEdit.native.letsEncrypt[t]&&(e.addClass("disabled"),e.prop("disabled",!0))}),l.$dialog.find("#tabs-system").find(".tabs").mtabs({onShow:function(e){e&&p($(e).attr("id"))}}),l.$dialog.find(".dialog-system-buttons .btn-save").off("click").on("click",f),l.$dialog.find(".dialog-system-buttons .btn-cancel").off("click").on("click",function(){l.main.navigate()}),g(),function(){l.main.systemConfig.common.defaultNewAcl=l.main.systemConfig.common.defaultNewAcl||{};for(var e,t=l.main.systemConfig.common.defaultNewAcl,n="",i=0;i<l.main.tabs.users.list.length;i++)e=translateName(l.main.objects[l.main.tabs.users.list[i]].common.name),n+='<option value="'+l.main.tabs.users.list[i]+'">'+(e||l.main.tabs.users.list[i])+"</option>";for(l.$dialog.find("#tab-system-acl-owner").html(n).val(t.owner||"system.user.admin"),n="",i=0;i<l.main.tabs.users.groups.length;i++)e=translateName(l.main.objects[l.main.tabs.users.groups[i]].common.name),n+='<option value="'+l.main.tabs.users.groups[i]+'">'+(e||l.main.tabs.users.groups[i])+"</option>";l.$dialog.find("#tab-system-acl-group").html(n).val(t.ownerGroup||"system.group.administrator"),void 0===t.object&&(t.object=1636),l.$dialog.find("#tab-system-acl-obj-owner-read").prop("checked",1024&t.object),l.$dialog.find("#tab-system-acl-obj-owner-write").prop("checked",512&t.object),l.$dialog.find("#tab-system-acl-obj-group-read").prop("checked",64&t.object),l.$dialog.find("#tab-system-acl-obj-group-write").prop("checked",32&t.object),l.$dialog.find("#tab-system-acl-obj-every-read").prop("checked",4&t.object),l.$dialog.find("#tab-system-acl-obj-every-write").prop("checked",2&t.object),void 0===t.state&&(t.state=1636),l.$dialog.find("#tab-system-acl-state-owner-read").prop("checked",1024&t.state),l.$dialog.find("#tab-system-acl-state-owner-write").prop("checked",512&t.state),l.$dialog.find("#tab-system-acl-state-group-read").prop("checked",64&t.state),l.$dialog.find("#tab-system-acl-state-group-write").prop("checked",32&t.state),l.$dialog.find("#tab-system-acl-state-every-read").prop("checked",4&t.state),l.$dialog.find("#tab-system-acl-state-every-write").prop("checked",2&t.state),void 0===t.file&&(t.file=1636),l.$dialog.find("#tab-system-acl-file-owner-read").prop("checked",1024&t.file),l.$dialog.find("#tab-system-acl-file-owner-write").prop("checked",512&t.file),l.$dialog.find("#tab-system-acl-file-group-read").prop("checked",64&t.file),l.$dialog.find("#tab-system-acl-file-group-write").prop("checked",32&t.file),l.$dialog.find("#tab-system-acl-file-every-read").prop("checked",4&t.file),l.$dialog.find("#tab-system-acl-file-every-write").prop("checked",2&t.file),l.$dialog.find('input[type="checkbox"]+span').off("click").on("click",function(){var e=$(this).prev();e.prop("disabled")||e.prop("checked",!e.prop("checked")).trigger("change")})}(),function(){var e,t=l.$dialog.find("#tab-system-certs");if(l.systemCerts&&l.systemCerts.native.certificates){var n=[];for(var i in l.systemCerts.native.certificates)l.systemCerts.native.certificates.hasOwnProperty(i)&&n.push({name:i,certificate:(e=l.systemCerts.native.certificates[i],e.replace(/(?:\\[rn]|[\r\n]+)+/g,""))});if(values2table("tab-system-certs",n,{onChange:function(e){l.$dialog.find(".btn-save").removeClass("disabled")}}),l.systemCerts.nonEdit&&l.systemCerts.nonEdit.native&&l.systemCerts.nonEdit.native.certificates){var a=l.$dialog.find("#grid-certs");a.find("input").each(function(){$(this).prop("disabled",!0).addClass("disabled")}),a.find("select").each(function(){$(this).prop("disabled",!0).addClass("disabled")}),a.find(".btn-floating").each(function(){$(this).addClass("disabled")})}}else t.html(_("permissionError"));installFileUpload(t,1e4,function(e,t){if(e)h(e,!0);else{try{t=atob(t.split(",")[1])}catch(e){return void h(_("Cannot read file!"),!0)}if(-1!==(t=t.replace(/(\r\n|\n|\r)/gm,"")).indexOf("BEGIN RSA PRIVATE KEY"))m("private",t);else if(-1!==t.indexOf("BEGIN PRIVATE KEY"))m("private",t);else if(-1!==t.indexOf("BEGIN CERTIFICATE")){for(var n=t.split("-----END CERTIFICATE-----"),i=0,a=0;a<n.length;a++)n[a].replace(/[\r\n]+|\n|\r/,"").trim()&&i++;m(1<i?"chained":"public",t)}else h(_("Unknown file format!"),!0)}})}(),l.$dialog.find(".value").on("change",function(){l.$dialog.find(".btn-save").removeClass("disabled")}).on("keyup",function(){$(this).trigger("change")}),l.$dialog.find(".btn-save").addClass("disabled"),p("tab-system-main")},l.main.socket.emit("getObject","system.repositories",function(i,e){l.systemRepos=e,l.main.socket.emit("getObject","system.certificates",function(n,e){l.systemCerts=e,l.main.socket.emit("getObject","system.config",function(e,t){l.main.systemConfig=t,a(i||n||e)})})}))},this.destroy=function(){this.inited&&(this.inited=!1)},this.allStored=function(){return l.$dialog.find(".btn-save").hasClass("disabled")},this.prepare=function(){l.main.systemConfig.error?$("#button-system").hide():$("#button-system").off("click").on("click",function(){l.main.navigate({dialog:"system"})})}}function Users(e){var g=this;function c(t,n,i){var e;n=n||[];for(var a=0;a<g.groups.length;a++){var s,o=g.main.objects[g.groups[a]]&&g.main.objects[g.groups[a]].common&&g.main.objects[g.groups[a]].common.members;if(-1===n.indexOf(g.groups[a])&&o&&-1!==(s=o.indexOf(t)))return o.splice(s,1),e={common:{members:o}},void g.main.socket.emit("extendObject",g.groups[a],e,function(e){e?(u(e,!0,5e3),i&&i(e)):setTimeout(function(){c(t,n,i)},0)});if(-1!==n.indexOf(g.groups[a])&&(!o||-1===o.indexOf(t)))return(o=o||[]).push(t),e={common:{members:g.main.objects[g.groups[a]].common.members=o}},void g.main.socket.emit("extendObject",g.groups[a],e,function(e){e?(u(e,!0,5e3),i&&i(e)):setTimeout(function(){c(t,n,i)},0)})}i&&i()}function h(e,t,n){"boolean"==typeof t&&(n=t,t=3e3),g.main.showToast(g.$grid,e,null,t,n)}function u(e,t,n){"boolean"==typeof t&&(n=t,t=3e3),g.main.showToast(g.$grid.find("#tab-users-dialog-new"),e,null,t,n)}function f(e){return e?e[0].toUpperCase()+e.substring(1).toLowerCase():e}function p(e){g.main.objects[e]&&"user"===g.main.objects[e].type?g.main.objects[e].common&&g.main.objects[e].common.dontDelete?h(_("Object may not be deleted"),!0):function t(n,i){for(var e=0;e<g.groups.length;e++){var a=g.main.objects[g.groups[e]];if(a&&a.common&&a.common.members&&-1!==a.common.members.indexOf(n))return a.common.members.splice(a.common.members.indexOf(n),1),void g.main.socket.emit("extendObject",g.groups[e],{common:{members:a.common.members}},function(e){e?h(_("Cannot modify groups: %s",e),!0):setTimeout(function(){t(n,i)},0)})}i&&i()}(e,function(){g.main.socket.emit("delObject",e,function(e){e?h(_("User may not be deleted: %s",e),!0):h(_("User deleted"))})}):h(_("Invalid object: %s",e),!0)}function r(e,s,o){var r=g.$grid.find("#tab-users-dialog-new-password").val(),t=g.$grid.find("#tab-users-dialog-new-password-repeat").val();if("__pass_not_set__"!==r&&r!==t)return e.stopPropagation(),void u(_("Password and confirmation are not equal!"),!0);if(!r)return e.stopPropagation(),void u(_("Password cannot be empty!"),!0);if("system.user.admin"===s&&"admin"!==o.id)return e.stopPropagation(),void u(_('Cannot change name of "%s"',"admin"),!0);if(!o.id)return e.stopPropagation(),void u(_("ID may not be empty"),!0);if(s)if("system.user."+o.id!==s){if(g.main.objects["system.user."+o.id])return e.stopPropagation(),void u(_("User yet exists"),!0);g.main.socket.emit("getObject",s,function(e,t){if(e)h(_("Cannot change user: ")+e,!0);else{var n=o.id,i="system.user."+n;t.common.name=o.name,t.common.color=o.color,t.common.icon=o.icon,t.common.desc=o.desc,delete o.id;var a=function(e){for(var t=[],n=0;n<g.groups.length;n++)-1===t.indexOf(g.groups[n])&&g.main.objects[g.groups[n]].common.members&&-1!==g.main.objects[g.groups[n]].common.members.indexOf(e)&&t.push(g.groups[n]);return t}(s);g.main.socket.emit("delObject",s,function(e){e?h(_("Cannot rename user: ")+e,!0):c(s,[],function(){g.main.socket.emit("setObject",i,t,function(e){e?h(_("Cannot change group: ")+e,!0):c(i,a,function(){"__pass_not_set__"!==r?g.main.socket.emit("changePassword",n,r,function(e){e?h(_("Cannot set password: ")+_(e),!0):h(_("Updated"))}):h(_("Updated"))})})})})}})}else delete o.id,"__pass_not_set__"!==r?g.main.socket.emit("changePassword",s.replace("system.user.",""),r,function(e){e?h(_("Cannot set password: ")+_(e),!0):g.main.socket.emit("extendObject",s,{common:o},function(e,t){e?h(_("Cannot change group: ")+e,!0):h(_("Updated"))})}):g.main.socket.emit("extendObject",s,{common:o},function(e,t){e?h(_("Cannot change group: ")+e,!0):h(_("Updated"))});else{if(g.main.objects["system.user."+o.id])return e.stopPropagation(),void u(_("User yet exists"),!0);var n=o.id,i={_id:"system.user."+n,common:o,type:"user",native:{}};o.enabled=!0,delete o.id,g.main.socket.emit("setObject",i._id,i,function(e){e?h(_("Cannot add user: ")+e,!0):"__pass_not_set__"!==r?g.main.socket.emit("changePassword",n,r,function(e){e?h(_("Cannot set password: ")+_(e),!0):h(_("Created"))}):h(_("Created"))})}}function m(e,n){if("system.group.administrator"===e)for(var t in n={},g.aclGroups)if(g.aclGroups.hasOwnProperty(t)){n[t]={};for(var i=0;i<g.aclGroups[t].length;i++)n[t][g.aclGroups[t][i]]=!0}g.$grid.find(".edit-group-permissions").prop("disabled","system.group.administrator"===e).each(function(){var e=$(this).data("type"),t=$(this).data("operation");$(this).prop("checked",!!n[e]&&n[e][t])})}function b(e){var t=g.$grid.find("#tab-users-dialog-new-id"),n=t.val();n&&!n.match(/[.\s]/)?(e.find(".tab-dialog-create").removeClass("disabled"),t.removeClass("wrong")):(e.find(".tab-dialog-create").addClass("disabled"),t.addClass("wrong"))}function y(e){var i,a=!1,c=g.$grid.find("#tab-users-dialog-new"),l={name:"",icon:"",color:"",desc:"",id:"",acl:{}},s=!0===e?"system.group":"system.user",d="",o=!0===e;if(installFileUpload(c,5e4,function(e,t){if(e)h(e,!0);else{if(!t.match(/^data:image\//))return void h(_("Unsupported image format"),!0);b(c),l.icon=t,c.find(".tab-dialog-new-icon").show().html('<img class="treetable-icon" />'),c.find(".tab-dialog-new-icon .treetable-icon").attr("src",t),c.find(".tab-dialog-new-icon-clear").show()}}),"string"==typeof e&&(g.main.objects[e]&&g.main.objects[e].common&&(l.name=g.main.objects[e].common.name,l.icon=g.main.objects[e].common.icon,l.color=g.main.objects[e].common.color,l.desc=g.main.objects[e].common.desc,(o="group"===g.main.objects[e].type)&&(l.acl=g.main.objects[e].common.acl)),d=e,l.id=e),c.find(".tab-dialog-new-title").text(!0===e?_("Create new group"):l.id?_("Change"):_("Create new user")),l.id){var t=l.id.split(".");l.id=t.pop(),s=t.join(".")}c.find("#tab-users-dialog-new-name").val(translateName(l.name)).off("change").on("change",function(){var e=g.$grid.find("#tab-users-dialog-new-id"),t=e.val(),n=$(this).val();n=n.trim().replace(FORBIDDEN_CHARS,"_").replace(/\./g,"_").toLowerCase(),t&&a||!(o&&"administrator"!==t&&"user"!==t||!o&&"admin"!==t)||(e.val(n),i=n,c.find("#tab-users-dialog-new-preview").val(s+"."+(n||"#")),M.updateTextFields("#tab-users-dialog-new")),b(c)}).off("keyup").on("keyup",function(){$(this).trigger("change")}),c.find("#tab-users-dialog-new-desc").val(l.desc).off("change").on("change",function(){b(c)}).off("keyup").on("keyup",function(){$(this).trigger("change")}),i=l.id,c.find("#tab-users-dialog-new-id").val(l.id).off("change").on("change",function(){var e=$(this).val();i!==e&&(a=!0,i=e,c.find("#tab-users-dialog-new-preview").val(s+"."+(e||"#")),M.updateTextFields("#tab-users-dialog-new"),b(c))}).off("keyup").on("keyup",function(){$(this).trigger("change")}),c.find(".tab-dialog-create").addClass("disabled").off("click").text(_(d?"Change":"Create")).on("click",function(e){var n;l.name=c.find("#tab-users-dialog-new-name").val(),l.id=c.find("#tab-users-dialog-new-id").val(),l.desc=c.find("#tab-users-dialog-new-desc").val(),o?(n=l.acl,g.$grid.find(".edit-group-permissions").each(function(){var e=$(this).data("type"),t=$(this).data("operation");n[e]=n[e]||{},n[e][t]=$(this).prop("checked")}),function(i,a,s){if("system.group.administrator"===a&&"administrator"!==s.id)return i.stopPropagation(),u(_('Cannot change name of "%s"',"administrator"),!0);if("system.group.user"===a&&"user"!==s.id)return i.stopPropagation(),u(_('Cannot change name of "%s"',"user"),!0);if(!s.id)return i.stopPropagation(),u(_("ID may not be empty"),!0);if(a)if("system.group."+s.id!==a){if(g.main.objects["system.group."+s.id])return i.stopPropagation(),u(_("ID yet exists"),!0);g.main.socket.emit("getObject",a,function(e,t){if(e)h(_("Cannot change group: ")+e,!0);else{var n=s.id;t.common.name=s.name,t.common.color=s.color,t.common.icon=s.icon,t.common.desc=s.desc,delete s.id,g.main.socket.emit("delObject",a,function(e){e?(h(_("Cannot rename group: ")+e,!0),i.stopPropagation()):g.main.socket.emit("setObject",n,t,function(e){e?h(_("Cannot change group: ")+e,!0):h(_("Updated"))})})}})}else delete s.id,g.main.socket.emit("extendObject",a,{common:s},function(e,t){e?h(_("Cannot change group: ")+e,!0):h(_("Updated"))});else{if(!s.id)return i.stopPropagation(),u(_("ID may not be empty"),!0);g.main.socket.emit("addGroup",s.id,s.desc,null,function(e,t){e?h(_("Cannot create group: ")+e,!0):g.main.socket.emit("extendObject",t._id,{common:s},function(e){e?h(_("Cannot add group: ")+e,!0):h(_("Created"))})})}}(e,d,l)):(delete l.acl,r(e,d,l))}),c.find("#tab-users-dialog-new-preview").val(s+"."+(l.id||"#")),l.icon?(c.find(".tab-dialog-new-icon").show().html(g.main.getIcon(d)),c.find(".tab-dialog-new-icon-clear").show()):(c.find(".tab-dialog-new-icon").hide(),c.find(".tab-dialog-new-icon-clear").hide()),l.color=l.color||!1,l.color?c.find(".tab-dialog-new-color").val(l.color):c.find(".tab-dialog-new-color").val(),u(_("Drop the icons here")),c.find(".tab-dialog-new-upload").off("click").on("click",function(){c.find(".drop-file").trigger("click")}),c.find(".tab-dialog-new-icon-clear").off("click").on("click",function(){l.icon&&(l.icon="",c.find(".tab-dialog-new-icon").hide(),c.find(".tab-dialog-new-icon-clear").hide(),b(c))}),c.find(".tab-dialog-new-color-clear").off("click").on("click",function(){l.color&&(b(c),c.find(".tab-dialog-new-color-clear").hide(),c.find(".tab-dialog-new-colorpicker").colorpicker({component:".btn",color:l.color,container:c.find(".tab-dialog-new-colorpicker")}).colorpicker("setValue",""),l.color="")});var n=Date.now();try{c.find(".tab-dialog-new-colorpicker").colorpicker("destroy")}catch(e){}c.find(".tab-dialog-new-colorpicker").colorpicker({component:".btn",color:l.color,container:c.find(".tab-dialog-new-colorpicker")}).colorpicker("setValue",l.color).on("showPicker.colorpicker",function(){var e=c.find(".modal-content");e[0].scrollTop=e[0].scrollHeight}).on("changeColor.colorpicker",function(e){100<Date.now()-n&&(l.color=e.color.toHex(),b(c),c.find(".tab-users-dialog-new-icon-clear").show())}),c.find("#tab-users-dialog-new-password").off("change").on("change",function(){b(c)}),c.find("#tab-users-dialog-new-password-repeat").off("change").on("change",function(){b(c)}),l.color?c.find(".tab-dialog-new-color-clear").show():c.find(".tab-dialog-new-color-clear").hide(),o?(c.find(".tab-users-dialog-new-password").hide(),"system.group.administrator"===d||"system.group.user"===d?c.find("#tab-users-dialog-new-id").prop("disabled",!0):c.find("#tab-users-dialog-new-id").prop("disabled",!1)):(c.find(".tab-users-dialog-new-password").show(),d?(c.find("#tab-users-dialog-new-password").val("__pass_not_set__"),c.find("#tab-users-dialog-new-password-repeat").val("__pass_not_set__")):(c.find("#tab-users-dialog-new-password").val(""),c.find("#tab-users-dialog-new-password-repeat").val("")),"system.user.admin"===d?c.find("#tab-users-dialog-new-id").prop("disabled",!0):c.find("#tab-users-dialog-new-id").prop("disabled",!1)),o?(g.aclGroups?(m(d,l.acl),M.updateTextFields("#tab-users-dialog-new")):g.main.socket.emit("listPermissions",function(e){g.aclGroups={};var t=[];for(var n in e)e.hasOwnProperty(n)&&e[n]&&e[n].type&&(g.aclGroups[e[n].type]=g.aclGroups[e[n].type]||[],-1===g.aclGroups[e[n].type].indexOf(e[n].operation)&&g.aclGroups[e[n].type].push(e[n].operation),-1===t.indexOf(e[n].operation)&&t.push(e[n].operation));var i="<table><tr>";for(var a in i+="</tr>",g.aclGroups)if(g.aclGroups.hasOwnProperty(a)){i+='<tr class="group-titles"><td colspan="'+t.length+'">'+_(a+" permissions")+"</td></tr>",i+='<tr class="group-sub-titles">';for(var s=0;s<t.length;s++)-1!==g.aclGroups[a].indexOf(t[s])?i+="<td>"+t[s]+"</td>":i+="<td></td>";i+="</tr>",i+="<tr>";for(var o=0;o<t.length;o++)if(-1!==g.aclGroups[a].indexOf(t[o])){var r="acl_"+a+"_"+o;i+='<td><input id="'+r+'" data-type="'+a+'" data-operation="'+t[o]+'" class="edit-group-permissions filled-in" type="checkbox" checked="checked" /><span for="'+r+'"></span></td>'}else i+="<td></td>";i+="</tr>"}i+="</table>",c.find("#tab-users-dialog-new-rights").html(i),c.find('input[type="checkbox"]+span').off("click").on("click",function(){var e=$(this).prev();e.prop("disabled")||e.prop("checked",!e.prop("checked")).trigger("change")}),c.find('input[type="checkbox"]').off("change").on("change",function(){b(c)}),m(d,l.acl),M.updateTextFields("#tab-users-dialog-new")}),c.find("ul.tabs .tab-dialog-new-tabs").show()):(c.find("ul.tabs .tab-dialog-new-tabs").each(function(){$(this).find('a[href="#tab-users-dialog-new-rights"]').length&&$(this).hide()}),M.updateTextFields("#tab-users-dialog-new")),c.find("ul.tabs").mtabs(),g.main.noSelect||c.find("ul.tabs").mtabs("select","tab-users-dialog-new-main"),c.modal().modal("open")}function t(){g.list.sort(),g.groups.sort();var e="";e+='<ul class="collection">';for(var t=function(e,t){for(var n={},i=0;i<t.length;i++)if(e[t[i]]&&e[t[i]].common&&e[t[i]].common.members)for(var a=e[t[i]].common.members,s=0;s<a.length;s++)n[a[s]]=n[a[s]]||[],n[a[s]].push({id:t[i],name:e[t[i]].common.name||id.replace("system.group.","")});return n}(g.main.objects,g.groups),n=0;n<g.list.length;n++){var i,a;a=g.main.objects[g.list[n]]&&g.main.objects[g.list[n]].common?g.main.objects[g.list[n]].common:{},"system.user.admin"===g.list[n]&&(a.enabled=!0),i=a.name?translateName(a.name):f(g.list[n].replace(/^system\.user\./));var s="";if(t[g.list[n]])for(var o=t[g.list[n]],r=0;r<o.length;r++){var c=o[r].id,l=translateName(o[r].name);s+='<div class="chip">'+g.main.getIcon(c)+l+'<i class="close material-icons tab-users-remove-group" data-group="'+c+'" data-user="'+g.list[n]+'">close</i></div>'}var d="",u=!1;a.color&&(d="background: "+a.color+"; ",g.main.invertColor(a.color)&&(u=!0,d+="color: white;"));var m=a.desc;"object"==typeof m&&(m=m[systemLang]||m.en),e+='<li class="collection-item avatar users-type-draggable '+(u?"inverted":"")+'" data-tt-id="'+g.list[n]+'" style="'+d+'">',e+=" "+(g.main.getIcon(g.list[n],null,null,"icon")||'<img class="icon" src="img/account_circle.png"/>'),e+='<span class="title">'+i+"</span>",e+="<p>"+g.list[n]+((m?" ("+m+")":"")||"")+"</p>",e+=' <a class="secondary-content '+(a.dontDelete?"disabled":"tab-users-enabled-user")+'" data-user="'+g.list[n]+'"><i class="material-icons">'+(a.enabled?"check_box":"check_box_outline_blank")+"</i></a>",e+=' <a class="edit-content" data-user="'+g.list[n]+'"><i class="material-icons">edit</i></a>',e+=' <a class="delete-content'+(a.dontDelete?" disabled":"")+'" data-user="'+g.list[n]+'"><i class="material-icons">delete</i></a><br>',e+=s||"",e+="</li>"}e+="</ul>",g.$gridUsers.html(e),g.$grid.find("#tab-users-btn-new-user").on("click",function(){y(!1)}),g.$gridUsers.find(".tab-users-enabled-user").on("click",function(){var e=$(this).data("user");if("system.user.admin"===e)return h(_("Cannot disable admin!"),!0),!1;var t=$(this),n=g.main.objects[e]&&g.main.objects[e].common&&g.main.objects[e].common.enabled;n=!n,g.main.socket.emit("extendObject",e,{common:{enabled:n}},function(e){e?h(_("Cannot modify user!")+e,!0):(h(_("Updated")),t.find("i").text(n?"check_box":"check_box_outline_blank"))})}),g.$gridUsers.find(".delete-content").off("click").on("click",function(){var t=$(this).data("user");$(this).hasClass("disabled")||(g.main.objects[t]&&"user"===g.main.objects[t].type?g.main.confirmMessage(_("Are you sure to delete %s?",t),null,"help",function(e){e&&p(t)}):h(_('Object "<b>%s</b>" does not exists. Update the page.',t),!0))}),g.$gridUsers.find(".edit-content").on("click",function(){y($(this).data("user"))}),g.$gridUsers.find(".tab-users-remove-group").on("click",function(){var i=$(this).data("user"),e=$(this).data("group");g.main.socket.emit("getObject",e,function(e,t){if(t&&t.common&&t.common.members){var n=t.common.members.indexOf(i);-1!==n?(t.common.members.splice(n,1),g.main.socket.emit("setObject",t._id,t,function(e){e?h(_("Error: %s",e),!0):h(_("Removed"))})):h(_("%s is not in the list"),!0)}})})}function n(){var e="";e+='<ul class="collection">';for(var t=0;t<g.groups.length;t++){var n,i;n=(i=g.main.objects[g.groups[t]]&&g.main.objects[g.groups[t]].common?g.main.objects[g.groups[t]].common:{}).name?translateName(i.name):f(g.groups[t].replace(/^system\.group\./));var a="";if(i.members&&i.members.length)for(var s=i.members,o=0;o<s.length;o++){var r,c=s[o];r=g.main.objects[c]&&g.main.objects[c].common&&g.main.objects[c].common.name?translateName(g.main.objects[c].common.name):f(c.replace(/^system\.user\./)),a+='<div class="chip">'+g.main.getIcon(c)+r+'<i class="close material-icons tab-users-remove-user" data-group="'+g.groups[t]+'" data-user="'+c+'">close</i></div>'}var l="",d=!1;i.color&&(l="background: "+i.color+"; ",g.main.invertColor(i.color)&&(d=!0,l+="color: white;"));var u=i.desc;"object"==typeof u&&(u=u[systemLang]||u.en),e+='<li class="collection-item avatar '+(d?"inverted":"")+'" data-tt-id="'+g.groups[t]+'" style="'+l+'">',e+=" "+(g.main.getIcon(g.groups[t],null,null,"icon")||'<img class="icon" src="img/group.png"/>'),e+=' <span class="title">'+n+"</span>",e+=" <p>"+g.groups[t]+((u?" ("+u+")":"")||"")+"</p>",e+=' <a class="edit-content" data-group="'+g.groups[t]+'"><i class="material-icons">edit</i></a>',e+=' <a class="delete-content'+(i.dontDelete?" disabled":"")+'" data-group="'+g.groups[t]+'"><i class="material-icons">delete</i></a><br>',e+=a||"",e+="</li>"}e+="</ul>",g.$gridGroups.html(e),g.$grid.find("#tab-users-btn-new-group").on("click",function(){y(!0)}),g.$gridGroups.find(".delete-content").on("click",function(){var n=$(this).data("group");$(this).hasClass("disabled")||(g.main.objects[n]&&"group"===g.main.objects[n].type?g.main.confirmMessage(_("Are you sure to delete %s?",n),null,"help",function(e){var t;e&&(t=n,g.main.objects[t]&&"group"===g.main.objects[t].type?g.main.objects[t].common&&g.main.objects[t].common.dontDelete?h(_("Object may not be deleted"),!0):g.main.socket.emit("delObject",t,function(e){e?h(_("Group may not be deleted: %s",e),!0):h(_("Group deleted"))}):h(_("Invalid object: %s",t),!0))}):h(_('Object "<b>%s</b>" does not exists. Update the page.',n),!0))}),g.$gridGroups.find(".edit-content").on("click",function(){y($(this).data("group"))}),g.$gridGroups.find(".tab-users-remove-user").on("click",function(){var i=$(this).data("user"),e=$(this).data("group");g.main.socket.emit("getObject",e,function(e,t){if(t&&t.common&&t.common.members){var n=t.common.members.indexOf(i);if(-1!==n){if(t.common.members.splice(n,1),!t._id)return void console.error("INVLAID ID");g.main.socket.emit("setObject",t._id,t,function(e){e?h(_("Error: %s",e),!0):h(_("Removed"))})}else h(_("%s is not in the list"),!0)}})})}this.groups=[],this.list=[],this.$grid=$("#tab-users"),this.$gridUsers=this.$grid.find(".tab-users-list-users .tab-users-body"),this.$gridGroups=this.$grid.find(".tab-users-list-groups .tab-users-body"),this.main=e,this.aclGroups=null,this.prepare=function(){},this._postInit=function(){var e;t(),g.$gridUsers.find("ul").sortable({connectWith:"#tab-users .tab-users-list-groups .treetable",items:".users-type-draggable",appendTo:g.$gridUsers,refreshPositions:!0,helper:function(e,t){return $('<div class="users-drag-helper">'+t.find(".treetable-icon-empty+span").text()+"</div>")},zIndex:999990,revert:!1,scroll:!1,start:function(e,t){var n=t.item.prev();t.item.data("prev",n),g.$grid.addClass("dragging")},stop:function(e,t){g.$grid.removeClass("dragging")},update:function(e,t){var n=t.item.data("prev");n&&n.length?$(n).after(t.item):$(this).prepend(t.item)}}).disableSelection(),n(),(e=g.$gridGroups.find("ul>li")).droppable("instance")&&e.droppable("destroy"),e.droppable({accept:".users-type-draggable",over:function(e,t){if($(this).addClass("tab-accept-item"),$(this).hasClass("not-empty")&&!$(this).hasClass("expanded")){var n,i=$(this).data("tt-id");(n=$(this).data("timer"))&&clearTimeout(n),$(this).data("timer",setTimeout(function(){g.$gridGroups.treeTable("expand",i)},1e3))}},out:function(e,t){var n;$(this).removeClass("tab-accept-item"),(n=$(this).data("timer"))&&(clearTimeout(n),$(this).data("timer",null))},tolerance:"pointer",drop:function(e,t){$(this).removeClass("tab-accept-item");var n=t.draggable.data("tt-id"),i=$(this).data("tt-id");g.main.socket.emit("getObject",i,function(e,t){t&&t.common&&(t.common.members=t.common.members||[],-1===t.common.members.indexOf(n)?(t.common.members.push(n),t.common.members.sort(),g.main.socket.emit("setObject",t._id,t,function(e){e?h(_("Error: %s",e),!0):h(_("%s added to %s",n,t._id))})):h(_("Is yet in the list")))})}})},this.init=function(e){this.inited&&!e||(void 0!==this.$gridUsers&&this._postInit(),this.inited||(h(_("You can drag&drop users to groups"),5e3),this.inited=!0,this.main.subscribeObjects("system.user.*"),this.main.subscribeObjects("system.group.*")))},this.destroy=function(){this.inited&&(this.inited=!1,this.main.unsubscribeObjects("system.user.*"),this.main.unsubscribeObjects("system.group.*"))},this.objectChange=function(e,t,n){if(e.match(/^system\.user\./)){if(t)-1===this.list.indexOf(e)&&this.list.push(e);else{var i=this.list.indexOf(e);-1!==i&&this.list.splice(i,1)}this.timer&&clearTimeout(this.timer),this.timer=setTimeout(function(){g.timer=null,g._postInit()},200)}else if(e.match(/^system\.group\./)){if(t)-1===this.groups.indexOf(e)&&this.groups.push(e);else{var a=this.groups.indexOf(e);-1!==a&&this.groups.splice(a,1)}this.timer&&clearTimeout(this.timer),this.timer=setTimeout(function(){g.timer=null,g._postInit()},200)}}}!function(C){C(document).ready(function(){var e=location.pathname+"socket.io";location.pathname.match(/^\/admin\//)&&(e="/socket.io");var s,y={},v={objects:{},states:{},currentHost:"",currentTab:null,currentDialog:null,currentUser:"",subscribesStates:{},subscribesObjects:{},subscribesLogs:0,socket:io.connect("/",{path:e}),systemConfig:null,instances:null,objectsLoaded:!1,waitForRestart:!1,tabs:null,dialogs:{},selectId:null,config:{},ignoreJSupdate:!1,addEventMessage:function(e,t,n,i){g.events.add(e,t,n,i)},saveConfig:function(e,t){e&&(v.config[e]=t),"undefined"!=typeof storage&&storage.set("adminConfig",JSON.stringify(v.config))},saveTabs:function(){this.socket.emit("setObject","system.config",this.systemConfig,function(e){e&&this.showError(e)})},upToDate:function(e,t){return e=e.split("."),t=t.split("."),e[0]=parseInt(e[0],10),t[0]=parseInt(t[0],10),!(e[0]>t[0])&&(e[0]!==t[0]||(e[1]=parseInt(e[1],10),t[1]=parseInt(t[1],10),!(e[1]>t[1])&&(e[1]!==t[1]||(e[2]=parseInt(e[2],10),t[2]=parseInt(t[2],10),e[2]<=t[2]))))},cmdExec:function(e,t,n){e=e||v.currentHost,c.val(""),l.modal("open"),s="$ ./yunkong2 "+t,l.data("finished",!1).find(".btn").html(_("In background")),l.find(".command").html(s),l.find(".progress-dont-close").removeClass("disabled"),p.find(".button-command").removeClass("error").addClass("in-progress"),l.data("max",null),l.data("error",""),h.addClass("indeterminate").removeClass("determinate"),t.match(/^upload /)?l.find(".progress-text").html(_("Upload started...")).removeClass("error"):t.match(/^del [-_\w\d]+\.[\d]+$/)?l.find(".progress-text").html(_("Removing of instance...")).removeClass("error"):t.match(/^del /)?l.find(".progress-text").html(_("Removing of adapter...")).removeClass("error"):t.match(/^url /)?l.find(".progress-text").html(_("Install or update from URL...")).removeClass("error"):t.match(/^add /)?l.find(".progress-text").html(_("Add instance...")).removeClass("error"):l.find(".progress-text").html(_("Started...")).removeClass("error"),c.val(s),r=Math.floor(268435454*Math.random())+1,o=n,v.socket.emit("cmdExec",e,r,t,function(e){e?(s+="\n"+_(e),c.val(s),o=null,n(e)):n&&n()})},confirmMessage:function(e,t,n,i,a){if("function"==typeof i)a=i,m.find(".modal-footer").html('<a class="modal-action modal-close waves-effect waves-green btn-flat translate" data-result="true">'+_("Ok")+'</a><a class="modal-action modal-close waves-effect waves-green btn-flat translate">'+_("Cancel")+"</a>"),m.find(".modal-footer .modal-action").on("click",function(){var e=m.data("callback");e&&e(C(this).data("result"))});else if("object"==typeof i){for(var s="",o=i.length-1;0<=o;o--)s+='<a class="modal-action modal-close waves-effect waves-green btn-flat translate" data-id="'+o+'">'+i[o]+"</a>";m.find(".modal-footer").html(s),m.find(".modal-footer .modal-action").on("click",function(){var e=m.data("callback");e&&e(C(this).data("id"))})}m.find(".dialog-title").text(t||_("Please confirm")),n?m.find(".dialog-icon").show().html(n):m.find(".dialog-icon").hide(),m.find(".dialog-text").html(e),m.data("callback",a),m.modal("open")},showMessage:function(e,t,n){u.find(".dialog-title").text(t||_("Message")),n?u.find(".dialog-icon").show().html(n):u.find(".dialog-icon").hide(),u.find(".dialog-text").html(e),u.modal("open")},showError:function(e){v.showMessage(_(e),_("Error"),"error_outline")},showToast:function(e,t,n,i,a,s){e&&e instanceof jQuery&&(e=e[0]),"string"==typeof(s=s||[])&&(s=[s]),a&&s.push("dropZone-error"),M.toast({parentSelector:e||C("body")[0],html:t+(n?'<i class="material-icons">'+n+"</i>":""),displayLength:i||3e3,classes:s})},formatDate:function(e,t){if(!e)return"";var n,i=typeof e;return"string"===i?t?e.substring(8):e:("object"!==i&&(e=e<9466812e5?new Date(1e3*e):new Date(e)),t?i=(n=e.getDate())<10?"0"+n:n:(i=e.getFullYear(),i+=(n=e.getMonth()+1)<10?"-0"+n:"-"+n,i+=(n=e.getDate())<10?"-0"+n:"-"+n),i+=(n=e.getHours())<10?" 0"+n:" "+n,i+=(n=e.getMinutes())<10?":0"+n:":"+n,i+=(n=e.getSeconds())<10?":0"+n:":"+n,i+=(n=e.getMilliseconds())<10?".00"+n:n<100?".0"+n:"."+n)},updateWizard:function(){var e=C("#button-wizard");v.objects["system.adapter.discovery.0"]?(e.data("inited")||(e.data("inited",!0),e.on("click",function(){v.navigate({tab:"instances",dialog:"config",params:"system.adapter.discovery.0"})}).attr("title",_("Device discovery"))),e.show(),!v.systemConfig.common.wizard&&v.systemConfig.common.licenseConfirmed&&e.trigger("click")):e.hide()},getUser:function(){if(v.currentUser){if(v.objects[v.currentUser]){var e=v.objects[v.currentUser],t="";if(t=e&&e.common&&e.common.name?translateName(e.common.name):(t=v.currentUser.replace(/^system\.user\./))[0].toUpperCase()+t.substring(1).toLowerCase(),e&&e.common&&e.common.icon){var n={};n[v.currentUser]=e,C("#current-user-icon").html(v.getIcon(v.currentUser,null,n))}else C("#current-user-icon").html('<i class="large material-icons">account_circle</i>');C("#current-user").html(t);for(var i=[],a=0;a<g.users.groups.length;a++){var s=v.objects[g.users.groups[a]];s&&s.common&&s.common.members&&-1!==s.common.members.indexOf(v.currentUser)&&i.push(_(translateName(s.common.name)))}C("#current-group").html(i.join(", "))}}else v.socket.emit("authEnabled",function(e,t){v.currentUser="system.user."+t,e?(v._lastTimer=(new Date).getTime(),function e(){if(v._timer)return;var t=(new Date).getTime();3e4<t-v._lastTimer?location.reload():v._lastTimer=t;v._timer=setTimeout(function(){v._timer=null,e()},1e4)}()):C("#button-logout").remove()})},_delObject:function(e,i){var a;if(!Array.isArray(e)){if("string"!=typeof e)return i&&i("invalid idOrList parameter");e=[e]}!function t(){if(0===e.length)return i&&setTimeout(i,0,null,a);if(a=e.pop(),v.objects[a]&&v.objects[a].common&&(v.objects[a].common["object-non-deletable"]||v.objects[a].common.dontDelete))v.showMessage(_('Cannot delete "%s" because not allowed',a),"","notifications"),setTimeout(t,0);else{var n=v.objects[a];v.socket.emit("delObject",a,function(e){if(e&&"Not exists"!==e)return v.showError(e),i(e);n&&"state"===n.type?v.socket.emit("delState",a,function(e){if(e&&"Not exists"!==e)return v.showError(e),i(e);setTimeout(t,0)}):setTimeout(t,0)})}}()},_delObjects:function(e,t,n){if(t){var i=[];for(var a in v.objects)v.objects.hasOwnProperty(a)&&a.substring(0,e.length+1)===e+"."&&i.push(a);i.push(e),i.sort(),this._delObject(i,function(){n&&n()})}else this._delObject(e,n)},delObject:function(e,t,n){var i=e?e.selectId("getTreeInfo",t):null;v.objects[t]?i&&i.children?v.confirmMessage(_('Do you want to delete just <span style="color: blue">one object</span> or <span style="color: red">all</span> children of %s too?',t),null,"help_outline",[_("_All"),_("Only one"),_("Cancel")],function(e){0===e?v._delObjects(t,!0,n):1===e&&v._delObjects(t,!1,n)}):v.confirmMessage(_("Are you sure to delete %s?",t),null,"help_outline",function(e){e&&v._delObjects(t,!0,n)}):i&&i.children?v.confirmMessage(_("Are you sure to delete all children of %s?",t),null,"help_outline",function(e){e&&v._delObjects(t,!0,n)}):v.showMessage(_('Object "<b>%s</b>" does not exists. Update the page.',t),_("Error"),"help_outline",function(e){e&&v._delObjects(t,!0,n)})}},g={hosts:new Hosts(gMain=v),objects:new Objects(v),adapters:new Adapters(v),instances:new Instances(v),users:new Users(v),enums:new Enums(v),events:new Events(v),logs:new Logs(v),states:null,intro:new Intro(v)};"undefined"!=typeof States&&(g.states=new States(v)),v.instances=g.instances.list,v.tabs=g,v.dialogs={system:new System(v),customs:new Customs(v),config:new Config(v),editobject:new EditObject(v),issue:new Issue(v),readme:new Readme(v)};var o=null,r=null,c=C("#stdout"),l=C("#dialog-command"),d=C("#dialog-license-main"),u=C("#dialog-message"),m=C("#dialog-confirm"),h=l.find(".progress div"),f=C("#admin_sidemenu_menu"),p=C("#admin_sidemenu_main"),t=!0;if("ontouchstart"in window||navigator.maxTouchPoints||C("body").addClass("desktop-screen"),-1!==navigator.userAgent.indexOf("Safari")&&-1===navigator.userAgent.indexOf("Chrome")&&-1===navigator.userAgent.indexOf("Android")?(C("body").addClass("safari"),v.browser="safari",v.noSelect=!0):detectIE()&&(C("body").addClass("ie"),v.browser="ie",v.browserVersion=detectIE(),v.noSelect=!0,C("#host-adapters-btn").css("margin-top","10px")),"undefined"!=typeof storage)try{v.config=storage.get("adminConfig"),v.config?v.config=JSON.parse(v.config):v.config={}}catch(e){console.log("Cannot load edit config"),v.config={}}function b(e){C("#admin_sidemenu_dialog").html(""),C("html").off("click",b)}function w(){if(function(){var e="",i=[];C(".admin-tab").each(function(){var e=C(this).attr("id");v.systemConfig.common.tabs&&-1===v.systemConfig.common.tabs.indexOf(e)||i.push({line:'<li class="admin-sidemenu-items" data-tab="'+e+'"><a href="#'+e+'">'+(L[e]&&L[e].icon?'<i class="material-icons left">'+L[e].icon+"</i>":'<i class="material-icons left">live_help</i>')+_(C(this).data("name"))+"</a></li>",id:e})}),C(".tab-custom").each(function(){var e=C(this).attr("id");if(!v.systemConfig.common.tabs||-1!==v.systemConfig.common.tabs.indexOf(e)){var t;if(L[e]&&L[e].icon)t=L[e].icon;else{var n="system.adapter."+e.substring(4);v.objects[n]&&v.objects[n].adminTab&&v.objects[n]["fa-icon"]&&(t=v.objects[n]["fa-icon"])}i.push({line:'<li class="admin-sidemenu-items" data-tab="'+e+'"><a href="#'+e+'">'+(t?'<i class="material-icons left">'+t+"</i>":'<i class="material-icons left">live_help</i>')+C(this).data("name")+"</a></li>",id:e})}}),i.sort(function(e,t){return L[e.id]||L[t.id]?L[e.id]?L[t.id]?L[e.id].order<L[t.id].order?-1:L[e.id].order>L[t.id].order?1:0:-1:1:0});for(var t=0;t<i.length;t++)e+=i[t].line;f.find(".admin-sidemenu-menu").html(e),C(".admin-sidemenu-close").off("click").on("click",function(){p.toggleClass("admin-sidemenu-closed"),f.toggleClass("admin-sidemenu-closed"),C(".admin-sidemenu-close i").toggleClass("hide"),setTimeout(function(){C(window).trigger("resize")},400)}),C(".admin-sidemenu-items").off("click").on("click",function(e){e.preventDefault(),e.stopPropagation(),window.location.hash="#"+C(this).data("tab")}),C(".admin-sidemenu-items a").off("click").on("click",function(e){e.preventDefault(),e.stopPropagation(),window.location.hash="#"+C(this).parent().data("tab")}),g.hosts.updateCounter(),g.adapters.updateCounter()}(),v.tabsInited){var e=f,t=e.data("problem-link");if(t){var n=C(t);if(n.length){var i=n.data("src");if(i&&-1===i.indexOf("%")){var a=n.find("iframe");a.length&&!a.attr("src")&&(a.attr("src",i),e.data("problem-link",null))}}}v.currentHash=null,v.navigateDo()}else v.tabsInited=!0,v.socket.emit("getVersion",function(e,t){var n=C(".button-version");n.hasClass("vendor")||n.text("yunkong2.admin "+t)}),C(".choose-tabs-config-button").off("click").on("click",function(e){var t=C("#admin_sidemenu_dialog");if(t.html())return t.html(""),void C("html").off("click",b);setTimeout(function(){C("html").on("click",b)},100);var n=C(e.target),i=n.offset();i.top+=n.height()-2;var a='<dialog open class="tab-selector m" style="top: '+i.top+"px; left: "+i.left+'px;"><div><ul style="">';for(var s in y){var o=y[s],r="chk-"+s;a+="<li><input "+(f.find('.admin-sidemenu-items[data-tab="'+s+'"]').length?"checked":"unchecked")+' class="chk-tab filled-in" type="checkbox" id="'+r+'" /><span for="'+r+'">'+_(o)+"</span></id>"}a+="</ul></div></dialog>",t.append(a),t.find(".chk-tab").off("change").on("change",function(e){var t=C(this).attr("id").substr(4);if(C(this).prop("checked"))v.systemConfig.common.tabs.push(t);else{var n=v.systemConfig.common.tabs.indexOf(t);-1!==t&&v.systemConfig.common.tabs.splice(n,1)}v.saveTabs(),j()}),t.find('input[type="checkbox"]+span').off("click").on("click",function(){var e=C(this).prev();e.prop("disabled")||e.prop("checked",!e.prop("checked")).trigger("change")})}),v.updateWizard(),C("#button-logout").on("click",function(){window.location.href="/logout/"}),window.onhashchange=function(){v.navigateDo()},v.navigateDo(),C("#events_threshold").on("click",function(){v.socket.emit("eventsThreshold",!1)})}function j(){var n=[],e=[];y={};for(var t=0;t<v.instances.length;t++){var i=v.instances[t],a=v.objects[i];if(a.common&&a.common.adminTab)if(a.common.adminTab.singleton){for(var s=!1,o=i.replace(/\.(\d+)$/,"."),r=0;r<e.length;r++){if(o===e[r].replace(/\.(\d+)$/,".")){s=!0;break}}s||e.push(i)}else e.push(i)}C(".admin-tab").each(function(){var e=C(this),t=e.attr("id");n.push(t),y[t]=e.data("name")});for(var c=0;c<e.length;c++){var l=v.objects[e[c]],d="tab-"+l.common.name,u=l.common.adminTab.link||"/adapter/"+l.common.name+"/tab.html";l.common.materializeTab&&(u=l.common.adminTab.link||"/adapter/"+l.common.name+"/tab_m.html");var m,g=e[c].split(".");if(m=l.common.adminTab.name?"object"==typeof l.common.adminTab.name?l.common.adminTab.name[systemLang]?l.common.adminTab.name[systemLang]:l.common.adminTab.name.en?_(l.common.adminTab.name.en):_(l.common.name):_(l.common.adminTab.name):_(l.common.name),l.common.adminTab.singleton?g[3]=0:(-1!==u.indexOf("?")?u+="&instance="+g[3]:u+="?instance="+g[3],m+="."+g[3],d+="-"+g[3]),n.push(d),y[d]=m,v.systemConfig.common.tabs&&-1===v.systemConfig.common.tabs.indexOf(d))C("#"+d).hide().appendTo(C("body"));else{var h=!1;if(u?h=-1!==u.indexOf("%"):(u="/adapter/"+g[2]+"/tab.html",l.common.materilizeTab&&(u="/adapter/"+g[2]+"/tab_m.html")),'<li><a href="#'+d+'">'+m+"</a></li>\n",C("#"+d).length)C("#"+d).hide().appendTo(C("body"));else{var f='<div id="'+d+'" data-name="'+m+'" class="tab-custom '+(h?"link-replace":"")+'" data-adapter="'+g[2]+'" data-instance="'+g[3]+'" data-src="'+u+'"><iframe class="iframe-in-tab" style="border: 0; solid #FFF; display: block; left: 0; top: 0; width: 100%; height: 100%"></iframe></div>';C(f).hide().appendTo(C("body")),C("#"+d).find(".iframe-in-tab").on("load",function(){var e=C(this).contents().find("body>header");e&&e.length||(e=C(this).contents().find("head")),e&&e.length&&e.append('<link rel="stylesheet" type="text/css" href="../../lib/css/iob/selectID.css"/>')})}}}if(C(".tab-custom").each(function(){-1===n.indexOf(C(this).attr("id"))&&C("#"+C(this).attr("id")).remove()}),v.systemConfig.common.tabs||(v.systemConfig.common.tabs=n),C(".link-replace").length){var p=0,b=setTimeout(function(){b=null,w()},100);C(".link-replace").each(function(){p++,v.tabs.instances._replaceLinks(C(this).data("src"),C(this).data("adapter"),C(this).data("instance"),C(this).attr("id"),function(e,t,n,i){C("#"+i).data("src",e).removeClass("link-replace"),--p||b&&(clearTimeout(b),b=null,w())})})}else w()}function N(a){v.socket.emit("getAllObjects",function(e,i){e?window.alert(_(e)):setTimeout(function(){var e;for(var t in v.objects=i,v.objects)v.objects.hasOwnProperty(t)&&"_design"!==t.slice(0,7)&&("instance"===(e=v.objects[t]).type&&v.instances.push(t),"enum"===e.type&&g.enums.list.push(t),"user"===e.type&&g.users.list.push(t),"group"===e.type&&g.users.groups.push(t),"adapter"===e.type&&g.adapters.list.push(t),"host"===e.type&&g.hosts.addHost(e),e.common&&e.common.history&&(e.common.custom=JSON.parse(JSON.stringify(e.common.history)),delete e.common.history));for(var n in v.objectsLoaded=!0,v.initHostsList(!0),j(),v.dialogs)v.dialogs.hasOwnProperty(n)&&"function"==typeof v.dialogs[n].prepare&&v.dialogs[n].prepare();!function n(i,a){a=a||0,i&&a<i.length&&v.socket.emit("sendToHost",i[a].name,"getHostInfo",null,function(e){if(e&&e["Node.js"]){var t=parseInt(e["Node.js"].split(".").shift().replace("v",""),10);(t<6||7===t||9===t)&&v.showMessage(_('This version of node.js "%s" on "%s" is deprecated. Please install node.js 6, 8 or newer',e["Node.js"],i[a].name),_("Suggestion"),"error_outline")}setTimeout(function(){n(i,a+1)},100)})}(g.hosts.list),v.getUser(),"function"==typeof a&&a()},0)})}function n(e,t){(e=e?e.replace(/\s/g,"_"):"")&&e.match(/\.messagebox$/)?v.addEventMessage(e,t,!0,!0):(g.states&&g.states.stateChange(e,t),g.objects.stateChange(e,t),g.hosts.stateChange(e,t),g.instances.stateChange(e,t),g.adapters.stateChange(e,t),v.dialogs.customs.stateChange(e,t),v.selectId&&v.selectId.selectId("state",e,t),v.addEventMessage(e,t,!1,!0))}function i(e,t){var n="update";t?(t._rev&&v.objects[e]&&(v.objects[e]._rev=t._rev),v.objects[e]||(n="add"),"add"!==n&&JSON.stringify(v.objects[e])===JSON.stringify(t)||(v.objects[e]=t)):v.objects[e]&&(n="delete",delete v.objects[e]),v.addEventMessage(e,t,!1,!1),g.objects.objectChange(e,t,n),v.selectId&&v.selectId.selectId("object",e,t,n),g.enums.objectChange(e,t,n),g.intro.objectChange(e,t,n),"system.config"===e&&(v.systemConfig.common.language!==t.common.language&&window.location.reload(),v.systemConfig=t,j()),"system.adapter.discovery.0"===e&&v.updateWizard(),e.match(/^system\.host\.[-\w]+$/)&&v.initHostsList(),g.instances.objectChange(e,t,n),e.match(/^script\.js\.global\..*/)&&(v.ignoreJSupdate=!0),t&&e.match(/^system\.adapter\.[\w-]+\.[0-9]+$/)&&(t.common&&t.common.adminTab&&!t.common.adminTab.ignoreConfigUpdate&&(e.match(/^system\.adapter\.javascript\.[0-9]+$/)&&v.ignoreJSupdate?v.ignoreJSupdate=!1:j()),t&&"instance"===t.type&&t.common.supportCustoms&&g.objects.reinit()),g.hosts.objectChange(e,t,n),g.users.objectChange(e,t,n),e===v.currentUser&&v.getUser()}function T(e,t){var n,i,a=e&&e.common;if(a.icon){if(a.icon.match(/^data:image\//))n=a.icon;else{if(-1===a.icon.indexOf("."))return'<i class="material-icons '+(t||"treetable-icon")+'">'+a.icon+"</i>";var s;n="instance"===e.type?"/adapter/"+e.common.name+"/"+e.common.icon:e._id.match(/^system\.adapter\./)?(s=e._id.split(".",3),"/"===a.icon[0]?s[2]+=a.icon:s[2]+="/"+a.icon,"/adapter/"+s[2]):(s=e._id.split(".",2),"/"===a.icon[0]?s[0]+=a.icon:s[0]+="/"+a.icon,"/adapter/"+s[0])}i=e.type}return{icon:n,alt:i}}v.initHostsList=function(e){var t=C("#host-adapters");if(!e||!t.data("inited")){t.data("inited",!0),v.currentHost=v.currentHost||v.config.currentHost||"";for(var n,i=[],a=0;a<v.tabs.hosts.list.length;a++)i.push('<li><a data-value="'+v.tabs.hosts.list[a].name+'">'+v.getHostIcon(v.objects[v.tabs.hosts.list[a].id],"imgHost left")+v.tabs.hosts.list[a].name+"</a></li>"),v.currentHost||(v.currentHost=v.tabs.hosts.list[a].name),v.currentHost===v.tabs.hosts.list[a].name&&(n=v.tabs.hosts.list[a].id);t.html(i);var s=C("#host-adapters-btn").show();s.text(_("Host:")+" "+v.currentHost).dropdown(),v.objects[n]&&v.objects[n].common&&v.objects[n].common.color,s.append(C(v.getHostIcon(v.objects[n],"imgHost left"))),v.tabs.hosts.list.length<2?s.addClass("disabled"):s.removeClass("disabled"),t.find("a").on("click",function(){var e=C(this).data("value"),t="system.host."+e+".alive";v.states[t]&&v.states[t].val&&"null"!==v.states[t].val?(v.currentHost=e,C("#host-adapters-btn").text(_("Host:")+" "+v.currentHost).append(C(this).find(".imgHost").clone()),console.log(v.currentTab),L["tab-"+v.currentTab]&&L["tab-"+v.currentTab].host&&(v.tabs[v.currentTab]&&"function"==typeof v.tabs[v.currentTab].destroy&&v.tabs[v.currentTab].destroy(),v.tabs[v.currentTab]&&"function"==typeof v.tabs[v.currentTab].init&&v.tabs[v.currentTab].init()),v.saveConfig("currentHost",v.currentHost)):v.showMessage(_("Host %s is offline",C(this).val()))})}},v.resubscribeStates=function(){for(var e in v.subscribesStates)v.subscribesStates.hasOwnProperty(e)&&v.subscribesStates[e]&&(console.debug("Re-Subscribe: "+e),v.socket.emit("subscribe",e))},v.resubscribeObjects=function(){for(var e in v.subscribesObjects)v.subscribesObjects.hasOwnProperty(e)&&v.subscribesObjects[e]&&v.socket.emit("subscribeObjects",e)},v.resubscribeLogs=function(){v.subscribesLogs&&(console.debug("Subscribe LOG"),v.socket.emit("requireLog",!0))},v.subscribeStates=function(e){if(e)if("object"==typeof e)for(var t=0;t<e.length;t++)v.subscribesStates[e[t]]=v.subscribesStates[e[t]]||0,v.subscribesStates[e[t]]++,1===v.subscribesStates[e[t]]&&(console.debug("Subscribe: "+e[t]),v.socket.emit("subscribe",e[t]));else v.subscribesStates[e]=v.subscribesStates[e]||0,v.subscribesStates[e]++,1===v.subscribesStates[e]&&(console.debug("Subscribe: "+e),v.socket.emit("subscribe",e))},v.unsubscribeStates=function(e){if(e)if("object"==typeof e)for(var t=0;t<e.length;t++)v.subscribesStates[e[t]]&&v.subscribesStates[e[t]]--,0===v.subscribesStates[e[t]]&&(console.debug("Unsibscribe: "+e[t]),v.socket.emit("unsubscribe",e[t]),delete v.subscribesStates[e[t]]);else v.subscribesStates[e]&&v.subscribesStates[e]--,0===v.subscribesStates[e]&&(console.debug("Unsibscribe: "+e),v.socket.emit("unsubscribe",e),delete v.subscribesStates[e])},v.subscribeObjects=function(e){if(e)if("object"==typeof e)for(var t=0;t<e.length;t++)v.subscribesObjects[e[t]]=v.subscribesObjects[e[t]]||0,v.subscribesObjects[e[t]]++,1===v.subscribesObjects[e[t]]&&v.socket.emit("subscribeObjects",e[t]);else v.subscribesObjects[e]=v.subscribesObjects[e]||0,v.subscribesObjects[e]++,1===v.subscribesObjects[e]&&v.socket.emit("subscribeObjects",e)},v.unsubscribeObjects=function(e){if(e)if("object"==typeof e)for(var t=0;t<e.length;t++)v.subscribesObjects[e[t]]&&v.subscribesObjects[e[t]]--,0===v.subscribesObjects[e[t]]&&(v.socket.emit("unsubscribeObjects",e[t]),delete v.subscribesObjects[e[t]]);else v.subscribesObjects[e]&&v.subscribesObjects[e]--,0===v.subscribesObjects[e]&&(v.socket.emit("unsubscribeObjects",e),delete v.subscribesObjects[e])},v.subscribeLogs=function(e){e?(v.subscribesLogs++,1===v.subscribesLogs&&(console.debug("Subscribe Logs"),v.socket.emit("requireLog",!0))):(v.subscribesLogs--,v.subscribesLogs<=0&&(v.subscribesLogs=0,console.debug("Unsubscribe Logs"),v.socket.emit("requireLog",!1)))},v.navigateCheckDialog=function(t){if(v.currentDialog&&v.dialogs[v.currentDialog]&&"function"==typeof v.dialogs[v.currentDialog].allStored){if(!1===v.dialogs[v.currentDialog].allStored())return v.confirmMessage(_("Some data are not stored. Discard?"),_("Please confirm"),null,function(e){t(!e)})}else if(configNotSaved)return v.confirmMessage(_("Some data are not stored. Discard?"),_("Please confirm"),null,function(e){t(!e)});t(!1)},v.navigateGetParams=function(){var e=decodeURI(window.location.hash).split("/");return e[2]?decodeURIComponent(e[2]):null},v.navigate=function(e){if(e||(e={}),"string"==typeof e&&(e={tab:e,dialog:"",params:""}),!e.tab){var t=decodeURI(window.location.hash).split("/");e.tab=t[0].replace(/^#/,"").replace(/^tab-/,"")}window.location.hash="#tab-"+encodeURIComponent(e.tab)+(e.dialog?"/"+e.dialog+(e.params?"/"+encodeURIComponent(e.params):""):"")},v.navigateDo=function(){window.location.hash!==v.currentHash&&v.navigateCheckDialog(function(e){if(e)window.location.hash=v.currentHash||"";else{configNotSaved=null,v.currentHash=window.location.hash;var t=v.currentHash.split("/"),n=t[0].replace(/^#/,"").replace(/^tab-/,""),i=t[1],a=decodeURIComponent(t[2]);n&&"!"!==n||(n=v.systemConfig.common.tabs&&-1===v.systemConfig.common.tabs.indexOf("tab-intro")?-1!==v.systemConfig.common.tabs.indexOf("tab-adapters")?"adapters":v.systemConfig.common.tabs[0].replace(/^#/,"").replace(/^tab-/,""):"intro");var s=C(".admin-sidemenu-body"),o=s.find(".admin-sidemenu-body-content"),r=C("#tab-"+n);if(s.find(".admin-preloader").remove(),r.length||(n="intro"),v.currentTab!==n||!o.length){var c;if(v.currentTab&&g[v.currentTab]&&"function"==typeof g[v.currentTab].destroy)g[v.currentTab].destroy();else if(v.currentTab){var l=C("#tab-"+v.currentTab);if(l.length&&(c=l.data("src"))){var d=l.find(">iframe");d.attr("src")&&(console.log("clear"),d.attr("src",""))}}if(v.currentTab=n,o.hide().appendTo("body"),i||(r.addClass("admin-sidemenu-body-content").show().appendTo(s),o=r),g[n]&&"function"==typeof g[n].init&&g[n].init(),r.length&&(c=r.data("src")))if(-1===c.indexOf("%")){var u=r.find(">iframe");u.length&&!u.attr("src")&&u.attr("src",c)}else f.data("problem-link","tab-"+n)}var m=f.find('.admin-sidemenu-items[data-tab="tab-'+n+'"]');f.find(".admin-sidemenu-items").not(m).removeClass("admin-sidemenu-active"),m.addClass("admin-sidemenu-active"),L["tab-"+n]&&L["tab-"+n].host?C("#host-adapters-btn").css("opacity",1):C("#host-adapters-btn").css("opacity",.3),document.title=n+" - yunkong2",v.currentDialog!==i&&(v.dialogs[v.currentDialog]&&"function"==typeof v.dialogs[v.currentDialog].destroy&&v.dialogs[v.currentDialog].destroy(),(v.currentDialog=i)&&v.dialogs[i]?("function"==typeof v.dialogs[i].init&&v.dialogs[i].init(a?a.split(","):void 0),g[v.currentTab]&&g[v.currentTab].saveScroll&&g[v.currentTab].saveScroll(),o.hide().appendTo("body"),C("#dialog-"+i).addClass("admin-sidemenu-body-content").show().appendTo(s)):o.attr("id")!==r.attr("id")&&(o.hide().appendTo("body"),r.addClass("admin-sidemenu-body-content").show().appendTo(s),g[v.currentTab]&&g[v.currentTab].restoreScroll&&g[v.currentTab].restoreScroll()))}})},v.getIconFromObj=function(e,t,n){var i="",a="";if(e&&e.common)if(e.common.icon){var s=T(e);i=s.icon,a=s.alt}else t=t||"lib/css/fancytree/","device"===e.type?(i=t+"device.png",a="device"):"channel"===e.type?(i=t+"channel.png",a="channel"):"state"===e.type&&(i=t+"state.png",a="state");return i?'<img class="'+(n||"treetable-icon")+'" src="'+i+'" alt="'+(a||"")+'" />':""},v.getIcon=function(e,t,n,i){return v.getIconFromObj((n||v.objects)[e],t,i)},v.getHostIcon=function(e,t){var n="",i="";if(e&&e.common&&e.common.icon){var a=T(e);n=a.icon,i=a.alt}return'<img class="'+(t||"treetable-icon")+'" src="'+(n=n||"img/no-image.png")+'" alt="'+(i=i||"")+'" />'},v.formatBytes=function(e){if(Math.abs(e)<1024)return e+" B";for(var t=["KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"],n=-1;e/=1024,++n,1024<=Math.abs(e)&&n<t.length-1;);return e.toFixed(1)+" "+t[n]},v.invertColor=function(e){return 0===e.indexOf("#")&&(e=e.slice(1)),3===e.length&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]),6===e.length&&.299*parseInt(e.slice(0,2),16)+.587*parseInt(e.slice(2,4),16)+.114*parseInt(e.slice(4,6),16)<=186};var L={"tab-intro":{order:1,icon:"apps"},"tab-adapters":{order:2,icon:"store",host:!0},"tab-instances":{order:3,icon:"subtitles",host:!0},"tab-objects":{order:4,icon:"view_list"},"tab-enums":{order:5,icon:"art_track"},"tab-logs":{order:6,icon:"view_headline",host:!0},"tab-scenes":{order:7,icon:"subscriptions"},"tab-events":{order:8,icon:"flash_on"},"tab-users":{order:10,icon:"person_outline"},"tab-javascript":{order:11,icon:"code"},"tab-text2command-0":{order:12,icon:"ac_unit"},"tab-text2command-1":{order:12,icon:"ac_unit"},"tab-text2command-2":{order:12,icon:"ac_unit"},"tab-node-red-0":{order:20,icon:"device_hub"},"tab-node-red-1":{order:21,icon:"device_hub"},"tab-node-red-2":{order:22,icon:"device_hub"},"tab-hosts":{order:100,icon:"storage"},"tab-fullcalendar-0":{order:30,icon:"perm_contact_calendar"},"tab-fullcalendar-1":{order:31,icon:"perm_contact_calendar"},"tab-fullcalendar-2":{order:32,icon:"perm_contact_calendar"}};v.socket.on("log",function(e){g.logs.add(e)}),v.socket.on("error",function(e){console.log(e)}),v.socket.on("permissionError",function(e){v.showMessage(_("Has no permission to %s %s %s",e.operation,e.type,e.id||""))}),v.socket.on("stateChange",function(e,t){setTimeout(n,0,e,t)}),v.socket.on("objectChange",function(e,t){setTimeout(i,0,e,t)}),v.socket.on("cmdStdout",function(e,t){if(r===e){var n=t.match(/^upload \[(\d+)]/);if(n){null===l.data("max")&&(l.data("max",parseInt(n[1],10)),h.removeClass("indeterminate").addClass("determinate"));var i=l.data("max"),a=parseInt(n[1],10);h.css("width",100-Math.round(a/i*100)+"%")}else(n=t.match(/^got [-_:\/\\.\w\d]+\/admin$/))?(l.find(".progress-text").html(_("Upload admin started")),l.data("max",null)):(n=t.match(/^got [-_:\/\\.\w\d]+\/www$/))&&(l.find(".progress-text").html(_("Upload www started")),l.data("max",null));s+="\n"+t,c.val(s),c.scrollTop(c[0].scrollHeight-c.height())}}),v.socket.on("cmdStderr",function(e,t){r===e&&(l.data("error")||l.data("error",t),s+="\nERROR: "+t,c.val(s),c.scrollTop(c[0].scrollHeight-c.height()))}),v.socket.on("cmdExit",function(e,t){if(r===e){t=parseInt(t,10),s+="\n"+(0!==t?"ERROR: ":"")+"process exited with code "+t,c.val(s),c.scrollTop(c[0].scrollHeight-c.height()),l.find(".progress-dont-close").addClass("disabled"),h.removeClass("indeterminate").css({width:"100%"}),l.find(".btn").html(_("Close")),l.data("finished",!0),l.data("max",!0);var n=p.find(".button-command");if(n.removeClass("in-progress"),t){var i=l.data("error");if(i){var a=i.match(/error: (.*)$/);a&&(i=a[1]),l.find(".progress-text").html(_("Done with error: %s",_(i))).addClass("error")}else l.find(".progress-text").html(_("Done with error")).addClass("error");n.addClass("error"),n.show()}else l.find(".progress-text").html(_("Success!")),n.hide(),l.find(".progress-dont-close input").prop("checked")&&setTimeout(function(){l.modal("close")},1500);o&&(o(t),o=null)}}),v.socket.on("eventsThreshold",function(e){e?C("#events_threshold").show():C("#events_threshold").hide()}),v.socket.on("connect",function(){C("#connecting").hide(),t?(t=!1,v.getUser(),v.socket.emit("getUserPermissions",function(e,t){v.acl=t,v.socket.emit("getObject","system.config",function(a,e){if((v.systemConfig=e)&&e.native&&e.native.vendor){var t=e.native.vendor;if(t.icon&&C(".admin-sidemenu-header .button-icon img").attr("src",e.native.vendor.icon),t.name&&C(".admin-sidemenu-header .button-version").html(e.native.vendor.name).addClass("vendor"),t.admin&&t.admin.noCustomInstall&&C("#btn_filter_custom_url").hide(),t.admin&&t.admin.css){if(t.admin.css.sideNavUser&&C(".side-nav .user-view").css(t.admin.css.sideNavUser),t.admin.css.sideNavMenu&&C(".side-nav").css(t.admin.css.sideNavMenu),t.admin.css.header&&p.find(".admin-sidemenu-header nav").css(t.admin.css.header),t.admin.css.rules)for(var n=0;n<t.admin.css.rules.length;n++)C(t.admin.css.rules[n].selector).css(t.admin.css.rules[n].css);t.admin.styles&&C("head").append('<style type="text/css">'+t.admin.styles+"</style>")}}if(v.systemConfig&&v.systemConfig.common&&v.systemConfig.common.tabs){var i=v.systemConfig.common.tabs.indexOf("tab-log");-1!==i&&(v.systemConfig.common.tabs[i]="tab-logs")}v.socket.emit("getObject","system.repositories",function(e,t){v.dialogs.system.systemRepos=t,v.socket.emit("getObject","system.certificates",function(e,t){setTimeout(function(){if(v.dialogs.system.systemCerts=t,"permissionError"===a)v.systemConfig={common:{language:systemLang},error:"permissionError"};else if(!a&&v.systemConfig&&v.systemConfig.common){if(systemLang=v.systemConfig.common.language||systemLang,v.systemConfig.common.city=v.systemConfig.common.city||"",v.systemConfig.common.country=v.systemConfig.common.country||"",v.systemConfig.common.longitude=v.systemConfig.common.longitude||"",v.systemConfig.common.latitude=v.systemConfig.common.latitude||"",!v.systemConfig.common.licenseConfirmed){var n=(v.systemConfig.common.language||window.navigator.userLanguage||window.navigator.language||"").substring(0,2);"en"!==n&&(n="cn"),systemLang=n,d.find(".license_text").html(license[n]||license.en),d.find(".license_checkbox").prop("checked",!1),d.find(".license_language").data("licenseConfirmed",!1).val(n).on("change",function(){n=C(this).val(),d.find(".license_language_label").html(translateWord("Select language",n)),d.find(".license_text").html(license[n]||license.en),d.find(".license_checkbox").html(translateWord("license_checkbox",n)),d.find(".license_agree .translate").html(translateWord("agree",n)),d.find(".license_non_agree .translate").html(translateWord("not agree",n)),d.find(".license_terms").html(translateWord("License terms",n)),d.find(".license_agreement_label").html(translateWord("license agreement",n))}).select(),d.find(".license_diag").on("change",function(){C(this).prop("checked")?d.find(".license_agree").removeClass("disabled"):d.find(".license_agree").addClass("disabled")}),d.find('input[type="checkbox"]+span').off("click").on("click",function(){var e=C(this).prev();e.prop("disabled")||e.prop("checked",!e.prop("checked")).trigger("change")}),d.modal({dismissible:!1,complete:function(){d.find(".license_text").html(""),location.reload()}}).modal("open"),d.find(".license_agree").addClass("disabled").off("click").on("click",function(e){e.preventDefault(),e.stopPropagation(),v.socket.emit("getObject","system.config",function(e,t){!e&&t?(t.common=t.common||{},t.common.licenseConfirmed=!0,t.common.language=n,v.socket.emit("setObject","system.config",t,function(e){e&&v.showError(e),d.modal("close"),d.find(".license_agree").off("click"),d.find(".license_non_agree").off("click")})):v.showError(_("Cannot confirm: "+e))})}),d.find(".license_non_agree").off("click").on("click",function(e){location.reload()})}}else v.systemConfig={type:"config",common:{name:"system.config",city:"",country:"",longitude:"",latitude:"",language:"",tempUnit:"°C",currency:"",dateFormat:"DD.MM.YYYY",isFloatComma:!0,licenseConfirmed:!1,defaultHistory:"",tabs:["tab-intro","tab-adapters","tab-instances","tab-objects","tab-logs","tab-scenes","tab-javascript","tab-text2command-0"]}},v.systemConfig.common.language=window.navigator.userLanguage||window.navigator.language,"en"!==v.systemConfig.common.language&&(v.systemConfig.common.language="cn");for(var e in translateCron(),translateAll(),"function"==typeof initGridLanguage&&initGridLanguage(v.systemConfig.common.language),l.modal({dismissible:!1}),u.modal(),m.modal({dismissible:!1}),l.find(".progress-show-more").off("change").on("change",function(){var e=C(this).prop("checked");v.saveConfig("progressMore",e),e?l.find(".textarea").show():l.find(".textarea").hide()}),void 0===v.config.progressClose&&(v.config.progressClose=!0),l.find(".progress-dont-close input").on("change",function(){v.saveConfig("progressClose",C(this).prop("checked"))}),l.find('input[type="checkbox"]+span').off("click").on("click",function(){var e=C(this).prev();e.parent().parent().hasClass("switch")||e.prop("disabled")||e.prop("checked",!e.prop("checked")).trigger("change")}),l.find(".progress-dont-close input").prop("checked",v.config.progressClose),l.find(".progress-show-more").prop("checked",!!v.config.progressMore).trigger("change"),l.find(".btn").on("click",function(){l.data("finished")?p.find(".button-command").hide():p.find(".button-command").show()}),p.find(".button-command").on("click",function(){l.modal("open")}),g)g.hasOwnProperty(e)&&g[e]&&"function"==typeof g[e].prepare&&g[e].prepare();var i;i=N,g.states&&g.states.clear(),v.socket.emit("getStates",function(e,t){v.states=t,"function"==typeof i&&setTimeout(function(){i()},0)})},0)})})})})):(v.resubscribeStates(),v.resubscribeObjects(),v.resubscribeLogs()),v.waitForRestart&&location.reload()}),v.socket.on("disconnect",function(){C("#connecting").show()}),v.socket.on("reconnect",function(){C("#connecting").hide(),v.waitForRestart&&location.reload()}),v.socket.on("repoUpdated",function(){setTimeout(function(){g.adapters.init(!0)},0)}),v.socket.on("reauthenticate",function(){location.reload()})})}(jQuery);var license={en:'The MIT License (MIT)<br><br>Copyright © 2014-2018 bluefox, 2014 hobbyquaker<br><br>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:<br>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<br>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.<br>',de:'MIT-Lizenz (MIT)<br><br>Copyright © 2014-2018 bluefox, 2014 hobbyquaker<br><br>Hiermit wird unentgeltlich jeder Person, die eine Kopie der Software und der zugehörigen Dokumentationen (die "Software") erhält, die Erlaubnis erteilt, sie uneingeschränkt zu benutzen, inklusive und ohne Ausnahme dem Recht, sie zu verwenden, kopieren, ändern, fusionieren, verlegen, verbreiten, unterlizenzieren und/oder zu verkaufen, und Personen, die diese Software erhalten, diese Rechte zu geben, unter den folgenden Bedingungen:<br>Der obige Urheberrechtsvermerk und dieser Erlaubnisvermerk sind in allen Kopien oder Teilkopien der Software beizulegen.<br>DIE SOFTWARE WIRD OHNE JEDE AUSDRÜCKLICHE ODER IMPLIZIERTE GARANTIE BEREITGESTELLT, EINSCHLIESSLICH DER GARANTIE ZUR BENUTZUNG FÜR DEN VORGESEHENEN ODER EINEM BESTIMMTEN ZWECK SOWIE JEGLICHER RECHTSVERLETZUNG, JEDOCH NICHT DARAUF BESCHRÄNKT. IN KEINEM FALL SIND DIE AUTOREN ODER COPYRIGHTINHABER FÜR JEGLICHEN SCHADEN ODER SONSTIGE ANSPRÜCHE HAFTBAR ZU MACHEN, OB INFOLGE DER ERFÜLLUNG EINES VERTRAGES, EINES DELIKTES ODER ANDERS IM ZUSAMMENHANG MIT DER SOFTWARE ODER SONSTIGER VERWENDUNG DER SOFTWARE ENTSTANDEN.',ru:"Лицензия MIT<br><br>Copyright © 2014-2018 bluefox, 2014 hobbyquaker<br><br>Данная лицензия разрешает лицам, получившим копию данного программного обеспечения и сопутствующей документации (в дальнейшем именуемыми «Программное Обеспечение»), безвозмездно использовать Программное Обеспечение без ограничений, включая неограниченное право на использование, копирование, изменение, добавление, публикацию, распространение, сублицензирование и/или продажу копий Программного Обеспечения, также как и лицам, которым предоставляется данное Программное Обеспечение, при соблюдении следующих условий:<br>Указанное выше уведомление об авторском праве и данные условия должны быть включены во все копии или значимые части данного Программного Обеспечения.<br>ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ НАРУШЕНИЙ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ ТРЕБОВАНИЙ ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.",it:'Licenza MIT<br><br>Copyright © 2014-2018 bluefox, 2014 hobbyquaker<br><br>Si concede gratuitamente l\'autorizzazione, a chiunque ottenga una copia di questo software e dei file di documentazione associati (il "Software"), di dare opera al Software senza restrizioni, compresi senza limitazione i diritti di utilizzare, copiare, modificare, unire, pubblicare, distribuire, concedere in sublicenza ovvero vendere copie del Software, e di consentire alle persone a cui il Software è fornito di fare altrettanto, posto che siano rispettate le seguenti condizioni:<br>l\'avviso di copyright unitamente a questo avviso di licenza devono essere sempre inclusi in tutte le copie o parti sostanziali del Software.<br>IL SOFTWARE VIENE FORNITO "COSÌ COM\'È" SENZA GARANZIE DI ALCUN TIPO, ESPLICITE O IMPLICITE, COMPRESE, MA NON SOLO, LE GARANZIE DI COMMERCIABILITÀ, IDONEITÀ AD UN PARTICOLARE SCOPO E NON VIOLAZIONE DI DIRITTI ALTRUI. IN NESSUN CASO GLI AUTORI DEL SOFTWARE O I TITOLARI DEL COPYRIGHT POTRANNO ESSERE RITENUTI RESPONSABILI DI RECLAMI, DANNI O ALTRE RESPONSABILITÀ, DERIVANTI DA O COLLEGATI A CONTRATTO, ILLECITO CIVILE O IN ALTRA RELAZIONE CON IL SOFTWARE O CON IL SUO UTILIZZO O CON ALTRE OPERAZIONI DEL SOFTWARE.',fr:'Licence MIT<br><br>Copyright © 2014-2018 bluefox, 2014 hobbyquaker<br><br>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:<br>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<br>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.<br>',pt:'Licença MIT<br><br>Copyright © 2014-2018 bluefox, 2014 hobbyquaker<br><br>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:<br>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<br>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.<br>',nl:'MIT-licentie<br><br>Copyright © 2014-2018 bluefox, 2014 hobbyquaker<br><br>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:<br>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<br>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.<br>',es:'Licencia MIT<br><br>Copyright © 2014-2018 bluefox, 2014 hobbyquaker<br><br>Se concede permiso, de forma gratuita, a cualquier persona que obtenga una copia de este software y de los archivos de documentación asociados (el "Software"), para utilizar el Software sin restricción, incluyendo sin limitación los derechos a usar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar, y/o vender copias del Software, y a permitir a las personas a las que se les proporcione el Software a hacer lo mismo, sujeto a las siguientes condiciones:<br>El aviso de copyright anterior y este aviso de permiso se incluirán en todas las copias o partes sustanciales del Software.<br>EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO PERO NO LIMITADO A GARANTÍAS DE COMERCIALIZACIÓN, IDONEIDAD PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS AUTORES O TITULARES DEL COPYRIGHT SERÁN RESPONSABLES DE NINGUNA RECLAMACIÓN, DAÑOS U OTRAS RESPONSABILIDADES, YA SEA EN UNA ACCIÓN DE CONTRATO, AGRAVIO O CUALQUIER OTRO MOTIVO, QUE SURJA DE O EN CONEXIÓN CON EL SOFTWARE O EL USO U OTRO TIPO DE ACCIONES EN EL SOFTWARE.',pl:'Licencja MIT<br><br>Copyright © 2014-2018 bluefox, 2014 hobbyquaker<br><br>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:<br>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<br>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.<br>'},addAll2FilterCombobox=!1;function IobListHeader(e,h){if(!(this instanceof IobListHeader))return new IobListHeader(e,h);var f,a,p;void 0===h&&(h={}),void 0===h.colWidthOffset&&(h.colWidthOffset=0),"TABLE"===(p="object"==typeof e?$(e):$("#"+e))[0].tagName&&(p=p.find("tr:first")),e=p[0];var n,b=this;b.selectIdOffset=[],p.html(""),this.setList=function(e){var t;(t="string"==typeof e?("#"!==e[0]&&(e="#"+e),$(e)):e)&&t.length&&("TD"!==t[0].tagName&&"TH"!==t[0].tagName&&((t=t.find(">thead>tr:first>th,>thead>tr:first>td")).length||(t=e.find(">tbody>tr:first>th,>tr:first>th,>tbody>tr:first>td, >tr:first>td"))),a=t)},h.list&&this.setList(h.list),this.syncHeader=function(){if("object"==typeof a){var e=function(){a.each(function(e,t){if(!(e>=a.length-1)){var n=$(t).width(),i=b.selectIdOffset[e]||0;n+i&&$(f[e]).width(Math.round(n+i))}}),a.length&&!b.selectIdOffset.length&&(b.selectIdOffset[0]=0,a.each(function(e,t){var n=$(a[e]).offset().left;n&&(b.selectIdOffset[e]=n-$(f[e]).offset().left)}),e())};e()}},$(window).on("resize",function(e,t){n&&clearTimeout(n),n=setTimeout(b.syncHeader.bind(b),100)}),this.doFilter=function(){},b.ids=[],b.add=function(t,m,e,n){void 0===e&&(e=m);var i,a,s=!(i=e)||a&&"#"===i[0]?i:(h.prefix&&i.substr(0,h.prefix.length)!==h.prefix&&(i=h.prefix+"-"+i),(a?"#":"")+i);m=_(m);var o="";switch(t){case"combobox":o=' <select class="list-header-input" id="'+s+'" title="'+m+'"></select> <button class="list-header-clear" id="'+s+'-clear" role="button" title=""></button>';break;case"edit":o=' <input class="list-header-input" placeholder="'+m+'" id="'+s+'" title="'+m+'"> <button class="list-header-clear" id="'+s+'-clear" role="button" title="'+m+'"></button>';break;case"text":o='<span class="list-header-text">'+m+"</span>"}p.append("<th>"+o+"</th>");var r="#"+s,g=$(r),c=b[e]={$filter:g,val:g.val.bind(g),selectedVal:g.val()||""};if(b.ids.push(e),"combobox"===t&&(c.options=[],c.checkAddOption=function(e,t,n){if(-1===this.options.indexOf(e)){this.options.push(e),this.options.sort();for(var i,a,s=g.val(),o=n?"":(i=m,a=s,addAll2FilterCombobox&&(i=i?_(i)+" ("+_("all")+")":_("all")),'<option value="" '+(""===a?"selected":"")+">"+i+"</option>"),r=0,c=this.options.length;r<c;r++){var l=this.options[r];if(t){var d=t(l,r);"object"==typeof d?u(d.val,d.name):o+=d}else u(l,l)}g.html(o)}function u(e,t){o+='<option value="'+e+'" '+(t===s?"selected":"")+">"+t+"</option>"}},n))for(var l=0;l<n.length;l++)c.checkAddOption(n[l].name,function(e,t){return n[t]},!0);var d,u=$(r+"-clear");return u.on("click",function(){""!==g.val()&&g.val("").trigger("change")}),"undefined"==typeof M?u.button({icons:{primary:"ui-icon-close"},text:!1}):u.prepend('<i class="material-icons">close</i>'),g.on("change",function(e){d&&clearTimeout(d),c.selectedVal=g.val(),d=setTimeout(b.doFilter,"combobox"!==t?400:0),c.selectedVal?g.parent().addClass("filter-active"):g.parent().removeClass("filter-active")}).on("keyup",function(e){13===e.which?b.doFilter():g.trigger("change")}),f=p.find(">th"),c}}function values2table(r,c,e){"object"==typeof r&&(e=c,c=r,r="");var l=e&&e.maxRaw||null,d=e&&e.onChange||null,u=e&&e.onReady||null;c=c||[];var o,s=[],m=(o=r?$("#"+r):$("body")).find(".table-button-add");if(m.data("raw",c.length),l&&m.data("maxRaw",l),m.data("inited")||(m.data("inited",!0),m.on("click",function(){if(!m.data("maxRaw")||m.data("raw")<m.data("maxRaw")){for(var e=o.find(".table-values"),t=e.data("values"),n=e.data("names"),i=e.data("maxRaw"),a={},s=0;s<n.length;s++)n[s]&&(a[n[s].name]=n[s].def);t.push(a),d&&d(),setTimeout(function(){values2table(r,t,d,u,i)},100),m.data("raw",m.data("raw")+1)}else confirmMessage(_("maxTableRaw")+": "+m.data("maxRaw"),_("maxTableRawInfo"),"alert",["Ok"])})),c){var g=[],h=o.find(".table-values");if(h.data("values",c),!h.data("rooms")&&h.find('th[data-name="room"]').length)return void getEnums("rooms",function(e,t){var n={},i=_("nonerooms");n[_("none")]="nonerooms"!==i?i:"";var a=[];for(var s in t)t.hasOwnProperty(s)&&a.push(s);a.sort(function(e,t){return e=e.toLowerCase(),(t=t.toLowerCase())<e?1:e<t?-1:0});for(var o=0;o<a.length;o++)n[a[o]]=t[a[o]].common.name||o;h.data("rooms",n),values2table(r,c,d,u,l)});if(!h.data("functions")&&h.find('th[data-name="func"]').length)return void getEnums("functions",function(e,t){var n={},i=_("nonefunctions");n[_("none")]="nonefunctions"!==i?i:"";var a=[];for(var s in t)t.hasOwnProperty(s)&&a.push(s);a.sort(function(e,t){return e=e.toLowerCase(),(t=t.toLowerCase())<e?1:e<t?-1:0});for(var o=0;o<a.length;o++)n[a[o]]=t[a[o]].common.name||o;h.data("functions",n),values2table(r,c,d,u,l)});h.find("th").each(function(){var e=$(this).data("name");if(e){var t={name:e,type:$(this).data("type")||"text",def:$(this).data("default"),class:($(this).attr("class")||"").replace("translate",""),style:$(this).data("style"),readOnly:$(this).data("readOnly"),tdstyle:$(this).data("tdstyle")};if("checkbox"===t.type)"false"===t.def&&(t.def=!1),"true"===t.def&&(t.def=!0),t.def=!!t.def;else if("select"===t.type||"select multiple"===t.type){var n=($(this).data("options")||"").split(";");t.options={};for(var i=0;i<n.length;i++){var a=n[i].split("/");t.options[a[0]]=_(a[1]||a[0]),0===i&&(t.def=void 0===t.def?a[0]:t.def)}}else t.def=t.def||"";s.push(t)}else s.push(null);(e=$(this).data("buttons"))?g.push({btn:e.split(" "),class:($(this).attr("class")||"").replace("translate",""),style:$(this).data("style"),tdstyle:$(this).data("tdstyle")}):g.push(null)}),h.data("names",s);for(var t="",n=0;n<c.length;n++){var i=c[n]&&c[n].id;!i&&c[n]&&(i="_index"===s[0]?c[n][s[1]]:c[n][s[0]]),t+='<tr data-id="'+i+'" data-index="'+n+'">';for(var a=0;a<s.length;a++){t+="<td";var f="",p="",b="";if(s[a])if(s[a].class&&(t+=' class="'+s[a].class+'" '),"_index"!==s[a].name&&(b=s[a].tdstyle||"")&&";"!==b[0]&&(b=";"+b),"_index"===s[a].name)p=s[a].style?s[a].style:"text-align: right;",f+=n+1;else if("checkbox"===s[a].type)f+='<input style="'+(s[a].style||"")+'" class="values-input" type="checkbox" data-index="'+n+'" data-name="'+s[a].name+'" '+(c[n][s[a].name]?"checked":"")+'" data-old-value="'+(void 0===c[n][s[a].name]?"":c[n][s[a].name])+'"/>';else if("select"===s[a].type.substring(0,6)){f+=("multiple"===s[a].type.substring(7,16)?'<select multiple style="':'<select style="')+(s[a].style?s[a].style:"width: 100%")+'" class="values-input" data-index="'+n+'" data-name="'+s[a].name+'">',"room"===s[a].name?e=h.data("rooms"):"func"===s[a].name?(e=h.data("functions"),"select multiple"===s[a].type&&delete e[_("none")]):e=s[a].options;var M=void 0===c[n][s[a].name]?"":c[n][s[a].name];for(var y in"object"!=typeof M&&(M=[M]),e)f+='<option value="'+y+'" '+(-1!==M.indexOf(y)?" selected":"")+">"+e[y]+"</option>";f+="</select>"}else f+='<input class="values-input" style="'+(s[a].style?s[a].style:"width: 100%")+'" type="'+s[a].type+'" data-index="'+n+'" data-name="'+s[a].name+'"/>';if(g[a]){p="text-align: center; "+(g[a].style||"")+(g[a].tdstyle||"");for(var v=0;v<g[a].btn.length;v++)!n&&"up"===g[a].btn[v]||n===c.length-1&&"down"===g[a].btn[v]?f+='<a class="btn-floating disabled" data-command="'+g[a].btn[v]+'" class="values-buttons"><i class="material-icons"></i></a>':f+='<a class="btn-floating" data-index="'+n+'" data-command="'+g[a].btn[v]+'" class="values-buttons"><i class="material-icons"></i></a>';g[a].class&&(t+=' class="'+g[a].class+'" ')}p.length||b.length?t+=' style="'+p+b+'">'+f+"</td>":t+=">"+f+"</td>"}t+="</tr>"}var w=h.find(".table-lines");w.length||(h.append('<tbody class="table-lines"></tbody>'),w=h.find(".table-lines")),w.html(t),w.find(".values-input").each(function(){var e=$(this),t=e.attr("type"),n=e.data("name"),i=e.data("index");e.data("old-value",c[i][n]),"checkbox"===t?e.prop("checked",c[i][n]):e.val(c[i][n])}),w.find("a[data-command]").each(function(){var e=$(this).data("command");"delete"===e?$(this).on("click",function(){var e=$(this).data("index"),t=c[e];c.splice(e,1),d&&d(),setTimeout(function(){"function"==typeof tableEvents&&tableEvents(e,t,"delete"),values2table(r,c,d,u,l)},100),m.data("maxRaw")&&m.data("raw",m.data("raw")-1)}).addClass("red").find(".material-icons").html("delete"):"up"===e?$(this).on("click",function(){var e=$(this).data("index"),t=c[e];c.splice(e,1),c.splice(e-1,0,t),d&&d(),setTimeout(function(){values2table(e,c,d,u,l)},100)}).find("i").html("arrow_upward"):"down"===e?$(this).on("click",function(){var e=$(this).data("index"),t=c[e];c.splice(e,1),c.splice(e+1,0,t),d&&d(),setTimeout(function(){values2table(e,c,d,u,l)},100)}).find("i").html("arrow_downward"):"pair"===e?$(this).on("click",function(){if("function"==typeof tableEvents){var e=$(this).data("index"),t=c[e];tableEvents(e,t,"pair")}}).attr("title",_("pair")).find("i").html("insert_link"):"unpair"===e&&$(this).on("click",function(){if("function"==typeof tableEvents){var e=$(this).data("index"),t=c[e];tableEvents(e,t,"unpair")}}).attr("title",_("unpair")).find("i").html("not_interested")}),w.find(".values-input").on("change.adaptersettings",function(){var e=$(this).data("index"),t=$(this).data("name");"checkbox"===$(this).attr("type")?($(this).prop("checked").toString()!==$(this).data("old-value")&&d&&d(t,e),c[e][t]=$(this).prop("checked")):($(this).val()!==$(this).data("old-value")&&d&&d(t,e),c[e][t]=$(this).val())}).on("keyup",function(){$(this).trigger("change.adaptersettings")})}"function"==typeof u&&u()}function table2values(e){var t;t=e?$("#"+e):$("body");var n=[];t.find(".table-values th").each(function(){var e=$(this).data("name");e?n.push(e):n.push("___ignore___")});var i=[],a=0;return t.find(".table-lines tr").each(function(){i[a]={},$(this).find("td").each(function(){var e=$(this).find("input");if(e.length){var t=e.data("name");"checkbox"===e.attr("type")?i[a][t]=e.prop("checked"):i[a][t]=e.val()}var n=$(this).find("select");if(n.length){t=n.data("name");i[a][t]=n.val()||""}}),a++}),i}var systemLang="en",systemDictionary={};function translateWord(e,t,n){if(!e)return"";if(t=t||systemLang,(n=n||systemDictionary)[e=e.toString()]){var i=n[e][t];if(i)return i;if("en"!==t&&(i=n[e].en))return i}else"string"!=typeof e||e.match(/_tooltip$/)?"string"!=typeof e&&console.warn("Trying to translate non-text:"+e):console.log('"'+e+'": {"en": "'+e+'", "cn": "'+e+'"},');return e}function translateAll(e,i,a){i=i||systemLang,a=a||systemDictionary,e||(e="body");var t=$(e);t.find(".translate").each(function(e){var t=$(this).attr("data-lang");t||(t=$(this).html(),$(this).attr("data-lang",t));var n=translateWord(t,i,a);n&&$(this).html(n)}),t.find(".translateV").each(function(e){var t=$(this).attr("data-lang-value");t||(t=$(this).attr("value"),$(this).attr("data-lang-value",t));var n=translateWord(t,i,a);n&&$(this).attr("value",n)}),t.find(".translateT").each(function(e){var t=$(this).attr("data-lang-title");t||(t=$(this).attr("title"),$(this).attr("data-lang-title",t));var n=translateWord(t,i,a);n&&$(this).attr("title",n)}),t.find(".translateP").each(function(e){var t=$(this).attr("data-lang-placeholder");t||(t=$(this).attr("placeholder"),$(this).attr("data-lang-placeholder",t));var n=translateWord(t,i,a);n&&$(this).attr("placeholder",n)})}function translateName(e){return e&&"object"==typeof e?e[systemLang]||e.en:e}var _=function(e,t,n,i){var a=(e=translateWord(e)).indexOf("%s");return-1===a||-1===(a=(e=e.replace("%s",t)).indexOf("%s"))||-1!==(a=(e=e.replace("%s",n)).indexOf("%s"))&&(e=e.replace("%s",i)),e};!function(X){if(!X.fn.treeTable){var t={init:function(e){e.imgPath=e.imgPath||"lib/css/fancytree/";for(var t=0;t<this.length;t++)if(p.call(this[t],e),"undefined"!=typeof Storage){var n=window.localStorage.getItem(e.name+"-treetable");if(n){n=JSON.parse(n);for(var i=X(this[t]).find(".tree-table-main"),a=0;a<n.length;a++)try{i.treetable("expandNode",n[a])}catch(a){}}}return this},destroy:function(){for(var e=0;e<this.length;e++){var t=X(this[e]).find(".tree-table-main");t.length&&t.data("options")&&(t.data("options",null),X(this[e]).html(""))}},expand:function(e){for(var t=0;t<this.length;t++){var n=X(this[t]).find(".tree-table-main");try{e?n.treetable("expandNode",e):n.treetable("expandAll",e)}catch(e){}}},collapse:function(e){for(var t=0;t<this.length;t++){var n=X(this[t]).find(".tree-table-main");try{e?n.treetable("collapseNode",e):n.treetable("collapseAll")}catch(e){}}},show:function(e,t,n){"function"==typeof t&&(n=t,t=void 0),"function"==typeof e&&(n=e,e=void 0);for(var i=0;i<this.length;i++){var a=X(this[i]).find(".tree-table-main");a.find(".selected").removeClass("selected");try{a.treetable("reveal",e)}catch(e){}var s=a.treetable("node",e);s&&s.row.addClass("selected")}return n&&n(),this},reinit:function(){for(var e=0;e<this.length;e++)s.call(this[e]);return this},object:function(e,t){for(var n=0;n<this.length;n++){var i=X(this[n]).find(".tree-table-main");i.updateTimer&&clearTimeout(i.updateTimer);var a=i.data("options");if(!a||!a.root||e.match("^"+a.root.replace(/\./g,"\\.")+"\\."))!function(e,t){i.updateTimer=setTimeout(function(){s.call(e)},300)}(this[n])}return this}};X.fn.treeTable=function(e){return t[e]?t[e].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof e&&e?void X.error('Method "'+e+'" not found in jQuery.treeTable'):t.init.apply(this,arguments)}}function q(){var e=this.id,t=this.row.parent().parent(),n=t.data("options");n.name&&(n.expanded=n.expanded||[],-1===n.expanded.indexOf(e)&&(n.expanded.push(e),"undefined"!=typeof Storage&&window.localStorage.setItem(n.name+"-treetable",JSON.stringify(n.expanded))));t.treetable("node",e)}function ee(){var e=this.id,t=this.row.parent().parent(),n=t.data("options");if(n.name&&n.expanded){var i=n.expanded.indexOf(e);-1!==i&&(n.expanded.splice(i,1),"undefined"!=typeof Storage&&window.localStorage.setItem(n.name+"-treetable",JSON.stringify(n.expanded)))}t.treetable("node",e)}function te(e,t){var n=t?"":'<div class="treetablelist-buttons"><button class="treetable-list-btn-ok"></button><button class="treetable-list-btn-cancel"></button></div>';n+='<ul class="treetable-list">';for(var i=e.rows,a=0;a<i.length;a++){for(var s=0,o=i[a];o.parent;){for(var r=!1,c=0;c<i.length;c++)if(i[c].id===o.parent){o=i[c],r=!0;break}if(!r)break;s++}var l=i[a].title;"object"==typeof l&&(l=l[systemLang]||l.en);var d=void 0===i[a].instance?0:1;n+='<li data-id="'+i[a].id+'" class="'+(d?"treetable-list-item":"treetable-list-folder")+'" style="margin-left: '+19*s+"px; width: calc(100% - "+(15*s+2+7*d)+"px);"+("script.js.global"===i[a].id?"color: rgb(0, 128, 0);":"")+'">'+(d?"":'<span class="fancytree-expander"></span>')+'<span class="fancytree-icon"></span>'+l+"</li>"}n+="</ul>";var u=X(this),m=X(n);u.find(".treetablelist-buttons").remove(),u.find(".treetable-list").remove(),u.find(".tree-table-buttons").remove(),u.find(".tree-table-main").remove(),u.prepend(m);var g=X(m).find(".treetablelist-buttons"),h=X(m).find(".treetable-list");h.sortable({cancel:".treetable-list-folder",axis:"y"}).data("options",e);var f=this;g.find(".treetable-list-btn-ok").button({icons:{primary:"ui-icon-check"},text:!1}).css({width:24,height:24}).on("click",function(){var i="",a=[];h.find("li").each(function(){var e=X(this).data("id");if(X(this).hasClass("treetable-list-folder"))i=e;else{var t=e.split("."),n=t.pop();t.join(".")!==i&&a.push({oldId:e,newId:i+"."+n})}}),function t(n,i,a){if(i&&i.length){var e=i.shift();n.moveId&&n.moveId(e.oldId,e.newId,function(e){setTimeout(function(){t(n,i,a)},50)})}else a&&a()}(e,a,function(){p.call(f,e)})}),g.find(".treetable-list-btn-cancel").button({icons:{primary:"ui-icon-cancel"},text:!1}).css({width:24,height:24}).on("click",function(){p.call(f,e)})}function ne(e,t,n){var i="",a="",s=e&&e.common;if(s)if(s.icon){if(s.icon.match(/^data:image\//))i=s.icon;else{if(-1===s.icon.indexOf("."))return'<i class="material-icons '+(n||"treetable-icon")+'">'+s.icon+"</i>";var o;i="instance"===e.type?"/adapter/"+e.common.name+"/"+e.common.icon:e._id.match(/^system\.adapter\./)?(o=e._id.split(".",3),"/"===e.common.icon[0]?o[2]+=e.common.icon:o[2]+="/"+e.common.icon,"/adapter/"+o[2]):(o=e._id.split(".",2),"/"===e.common.icon[0]?o[0]+=e.common.icon:o[0]+="/"+e.common.icon,"/adapter/"+o[0])}a=e.type}else t=t||"lib/css/fancytree/","device"===e.type?(i=t+"device.png",a="device"):"channel"===e.type?(i=t+"channel.png",a="channel"):"state"===e.type&&(i=t+"state.png",a="state");return i?'<img class="'+(n||"treetable-icon")+'" src="'+i+'" alt="'+a+'" />':""}function p(i){var e="",t=window.M&&window.M.toast?"a":"button";if(i.panelButtons){e+='<div class="row tree-table-buttons m">';for(var n=0;n<i.panelButtons.length;n++)e+="<"+t+' class="btn-floating waves-effect waves-light blue btn-custom-'+n+'" title="'+(i.panelButtons[n].title||"")+'" '+(i.panelButtons[n].id?'id="'+i.panelButtons[n].id+'"':"")+">",window.M&&window.M.toast&&(e+='<i class="material-icons">'+(i.panelButtons[n].icon||"")+"</i>"),e+="</"+t+">";i.moveId&&(e+="<"+t+' class="btn-floating waves-effect waves-light blue treetable-sort" title="'+_("reorder")+'">',window.M&&window.M.toast&&(e+='<i class="material-icons">import_export</i>'),e+="</"+t+">"),e+="</div>"}e+='<div class="row tree-table-body"><table class="tree-table-main">',e+=" <thead>",e+=' <tr class="tree-table-main-header">';for(var a=0;a<i.columns.length;a++)"name"===i.columns[a]?(e+=" <th"+(i.widths&&i.widths[a]?' class="treetable-th-name" style="width: '+i.widths[a]+'"':"")+">",e+=' <input placeholder="'+_("name")+'" class="filter_name treetable-filter" />',e+=' <button data-id="filter_name" role="button" class="filter-clear"></button>',e+=" </th>"):e+=" <th"+(i.widths&&i.widths[a]?' style="width: '+i.widths[a]+'"':"")+">"+_(i.columns[a])+"</th>";i.buttons&&(e+=" <th"+(i.buttonsWidth?' style="width: '+i.buttonsWidth+'"':"")+"></th>"),e+=" </tr>",e+="</thead>",e+="<tbody>";var s=[],o=i.root?new RegExp("^"+i.root.replace(/\./g,"\\.")+"\\."):null,r=-1!==i.columns.indexOf("instance")?[]:null;for(var c in i.objects){var l;if(i.objects.hasOwnProperty(c))if(r&&"instance"===i.objects[c].type&&(l=c.match(/^system\.adapter\.javascript\.(\d+)$/))&&r.push(l[1]),!o||o.test(c)){var d=i.objects[c].common,u={id:c,parent:null,_class:"treetable-"+i.objects[c].type};"channel"===i.objects[c].type&&(u.folder=!0);for(var m=0;m<i.columns.length;m++)if("instance"===i.columns[m])"script"===i.objects[c].type&&(u.instance=d?d.engine.split(".").pop():0);else if(d&&"id"!==i.columns[m]){var g=d[i.columns[m]];void 0!==g&&(u[i.columns[m]]=g)}i.members&&(u.members=d.members),i.colors&&(u.color=d.color),s.push(u)}}s.sort(function(e,t){return e.id>t.id?1:e.id<t.id?-1:0});for(var h=0;h<s.length;h++){var f=s[h].id.split("."),p=f.pop(),b=f.join(".");s[h].title=p;for(var M=0;M<s.length;M++)if(s[M].id===b){s[h].parent=b,s[M].children=s[M].children||[],s[M].children.push(h);break}1===f.length&&(s[h]._class+=" treetable-root")}for(var y=0;y<s.length;y++)s[y].realChildren=!!s[y].children&&!!s[y].children.length;if(i.groups)for(var v=function(e,t){for(var n={},i=0;i<t.length;i++)if(e[t[i]]&&e[t[i]].common&&e[t[i]].common.members)for(var a=e[t[i]].common.members,s=0;s<a.length;s++){n[a[s]]=n[a[s]]||[];var o=e[t[i]].common.name;o&&"object"==typeof o&&(o=o[systemLang]||"en"),n[a[s]].push({id:t[i],name:o||id.replace("system.group.","")})}return n}(i.objects,i.groups),w=s.length-1;0<=w;w--)s[w].groups=v[s[w].id]||[];if(i.members)for(var j=s.length-1;0<=j;j--)if(s[j].members){s[j].children=s[j].children||[];var N=Object.assign([],s[j].members);N.sort();for(var T=0;T<N.length;T++){if(u={id:N[T],title:N[T],parent:s[j].id,_class:"treetable-member"},s[j].children.push(N[T]),i.objects[u.id]){var L=i.objects[u.id].common;if(L){for(var C=0;C<i.columns.length;C++){var D=i.columns[C];if("members"!==D&&"id"!==D&&"title"!==D&&"icon"!==D){var I=L[i.columns[C]];void 0!==I&&(u[D]=I)}}i.colors&&(u.color=d.color)}}s.splice(j+1,0,u)}delete s[j].members}for(var k="",O=0;O<s.length;O++){e+='<tr data-tt-id="'+s[O].id+'"'+(s[O].children?' data-tt-branch="true"':"")+(s[O].parent?' data-tt-parent-id="'+s[O].parent+'"':"")+' class="',s[O]._class&&(e+=s[O]._class+" "),i.draggable&&(e+=i.draggable+" "),s[O].children&&s[O].children.length?e+="not-empty":e+="is-empty",e+='">';for(var E=0;E<i.columns.length;E++){var z=i.columns[E],A="",x=i.classes&&i.classes[E]||"";if("groups"===z&&(x+=" m"),!E&&s[O].hasOwnProperty("children")?(x+=" treetable-folder fancytree-exp-c fancytree-has-children fancytree-ico-cf","script.js.global"===s[O].id?A+=" color: rgb(0, 128, 0);":A+=" color: rgb(0, 0, 128);",e+='<td style="'+A+'" class="'+x+'">',s[O].children&&s[O].children.length&&(e+='<span class="treetable-counter">'+s[O].children.length+"</span>")):e+='<td style="'+A+'" class="'+x+'">',!E&&i.colors&&s[O].color&&(e+='<div style="background: '+s[O].color+'" class="treetable-color"></div>'),!E&&i.icons&&(e+=ne(i.objects[s[O].id],i.imgPath)||'<div class="treetable-icon-empty"> </div>'),"enabled"===z)e+='<input data-attr="'+z+'" data-id="'+s[O].id+'" class="treetable-input" type="checkbox" '+(s[O][z]?"checked":"")+" "+(i.readOnly&&!1!==i.readOnly[E]?"disabled":"")+">";else if("groups"===z)for(var S=0;S<s[O].groups.length;S++){var $=s[O].groups[S].id;e+='<div class="chip">'+ne(i.objects[$],null,"")+s[O].groups[S].name+"</div>"}else if("instance"===z)if(void 0!==s[O].instance&&1<r.length){k='<select class="treetable-instance" data-id="'+s[O].id+'">';for(var Y=0;Y<r.length;Y++)k+='<option value="'+r[Y]+'" '+(r[Y]===s[O].instance?"selected":"")+">"+r[Y]+"</option>";e+=k+="</select>"}else e+="<span>"+(void 0===s[O].instance?"":s[O].instance)+"</span>";else if("icon"===z)e+=ne(i.objects[s[O].id],i.imgPath);else{var R=s[O][z]||"";R&&"object"==typeof R&&R.en&&(R=R[systemLang]||R.en),e+="<span>"+R+"</span>"}e+="</td>"}if(i.buttons){e+='<td class="treetable-buttons" style="'+(i.buttonsStyle||"")+'">';for(var Q="",P=0;P<i.buttons.length;P++)i.buttons[P].match&&!i.buttons[P].match(s[O].id,s[O].parent)?Q+='<div class="treetable-button-empty"> </div>':(Q+="<"+t+' data-id="'+s[O].id+'" class="select-button-'+P+' select-button-custom td-button" style="margin-right: 3px;" data-parent="'+s[O].parent+'" data-children="'+!!s[O].realChildren+'" title="'+(i.buttons[P].title||"")+'">',window.M&&window.M.toast&&(Q+='<i class="material-icons">'+(i.buttons[P].icon||"")+"</i>"),Q+="</"+t+">");e+=Q+"</td>"}e+="</tr>"}e+="</body>";var U=X(this),H=X(e);U.find("span:first-child").remove(),U.find(".treetablelist-buttons").remove(),U.find(".treetable-list").remove(),U.find(".tree-table-buttons").remove(),U.find(".tree-table-main").remove(),U.prepend(H),i.rows=s;var B=X(H[1]).find(">table"),G=X(H[0]);B.data("options",i),B.treetable({expandable:!0,clickableNodeNames:!0,expanderTemplate:"",indenterTemplate:'<span class="fancytree-expander"></span><span class="fancytree-icon"></span>',onNodeExpand:q,onNodeCollapse:ee,stringCollapse:_("collapse"),stringExpand:_("expand")});var F=B.find("tbody");if(F.on("click","tr",function(){X(".selected").not(this).removeClass("selected"),X(this).addClass("selected");var e=X(this).parent().parent().data("options"),t=X(this).data("tt-id");e.onChange&&e.onChange(X(this).data("tt-id"),e.oldId),e.oldId=t}),i.buttons)for(var Z=0;Z<i.buttons.length;Z++){var J=F.find(".select-button-"+Z).button(i.buttons[Z]).on("click",function(){var e=X(this).data("callback");e&&e.call(X(this),X(this).data("id"),X(this).data("children"),X(this).data("parent"))}).data("callback",i.buttons[Z].click).attr("title",i.buttons[Z].title||"");0!==J.length&&(i.buttons[Z].width&&J.css({width:i.buttons[Z].width}),i.buttons[Z].height&&J.css({height:i.buttons[Z].height}))}if(i.panelButtons)for(var W=0;W<i.panelButtons.length;W++){var V=G.find(".btn-custom-"+W);V.on("click",i.panelButtons[W].click).attr("title",i.panelButtons[W].title||""),window.M&&window.M.toast||V.button(i.panelButtons[W]).css({width:24,height:24})}B.find(".filter_name").on("change",function(){var e=X(this).data("timer");e&&clearTimeout(e);var t=X(this);t.data("timer",setTimeout(function(){t.data("timer",null),H.find(".filter_name").val()?t.addClass("input-not-empty"):t.removeClass("input-not-empty"),function(e,t){if(t){t=t.toLowerCase(),e.data("options"),e.find("tr").each(function(){X(this).hasClass("tree-table-main-header")||(X(this).data("tt-branch")||-1!==X(this).find("td:first-child").text().indexOf(t)?X(this).removeClass("filtered-out"):X(this).addClass("filtered-out"))});var n="",i=!1;e.find("tr").each(function(){X(this).data("tt-branch")?(n&&(i?e.find('tr[data-tt-id="'+n+'"]').removeClass("filtered-out"):e.find('tr[data-tt-id="'+n+'"]').addClass("filtered-out")),i=!1,n=X(this).data("tt-id")):n&&(X(this).hasClass("filtered-out")||(i=!0))}),n&&(i?e.find('tr[data-tt-id="'+n+'"]').removeClass("filtered-out"):e.find('tr[data-tt-id="'+n+'"]').addClass("filtered-out"))}else e.find("tr").removeClass("filtered-out")}(X(H[1]),H.find(".filter_name").val())}))}).on("keyup",function(){X(this).trigger("change")}),B.find(".filter-clear").button({icons:{primary:"ui-icon-close"},text:!1}).on("click",function(){var e=X(this).data("id");H.find("."+e).val("").trigger("change")});var K=this;G.find(".treetable-sort").button({icons:{primary:"ui-icon-arrowthick-2-n-s"},text:!1}).css({width:24,height:24}).on("click",function(){te.call(K,i)}),i.onEdit?(B.find(".treetable-instance").on("change",function(){i.onEdit(X(this).data("id"),"instance",X(this).val())}),B.find(".treetable-input").on("change",function(e){var t;e.stopPropagation(),t="checkbox"===X(this).attr("type")?X(this).prop("checked"):X(this).val();var n=X(this).data("id");i.onEdit&&!1===i.onEdit(n,X(this).data("attr"),t)&&X(this).prop("checked",!0)}).on("keyup",function(){X(this).trigger("change")})):B.find(".treetable-instance").prop("disabled",!0),"function"==typeof i.onReady&&i.onReady(B)}function s(){var e=X(this).find(".tree-table-main"),t=e.find(".selected").data("tt-id"),n=e.find(".expanded"),i=[];n.each(function(e){i.push(X(this).data("tt-id"))});var a=e.find(".filter_name").val(),s=e.data("options");p.call(this,s),e=X(this).find(".tree-table-main");for(var o=0;o<i.length;o++)try{e.treetable("expandNode",i[o])}catch(o){}if(t){var r=e.treetable("node",t);r&&e.treetable("reveal",t),r&&r.row&&r.row.addClass("selected")}a&&e.find(".filter_name").val(a).trigger("change")}}(jQuery),systemDictionary={" for %s":{cn:" for %s",en:" for %s"},"%s added to %s":{cn:"%s added to %s",en:"%s added to %s"},"%s processes":{cn:"%s processes",en:"%s processes"},"(without prefix)":{cn:"(without prefix)",en:"(without prefix)"},"1 %d days ago":{cn:"%d days ago",en:"%d days ago"},"2 %d days ago":{cn:"%d days ago",en:"%d days ago"},"5 %d days ago":{cn:"%d days ago",en:"%d days ago"},"A-Z":{cn:"A-Z",en:"A-Z"},"Access control":{cn:"访问控制",en:"Access control"},"Access control list":{cn:"控制列表",en:"Access control list"},Acknowledged:{cn:"Acknowledged",en:"Acknowledged"},"Activated. Click to stop.":{cn:"Activated. Click to stop.",en:"Activated. Click to stop."},"Active instances":{cn:"活跃实例",en:"Active instances"},"Active repository:":{cn:"缺省的软件仓库",en:"Active repository"},"Adapter configuration":{cn:"适配器配置",en:"Adapter configuration"},"Adapter settings for %s states":{cn:"Adapter settings for %s states",en:"Adapter settings for %s states"},Adapters:{cn:"适配器",en:"Adapters"},"Adapters from this Group installed":{cn:"个适配器",en:"Adapters from this group installed"},Add:{cn:"添加",en:"Add"},"Add Objecttree from JSON File":{cn:"Add objects tree from JSON file",en:"Add objects tree from JSON file"},"Add certificate from file":{cn:"Add certificate from file",en:"Add certificate from file"},"Add instance...":{cn:"添加实例...",en:"Adding instance..."},"Add member":{cn:"Add member",en:"Add member"},"Add new child object to selected parent":{cn:"Add new child object to selected parent",en:"Add new child object to selected parent"},"Add new field":{cn:"Add new field",en:"Add new field"},"Add new issue":{cn:"Report a bug",en:"Report a bug"},"Add new object: ":{cn:"Add new object: ",en:"Add new object: "},"Add new object: %s":{cn:"Add new object: %s",en:"Add new object: %s"},"Address:":{cn:"地址",en:"Address"},"Admin is not enabled in cloud settings!":{cn:"Admin is not enabled in cloud settings!",en:"Admin is not enabled in cloud settings!"},Administrator:{cn:"Administrator",en:"Administrator"},All:{cn:"全部",en:"All"},Apr:{cn:"Apr",en:"Apr"},April:{cn:"April",en:"April"},Architecture:{cn:"Architecture",en:"Architecture"},"Are you sure to delete %s?":{cn:'确定删除 <b>"%s"</b>?',en:'Are you sure to delete <b>"%s"</b>?'},'Are you sure to delete <span style="color: red">all</span> children of %s?':{cn:'确定删除 <b>%s</b> <span style="color: red">的全部子项</span>?',en:'Are you sure to delete <span style="color: red">all</span> children of <b>%s</b>?'},"Are you sure to delete all children of %s?":{cn:'你确定删除 <b>"%s"</b> 及 <span style="color: red; font-weight: bold">全部的</span>子项目?',en:'Are you sure to delete <b>"%s"</b> and <span style="color: red; font-weight: bold">all</span> children?'},"Are you sure to delete script %s?":{cn:"你确定删除脚本 '%s'?",en:"Are you sure to delete script '%s'?"},"Are you sure you want to delete adapter %s?":{cn:"你确定删除适配器: %s?",en:"Are you sure you want to delete adapter %s?"},"Are you sure you want to delete the instance <b>%s</b>?":{cn:"你确定要删除这个实例: <b>%s</b>?",en:"Are you sure you want to delete the instance <b>%s</b>?"},"Are you sure?":{cn:"你确定吗?",en:"Are you sure?"},"Are you sure? Changes are not saved.":{cn:"数据没有保存,你确定啊吗?",en:"Are you sure? Changes are not saved."},Aug:{cn:"Aug",en:"Aug"},August:{cn:"August",en:"August"},Available:{cn:"Available",en:"Available"},"Available version:":{cn:"Available version",en:"Available version"},CPUs:{cn:"CPUs",en:"CPUs"},Calendar:{cn:"Calendar",en:"Calendar"},Cancel:{cn:"取消",en:"Cancel"},"Cannot create user: ":{cn:"不能创建 用户: ",en:"Cannot create user: "},"Cannot delete user: ":{cn:"不能删除用户: ",en:"Cannot delete user: "},"Cannot disable admin!":{cn:"不能停用管理员!",en:"Cannot disable admin!"},"Cannot read file!":{cn:"无法读取文件!",en:"Cannot read file!"},"Cannot read version from NPM":{cn:"Could not read version from NPM",en:"Could not read version from NPM"},"Cannot set password: ":{cn:"不能设置密码: ",en:"Cannot set password: "},Certificates:{cn:"证书",en:"Certificates"},Change:{cn:"修改",en:"Change"},Changelog:{cn:"Change log",en:"Change log"},Channel:{cn:"Channel",en:"Channel"},Chart:{cn:"Chart",en:"Chart"},"Chart for %s":{cn:"Chart for %s",en:"Chart for %s"},"Check all":{cn:"检查所有",en:"Check all"},China:{cn:"中国",en:"China"},"City:":{cn:"城市",en:"City"},Clear:{cn:"清除",en:"Clear"},"Clear list":{cn:"清除",en:"Clear list"},"Clear log":{cn:"清除",en:"Clear log"},"Clear on disk permanent":{cn:"Clear on disk permanent",en:"Clear on disk permanent"},"Click do activate events again, or just wait one minute":{cn:"Click do activate events again, or just wait one minute",en:"Click do activate events again, or just wait one minute"},"Click on icon":{cn:"Click on icon to open a link",en:"Click on icon to open a link"},Close:{cn:"关闭",en:"close"},"Collapse all nodes":{cn:"收起全部",en:"Collapse all nodes"},Color:{cn:"颜色",en:"Color"},"Configuration not saved.":{cn:"配置信息没有存储.",en:"Configuration not saved."},"Connected to %s: ":{cn:"Connected to %s: ",en:"Connected to %s: "},"Connected to host: ":{cn:"Connected to host: ",en:"Connected to host: "},"Copy log":{cn:"复制",en:"Copy log"},"Copy to clipboard":{cn:"拷贝",en:"Copy to clipboard"},"Country:":{cn:"国家/地区",en:"Country"},Create:{cn:"创建",en:"Create"},"Create new category":{cn:"Create new category",en:"Create new category"},"Create new category, like %s":{cn:"Create new category, like %s",en:"Create new category, like %s"},"Create new enum":{cn:"创建新的枚举",en:"Create new enum"},"Create new enum, like %s":{cn:"Create new enum, like %s",en:"Create new enum, like %s"},"Create new group":{cn:"Create new group",en:"Create new group"},"Create new user":{cn:"创建新用户",en:"Create new user"},Created:{cn:"Created",en:"Created"},Croatia:{cn:"Croatia",en:"Croatia"},"Cron expression":{cn:"Cron expression",en:"Cron expression"},"Currency:":{cn:"货币",en:"Currency"},Custom:{cn:"自定义",en:"Custom"},D$ecember:{cn:"D$ecember",en:"D$ecember"},"DD.MM.YY":{cn:"DD.MM.YY",en:"DD.MM.YY"},"DD.MM.YYYY":{cn:"DD.MM.YYYY",en:"DD.MM.YYYY"},"DD/MM/YYYY":{cn:"DD/MM/YYYY",en:"DD/MM/YYYY"},"Date From":{cn:"Date From",en:"Date From"},"Date To":{cn:"Date To",en:"Date To"},"Date format:":{cn:"时间格式",en:"Date format"},"Deactivated. Click to start.":{cn:"Deactivated. Click to start.",en:"Deactivated. Click to start."},"Debug outputs:":{cn:"调试输出",en:"Debug outputs"},Dec:{cn:"Dec",en:"Dec"},December:{cn:"December",en:"December"},"Default ACL":{cn:"缺省 ACL",en:"Default ACL"},"Default history instance:":{cn:"缺省的数据记录实例",en:"Default history instance"},"Delete attribute":{cn:"删除",en:"Delete attribute"},"Delete category":{cn:"删除",en:"Delete category"},"Delete enum":{cn:"删除",en:"Delete enum"},"Delete member":{cn:"删除",en:"Delete member"},"Delete object":{cn:"删除",en:"Delete object"},Denmark:{cn:"Denmark",en:"Denmark"},Description:{cn:"说明",en:"Description"},Device:{cn:"Device",en:"Device"},"Device discovery":{cn:"Device discovery",en:"Device discovery"},"Disk free":{cn:"磁盘空闲",en:"Disk free"},"Disk free:":{cn:"磁盘空闲:",en:"Disk free:"},"Disk size":{cn:"磁盘大小",en:"Disk size"},'Do you want to delete just <span style="color: blue">one object</span> or <span style="color: red">all</span> children of %s too?':{cn:'Do you want to delete just <span style="color: blue">one object</span> or <span style="color: red">all</span> children of %s too?',en:'Do you want to delete just <span style="color: blue">one object</span> or <span style="color: red">all</span> children of %s too?'},"Do you want to upgrade all adapters?":{cn:"Do you want to upgrade all adapters?",en:"Do you want to upgrade all adapters?"},"Domains:":{cn:"Domains",en:"Domains"},Dominica:{cn:"Dominica",en:"Dominica"},"Done with error: %s":{cn:"Done with error: %s",en:"Done with error: %s"},"Download log":{cn:"下载",en:"Download log"},"Drop the files here":{cn:"拖放文件到这里",en:"Drop the files here"},"Drop the icons here":{cn:"拖放图标文件到这里",en:"Drop the icons here"},Ecuador:{cn:"Ecuador",en:"Ecuador"},Edit:{cn:"编辑",en:"Edit"},"Edit category":{cn:"编辑 category",en:"Edit category"},"Edit enum":{cn:"编辑 enum",en:"Edit enum"},"Edit in dialog":{cn:"编辑 in dialog",en:"Edit in dialog"},"Edit object":{cn:"编辑 object",en:"Edit object"},Egypt:{cn:"Egypt",en:"Egypt"},"El Salvador":{cn:"El Salvador",en:"El Salvador"},"Email for account:":{cn:"Email for account",en:"Email for account"},Enums:{cn:"枚举",en:"Enums"},Error:{cn:"错误",en:"Error"},Event:{cn:"类型",en:"Type"},Events:{cn:"事件",en:"Events"},Everyone:{cn:"Everyone",en:"Everyone"},"Expand all nodes":{cn:"Expand all nodes",en:"Expand all nodes"},"Failed to open JSON File":{cn:"Failed to open JSON file",en:"Failed to open JSON file"},"Falkland Islands (Malvinas)":{cn:"Falkland Islands (Malvinas)",en:"Falkland Islands (Malvinas)"},"Faroe Islands":{cn:"Faroe Islands",en:"Faroe Islands"},Feb:{cn:"Feb",en:"Feb"},February:{cn:"February",en:"February"},"File is too big!":{cn:"File is too big!",en:"File is too big!"},"File rights":{cn:"File rights",en:"File rights"},"Filter:":{cn:"查找",en:"Filter"},"Filtered out":{cn:"Everything is filtered out",en:"Everything is filtered out"},"Find coordinates...":{cn:"Find coordinates...",en:"Find coordinates..."},"Float divider:":{cn:"小数点",en:"Float divider"},"Free RAM:":{cn:"空闲:",en:"Free:"},Fri:{cn:"Fri",en:"Fri"},From:{cn:"From: ",en:"From: "},"From github":{cn:"软件仓库",en:"From github"},Function:{cn:"Function",en:"Function"},"Generated ID:":{cn:"Generated ID",en:"Generated ID"},"Go to Github...":{cn:"Go to Github...",en:"Go to Github..."},Group:{cn:"Group",en:"Group"},Groups:{cn:"Groups",en:"Groups"},"Has no permission to %s %s %s":{cn:"Has no permission to %s %s %s",en:"Has no permission to %s %s %s"},"Heard and Mc Donald Islands":{cn:"Heard and Mc Donald Islands",en:"Heard and Mc Donald Islands"},"Heartbeat: ":{cn:"心跳: ",en:"Heartbeat: "},"Hong Kong":{cn:"中国香港",en:"Hong Kong"},Host:{cn:"Host",en:"Host"},"Host %s is offline":{cn:"Host %s is offline",en:"Host %s is offline"},"Host:":{cn:"Host",en:"Host"},Hosts:{cn:"Hosts",en:"Hosts"},ID:{cn:"ID",en:"ID"},"Icon upload":{cn:"Icon upload",en:"Icon upload"},"In background":{cn:"后台运行",en:"In background"},Info:{cn:"信息",en:"Info"},Insert:{cn:"插入",en:"Insert"},Install:{cn:"安装",en:"Install"},"Install adapter from URL":{cn:"安装或升级",en:"Install or update the adapter from URL"},"Install adapter from github":{cn:"软件仓库安装或升级",en:"Install or update the adapter from Github"},"Install from custom URL":{cn:"自定义 URL 安装",en:"Install from custom URL"},"Install or update from URL...":{cn:"正在安装...",en:"Install or update from URL..."},"Installation counter":{cn:"Installations counter",en:"Installations counter"},"Installations counter":{cn:"Installations counter",en:"Installations counter"},Installed:{cn:"已安装",en:"Installed"},"Installed from group":{cn:"Installed from group",en:"Installed from group"},"Installed instances":{cn:"已安装的实例",en:"Installed instances"},"Installed version":{cn:"已安装版本",en:"Installed version"},Instances:{cn:"实例",en:"Instances"},Instructions:{cn:"指令",en:"Instructions"},Intro:{cn:"总览",en:"Overview"},"Invalid version of %s":{cn:"Invalid version of %s",en:"Invalid version of %s"},"Invalid version of %s. Required %s":{cn:"Invalid version of %s. Required %s",en:"Invalid version of %s. Required %s"},"Is yet in the list":{cn:"已经在列表中",en:"It's already in the list"},Jan:{cn:"Jan",en:"Jan"},January:{cn:"January",en:"January"},Jul:{cn:"七月",en:"Jul"},July:{cn:"July",en:"July"},Jun:{cn:"Jun",en:"Jun"},June:{cn:"June",en:"June"},"Known bugs for":{cn:"Known bugs for",en:"Known bugs for"},"Last changed":{cn:"上次修改",en:"Last changed"},"Last update":{cn:"上次更新",en:"Last update"},"Latitude:":{cn:"纬度",en:"Latitude"},"Let's Encrypt settings":{cn:"Let's Encrypt settings",en:"Let's Encrypt settings"},"Let's encrypt SSL":{cn:"Let's encrypt SSL",en:"Let's encrypt SSL"},License:{cn:"许可",en:"License"},"License terms":{cn:"许可条款",en:"License terms"},"Listen on all IPs":{cn:"Listen on all IPs",en:"Listen on all IPs"},"Loading...":{cn:"正在加载...",en:"Loading..."},Log:{cn:"日志",en:"Log"},"Log file will be deleted. Are you sure?":{cn:"日志文件将被删除,你确定吗?",en:"Log file will be deleted. Are you sure?"},"Log size:":{cn:"文件大小",en:"Log size"},"Login timeout(sec):":{cn:"登录超时 (秒)",en:"Login timeout (sec)"},Logout:{cn:"退出",en:"Logout"},"Longitude:":{cn:"经度",en:"Longitude"},MB:{cn:"Mb",en:"Mb"},Main:{cn:"Main",en:"Main"},"Main settings":{cn:"主设置",en:"Main settings"},"Manually created":{cn:"手工创建",en:"Manually created"},Mar:{cn:"三月",en:"Mar"},March:{cn:"三月",en:"March"},Members:{cn:"Members",en:"Members"},Message:{cn:"消息",en:"Message"},"Message buffer overflow. Losing oldest":{cn:"Message buffer overflow. Losing oldest.",en:"Message buffer overflow. Losing oldest."},Model:{cn:"Model",en:"Model"},Mon:{cn:"Mon",en:"Mon"},NPM:{cn:"NPM",en:"NPM"},Name:{cn:"名称",en:"Name"},"Name:":{cn:"名称",en:"Name"},New:{cn:"新建",en:"New"},"New category":{cn:"新类别",en:"New category"},"New enum":{cn:"新类别",en:"New enum"},"New group":{cn:"新群组",en:"New group"},"New object":{cn:"新对象",en:"New object"},"New objekt":{cn:"新对象",en:"New object"},"New user":{cn:"新用户",en:"New user"},"No data":{cn:"暂无数据",en:"No data"},"No states selected!":{cn:"No states selected!",en:"No states selected!"},"No version of %s":{cn:"No version of %s",en:"No version of %s"},"Node.js":{cn:"Node.js",en:"Node.js"},Norway:{cn:"Norway",en:"Norway"},"Not exists":{cn:"不存在",en:"Does not exist"},"Note:":{cn:"Note",en:"Note"},Nov:{cn:"十一月",en:"Nov"},November:{cn:"十一月",en:"November"},OS:{cn:"OS",en:"OS"},'Object "<b>%s</b>" does not exists. Update the page.':{cn:'Object "<b>%s</b>" 不存在,请刷新.',en:'Object "<b>%s</b>" does not exist. Update the page.'},"Object may not be deleted":{cn:"对象不能被删除",en:"Object may not be deleted"},"Object rights":{cn:"对象权限",en:"Object rights"},Objects:{cn:"对象",en:"Objects"},Oct:{cn:"十月",en:"Oct"},October:{cn:"十月",en:"October"},Ok:{cn:"确认",en:"Ok"},"Only one":{cn:"Only one",en:"Only one"},"Open original":{cn:"在新标签中打开",en:"Open on new tab"},Owner:{cn:"Owner",en:"Owner"},"Owner group":{cn:"Owner group",en:"Owner group"},"Owner user":{cn:"Owner user",en:"Owner user"},Parent:{cn:"Parent",en:"Parent"},"Parse error":{cn:"Parse error",en:"Parse error"},Password:{cn:"密码",en:"Password"},"Password and confirmation are not equal!":{cn:"Password and confirmation are not equal!",en:"Password and confirmation are not equal!"},"Password cannot be empty!":{cn:"密码不能为空!",en:"Password cannot be empty!"},"Password repeat":{cn:"Password repeat",en:"Password repeat"},"Path to storage:":{cn:"存储路径",en:"Path to storage"},"Pause output":{cn:"暂停输出",en:"Pause output"},Platform:{cn:"平台",en:"Platform"},"Please confirm":{cn:"请确认",en:"Please confirm"},"Port to check the domain:":{cn:"Port to check the domain",en:"Port to check the domain"},"Preserve ID":{cn:"Preserve ID",en:"Preserve ID"},Preview:{cn:"Preview",en:"Preview"},"Processing...":{cn:"处理中...",en:"Processing..."},RAM:{cn:"内存",en:"RAM"},"RAM total usage:":{cn:"总内存使用:",en:"Total RAM usage:"},"RAM usage":{cn:"使用内存",en:"RAM usage"},"Rebuild tree":{cn:"重建",en:"Rebuild tree"},"Recently updated":{cn:"Recently updated",en:"Recently updated"},"Refresh log":{cn:"刷新",en:"Refresh log"},Removed:{cn:"已删除",en:"Removed"},"Removing of adapter...":{cn:"Removing of adapter...",en:"Removing of adapter..."},"Removing of instance...":{cn:"Removing of instance...",en:"Removing of instance..."},Rename:{cn:"重命名",en:"Rename"},Repositories:{cn:"软件仓库",en:"Repositories"},Rights:{cn:"权限",en:"Access rights"},Role:{cn:"角色",en:"Role"},Room:{cn:"场景",en:"Room"},"Running: ":{cn:"Running: ",en:"Running: "},"Sao Tome and Principe":{cn:"Sao Tome and Principe",en:"Sao Tome and Principe"},Sat:{cn:"星期六",en:"Sat"},Save:{cn:"保存",en:"Save"},"Save Objecttree as JSON File":{cn:"Save objects tree as JSON file",en:"Save objects tree as JSON file"},"Save Objecttree is not possible":{cn:"Saving the objects tree is not possible",en:"Saving the objects tree is not possible"},"Save configuration":{cn:"保存配置",en:"Save configuration"},Script:{cn:"脚本",en:"Script"},Scripts:{cn:"脚本",en:"Scripts"},Select:{cn:"Select",en:"Select"},"Select ID":{cn:"Select ID",en:"Select ID"},"Select adapter:":{cn:"选择适配器",en:"Select adapter"},"Select language":{cn:"选择语言",en:"Select language"},"Select options":{cn:"选项",en:"Select options"},"Sent data:":{cn:"Sent data",en:"Sent data"},Sep:{cn:"九月",en:"Sep"},September:{cn:"九月",en:"September"},Set:{cn:"Set",en:"Set"},"Set CRON":{cn:"Set",en:"Set"},"Set CRON schedule for restarts":{cn:"Set CRON schedule for restarts",en:"Set CRON schedule for restarts"},Settings:{cn:"设置",en:"Settings"},"Settings for %s":{cn:"Settings for %s",en:"Settings for %s"},Seychelles:{cn:"Seychelles",en:"Seychelles"},"Show instances only for current host":{cn:"Show instances only for current host",en:"Show instances only for current host"},"Show values of instance":{cn:"Show values of instance",en:"Show values of instance"},"Show...":{cn:"显示...",en:"Show..."},"Size: %s, Available: %s":{cn:"大小: %s, 剩余: %s"},"Some data are not stored. Discard?":{cn:"有一些修改了的配置信息没有保存. 确认码?",en:"Some data are not stored. Discard?"},"Sort alphabetically":{cn:"Sort alphabetically by name",en:"Sort alphabetically by name"},"Started...":{cn:"Started...",en:"Started..."},State:{cn:"Datapoint",en:"Datapoint"},"State type":{cn:"State type",en:"State type"},States:{cn:"状态",en:"States"},"States rights":{cn:"状态权限",en:"States rights"},Statistics:{cn:"统计",en:"Statistics"},"Statistics:":{cn:"统计",en:"Statistics"},"Storage of %s":{cn:'Storage of <span class="name">%s</span>',en:'Storage of <span class="name">%s</span>'},"Storage of %s states":{cn:'Storage of <span class="name">%s</span> states',en:'Storage of <span class="name">%s</span> states'},"Success!":{cn:"成功!",en:"Success!"},Suggestion:{cn:"推荐",en:"Recommendation"},Sun:{cn:"星期天",en:"Sun"},System:{cn:"系统",en:"System"},"System language:":{cn:"语言",en:"System language"},"System settings":{cn:"系统设置",en:"System settings"},"System uptime":{cn:"System uptime",en:"System uptime"},Table:{cn:"Table",en:"Table"},Taiwan:{cn:"中国台湾",en:"Taiwan"},"Temperature units:":{cn:"温度单位",en:"Temperature units"},'This version of node.js "%s" on "%s" is deprecated. Please install node.js 6, 8 or newer':{cn:'yunkong2 supports the LTS versions 6, 8, 10 or newer of node.js. Please update your version ("%s") on host "%s" to one of the supported versions. We recommend to use Node.js 6.',en:'yunkong2 supports the LTS versions 6, 8, 10 or newer of node.js. Please update your version ("%s") on host "%s" to one of the supported versions. We recommend to use Node.js 6.'},Thu:{cn:"Thu",en:"Thu"},Time:{cn:"Time",en:"Time"},"Time From":{cn:"Time From",en:"Time From"},"Time To":{cn:"Time To",en:"Time To"},"Time stamp":{cn:"Time stamp",en:"Time stamp"},Title:{cn:"标题",en:"Title"},To:{cn:"To",en:"To"},Today:{cn:"今日",en:"Today"},"Toggle expert mode":{cn:"切换模式",en:"Toggle expert mode"},"Toggle states view":{cn:"切换状态视图",en:"Toggle the states view"},"Too many events":{cn:"Too many events",en:"Too many events"},"Total count in group":{cn:"Total count in group",en:"Total count in group"},"Trigger event":{cn:"触发事件",en:"Trigger event"},Type:{cn:"Type",en:"Type"},"URL or file path:":{cn:"URL或安装包路径",en:"URL or file path"},"Unknown file format!":{cn:"Unknown file format!",en:"Unknown file format!"},"Unsupported image format":{cn:"Unsupported image format",en:"Unsupported image format"},Update:{cn:"更新",en:"Update"},"Update objects":{cn:"更新",en:"Update objects"},"Update states":{cn:"更新",en:"Update states"},Updated:{cn:"已更新",en:"Updated"},"Upgrade all adapters":{cn:"升级所有适配器",en:"Upgrade all adapters"},Upload:{cn:"文件上传",en:"File upload"},"Upload admin started":{cn:"Upload of configuration is started",en:"Upload of configuration is started"},"Upload started...":{cn:"上传开始...",en:"Upload started..."},Uptime:{cn:"Uptime",en:"Uptime"},Uruguay:{cn:"Uruguay",en:"Uruguay"},"Use Lets Encrypt certificates:":{cn:"Use Let's Encrypt certificates",en:"Use Let's Encrypt certificates"},"Use this instance for automatic update:":{cn:"Use this instance for automatic update",en:"Use this instance for automatic update"},User:{cn:"用户",en:"User"},"User deleted":{cn:"用户以删除",en:"User deleted"},"User does not exist":{cn:"这个用户不存在",en:"User does not exist"},"User yet exists":{cn:"这个用户已经存在",en:"User already exists"},Users:{cn:"用户",en:"Users"},Value:{cn:"Value",en:"Value"},"Values of %s":{cn:"Values of %s",en:"Values of %s"},"Vatican City State":{cn:"Vatican City State",en:"Vatican City State"},Wed:{cn:"Wed",en:"Wed"},With:{cn:"With",en:"With"},Without:{cn:"Without",en:"Without"},"You are going to add new instance: ":{cn:"You are going to add new instance: ",en:"You are going to add new instance: "},"You can check changelog here":{cn:'You can check the changelog <a href="https://git.spacen.net/yunkong2/yunkong2.js-controller/blob/master/CHANGELOG.md" target="_blank">here</a>',en:'You can check the changelog <a href="https://github.com/yunkong2/yunkong2.js-controller/blob/master/CHANGELOG.md" target="_blank">here</a>'},"You can drag&drop the devices, channels and states to enums":{cn:"You can drag&drop the devices, channels and states to enums",en:"You can drag&drop the devices, channels and states to enums"},"You can drag&drop users to groups":{cn:"You can drag&drop users to groups",en:"You can drag&drop users to groups"},"You can't see events via cloud":{cn:"You can't see events via cloud",en:"You can't see events via cloud"},"Your home":{cn:"Your home",en:"Your home"},_All:{cn:"全部",en:"All"},"_Toggle expert mode":{cn:"切换模式",en:"Toggle expert mode"},__different__:{cn:"different",en:"different"},"a-z":{cn:"a-z",en:"a-z"},ack:{cn:"ack",en:"ack"},actions:{cn:"actions",en:"actions"},active:{cn:"active",en:"active"},"adapter with updates":{cn:"adapters with updates",en:"adapters with updates"},"adapters count":{cn:"适配器数",en:"adapters count"},add:{cn:"添加",en:"Add"},"add children":{cn:"添加子节点",en:"add children"},"add instance":{cn:"添加实例",en:"add instance"},"add repository":{cn:"添加仓库",en:"add repository"},agree:{cn:"同意",en:"agree"},alarm_group:{cn:"Alarm",en:"Alarm"},alive:{cn:"alive",en:"alive"},all:{cn:"all",en:"all"},alpha:{cn:"alpha",en:"alpha"},array:{cn:"array",en:"array"},auto:{cn:"auto",en:"auto"},available:{cn:"最新",en:"available"},beta:{cn:"beta",en:"beta"},boolean:{cn:"boolean",en:"boolean"},bug:{cn:"bugtracker",en:"bugtracker"},cancel:{cn:"取消",en:"Cancel"},cert_path_note:{cn:"You can use an absolute path to the certificate, like '/opt/certs/cert.pem', or just upload it per drag&drop",en:"You can use an absolute path to the certificate, like '/opt/certs/cert.pem', or just upload it per drag&drop"},certificate:{cn:"certificate",en:"certificate"},"change view mode":{cn:"模式",en:"change view mode"},channel:{cn:"channel",en:"channel"},clear:{cn:"清除",en:"clear"},"climate-control_group":{cn:"Climate Control",en:"Climate Control"},"close on ready":{cn:"完成后自动关闭",en:"close on ready"},collapse:{cn:"收起",en:"collapse"},"collapse all":{cn:"收起",en:"collapse all"},comma:{cn:"comma",en:"comma"},"command execution":{cn:"执行命令 ",en:"Command execution"},common:{cn:"公共",en:"common"},"common adapters_group":{cn:"公共",en:"Common"},common_color:{cn:"颜色",en:"color"},common_def:{cn:"缺省值",en:"default value"},common_desc:{cn:"说明",en:"description"},common_icon:{cn:"图标",en:"icon"},common_max:{cn:"最大值",en:"max value"},common_min:{cn:"最小值",en:"minimal value"},common_read:{cn:"允许读",en:"read allowed"},common_role:{cn:"角色",en:"role"},common_states:{cn:"预定义值",en:"predefined values"},common_type:{cn:"类型",en:"type"},common_unit:{cn:"量度单位",en:"measure unit"},common_write:{cn:"允许写",en:"write allowed"},communication_group:{cn:"通信",en:"Communication"},config:{cn:"设置",en:"Settings"},"config instance":{cn:"配置实例",en:"config instance"},"confirm password":{cn:"密码确认",en:"Confirm password"},connected:{cn:"已连接",en:"connected"},copy:{cn:"复制",en:"copy"},"copy note":{cn:"Press Ctrl+A and Ctrl+C to copy the log to the clipboard and click with the mouse anywhere to close.",en:"Press Ctrl+A and Ctrl+C to copy the log to the clipboard and click with the mouse anywhere to close."},"create operation":{cn:"创建",en:"create"},"custom enum":{cn:"自定义枚举",en:"?ustom enum"},"custom group":{cn:"自定义群组",en:"Custom group"},daemon:{cn:"daemon",en:"daemon"},"date-and-time_group":{cn:"日期和时间",en:"Date and Time"},daysShortText:{cn:"d.",en:"d."},debug:{cn:"debug",en:"debug"},delete:{cn:"删除",en:"delete"},"delete adapter":{cn:"删除",en:"delete adapter"},"delete group":{cn:"删除",en:"delete group"},"delete instance":{cn:"删除",en:"delete instance"},"delete operation":{cn:"删除",en:"delete"},"delete script":{cn:"删除",en:"delete script"},"delete user":{cn:"删除",en:"delete user"},desc:{cn:"desc",en:"desc"},description:{cn:"说明",en:"Description"},device:{cn:"device",en:"device"},"diag-note":{cn:"We worked hard to create this project. In return we expect from you some usage statistics.<br>Every time the adapter list is updated, the anonymized statistics are sent. We respect your privacy, so no private information will be transmitted.<br>Thank you!",en:"We worked hard to create this project. In return we expect from you some usage statistics.<br>Every time the adapter list is updated, the anonymized statistics are sent. We respect your privacy, so no private information will be transmitted.<br>Thank you!"},edit:{cn:"编辑",en:"edit"},"edit enum":{cn:"编辑",en:"edit enum"},"edit file":{cn:"编辑",en:"edit file"},"edit group":{cn:"编辑",en:"edit group"},"edit instance":{cn:"编辑",en:"edit instance"},"edit script":{cn:"编辑",en:"edit script"},"edit user":{cn:"修改",en:"edit user"},"edit value":{cn:"编辑",en:"Edit value"},enabled:{cn:"enabled",en:"enabled"},energy_group:{cn:"能源",en:"Energy"},engine:{cn:"engine",en:"engine"},"engine type":{cn:"engine type",en:"engine type"},error:{cn:"错误",en:"error"},events:{cn:"events",en:"events"},"execute operation":{cn:"Execute operation",en:"Execute operation"},expand:{cn:"展开",en:"expand"},"expand all":{cn:"展开所有",en:"expand all"},extended:{cn:"extended",en:"extended"},false:{cn:"false",en:"false"},"file permissions":{cn:"文件许可",en:"File permissions"},from:{cn:"来自",en:"from"},garden_group:{cn:"农业",en:"Garden"},general_group:{cn:"基本",en:"General"},geoposition_group:{cn:"地理位置",en:"Geo position"},groups:{cn:"groups",en:"groups"},hardware_group:{cn:"硬件",en:"Hardware"},history:{cn:"数据",en:"history"},"history data":{cn:"数据",en:"history data"},host:{cn:"主机",en:"host"},household_group:{cn:"Household",en:"Household"},"http operation":{cn:"http",en:"http"},id:{cn:"ID",en:"ID"},info:{cn:"信息",en:"info"},infrastructure_group:{cn:"环境",en:"Infrastructure"},install:{cn:"安装",en:"install"},"install specific version":{cn:"安装指定版本",en:"Install a specific version"},installed:{cn:"已安装",en:"installed"},"installed adapters":{cn:"Filter adapters with existing instances",en:"Filter adapters with existing instances"},instance:{cn:"实例",en:"instance"},"instance number":{cn:"Desired instance number",en:"Desired instance number"},"yunkong2 Enums":{cn:"yunkong2 enums",en:"yunkong2 enums"},"yunkong2 States":{cn:"yunkong2 states",en:"yunkong2 states"},"yunkong2 adapter instances":{cn:"yunkong2 adapter instances",en:"yunkong2 adapter instances"},"yunkong2 adapter scripts":{cn:"yunkong2 adapter scripts",en:"yunkong2 adapter scripts"},"yunkong2 adapters":{cn:"yunkong2 adapters",en:"yunkong2 adapters"},"yunkong2 certificates":{cn:"yunkong2 certificates",en:"yunkong2 certificates"},"yunkong2 groups":{cn:"yunkong2 groups",en:"yunkong2 groups"},"yunkong2 hosts":{cn:"yunkong2 hosts",en:"yunkong2 hosts"},"yunkong2 repositories":{cn:"yunkong2 repositories",en:"yunkong2 repositories"},"yunkong2 users":{cn:"yunkong2 users",en:"yunkong2 users"},"iot-system_group":{cn:"物联网",en:"IoT systems"},"iot-systems_group":{cn:"物联网系统",en:"IoT Systems"},keywords:{cn:"关键字",en:"keywords"},lc:{cn:"Last change",en:"Last change"},less:{cn:"精简",en:"less"},letsnecrypt_help:{cn:'This are settings for Let\'s Encrypt account. To get the free certificates for your domain. You can read more <a href="https://letsencrypt.org/" target="_blank">here</a>.',en:'This are settings for Let\'s Encrypt account. To get the free certificates for your domain. You can read more <a href="https://letsencrypt.org/" target="_blank">here</a>.'},letsnecrypt_help_domains:{cn:"E.g: 'example.com, www.example.com'",en:"E.g: 'example.com, www.example.com'"},letsnecrypt_help_email:{cn:"Please use your email address. It will be used for your account.",en:"Please use your email address. It will be used for your account."},letsnecrypt_help_path:{cn:"Directory name where the certificates will be stored. This is always relative to configuration directory",en:"Directory name where the certificates will be stored. This is always relative to configuration directory"},license:{cn:"许可",en:"license"},"license agreement":{cn:"许可协议",en:"license agreement"},"license not agree":{cn:"不同意!",en:"Do not agree with the license!"},license_checkbox:{cn:"同意全部的许可条款",en:"I agree with the collection of anonymous statistics.<br>(This can be disabled in settings)"},lighting_group:{cn:"照明",en:"Lighting"},link:{cn:"link",en:"link"},list:{cn:"list",en:"list"},"list operation":{cn:"list elements",en:"list elements"},logic_group:{cn:"逻辑",en:"Logic"},loglevel:{cn:"loglevel",en:"loglevel"},media_group:{cn:"媒体",en:"Media"},members:{cn:"members",en:"members"},memlimit:{cn:"RAM limit",en:"RAM limit"},message:{cn:"消息",en:"message"},messaging_group:{cn:"信使",en:"Messaging"},"misc-data_group":{cn:"Misc. data",en:"Misc. data"},mixed:{cn:"mixed",en:"mixed"},mode:{cn:"mode",en:"mode"},more:{cn:"详细",en:"more"},multi:{cn:"multistate",en:"multistate"},multimedia_group:{cn:"多媒体",en:"Multimedia"},name:{cn:"名称",en:"name"},native:{cn:"原生",en:"native"},network_group:{cn:"网络",en:"Network"},"new certificate":{cn:"new certificate",en:"new certificate"},"new group":{cn:"new group",en:"new group"},"new script":{cn:"new script",en:"new script"},"new user":{cn:"新建用户",en:"new user"},newObject:{cn:"New object",en:"New object"},"no-city":{cn:"no city",en:"no city"},"node-red":{cn:"node-red",en:"node-red"},none:{cn:"none",en:"none"},normal:{cn:"normal",en:"normal"},"not ack":{cn:"not ack",en:"not ack"},"not agree":{cn:"不同意",en:"not agree"},"npm error":{cn:"npm error",en:"npm error"},number:{cn:"number",en:"number"},object:{cn:"object",en:"object"},"object permissions":{cn:"Object permissions",en:"Object permissions"},of:{cn:"/",en:"of"},ok:{cn:"确定",en:"Ok"},"open web page":{cn:"Open web page of adapter",en:"Open web page of adapter"},os:{cn:"OS",en:"operating system"},"other permissions":{cn:"Other permissions",en:"Other permissions"},"parent name":{cn:"parent name",en:"parent name"},password:{cn:"密码",en:"Password"},permissionError:{cn:"Permission error",en:"Permission error"},planned:{cn:"planned",en:"planned"},platform:{cn:"平台",en:"platform"},point:{cn:"point",en:"point"},process:{cn:"process",en:"process"},protocols_group:{cn:"协议",en:"Protocols"},raw:{cn:"Raw (开发)",en:"Raw (experts only)"},read:{cn:"read",en:"read"},"read operation":{cn:"read",en:"read"},readme:{cn:"readme",en:"readme"},reload:{cn:"刷新",en:"reload"},"reload instance":{cn:"reload instance",en:"reload instance"},rest:{cn:"复位 (read only)",en:"rest (read only)"},restart:{cn:"自动重启",en:"auto restart"},"restart script":{cn:"重启脚本",en:"restart script"},role:{cn:"角色",en:"role"},save:{cn:"保存",en:"save"},schedule_group:{cn:"计划",en:"Schedule"},script_group:{cn:"逻辑和脚本",en:"Scripts and Logic"},"select member by double click":{cn:"select member by double clicking",en:"select member by double clicking"},"sendto operation":{cn:"Send-to operation",en:"Send-to operation"},service_group:{cn:"Maintenance",en:"Maintenance"},severity:{cn:"安防",en:"severity"},stable:{cn:"stable",en:"stable"},state:{cn:"state",en:"state"},"state permissions":{cn:"状态许可",en:"State permissions"},storage_group:{cn:"存储",en:"Storage"},string:{cn:"string",en:"string"},subscribe:{cn:"subscribe",en:"subscribe"},switch:{cn:"switch",en:"switch"},terminal:{cn:"Terminal",en:"Terminal"},"third-party_group":{cn:"第三方",en:"Third party"},"this adapter does not allow multiple instances":{cn:"这个适配器不允许运行多个实例",en:"This adapter does not allow multiple instances"},title:{cn:"标题",en:"title"},today:{cn:"今日",en:"today"},true:{cn:"true",en:"true"},ts:{cn:"时间",en:"Timestamp"},type:{cn:"type",en:"type"},unit:{cn:"unit",en:"unit"},update:{cn:"更新",en:"update"},"update adapter information":{cn:"update adapter information",en:"update adapter information"},"update-part1":{cn:"Because yunkong2 runs on many very different platforms, only manual updating is possible at the moment. To start the manual update, please go to your controller via console and execute the following:",en:"Because yunkong2 runs on many very different platforms, only manual updating is possible at the moment. To start the manual update, please go to your controller via console and execute the following:"},updated:{cn:"已更新",en:"updated"},updates:{cn:"updates",en:"updates"},upload:{cn:"上传",en:"Upload"},"user permissions":{cn:"用户权限",en:"user permissions"},users:{cn:"用户",en:"users"},"users permissions":{cn:"用户权限",en:"User permissions"},utility_group:{cn:"公用",en:"Utility"},val:{cn:"val",en:"val"},value:{cn:"value",en:"value"},"value.from":{cn:"Changed from",en:"Changed from"},"value.lc":{cn:"Last change",en:"Last change"},"value.q":{cn:"Quality code",en:"Quality code"},"value.ts":{cn:"Timestamp",en:"Timestamp"},"value.val":{cn:"value",en:"value"},version:{cn:"版本",en:"version"},vis_group:{cn:"yunkong2.vis",en:"yunkong2.vis"},visualisation_group:{cn:"可视化",en:"Visualisation"},"visualization-icons_group":{cn:"可视化 图标",en:"Visualization Icons"},"visualization-widgets_group":{cn:"可视化 部件",en:"Visualization Widgets"},visualization_group:{cn:"可视化",en:"Visualisation"},warn:{cn:"warn",en:"warn"},weather_group:{cn:"气候",en:"Weather"},wetty:{cn:"Wetty",en:"Wetty"},write:{cn:"write",en:"write"},"write operation":{cn:"write",en:"write"},yesterday:{cn:"昨天",en:"yesterday"},"%s object(s) processed":{cn:"%s objects were processed",en:"%s objects were processed"},"%s was imported":{cn:"%s was imported",en:"%s was imported"},"Ignore warning":{cn:"Ignore warning",en:"Ignore warning"},Filter:{cn:"Filter",en:"Filter"},Afghanistan:{cn:"Afghanistan",en:"Afghanistan"},Albania:{cn:"Albania",en:"Albania"},Algeria:{cn:"Algeria",en:"Algeria"},"American Samoa":{cn:"American Samoa",en:"American Samoa"},Andorra:{cn:"Andorra",en:"Andorra"},Angola:{cn:"Angola",en:"Angola"},Anguilla:{cn:"Anguilla",en:"Anguilla"},Antarctica:{cn:"Antarctica",en:"Antarctica"},"Antigua and Barbuda":{cn:"Antigua and Barbuda",en:"Antigua and Barbuda"},Argentina:{cn:"Argentina",en:"Argentina"},Armenia:{cn:"Armenia",en:"Armenia"},Aruba:{cn:"Aruba",en:"Aruba"},Australia:{cn:"Australia",en:"Australia"},Austria:{cn:"Austria",en:"Austria"},"Authentication was deactivated":{cn:"Authentication was deactivated",en:"Authentication was deactivated"},Azerbaijan:{cn:"Azerbaijan",en:"Azerbaijan"},Background:{cn:"Background",en:"Background"},"Background color of the login screen":{cn:"Background color of the login screen",en:"Background color of the login screen"},"Background image":{cn:"Background image",en:"Background image"},Bahamas:{cn:"Bahamas",en:"Bahamas"},Bahrain:{cn:"Bahrain",en:"Bahrain"},Bangladesh:{cn:"Bangladesh",en:"Bangladesh"},Barbados:{cn:"Barbados",en:"Barbados"},Belarus:{cn:"Belarus",en:"Belarus"},Belgium:{cn:"Belgium",en:"Belgium"},Belize:{cn:"Belize",en:"Belize"},Benin:{cn:"Benin",en:"Benin"},Bermuda:{cn:"Bermuda",en:"Bermuda"},Bhutan:{cn:"Bhutan",en:"Bhutan"},Bolivia:{cn:"Bolivia",en:"Bolivia"},"Bosnia and Herzegovina":{cn:"Bosnia and Herzegovina",en:"Bosnia and Herzegovina"},Botswana:{cn:"Botswana",en:"Botswana"},"Bouvet Island":{cn:"Bouvet Island",en:"Bouvet Island"},Brazil:{cn:"Brazil",en:"Brazil"},"British Indian Ocean Territory":{cn:"British Indian Ocean Territory",en:"British Indian Ocean Territory"},"Brunei Darussalam":{cn:"Brunei Darussalam",en:"Brunei Darussalam"},Bulgaria:{cn:"Bulgaria",en:"Bulgaria"},"Burkina Faso":{cn:"Burkina Faso",en:"Burkina Faso"},Burundi:{cn:"Burundi",en:"Burundi"},Cambodia:{cn:"Cambodia",en:"Cambodia"},Cameroon:{cn:"Cameroon",en:"Cameroon"},Canada:{cn:"Canada",en:"Canada"},"Cape Verde":{cn:"Cape Verde",en:"Cape Verde"},"Cayman Islands":{cn:"Cayman Islands",en:"Cayman Islands"},"Central African Republic":{cn:"Central African Republic",en:"Central African Republic"},Chad:{cn:"Chad",en:"Chad"},Chile:{cn:"Chile",en:"Chile"},"Christmas Island":{cn:"Christmas Island",en:"Christmas Island"},"Cocos Islands":{cn:"Cocos Islands",en:"Cocos Islands"},Colombia:{cn:"Colombia",en:"Colombia"},Comoros:{cn:"Comoros",en:"Comoros"},Congo:{cn:"Congo",en:"Congo"},"Cook Islands":{cn:"Cook Islands",en:"Cook Islands"},"Costa Rica":{cn:"Costa Rica",en:"Costa Rica"},Cuba:{cn:"Cuba",en:"Cuba"},Cyprus:{cn:"Cyprus",en:"Cyprus"},"Czech Republic":{cn:"Czech Republic",en:"Czech Republic"},"Disable authentication":{cn:"Disable authentication",en:"Disable authentication"},Djibouti:{cn:"Djibouti",en:"Djibouti"},"Dominican Republic":{cn:"Dominican Republic",en:"Dominican Republic"},"East Timor":{cn:"East Timor",en:"East Timor"},"Enabled:":{cn:"Enabled",en:"Enabled"},"Equatorial Guinea":{cn:"Equatorial Guinea",en:"Equatorial Guinea"},Eritrea:{cn:"Eritrea",en:"Eritrea"},Estonia:{cn:"Estonia",en:"Estonia"},Ethiopia:{cn:"Ethiopia",en:"Ethiopia"},Fiji:{cn:"Fiji",en:"Fiji"},Finland:{cn:"Finland",en:"Finland"},France:{cn:"France",en:"France"},"French Guiana":{cn:"French Guiana",en:"French Guiana"},"French Polynesia":{cn:"French Polynesia",en:"French Polynesia"},"French Southern Territories":{cn:"French Southern Territories",en:"French Southern Territories"},Gabon:{cn:"Gabon",en:"Gabon"},Gambia:{cn:"Gambia",en:"Gambia"},Georgia:{cn:"Georgia",en:"Georgia"},Germany:{cn:"Germany",en:"Germany"},Ghana:{cn:"Ghana",en:"Ghana"},Gibraltar:{cn:"Gibraltar",en:"Gibraltar"},Greece:{cn:"Greece",en:"Greece"},Greenland:{cn:"Greenland",en:"Greenland"},Grenada:{cn:"Grenada",en:"Grenada"},Guadeloupe:{cn:"Guadeloupe",en:"Guadeloupe"},Guam:{cn:"Guam",en:"Guam"},Guatemala:{cn:"Guatemala",en:"Guatemala"},Guernsey:{cn:"Guernsey",en:"Guernsey"},Guinea:{cn:"Guinea",en:"Guinea"},"Guinea-Bissau":{cn:"Guinea-Bissau",en:"Guinea-Bissau"},Guyana:{cn:"Guyana",en:"Guyana"},Haiti:{cn:"Haiti",en:"Haiti"},Honduras:{cn:"Honduras",en:"Honduras"},Hungary:{cn:"Hungary",en:"Hungary"},Iceland:{cn:"Iceland",en:"Iceland"},India:{cn:"India",en:"India"},Indonesia:{cn:"Indonesia",en:"Indonesia"},Iran:{cn:"Iran",en:"Iran"},Iraq:{cn:"Iraq",en:"Iraq"},Ireland:{cn:"Ireland",en:"Ireland"},"Isle of Man":{cn:"Isle of Man",en:"Isle of Man"},Israel:{cn:"Israel",en:"Israel"},Italy:{cn:"Italy",en:"Italy"},"Ivory Coast":{cn:"Ivory Coast",en:"Ivory Coast"},Jamaica:{cn:"Jamaica",en:"Jamaica"},Japan:{cn:"Japan",en:"Japan"},Jersey:{cn:"Jersey",en:"Jersey"},Jordan:{cn:"Jordan",en:"Jordan"},Kazakhstan:{cn:"Kazakhstan",en:"Kazakhstan"},Kenya:{cn:"Kenya",en:"Kenya"},Kiribati:{cn:"Kiribati",en:"Kiribati"},Korea:{cn:"Korea",en:"Korea"},Kosovo:{cn:"Kosovo",en:"Kosovo"},Kuwait:{cn:"Kuwait",en:"Kuwait"},Kyrgyzstan:{cn:"Kyrgyzstan",en:"Kyrgyzstan"},"Lao People's Democratic Republic":{cn:"Lao People's Democratic Republic",en:"Lao People's Democratic Republic"},Latvia:{cn:"Latvia",en:"Latvia"},Lebanon:{cn:"Lebanon",en:"Lebanon"},Lesotho:{cn:"Lesotho",en:"Lesotho"},Liberia:{cn:"Liberia",en:"Liberia"},"Libyan Arab Jamahiriya":{cn:"Libyan Arab Jamahiriya",en:"Libyan Arab Jamahiriya"},Liechtenstein:{cn:"Liechtenstein",en:"Liechtenstein"},Lithuania:{cn:"Lithuania",en:"Lithuania"},Luxembourg:{cn:"Luxembourg",en:"Luxembourg"},Macau:{cn:"Macau",en:"Macau"},Macedonia:{cn:"Macedonia",en:"Macedonia"},Madagascar:{cn:"Madagascar",en:"Madagascar"},Mai:{cn:"Mai",en:"Mai"},Malawi:{cn:"Malawi",en:"Malawi"},Malaysia:{cn:"Malaysia",en:"Malaysia"},Maldives:{cn:"Maldives",en:"Maldives"},Mali:{cn:"Mali",en:"Mali"},Malta:{cn:"Malta",en:"Malta"},"Marshall Islands":{cn:"Marshall Islands",en:"Marshall Islands"},Martinique:{cn:"Martinique",en:"Martinique"},Mauritania:{cn:"Mauritania",en:"Mauritania"},Mauritius:{cn:"Mauritius",en:"Mauritius"},Mayotte:{cn:"Mayotte",en:"Mayotte"},Mexico:{cn:"Mexico",en:"Mexico"},Micronesia:{cn:"Micronesia",en:"Micronesia"},Moldova:{cn:"Moldova",en:"Moldova"},Monaco:{cn:"Monaco",en:"Monaco"},Mongolia:{cn:"Mongolia",en:"Mongolia"},Montenegro:{cn:"Montenegro",en:"Montenegro"},Montserrat:{cn:"Montserrat",en:"Montserrat"},Morocco:{cn:"Morocco",en:"Morocco"},Mozambique:{cn:"Mozambique",en:"Mozambique"},Myanmar:{cn:"Myanmar",en:"Myanmar"},Namibia:{cn:"Namibia",en:"Namibia"},Nauru:{cn:"Nauru",en:"Nauru"},Nepal:{cn:"Nepal",en:"Nepal"},Netherlands:{cn:"Netherlands",en:"Netherlands"},"Netherlands Antilles":{cn:"Netherlands Antilles",en:"Netherlands Antilles"},"New Caledonia":{cn:"New Caledonia",en:"New Caledonia"},"New Zealand":{cn:"New Zealand",en:"New Zealand"},Nicaragua:{cn:"Nicaragua",en:"Nicaragua"},Niger:{cn:"Niger",en:"Niger"},Nigeria:{cn:"Nigeria",en:"Nigeria"},Niue:{cn:"Niue",en:"Niue"},"Norfolk Island":{cn:"Norfolk Island",en:"Norfolk Island"},"Northern Mariana Islands":{cn:"Northern Mariana Islands",en:"Northern Mariana Islands"},Oman:{cn:"Oman",en:"Oman"},Pakistan:{cn:"Pakistan",en:"Pakistan"},Palau:{cn:"Palau",en:"Palau"},Palestine:{cn:"Palestine",en:"Palestine"},Panama:{cn:"Panama",en:"Panama"},"Papua New Guinea":{cn:"Papua New Guinea",en:"Papua New Guinea"},Paraguay:{cn:"Paraguay",en:"Paraguay"},Peru:{cn:"Peru",en:"Peru"},Philippines:{cn:"Philippines",en:"Philippines"},Pitcairn:{cn:"Pitcairn",en:"Pitcairn"},Poland:{cn:"Poland",en:"Poland"},Popular:{cn:"Popular",en:"Popular"},"Popular first":{cn:"Popular first",en:"Popular first"},Portugal:{cn:"Portugal",en:"Portugal"},"Puerto Rico":{cn:"Puerto Rico",en:"Puerto Rico"},Qatar:{cn:"Qatar",en:"Qatar"},Reunion:{cn:"Reunion",en:"Reunion"},Romania:{cn:"Romania",en:"Romania"},"Russian Federation":{cn:"Russian Federation",en:"Russian Federation"},Rwanda:{cn:"Rwanda",en:"Rwanda"},"Saint Kitts and Nevis":{cn:"Saint Kitts and Nevis",en:"Saint Kitts and Nevis"},"Saint Lucia":{cn:"Saint Lucia",en:"Saint Lucia"},"Saint Vincent and the Grenadines":{cn:"Saint Vincent and the Grenadines",en:"Saint Vincent and the Grenadines"},Samoa:{cn:"Samoa",en:"Samoa"},"San Marino":{cn:"San Marino",en:"San Marino"},"Saudi Arabia":{cn:"Saudi Arabia",en:"Saudi Arabia"},Senegal:{cn:"Senegal",en:"Senegal"},Serbia:{cn:"Serbia",en:"Serbia"},Slovakia:{cn:"Slovakia",en:"Slovakia"},Slovenia:{cn:"Slovenia",en:"Slovenia"},"Solomon Islands":{cn:"Solomon Islands",en:"Solomon Islands"},Somalia:{cn:"Somalia",en:"Somalia"},"South Africa":{cn:"South Africa",en:"South Africa"},"South Georgia South Sandwich Islands":{cn:"South Georgia South Sandwich Islands",en:"South Georgia South Sandwich Islands"},Spain:{cn:"Spain",en:"Spain"},Speed:{cn:"Speed",en:"Speed"},"Sri Lanka":{cn:"Sri Lanka",en:"Sri Lanka"},"St. Helena":{cn:"St. Helena",en:"St. Helena"},"St. Pierre and Miquelon":{cn:"St. Pierre and Miquelon",en:"St. Pierre and Miquelon"},Sudan:{cn:"Sudan",en:"Sudan"},Suriname:{cn:"Suriname",en:"Suriname"},"Svalbard and Jan Mayen Islands":{cn:"Svalbard and Jan Mayen Islands",en:"Svalbard and Jan Mayen Islands"},Swaziland:{cn:"Swaziland",en:"Swaziland"},Sweden:{cn:"Sweden",en:"Sweden"},Switzerland:{cn:"Switzerland",en:"Switzerland"},"Syrian Arab Republic":{cn:"Syrian Arab Republic",en:"Syrian Arab Republic"},Tajikistan:{cn:"Tajikistan",en:"Tajikistan"},Tanzania:{cn:"Tanzania",en:"Tanzania"},Thailand:{cn:"Thailand",en:"Thailand"},Togo:{cn:"Togo",en:"Togo"},Tokelau:{cn:"Tokelau",en:"Tokelau"},Tonga:{cn:"Tonga",en:"Tonga"},"Trinidad and Tobago":{cn:"Trinidad and Tobago",en:"Trinidad and Tobago"},Tue:{cn:"Tue",en:"Tue"},Tunisia:{cn:"Tunisia",en:"Tunisia"},Turkey:{cn:"Turkey",en:"Turkey"},Turkmenistan:{cn:"Turkmenistan",en:"Turkmenistan"},"Turks and Caicos Islands":{cn:"Turks and Caicos Islands",en:"Turks and Caicos Islands"},Tuvalu:{cn:"Tuvalu",en:"Tuvalu"},Uganda:{cn:"Uganda",en:"Uganda"},Ukraine:{cn:"Ukraine",en:"Ukraine"},"Uncheck All":{cn:"Uncheck All",en:"Uncheck All"},"United Arab Emirates":{cn:"United Arab Emirates",en:"United Arab Emirates"},"United Kingdom":{cn:"United Kingdom",en:"United Kingdom"},"United States":{cn:"United States",en:"United States"},"United States minor outlying islands":{cn:"United States minor outlying islands",en:"United States minor outlying islands"},Unsecure_Auth:{cn:"The password will be sent via unsecure connection. To protect your passwords enable the secure connection (HTTPS)!",en:"The password will be sent via unsecure connection. To protect your passwords enable the secure connection (HTTPS)!"},Uzbekistan:{cn:"Uzbekistan",en:"Uzbekistan"},Vanuatu:{cn:"Vanuatu",en:"Vanuatu"},Venezuela:{cn:"Venezuela",en:"Venezuela"},Vietnam:{cn:"Vietnam",en:"Vietnam"},"Virgin Islands (British)":{cn:"Virgin Islands (British)",en:"Virgin Islands (British)"},"Virgin Islands (U.S.)":{cn:"Virgin Islands (U.S.)",en:"Virgin Islands (U.S.)"},"Wallis and Futuna Islands":{cn:"Wallis and Futuna Islands",en:"Wallis and Futuna Islands"},"Warning!":{cn:"Warning!",en:"Warning!"},"Western Sahara":{cn:"Western Sahara",en:"Western Sahara"},Yemen:{cn:"Yemen",en:"Yemen"},Zaire:{cn:"Zaire",en:"Zaire"},Zambia:{cn:"Zambia",en:"Zambia"},Zimbabwe:{cn:"Zimbabwe",en:"Zimbabwe"},silly:{cn:"silly",en:"silly"},"Sierra Leone":{en:"Sierra Leone"},Singapore:{en:"Singapore"},"Size: %s, Free: %s":{en:"Size: %s, Available: %s"},"edit enums":{en:"Edit enumerations for"},"place here":{en:"place the files here"},popular:{en:"popular"}};
|
||
//# sourceMappingURL=app.js.map
|