From 74f7428a42007aac34e74cb6898fdfc084224c84 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sun, 30 Mar 2025 15:05:58 +0200 Subject: [PATCH 01/56] [EasyColorCode] Updates April 2025 --- static/espeasy.js | 4 ++-- static/espeasy.min.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/static/espeasy.js b/static/espeasy.js index 4f88e42eb..010fb6ce3 100644 --- a/static/espeasy.js +++ b/static/espeasy.js @@ -7,7 +7,7 @@ var commonKeywords = ["If", "Else", "Elseif", "Endif"]; var commonCommands = ["AccessInfo", "Background", "Build", "ClearAccessBlock", "ClearRTCam", "Config", "ControllerDisable", "ControllerEnable", "DateTime", "Debug", "Dec", "DeepSleep", "DisablePriorityTask", "DNS", "DST", "EraseSDKWiFi", "ExecuteRules", "FactoryReset", "Gateway", "I2Cscanner", "Inc", "IP", "Let", "Load", "LogEntry", "LogPortStatus", "LoopTimerSet", "LoopTimerSet_ms", "LoopTimerSetAndRun", "LoopTimerSetAndRun_ms", "MemInfo", "MemInfoDetail", "Name", "Password", "PostToHTTP", "Publish", "PublishR", - "Reboot", "Save", "SendTo", "SendToHTTP", "SendToUDP", "Settings", "Subnet", "Subscribe", "TaskClear", "TaskClearAll", + "Reboot", "Save", "SendTo", "SendToHTTP", "SendToUDP", "SendToUDPMix", "Settings", "Subnet", "Subscribe", "TaskClear", "TaskClearAll", "TaskDisable", "TaskEnable", "TaskRun", "TaskValueSet", "TaskValueSetAndRun", "TimerPause", "TimerResume", "TimerSet", "TimerSet_ms", "TimeZone", "UdpPort", "UdpTest", "Unit", "UseNTP", "WdConfig", "WdRead", "WiFi", "WiFiAllowAP", "WiFiAPMode", "WiFiConnect", "WiFiDisconnect", "WiFiKey", "WiFiKey2", "WiFiMode", "WiFiScan", "WiFiSSID", "WiFiSSID2", "WiFiSTAMode", @@ -33,7 +33,7 @@ var commonPlugins = [ "PCFGPIO", "PCFGPIOToggle", "PCFLongPulse", "PCFLongPulse_ms", "PCFPulse", "Status,PCF", "Monitor,PCF", "MonitorRange,PCF", "UnMonitorRange,PCF", "UnMonitor,PCF", "PCFGPIORange", "PCFGPIOpattern", "PCFMode", "PCFmodeRange", //P020/P044 - "SerialSend", "SerialSendMix", "Ser2NetClientSend", + "SerialSend", "SerialSendMix", "Ser2NetClientSend", "SerialSend_test", //P022 "pcapwm", "pcafrq", "mode2", //P023 diff --git a/static/espeasy.min.js b/static/espeasy.min.js index 7c4c13172..06a90bcf7 100644 --- a/static/espeasy.min.js +++ b/static/espeasy.min.js @@ -1 +1 @@ -var commonAtoms=["And","Or"],commonKeywords=["If","Else","Elseif","Endif"],commonCommands=["AccessInfo","Background","Build","ClearAccessBlock","ClearRTCam","Config","ControllerDisable","ControllerEnable","DateTime","Debug","Dec","DeepSleep","DisablePriorityTask","DNS","DST","EraseSDKWiFi","ExecuteRules","FactoryReset","Gateway","I2Cscanner","Inc","IP","Let","Load","LogEntry","LogPortStatus","LoopTimerSet","LoopTimerSet_ms","LoopTimerSetAndRun","LoopTimerSetAndRun_ms","MemInfo","MemInfoDetail","Name","Password","PostToHTTP","Publish","PublishR","Reboot","Save","SendTo","SendToHTTP","SendToUDP","Settings","Subnet","Subscribe","TaskClear","TaskClearAll","TaskDisable","TaskEnable","TaskRun","TaskValueSet","TaskValueSetAndRun","TimerPause","TimerResume","TimerSet","TimerSet_ms","TimeZone","UdpPort","UdpTest","Unit","UseNTP","WdConfig","WdRead","WiFi","WiFiAllowAP","WiFiAPMode","WiFiConnect","WiFiDisconnect","WiFiKey","WiFiKey2","WiFiMode","WiFiScan","WiFiSSID","WiFiSSID2","WiFiSTAMode","Event","AsyncEvent","GPIO","GPIOToggle","LongPulse","LongPulse_mS","Monitor","Pulse","PWM","Servo","Status","Tone","RTTTL","UnMonitor","Provision","Provision,Config","Provision,Security","Provision,Notification","Provision,Provision","Provision,Rules,","Provision,CustomCdnUrl","Provision,Firmware,"],commonEvents=["Clock#Time","Login#Failed","MQTT#Connected","MQTT#Disconnected","MQTTimport#Connected","MQTTimport#Disconnected","Rules#Timer","System#Boot","System#BootMode","System#Sleep","System#Wake","TaskExit#","TaskInit#","ThingspeakReply","Time#Initialized","Time#Set","WiFi#APmodeDisabled","WiFi#APmodeEnabled","WiFi#ChangedAccesspoint","WiFi#ChangedWiFichannel","WiFi#Connected","WiFi#Disconnected","ProvisionFirmware"],commonPlugins=["ResetPulseCounter","SetPulseCounterTotal","LogPulseStatistic","analogout","MCPGPIO","MCPGPIOToggle","MCPLongPulse","MCPLongPulse_ms","MCPPulse","Status,MCP","Monitor,MCP","MonitorRange,MCP","UnMonitorRange,MCP","UnMonitor,MCP","MCPGPIORange","MCPGPIOPattern","MCPMode","MCPModeRange","ExtGpio","ExtPwm","ExtPulse","ExtLongPulse","Status,EXT,","LCDCmd","LCD","PCFGPIO","PCFGPIOToggle","PCFLongPulse","PCFLongPulse_ms","PCFPulse","Status,PCF","Monitor,PCF","MonitorRange,PCF","UnMonitorRange,PCF","UnMonitor,PCF","PCFGPIORange","PCFGPIOpattern","PCFMode","PCFmodeRange","SerialSend","SerialSendMix","Ser2NetClientSend","pcapwm","pcafrq","mode2","OLED","OLEDCMD","OLEDCMD,on","OLEDCMD,off","OLEDCMD,clear","IRSEND","IRSENDAC","OledFramedCmd","OledFramedCmd,Display","OledFramedCmd,low","OledFramedCmd,med","OledFramedCmd,high","OledFramedCmd,Frame","OledFramedCmd,linecount","OledFramedCmd,leftalign","OledFramedCmd,align","OledFramedCmd,userDef1","OledFramedCmd,userDef2","NeoPixel","NeoPixelAll","NeoPixelLine","NeoPixelHSV","NeoPixelAllHSV","NeoPixelLineHSV","NeoPixelBright","MotorShieldCmd,DCMotor","MotorShieldCmd,Stepper","MHZCalibrateZero","MHZReset","MHZABCEnable","MHZABCDisable","Sensair_SetRelay","PMSX003","PMSX003,Wake","PMSX003,Sleep","PMSX003,Reset","encwrite","Play","Vol","Eq","Mode","Repeat","tareChanA","tareChanB","7dn","7dst","7dsd","7dtext","7ddt","7dt","7dtfont","7dtbin","7don","7doff","7output","HLWCalibrate","HLWReset","csecalibrate","cseclearpulses","csereset","WemosMotorShieldCMD","LolinMotorShieldCMD","GPS","GPS,Sleep","GPS,Wake","GPS#GotFix","GPS#LostFix","GPS#Travelled","homieValueSet","SerialProxy_Write","SerialProxy_WriteMix","SerialProxy_Test","HeatPumpir","MitsubishiHP","MitsubishiHP,temperature","MitsubishiHP,power","MitsubishiHP,mode","MitsubishiHP,fan","MitsubishiHP,vane","MitsubishiHP,widevane","Culreader_Write","Touch","Touch,Rot","Touch,Flip","Touch,Enable","Touch,Disable","Touch,On","Touch,Off","Touch,Toggle","Touch,Setgrp","Touch,Incgrp","Touch,Decgrp","Touch,Incpage","Touch,Decpage","Touch,Updatebutton","WakeOnLan","DotMatrix","DotMatrix,clear","DotMatrix,update","DotMatrix,size","DotMatrix,txt","DotMatrix,settxt","DotMatrix,content","DotMatrix,alignment","DotMatrix,anim.in","DotMatrix,anim.out","DotMatrix,speed","DotMatrix,pause","DotMatrix,font","DotMatrix,layout","DotMatrix,inverted","DotMatrix,specialeffect","DotMatrix,offset","DotMatrix,brightness","DotMatrix,repeat","DotMatrix,setbar","DotMatrix,bar","Thermo","Thermo,Up","Thermo,Down","Thermo,Mode","Thermo,ModeBtn","Thermo,Setpoint","Max1704xclearalert","scdgetabc","scdgetalt","scdgettmp","scdsetcalibration","scdsetfrc","scdgetinterval","multirelay","multirelay,on","multirelay,off","multirelay,set","multirelay,get","multirelay,loop","ShiftOut","ShiftOut,Set","ShiftOut,SetNoUpdate","ShiftOut,Update","ShiftOut,SetAll","ShiftOut,SetAllNoUpdate","ShiftOut,SetAllLow","ShiftOut,SetAllHigh","ShiftOut,SetChipCount","ShiftOut,SetHexBin","cdmrst","nfx","nfx,off","nfx,on","nfx,dim","nfx,line,","nfx,hsvline,","nfx,one,","nfx,hsvone,","nfx,all,","nfx,rgb,","nfx,fade,","nfx,hsv,","nfx,colorfade,","nfx,rainbow","nfx,kitt,","nfx,comet,","nfx,theatre,","nfx,scan,","nfx,dualscan,","nfx,twinkle,","nfx,twinklefade,","nfx,sparkle,","nfx,wipe,","nfx,dualwipe","nfx,fire","nfx,fireflicker","nfx,faketv","nfx,simpleclock","nfx,stop","nfx,statusrequest","nfx,fadetime,","nfx,fadedelay,","nfx,speed,","nfx,count,","nfx,bgcolor","ShiftIn","ShiftIn,PinEvent","ShiftIn,ChipEvent","ShiftIn,SetChipCount","ShiftIn,SampleFrequency","ShiftIn,EventPerPin","scd4x","scd4x,storesettings","scd4x,facoryreset","scd4x,selftest","scd4x,setfrc,","axp","axp,ldo2","axp,ldo3","axp,ldoio","axp,gpio0","axp,gpio1","axp,gpio2","axp,gpio3","axp,gpio4","axp,dcdc2","axp,dcdc3","axp,ldo2map","axp,ldo3map","axp,ldoiomap","axp,dcdc2map","axp,dcdc3map","axp,ldo2perc","axp,ldo3perc","axp,ldoioperc","axp,dcdc2perc","axp,dcdc3perc","I2CEncoder","I2CEncoder,bright","I2CEncoder,led1","I2CEncoder,led2","I2CEncoder,gain","I2CEncoder,set","cachereader","cachereader,readpos","cachereader,sendtaskinfo","cachereader,flush","tm1621","tm1621,write,","tm1621,writerow,","tm1621,voltamp,","tm1621,energy,","tm1621,celcius,","tm1621,fahrenheit,","tm1621,humidity,","tm1621,raw,","dac","dac,1","dac,2","sht4x","sht4x,startup","ld2410","ld2410,factoryreset","ld2410,logall","digipot","digipot,reset","digipot,shutdown","digipot,","7dextra","7dbefore","7dgroup","7digit","7color","7digitcolor","7groupcolor","gp8403","gp8403,volt,","gp8403,mvolt,","gp8403,range,","gp8403,preset,","gp8403,init,","sen5x","sen5x,startclean","sen5x,techlog,","as3935","as3935,clearstats","as3935,calibrate","as3935,setgain,","as3935,setnf,","as3935,setwd,","as3925,setsrej,"],pluginDispKind=["tft","ili9341","ili9342","ili9481","ili9486","ili9488","epd","eink","epaper","il3897","uc8151d","ssd1680","ws2in7","ws1in54","st77xx","st7735","st7789","st7796","neomatrix","neo","pcd8544"],pluginDispCmd=["cmd,on","cmd,off","cmd,clear","cmd,backlight","cmd,bright","cmd,deepsleep","cmd,seq_start","cmd,seq_end","cmd,inv","cmd,rot",",clear",",rot",",tpm",",txt",",txp",",txz",",txc",",txs",",txtfull",",asciitable",",font",",l",",lh",",lv",",lm",",lmr",",r",",rf",",c",",cf",",rf",",t",",tf",",rr",",rrf",",px",",pxh",",pxv",",bmp",",btn",",win",",defwin",",delwin"],commonTag=["On","Do","Endon"],commonNumber=["toBin","toHex","Constrain","XOR","AND:","OR:","Ord","bitRead","bitSet","bitClear","bitWrite","urlencode"],commonMath=["Log","Ln","Abs","Exp","Sqrt","Sq","Round","Sin","Cos","Tan","aSin","aCos","aTan","Sin_d","Cos_d","Tan_d","aSin_d","aCos_d","aTan_d","map","mapc"],commonWarning=["delay","Delay","ResetFlashWriteCounter"],taskSpecifics=["settings.Enabled","settings.Interval","settings.ValueCount","settings.Controller1.Enabled","settings.Controller2.Enabled","settings.Controller3.Enabled","settings.Controller1.Idx","settings.Controller2.Idx","settings.Controller3.Idx"],AnythingElse=["%eventvalue%","%eventpar%","%eventname%","%sysname%","%bootcause%","%systime%","%systm_hm%","%systm_hm_0%","%systm_hm_sp%","%systime_am%","%systime_am_0%","%systime_am_sp%","%systm_hm_am%","%systm_hm_am_0%","%systm_hm_am_sp%","%lcltime%","%sunrise%","%s_sunrise%","%m_sunrise%","%sunset%","%s_sunset%","%m_sunset%","%lcltime_am%","%syshour%","%syshour_0%","%sysmin%","%sysmin_0%","%syssec%","%syssec_0%","%sysday%","%sysday_0%","%sysmonth%","%sysmonth_0%","%sysyear%","%sysyear_0%","%sysyears%","%sysweekday%","%sysweekday_s%","%unixtime%","%uptime%","%uptime_ms%","%rssi%","%ip%","%unit%","%unit_0%","%ssid%","%bssid%","%wi_ch%","%iswifi%","%vcc%","%mac%","%mac_int%","%isntp%","%ismqtt%","%dns%","%dns1%","%dns2%","%flash_freq%","%flash_size%","%flash_chip_vendor%","%flash_chip_model%","%fs_free%","%fs_size%","%cpu_id%","%cpu_freq%","%cpu_model%","%cpu_rev%","%cpu_cores%","%board_name%","%inttemp%","%islimited_build%","%isvar_double%","substring","indexOf","indexOf_ci","equals","equals_ci","strtol","timeToMin","timeToSec","%ethwifimode%","%ethconnected%","%ethduplex%","%ethspeed%","%ethstate%","%ethspeedstate%","%c_w_dir%","%c_c2f%","%c_ms2Bft%","%c_dew_th%","%c_alt_pres_sea%","%c_sea_pres_alt%","%c_cm2imp%","%c_mm2imp%","%c_m2day%","%c_m2dh%","%c_m2dhm%","%c_s2dhms%","%c_2hex%","%c_u2ip%","%c_uname%","%c_uage%","%c_ubuild%","%c_ubuildstr%","%c_uload%","%c_utype%","%c_utypestr%","var","int"];for(const e of pluginDispKind)commonPlugins=commonPlugins.concat(e);for(const e of pluginDispKind)for(const t of pluginDispCmd){let n=e+t;commonPlugins=commonPlugins.concat(n)}var rEdit,EXTRAWORDS=commonAtoms.concat(commonPlugins,commonKeywords,commonCommands,commonEvents,commonTag,commonNumber,commonMath,commonWarning,taskSpecifics,AnythingElse);function initCM(){CodeMirror.commands.autocomplete=function(e){e.showHint({hint:CodeMirror.hint.anyword})},(rEdit=CodeMirror.fromTextArea(document.getElementById("rules"),{tabSize:2,indentWithTabs:!1,lineNumbers:!0,autoCloseBrackets:!0,extraKeys:{"Ctrl-Space":"autocomplete",Tab:e=>{"null"===e.getMode().name?e.execCommand("insertTab"):e.somethingSelected()?e.execCommand("indentMore"):e.execCommand("insertSoftTab")},"Shift-Tab":e=>e.execCommand("indentLess")}})).on("change",(function(){rEdit.save()})),rEdit.on("inputRead",(function(e,t){var n=e.getCursor(),o=e.getTokenAt(n);/[\w%,.]/.test(t.text)&&"comment"!=o.type&&e.showHint({completeSingle:!1})}))}!function(e){"object"==typeof exports&&"object"==typeof module?e(require("codemirror")):"function"==typeof define&&define.amd?define(["codemirror"],e):e(CodeMirror)}((function(e){"use strict";e.defineMode("espeasy",(function(){var e={};function t(t,n){for(var o=0;oe.toLowerCase()));commonCommands=commonCommands.concat(n);var o=commonEvents.map((e=>e.toLowerCase()));commonEvents=commonEvents.concat(o);var i=commonPlugins.map((e=>e.toLowerCase()));commonPlugins=commonPlugins.concat(i);var r=commonAtoms.map((e=>e.toLowerCase()));commonAtoms=commonAtoms.concat(r);var a=commonKeywords.map((e=>e.toLowerCase()));commonKeywords=commonKeywords.concat(a);var s=commonTag.map((e=>e.toLowerCase()));commonTag=commonTag.concat(s);var c=commonNumber.map((e=>e.toLowerCase()));commonNumber=commonNumber.concat(c);var l=commonMath.map((e=>e.toLowerCase()));commonMath=commonMath.concat(l);var m=AnythingElse.map((e=>e.toLowerCase()));AnythingElse=AnythingElse.concat(m);var d=taskSpecifics.map((e=>e.toLowerCase()));function u(t,n){if(t.eatSpace())return null;t.sol();var o=t.next();if(/\d/.test(o)){if("0"==o)return"x"===t.next()?(t.eatWhile(/\w/),"number"):(t.eatWhile(/\d|\./),"number");if(t.eatWhile(/\d|\./),!t.match("d")&&!t.match("output")&&(t.eol()||/\D/.test(t.peek())))return"number"}if(/\w/.test(o))for(const e of EXTRAWORDS){let n=e.substring(1);(e.includes(":")||e.includes(",")||e.includes("."))&&t.match(n)}if(/\w/.test(o)&&(t.eatWhile(/[\w]/),t.match(".gpio")||t.match(".pulse")||t.match(".frq")||t.match(".pwm")))return"def";if("\\"===o)return t.next(),null;if("("===o||")"===o)return"bracket";if("{"===o||"}"===o||":"===o)return"number";if("/"==o)return/\//.test(t.peek())?(t.skipToEnd(),"comment"):"operator";if("'"==o&&(t.eatWhile(/[^']/),t.match("'")))return"attribute";if("+"===o||"="===o||"<"===o||">"===o||"-"===o||","===o||"*"===o||"!"===o)return"operator";if("%"==o){if(/\d/.test(t.next()))return"number";if(t.eatWhile(/[^\s\%]/),t.match("%"))return"hr"}if("["==o&&(t.eatWhile(/[^\s\]]/),t.eat("]")))return"hr";t.eatWhile(/\w/);var i=t.current();return/\w/.test(o)&&t.match("#")?(t.eatWhile(/[\w.#]/),"events"):"#"===o?(t.eatWhile(/\w/),"number"):e.hasOwnProperty(i)?e[i]:null}function f(e,t){return(t.tokens[0]||u)(e,t)}return taskSpecifics=taskSpecifics.concat(d),t("atom",commonAtoms),t("keyword",commonKeywords),t("builtin",commonCommands),t("events",commonEvents),t("def",commonPlugins),t("tag",commonTag),t("number",commonNumber),t("bracket",commonMath),t("warning",commonWarning),t("hr",AnythingElse),t("comment",taskSpecifics),{startState:function(){return{tokens:[]}},token:function(e,t){return f(e,t)},closeBrackets:"[]{}''\"\"``()",lineComment:"//",fold:"brace"}}))})),function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],mod):e(CodeMirror)}((function(e){var t={pairs:"()[]{}''\"\"",closeBefore:")]}'\":;>",triples:"",explode:"[]{}"},n=e.Pos;function o(e,n){return"pairs"==n&&"string"==typeof e?e:"object"==typeof e&&null!=e[n]?e[n]:t[n]}e.defineOption("autoCloseBrackets",!1,(function(t,n,a){a&&a!=e.Init&&(t.removeKeyMap(i),t.state.closeBrackets=null),n&&(r(o(n,"pairs")),t.state.closeBrackets=n,t.addKeyMap(i))}));var i={Backspace:function(t){var i=s(t);if(!i||t.getOption("disableInput"))return e.Pass;for(var r=o(i,"pairs"),a=t.listSelections(),c=0;c=0;c--){var d=a[c].head;t.replaceRange("",n(d.line,d.ch-1),n(d.line,d.ch+1),"+delete")}},Enter:function(t){var n=s(t),i=n&&o(n,"explode");if(!i||t.getOption("disableInput"))return e.Pass;for(var r=t.listSelections(),a=0;a1&&p.indexOf(i)>=0&&t.getRange(n(M.line,M.ch-2),M)==i+i){if(M.ch>2&&/\bstring/.test(t.getTokenTypeAt(n(M.line,M.ch-2))))return e.Pass;S="addFour"}else if(h){var T=0==M.ch?" ":t.getRange(n(M.line,M.ch-1),M);if(e.isWordChar(b)||T==i||e.isWordChar(T))return e.Pass;S="both"}else{if(!x||!(0===b.length||/\s/.test(b)||f.indexOf(b)>-1))return e.Pass;S="both"}else S=h&&d(t,M)?"both":p.indexOf(i)>=0&&t.getRange(M,n(M.line,M.ch+3))==i+i+i?"skipThree":"skip";if(u){if(u!=S)return e.Pass}else u=S}var y=m%2?a.charAt(m-1):i,v=m%2?i:a.charAt(m+1);t.operation((function(){if("skip"==u)c(t,1);else if("skipThree"==u)c(t,3);else if("surround"==u){for(var e=t.getSelections(),n=0;n0?{line:a.head.line,ch:a.head.ch+t}:{line:a.head.line-1};n.push({anchor:s,head:s})}e.setSelections(n,i)}function l(t){var o=e.cmpPos(t.anchor,t.head)>0;return{anchor:new n(t.anchor.line,t.anchor.ch+(o?-1:1)),head:new n(t.head.line,t.head.ch+(o?1:-1))}}function m(e,t){var o=e.getRange(n(t.line,t.ch-1),n(t.line,t.ch+1));return 2==o.length?o:null}function d(e,t){var o=e.getTokenAt(n(t.line,t.ch+1));return/\bstring/.test(o.type)&&o.start==t.ch&&(0==t.ch||!/\bstring/.test(e.getTokenTypeAt(t)))}r(t.pairs+"`")})); \ No newline at end of file +var commonAtoms=["And","Or"],commonKeywords=["If","Else","Elseif","Endif"],commonCommands=["AccessInfo","Background","Build","ClearAccessBlock","ClearRTCam","Config","ControllerDisable","ControllerEnable","DateTime","Debug","Dec","DeepSleep","DisablePriorityTask","DNS","DST","EraseSDKWiFi","ExecuteRules","FactoryReset","Gateway","I2Cscanner","Inc","IP","Let","Load","LogEntry","LogPortStatus","LoopTimerSet","LoopTimerSet_ms","LoopTimerSetAndRun","LoopTimerSetAndRun_ms","MemInfo","MemInfoDetail","Name","Password","PostToHTTP","Publish","PublishR","Reboot","Save","SendTo","SendToHTTP","SendToUDP","SendToUDPMix","Settings","Subnet","Subscribe","TaskClear","TaskClearAll","TaskDisable","TaskEnable","TaskRun","TaskValueSet","TaskValueSetAndRun","TimerPause","TimerResume","TimerSet","TimerSet_ms","TimeZone","UdpPort","UdpTest","Unit","UseNTP","WdConfig","WdRead","WiFi","WiFiAllowAP","WiFiAPMode","WiFiConnect","WiFiDisconnect","WiFiKey","WiFiKey2","WiFiMode","WiFiScan","WiFiSSID","WiFiSSID2","WiFiSTAMode","Event","AsyncEvent","GPIO","GPIOToggle","LongPulse","LongPulse_mS","Monitor","Pulse","PWM","Servo","Status","Tone","RTTTL","UnMonitor","Provision","Provision,Config","Provision,Security","Provision,Notification","Provision,Provision","Provision,Rules,","Provision,CustomCdnUrl","Provision,Firmware,"],commonEvents=["Clock#Time","Login#Failed","MQTT#Connected","MQTT#Disconnected","MQTTimport#Connected","MQTTimport#Disconnected","Rules#Timer","System#Boot","System#BootMode","System#Sleep","System#Wake","TaskExit#","TaskInit#","ThingspeakReply","Time#Initialized","Time#Set","WiFi#APmodeDisabled","WiFi#APmodeEnabled","WiFi#ChangedAccesspoint","WiFi#ChangedWiFichannel","WiFi#Connected","WiFi#Disconnected","ProvisionFirmware"],commonPlugins=["ResetPulseCounter","SetPulseCounterTotal","LogPulseStatistic","analogout","MCPGPIO","MCPGPIOToggle","MCPLongPulse","MCPLongPulse_ms","MCPPulse","Status,MCP","Monitor,MCP","MonitorRange,MCP","UnMonitorRange,MCP","UnMonitor,MCP","MCPGPIORange","MCPGPIOPattern","MCPMode","MCPModeRange","ExtGpio","ExtPwm","ExtPulse","ExtLongPulse","Status,EXT,","LCDCmd","LCD","PCFGPIO","PCFGPIOToggle","PCFLongPulse","PCFLongPulse_ms","PCFPulse","Status,PCF","Monitor,PCF","MonitorRange,PCF","UnMonitorRange,PCF","UnMonitor,PCF","PCFGPIORange","PCFGPIOpattern","PCFMode","PCFmodeRange","SerialSend","SerialSendMix","Ser2NetClientSend","SerialSend_test","pcapwm","pcafrq","mode2","OLED","OLEDCMD","OLEDCMD,on","OLEDCMD,off","OLEDCMD,clear","IRSEND","IRSENDAC","OledFramedCmd","OledFramedCmd,Display","OledFramedCmd,low","OledFramedCmd,med","OledFramedCmd,high","OledFramedCmd,Frame","OledFramedCmd,linecount","OledFramedCmd,leftalign","OledFramedCmd,align","OledFramedCmd,userDef1","OledFramedCmd,userDef2","NeoPixel","NeoPixelAll","NeoPixelLine","NeoPixelHSV","NeoPixelAllHSV","NeoPixelLineHSV","NeoPixelBright","MotorShieldCmd,DCMotor","MotorShieldCmd,Stepper","MHZCalibrateZero","MHZReset","MHZABCEnable","MHZABCDisable","Sensair_SetRelay","PMSX003","PMSX003,Wake","PMSX003,Sleep","PMSX003,Reset","encwrite","Play","Vol","Eq","Mode","Repeat","tareChanA","tareChanB","7dn","7dst","7dsd","7dtext","7ddt","7dt","7dtfont","7dtbin","7don","7doff","7output","HLWCalibrate","HLWReset","csecalibrate","cseclearpulses","csereset","WemosMotorShieldCMD","LolinMotorShieldCMD","GPS","GPS,Sleep","GPS,Wake","GPS#GotFix","GPS#LostFix","GPS#Travelled","homieValueSet","SerialProxy_Write","SerialProxy_WriteMix","SerialProxy_Test","HeatPumpir","MitsubishiHP","MitsubishiHP,temperature","MitsubishiHP,power","MitsubishiHP,mode","MitsubishiHP,fan","MitsubishiHP,vane","MitsubishiHP,widevane","Culreader_Write","Touch","Touch,Rot","Touch,Flip","Touch,Enable","Touch,Disable","Touch,On","Touch,Off","Touch,Toggle","Touch,Setgrp","Touch,Incgrp","Touch,Decgrp","Touch,Incpage","Touch,Decpage","Touch,Updatebutton","WakeOnLan","DotMatrix","DotMatrix,clear","DotMatrix,update","DotMatrix,size","DotMatrix,txt","DotMatrix,settxt","DotMatrix,content","DotMatrix,alignment","DotMatrix,anim.in","DotMatrix,anim.out","DotMatrix,speed","DotMatrix,pause","DotMatrix,font","DotMatrix,layout","DotMatrix,inverted","DotMatrix,specialeffect","DotMatrix,offset","DotMatrix,brightness","DotMatrix,repeat","DotMatrix,setbar","DotMatrix,bar","Thermo","Thermo,Up","Thermo,Down","Thermo,Mode","Thermo,ModeBtn","Thermo,Setpoint","Max1704xclearalert","scdgetabc","scdgetalt","scdgettmp","scdsetcalibration","scdsetfrc","scdgetinterval","multirelay","multirelay,on","multirelay,off","multirelay,set","multirelay,get","multirelay,loop","ShiftOut","ShiftOut,Set","ShiftOut,SetNoUpdate","ShiftOut,Update","ShiftOut,SetAll","ShiftOut,SetAllNoUpdate","ShiftOut,SetAllLow","ShiftOut,SetAllHigh","ShiftOut,SetChipCount","ShiftOut,SetHexBin","cdmrst","nfx","nfx,off","nfx,on","nfx,dim","nfx,line,","nfx,hsvline,","nfx,one,","nfx,hsvone,","nfx,all,","nfx,rgb,","nfx,fade,","nfx,hsv,","nfx,colorfade,","nfx,rainbow","nfx,kitt,","nfx,comet,","nfx,theatre,","nfx,scan,","nfx,dualscan,","nfx,twinkle,","nfx,twinklefade,","nfx,sparkle,","nfx,wipe,","nfx,dualwipe","nfx,fire","nfx,fireflicker","nfx,faketv","nfx,simpleclock","nfx,stop","nfx,statusrequest","nfx,fadetime,","nfx,fadedelay,","nfx,speed,","nfx,count,","nfx,bgcolor","ShiftIn","ShiftIn,PinEvent","ShiftIn,ChipEvent","ShiftIn,SetChipCount","ShiftIn,SampleFrequency","ShiftIn,EventPerPin","scd4x","scd4x,storesettings","scd4x,facoryreset","scd4x,selftest","scd4x,setfrc,","axp","axp,ldo2","axp,ldo3","axp,ldoio","axp,gpio0","axp,gpio1","axp,gpio2","axp,gpio3","axp,gpio4","axp,dcdc2","axp,dcdc3","axp,ldo2map","axp,ldo3map","axp,ldoiomap","axp,dcdc2map","axp,dcdc3map","axp,ldo2perc","axp,ldo3perc","axp,ldoioperc","axp,dcdc2perc","axp,dcdc3perc","I2CEncoder","I2CEncoder,bright","I2CEncoder,led1","I2CEncoder,led2","I2CEncoder,gain","I2CEncoder,set","cachereader","cachereader,readpos","cachereader,sendtaskinfo","cachereader,flush","tm1621","tm1621,write,","tm1621,writerow,","tm1621,voltamp,","tm1621,energy,","tm1621,celcius,","tm1621,fahrenheit,","tm1621,humidity,","tm1621,raw,","dac","dac,1","dac,2","sht4x","sht4x,startup","ld2410","ld2410,factoryreset","ld2410,logall","digipot","digipot,reset","digipot,shutdown","digipot,","7dextra","7dbefore","7dgroup","7digit","7color","7digitcolor","7groupcolor","gp8403","gp8403,volt,","gp8403,mvolt,","gp8403,range,","gp8403,preset,","gp8403,init,","sen5x","sen5x,startclean","sen5x,techlog,","as3935","as3935,clearstats","as3935,calibrate","as3935,setgain,","as3935,setnf,","as3935,setwd,","as3925,setsrej,"],pluginDispKind=["tft","ili9341","ili9342","ili9481","ili9486","ili9488","epd","eink","epaper","il3897","uc8151d","ssd1680","ws2in7","ws1in54","st77xx","st7735","st7789","st7796","neomatrix","neo","pcd8544"],pluginDispCmd=["cmd,on","cmd,off","cmd,clear","cmd,backlight","cmd,bright","cmd,deepsleep","cmd,seq_start","cmd,seq_end","cmd,inv","cmd,rot",",clear",",rot",",tpm",",txt",",txp",",txz",",txc",",txs",",txtfull",",asciitable",",font",",l",",lh",",lv",",lm",",lmr",",r",",rf",",c",",cf",",rf",",t",",tf",",rr",",rrf",",px",",pxh",",pxv",",bmp",",btn",",win",",defwin",",delwin"],commonTag=["On","Do","Endon"],commonNumber=["toBin","toHex","Constrain","XOR","AND:","OR:","Ord","bitRead","bitSet","bitClear","bitWrite","urlencode"],commonMath=["Log","Ln","Abs","Exp","Sqrt","Sq","Round","Sin","Cos","Tan","aSin","aCos","aTan","Sin_d","Cos_d","Tan_d","aSin_d","aCos_d","aTan_d","map","mapc"],commonWarning=["delay","Delay","ResetFlashWriteCounter"],taskSpecifics=["settings.Enabled","settings.Interval","settings.ValueCount","settings.Controller1.Enabled","settings.Controller2.Enabled","settings.Controller3.Enabled","settings.Controller1.Idx","settings.Controller2.Idx","settings.Controller3.Idx"],AnythingElse=["%eventvalue%","%eventpar%","%eventname%","%sysname%","%bootcause%","%systime%","%systm_hm%","%systm_hm_0%","%systm_hm_sp%","%systime_am%","%systime_am_0%","%systime_am_sp%","%systm_hm_am%","%systm_hm_am_0%","%systm_hm_am_sp%","%lcltime%","%sunrise%","%s_sunrise%","%m_sunrise%","%sunset%","%s_sunset%","%m_sunset%","%lcltime_am%","%syshour%","%syshour_0%","%sysmin%","%sysmin_0%","%syssec%","%syssec_0%","%sysday%","%sysday_0%","%sysmonth%","%sysmonth_0%","%sysyear%","%sysyear_0%","%sysyears%","%sysweekday%","%sysweekday_s%","%unixtime%","%uptime%","%uptime_ms%","%rssi%","%ip%","%unit%","%unit_0%","%ssid%","%bssid%","%wi_ch%","%iswifi%","%vcc%","%mac%","%mac_int%","%isntp%","%ismqtt%","%dns%","%dns1%","%dns2%","%flash_freq%","%flash_size%","%flash_chip_vendor%","%flash_chip_model%","%fs_free%","%fs_size%","%cpu_id%","%cpu_freq%","%cpu_model%","%cpu_rev%","%cpu_cores%","%board_name%","%inttemp%","%islimited_build%","%isvar_double%","substring","indexOf","indexOf_ci","equals","equals_ci","strtol","timeToMin","timeToSec","%ethwifimode%","%ethconnected%","%ethduplex%","%ethspeed%","%ethstate%","%ethspeedstate%","%c_w_dir%","%c_c2f%","%c_ms2Bft%","%c_dew_th%","%c_alt_pres_sea%","%c_sea_pres_alt%","%c_cm2imp%","%c_mm2imp%","%c_m2day%","%c_m2dh%","%c_m2dhm%","%c_s2dhms%","%c_2hex%","%c_u2ip%","%c_uname%","%c_uage%","%c_ubuild%","%c_ubuildstr%","%c_uload%","%c_utype%","%c_utypestr%","var","int"];for(const e of pluginDispKind)commonPlugins=commonPlugins.concat(e);for(const e of pluginDispKind)for(const t of pluginDispCmd){let n=e+t;commonPlugins=commonPlugins.concat(n)}var rEdit,EXTRAWORDS=commonAtoms.concat(commonPlugins,commonKeywords,commonCommands,commonEvents,commonTag,commonNumber,commonMath,commonWarning,taskSpecifics,AnythingElse);function initCM(){CodeMirror.commands.autocomplete=function(e){e.showHint({hint:CodeMirror.hint.anyword})},(rEdit=CodeMirror.fromTextArea(document.getElementById("rules"),{tabSize:2,indentWithTabs:!1,lineNumbers:!0,autoCloseBrackets:!0,extraKeys:{"Ctrl-Space":"autocomplete",Tab:e=>{"null"===e.getMode().name?e.execCommand("insertTab"):e.somethingSelected()?e.execCommand("indentMore"):e.execCommand("insertSoftTab")},"Shift-Tab":e=>e.execCommand("indentLess")}})).on("change",(function(){rEdit.save()})),rEdit.on("inputRead",(function(e,t){var n=e.getCursor(),o=e.getTokenAt(n);/[\w%,.]/.test(t.text)&&"comment"!=o.type&&e.showHint({completeSingle:!1})}))}!function(e){"object"==typeof exports&&"object"==typeof module?e(require("codemirror")):"function"==typeof define&&define.amd?define(["codemirror"],e):e(CodeMirror)}((function(e){"use strict";e.defineMode("espeasy",(function(){var e={};function t(t,n){for(var o=0;oe.toLowerCase()));commonCommands=commonCommands.concat(n);var o=commonEvents.map((e=>e.toLowerCase()));commonEvents=commonEvents.concat(o);var i=commonPlugins.map((e=>e.toLowerCase()));commonPlugins=commonPlugins.concat(i);var r=commonAtoms.map((e=>e.toLowerCase()));commonAtoms=commonAtoms.concat(r);var a=commonKeywords.map((e=>e.toLowerCase()));commonKeywords=commonKeywords.concat(a);var s=commonTag.map((e=>e.toLowerCase()));commonTag=commonTag.concat(s);var c=commonNumber.map((e=>e.toLowerCase()));commonNumber=commonNumber.concat(c);var l=commonMath.map((e=>e.toLowerCase()));commonMath=commonMath.concat(l);var m=AnythingElse.map((e=>e.toLowerCase()));AnythingElse=AnythingElse.concat(m);var d=taskSpecifics.map((e=>e.toLowerCase()));function u(t,n){if(t.eatSpace())return null;t.sol();var o=t.next();if(/\d/.test(o)){if("0"==o)return"x"===t.next()?(t.eatWhile(/\w/),"number"):(t.eatWhile(/\d|\./),"number");if(t.eatWhile(/\d|\./),!t.match("d")&&!t.match("output")&&(t.eol()||/\D/.test(t.peek())))return"number"}if(/\w/.test(o))for(const e of EXTRAWORDS){let n=e.substring(1);(e.includes(":")||e.includes(",")||e.includes("."))&&t.match(n)}if(/\w/.test(o)&&(t.eatWhile(/[\w]/),t.match(".gpio")||t.match(".pulse")||t.match(".frq")||t.match(".pwm")))return"def";if("\\"===o)return t.next(),null;if("("===o||")"===o)return"bracket";if("{"===o||"}"===o||":"===o)return"number";if("/"==o)return/\//.test(t.peek())?(t.skipToEnd(),"comment"):"operator";if("'"==o&&(t.eatWhile(/[^']/),t.match("'")))return"attribute";if("+"===o||"="===o||"<"===o||">"===o||"-"===o||","===o||"*"===o||"!"===o)return"operator";if("%"==o){if(/\d/.test(t.next()))return"number";if(t.eatWhile(/[^\s\%]/),t.match("%"))return"hr"}if("["==o&&(t.eatWhile(/[^\s\]]/),t.eat("]")))return"hr";t.eatWhile(/\w/);var i=t.current();return/\w/.test(o)&&t.match("#")?(t.eatWhile(/[\w.#]/),"events"):"#"===o?(t.eatWhile(/\w/),"number"):e.hasOwnProperty(i)?e[i]:null}function f(e,t){return(t.tokens[0]||u)(e,t)}return taskSpecifics=taskSpecifics.concat(d),t("atom",commonAtoms),t("keyword",commonKeywords),t("builtin",commonCommands),t("events",commonEvents),t("def",commonPlugins),t("tag",commonTag),t("number",commonNumber),t("bracket",commonMath),t("warning",commonWarning),t("hr",AnythingElse),t("comment",taskSpecifics),{startState:function(){return{tokens:[]}},token:function(e,t){return f(e,t)},closeBrackets:"[]{}''\"\"``()",lineComment:"//",fold:"brace"}}))})),function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],mod):e(CodeMirror)}((function(e){var t={pairs:"()[]{}''\"\"",closeBefore:")]}'\":;>",triples:"",explode:"[]{}"},n=e.Pos;function o(e,n){return"pairs"==n&&"string"==typeof e?e:"object"==typeof e&&null!=e[n]?e[n]:t[n]}e.defineOption("autoCloseBrackets",!1,(function(t,n,a){a&&a!=e.Init&&(t.removeKeyMap(i),t.state.closeBrackets=null),n&&(r(o(n,"pairs")),t.state.closeBrackets=n,t.addKeyMap(i))}));var i={Backspace:function(t){var i=s(t);if(!i||t.getOption("disableInput"))return e.Pass;for(var r=o(i,"pairs"),a=t.listSelections(),c=0;c=0;c--){var d=a[c].head;t.replaceRange("",n(d.line,d.ch-1),n(d.line,d.ch+1),"+delete")}},Enter:function(t){var n=s(t),i=n&&o(n,"explode");if(!i||t.getOption("disableInput"))return e.Pass;for(var r=t.listSelections(),a=0;a1&&p.indexOf(i)>=0&&t.getRange(n(M.line,M.ch-2),M)==i+i){if(M.ch>2&&/\bstring/.test(t.getTokenTypeAt(n(M.line,M.ch-2))))return e.Pass;S="addFour"}else if(h){var T=0==M.ch?" ":t.getRange(n(M.line,M.ch-1),M);if(e.isWordChar(b)||T==i||e.isWordChar(T))return e.Pass;S="both"}else{if(!x||!(0===b.length||/\s/.test(b)||f.indexOf(b)>-1))return e.Pass;S="both"}else S=h&&d(t,M)?"both":p.indexOf(i)>=0&&t.getRange(M,n(M.line,M.ch+3))==i+i+i?"skipThree":"skip";if(u){if(u!=S)return e.Pass}else u=S}var y=m%2?a.charAt(m-1):i,v=m%2?i:a.charAt(m+1);t.operation((function(){if("skip"==u)c(t,1);else if("skipThree"==u)c(t,3);else if("surround"==u){for(var e=t.getSelections(),n=0;n0?{line:a.head.line,ch:a.head.ch+t}:{line:a.head.line-1};n.push({anchor:s,head:s})}e.setSelections(n,i)}function l(t){var o=e.cmpPos(t.anchor,t.head)>0;return{anchor:new n(t.anchor.line,t.anchor.ch+(o?-1:1)),head:new n(t.head.line,t.head.ch+(o?1:-1))}}function m(e,t){var o=e.getRange(n(t.line,t.ch-1),n(t.line,t.ch+1));return 2==o.length?o:null}function d(e,t){var o=e.getTokenAt(n(t.line,t.ch+1));return/\bstring/.test(o.type)&&o.start==t.ch&&(0==t.ch||!/\bstring/.test(e.getTokenTypeAt(t)))}r(t.pairs+"`")})); \ No newline at end of file From df5ae6e66d78deba5aff56ac491316295e1d1766 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sun, 30 Mar 2025 16:39:38 +0200 Subject: [PATCH 02/56] [P020] Update documentation --- docs/source/Plugin/P020.rst | 17 +++++++++++++++++ .../Plugin/P020_DeviceConfiguration.png | Bin 69184 -> 85671 bytes docs/source/Plugin/P020_ProtocolOptions.png | Bin 0 -> 15294 bytes docs/source/Plugin/P020_commands.repl | 7 +++++++ 4 files changed, 24 insertions(+) create mode 100644 docs/source/Plugin/P020_ProtocolOptions.png diff --git a/docs/source/Plugin/P020.rst b/docs/source/Plugin/P020.rst index 65f75a347..29ebcc277 100644 --- a/docs/source/Plugin/P020.rst +++ b/docs/source/Plugin/P020.rst @@ -45,6 +45,18 @@ Device Settings * **TCP Port**: The port for an external network client to read the data from, range 1..65535. The used port number must be unique within the device. +* **Protocol**: Select the protocol(s) to listen for on the selected port. Available options: + +.. image:: P020_ProtocolOptions.png + +* *TCP (Default)*: The original plugin only listened for TCP connections, so that's the default setting. + +* *UDP*: Listen for incoming data using the UDP protocol. + +* *TCP & UDP*: Listen using TCP for an active connection, and also listen using UDP for incoming data. + +As UDP uses a stateless connection, and is only used for *receiving* data, this is not recognized as an external device listening. Data received via UDP is sent to the serial port verbatim, so a serial port must be configured. TCP and UDP can use a matching connection on the same port number, at the same time. + * **Baud Rate / Serial config**: See *Serial helper configuration*, above. * **Event Processing**: Select the type of data that is expected, to enable correct preprocessing. Available options: @@ -71,6 +83,9 @@ Device Settings * **P1 #data event with message**: When enabled, the *P1 WiFi Gateway* Event Processing option will include the received message. **WARNING** This may easily cause memory overflow exceptions, especially when running on ESP8266 or other low-memory situations! +* **Event data hex format**: When enabled, the data received will be emitted in hex format (starts with ``0x`` and all bytes hex encoded), instead of the regular text format. This enables for received binary data to be passed to an external receiver without losing special bytes like ``0x00`` etc. + + When selecting the **Event processing** options *Generic* or *RFLink*, after submitting the page will show extra options for the events generated: .. image:: P020_EventOptions.png @@ -138,6 +153,8 @@ Change log .. versionchanged:: 2.0 ... + |changed| 2025-03-30: Add Protocol (for receiving data via UDP) and Event data hex format options. + |changed| 2022-12-13: Merge of P020 and P044 to reduce code size and combine features, as P044 was initially started as a spin-off from P020, but not evolved with the P020 features. |added| diff --git a/docs/source/Plugin/P020_DeviceConfiguration.png b/docs/source/Plugin/P020_DeviceConfiguration.png index 086d5bc3260db0b9f224500e49e0b162f56ff79b..842f9b9dbc9b1336d450b9a0f2bc852c0b3b7038 100644 GIT binary patch literal 85671 zcmb@u2UL^kwm!}{Gdh;hQ9%R|927zTK?sBnqf(>`0qI1A5PGEd#8FY{N(-Hl5(Fs{ zq?f1&NCIR40YiWYp-2fKv;d*}zgW(__jmtyt$WTrS&K!!h(lu_Lj)Hv4#1Gj%B;Tg0#wmPfxrWEV7tr`j}!`d?L|0 z{>47bdz`tx%4XuR;%NORd3VG5$FG%Z`~I+S`NY)Ycmt5lDY4&QXS;&K^rb}*ZJ~b_ z3!S>ll(0P^`h(=pckfo|KT37hH?0Y4KsMyg%%^AhDKEt6{D`v zc#1nTH_v&n_Ho}>C*y%;^4xtR0gNOM&*|8I=CEs63A3Vf;P|)K)8F$vPkev>=KuD7 zt_##!CL1Zx!s{I&-$H8&(bx`E9IhY;(*{9F9A;3iWwWON>udw>DnuzPXf=GJ&^|cy}FGfb&Xz8=$ubq<3Z0EdE zdOJUb*S)+xUjdpoHDu!TwZFcc4U&yD`fZ>CkzLlRbdXJ<c1p0W?5X6R~ucPe$QB~~URHV*IB z07K!6=)b^P_^VSotL}&aQUu|$A5kkOR!{k3 z;52K>&ubRFSmf!hSu+_t)$Z*vzn)N$oocj6U@xEy_A(llOsC9%RN-QsjY5<%l) z;Z~uIH=mO~lYXr^`@T%(L`Bk?U{z(qdPuL+*RF_)KH^8f$OQ=f{0jyyQ~nVx*TeRI zc&;8LbCtxWPVske9BlEI9c6~cmv|buK-=7EkPzYf-zHEf0+^PhWHJ5OzO1K^vd2+| zdBNEm>;CXLqtLYW897B_x^L46Qp{K|XA+WWTWIRiyz0}z(K2AO+)J^WUARfK1LyZ| z4e5~QcERw;_7v)T{XR)(Vd<=0`MX@yhYu1S8A}+5AMi;H9ukCqX8O0sNDgDL;ffU(#Qg7eeVjIyZQpSk#rZX|!2z-)XW44arGePz( zIkou0ljxwEmTi_2Vl=xO{p}7uv3UKXpt#%K=0a-(=j-1_H}yPGT&3U@Qn5N9;;)8p zotL&tHuino$!8KR{&g0gCh`8mv>zWi^?!JuTD@_s_ea1Lyv|ED=DLIsfx|BOvs-@K3GOaY{@kLUXAvaO3qDo*A+>^EMx|MW#2NjizljYyFao zrkia1Js@&;MswL=oGOD>59h?lrtD!B&(qFot~zK5qgShfNNYSif8jj$-95kLvB%Up z$gdf4etV6-;sIfGyQo!3gF{(T77 zIE0oHM#IrNz1X)L$Kj)U(~+1oPrsb)*~3b$9C&EG&@rC710QUl4A0WY>S}xFTa%{c z-vXgWy*+u9Z|81~pdQS?x9@B~_|d-{Lt01kLS}yrX#cr^(d@&IgC1g%gal{vqOoe!`A#9vV~xp zx2)muslzt5Ue3Fn8Od0yeu?fH<4u|glTC^kE2`h~`D;e5q4w+`9rNk*M!lK=leYD2 zNkl711MG6DTS;q=@X!y7Q6B5MQf|*VFkYd)SDWOu0NQI?(c*1kGLNWn4)NTbx)emQ zNDDl3r|Sb~$*lj9zZdZ{H`}^D>9(0H3p+5_U2kXpSe3{m?vv6e&mWpqZyRJ; zZ1dHlB3Mr2Qe@2UU_|?77q(Sx?W{0bu35u?#Xlb{hhdEG%2;t2vVa}^-DdhgD|B2$ zjQV)x$76cz5RTuhmru0e&srOOg-eB)-7vi{pWfM(dK#cNE244jQCB$d{1s4BnY@H#W*?^88wIJ) zVqV)D5RNZi=19WTc^4TA7ie_WlvNpu+VK9P8+_3MO{S(6)NT6MOh26ai3`M|wSaffrZc4P!)snuN`?S46rWgSS( zrYKL-czvI+X^{gHPQ#kh^-dp>_XK*qh+5vsN~mN~&3uF{=J%#2XSGHv*6EKEoGM3~ z5!AJnQ?xNg1qQG{B~3N*%Ps$_}?pgwmDLdGUl}jleH#}b4mRy;?ueXLH*hv zUR<<#<^RGkwVi!E+^xSZ?QzWb2!5UIXMO^KEz~hzo4Qu+DcPRB@aeOh!s3uHsJR(! zl>fVYp`N`n2$Gq{#&;oN^g|r6MsYjW25mkTJdUEBKgn_;3FU5`u5Bmo(EpgPkKX%1 z^kTs6q@j1EPQN8&s|2pGyh@XHHh=5hH!p~kH;V8?GMwh#wlR-j7Pi$ff0k#AD$so! zv_ftvWf3+igZ=zMXnHN6@a{;sLA$UhW-A?I9e<4HwY$Jyp2VyyOQPJ|6zibvb_KIL z3A<5aJ;Z>?i2P}(u)|UAV?_)Io(F@7e0e9ALv1u}*dBH6h#EV;g*EPt!gyy7?iMBZ zNQZ^33iA`NIywfsX?j10ELwx;i+bu+lJFAk^Th7 znT>oy&uoFZXvA-8`LD7V{8~aSw})pG#b%YNX5lJ(n@ihm3GXs9NsoXqu>EwUU#ns^ zg0RJj3)@Bq(;>5}_2FxgjZ-t1f8cp(drCSpgK%f4>UUN7-R|ayx2dtY$;PZs?W;Q# zgOqom=$8$N%qs9Qi1jRDB1i3aGM_>^zBuAu4p_ohOs|RAA6+0k@2}aO<&H^Y<0nsd znY9dYGQtuJ+s|IxMyrhdu^0k=74vM-DN8NhtWyz5Q8>P5Uz|%8=%{tf86|AAFgj?P z!=KGc*L+wLZ3T}zr~L?O_5E0a&=@~0M_+Co-Ly3EsFe`DYnA9z1=f1kgrQjQdXkxO z+*zoj+ZzsGC%G{RERq50x;=qNyrPM#oYa~AZUB9R=l{v9ymzS77k{;p$4Zuq3 z-GC~_%AEAjl6AYKMN~)hyN*Z>G{kgy5=#sT(|%7Ww9Xa2#GMz_hYCmLF9@TucCf}| zhi%sl;tC-vSx%pbcUwPje`vF$SuVG^P5|XCGb0O(@jS!@8V5mAR`tlVUuiW;nmjx& z5YO=7mW#Wg7yNw9a*e#4iFwnVZ%UKO%c*K6mu@1uC0)+c)|$La3c!VMw0UF7>JM(uN&Ef?$QcCHH^ z+kPI?9{I^3qwA}0uriOdd~PX$of4A~CVTifw-Z`5QZjL+DCN+p>#sn3VXAo?XL`m0d?fH-3^=F80NUb*)v zzjxNfbfO4-q2&#ZXBac$VMZC8+%V}i@`Dyce{9E?^xSfSte{q-Y2=n1s-U7Xen^+Y zLORxJWOLpfd!WT$Kqkq%5H@khv0s?LC+&b;AE?D#*j9_!6CBM#^ygv%JK*_0@>pN) zC*dZXf7f5+-?$R4uZwQ(?Yuo*aNf`NdIfb&c9X?mrBRYDSS$M2mmO2#9jJ@aiSGSG+?HI;V*f`%a3PFNyba6)peiPp4K zyi}a6L^lS)+}nUu-F&@=Vjc0 zrcC(Ab6{o4J0eOGJ02w>sKAlc>RwHk^dT=(%-$mE;fgF;Z-Xd+dFq{mpMBAT(X{_~ zW@VZmEj2b`-?A}9J4_1&kX-R$lsNVDlut07#A?>X?Nm2m=x_HNb_*LZ>uP(VEdVP3 z%HpD{H}%ZzmL>jNPG>=~jly29UoPd$3XJ7)YMEuaXS9KWZ?rg{;dElyZ)v|^G22MG zG2pKDanbQF=z6rB}k?HuE=jIxagMWGwzC4h7n2BMTZ_KR(CEmlKb~hra<0G{g(Qu~e z_7(N*mTj$smeW1W{$k;bNU|6;3&aeacG=`#M$=i?2>`Rd6y-MNv19mDQR@N6kwfs6 zE?F_1?$U6^SOm9mj}o@alqPN+U{TZv0=pgj@T1I#X^{&6(yYKtBiV}>#qF+9TI{3! zJU1i1G->D4Ui}%(jS0|O%*KLgWQFoxLQl;#Q6TTOw(P$ zoyC(C5B4VOMUL$aZ`LM8bWSDM2TN@u$$Qoz1X}1Y%WZ;(r}PNoB#+RawP<>6D@SX6 zXM7~aZd_JlZ+6L;jD~W<+97zrF1D2rI=(U`jYEY_$1PnX@41FhMmU+gA~Tu-HoA!%@YKU{Qw|ua{zfC--^oJyHdBY zqc*-HvbVeR=P}eHq^x(U3cD|`exa?Is=0EQaDv9TzTLyzxx7(H9{W`!bhCeaM6X3E zoC*vZ3d1VAgJ$lLBPJV3Q(9XTj79kY9v(%YC&24IfbM~Rmrnm%4&OwFY;X9~p?5+* z4i6vVmv!VluF}WL)KT&t`NcFxJ&INia5v^eaqHiYiD(|7QmNyMqmAQl?jIPR?Jp7) z)yv?pnUAQos7F#(5Mx+JjwHV83uh5 zEg_TL=r?2H>kAU~wZ}I$+BupZ;Cb!)3w-YK^r!RpYiUS@$V=$5l$WG*l`aNqJRemQ`2wh!MuR7`Ev3Xs!8VV_f#e z{!evtaHzv!WX#0$LiPGGe#z!AvZ8HX=bRjEfFfJg!hYZKFei~jvOhfs*SlOLlg%x6QyQPTiQ`7V)oT>+h%is!AVs#ZOW*n zQ5|JFsNh{pQ_pAl=H;4D8y9iQstuyUu+>=k=Dp&rRAW=rnyj8K!Z5$7cu@_USV9`L zZM$v{wbX%C*++LoA?3R(6Y}%GIeY_6a2F9$fN$Z4NpzJ+n8ROf^vCaCeHl|)7k<|9 z-`|n7zibDKBwN)Y$oAE+aIdzr z3zs_}Rp?O^z|jrF!q7qU%0+AMY}Xs+<`)J?bCvR9H}FUQCfOrk=UIif85CU~{Z$3Y zgyE_`b)%5bHnvx?9uVzx8`djVd>f5?6q=t9Q{Yv?oa7F$Xf}7DNfR6qu#X%XV@+4? zgW0|~Z+Ay=eylO$HrUF%P|V8zAkDRK+xM^jJb>3)L)@~|hdIQjlGPEg)evLEvm~h? z`9ibAb9mz=OA%aK0gdF8!hi zSh%Q_9_6Q%j~L48D~H$q-HUEwR+HLdMuAy6B;0y%Hb6CXGU(1BmAReDl!*9z&l5Hm zzRdm*!Shg@;dtP%j=A^fI8nUt#F1xkiUQs5VMd{;Iu%rFQuE#odkOKhpJijXiFb>S zSdfSurgkyt68VO+JrAo`>!BKfh@|(TU%OvV#9eC1@=i8;s$g3qyc1OydZQ0b#Pv@3 z&cbs^qsP+9;gnVX@F;8B#DXdPWqwNHv7R12mHKq!?f^mTz(C}6^(x>YM!SLz=Dbtu zmCf1fyK(ZI$|8=aXjT4~App?Wvw%)}4;NU~HTO~&_WI!zh&zherdKHRNV(mSFjEJfs9NBkxGyJgA@)hS?_zlx)N2A z_$Ozx|LR(jjYYYHC}0m-fNT2&I9vMa7t=GP{3LbT!$WF>fYDN^{BLgSUECR^w+w1+ zQj*&7r}V_p(b1*37ZvR&IN&4&xK0ven)3i~ofkksTsMi8aX7?mS~1yP2V7jD8T8Ge zkk!v-b>W-7Dy_4C)9sAPdHnuXQJsHzTCWAKae|0eJgo+B&{qHlE!TFWXhJ?^!p|)F z*aY8k6(Zop+rknBfCU12^v|&E{}eUSS^Zn)T-S6V1lqlw9?PO=|F4+ zVuyF19IkO*wvaq=g+h(_ixwD1ke^cUvztdkzOx z_UGac9!>rF$$z^2k?T;#gShJImz9vMJyv0$Pr4sUtyB*?p=ec1!ZDWj<^zVOVC9~I zqq15q)$Pyi1(`#E=FpS`#pd%_62RI9%1W&_5&gr%p{Fsi{XM#k8^zJMSN0hrNP9uW z8kMb)=lbKkfWtk#7AT$zvg9-FOe2cj_>ZQ!cb#@GGF!4hz&Jm)Qn4j%VrJDZE&mW} zGb`2z49gk`1VIXjw@7_bS~z@^C3k58gJL9`IdM6H1ih$uUc zY|p2>B_}*yscX5gTi)mcq$>A(ArlI3gd?n8S*Z$K)jW%U`PEoL^6|yTS5gA z^nJ)cio$Ma_+H*Qck-o@n1bx-1CR9(R`$?1tm3*<&gB%(FekO)+PO-}T;*}@%H|Pz z*n>Z)Y*SNH^LB^BPD*rr%u7E-2N-LvW&LAae>J&>R`3YLu?xUeQr7?ro9IjejT2L( z^Z~<@acJNj3z^C0QbIhX=YTc;1b|7AB&;kJk|nGj{3Ka-rQqv=j%9DK=)o}Vc@n^R zX}2H3d^+t|fDJzimCcygZBuqp0DAv-0e7f*ZeIFg6FmFB%+$YlSQWT3-F@zRnM7V2 z@N?f@^49;Z_qb$ZtJZYD@CTnltmtbT+-bH^U4}ILQbqRRB3lmh)5m{2)9RE=W^|S+ z+jbfalb3n8U-Cg>p8ofWl&Ej=tR=LqDy=-H*f1M5KH|aJ!8v~dicTU$J&{91L{daf z<1Z(_mzyGx&+xO;-9vBdVd>@|NWW`1?FG`7M9Qkqh{cW#X8TY+ShK7BiV_hNM#ABe z&*-wLS-CXNl`iLLs~P(H6rbMMN>{CK)e-Gf6@bl4_Z5dJR3F0DEr88a6?`s3I!h_~ z^axjPqiJgUpg_o7^><-tobjR=A)60$|;e0|YQXl~~5b$Gp zHrYYfO4cJ;ys& zsR>>uf53y4T(Z*2102rRmGS&5+jB@>4$IRK9PQ+Vn`ZhaWDaACqLhFU7kJv*yCL>HgslQ@&NJ-X|j7;EQ*#AARTf ze>PlPNzABEFc^2(i=#`Q-rQeWorMXU`+vjmF*P6z z8vv-}dl*iB{}Ox%1jzz?q9qOpq-OT2K{Gws1wv16Rej6rcwUxpQ?qC?pQH>snsi(M z+9oFxuL#_zSa_wVI^MW{aVLy$yX_?vQY1 zz5YPH*)b$9wE~d;cqd|*vCEE4vaw&9D!NcIb9w&Pm&dN!ep&+@_*Lt_JP+-lf7ep@ zavSV&aYufF0KN6{{Fkh-nY|MMwfB%A1VSCefmGz|lVYu~{Tnuy0=9{Dol=_9RrEnw)8O?~MlwiqEi@lKrw6*a$>EzY+!Ck8)lk%*xjW{V zI}f6$ln#YnP2n{$U$rtrzG2Q-U2J)XZ{J7kR+`b`j|YlS6o1Bo?KHl=cL7&5)VC(q zJq|!}#LeEYTTZWEd6o>7rKT`V!}iWLn-(%7N13&=P+w98_7pqhSa+K3{x%)*f)m6B zw59TDFd*GNZJ~Ajb8vM6tm#-B;wh*l5OnL<}_Sk_k zIK^MeGpENve#X2Z#P=ftHov1BnjqB79%Mcn*y?7@Cl*&qqxZ^dshh&^v9ay+>jXWV z7D)H%D$w3*=yioQt-~%Nnd_PZwLx)kx6&k`B4?3_iWnV6NBu`~`xZJbqWdgik~?dU zoc;vB40dcoKCU;E0e?;9V`xPx$oJl@g7`7Mz9X3JdW>DkT^Cfc!hv=e3XaaLZIO8dGs4}>V(t&d2&5VKc6o4+lbmtL)s<9y5@uLWOT-rDySYf7S{dJ5MvJ+?_4Z53VLw-7U#7!&CX z!u6R&SlNe-DfKb*E_Nxj**^r)E;|K_DbSqnIxTWE13$aO9VAYK7~F-o&6Le?d(~8( zy`d49S6|W1=J<9s?|I93j0zL9Zs0W6-+qvn7$Z|U#BGps8!4{Yy{znr()KosRX+u` zpZ6fSJy@iD!dEJUYl-7&j?ii}r3@VvZ)(s^Qo|>}pZnEfLz9g=(H2pr-t8{i=9+s^ ziNLt%aL45%zSu^-OU7bO-q|ZcBO?+vYXfa#21UN&5r~6H%QEexrBEVqauk1bS8+n~ z-{47tY2PBwihShNa*A7-&c-oHF_2+ehz#q;`ZeVQua|IaZ5H z7O>RswIv{dszd@RWr;3YYE2mK2&I_VC$4dAhFF8!XvVBp>JRG2qjbHq=Yr$3mYRew z)h@o8DRMl&B6y923m%E>nm^1%?O6y|$kh;hpSu403aV!M>1F;o`{I-QmuI8Q7T@KA zG0Tt>G$n$!HzC_25Va5DqvKKV>QwL5`(m9_lB?&ecqx zu4m|QQZNY#r0h8jl+*drgrTxQn*??vIn32$k#!?cRI=84d*#+&c<_gg5U=Fv$^;S9 z0M8Y&X|q8nVX(5Z*;`ktx?|4v7|_Cx+X&cmZ_>6oO*(i2{ujNXgM{0;;*fhfRPlcy+Z7$TMdtYZGjeCi7WHzSld1=@#TU85qJ@i9}n~p<;}q zV!LThRlDi{-6$s)K<>G5_4MDcm??wwA$|alH$?(+DB1Ng_>*}=fILBcCbfGbGPKE4 z-Fq6lJ;%Q_g0zff4sBYCvUZ{`5Q^C=z3ZVnQgGAQQ-W5t;Xks}<;;D!b!F}PH-L)-xb zJKd%V5H^&G_6WTMLUV3+o(y|?5)GYu|#q=SNQ_`AR zfRs`c$k2}yajh}a-=r#uMY{}%?_Ort&S%=kKks;?s2>Jk*B)U-ACf;A41#nuAc2LcT4 zK_H3NCjxQzJGT(N0pt)j9s)_s`+U8Gw^Jl6Nx%e1y{|=|u#s*n^lOX7O?=b@a(B%I z;3-nTdXmDWja%4HTZWfkXI&n|@9}ovm2qEEkuT{o&*>-J-0fe~_Wh3p0&vIwg-r0q z>qRMYpDkn_Fa|*TaieoSYu=m3>$%=(`C6T}M#@EW)D}z@cyEAKLxLD4gQdwb%QgkJT7JW;Mn|6 zFIC@Y)pf5)BpwYHiEqDNk^ZcG7O}{TGgBEDA(;6L%NTE|Kh&H*lHcL6{EHC!hnj1Z zzwrFQk2sm-9}vO{W$n!x{kdEKtqRY$FL@Ww@lAsWP0R3456~a1zh;lS9$CrIC%wO) z9HC+I6t0Et;Uud?3EPbEnafh^W2!x_RwC{S)Yvc z@X0u2TQb#S1T;pN{J|*aey3AeLc~ga0{hmmrp#`Jn}AlTPJ4O{rg|D3-+qmtqnvz!e3&uhsxpdj^3vR6phmgA+BFj;iO1u1`miA(&iJg-N9#=cb~ z#Vix-kmdsi*Mn`g10wDXDyx{9JeWVZ*{SMwtMBSiY>so-)yFXf6Z2MYrOGHu3;~f& zr)aiP{r1H%U3x)a_}lCpi&`X)C0WnDbkgMGndpF;n!K3?Re@YjsnNiQQg{f$qbc0? z-k8kzgwN3_#iTCZd5B4_(`k{I=8Bl1*59gPCWiD`Yh!+p>btX5J%4Pqh&MW#Ch5%1 z|3zkNFK&1?FB{CSC8`&tb6(NZmJ^?A$i;+pJa6|FOI$+kxk$1wHHqLvCJu(Iy1fD!14X9A|0S*hN`EP z)1A!R7lS&SKC8M!Afj<55j6wI?E0yMTa6F8gj&n@Dcc>Xu6A@fOIH}OS>R|z*yo#H zWZO#kHvx)k>ooj96MWqtV18qhF_}qI&UuJS zYHY>!&zug_co;8QfDLWTHZ{Mnk|hSL`dZgS*z1Hk}_-CiXJTHd<+f7867Q~$F>cwkT9T|?iYH{sIU}7p*mDrY!&v(-u zf6@%^(5yxJ8EJLKAyulGcBGW^tUxMNKc)zPeZG*(wg^+~NM%nGy6>KRRl)&QMije( ztn9!U`cP?NbzI(XXZV^U2{sAW^6DQFXdavx!qiy15rtd96`ck{^TqWEn>*R&S6qf> zgW<04HBDI_V&+&Ax{sP8kmyO90G4UJ`vB#SUn6?w%3n}TH#C`8hMdQP?m{L_)cFOF zxJkL>!+M~PbT35_tCnDQVd_XrhfcTa&gTtXPM;u%6F$i<1lP*ezdbh=xcESgy_Mda za9}ka;B#c+TKHZe1JW%?w z*I^|gOg^wB)}7#;&#pJ{qf&N&d=(Ci;JttxZ9b6y0K73HtD_JU*xBhiJ*hFK>zmuM zl?=K6IHqt;PJtBp*(cr`wP=Vt=X&b*frDYbw?`!}P0-KgDtFWlITcKeYpd%vE5kP~ zIMq5z&93*KWcz1NhMf7Vm?Wj_l903r4?RM6G8+ZKt{Yiu&6vscnU^IA5xP8(bE-e4 z?-MA$zk2V!@gB?z~j=HcN00sN$trjKWdY-5z^ z5(qTRI9W41>6<-$@bgB2Vpwkc$-yjE)NSvq-;ISkK07N7cQ~Ii-abvIXQ+6WB_iZ^ zKRc^Hbba^1WjqryrHPw*Q)6Qo~qgcO%wxw)>a5r1p`BX2@Q zgpi+(Rq0xjt{cH(n0z&GM00+@E@5a=sG?}KzOzY2z9M(9CZ;2ObIe18x}oBYk)7#y z%r4xq&59LC030k=YkO(HJ6H@1(2RGv^};k4cFOjGFhCm^0?64R+K`|Cu%DNJAjA#8 z|6H-zrZHs2<+pFV(QyF)^Zetz^uOzUGZ8n`lYPj;!y^e`@=DKtC)ebwJPo47BfsnJ zANxD&Qv4OOiiw4=8OJjh8$)rDStgNwKoK|QJ6$AM6h!f#c5hy&zO!i21lyYo*zhaC#UL;_c)BlkTNn*5dq`yD06`@Pv)m_MRcy~lE_?N9&3fJ z6mlFsq>U@srlu<@I)bdO8K)Lv*@{G5PomNHD<5_NIi!JiyP3l;Q{I`*7Qa->)m4^i%_gFT>+_T*=A<{TQwxZ?L)065xzUv1dj*{ z)wgdJ`Nxzz&F@^rgZ&QLd4$+Q5nAuVl6Mg>2!ni2u&h5o1d{o^5%H=(4YOSu*LeV? zbm*@JWdluF@I~xIg`QJe61ff84hfxbN)rs^O$> z&Qpf-Y$|_pS1|h@yB{X+023&gckaLvzS+^!`-T<& zxJ0|a^xs8M|8MRy$R*u*j&N&)K&H!8sdEqilW6^abtpB>qIZmMtQQ45^WlMG!Vii}bE6*%xh>KNBHpx? zv*q^nCxkUZc?n*CDCof#icP>+riidbveh~}x#Ee= z#YOKB{j&?v^+77VVL4iO`@?u*U-?!7R zP%em)e)}SP;EFZ=lllUOHD=eeZVlU7d$@4r5JPtFn_o7!oEofUwki2H)HZ8IaMaE) zA~c@t$Uv)vr$2frp8}|UZ?A{_9!0IwWz)+Z=SGJtb2E-YH^nt1V)jn5?g?H?;43Zh2CQ}0Rzhj91<#}%p^@&XH#)pl(rSKHZr=~^ZIF8Tn91C+5!?ANyGQ7pQDBBmOL!bk zX$tW4cc+HTpo%eR6l|9mcCZcmX&|@ogQRmFzPRd0MzS7|yysDMIV0A!!@C7{N)FWq zH@Q*oIxXBJ;d;gV=%V7V$u4Xs@=CXKP@>^{pW)J+A=}nThm+RxE?Sn~0vgqoX^53c zp@lIcm|?AUsAfe+$L*lX(mKWz7VbUzwHgm3&sWq}imv%?+T$)r0uoJ!BZ$Kpft2Kn ziFuV(^9qPs*w}T)Eu|Jzhh~B>${{15YjJL5zYyvGKn&$l6uJt%S&yFZ>vtF#<`s2z zl`QPO0<;J<6Y18B$`oVK6S7R~aeMb7v2bEuG@#c))?@7JvvH}$C)cENReL@2 zM;40k$;GKkdtuUk0uB*|7QWq9&^Az!Wk#Wy)vXVb&s5hd=3DM`owcS|q(T`d#O)Rr zKm*Wr0Wvh&#Uid><{@z>>Tq!n#mcO+(DMYvYH_6g1?R|?CB)3S)9%RluR4#7H!e^eJm+MxahB@=b0`3cJD2UBR_(=VS``CghJ_;i zX>g`(?vO>9hfC7?OW;FA4bGD0yvA+#;ASAOa&-a22G1nx)IwjQ+j`6u^E3x}+MPa0U4e8)$*X`7fq$* zFI*+R%277)#dJuVdl{i+(5&TE^fREm)bge1k%=bEkyPU@2u5tK+=FmP|~djO2L4R5F8H4QDv+5)oV;@zD3Jkv_x6`Aa-Ht~ z>?*mg8VEQ4Nlo&&tgP(L-tNxiyZ`Qnxq=Bm31MQgsI47u7#I}P`l6ymkPrbleP`~S za@0dk0HGi;YlQ3e?Hl~TO)EWWEGod483Lh6YO*(9Z+v-*G0p}nPaN2kwSUoA-eo2u0Rt-^he zZv`lo-`Uw(ds$u0C*#;8AsWX^+FK$G(KUSX`cKv}w7{h1_oflj)-WC~QqWu+?6sjE-KEEd~;*>3r@t z;irs!qOONuxhT5HOOtJ5{|bO-5ul{@c%n6dp5%5sJ!gUgB(Z6L4&%lHyuR};H!$2p zf1v}#pKfxyc9$D)*fm3~!&`xML-uu5#|H-o#iLNDj}+HZC8tsC=InZAm2eFZOO28_ z3gomq_ZBKV8&35=3AtoPQfa>yAUTZl35ASAr_umDVJJ;G>|!$tS_^HRtp*}#Q+Sr$ zt(Dbnj>Cc}Gvaefua8h**P?X89%E+Q|6@~1IYes8PhI%@-iXm?PjwY#=>09O$K+X= zheIuY{=2;=IPPV04j9GNM^3!Eg}?1)p=m68-@UD2{>+&v<=#u9$;OukCJ_D4$r zyr9pkz>rL@@37EO-D`B~9%9a&H=eTlPu z1#A`IsbBsJE(j^G1^m!pSnjt@WDvZ12VZFm23< z;+hm=QG)F0{5#s;WP3$#*L*VE9E>U9%8@qx|NwHP9e_&7{797Tyv|84Caz z+{+V|YL1nG@1Lq2HNySn8gGR;mNRP9QDN|OnmxNA_o1qyot-;U5fNg&tt`*>8g&$@ zrC`NsYLf`bWq#SgA|)*3DZeQ>{n~*hnrkK_z_#Mgcu{;cLzpUXaXu8yPuA1g>Rno= zqClh=L}q4Yr!O~e>q21=FbkQr2C_x3C(e1=Lae0#Wq;Io9buth99?4OQ=OV@>~q;N zp<2`NH2FQTtIqxGBb(aRUTXkws8Ud5BR8y`<Ep^+4&FHbT< zke*a5b<8U|EzgP>=L6N4vR%5HA3LPe^C z%+tO}V$`c8aGy*h{%2kLo_Fvd`+Y;<(v%%HF->os<*Dvhj0I$N@vPmxxDJz;=5j`j zBY#9K1Tm^(-sKp|Zlr0*WJOoRe9(b4mxchVnLDK8crg1<8YR!=D1`&6x|e6jZjU)L zpR$+jh#nHgSU{@{pOxo5Z(iJ3ZVHA=Re3+kzw;8&KWSbPyuW9oCKzXCv3^0!Qr$^B zX+)V-1ISNL>&#nmMlmke{RQkTmL}sbub>&!VNU8r`)CCNtmeECZ7<%RSFN5Ahl~+x zbBs9XZ;=*_SlwS6V}}nNZ^Z^!<-=pXdBgJ{r3-4*O8oTw}A*X zp&DQ-b^Fgo_N&gsdj%KfBy{mpSI>7UpCtivO1ZkmM%Ir812xilxj8_va;=u1&#bIt ztk%janM-Q0UEh?t{&*S6F3y(osC-OG;sL`FGTeD2yy zH)iaU&U$3C+7SITSk0_~eQ^xE z0?Ayis-811t+FRB8g_V=yVxQ+7w}-hp4st!WOndgn3$5&MGeR9nY#Jqj`cvg54~cA z3Qp2kY@O^@qGj1C@Npr=>un&BFOx@RY{|AxX$CjW?{>oP##mx&2b_*>41G@Ya#FNR7!a{9uudWdvx!|iD`xpsG2Sp?l zQ8SQ{!iN=4-%0P97K}@gA`B-~15#?lUSGO1Y%q$jm|iDsBm&#s?x;v8r_(fLs%rbK zHK(fm|NhplRO1~jl50W6?;q?dJO<4_TRFE)nK>xO;e%+5Rrw~?fdDHiEhj|40b%bL zzz7Rf_r=l!#>O_n!OGIW9(SEQ^6v)GPoFOplQJil8`~q~f4-v8_`K&sUa?V!XWAs> zK6EAWW3XM@ZbzYhzL9&kgnPUl=9HOzh61o`Gi(qr52~dvu-`3UVuxur@=E0DN_|;^ zoj245cek|T^G6qU;4sxNmj+bbfCAO@kPY+)5NVf)12zx-94&o|*e9RO@K5{N7cQDI zai>_2(NV~?_sd0T=>f@A8Q<)a8?8aLo}r=AF0bFe2FrA-?S~A0iBMYHP=C?^8YT2K zVtqOO4(OZ#xBzZ}M>Ed=As@&ut&jf$&piha#&W=2j&Q&JUavFZehp+(kwIf2 zpxqk)^Wbv*zl(u8tKXM=(*lR*a@DrGr+_mmh=@Zf0qis1gcJ4g^~_f#wyD63($^cKc8sk?(+Vk zY6|}i6@DAotTJNWWCZ~4FQ@-k2>+i1;lN&mS0|x^gKurm&r{iXmeBQ7)IwRk^dhhk zy^DVLq~~Mc2Q;QMLg@2oFSnwf0wzLxOD$M1K!z|k5#is%P4Q8~QEDRVVGHUJ=XLeT*AQ-d>r4i_W# za>oF4cU}}v{>nyhx4Rtgc66`j4-8y1ZYc$JeeZ#=R52Y(OY?v-SWm$)b=pKR-#vNl z?}Z0jrLeM(V>djI6L>cTJ1GiW`SQ9Q)IqJ09pTS~n!9R_rrHJR|0C1ThUhvH(D^~4 zh=?yyp@JbWcmMRU0*Mk?Y9{a1{2kYLDl*%7+7jQBm2k}D?oNs^099DhMZp@!pXvjm zS&QAS-K~nft))#e2Hn&ok-;+RyH6`q|afK3TEsOIl<HJs&W)0)Q<@#c-&m<+56`18LxTRg*7`6xRq#`!71f71=zMDazt~=yngOP zBMV-9@;C+gB_~D!o;6z2quAzX9I*Sa9TMM8=bgH4X>TdD22KPlEt=gJkXz^J-V=H+ z$?YkAc9=530RYhpILjk{9=g=uDkmOUwb=Rz@!Z!**25MEAmbX&^Cj|Vxrj>AQ?P7CP%q| zx=63sz_u0RrtBpJ{hr z>g6dwU_G3G8u#MwSTL#+yeQkQ6|h*%8q)g@z3tKShXEvz@iXzd%7UmkIOEjCEJrnd zlN7cW)_9E$?8Et5(0DIdU`632-xkD*c@({^ADZA?go!8k*zb4HsQTyx=)JzTN2S>2 zxo1Pj3b&|Jt{vraHCvV6@davL!l@k+QxeeVvhxn|#CNK@;HP=JQ&Yn9$;!5bM!#*J z%LDJzQ6dQ^X`ql;x)W?50(_n|Nb8Sz*jeJUF-0DGlxB)a*FKGFSfIm&?d;yqoPWg0(LfK;hW=Gvf@ghIN(0ea&ry}WMXr7H(edPoqy`wK&y`G*J z7MpbCxtX*jNxZ62oa)-MA$T^|sF+_w_IrusN8%rd{#5}bw_%zv=A#4pQsjpmfVr-B=PMg^4b8sKP*OE z4aiLIa#4kig5W*U3RP}nVkF{DTNkaVhlH4U=?lQtn0A4_V z|9rZQkpu7>7_Vn#ZVPgbV+#|yws$R~ zkUENkrov8SJeZS}rJ9ob|1tL_&`|g9|FE{3LMlQDxhq9QizXS%UG6qDWD6k;*=H=- zml;Y`Td{gIp_JG-_tpr zgPHj(*XRAduGjUtUe`6=%^P!5&Z(Nm`T^U1IMr9+1S@Zi*BT(3<_Cr6}rWU#f6kw>upF$1=X4AL1V4FG6T> zUiQD%EWnwsRK9#IzJx_V{v~Huy4YKW_>bXBJI^WqYdbvoeCPkGpRIsK5jYM(VF&#C ze^>GSx6{dgO^H*Coa`=&6rf-B(8Y6)SNT8tVD~yKSA^Y)GKBlu)hR?eJJ)h?3je9q>p`69;n0&i&?c2zY1Eym-mklzH%Q=tE{aIuFUN<&Y*W}HL z(jixCQt(3V^2&lc0~D}?E?@51eE55u-kM8cVPO)`s-I2MMY$1CT&%)dAYbdLL2)aB zz;(1$I)zSi)Mx>s}EIATf5{l&dzgw=mn*;ak9CO0=BBMn)b?j} zm1V*4KpPJkNUdwC&N=r~V!nhTNutS>ct$-f7NqOiA*P0=*ZJSA=CG%xUb}hsXy_Kj zw!#KOEtB07x3P|$E0Sp_ZO882+K~OkawkfU+S%+0R*7)eXuFKxY3+ido)Y_oM z?_69~bJNd->jNElCB)wG){Nfqv#FxPlbI`TU8(-0{9|5jS-m@_ekPArSAC|jZc|$0 z7gwQk=U)0g=wOrp8kRCJ1*bB?4QpP%!Bo_Kdn233aO@9%4BJ=AtHUNXQ`_W~t$OB1 zt>)hE+B*_($Zt+BXwgXnCSx)}R&A1mAa}z}d7(82v%mPUK0)8mPB{B+e^%t~4>J{i z5_LbfKP{UEQ2)#i#z{nyT%yg{?qOr-ri?d~^NY!6b+^67W7eE_A=Vb;0|)soYiVK6 zvJ_uYdE%>g(+2JzlfbMD91hn-;-sb#xfUT~?T8y@qHn9+9_41K>s*rAJy!A5$7E;! zPuz*OMq_QZ8@~PJ`tFp*MC%vD3Tj9E9C*%gZSrL7Q_(aPp9gJ>%DWz+kizNdrH2Rm z;b*iPcBzuDPV(RGy6WB-CNm%C=jvgz zt3kc;`I|DY{x8ul{MX=>xTn<8;GQziZ}DzY5I@qOFT{9+U49xLp~0LA|5OLc+!iGv}>2gK6#|FOQf$$h6UE_(LH^sNe!z)XDLexcpoLp zLkPD88P#D`r>c>Q#_p{_gy=WvL!k>eSIOtd2H16BVV44&>lz!sT9~QkMY~x;Re6O| z$qt8I)nqoXkw;!`IU_k%BF{pQx#>eyzJnSWKJM1#H^M$@)B%!EQ%tl@c|ew-iZJ1r z1Z>9`#^V4>vi%Y8l8XJBx1Dy7d!L){hk@;FF`H*dX4D zA45mr$n^!E1CgT{bO}ez=<6VK!q#e*=UVlKr@$W5+zURfl%^NvfnFX-T-**)HQn9k zpH!zA#If+D4vOSS5sHVq=l_nsbr#EGJV?eEQ*qf>_`n%Ah{4W_^;wy zyop}f{~F-}X+SzIv>unBNhaT<)aT<(CW_6rB{Kl|;kEQ1Ax>>d@JdH>GmLu$#L-9? zIL+@oHG^QAL$?_!nH>%}zOe>lVD83tj38dFDD?-zv*JzS3fijxBSKaNsy8KsiGlou ztstS=p0>VPuB!Nn90K;#41EcwF4SB3_}?s=%aib)wXXJ169hZ&86B>dUw<<1{zzS% zZys)ZggV5t>v-whj6o1V6gbiR(%Ey?pQ-Jh`pF-%P!_a@Yg|y4e7L#vtoPCl&m?Cf zB3|G=8P{XFs(x?^^61J&b{>(np;}YiLOc1lW?s_RJNWN?KuFqEX@&L)Yr%6F(qu)9&tNe@{~-gxjWq z9cr2Ii(XkB;|X9#49u_;A!jDT&-gS|8o4hhZvRpn2|K-^{e*|)&{vq;qc^w8;mv>Q zLHzE(O_|Kzg_{$be_f1+A|%CDqnnjCIXd*SrmDL7hoa8%+L*-fctsoqF&(k;%_aqm zJ{sFIl}vk@X9zJQ*N{udfS&MlbHktXB&rTY;{qMCre_Sn$TnS*ioE@!gK4XXLEe7qzE;sOp#Xv|JCv zVsrX?=L_sOjb54C%To2i`iT;Jc3hYSAMiL3GBu5g)0nd3uUJ6h{;}LgO>fo=-?g23wd(FWveE$nnBL8^U-6;6P_iVBp&~_m!1P+!9dXRH}F9OWF4Wrm2yE=ook)g zpo*Ln*vpQDjv)X+#=s9?p~tIiiehtTr}-Qx4~zo6M>EjRbZqJX*(nD61W~_TGym|f3lS?=Bu>XO2>aY}30pJ*T4U2$v%Q!dp zS{0}zO=_}H%U+$yVRobS-#6-MSd0~iWhA9~cP-Qh`79`H4=4K*aN{r#w5;al9ryKj zW1O2`mV!)dVrEw74Sud9C@CgPkQu5CH=rETWbjB&A-x@DN%Mm?X{Rj{7vr?%*e=KMgAzrvDux>ZE{??QZdf3Bs5x=B>h;g!awL*W zEIahJCx*jN-{Lo>%^GGDw#yp_T`9|_L31K-uD@#lO~As9qnl0QZ~_GT;Upc3Fd)xe zrm8+L3Vn>c+9NeKz9|{vnOV-zI zVdXo=nx=0>A;+4&*5$zJq3;#!1kmTc14I#Gt|m)YeV7@TWhC-I`Z282%iTHqv?OHr zpgHN8CQ>YMXi_$6A(t0^`RB(v>>%YM1#T2}w!;icuecO&N^lgR?d_pGW?M}oE;rjR zwQr02cw7Qg{VjXxF`SoUZbBTtxV&vteH zXsZde?5z;kbifpeR;Ie%ca{>sh;R-z6-4OU*8dMkT)DqPIM-9 zcL*D>4Y6)L8r!iAhY&+vt3PnA_h`4imF>B0s4jTofs82yNIlN!UQ!iqJQl>Etr5`t zl0ivo!ePiK(Inb7J=y-7B7eCxC5hxHnEtYDML>@k zW88G}g$&9>#B#LaWZ~*HpKDl^>ya=zS`5Xqi|clsx9r0{HK;TLAp|;I`H(Uuu<^-? zHu=l-abX;mp)hP=xpAc4QD^P)50igAvW4^4Z;u>sB-{R}pZOtM#3hP(Etlacg}$>o z$XBy&PPtvN)QM9r>kQVCIy zRn?a6KAzEU=x0^$;1^f)YrSCvk>p+;?rPt)U+4XWnuE1}Z6$$w`ITa=?*&2h__v=B zV0fF`w;_sp=wlB79hISHi8K(-J|09@68%YR0P zooJAKjkTto4O?4w{&$k~eQvC^S)H`n-aj}m7~dyi%rPBrtMa{UN?Q~}1_EHR2C~6{ zKD~z~w>#L32Rv$*Fwf%_l@(AS0U$02d2JKiAeb6)NstPI0kr>pzk1mdLzmlEf%d6+ zWW;d}q>D#0V=LRas{#{&i5J5;-~y*&fT=$#hOM^Q*xH_%W|BO0Q7avx+(np*-=_s2 z#UBO3xmaA?EzN*L+OeJ`g*#ObJd?=)s304RLoDNiu@79q<9nfy62h6X_1=&huN7l3 z%?GETn1ZO2Z@8X7`CkiuuYCKyYNlaEdq(NFHaI!wS88SHRkLJfka9C~4*ZRA76b|r z_)8N3sQ942W1Tfr$rPAT`|&bPKop|=yOLujS96zlWDyc1nmd=Rd;o_S`+9zGB9uK_ zq&}6$Jk#A=?{bbmt-yO6c`pk$-dsBRWr;UG?|7~`yI(tG7F7*mMPntbHgqpGs8<^` zn;#^Zb#y`yP+pGqVl-EYM~`#zgJyp=J6Yap%~Bus4ao7>^O9cJ=cH%f=d8NmN@1U{ znDivyLg`hs%%Uv1^nWsMu()pacFgq+8Yn^qiQdH!;~;N&;VjYgXk{_4AYJ#EI=v~k(POZV(Qr;)7E@l+8pX$w*X4b>`*3SA%8r*YMMugc20x-)l~vT zOiaDX!(rq3*lpgy7*qGEA9ROcU66kver00e5!R;=;#6qgl(&BAKEJ+o8@$z62iCi z)pW8nj%9fgQk)<+S@je04{xVND=<3# za!ybQ414`E)!-jV_aSr&@XZW#q)~xv{+zuB++9)qqDTM?jLyzvI?7*_ZX)?rX z?*(j|hIb$BymRlpIrOIi4=L@diGhCr<2Mp6ywbfC@X9tYU_;%HI<3t&o2C#3O{rCy z%*PutPGpiQnGrjKgfvo%L@t#0iIK)7r$e6>Wkoc1WqTGI<=FRVY*Q;)zD)NnRfkNP z7@Df(oq}bW(0u|#cXKs7;+BFXH#Q8vPtK~4$KvN^KHmc47{*YGp2g^pE?Y7d_&faM zd|cRS21qs6O82C$B}Zg>^H;h_B|*RT*B6}1(*WLkRfV*?$A4ax{$Mt(*$Cjq4Jlfo z;ptuaX;zZFsjeWA7PmODhM8;|FxDyn8h zFC2AWR4dI{i#e*6QQhax1&t1BxeCum=}wfjlpl24+-lFoY+p`0$dS7jb>7rv&TDn< z&=4m#%!vTF5GYa#r``;;ImSRrk>l^~E9uyn80bt5ye?8TbqJCB+Z~ulx?3EcB?GDV z=1EMoeAS}nRGOdCj>*yx;J*8jxD$xITLVTu-8oXE zQ-_@ifg$HY`g_aVL$S21OFf_3s%?9u$Z^CdQFcx41`3`K0n1TOcn-ITe)t5P5-|s( zr{PjN2kb3mU${xRnNg;58yBa@ME|OU=h+CpKio8EZOZMGnUr!I)%za20uD0${&*G&S>=ds&pgBx(Qgrl!<2fA7!laMLsK zy{8dLHP)^t6!gv@310Na`J7tmE%A?39J(BrQ_M3;TQ^f%_xT%<)vU)!^*Y3~A8xDYN_>!W5 z`eTRwbGE#B=S*grXAI8uHBcg}71p02)e@i>{+3tJ&;Bcz$To zh!N4b-z$!ZQ0;jUvShnj<@jf+q2aLldEO-AoEIMy!BBKY zOiAtADe_aceq#5b3HmY;+i+)xd?+H1gHL^OI6+*FsA zD{7Bsm#EQqWHQczXX4o@vaGV}ewh;nH?$h;5)WDf#9$0~FkLs`0tgV2XzR zA2SFB^Bxf<+hws$w&cXIMI<%SV85vq{&!0`^|Kz4ji++qROKgICnY(s*ZAtM23{s* zl4DQjEV#1nQr}_oMHS*_$!=WFLERSj%1y4Jk(Sym(m$E70Sh}1KkL@@?d5Pr5#nw1 z_?mVNFlwX;+aq4l#OJ|_Y9E~_RA{9Ddk!dxV5Y1B#?021Zl68YKfZ-?t!Ms^&P8~4 z3S^>dL3WY7A#r`9?neX*v3Kg9m(+WR8z<(?68>=Gt)z38W`2cB0dCQJio2?E##)fw zDm(-*>yrS60Z278WUAt~cL4y*#eboof8kcq8<`!hX2EEUIP$G1n$UxC%gnj6SlWL|dm1Zg>k z2WTf!Adpbr4^aXz?d6nLFsLkW>Bq+@4--r%*5jzu{^=GwShr&}$40K)v1D=Q* z_79OCe0>Da8TIukf|shRs$6fA(DFuryx1qZ&Rr0WjC&^p{-TxI *5fixWQ2v^#4%)>*~1!Ids|y4)k5ds)MfKIrPw87U7Isw zO!Yt`EyP1;rF)OB|Kj_gMder-h)QPH@pbA>60FC{ke>P4RBiYEyTjoygB(A>O7&Wr zl7*mL3R_4<76EQoMCrn?_xs`CPtJ_3yZC!_jZA0ki#AbUZWyh6%1pM%%S%m1N3Fb^smj^C*E@udXZRD=B6a|LC~`-&NwGDtC`3`Cxy%?r z#TgPBy6dnAs5I&seBel668-tUOlTy`Gh)ZM>)gH5x)CtmBwK@*VoV3o@5QCK5g6?B zwzrLrM>7>d1SL0=Cx2KGl*#AP_=t!sy)3vZgS56#gi!d!j!Ix?qII`ormjalxB~qV zDwkx|aM%jh9&u#QBTLgR)OII1<>u=m>Db*$MrX^!<01x>t+S$T5rX7SE+@tlC0 zz9upX7g#&ThL;L`rp z#Rq>)n7X|(X~(Cb1Fj631gE%(Bt^i7*CAb`r!FFCt3`$V596(__5&}TJ$nA;#@%UL z&g=bQ?~BA@?D_Z#`kmmUmiZ;`v}&aH%|dt2?xkBjW+*X`IIrj?PaUNo6L9179h=1i zl#XwGYA;82@Evw-V0|KFR&++(Oc(?Vtu;`FxUT^(gCC0_0Z@a?1hyF_q(rP!yu{sg z*d0g03Go#h3q0xl=nlhHq~ zkzzZ1SnOkaN2qrV?kUt#9kEgolsxsNG|{mKREwx5Lg76J%}ge;Rl~1^EjQWGC==L+ z*uRfz*i*Lkgj&g+EOV|7R{626djzc0zb@q_ymn$TDbj4gwPIp;^1(OD0zC&RJ*VHl zEA9+hW);+&6bGqL5MN`1VwPf<~k5uvlN#*!rk^u&KhrrO!c02uZ) zGjLz{0vQWuSg}7_hd8&7YR1liytIOfr0>*F@!R&x2fc(-l~f-|8`$nww${=CAs$@E zhF^~5G3;`F$TM{kS2e6G&h+>HEQyYPuBXUsfn{Cmc^|L!_}41Q*oL|9TK8`^`JXh8 z+D}1A)=cYirVl9mu2*FL6)>ZrneoBL1e&B8G*2s4FiY%&z~cha8+jYd53u=Fv;Bwc z(FU!dUUxu9y#PpV1`tcDv*ZndFiKTTP!LW(s-u-SV3)s)#Z}*sv{{c8EwFSYX3J7JcmcYbmV4F60b|ZgX!^C=L(KC^Z$;F-aA3e zPCg;P1bS;r8KA5RT8_e)p`g~W44MH7CWk3;0)`9&$Quoy8i0d$}`GbGd8bqK`kiGxP~LPZ#j~W6c#+f_m@} zH!Q21cZ-3Z7BD_1yC(*#h_aq|f&rbEzsK`k4ey?IBoMd(e5C(c0^^o$xXlB*F$-i@fIAFY9tQ zZVu(i$#o$~yljYDLGB&D@E5DH?LaW{?I{KP!J4hCdP0fYgX_>5F^^oN27Ui@@V@?- z(bfyKr8Ie`a<76@$0oZW*K_fD&m>UlH~kSFsiBr_U%et3-|sb|QjJR7LrY!w)4Gd| ztlf#GqE2B_>%}IC!JBX@lHzACWR`42 zq2>J1#h@;x?eNhe`uSz_6AD{7aIZMMk3#|S5rMsX^biyJ5jmn0UzWG2Jd=%t4*D$^ zrti>}3J{OMK83@?0__b)jYb6aCu}!<3W_bKrPFd-ZD~^ENwti#&V=gk!qM;5I$ z(3G__t;I%M&QFJ~(F5!1n*pWO`#4wK8!ktiN#9$rze`=U7b%(aE24GXu}_Uc-q=Zg z<%rDR4MEcO^qq%@xrc>nTQ>}E!!$xMqvC=PxV-cf%~VAsF@@vSQT+YLnN4+A!z7Q8 z+O&=Ly#^H&uTK8vfBw9PQF|Kx<$N3!7I7`%!vS%mVph_2iHXV1a$BDGyXaHTEZZ;n zrP$+k+I7#z`PkY#o06RzgT|p^>F-@g70pBbF>W7?GgAZoE1}Zv+(L$-X@DiqMUZ+4Db&Sn#axQ>FK@43`_rYk>a!7W3VGkwl#mH1?nl`fIUFLjs>5q1wS>Wn4Xhqmz*fpTlzLxFNfapQrP z!lVDFzjhTE=k#^xg3A-Z>{nH2-4{_$k&tK-=$k+hRvI|fetK@^Hw3S^`U z!@dAsUEsT=zuZar zae)lXMhcwqu%J+~E&~g?27EZWgIkd>YQ(C{5IDw@>pSfK7X|J67`rex^vZb2GS6q< zONIt%ZQj(!O7YzIXm`${$N1cI^9TpM8Z3EP!xhft+D#9G9EjitQi)MLWmZK`F^les zMov|$(2ya^A*b=#FaL^dYunI8EK*olTwd!};1r?aSepKpt*X;xny&WRoQ)Rem>p&6 z^fA;Wsk!+y`H^!zP$QPlh^}uMIYD=0=9*1+Z5S!-a@dD43vQ}ThYQ3dt&L$XgQv1egyxw`R zQxv9N;2&72)1W$_agJMhawq%;!ismxqT^TqRr5Hv>TeATM`y?lR9Zuy0G^ggzK zSro~`bK6462R4q#a9gHso+q#8ce$-1g%)x|h8am8 zaOvh|nA`RTk5%PPoT3aj`bW*J*vMhnreh!bC@9dPUBd~E5@ zRY<=C%iGjCs~`6jd3eQ@>N~ukhWBP*>2pTCt$kQMGSpi!p7%zFb3KaniVK-~WZ&sV zxwD!aHO+bVqK|ik(Y?&7U`^eMY^>sSPTmsQsVnI=+TU8vYZIGJ7#Vxq%r1K~Wd-3a zfuX^E9^9KNUC3b&1{Tz5Jq!K4Cy6daDsfC(Zbiynr&^5sMZyR+|ky|tMZ-Ab+~p{Y$K_lpF38SO!w zN50yvzV{kA{K{$_CQN;=T2$mnf?eupckv$77m<%20#k8euRv);jkKm^Bc)c(18sFW z{b86K`>?}Z-gFX<7Z9Vka`M)t;;$*l_#v4}cwc+?&l8oFhWwFpi%5@i(JOjlP1q)S zf9L~dOIvK~Vzc7}KQPI0`o)DX@43k$eQt*O*Yq&DY4a4)^cZyCQ9?r^w<@%?J_tfT zI65)z%eKe?PT$1d@L(9aanH%kxX z^@I|iDE_sa7+K>v_$YMgoz7Z`39r30FKtAos>JU6>c+0T#j^;yf6^EA%Pgq`WLlW< z(b2rnnw?uapGj8^--Rii+suY>D(z*QemEt2FyA%I1X0kOM zgZ8{l;WPw7C0MZeT1C7SC%w6{Kf_T>X0Z2O1W&G2$rPp1!gb^~L=ET2$yQusF;4d@ zmUBFU(EIXIttl+&rYl42o40EY_p;5$`Tc3)yE(yVdR`xn2v15+8DH4vIlQvSc-^B$ zXi0NVk&JRsp5%X8&fmpAFd-yJpZwsUjwzz4AZ09bh|u+Q=_yO6Uz*BArcJB4)((ek zMFVC3zVf9FGDN8gMVn>ez}0&@$G+(G*mEB(tEc$|S$C>C^(HnhU4({ya8hg+Vs#A!$sHwyC>z6nc7>$F9*nwr=!TQB0#& zzPI6L&b6xTR@SDd*4XAy6d_Ef${jBUS@VIR`f|DD<%rdJwl#hG)z_YjvYsn!$>9NE zkYS!YO2myQ&W{KOvL2n{?>NS<$l|x#PP)SQoLYpgGiC9+ ze+p!uaG&1ew&MXVKA=CRp|c^)if`vjRHSp&yU6C{bthlWM$@D zIZ_dZh-5F)P*Yon#%!9udqdqyE1un=n~p7f@tbt34jbX(x)OP`<&mi!#OF9=tqj6e}>Z*SP(mxyL`x=JSvq-XBki4}$m8&$32W}D3aQYR4eLzCDt%`5X&PhE5E%0{n; zo@=IAmBfA=z1CUBHl@rY_gn%%+Fv^yc@z4|KdR}?4RZfNP2;?POUX-XiN@Jlfqv@G(VuW;cRr;G|n_;alzuZo5jwWZZv63dIZ z+Lm^dLlACQcH6xn5Vr9$k;_B_@`W@vu3P0FU%OmGUZkXm<~C*5T)spV2cLUFJ#G@x z8V5_BD;;(Z)Crh+>aXx}fpZ>ldND(>(xEB?seP7}%+(_Gz3cnpCp%5ZaZM^L@Q1cu zr@le!QFvbJV~>X{ztWRvL~pM6Bqkzm3|1N&X>PvQ+U3=6sjKUOM-TMHwgx`KKl0C) zSrr0ols%gq@C`MfR<(bd;$QWN_m{S0DBj}Uv3-jv;(qK{deB>NjlZd&ccZ)AO^2o8 z_i5K?D(0l6yLM(1$awl05AF#&63dw@L#skEBarfO;jX;Iyj#$ae20ZVd3hf~Ls9Xw zq(E&8x`>@&BI@aO>G`lP-nSOj_15xG*7FMBk*SV-QI~d``%YIboICLacbm|les1yb zN}I3rvn($uGg6!UCg14xKn%_17RI6lTAmD$-L~tmFShaaeYFQZ>swb zuRSSxxq|M?PMy0%8Gq+<8@=`!J06!Z%WL1xm@G}l`o|t&8gWyZ6V#t>c;fcu&~kra zR^^)AV&8&79x=_GJ8L-hxXQKB2SB_$c}xy#Dj;c=!x@<-g{46hCaVy8$~i58K_I~L zdK%-HE5zow))b1SHc(1y+K(hAHa}5bi@wHwR3P7uu8h$YI;!}@dr!S~$Pv;H=L3^= zC3%V!3+f7`y!?FY)xS)4lU(L`Pr;YdLxvLLo~~gREf-A9$T>x+$#aINXB^%YNwj?%H#)9jKtN7i1way_@{$eyBE-i?;iA;r@Dk>xDg zpBZmu6}dE3{K6U+XGM&~uq3%{$6OqigK#b(Pn&~|+VS7hf8$kp4`(c>s1ii3lZTem z_4@6@BGHK77AgMP3g}$YY(GX99*I9?7aG>xaz>6DT0!CX6mPGErbq&& z?sdNZ)KR)h#WfZxjW`y8y1m*Iu)EiPUzfLbYha&$jQS#SWU1gMeQ1dh^o%?VlGzM% zbRbgP?*6b0g%x>+ckRmw=BGsRg!Y2E)R|88LHY|@t~aVK-1aE?+<5as=}Njh=@@LQ z%$DVV&jxb!iJ4fJ1IR~gnbc+(+|P|F)1EcoehM3Mkf*=65LRh=4YF##xy>OFiyxPk zau9g=NlT1!;cyF^EgMTe(A#^-Bc!<6mJ;|(dh*3xZf`Q3VwQZsj({G|F*26XyO7XJ&tmX(QM4(y)0rfs;bTsBtps; zT!;L7%Oyep0Mg@ASf^jRA5h4+>Ye{=v3IEke^>reQ!I)}3~NFrY%z8{2gC_l+lw4B z$Q9WskHYq{rtR0@@^eJQ%Fb7(dr57+^`{Oa^+@j2u_gohNj(cQ&P60ix-R6TN0S%h z=bFtDu?EvvtVmN?*~>lYx6jk8pHP32KHpSOdv?x`R;^F)mM>w?jV;3Wyd2JGM62`- zCVy+SR@koR$R!3d!dce)Oj!r}*vX2QTvr?^?npkOI}@#j*+=@m6vM5kfQ`knpSEsV zY6G0@*OgW7kJ!v8x6fOIozIJGmVo=PZ$)e!|GgAFC_&9l7ykgdh&G%U=5A>z@;PrZ z;<;h4EpN48;h~z~?Uai^@bC3*T@fh{Q*nt(2R!)3!vUJ$&(8%?)AyIh`fEchHeYoAS1TFddcfbA zmIiUe`nN7I1}y9%csH;L=r79-5PRB{|2HEv@aKBzJy7IV=@?v@Kz-qh^6pAbfvwZ# zO|^n{F&i67I@HE4bb30d)H9$+eKGAYC%sCGf0C|pmG0JK5#m`Y?A>RRY=>eRX#dR~ z1MW2VI{ZUq-smdi;}_7=O#f=S^Z+o*_|8qizLf5*|6=UV;NN6{rmDFgu|<;Wy@3Nt zpo@57V?ycgokt$MS}m^G@x5%Y<)TmDS{Sqs+k2wMrvD0r#Tl_Nf0)tJ@3OkYE;YmW z{n(W3#?OsFdi5bQ;KW8q3LVl{8QSxWGBG<`9rH>?G3M*2(Htsm(e1Tzb9dn!$I)(V zvftw+BE;-rRZm>A2JfV)7*My{r&$Wx%>Z{V=z|r}RZBW{K=wkEL|>EIcUc%!c<05} zW}6RW1ifMuNYeW@|DJK;{k?AR)t8zu$KJkRiwmz}klDMqrV(D=y`T*CM^XEw^dHmT z65ou7arfJOL35E~^xtlJTOvZxa_TxnOF{b;IM)e9NO}5&0_n{s^`GC^lXe%be<=CL zXmpY20wLf2NQc^4$gV`i+s>1xD;>j17E)a@MC>8d1!M#9&*HvHH0EQ|;(2LA{d2d| z2olmJ{{RPwVgIgKNQZAYX*RA9xp!mKM2gW>Io)|OB~0Pdhl515>)H|KqQ=2NZz1xK z81XoqxcM>9jL`TKdpx@@(w$Ccx3{Xmt((=eJc~-c_O$q0{vdx{OrkY3#i@6#@1Oyt z{2h?+6B+&%-;N}Iaj(a@x`m2eUV-|Q%p8a~#P(zQOP_!p_jGXWk-}f?fjml=po%g; z*Ht+x$PP|@h^%R4*K7S|d9agLdxQ7PS6C=QTM?@}z98V-zF;nsKS=Dc$YMzYbj~Um5l{dmP%+A-uUW z>iowYA3hD%_S}}fb4*MNg1mk#=_1qc=j8uw znH84;r;ZNsAJoN!6kldeAGPV#`*RQ2M})>j%Pc}=5$mKQpY=(1ZD}}ebYdbmh`)xK z1G=wKP=Cc2{v%KVRq8fC+n-b0CSdx@4>qQiYO{t!x@QeaKh3?# zISX_>Y)i6tDZ7;U;fp*NmM?U04sI%<5%u9fM(Gmn$8_Nfzq zx}*?~u2@VZrl zy)$omH^9JLKlKpx?gN8E^H=rrnu_v{XV@mnikUx5t`u*mpl676PR#m^Z+s>DqYsEk zJ*`zawtB}TwhdP_b>lS+{{mkn#D8UP&Gyst9b3f4qa9RqR-_-jJEK~Tp@F86`#{I> zcnj~tsjqt!GPpST4!1|KYBt%wDX|XfTPOHOyDHOiHmhDdodA7_{kiR8^*85iBnC5B z99FBQagNFU!LVc~qbxPPhBV<+BwSSKdD6S;{V{BGPC3Sx*ZQ!|0BWqDR*%G)OQgSk ziSB?#{ONwvO%a$HNcq)#_Xr;yj*7bh?geOJ>hG=G+6%fuOW=W-al3(GNf}2)U#o7o zS=@X{z8BP42h1W)8y|8R=eD(QfqdUSZK3>9j~V@D9hSE)>kAZ-gqt4v(erHEgO)#^ zpWcp~I8P4TbGk_`r^0lrS(KCN$8YhcKpQMQ77{s-vzTpl)+4yz5LIRCvQQhQr-9hZ zDd_UZ={L-ghSVdUKbsD8*z>Cxn+}?w{!pO`3+eB_!R<>^me@2gXrSQRF>PiwbL6IU zb_ejOO_}wU~4`p;-)9~!DaqF*Io#6D)s4sV5=u>k&;$3CWJ|4*lD@n<2PIv)5?8t zv4)%-)`6g2F9M^%rQ)y3_gNlnUetzK{QPHLOwSWO!!%0$8vP!`$- zZ}9Tn`08oZp-{|%tY3+xZuH-t7$}OwP}_#R;39_$BfK)i{3C?M+(gta1Qwqmx@U<= zf%A!BAmmG^D$om_E{6HbfE0EAkl|@XBBJiSz15>P!1;S3p%mT19T3zsXQ2><--@50 znsIEKvr~|yx(eI&?OXo7uU!z9%45kh3qrzySANAEfnxOWFATCDNKljn$QS@H9mK}% z;3WYx`Hw#ffaTv;9k~;d$qY~88XviH_}9S)h3c@s+GIeR4s^X!^?wp%^a6j_8RX;d zUyXz)J%St?R_8@W|2Ndt?Vp6 zMvnUMa_L&jaj4?W?>6JbMEg`t;!layD~TZK23@7m&;JE=@0>zRTzF@Er(O8i82SEW zw84kdn>G9LQjmxXDQy}^!tnhpATO7^gN#_9KC63wN^COGe6tnZ(eqKUCc;C$(UI)1 zE&v5RNrEW%Pk-01>L=_m%yvhqxS5viOnaZLSqfG>%BkV3DD6mH=8{%LTT@+;_B_q- z)b?=ur4F-)?^!r_$*E7OSq~^b{u!+SFnRFWYS0{zn>Jho=Jt9BGV=p|!<+Qgp+g=R-x&flEs$gu7Q1aX0o{sqkhW^eb z$CIxFB%;I-go-Z zT5S4|;k%YlxdgAQU24cp1!~u6dmzZ$o{1P*6S>Gb0+s>CR5;kxNeHIJ3nfSO3f8rd z(Bk@9|38!k{_pe4hmu}%lSa)(dbSW!SggZen9=Suw42)Gfx~^PTAlrSXLbE}X@w{* zF@kH$rxf)aCiQ>%DDlH*j_ar?trq5~z*HMwSw0Zkc1V|xK1b-Iu@g8p796eb9i>4Cjr(uGh$LWmFn zA%sXvAR*+epfk_2_de(R&X;}8`+f`wckZlvt#z&Iy8fl}*u|%UpiLnWi>E*JcMv=h z0Jk1+)8%SLM#s4e!a0PX#$bEvh#!ZKT@gr~Fr^Edr2Qm6LkDp3(J_m~;Z7Ut>`%1B zu?A;id~TQK)tO5FIup=2s2eOp*?A07Q-lpiU%C@;C<-SuI-!WSAd+Xx4)|j!=0%O*K^k2)trg+S)%IEpz zT1PuRC0DUvdM!N9oqeLdQY7?W3oqOt zEShWCv?Ms@nGkxv11gWG@eFx1EPndZaO*$?!~`xQ_U;8hM*k)2I9-nE)Of@DbmNFx zy@JNf8R-wR>-_v?Yt3$7vJ!ukRBl;!z3t>*E`lMu_K3S~e)p{NF>ZcNdyI0skt|-w zpxrH$Mz(4>X4=eWcDQ2ugLmD`8+As3rMFiq>91lqFJyyc%b;2Qnp|%FzAqFwSz0UX zV;&(0n% zzb=?#S=7h>+Em>)J{cLyH{d!vlhCgqO%RQ;17YBq{{)_S)%1<>y4$k$65--(UO1xC z`FFcZ{?aHdv1{HZtT(moj<^+&@F6V?iQNMpk>zZ$bfe#te{J&uJT@M8d(3bK1*zV8WG zeNl@>v$E#8dGXvi#GI;h5{l*LWMB6=cUWE9WxN6H1j`#aMb;=2ryHvmU3e?rb>VjD zO}?2aiOK%(EO%5-rrEOJ)i>0~xJi5l`4ay4vN6n9yEy%p8kMuGwXNcP7KBK7yDB}; zO_Vp7U6NZ;j3tgp;HPIWmD$?JA9`2wL z(%m0lVhNvKrjJ&uO}iFIE;sp)tJX<5!fie#EbKL2 zjKkUUOP~l1wSWm;X0rW9N?pbj_bLmO@r8M5b6Di6D?2&3jk zf->BPEDbTz`fj}LMUAP3^$4GPHZ{LvE6)wTK>noHCp<(8A2t~q4L%R^kj@!7S#(W! zMIlgPZp_Lk;Q$r3;do16y}K;K|BWNrt75)z)`gzOKge|LXxY>DHx>X+)!ZzvlFO{v z8DB%u+F3Ee;wdH{J<>5va5OGe$mFql{Sg;gm1I`tZe67TA6=?auR>-erPRBec$ z)!Em|adaUaC~1b^I|%VqC&H=&Ex@vm0eCkeYRW?shdY_#ISZOET%?bUop$p%VFQX^ zZ3oA#-|Uk3P#!RuBrp&1p*)4}6m=-JZ?MP)eZg6ec_uRJMooWz8N|Mu7JzxZReNBLx*b4*yQ8HmoEw{hYJX==?A92H5zk_sM)|yl9y6=`TBxd7eZx^@ zr)CdNye`KD)bxXW?CnbX2QVI`h1i%*Tm$qORlz5nQEq(Z{e?2c7qOMGsg?3KgyYS` z`hk-XfM3aVtIX4Im`-MDJJrHoq83Gg`T}g`2AHtG!ccz;5mnKr9BX4&x6nD{iJn*LN+VF5_TyrLr*y78x_r$9Mse z5c{mR3453LBKSS}dXmE(T=l*W4;YuW6ev&sx&nwoK$swKe-C|5F;L7$;@)6utN0Yp z{txdZPNjLymaKGDvAYa_i&uzUcy?iVsb%EggPo9(o-cn~^!|!G?jUP{VTg-;u3S5) z|Nov=^>@`Gqa0M2{uC9eC*!iDbehDEi}3hAO5xx2eHOkB0hhk$eY?wPM4Y5^ zgqSA^R#DOc7Y;36Q%QgIFAcT7&<}MT$RfS9ygP+pkraVN0&<+ES0XR1F+fB@LI0++ zM*pWi-YX(Sbr#(Rv?^{tB%MKR24Vn1ywFPbPJ&{I^nlNY$tr)5xC_4?GdFE=Y=(** zA536Rgb8t=UjIb4igKod`S``=L-)I__OSzQFUorgOU54UwdruW81N@fE3J#MMCHpD zw`_I`(K+Y(@%M?}ie$5M+Y_UVbi11h3n!wk?LE3R>eM>RUmSkQRMu3T2gHK$HM#^E zR8SU`R(a#~TheAe&j?1=?;R?eoWJwCCuO<6XtMhiv4f=RQxCXfWpGi_9!FPi$jV9& zLNS8+?ds!?)W;S@VN;Kr**0XQBP6kf%vsX73B(bwC@AHkaxIY!D87pu(1D|Fqn0&V z=Ynag6JAyGO7NGvAUpB%mOQECsP};QU~-OAUuB5(D)C?kpX{HBM)xI6a*kP#tKHG) zjOX`n#LQFAjX4h~mdp=~kax=F$aLPL=$lV;>Uq6dMls{x4~{Wcu1!;7iMK~9<0htD zhUue$y96xaO+$rZHt{PJh;?+3vQb|bzPRWU6d-k>PZY3~oo(aibqj=DG~d(LcaBS+ zNWL;9Go>h8Iy(=9u_~Son}+Zf+_daLnbCU%5M6hgK@#!(iznKk#+3Eq=dpb*qbvE6 zJ_bggA8YKmUsM^Zm6p=EB?2<9vyV!*f2c!>AFH?G?OGRyZhzvVz=2Dj+ev)U!+pLB z;sRHTGc)J>F@x#GdyQ`MT*Ro)*#4%(iae%aE<15uI=W-pxqwjSc6J8an5FCd5YW`B zu!@aYBkVgVBQ0-GpLHV6wRi-Xx9$JQq6(hbi^98hW%%P*BJNiQ2C%_s3mifPi4r7S znShn}e}53WoXmHpF1$an`n2bUw|1HFY;Om8(#xHK*EshOu9Rzby@O?|$~HII{o7F| zTU8#kxZR;naq`*#5#<1XG!IwXc(rdfZyM9@B|ZEIRnU$YUG3#>uaFmNSggyv%DOgm z@PqzI+b|PHx*=Sl0whL4L#S2@is(EbdZRN*K^7;uP+iG-TnOx9LE`OO^IV!yn zBo`gB^-_^A@D)k@<@th=4~Kf8Vly_{&-ow_AvtRW2T$J^UUtIVKwV=X2_&eWmuSCx zPGxaU7^#P)N+<^}UO(ulYpb+D>cKuhwew6G#~*_-Vr>B{SJ(sP#k%6IG-Y5huV%*t7Iu@waQ45tyttXR|}C-bTT zO0a;uAc&=+HbJ&v>t`IZ+cF@j*UC9q6Oxm;9n`TI0XgJfyC_oegZy(V3Xr4D=E!cfBshbozDrPfb{zw7&=x^(uS)%X@ z>ZRrz?gY_CWdbg?%T@GOM4EIgtTwTf@NG@wNgVj}SqaoAa+Dta0zX(Dfo_6YCZql= z2h6tt5%Uedgn0#8K<+}sodh$JLzxN|-*-ze!dfyPAH?}kt_5w<-tb4V^Vi<1i!D!X z+N{8F^8<;G_igdzC$x$=pM_ zUBdFXmHR}C!*obJg4vK&s@SIyZx&o<$~V}l)Ys7FP(hp85J%)Vk@VP?XIpK#H+#Hl z8Py)3-s;Oo{$g?=eN6x~4g{vsGA&R28S0|L_P}p{e#p*KNV1JIxp2t;-5T=^=0sB8 zgjINxNpIBm6%pXH)_B58o3UOe$P4cbztP?IY!(URt;Ib?KvB`=rTQ>H-~}^Oq(rwy z?X9f54GmqoG$aa`s2q+#u0RwsD@8H07Knle@i}lGKcI-m%@m1&JEE5lphZNuo1*@; zNG8Y-&|533fD|78N>|2l4^hKnX%SGY{{r~D&C3guV5ytI{LS=GB3Zs}@HrzZ{*)d6 zl)0=93bZcJz-8Av3|#C6MLCT!U_qgucEdchI+R)OT1G$33V5On6lN8+uGJ&Ous_7| zzSoccU%q@FwWbCLq>*%`rKLOKVXJSRUZIy!*e};)^MK-$qZQzP9}o?y`Tos z?jd?4rT8^U-H!pcva+J7`h)KgNgqAr1YD*JSdMl8LOCtjo$!jn22!(eYf`g(quSYK z(?gjvwqg;nRDsHA0^L*lSL1R|3S#_6yk&S2# za-{2+DLTdvCL|{Yf%!YXHh&4rMLEGF+Qx11<1=K$d9qG~$xswGxnuBTAOtn6NI-1C z0wd-jL)4B5kwqA$5V}=T@Db& zV1_0_n_O-@d)(!?wPgyWKEO=M^QypX(ZKNXvwynErCzRM-aEZ%+B+ zj(y_z?t+=KZaf)_<^w4i97J`j*LWzsVZk?~Znl(yf~!T6+W_*NnBJ|E-#w& znO|^I)IT1S(z(W5e@#>=1R{eyCQPAUh28dR;mfB#Wj@u9;1OY~-D~PWSrw!VD9Xlo zO-PnN1-F`DGM49$I$R`~fP8PfC109`=)utn=4xjrV&C@kgkW$>*D| zlV@b&KA?6_xRQGAx&i5S#TsAFR+s46v`wZQK!UmgyU?UPB6IUZ$H8A97vcF+)X~*A zX1hG!M(-*XDGc=^FWi#&D?>*!VBVRmvy!fH#Bg_+WLopKLqX~Y_mus2RVoUeRfVX=A_!2L;#ixbMMkpQnmZtoyaYYRTc6O(cax7bG=bsOR60 z&s09A)DS+2Vp?*Q#mRH%__vEEe;;5|2mLW8mrBfs^oz z?yJLE1jD#x?ZK)`DfCv#HB!Y=!0GLm%95IcPuFnY?{Xpy=$c`P@hT%dO99oMJ!hn) zSQ*As4_>cqB+es;4N*f+-(P_r2b)|WXEGB8L~}c2^nkw3(G4by(mV2N8zK;trC?ia zTmt$?d(Z62`f{RYIMt>3lXHc@DP=SZ_ACvz-XPN*)^qsPF3-}p-&7^tDFQ=Gx@q3} zV*s*XC+7RW`BUu3LjA-zPw(0$n|}ERWZ{KPRlUur^-ToTw_@JPa`BnpCNn7eJ$d>Y zPB6^Rd7OMnZeH4BUu{e=4YhH1w7+ecQuwr*uqJ#flBwa=%{EHH?(~UM2{z%A}?oPsI%%Ft3tEBBpTXFSDgJEV!z{3{;q&+m^= z7H}wT_P4v&?>eujGSU{?nDtWAD0AfebjVOw`&B3NOf!2HwRIhK+jxOHP~#e<@62n+ zQnJ_B;KCgMZ?ERs0Tm=cc@MlHYxJ7r0naN_UvsylH9yWN08u@=X^irHNy~=3QdH#k-+;PlJrn6 zYn1#Gma-axNi)opLmu|m)W2^f!i4rnZQ-E`kiwos#jDmHZ_^X34kL#`QBMjamN0=ULTw1G)mF0Jg#TIug2l zTCKD=3o*-%p3=KIAlp1%`<52sP6DT}RsZT~w^vav9)v+1c}UaPyvxe11fY>3l2CDd zko6qx|ma-mmz8cI-D|mUZ{{X@;C2 zqcdBN^{Xb=(f?1*J*ewXhKJ%w&8>(P;%A1h^uebr>Ahyszwd`T(0h~jn)#Ao77}Ko zE190pzn;yTyVC)c%Ry9FhV3^WY0`}}DOh$cq9SETZlKj%U`f1wJ5L7t-cweUU+&@T zB|D&clbVYxA56zJO?%b2T<6rmfoQ?J!cKgxznKy%&eATxgk0+AMUQ)aKF9p~u>?e) z@+6qc&qOx4bMil)cXkZ5&as_ny8q#@^Eo1pRgrq;-~J}A=DDt36P&{TJ-%sZXrxLi zLZx((AOJb$3gX-eA|VzpQM~$L#0Nvk? zrl!;LKow`WnzHCv7u*M=bPjldzSrFyBALcHKAWH`YR!uD14Jszz%Yhczyub8YpMVu zodh6<5RDbJo7YqUO3idY`Xdor{s!Vb7bfaD0!bNgPU))xN@hDxbno)__wTC{`N4>g z?%P=iwKBX2-x%Xgg;Pa;UHkOeI_GnxE@gk~1bpvo|B!bC9Y^m?KuLl*f41Y**+u=D zP(|qp(^{|2E)6W#XU;wdg+_&T;VY`Kj}e4tnB;nYIvpHbTB?FwQNn(-f+$jf?wLpj zK)0K%i9K?Ubi!ES!Ow@vF|PMaa>$(6aG-S<8UmC2t{AX)$k5ZBQakDCt3XXL*bsTi z(~)ek#QEn!fbL%^F7Kc_5#I^qhaeAcJC@X}ve~4uaYur!jZ!Bp{`^_#yVDcWD2G(X zBZhTlw#u~I1H)*=`N{L!jtn$wYzm?YTn8)AtMzm~t7$-%5y&bd9_YjyU*y;E**mC; z6Omf#ap#A)hsXPhe02+VP&2l5#S7}y31_4SI=GA^;u|V=8H&+dg92;?gnx4=Uh?p0 zY^Y-NeqCDP0GsF1fcWJ=+k(?OW7*T+j{E`?zlwASN?y)(%F_smplZ}^s=cSPqQ!Le zmHZvVs+ABsSNDLo(8V3R>-$rZ*2DHbK2)w-sK|e+(CCyhiISwsg*#h%*1RMmk)A+6 zq{)w&MEnXBxom((qbrGxKK$ahdgHL)1zXU(Qx;Y24w*D1#2*NJsSY8ln(l;Yb(upQ zn$Ud_8~k`RWgUSoPJr57# zY|yHFh~ZM*xUMdDlj1BZI+(&${WwSMW)Sa+SZe1|>0GVK!Tp}8`Y@zB(eo?6x4J1X z@jriM>6B8iif8UG`#?CezSY~I`Jk}A=lS)}SUd#Lv0`Bd!ShIVvzwnCg@+nF-VPpN z*M6!SvEH^ER}LIbovsuMC|Y@8CN4z*R!*e$!ys9T zieGP-SafK{YKYEi$f}xmKIEBdTT#}nRekoyn9;&aPKzBeHFeO%Uc2S$j#mG6uF0zL z<>2z{q0GxJijnU|R}5D*dQ&0g;@Y|IP26Sh^YbVn-@mhURxn=Vc7xtn+}`1eKvD28WQ|48Up~}DFpIif~?j15A_nN{7%#6}UHo)qF*vTnd-EW9#d8vk+R0`YW zMo1pFGFdFSrW|CiF|%?*wqmok`-#rpgi|@ixUu4g&N~`klW}^49S^WxDWzscgc#%# zPz9(0k~9)+#u+dGUoZ$58B*z2{D5vEu#c=Ih>_l|PUd-p7l@zl)%UA`f7OExuMn5D zB&<^%%fw+3sWOq!={M|wP+8{vN2RgTEiX!GQ_bdyMXnOhN2|4rqp9)p2`+E5M(c^J zJ29_`W7QpA={CPZwCW#>F3s%7A1unTy}=o(9@C2E`^2wRzXoe+QSn-MjkA zspXPCwzR+F$}gvFdqu+OKt2A033$5R_y0Y8-V|N_1{4O5Vpe9)4($j3sx0z*`65zS zH-ia!kB=+>?YDh8)#uCbon>H8Wr-4JuQkjcXm{=)K}UM)=lWNhukc?DR}>%x=>+TYFrmN4tT<(AIwV5+IaLdb_{?b5`_;bI!@FoF5 z*_agSj;?!yDOaLRkr(JkborqUc)!RAM@vIVXT|aQ?3s7t^b%RVgP^V6px$~(LTcjO z846ODIqyRrU#V;gkP_npV3b1b>PfgtzV%LrUjhIPpZ17DqOKhW1%`jiUc_4UX6F2vmb+iMpODQSAW#L8`xCbQ z_PeQo&+&#M(Q;pw#Jr`$Oul`Jm3AkT3$2IuH(^(fmJ1vc&o0Ky)?UeKB?#W6d%m^l2qlG*OE#QXt5uI|+!r^?V0YjNFX zC`Ci>(Npp{=s%MbYRHXA0Qr_ zF>;Yh=Ji{gtdkYsTN1@?$PsQ(KGCN)>??E}jBJ-#_j({omA4Tk70qtaPQp2KG`J0bWZ%53&35{qZ zxzw-=Zzyu!vMUHy>ps|r%+|cIy*^S>EqQ=6?`P-fMeQDa+c&S>>9`bdt3&%DF>6QH z1D}=btcsFdJjHS_^#Q&t$ANk#z_6iomOVp=)avBRG(P#ztM|b09)_y9xGM%Vpruh0@bT3g{79hx7Oi_JVbS>>@v!#QWgc-vylK0ohqvJ|Rrl|S0# z-?2!TMxfCPyZF0yqTqbr%ckP=Kb$LCq4~=h*0b{ZrWYko?I^cer~{GvSmDt&x{pWK z?6+lcqTkFs;a1udZsb$)-r8r>u|Th;c_nrTdg~(=vA6}ASHphgJ+q(sh+)2CAWEQC zpBKSO65h&UT+7(e)|Rig+N2i-QJG*@(rCAKbp6#S|py;9(g@z6Cn zB0aHKEUA0dr*2^>f6~_HJzf3skf&M;qMeTo%PZF$j5X35$l@GNa}KBIg%w8wFP+g_ zg}79C`jm-N56-5hN#-gK7u(gdaxl(J)y=uD%Ko@?LzO+%bW!e+bEOr3>me^~4|o_b zRCO|;|LQ{LXRm9lN9^0X@irE6MNTtNSLvtd2j-?j{U zwE`Cd>X*Y4cOH2Na8P9~_(#Um-0)xcll=I> zZ5J$>>q~S9htpJNho*Zu{;;}LYejVy;z$TOQHhf0W$-a61$s3lO7>fwj6*4l3(uZt z@e*X-eO|6;t*FF-m0R*NHZ%LXW?klq**ORUew=MU9C4L4Et+LYolKwF8f8rn_?H_n z@mV>QbqRrK4cauE3vB+~Eq4qziFfQ6jCm1mFiTI#bm^B9+Q?Rs=}Yo3il)_a?V`9^ zX!B2%;2`+zv86_D^mC`l27SBGThjeC*zw?<(s3m{*qFKd0rY`6rTq@%@wNa={*>$D z{Xkzk8zV;*I5Khgb`xZ@IAxlFuA`Wk5FF46!oh_P#1WBWB%Cid$dhr{@dm4x@6 z*<-p?KB^1xIGd-FIz?^hxFp9GJQ8r+iHG_+@Q=nWm9ZA*Te0~~%i$vtMR~8|6DCX? z2dm@}R~f6O<(38nl^Y?03pW*&i9W!gtr&5%rK+b8mo_gr`x<^EY{QXz=im~EdHL$` zkSw0HB=65xSB@~%y+Y>53yG*(B-YTEd4hXd>nvM(vmj>T&aIJ9cwh7JNxvZ>YHY%N z6(v=UMV%c`Tl5QF9bJ|taFddv7_#n!_Mue?=L+iAXiUrv*x4Ac4pAVLi_8zcOm>jt zlHOwT0*&-qHP$u8t~N{GXRLQ;Mcmdccx%=a+ocB|sz?;%mzgu$hAqDRl}CF$PRv3! z{#Id6zglk`{NSo1RJXXjH(Z!Tiw&VhzJS%puH3XyrE-|uet zatC)ebce?Nlxqk#w39@71S(|+Zz0EUavvMAE@}T#oFappE4fyFStDVFlv>{xyZ3C( zbmgi{#A{NsR;u_Wce-SSU~4Sv3w`?{BQcj9f=atmhC29j4B5+Kk{$~aCc$#!_!{?xka9(Tu~znjsejX&JZ-Oq;MX|Jto$d`GkkfZfn{_W4Lm zD6JWuN|Jj)z%1FR@laWV(~5n!aHbeNpHkrWvmlryxs)WGC8%G3d8g6EdcBH9x6o42 zg>Kmvb$fHd4*8_`+A+ujUTA6F8qd19IBudLfA-dVuE0KRAuYIjC6(4I$%^!$`@hiN z6*Z;zg>O^$BAUAUsV>Ed>W0ZhwGoSWDHox-7w5&xpe_^cD1!S0(my52&-IyJ2zuu& zUbV-o;8&>_PPA4o;E2zhVL>?rQYiwD<9I0C4bxKLZR6>wmAQu|#h;dWRWVq68(|Xba?}@8F0)tyq+Lk#X3E_ZE9L`rd7Oq-<>yh z51Zjq%%MLAu7;3y0!i$Y##+j0uiA6!h?Bec)`Jzr>4C9nQPRUkn9(hlS^M-g%oi$X z^yzglMeOJq<>8N-oC58wiL89mjFC|I=T4#ywqGMnsPS6CT!?YDSa|U@K$Vkc2%93lG@N)lUld&H+jQ(mhO!^i zk{U}l8-q$sEZsCG|J2!hnx5;@>TE729Icf^MKQ?gZx;}kcdHc$9{uc%0X>}eDw=!1!5}RPdv|0! zyS8|UE@O#U$z^_s8FX_7cu3;5{WE5)4VB1ZYCHFc!*syt`njj}f0C^Fn`~s8OpMJ- zyW>s-C%mn>H%PNc;$NzpO=VKO{<>-BAc5DKq2$n>_exBh8QX9ic58Wg8?mlhG73fK zOx%EOou9BpZ|#kPQ@je&zwORhJo+fe&@^WL)%3Fg{_y}WE7%`pjB4+#8uD1v{(*Ab z7?S5)Pw$M$^KM599_ms_D6F=Zs(rp<9;L%u`%JN<4?2%`yktRs4_Daq&E31&P7ngI z8Z<3~h0K=p=b&Is?C%3zPSE$onv!+6YuyhWl*6XsWwiE4&$23HkYvu}dJ4j)u)-o4I~p52LM-yS&%qVQ+* z5BshEmZa#vb_D~O?gMK?VPH#HDZ;3KCknF(0M88+I7OygB4KZlFm**Cs7~sLbf-nu zV?cHD(7#f=?zJkSmJa15oz(YFcKW?W1oR1&f28cds)CJeD-qSwTsy}2dI?JD3nXn_xk{xGx9KU?ooiHTlUmf*n_^Wm!myzhi~4$`QggJ>WUje~}U= zh`;6dN|q`qP^U=DGxSO?-oeYyc&zSx%R>T+d(Z&G?-JK_vug z4NuciA9d;w4DG#NcJp*~Hxy%>Z5jH4V)e#6du$>=rB~_@_CVAZw8~R{F(WZPf@%OD zvF%lhG|_6G9ADh~;YCB%(gza-n=b;@lj&C_4!s0c&cl(lbRW6k$>1@xhU(AxSL+ML z>RHO!&fDVMEIf2Q4dezIdRE-YQc04;0?t!=dUh4cY5y8EXxr5=lfAXKjqdGz7`3+z zRE84Y?Gume`TSbpiPZZurGWj`_$X!e{OggAGSN?8^gg8^v4@q)T*islg{3wwc4y7! zRjHl0=NHsF@Zly-o+>|CclTd;{P9O^_1bpG*vLiM=U?zPCgC~{*xMkPgyn>*+btfI zZ^EijnJV@^p_ZQcdRJ4xb=^Oki({h~ql?^>7NQ01D#sN7G>e#{??}G$U6OID6KD`g z>QQ7@x5=4A=sYmkgq>pn7|Ql@YJ>YctKBGC8}t*Hpaf%TN-QaF@0Hm<0%}SZUu7;^ zIv44bIizWN>g#-;okbd+dk_m=L({f{gDw6&@w?} z^;aN$F>)NZB-O0>`4T2r95u~%jPq02I%cNj!mrg4f<|XA-N&GJjhd$y*5^d>4Sa0M zGtyeOwkG7`zpXr~n8e=o^kA?2u1|v zA=o9jr_??5c3(7ucISj!SlHXy=_o=&51#z@{e}ztlCA20y@qLcbm)Iq1_PhVk#e+@ z(xH7w)^tn-T?A>+84&fC#{sJ1Ar^e)=U-^-qRr%9kw!lb&C3aCm;^A2)3@&=xI3nM z;BLE9`M{cS=pTj3EL1}dYOFvIo5?v_hp=Vw;075YCi3rVl~u9pN7gnzF~|>};{S&) z^|aR9msgi3#z#kAE(3qXz72hGVZ=i9nP2 zuDPg+*u7eKiC=9cakjU-FV4rHA8g>+BDv3(g1tk%4Vlt~ag(4)i5d9U=6srLTL)l=z&I90hn>DiM|OkOxj zVQOWOIbO@}s$3N;uFiSdW9W_$*Z5BC(U{ID%4X-}beybP7o+Aj_paA2NS$ZKYiHgU z7nj{fEkzIR^V5zG~C3&kYE@?v+nk{puj!IcD65vQtgvcsp*66KQp(7_Mx6bBB8gK z`Ix{F{T6ypfE0U#>auDaYUwW%RejlU;_P(tN4}y_;*4IH+ay`SiD9Q0Jf<4$ytGhl z;5rB8OmrVE;PA%3AYUFOx;jaypm1AjXK-b}a8fy51>dn~rh7cdS_9v@Rs_zTMglKc zu_@P^x=feAD@PRfNSOg#Z~qo%Hmac3A(7Q}L)PuhCAQ=09niItfB#Hr1^2m7cm=sNyO0SidT-VoaisYG<7frFUX9 z!&Vwn=avC2tka&btj3B!X<~XV6`;W(%WYo@yXa3#4Sq)IQu+C=JK^NV;)T){U)kjy zYA#w2+PbW3Q*aooGkAYYwaD9j`a@7v0UEeG((*hRz(-d-khK&o|e#&d{7& z7EN30R7=Km>ejZTllZzED3Gey_V6k7Bi~%oCUw7#^;cnKoz2JJhzC~fFH<9J6g@`F z;Iz6x1=^P-V@>lnhAIAPVJ4B^{Xknm*Nd{_h?e&`7JC26TMW-lTjpG!*Ft1=cJyMx zK%PosgbAtYeJbQ6S&H{8-bCWqNt1y6J_7)9;b_ll%<`oIf7=5Q=$j|56tj&EwDmSW zFS?<~R&^qch`?E5X>Zps6;a#XXyfO8wX;|EbXU&4_x`rZ)AQ=;pfY0_A<6%9e<7?} zC>sSIClLT+bMq!w9|~yxVNiz&@krWjxTK6-`EzO4k9E7HG0W==_tZIwGu2}r z_uh}jE-%EQ3Ftiz#_HGzZS%HAS>ws@n|!?uhbG42Ukwm*dzxR@h+}ySON9qI?Kx$( z3pxFrA0%U?jj+!olH5t|{5=irIq*!z6*^&MsW&<2O}N+D8$VVFDzvB8IGYf9#ne3E z$M<(MX5D(0{EMW^L7hGK;|H6|?(6LRbj|bCE~!{lPHfvZ3#+&9 zZSHEbwl-$@q_oO3Kfc|e&xda1+qq>2A3U3={J`D0Oa>B*A&TW&dOA1F9^&A4cfPvd z7{kEG^+%X6%#Hck*xHi;q#sM+suKx%yRzO|@qT*nwchCmk6OxGz4x2jV$vX23s{xL z5@>)IkF_D|Y>*mT7>0)Ccp>^}5hexDXMBvyxOm5#w*;og%0VC1 zG>_%ssmmk{l@G|_z%|~s)+aMC7_iw;_N>b;jvkom{dDuOh zCWtoZlW+PDuO7z4#EgUBaQZOV=aG-7#iBq0cF%ty9m4)_r&a@ne>9MM)&m3;F=c=} zP#zWORsbu@81GYX+rQzQ|9bmBx16PJw z$_T2xtB=cgph)&s-h8bo^_{{(1}4eiJMVVg zG+B$mKVX_Q2U$#&*>Mq4^I{qOGAjU>RuDyAmmmrc2Re&jxCQ@$b*@D?b!8S};w{QI(@e@6%E?aXYz3Nf5JRh^4pHDh32xt@a>A8(zCIgF0Zu3f=B8Q=? z{{nQ@J3cSDRpXI#3_yUmjlgY|8N9M!0u>QdY^*`lzsm@yDat{qPxG3!y38V!Gj2JQ z#o)&i@opv+AT{-LqE)#>yi~(~fUx`CSZcC;FV=!h^yh*r3O)_lL9G z6a(zl#s#=>VGGCg7WM_6CX?w`&c1y(W>O2i15j#v@Xq-Ih?jwqX7 z1<=h~OwkftqYG(&`ug*urC!rLacUbi+Tf*_=HGMnX^_?*^GW}Nt2C`R2d{IY6Mb^R zPSLImk_(2odi|%VZBC?At$fWLeIPzB?H2&E`;bU+Y&`^#0iE&M=Ul0?nyyiUcqN&G ze1BOQ60RucNHUcu2UzI>N_O%pxEc1kY!17;`MFzKQlaQTt|y{8$>#T}h?{0LJ}r!O z;w_yrIsWz9z?q{9566?D@UL80qVfjg%^jJIS(7X&qLbDyK#j@? z7H)EO;;|EHX7j7rL$B4u_KaIP1hi3P9A8~bZlP=*=`G}O+5l~YeR<7*NJJYEW(mGE zO4^qR>(Y~;ES>LD6U=SvYll~NnMqiUA{N3fG{(>R=NI3&^xHrzynX%oS2t2VAqTFq zTC%7SCW)&^{|7+z!y3&mQ;$HPt^}};07mi-J_V;{E~gfIlCWZ+bkW)-1J0cRC|`)2~ylDW3M23uCsh& z8aU*&BW)V8Nd9?6hgO%6p#|zW`v9V}-ZY@DvkgeGguZo4tJenU@SCTrgmHh%$;c}} z)3h-Y1~8H|4}ah+E%KHFYpSs*2ir}1ZW5{RYTGr7*YAnB5McAVEh#5Lm631?U@Qp6 zLsvIZm3RpVzeB&|#+xhNr0w@q5zdUUtcb5J$#N-6o3L>$fIT5=q3%f`m<|j~Bh;I| z-3GwpUki9h5eAZrUlp)1T^me(5YxVg{&2O6ussgqb~ggw_MWLZcYLVjgG+?BC*5tKDDi@1-p%$NRvD$0Q^o*zFB%O(gw&J z0Dim5UYN{kK_ASF1KN5bMjMFp8oeLaJp`N%t=jV^Gm4|d#y5aMbzG}Ub9Pv>yU|m% z&pF|T9@xLrDIE~Vm#3@GzgfX#%l?d?e6AK}Qe!6(*IIOFOD2b!rr2l{ZsJ1cp?5kr zz7MS^a!cbLgu8+D2XhMjMkVZxFWYRp#sxSAGCIW9Wn03+O3;`9si`r;pn>$7EFYL69p-d z^)|)+S9t%Lx|ax2rwhoC{*F^Xiurf0zkctR1E-4;2>sW$Bus5xoRZ z9ykUqJHUubM*iQA;@}V=M*d%(9{wjWe&ZWt{@>6>1&}S@-3V&L%3rv23_=4)r_s^; zg5{-IXCUlo<$ss=ZNzAv!=jEa&rgUP0!N)d3LJRp-}39dQ$>9nOf$SebwNRN4Er10 zI1;JvX>V`uj~D4r83KY(D8u_TeKV3Tr#OF75C`8K`8~mYF(niFhHcI&20te7 zjp*v2!jdhT3Ga*`yCHQ@Os`?E&Sg*q<Fynqs-TSWP{)6wC_Vp4VZDfdK}txT)L)mqw$r^c zLdF#3?9TZ8S2JzPjO$alIDN#e`SngD-G^qE62T<{c0!Ksm0^794>v)iX2+}EyCf}l zVB`vy3$pFv)ldWb$D%_-*0t5rwG7GdW`#IbY28bx-IURrnX(*^em#QQbA-q0y%J!0 zeH*OzmR{f=Uf~Lu`oipGOtlrimBT|Pk|L`FB;E6lqtKcC_-X&dSj#=@4&djSF3867 z4_A$x($a7y-${Y{9lI+#5VD<@T3SaY%=)*YcE%WoIgj}ch5I{^PK7I{RDXICSmqTR zlqmA|6bt+aDgb>Mo>Q*I5poI0y=Qucw|$vD`EZ|wo60?_*GDEM{>B0+*b2$MgNlOtY^#vO zjv^piFxmLVaJn-^_%3iRH=XWDS<}=E{0P$DnOntINSn{Sby&8zXen)Dk!137mU=^0 zlrnsd#XZq>I@GQbU)p`BlMY;}&f5 z?`r)Zr|sM(w-Y`+(ex=>j^yQjTN&R{FU6dvfK;8>8Q=x*$H3B> zPzU(a(7KRRH?D!HfUR$toZ`+6`!R&z7pH1nqeQ|O=4vkAibnftXl%s;PFEzJL}$O| z;E@Gev8gsoI|r=6G;Y9B*uO8LWO+7QI~|HK#dX!%?KzJwX0q-CZy)Vz$h;t1Cg>>F z+Fq218ovZ`ZB1PJFDB+~cg)nrMy_mE+tRjl&s$U$`&L9#@uWoVndo57Ry@vH7pB$w z%-th&-`7PMbnm*yx1|4MO%RnmTHn1YmvlZ1xys7P*!L{wA?wQssU9)rdp;9I4TmKL znMYgoG_z)mvdgC;Z*59+rw+#Y`^xR&CnHJ%fsz85`*b0pKI z=8;E#F)nFKyS`Q)iuBa>9F+;Zc+EV*FQ9NsarEP8BkP@zoCj+~s=$w7Cd8TYpG;>h zdhMCG*VXoin|J+dFIEE1y_A9VR_r?BMeBEm{yRIN zAnN@e08i8I=1F4^!2dI5e89}dl$jee%O&VaFQz0EIvAI6Sv(-0K3bjJ?N87IeoSw~ zPr%M-wwii=HlJrUtt=%o{<6^DV5M2@mH^)}&twF#NcfH>CH^3rL?#y2(aMc*y4{Mn zK~5wph9S*eB;lo7R`g7l(JUqs7d}(j&rAK96qTM9NQFI*OBm()eU#4LFG}u?&ny+8IK1zE%L1d$iE=Ra*tk0=zk|`(;WL#5B za5#on%xewr4IF_443$^^S!nlh*!ub5h;udNky@MiRpV)~&Q@V3b`WzV-+1YJ1>D(+ z@RyJrM>=tfZTt$QChYIrA?j6H3ax%w-GMXP`t>T2Q|URk8@hQB6Qhi`eL^4#yIqA{ z!RqHOu#7UN=V3mq@uhbo;L!I%R`VSOE-b12)5dQEK=2-P7(2Xaj!D?5s~}t5AyWYH z(JHO*KB7R(M_z_(&=!}r@>rL0v~|{o9ErG8cU!HYaOZndmfi=Xdt2$KZ{ASHvD!W@ z!)H6h0R+xN2|bV)HzTvLVoI3WMedzQcu>{%ef$*bza08}c3D6aA}) za%yQ)+#My@46ub;tyeK4GnsFDxEIZR&ov~$Fj|wZSk=lwSO|pIdx*PjY zY*&lMf2F^1;*Q*Sz_DJB}SzAfbl-68{(NbuFW(#hs4y%0_ zW6%q3*j^MMq&HL5^=+o&+355ei7D(1!Ae!VRcB0ThnMG+u1yFNnw{7D<`Nb8bv~A0 zL=?DpEF4n6duL1oI7wi5x&{n)gnDrz`9X3FN;QcM7zFCaBcq)wy;q+Ko3{wmJO2`J zIJmz29A4Eka=fK)e#9BC3dtkRbvkIqv7H2Fa(~{^c-Oa4*XO>SQpD{3GwzrbByMDS z{^$UqD4xX`1>wsX#yzfcbk&b|$5hX2S?ie$wiWup*$Q2sFgd{RK8i*^2^uS-dYvg# zza9df&F3D>^BQ4>Kpbj!dnT)i5Q)i;5hqf%d_$+?#N2mbgtHe;`+5Xi&M;QhP*IV# z31H{qWFF4mXipyVJj9l7r2FbA*)I7CVoW!G=b{(0`?0e6>qo&1SLsfYc!cd6* zl2d>=*NRS_fsnEQp9Ou6Ds7Ew^w`2lsgtW*4D7MJyZ#XEmJuM;%4wbi4@m)2uob}+ z_(U!mmG=3V%DF*$DZF6%BNQE_9|)j#tFCIwX=wB(2({&KGWAVWfcI$D@Qfn@jkw~! z=(3_}&o{8`u?g968~v8X<_l7fm*F8Q2FF+@8>=OrL{c!G@ipT7brY4&4{_(}ziR4R zG|FBh`h=vKWgErNgO3qVx6Q)D59*EHH~i6AeyE))sPohMClW(4E)u@#x0Hsv_%F92 zc1G6wv1~0>S%>}YTHXfuo05g<>MefU`YuZQ+wo-PW1`KXX)|)KX7!}{@7KjFCC~5^ zU&uuoiMeXxGR9C;rDJWYlF1f+P4y`HOM7q7rcac2OEO0YCPZ>74GE@^24pqA^pD?U z&dqehJQC#CH`O!f`SJ|fGWUpHm2jRUF+gQPC za3e!+y?tZIzGLiN$%`)Lm3%x5yR+$Rn&(s8+~9qWK|3aHi71lhYb1sQ9H_hnx*Y`I zDc9(^Mcz^WF#YmvxI3+lnm_!*Hr==xdRt`oc7wwXRjw{-eL{l;TK6w=r=$(yoV?{`WJP8S9(sVb@N8+mC#aLbrJT@J03 zo+sylNh${W2qaec(9ZM>E<7a3o^Y(K*Wg}TVhvsYh9A83jmx|KUIXDQD&K8$LWu6t zb`k2PWN9kB@czhefJW&AJJ&*-K$4E3-7Uh=?LiJrlH8TQ@IPL zIW>oNY{8^bY?#a;rzi4LHZwF+eSQVpnRwIM5%0Kq%y1d^9uUS*J`{I4BIHtSYl*~@ z(W-CP*nDDa#bTAW!N*V1eO1ncV+Re43shB`mCn`52LUi*k;8q@Zg$A*eDg&gk7yPk zV{|vT#tT>jy>?`%Ip%E!P?n5WuoZUlXvjcAs#!j7Hr-GCv^wm z>NxW9#%MfPyoOM-?~Uul4*4Famk=cXGMYD#=SN~SBPE1t;R&R$@t})~gD6L>I?#ie zR}=7(Ngc?`h;o(BN~eWo6Uc2sWLBmod8jOzlh(eCRW=%_!s(b083_IH!~OSWyx3M! z$qvSRj6v6kgQKfgCR*`M@vZlP{iUdatDd}W6_K705&PXPppw5JycdFJzGgR zX;K@Iqd^{t*3Vv<>W9*$kQ;_(-?;)*F)JNpdx+TXFY**{@hs@GawQ!$wPVdZzh7QKUMjuM)DgE4*#LVdI$*DuTR>0^>f49f0pWto$h&J*Rc+} zec3+KJm%L@W|MNY-szwaRln;(F61?PQ4U59x~GlL%U((4|vSS{yXBwFD4!1^j*^GZx$=0{R_lBsYE z;?Q!_qn^by(TqL8&$vfMO<*L+$+#Dh_qBqcNCqNlyXuL+1&lhi>53n)86;W#D69;!2l}e*My4`!>y*G3+eq zJA*!QUMyFpUO2NZ*aq;(T{EJZEK`R|({0pYjL;RF0J#~%;pa0?*FJ6Mt+8(Wu(&K3 zrzo}+u{KoI=KKf8q#t0x(GdbOh7vvziEEeRZ|M-udS!OK>ODEwN&dMB+EN_vS?<*HWJC)0duV(_(ivJpb zDfeE0_+pWRER*$1IJYw7QXHu5*a26^e~gM?*Hm&-uB;lH+nCD;{l@_H#=e;WVzS@u zBRWK+hNb=0t=?`$ql8`i7ctLuv#-x$|1pX>mw?#x{HfTSNqJta@vBS}!}{O6$}hGw zzxZ%)fu&N~Dr<~5ojURN>}WZ4{&PakG5-J0&p+GwFHP*ft$3?fu_WJ}`j3|8|0}!{ z3JR?(ey4&li;BRJl8rX;q+Uqj#3dtU8nttA^ssI{BuLBhsJ}jwydxMe?*XH;>G;4~ zwY}@Gk!s&YN#nOtU&Aw7!2Cns05hg{f;M4?;n@Jb!*a-eN884cPc)qNJ+S;E0KgMJ79gfhlk=)pt@)nsYBLdVRV&+6q00AH0yKdehQbU-P@0cgJGEaB%R1at3$f`ABs zHt8_B;w}$B>;MaVH;@^~&u{s;nAtoD#*fx8&3W=KeP z%)-|fYwuRQsbW;2fW86z%XcFc$?O16=TG~FUjEA(9SCHAxV;q!+uh0sqE{3?P#|^2 zNy}(q(IUVRGpY^Pc>hcg^>2;QFS=m`sIU^$%X|b6utkU10`JHIa6R9NZ_=uTCQpVG z8KNpV)iaSV6;uDs`2O#r!9L4_c<2*)t+SHSytf%%>h(9C#@+kTxK`uqsrHtq-r#t5 zhuW;T_q1HcJ+`aUx{Y`KG1WGiR{CIq{=1v8>ybYWISX%lk1!4$dS*Yfe^36|y9Xm` z52x9mip_oaP$w&d)sln+5{`zjhE;iE(NR#)LU-66>n!9bC0f){%_0KR_&#u zzo*elJ-BcnCTMy%nx~*f&gqluF98@80zfg?te_X9Uux8@*#%HCdWj~wbGU4%JW2%M z*&^U50dTG~bSqMlh+1`Up`e(r$3>&fi3|Q4mfbc7!bwzLVqWGeXO1QT$13B=)OUn9 z9R)PES?b7!NauUT6(F?0^OmTkP>}*8&IP+~b@^S!dpQqxy!#DjaJ4|L*(X4g{8nMDf`du_8%~U?D6|c}#0;G^0VBQs)!W zoMy?|+`j+qw0fU!ZJtuyiKf&I-OYao~ zfgP{`Xoy)B6XU0UZNF*j-a~2G4CEH_0KlogoWueg!#@S@w8|azkAh)Q(4JH~D2FI7 zzNP-U7h4EG8ZaWH1jzouoRQ5M$Y)FIk^jv zfo7*qJpbwb(2go|EpXiP8=&h-STA>5wLCv%y34@4y{LkR@sHTLqvoLJGFsR`Gu;R+5aBfTH7&cF1MV>4S?)lMJU$) z-uVzo5I6~*Q<%2gb~{)v&h{MuSWM8l-;(#BVA&0l{$kzLKJvnmx^h^b&Dy+8N9LLO zj^`TgE&&8v1m;2#b0F?KuYRtpWJ%6VPy3VPw?z01WkQ${p0fwv6dE<=R@ko`rYP><=ry?iKbWoF~aR zB%=5V0|>WKfB`;p&7lFA8<1_Eb(CI}%$i_Z0Q%M7f{Mo6tp_$>ojCdT{)Gj|#rG&x zE>u79hzvCbY81z#C7s%@1L4wUxTM+RAFWLZZS?KkFH3Sp`0$77v9FG}+YV|&lz<2h z+lGwN$-*fB61Ao&MeZMZ-o0nOE~d^mTF@WkuQs|lM~hhp9>tLs-pn=;WT9NOX}YO>8*GoCuJ0G0L+-0LMQ>^Fiaug zkP4dG>es^g~!=cS+5KnDOS9Y8>ue1qlo^kKqEzKKCMV$2SV zf`@hu5T4sOZ(}Ne+fK^$&&d-a0iITvgPib2{+*t!`hNi8^trJcXI^1gvP zEIrMrs2Od`4ol&ZxZ?MzHKU&gbHr3*;f`#}DXu|BSf!3~U9^ZBk&@l45^VHM6QbX_ zx&zG6Qtz@K_@J)+Eo4!9Ep|J?)X{xw(0APt8$1SZ=cH9fi#GL*9~Qs!4w(Dg-MuVN zwv&;{eP6;H!Q`QZG!Y!x-onr`XnIzPqE|yU-fEb>L}C&Ia+HYqWQJ!svB_$h958-) zDDJ!`mO2+{mjJ7tD*Vmmhi?k9$;dfiZy2lm+6B2&3)NHm?e$BXD+#&0(``H0o;4kt z^&(L+ne#T~W#^%kpN{QpdQpIT#ZwVGQSd>B<88A8MmxW;7YAb) zqp#qa{;{}y8}3boOl^L%v%(1)*i*ubL-*8Hx!c}yDab1vLd0wDej59)u4jS3uSYIa zE4#&yh203f@gUyt^}&DwYyxD|ak8McGo_kF4p|Jus-0;@RD3RUjK4YlFG*DoyqswrKAct8~g@uTHhuf-1OV9zO9C#R^od`}r?G9oGU<*v&<{Pyh1Cv!6I zp0d)(L%20FPZx=g;V6znJd7`RljS+=y|!tz>^AmW1m0(Dpi5!Sx3}OVgKG>`s%yUBer-FVwmWAGeS=Xa91txuYAU5|Zo*ztDb z3m7qw>9PLT@Lwr8;CJh~HehpW-y$cPN!8nadkrKaOc%{0KA+gEHB-2*y3T_jtxB2F zDVaju;plu{RULqaOdA7`j|@O>#Xh)^I3=DDeknq=+^bY zW$v^3T6JytKRP(Io$Bn~gOd(|!kF!i&#ayr+s{3=c4jWR_rM8(#FmeRxTfyByQ2$d z6krJcN-(M8z!eO~myxuU%vNNorr>&klA{;4W#q0kz$_P$z zI)K}%U1q6g5o+I-rfg#P$b~J&GyY~j>|j^(F#31)vv(G*&GM$r_f50%0X)2M(h*IX zE^yr}OG0>4Y_k3_2#aCi1KUWWN8sLnQ^eI9ROO)`We#X?gnqwWG(O*W z_FeAU*iD|>+e>zWe->+2pG|QT9;x%*G)PaBVa>jH>TCJ`HL3Y&mB3BAq)--Db5p!G z^sLzB$J=k+VOwU4c2xM;CY*s`jAlk%GG{V%u;sOT$>!!QA)88X<^Cf0P&Xq%n6gXe(^@AKlBYYuDua(ZM?^@-ueju1oSBYF-4>nvc%g zcIleA0r?Zyhg5T$!})>^`rp>IlFL4EFvPLPZ}nEZ00&%I|0G$i`63(}5QzBQNWQK6 zCKepfCiKm;*$NOVUql`p&9Y{eSZK{*D$f3GXv^mm+5@U3?0tuXw2$hzvtwS+C91+Y0e1`!&V7>^rOu)e@3s83Vw>zOCnKP1`&3#2+Px+V0)Yx@UF z6x_7`+Fw;gMoqa#OaB-W{o1V1Ya zXNjZR*}^7m<0)N@bgJivcezT~#(IEYj1Lf@Q=TNl2IOjAnmtV_T(kZ;5q^LQ7Iotv zCfo6I18;$(0DsST&%g8FALaksOuYY?;LCm$byNjT>_1@%bO%(lK`D^YVnz!RGteL! zj`ndRNfSWmfreXx1Dk+W-mL=em#Y?M+YJb(Q?$Yq{N4l#R9-KhD#Uk{08!-;xR}|q zqW5b+p$2aCzgq!Sf&s8Spwj4MEF-u06P$1$?{U@!TTt zMT$GGeU1(zmf8-o$lvbPUBT^^Ml+scQ(q`-i_kqdq2BE7x%vL?mMAm!yG&aK2Mu?xcJv8CN>V{RU+X-s%k; zkZ&Fjk0_hSsXt!7P-1W}YER~&8=f#ZH3Eo9i};3HzKuP!6|CfbQVV=COzlwok2Xtk zP13Ch9-8_^ORST(i31Yg$>GjUhwmH7!-(`iNOQR117A^@W^`nxe;~X?sywGIE*2W8 z2L)_hf<1vPzh+2&D-V&Tx`W7J{>jd>eXTd!fGC|xas;zvFyRs!WvP4RI=Nsl#WbY` zVo{u)j3j?EwbiTx;!bva(h#?~Y*}q*A`%~ZQ6G{r@^1H`j15@faqAz|iWZMD52br# zq23)5ninafriU)jj9JET0}ZR(a7?b%W}L;np^x4hYjVBD4A+tKCNb-SM>V$N!u^(f zQ%06beLMNE75U!TtpXLR=aH62PPmL2``ZQT(ZCmMna?9!uw_mJZ z>G8lAoS}^U1QD@X(AtYj1^B(8ZyN7kN8vYVmxrAA{csOuZ@fMVCnAVp&mV(uRq_Gm zXQ$_nR-3)x)pY{$uUd0^GfN$}EfHx`f;S}tG#Fy%uAk#=RljquzyN9yZGNHkSkls6 z_hVa*86ye~{T#2Hx=7OP>s+(`?2WClNn;NRX(CH~%8GQ`rrf=EYDw|~qiAQ83pEaA zc;md)(;ZDj8@2_MG)PQ;k`m-aQcf_WY{HJW>`Q6=sI6?nbo*1A12QTfieJHwUk*F; z=xu9b?&06hSl#{nwXeP?cXPq|$0v@dtW2+~Qo_cAn+Bvc1Qb(Gy=5}?<$kr=+|vC& zKnSuE%)B^QJGt7dy6Lv>v9uH@7`PJ)W0X`<+-n1Up~I{He9@%4t*TYx)~4IqYG;S8 zyW3X0{}EPdnDf+Tqi4bM>kiv%vVH`sNayF&hLYPy)u>y+uQ_-%u%0GUqR~8u8WmIq zfkdc5HH+rjde=WE2H;!jc z#ZOo1v+uxIAv0{lt{_s1$a5l0)7_TX83^~G1Xc06C43k@jXzoNnxp%}?WXdjA>XD} zPo!m)46suvWW(0k()`2`n->dp)LrXVdfeV@g`E$Bx~+B2T}?1-Tef?H=F6jZCdOj?yw81d9+G@rsqfk#JgqS?1@L(E`z=)HVh0w_R-r{a(H^s z9@91ToR?MVJGtP^&fC;5WH^OztM*^<(KW~F;u9^=_>gsDUQMUwpZYJrFk>=-sIN_+ zefj??!M9B|gDc^8)zh1GLT=B*EQ};DbZ{}B6x6l=Q!OC{vb1j#V9b5D>efnkTPnKw z?8hId+`d9b#u`w}M@1=sKAee?3aBAx6uRz5>^kgi6Tm2`%1}msjRknq6*tzcJD*(! zERYJJEK^*||GKJvzm`XF1@{clm8|F_Ih?^i`G zEikx@2v9hP^t=Bp8v>a}q*-=2cHLTvEFl#}cB3R;1uh_HlJ067kij(BEct%*YX%(@ zK}$C7koO`Z26z#Pw-!Po{0toVqpSoI$oQaJ4BfK+uKyQp*LFeVy)Qd2B=fluRG5nn zHPoW3p(}wo=!Jk*pLDd;a%4clxI6;QUm(6AH=huMU6lRq!Z~ttcCnq(S=q%uDiFgp zre$nXF73UH-hl!SYQ|c@$3mu{(POlFL!WwTpSZe_8_9SiEh(9k>>Tcg-CtgvSh{Zb zRu9Z|X?4V@+eofbZ%F%l>eu&S?aGBsk$ExJN2!%`V;z%SWG`}L{i!O8s`G(|z7Wc> zgj0c^DqT|iXVB~q{=ueQf~-Jp?4m#;1z9o|gB_DMU5ln7ElMVem=V>~B~kZ+`9!$O zp0sf~z0oXtSNwTtJ-dXkJ0Qwp4)Wu0P*ccJvp2O4{G-ugdlEa-e_<#6gIaJqV0=KB z5NlC%d62sHG~}yxd%6p4&8udUQAragjXof63Wu3=VpqpGuMKkzyji4MSEd-rCd#KP z=b^05I&9ryZ7z-ieA1xKxxm>h#uq0YQOiFGt)qHam{3QwTW((k==y^QO<3C3mYq;mrCeDkQ(9n@ zwJAG`^ORc-RH@5A?PWtIJx5;jf6QfsZ-#cjOnz?)ZyMk?xz(27Z_4w`(!^OEA@aQ~ zbhU=pAuY9_Co|C7V9-%j@*B!|rlUnJKg>HHhO|XKWfMo6kzHnL+7OVb#zB_^B#o?m z(=kgvYxYcIMg6RXcakcFZ=Bvlx!gmhCtZdT0F9JZ)UtutGr%+$p5+yAVE!wl_Ha+GPCfF zDUyv{a`b(&c1NWdrJePbJV|F>>It7q?yz(*=≈L~M4WY8`ujcESLJIPBYUPu$%V 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 b@lCMn9v1#g{$rWQPLZjRl_A>T&L95^U{OOs diff --git a/docs/source/Plugin/P020_ProtocolOptions.png b/docs/source/Plugin/P020_ProtocolOptions.png new file mode 100644 index 0000000000000000000000000000000000000000..5bb0c2d665ae3f6134ee63824201be00c1a78efb GIT binary patch literal 15294 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 literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P020_commands.repl b/docs/source/Plugin/P020_commands.repl index 9827b2a65..021d8421d 100644 --- a/docs/source/Plugin/P020_commands.repl +++ b/docs/source/Plugin/P020_commands.repl @@ -35,3 +35,10 @@ ``'0xXXxx XX,xx-XX:xx'``: A sequence of hexadecimal values (range: 0x00..0xFF), that *can* be separated by a space, comma, dash, colon, semicolon or period, or are just entered adjecent. Only the first 2 characters should be ``0x`` or ``0X``, the rest is interpreted as hex bytes, and appended to the string to send. Quotes are only required if space or comma separators are used. Using this command, either from rules, via http or mqtt, the text that is provided as content is completely sent to the serial port. No extra data is added, other than any (system) variables that are included, being replaced. " + " + ``serialsend_test,''`` + + ````: Text that will be put into the serial buffer (nearly) unprocessed. Only the regular variable replacements will be applied before sending the content to the serial port. + "," + This command is intended for testing as if data was received via serial. After placing the data in the buffer, the regular handling of that data is initiated. + " From 107f7fa9e82e0cdba1ba7f1debaadd8b49e08536 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sun, 30 Mar 2025 16:40:01 +0200 Subject: [PATCH 03/56] [P116] Fix typo in docs --- docs/source/Plugin/P116.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/Plugin/P116.rst b/docs/source/Plugin/P116.rst index 103d877a6..055437123 100644 --- a/docs/source/Plugin/P116.rst +++ b/docs/source/Plugin/P116.rst @@ -141,7 +141,7 @@ Available options: * *ST7735 128 x 128px*: Allows about 12 lines of text in the smallest font scaling setting (the 13th line will be distorted, as the bottom 2 pixellines aren't available) * *ST7735 128 x 160px*: Allows 16 lines of text in the smallest font scaling setting. -* *ST7735 80 x 160px*{ Allows 16 lines of text in the smallest font scaling setting. +* *ST7735 80 x 160px*: Allows 16 lines of text in the smallest font scaling setting. * *ST7735 80 x 160px (Color inverted)*: Special color inverted configuration as used in f.e. M5Stack StickC. * *ST7735 135 x 240px*: Added to support a revision of the TTGO T-Display 16MB Flash module, that won't work with the ST7789 driver, the seller is claiming to use, but does work with this specially crafted ST7735 driver. * *ST7735 172 x 320px*: Added to support an ESP32-C6 module having a display with this specific resolution. From da136a0aae7df3b626981622af41666bbaee90c8 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Wed, 16 Apr 2025 23:12:28 +0200 Subject: [PATCH 04/56] [EasyColorCode] Add more plugin commands --- static/espeasy.js | 4 ++++ static/espeasy.min.js | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/static/espeasy.js b/static/espeasy.js index 010fb6ce3..5155e6058 100644 --- a/static/espeasy.js +++ b/static/espeasy.js @@ -129,6 +129,10 @@ var commonPlugins = [ "as3935", "as3935,clearstats", "as3935,calibrate", "as3935,setgain,", "as3935,setnf,", "as3935,setwd,", "as3925,setsrej,", //P175(P053) /*"pmsx003", "pmsx003,wake", "pmsx003,sleep", "pmsx003,reset",*/ + //P178 + "lu9685", "lu9685,servo,", "lu9685,enable,", "lu9685,disable,", "lu9685,setrange,", + //P180 + "geni2c", "geni2c,cmd,", ]; var pluginDispKind = [ //P095 diff --git a/static/espeasy.min.js b/static/espeasy.min.js index 06a90bcf7..626e739fd 100644 --- a/static/espeasy.min.js +++ b/static/espeasy.min.js @@ -1 +1 @@ -var commonAtoms=["And","Or"],commonKeywords=["If","Else","Elseif","Endif"],commonCommands=["AccessInfo","Background","Build","ClearAccessBlock","ClearRTCam","Config","ControllerDisable","ControllerEnable","DateTime","Debug","Dec","DeepSleep","DisablePriorityTask","DNS","DST","EraseSDKWiFi","ExecuteRules","FactoryReset","Gateway","I2Cscanner","Inc","IP","Let","Load","LogEntry","LogPortStatus","LoopTimerSet","LoopTimerSet_ms","LoopTimerSetAndRun","LoopTimerSetAndRun_ms","MemInfo","MemInfoDetail","Name","Password","PostToHTTP","Publish","PublishR","Reboot","Save","SendTo","SendToHTTP","SendToUDP","SendToUDPMix","Settings","Subnet","Subscribe","TaskClear","TaskClearAll","TaskDisable","TaskEnable","TaskRun","TaskValueSet","TaskValueSetAndRun","TimerPause","TimerResume","TimerSet","TimerSet_ms","TimeZone","UdpPort","UdpTest","Unit","UseNTP","WdConfig","WdRead","WiFi","WiFiAllowAP","WiFiAPMode","WiFiConnect","WiFiDisconnect","WiFiKey","WiFiKey2","WiFiMode","WiFiScan","WiFiSSID","WiFiSSID2","WiFiSTAMode","Event","AsyncEvent","GPIO","GPIOToggle","LongPulse","LongPulse_mS","Monitor","Pulse","PWM","Servo","Status","Tone","RTTTL","UnMonitor","Provision","Provision,Config","Provision,Security","Provision,Notification","Provision,Provision","Provision,Rules,","Provision,CustomCdnUrl","Provision,Firmware,"],commonEvents=["Clock#Time","Login#Failed","MQTT#Connected","MQTT#Disconnected","MQTTimport#Connected","MQTTimport#Disconnected","Rules#Timer","System#Boot","System#BootMode","System#Sleep","System#Wake","TaskExit#","TaskInit#","ThingspeakReply","Time#Initialized","Time#Set","WiFi#APmodeDisabled","WiFi#APmodeEnabled","WiFi#ChangedAccesspoint","WiFi#ChangedWiFichannel","WiFi#Connected","WiFi#Disconnected","ProvisionFirmware"],commonPlugins=["ResetPulseCounter","SetPulseCounterTotal","LogPulseStatistic","analogout","MCPGPIO","MCPGPIOToggle","MCPLongPulse","MCPLongPulse_ms","MCPPulse","Status,MCP","Monitor,MCP","MonitorRange,MCP","UnMonitorRange,MCP","UnMonitor,MCP","MCPGPIORange","MCPGPIOPattern","MCPMode","MCPModeRange","ExtGpio","ExtPwm","ExtPulse","ExtLongPulse","Status,EXT,","LCDCmd","LCD","PCFGPIO","PCFGPIOToggle","PCFLongPulse","PCFLongPulse_ms","PCFPulse","Status,PCF","Monitor,PCF","MonitorRange,PCF","UnMonitorRange,PCF","UnMonitor,PCF","PCFGPIORange","PCFGPIOpattern","PCFMode","PCFmodeRange","SerialSend","SerialSendMix","Ser2NetClientSend","SerialSend_test","pcapwm","pcafrq","mode2","OLED","OLEDCMD","OLEDCMD,on","OLEDCMD,off","OLEDCMD,clear","IRSEND","IRSENDAC","OledFramedCmd","OledFramedCmd,Display","OledFramedCmd,low","OledFramedCmd,med","OledFramedCmd,high","OledFramedCmd,Frame","OledFramedCmd,linecount","OledFramedCmd,leftalign","OledFramedCmd,align","OledFramedCmd,userDef1","OledFramedCmd,userDef2","NeoPixel","NeoPixelAll","NeoPixelLine","NeoPixelHSV","NeoPixelAllHSV","NeoPixelLineHSV","NeoPixelBright","MotorShieldCmd,DCMotor","MotorShieldCmd,Stepper","MHZCalibrateZero","MHZReset","MHZABCEnable","MHZABCDisable","Sensair_SetRelay","PMSX003","PMSX003,Wake","PMSX003,Sleep","PMSX003,Reset","encwrite","Play","Vol","Eq","Mode","Repeat","tareChanA","tareChanB","7dn","7dst","7dsd","7dtext","7ddt","7dt","7dtfont","7dtbin","7don","7doff","7output","HLWCalibrate","HLWReset","csecalibrate","cseclearpulses","csereset","WemosMotorShieldCMD","LolinMotorShieldCMD","GPS","GPS,Sleep","GPS,Wake","GPS#GotFix","GPS#LostFix","GPS#Travelled","homieValueSet","SerialProxy_Write","SerialProxy_WriteMix","SerialProxy_Test","HeatPumpir","MitsubishiHP","MitsubishiHP,temperature","MitsubishiHP,power","MitsubishiHP,mode","MitsubishiHP,fan","MitsubishiHP,vane","MitsubishiHP,widevane","Culreader_Write","Touch","Touch,Rot","Touch,Flip","Touch,Enable","Touch,Disable","Touch,On","Touch,Off","Touch,Toggle","Touch,Setgrp","Touch,Incgrp","Touch,Decgrp","Touch,Incpage","Touch,Decpage","Touch,Updatebutton","WakeOnLan","DotMatrix","DotMatrix,clear","DotMatrix,update","DotMatrix,size","DotMatrix,txt","DotMatrix,settxt","DotMatrix,content","DotMatrix,alignment","DotMatrix,anim.in","DotMatrix,anim.out","DotMatrix,speed","DotMatrix,pause","DotMatrix,font","DotMatrix,layout","DotMatrix,inverted","DotMatrix,specialeffect","DotMatrix,offset","DotMatrix,brightness","DotMatrix,repeat","DotMatrix,setbar","DotMatrix,bar","Thermo","Thermo,Up","Thermo,Down","Thermo,Mode","Thermo,ModeBtn","Thermo,Setpoint","Max1704xclearalert","scdgetabc","scdgetalt","scdgettmp","scdsetcalibration","scdsetfrc","scdgetinterval","multirelay","multirelay,on","multirelay,off","multirelay,set","multirelay,get","multirelay,loop","ShiftOut","ShiftOut,Set","ShiftOut,SetNoUpdate","ShiftOut,Update","ShiftOut,SetAll","ShiftOut,SetAllNoUpdate","ShiftOut,SetAllLow","ShiftOut,SetAllHigh","ShiftOut,SetChipCount","ShiftOut,SetHexBin","cdmrst","nfx","nfx,off","nfx,on","nfx,dim","nfx,line,","nfx,hsvline,","nfx,one,","nfx,hsvone,","nfx,all,","nfx,rgb,","nfx,fade,","nfx,hsv,","nfx,colorfade,","nfx,rainbow","nfx,kitt,","nfx,comet,","nfx,theatre,","nfx,scan,","nfx,dualscan,","nfx,twinkle,","nfx,twinklefade,","nfx,sparkle,","nfx,wipe,","nfx,dualwipe","nfx,fire","nfx,fireflicker","nfx,faketv","nfx,simpleclock","nfx,stop","nfx,statusrequest","nfx,fadetime,","nfx,fadedelay,","nfx,speed,","nfx,count,","nfx,bgcolor","ShiftIn","ShiftIn,PinEvent","ShiftIn,ChipEvent","ShiftIn,SetChipCount","ShiftIn,SampleFrequency","ShiftIn,EventPerPin","scd4x","scd4x,storesettings","scd4x,facoryreset","scd4x,selftest","scd4x,setfrc,","axp","axp,ldo2","axp,ldo3","axp,ldoio","axp,gpio0","axp,gpio1","axp,gpio2","axp,gpio3","axp,gpio4","axp,dcdc2","axp,dcdc3","axp,ldo2map","axp,ldo3map","axp,ldoiomap","axp,dcdc2map","axp,dcdc3map","axp,ldo2perc","axp,ldo3perc","axp,ldoioperc","axp,dcdc2perc","axp,dcdc3perc","I2CEncoder","I2CEncoder,bright","I2CEncoder,led1","I2CEncoder,led2","I2CEncoder,gain","I2CEncoder,set","cachereader","cachereader,readpos","cachereader,sendtaskinfo","cachereader,flush","tm1621","tm1621,write,","tm1621,writerow,","tm1621,voltamp,","tm1621,energy,","tm1621,celcius,","tm1621,fahrenheit,","tm1621,humidity,","tm1621,raw,","dac","dac,1","dac,2","sht4x","sht4x,startup","ld2410","ld2410,factoryreset","ld2410,logall","digipot","digipot,reset","digipot,shutdown","digipot,","7dextra","7dbefore","7dgroup","7digit","7color","7digitcolor","7groupcolor","gp8403","gp8403,volt,","gp8403,mvolt,","gp8403,range,","gp8403,preset,","gp8403,init,","sen5x","sen5x,startclean","sen5x,techlog,","as3935","as3935,clearstats","as3935,calibrate","as3935,setgain,","as3935,setnf,","as3935,setwd,","as3925,setsrej,"],pluginDispKind=["tft","ili9341","ili9342","ili9481","ili9486","ili9488","epd","eink","epaper","il3897","uc8151d","ssd1680","ws2in7","ws1in54","st77xx","st7735","st7789","st7796","neomatrix","neo","pcd8544"],pluginDispCmd=["cmd,on","cmd,off","cmd,clear","cmd,backlight","cmd,bright","cmd,deepsleep","cmd,seq_start","cmd,seq_end","cmd,inv","cmd,rot",",clear",",rot",",tpm",",txt",",txp",",txz",",txc",",txs",",txtfull",",asciitable",",font",",l",",lh",",lv",",lm",",lmr",",r",",rf",",c",",cf",",rf",",t",",tf",",rr",",rrf",",px",",pxh",",pxv",",bmp",",btn",",win",",defwin",",delwin"],commonTag=["On","Do","Endon"],commonNumber=["toBin","toHex","Constrain","XOR","AND:","OR:","Ord","bitRead","bitSet","bitClear","bitWrite","urlencode"],commonMath=["Log","Ln","Abs","Exp","Sqrt","Sq","Round","Sin","Cos","Tan","aSin","aCos","aTan","Sin_d","Cos_d","Tan_d","aSin_d","aCos_d","aTan_d","map","mapc"],commonWarning=["delay","Delay","ResetFlashWriteCounter"],taskSpecifics=["settings.Enabled","settings.Interval","settings.ValueCount","settings.Controller1.Enabled","settings.Controller2.Enabled","settings.Controller3.Enabled","settings.Controller1.Idx","settings.Controller2.Idx","settings.Controller3.Idx"],AnythingElse=["%eventvalue%","%eventpar%","%eventname%","%sysname%","%bootcause%","%systime%","%systm_hm%","%systm_hm_0%","%systm_hm_sp%","%systime_am%","%systime_am_0%","%systime_am_sp%","%systm_hm_am%","%systm_hm_am_0%","%systm_hm_am_sp%","%lcltime%","%sunrise%","%s_sunrise%","%m_sunrise%","%sunset%","%s_sunset%","%m_sunset%","%lcltime_am%","%syshour%","%syshour_0%","%sysmin%","%sysmin_0%","%syssec%","%syssec_0%","%sysday%","%sysday_0%","%sysmonth%","%sysmonth_0%","%sysyear%","%sysyear_0%","%sysyears%","%sysweekday%","%sysweekday_s%","%unixtime%","%uptime%","%uptime_ms%","%rssi%","%ip%","%unit%","%unit_0%","%ssid%","%bssid%","%wi_ch%","%iswifi%","%vcc%","%mac%","%mac_int%","%isntp%","%ismqtt%","%dns%","%dns1%","%dns2%","%flash_freq%","%flash_size%","%flash_chip_vendor%","%flash_chip_model%","%fs_free%","%fs_size%","%cpu_id%","%cpu_freq%","%cpu_model%","%cpu_rev%","%cpu_cores%","%board_name%","%inttemp%","%islimited_build%","%isvar_double%","substring","indexOf","indexOf_ci","equals","equals_ci","strtol","timeToMin","timeToSec","%ethwifimode%","%ethconnected%","%ethduplex%","%ethspeed%","%ethstate%","%ethspeedstate%","%c_w_dir%","%c_c2f%","%c_ms2Bft%","%c_dew_th%","%c_alt_pres_sea%","%c_sea_pres_alt%","%c_cm2imp%","%c_mm2imp%","%c_m2day%","%c_m2dh%","%c_m2dhm%","%c_s2dhms%","%c_2hex%","%c_u2ip%","%c_uname%","%c_uage%","%c_ubuild%","%c_ubuildstr%","%c_uload%","%c_utype%","%c_utypestr%","var","int"];for(const e of pluginDispKind)commonPlugins=commonPlugins.concat(e);for(const e of pluginDispKind)for(const t of pluginDispCmd){let n=e+t;commonPlugins=commonPlugins.concat(n)}var rEdit,EXTRAWORDS=commonAtoms.concat(commonPlugins,commonKeywords,commonCommands,commonEvents,commonTag,commonNumber,commonMath,commonWarning,taskSpecifics,AnythingElse);function initCM(){CodeMirror.commands.autocomplete=function(e){e.showHint({hint:CodeMirror.hint.anyword})},(rEdit=CodeMirror.fromTextArea(document.getElementById("rules"),{tabSize:2,indentWithTabs:!1,lineNumbers:!0,autoCloseBrackets:!0,extraKeys:{"Ctrl-Space":"autocomplete",Tab:e=>{"null"===e.getMode().name?e.execCommand("insertTab"):e.somethingSelected()?e.execCommand("indentMore"):e.execCommand("insertSoftTab")},"Shift-Tab":e=>e.execCommand("indentLess")}})).on("change",(function(){rEdit.save()})),rEdit.on("inputRead",(function(e,t){var n=e.getCursor(),o=e.getTokenAt(n);/[\w%,.]/.test(t.text)&&"comment"!=o.type&&e.showHint({completeSingle:!1})}))}!function(e){"object"==typeof exports&&"object"==typeof module?e(require("codemirror")):"function"==typeof define&&define.amd?define(["codemirror"],e):e(CodeMirror)}((function(e){"use strict";e.defineMode("espeasy",(function(){var e={};function t(t,n){for(var o=0;oe.toLowerCase()));commonCommands=commonCommands.concat(n);var o=commonEvents.map((e=>e.toLowerCase()));commonEvents=commonEvents.concat(o);var i=commonPlugins.map((e=>e.toLowerCase()));commonPlugins=commonPlugins.concat(i);var r=commonAtoms.map((e=>e.toLowerCase()));commonAtoms=commonAtoms.concat(r);var a=commonKeywords.map((e=>e.toLowerCase()));commonKeywords=commonKeywords.concat(a);var s=commonTag.map((e=>e.toLowerCase()));commonTag=commonTag.concat(s);var c=commonNumber.map((e=>e.toLowerCase()));commonNumber=commonNumber.concat(c);var l=commonMath.map((e=>e.toLowerCase()));commonMath=commonMath.concat(l);var m=AnythingElse.map((e=>e.toLowerCase()));AnythingElse=AnythingElse.concat(m);var d=taskSpecifics.map((e=>e.toLowerCase()));function u(t,n){if(t.eatSpace())return null;t.sol();var o=t.next();if(/\d/.test(o)){if("0"==o)return"x"===t.next()?(t.eatWhile(/\w/),"number"):(t.eatWhile(/\d|\./),"number");if(t.eatWhile(/\d|\./),!t.match("d")&&!t.match("output")&&(t.eol()||/\D/.test(t.peek())))return"number"}if(/\w/.test(o))for(const e of EXTRAWORDS){let n=e.substring(1);(e.includes(":")||e.includes(",")||e.includes("."))&&t.match(n)}if(/\w/.test(o)&&(t.eatWhile(/[\w]/),t.match(".gpio")||t.match(".pulse")||t.match(".frq")||t.match(".pwm")))return"def";if("\\"===o)return t.next(),null;if("("===o||")"===o)return"bracket";if("{"===o||"}"===o||":"===o)return"number";if("/"==o)return/\//.test(t.peek())?(t.skipToEnd(),"comment"):"operator";if("'"==o&&(t.eatWhile(/[^']/),t.match("'")))return"attribute";if("+"===o||"="===o||"<"===o||">"===o||"-"===o||","===o||"*"===o||"!"===o)return"operator";if("%"==o){if(/\d/.test(t.next()))return"number";if(t.eatWhile(/[^\s\%]/),t.match("%"))return"hr"}if("["==o&&(t.eatWhile(/[^\s\]]/),t.eat("]")))return"hr";t.eatWhile(/\w/);var i=t.current();return/\w/.test(o)&&t.match("#")?(t.eatWhile(/[\w.#]/),"events"):"#"===o?(t.eatWhile(/\w/),"number"):e.hasOwnProperty(i)?e[i]:null}function f(e,t){return(t.tokens[0]||u)(e,t)}return taskSpecifics=taskSpecifics.concat(d),t("atom",commonAtoms),t("keyword",commonKeywords),t("builtin",commonCommands),t("events",commonEvents),t("def",commonPlugins),t("tag",commonTag),t("number",commonNumber),t("bracket",commonMath),t("warning",commonWarning),t("hr",AnythingElse),t("comment",taskSpecifics),{startState:function(){return{tokens:[]}},token:function(e,t){return f(e,t)},closeBrackets:"[]{}''\"\"``()",lineComment:"//",fold:"brace"}}))})),function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],mod):e(CodeMirror)}((function(e){var t={pairs:"()[]{}''\"\"",closeBefore:")]}'\":;>",triples:"",explode:"[]{}"},n=e.Pos;function o(e,n){return"pairs"==n&&"string"==typeof e?e:"object"==typeof e&&null!=e[n]?e[n]:t[n]}e.defineOption("autoCloseBrackets",!1,(function(t,n,a){a&&a!=e.Init&&(t.removeKeyMap(i),t.state.closeBrackets=null),n&&(r(o(n,"pairs")),t.state.closeBrackets=n,t.addKeyMap(i))}));var i={Backspace:function(t){var i=s(t);if(!i||t.getOption("disableInput"))return e.Pass;for(var r=o(i,"pairs"),a=t.listSelections(),c=0;c=0;c--){var d=a[c].head;t.replaceRange("",n(d.line,d.ch-1),n(d.line,d.ch+1),"+delete")}},Enter:function(t){var n=s(t),i=n&&o(n,"explode");if(!i||t.getOption("disableInput"))return e.Pass;for(var r=t.listSelections(),a=0;a1&&p.indexOf(i)>=0&&t.getRange(n(M.line,M.ch-2),M)==i+i){if(M.ch>2&&/\bstring/.test(t.getTokenTypeAt(n(M.line,M.ch-2))))return e.Pass;S="addFour"}else if(h){var T=0==M.ch?" ":t.getRange(n(M.line,M.ch-1),M);if(e.isWordChar(b)||T==i||e.isWordChar(T))return e.Pass;S="both"}else{if(!x||!(0===b.length||/\s/.test(b)||f.indexOf(b)>-1))return e.Pass;S="both"}else S=h&&d(t,M)?"both":p.indexOf(i)>=0&&t.getRange(M,n(M.line,M.ch+3))==i+i+i?"skipThree":"skip";if(u){if(u!=S)return e.Pass}else u=S}var y=m%2?a.charAt(m-1):i,v=m%2?i:a.charAt(m+1);t.operation((function(){if("skip"==u)c(t,1);else if("skipThree"==u)c(t,3);else if("surround"==u){for(var e=t.getSelections(),n=0;n0?{line:a.head.line,ch:a.head.ch+t}:{line:a.head.line-1};n.push({anchor:s,head:s})}e.setSelections(n,i)}function l(t){var o=e.cmpPos(t.anchor,t.head)>0;return{anchor:new n(t.anchor.line,t.anchor.ch+(o?-1:1)),head:new n(t.head.line,t.head.ch+(o?1:-1))}}function m(e,t){var o=e.getRange(n(t.line,t.ch-1),n(t.line,t.ch+1));return 2==o.length?o:null}function d(e,t){var o=e.getTokenAt(n(t.line,t.ch+1));return/\bstring/.test(o.type)&&o.start==t.ch&&(0==t.ch||!/\bstring/.test(e.getTokenTypeAt(t)))}r(t.pairs+"`")})); \ No newline at end of file +var rEdit,commonAtoms=["And","Or"],commonKeywords=["If","Else","Elseif","Endif"],commonCommands=["AccessInfo","Background","Build","ClearAccessBlock","ClearRTCam","Config","ControllerDisable","ControllerEnable","DateTime","Debug","Dec","DeepSleep","DisablePriorityTask","DNS","DST","EraseSDKWiFi","ExecuteRules","FactoryReset","Gateway","I2Cscanner","Inc","IP","Let","Load","LogEntry","LogPortStatus","LoopTimerSet","LoopTimerSet_ms","LoopTimerSetAndRun","LoopTimerSetAndRun_ms","MemInfo","MemInfoDetail","Name","Password","PostToHTTP","Publish","PublishR","Reboot","Save","SendTo","SendToHTTP","SendToUDP","SendToUDPMix","Settings","Subnet","Subscribe","TaskClear","TaskClearAll","TaskDisable","TaskEnable","TaskRun","TaskValueSet","TaskValueSetAndRun","TimerPause","TimerResume","TimerSet","TimerSet_ms","TimeZone","UdpPort","UdpTest","Unit","UseNTP","WdConfig","WdRead","WiFi","WiFiAllowAP","WiFiAPMode","WiFiConnect","WiFiDisconnect","WiFiKey","WiFiKey2","WiFiMode","WiFiScan","WiFiSSID","WiFiSSID2","WiFiSTAMode","Event","AsyncEvent","GPIO","GPIOToggle","LongPulse","LongPulse_mS","Monitor","Pulse","PWM","Servo","Status","Tone","RTTTL","UnMonitor","Provision","Provision,Config","Provision,Security","Provision,Notification","Provision,Provision","Provision,Rules,","Provision,CustomCdnUrl","Provision,Firmware,",],commonEvents=["Clock#Time","Login#Failed","MQTT#Connected","MQTT#Disconnected","MQTTimport#Connected","MQTTimport#Disconnected","Rules#Timer","System#Boot","System#BootMode","System#Sleep","System#Wake","TaskExit#","TaskInit#","ThingspeakReply","Time#Initialized","Time#Set","WiFi#APmodeDisabled","WiFi#APmodeEnabled","WiFi#ChangedAccesspoint","WiFi#ChangedWiFichannel","WiFi#Connected","WiFi#Disconnected","ProvisionFirmware",],commonPlugins=["ResetPulseCounter","SetPulseCounterTotal","LogPulseStatistic","analogout","MCPGPIO","MCPGPIOToggle","MCPLongPulse","MCPLongPulse_ms","MCPPulse","Status,MCP","Monitor,MCP","MonitorRange,MCP","UnMonitorRange,MCP","UnMonitor,MCP","MCPGPIORange","MCPGPIOPattern","MCPMode","MCPModeRange","ExtGpio","ExtPwm","ExtPulse","ExtLongPulse","Status,EXT,","LCDCmd","LCD","PCFGPIO","PCFGPIOToggle","PCFLongPulse","PCFLongPulse_ms","PCFPulse","Status,PCF","Monitor,PCF","MonitorRange,PCF","UnMonitorRange,PCF","UnMonitor,PCF","PCFGPIORange","PCFGPIOpattern","PCFMode","PCFmodeRange","SerialSend","SerialSendMix","Ser2NetClientSend","SerialSend_test","pcapwm","pcafrq","mode2","OLED","OLEDCMD","OLEDCMD,on","OLEDCMD,off","OLEDCMD,clear","IRSEND","IRSENDAC","OledFramedCmd","OledFramedCmd,Display","OledFramedCmd,low","OledFramedCmd,med","OledFramedCmd,high","OledFramedCmd,Frame","OledFramedCmd,linecount","OledFramedCmd,leftalign","OledFramedCmd,align","OledFramedCmd,userDef1","OledFramedCmd,userDef2","NeoPixel","NeoPixelAll","NeoPixelLine","NeoPixelHSV","NeoPixelAllHSV","NeoPixelLineHSV","NeoPixelBright","MotorShieldCmd,DCMotor","MotorShieldCmd,Stepper","MHZCalibrateZero","MHZReset","MHZABCEnable","MHZABCDisable","Sensair_SetRelay","PMSX003","PMSX003,Wake","PMSX003,Sleep","PMSX003,Reset","encwrite","Play","Vol","Eq","Mode","Repeat","tareChanA","tareChanB","7dn","7dst","7dsd","7dtext","7ddt","7dt","7dtfont","7dtbin","7don","7doff","7output","HLWCalibrate","HLWReset","csecalibrate","cseclearpulses","csereset","WemosMotorShieldCMD","LolinMotorShieldCMD","GPS","GPS,Sleep","GPS,Wake","GPS#GotFix","GPS#LostFix","GPS#Travelled","homieValueSet","SerialProxy_Write","SerialProxy_WriteMix","SerialProxy_Test","HeatPumpir","MitsubishiHP","MitsubishiHP,temperature","MitsubishiHP,power","MitsubishiHP,mode","MitsubishiHP,fan","MitsubishiHP,vane","MitsubishiHP,widevane","Culreader_Write","Touch","Touch,Rot","Touch,Flip","Touch,Enable","Touch,Disable","Touch,On","Touch,Off","Touch,Toggle","Touch,Setgrp","Touch,Incgrp","Touch,Decgrp","Touch,Incpage","Touch,Decpage","Touch,Updatebutton","WakeOnLan","DotMatrix","DotMatrix,clear","DotMatrix,update","DotMatrix,size","DotMatrix,txt","DotMatrix,settxt","DotMatrix,content","DotMatrix,alignment","DotMatrix,anim.in","DotMatrix,anim.out","DotMatrix,speed","DotMatrix,pause","DotMatrix,font","DotMatrix,layout","DotMatrix,inverted","DotMatrix,specialeffect","DotMatrix,offset","DotMatrix,brightness","DotMatrix,repeat","DotMatrix,setbar","DotMatrix,bar","Thermo","Thermo,Up","Thermo,Down","Thermo,Mode","Thermo,ModeBtn","Thermo,Setpoint","Max1704xclearalert","scdgetabc","scdgetalt","scdgettmp","scdsetcalibration","scdsetfrc","scdgetinterval","multirelay","multirelay,on","multirelay,off","multirelay,set","multirelay,get","multirelay,loop","ShiftOut","ShiftOut,Set","ShiftOut,SetNoUpdate","ShiftOut,Update","ShiftOut,SetAll","ShiftOut,SetAllNoUpdate","ShiftOut,SetAllLow","ShiftOut,SetAllHigh","ShiftOut,SetChipCount","ShiftOut,SetHexBin","cdmrst","nfx","nfx,off","nfx,on","nfx,dim","nfx,line,","nfx,hsvline,","nfx,one,","nfx,hsvone,","nfx,all,","nfx,rgb,","nfx,fade,","nfx,hsv,","nfx,colorfade,","nfx,rainbow","nfx,kitt,","nfx,comet,","nfx,theatre,","nfx,scan,","nfx,dualscan,","nfx,twinkle,","nfx,twinklefade,","nfx,sparkle,","nfx,wipe,","nfx,dualwipe","nfx,fire","nfx,fireflicker","nfx,faketv","nfx,simpleclock","nfx,stop","nfx,statusrequest","nfx,fadetime,","nfx,fadedelay,","nfx,speed,","nfx,count,","nfx,bgcolor","ShiftIn","ShiftIn,PinEvent","ShiftIn,ChipEvent","ShiftIn,SetChipCount","ShiftIn,SampleFrequency","ShiftIn,EventPerPin","scd4x","scd4x,storesettings","scd4x,facoryreset","scd4x,selftest","scd4x,setfrc,","axp","axp,ldo2","axp,ldo3","axp,ldoio","axp,gpio0","axp,gpio1","axp,gpio2","axp,gpio3","axp,gpio4","axp,dcdc2","axp,dcdc3","axp,ldo2map","axp,ldo3map","axp,ldoiomap","axp,dcdc2map","axp,dcdc3map","axp,ldo2perc","axp,ldo3perc","axp,ldoioperc","axp,dcdc2perc","axp,dcdc3perc","I2CEncoder","I2CEncoder,bright","I2CEncoder,led1","I2CEncoder,led2","I2CEncoder,gain","I2CEncoder,set","cachereader","cachereader,readpos","cachereader,sendtaskinfo","cachereader,flush","tm1621","tm1621,write,","tm1621,writerow,","tm1621,voltamp,","tm1621,energy,","tm1621,celcius,","tm1621,fahrenheit,","tm1621,humidity,","tm1621,raw,","dac","dac,1","dac,2","sht4x","sht4x,startup","ld2410","ld2410,factoryreset","ld2410,logall","digipot","digipot,reset","digipot,shutdown","digipot,","7dextra","7dbefore","7dgroup","7digit","7color","7digitcolor","7groupcolor","gp8403","gp8403,volt,","gp8403,mvolt,","gp8403,range,","gp8403,preset,","gp8403,init,","sen5x","sen5x,startclean","sen5x,techlog,","as3935","as3935,clearstats","as3935,calibrate","as3935,setgain,","as3935,setnf,","as3935,setwd,","as3925,setsrej,","lu9685","lu9685,servo,","lu9685,enable,","lu9685,disable,","lu9685,setrange,","geni2c","geni2c,cmd,",],pluginDispKind=["tft","ili9341","ili9342","ili9481","ili9486","ili9488","epd","eink","epaper","il3897","uc8151d","ssd1680","ws2in7","ws1in54","st77xx","st7735","st7789","st7796","neomatrix","neo","pcd8544",],pluginDispCmd=["cmd,on","cmd,off","cmd,clear","cmd,backlight","cmd,bright","cmd,deepsleep","cmd,seq_start","cmd,seq_end","cmd,inv","cmd,rot",",clear",",rot",",tpm",",txt",",txp",",txz",",txc",",txs",",txtfull",",asciitable",",font",",l",",lh",",lv",",lm",",lmr",",r",",rf",",c",",cf",",rf",",t",",tf",",rr",",rrf",",px",",pxh",",pxv",",bmp",",btn",",win",",defwin",",delwin",],commonTag=["On","Do","Endon"],commonNumber=["toBin","toHex","Constrain","XOR","AND:","OR:","Ord","bitRead","bitSet","bitClear","bitWrite","urlencode"],commonMath=["Log","Ln","Abs","Exp","Sqrt","Sq","Round","Sin","Cos","Tan","aSin","aCos","aTan","Sin_d","Cos_d","Tan_d","aSin_d","aCos_d","aTan_d","map","mapc"],commonWarning=["delay","Delay","ResetFlashWriteCounter"],taskSpecifics=["settings.Enabled","settings.Interval","settings.ValueCount","settings.Controller1.Enabled","settings.Controller2.Enabled","settings.Controller3.Enabled","settings.Controller1.Idx","settings.Controller2.Idx","settings.Controller3.Idx"],AnythingElse=["%eventvalue%","%eventpar%","%eventname%","%sysname%","%bootcause%","%systime%","%systm_hm%","%systm_hm_0%","%systm_hm_sp%","%systime_am%","%systime_am_0%","%systime_am_sp%","%systm_hm_am%","%systm_hm_am_0%","%systm_hm_am_sp%","%lcltime%","%sunrise%","%s_sunrise%","%m_sunrise%","%sunset%","%s_sunset%","%m_sunset%","%lcltime_am%","%syshour%","%syshour_0%","%sysmin%","%sysmin_0%","%syssec%","%syssec_0%","%sysday%","%sysday_0%","%sysmonth%","%sysmonth_0%","%sysyear%","%sysyear_0%","%sysyears%","%sysweekday%","%sysweekday_s%","%unixtime%","%uptime%","%uptime_ms%","%rssi%","%ip%","%unit%","%unit_0%","%ssid%","%bssid%","%wi_ch%","%iswifi%","%vcc%","%mac%","%mac_int%","%isntp%","%ismqtt%","%dns%","%dns1%","%dns2%","%flash_freq%","%flash_size%","%flash_chip_vendor%","%flash_chip_model%","%fs_free%","%fs_size%","%cpu_id%","%cpu_freq%","%cpu_model%","%cpu_rev%","%cpu_cores%","%board_name%","%inttemp%","%islimited_build%","%isvar_double%","substring","indexOf","indexOf_ci","equals","equals_ci","strtol","timeToMin","timeToSec","%ethwifimode%","%ethconnected%","%ethduplex%","%ethspeed%","%ethstate%","%ethspeedstate%","%c_w_dir%","%c_c2f%","%c_ms2Bft%","%c_dew_th%","%c_alt_pres_sea%","%c_sea_pres_alt%","%c_cm2imp%","%c_mm2imp%","%c_m2day%","%c_m2dh%","%c_m2dhm%","%c_s2dhms%","%c_2hex%","%c_u2ip%","%c_uname%","%c_uage%","%c_ubuild%","%c_ubuildstr%","%c_uload%","%c_utype%","%c_utypestr%","var","int"];for(const element2 of pluginDispKind)commonPlugins=commonPlugins.concat(element2);for(const element2 of pluginDispKind)for(const element3 of pluginDispCmd){let e=element2+element3;commonPlugins=commonPlugins.concat(e)}var EXTRAWORDS=commonAtoms.concat(commonPlugins,commonKeywords,commonCommands,commonEvents,commonTag,commonNumber,commonMath,commonWarning,taskSpecifics,AnythingElse);function initCM(){CodeMirror.commands.autocomplete=function(e){e.showHint({hint:CodeMirror.hint.anyword})},(rEdit=CodeMirror.fromTextArea(document.getElementById("rules"),{tabSize:2,indentWithTabs:!1,lineNumbers:!0,autoCloseBrackets:!0,extraKeys:{"Ctrl-Space":"autocomplete",Tab(e){"null"===e.getMode().name?e.execCommand("insertTab"):e.somethingSelected()?e.execCommand("indentMore"):e.execCommand("insertSoftTab")},"Shift-Tab":e=>e.execCommand("indentLess")}})).on("change",function(){rEdit.save()}),rEdit.on("inputRead",function(e,t){var n=e.getCursor(),o=e.getTokenAt(n);/[\w%,.]/.test(t.text)&&"comment"!=o.type&&e.showHint({completeSingle:!1})})}!function(e){"object"==typeof exports&&"object"==typeof module?e(require("codemirror")):"function"==typeof define&&define.amd?define(["codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("espeasy",function(){var e={};function t(t,n){for(var o=0;oe.toLowerCase());commonCommands=commonCommands.concat(n);var o=commonEvents.map(e=>e.toLowerCase());commonEvents=commonEvents.concat(o);var i=commonPlugins.map(e=>e.toLowerCase());commonPlugins=commonPlugins.concat(i);var a=commonAtoms.map(e=>e.toLowerCase());commonAtoms=commonAtoms.concat(a);var s=commonKeywords.map(e=>e.toLowerCase());commonKeywords=commonKeywords.concat(s);var r=commonTag.map(e=>e.toLowerCase());commonTag=commonTag.concat(r);var c=commonNumber.map(e=>e.toLowerCase());commonNumber=commonNumber.concat(c);var l=commonMath.map(e=>e.toLowerCase());commonMath=commonMath.concat(l);var m=AnythingElse.map(e=>e.toLowerCase());AnythingElse=AnythingElse.concat(m);var d=taskSpecifics.map(e=>e.toLowerCase());function u(t,n){if(t.eatSpace())return null;t.sol();var o=t.next();if(/\d/.test(o)){if("0"==o)return"x"===t.next()?(t.eatWhile(/\w/),"number"):(t.eatWhile(/\d|\./),"number");if(t.eatWhile(/\d|\./),!t.match("d")&&!t.match("output")&&(t.eol()||/\D/.test(t.peek())))return"number"}if(/\w/.test(o))for(let i of EXTRAWORDS){let a=i.substring(1);(i.includes(":")||i.includes(",")||i.includes("."))&&t.match(a)}if(/\w/.test(o)&&(t.eatWhile(/[\w]/),t.match(".gpio")||t.match(".pulse")||t.match(".frq")||t.match(".pwm")))return"def";if("\\"===o)return t.next(),null;if("("===o||")"===o)return"bracket";if("{"===o||"}"===o||":"===o)return"number";if("/"==o)return/\//.test(t.peek())?(t.skipToEnd(),"comment"):"operator";if("'"==o&&(t.eatWhile(/[^']/),t.match("'")))return"attribute";if("+"===o||"="===o||"<"===o||">"===o||"-"===o||","===o||"*"===o||"!"===o)return"operator";if("%"==o){if(/\d/.test(t.next()))return"number";if(t.eatWhile(/[^\s\%]/),t.match("%"))return"hr"}if("["==o&&(t.eatWhile(/[^\s\]]/),t.eat("]")))return"hr";t.eatWhile(/\w/);var s=t.current();return/\w/.test(o)&&t.match("#")?(t.eatWhile(/[\w.#]/),"events"):"#"===o?(t.eatWhile(/\w/),"number"):e.hasOwnProperty(s)?e[s]:null}return taskSpecifics=taskSpecifics.concat(d),t("atom",commonAtoms),t("keyword",commonKeywords),t("builtin",commonCommands),t("events",commonEvents),t("def",commonPlugins),t("tag",commonTag),t("number",commonNumber),t("bracket",commonMath),t("warning",commonWarning),t("hr",AnythingElse),t("comment",taskSpecifics),{startState:function(){return{tokens:[]}},token:function(e,t){var n,o;return n=e,((o=t).tokens[0]||u)(n,o)},closeBrackets:"[]{}''\"\"``()",lineComment:"//",fold:"brace"}})}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],mod):e(CodeMirror)}(function(e){var t={pairs:"()[]{}''\"\"",closeBefore:")]}'\":;>",triples:"",explode:"[]{}"},n=e.Pos;function o(e,n){return"pairs"==n&&"string"==typeof e?e:"object"==typeof e&&null!=e[n]?e[n]:t[n]}e.defineOption("autoCloseBrackets",!1,function(t,n,s){s&&s!=e.Init&&(t.removeKeyMap(i),t.state.closeBrackets=null),n&&(a(o(n,"pairs")),t.state.closeBrackets=n,t.addKeyMap(i))});var i={Backspace:function t(i){var a=r(i);if(!a||i.getOption("disableInput"))return e.Pass;for(var s=o(a,"pairs"),c=i.listSelections(),l=0;l=0;l--){var u=c[l].head;i.replaceRange("",n(u.line,u.ch-1),n(u.line,u.ch+1),"+delete")}},Enter:function t(n){var i=r(n),a=i&&o(i,"explode");if(!a||n.getOption("disableInput"))return e.Pass;for(var s=n.listSelections(),l=0;l=0&&i.getRange(T,n(T.line,T.ch+3))==a+a+a?"skipThree":"skip";else if(h&&T.ch>1&&f.indexOf(a)>=0&&i.getRange(n(T.line,T.ch-2),T)==a+a){if(T.ch>2&&/\bstring/.test(i.getTokenTypeAt(n(T.line,T.ch-2))))return e.Pass;C="addFour"}else if(h){var y=0==T.ch?" ":i.getRange(n(T.line,T.ch-1),T);if(e.isWordChar(M)||y==a||e.isWordChar(y))return e.Pass;C="both"}else{if(!(x&&(0===M.length||/\s/.test(M)||p.indexOf(M)>-1)))return e.Pass;C="both"}if(P){if(P!=C)return e.Pass}else P=C}var v=u%2?m.charAt(u-1):a,D=u%2?a:m.charAt(u+1);i.operation(function(){if("skip"==P)c(i,1);else if("skipThree"==P)c(i,3);else if("surround"==P){for(var e=i.getSelections(),t=0;t0?{line:s.head.line,ch:s.head.ch+t}:{line:s.head.line-1};n.push({anchor:r,head:r})}e.setSelections(n,i)}function l(t){var o=e.cmpPos(t.anchor,t.head)>0;return{anchor:new n(t.anchor.line,t.anchor.ch+(o?-1:1)),head:new n(t.head.line,t.head.ch+(o?1:-1))}}function m(e,t){var o=e.getRange(n(t.line,t.ch-1),n(t.line,t.ch+1));return 2==o.length?o:null}function d(e,t){var o=e.getTokenAt(n(t.line,t.ch+1));return/\bstring/.test(o.type)&&o.start==t.ch&&(0==t.ch||!/\bstring/.test(e.getTokenTypeAt(t)))}a(t.pairs+"`")}); \ No newline at end of file From 554a6bbe97af15611cec0bc8c2c1bd47d45283e6 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Mon, 5 May 2025 13:28:39 +0200 Subject: [PATCH 05/56] [EasyColorCode] Update commands for P180 --- static/espeasy.js | 2 +- static/espeasy.min.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/static/espeasy.js b/static/espeasy.js index f6545a1fb..d253d0409 100644 --- a/static/espeasy.js +++ b/static/espeasy.js @@ -132,7 +132,7 @@ var commonPlugins = [ //P178 "lu9685", "lu9685,servo,", "lu9685,enable,", "lu9685,disable,", "lu9685,setrange,", //P180 - "geni2c", "geni2c,cmd,", + "geni2c", "geni2c,cmd,", "geni2c,exec,", "geni2c,log,", ]; var pluginDispKind = [ //P095 diff --git a/static/espeasy.min.js b/static/espeasy.min.js index 1000cb1a2..661795f54 100644 --- a/static/espeasy.min.js +++ b/static/espeasy.min.js @@ -1 +1 @@ -var commonAtoms=["And","Or"],commonKeywords=["If","Else","Elseif","Endif"],commonCommands=["AccessInfo","Background","Build","ClearAccessBlock","ClearRTCam","Config","ControllerDisable","ControllerEnable","DateTime","Debug","Dec","DeepSleep","DisablePriorityTask","DNS","DST","EraseSDKWiFi","ExecuteRules","FactoryReset","Gateway","I2Cscanner","Inc","IP","Let","Load","LogEntry","LogPortStatus","LoopTimerSet","LoopTimerSet_ms","LoopTimerSetAndRun","LoopTimerSetAndRun_ms","MemInfo","MemInfoDetail","Name","Password","PostToHTTP","Publish","PublishR","Reboot","Save","SendTo","SendToHTTP","SendToUDP","Settings","Subnet","Subscribe","TaskClear","TaskClearAll","TaskDisable","TaskEnable","TaskRun","TaskValueSet","TaskValueSetAndRun","TimerPause","TimerResume","TimerSet","TimerSet_ms","TimeZone","UdpPort","UdpTest","Unit","UseNTP","WdConfig","WdRead","WiFi","WiFiAllowAP","WiFiAPMode","WiFiConnect","WiFiDisconnect","WiFiKey","WiFiKey2","WiFiMode","WiFiScan","WiFiSSID","WiFiSSID2","WiFiSTAMode","Event","AsyncEvent","GPIO","GPIOToggle","LongPulse","LongPulse_mS","Monitor","Pulse","PWM","Servo","Status","Tone","RTTTL","UnMonitor","Provision","Provision,Config","Provision,Security","Provision,Notification","Provision,Provision","Provision,Rules,","Provision,CustomCdnUrl","Provision,Firmware,"],commonEvents=["Clock#Time","Login#Failed","MQTT#Connected","MQTT#Disconnected","MQTTimport#Connected","MQTTimport#Disconnected","Rules#Timer","System#Boot","System#BootMode","System#Sleep","System#Wake","TaskExit#","TaskInit#","ThingspeakReply","Time#Initialized","Time#Set","WiFi#APmodeDisabled","WiFi#APmodeEnabled","WiFi#ChangedAccesspoint","WiFi#ChangedWiFichannel","WiFi#Connected","WiFi#Disconnected","ProvisionFirmware"],commonPlugins=["ResetPulseCounter","SetPulseCounterTotal","LogPulseStatistic","analogout","MCPGPIO","MCPGPIOToggle","MCPLongPulse","MCPLongPulse_ms","MCPPulse","Status,MCP","Monitor,MCP","MonitorRange,MCP","UnMonitorRange,MCP","UnMonitor,MCP","MCPGPIORange","MCPGPIOPattern","MCPMode","MCPModeRange","ExtGpio","ExtPwm","ExtPulse","ExtLongPulse","Status,EXT,","LCDCmd","LCD","PCFGPIO","PCFGPIOToggle","PCFLongPulse","PCFLongPulse_ms","PCFPulse","Status,PCF","Monitor,PCF","MonitorRange,PCF","UnMonitorRange,PCF","UnMonitor,PCF","PCFGPIORange","PCFGPIOpattern","PCFMode","PCFmodeRange","SerialSend","SerialSendMix","Ser2NetClientSend","pcapwm","pcafrq","mode2","OLED","OLEDCMD","OLEDCMD,on","OLEDCMD,off","OLEDCMD,clear","IRSEND","IRSENDAC","OledFramedCmd","OledFramedCmd,Display","OledFramedCmd,low","OledFramedCmd,med","OledFramedCmd,high","OledFramedCmd,Frame","OledFramedCmd,linecount","OledFramedCmd,leftalign","OledFramedCmd,align","OledFramedCmd,userDef1","OledFramedCmd,userDef2","NeoPixel","NeoPixelAll","NeoPixelLine","NeoPixelHSV","NeoPixelAllHSV","NeoPixelLineHSV","NeoPixelBright","MotorShieldCmd,DCMotor","MotorShieldCmd,Stepper","MHZCalibrateZero","MHZReset","MHZABCEnable","MHZABCDisable","Sensair_SetRelay","PMSX003","PMSX003,Wake","PMSX003,Sleep","PMSX003,Reset","encwrite","Play","Vol","Eq","Mode","Repeat","tareChanA","tareChanB","7dn","7dst","7dsd","7dtext","7ddt","7dt","7dtfont","7dtbin","7don","7doff","7output","HLWCalibrate","HLWReset","csecalibrate","cseclearpulses","csereset","WemosMotorShieldCMD","LolinMotorShieldCMD","GPS","GPS,Sleep","GPS,Wake","GPS#GotFix","GPS#LostFix","GPS#Travelled","homieValueSet","SerialProxy_Write","SerialProxy_WriteMix","SerialProxy_Test","HeatPumpir","MitsubishiHP","MitsubishiHP,temperature","MitsubishiHP,power","MitsubishiHP,mode","MitsubishiHP,fan","MitsubishiHP,vane","MitsubishiHP,widevane","Culreader_Write","Touch","Touch,Rot","Touch,Flip","Touch,Enable","Touch,Disable","Touch,On","Touch,Off","Touch,Toggle","Touch,Setgrp","Touch,Incgrp","Touch,Decgrp","Touch,Incpage","Touch,Decpage","Touch,Updatebutton","WakeOnLan","DotMatrix","DotMatrix,clear","DotMatrix,update","DotMatrix,size","DotMatrix,txt","DotMatrix,settxt","DotMatrix,content","DotMatrix,alignment","DotMatrix,anim.in","DotMatrix,anim.out","DotMatrix,speed","DotMatrix,pause","DotMatrix,font","DotMatrix,layout","DotMatrix,inverted","DotMatrix,specialeffect","DotMatrix,offset","DotMatrix,brightness","DotMatrix,repeat","DotMatrix,setbar","DotMatrix,bar","Thermo","Thermo,Up","Thermo,Down","Thermo,Mode","Thermo,ModeBtn","Thermo,Setpoint","Max1704xclearalert","scdgetabc","scdgetalt","scdgettmp","scdsetcalibration","scdsetfrc","scdgetinterval","multirelay","multirelay,on","multirelay,off","multirelay,set","multirelay,get","multirelay,loop","ShiftOut","ShiftOut,Set","ShiftOut,SetNoUpdate","ShiftOut,Update","ShiftOut,SetAll","ShiftOut,SetAllNoUpdate","ShiftOut,SetAllLow","ShiftOut,SetAllHigh","ShiftOut,SetChipCount","ShiftOut,SetHexBin","cdmrst","nfx","nfx,off","nfx,on","nfx,dim","nfx,line,","nfx,hsvline,","nfx,one,","nfx,hsvone,","nfx,all,","nfx,rgb,","nfx,fade,","nfx,hsv,","nfx,colorfade,","nfx,rainbow","nfx,kitt,","nfx,comet,","nfx,theatre,","nfx,scan,","nfx,dualscan,","nfx,twinkle,","nfx,twinklefade,","nfx,sparkle,","nfx,wipe,","nfx,dualwipe","nfx,fire","nfx,fireflicker","nfx,faketv","nfx,simpleclock","nfx,stop","nfx,statusrequest","nfx,fadetime,","nfx,fadedelay,","nfx,speed,","nfx,count,","nfx,bgcolor","ShiftIn","ShiftIn,PinEvent","ShiftIn,ChipEvent","ShiftIn,SetChipCount","ShiftIn,SampleFrequency","ShiftIn,EventPerPin","scd4x","scd4x,storesettings","scd4x,facoryreset","scd4x,selftest","scd4x,setfrc,","axp","axp,ldo2","axp,ldo3","axp,ldoio","axp,gpio0","axp,gpio1","axp,gpio2","axp,gpio3","axp,gpio4","axp,dcdc2","axp,dcdc3","axp,ldo2map","axp,ldo3map","axp,ldoiomap","axp,dcdc2map","axp,dcdc3map","axp,ldo2perc","axp,ldo3perc","axp,ldoioperc","axp,dcdc2perc","axp,dcdc3perc","I2CEncoder","I2CEncoder,bright","I2CEncoder,led1","I2CEncoder,led2","I2CEncoder,gain","I2CEncoder,set","cachereader","cachereader,readpos","cachereader,sendtaskinfo","cachereader,flush","tm1621","tm1621,write,","tm1621,writerow,","tm1621,voltamp,","tm1621,energy,","tm1621,celcius,","tm1621,fahrenheit,","tm1621,humidity,","tm1621,raw,","dac","dac,1","dac,2","sht4x","sht4x,startup","ld2410","ld2410,factoryreset","ld2410,logall","digipot","digipot,reset","digipot,shutdown","digipot,","7dextra","7dbefore","7dgroup","7digit","7color","7digitcolor","7groupcolor","gp8403","gp8403,volt,","gp8403,mvolt,","gp8403,range,","gp8403,preset,","gp8403,init,","sen5x","sen5x,startclean","sen5x,techlog,","as3935","as3935,clearstats","as3935,calibrate","as3935,setgain,","as3935,setnf,","as3935,setwd,","as3925,setsrej,"],pluginDispKind=["tft","ili9341","ili9342","ili9481","ili9486","ili9488","epd","eink","epaper","il3897","uc8151d","ssd1680","ws2in7","ws1in54","st77xx","st7735","st7789","st7796","neomatrix","neo","pcd8544"],pluginDispCmd=["cmd,on","cmd,off","cmd,clear","cmd,backlight","cmd,bright","cmd,deepsleep","cmd,seq_start","cmd,seq_end","cmd,inv","cmd,rot",",clear",",rot",",tpm",",txt",",txp",",txz",",txc",",txs",",txtfull",",asciitable",",font",",l",",lh",",lv",",lm",",lmr",",r",",rf",",c",",cf",",rf",",t",",tf",",rr",",rrf",",px",",pxh",",pxv",",bmp",",btn",",win",",defwin",",delwin"],commonTag=["On","Do","Endon"],commonNumber=["toBin","toHex","Constrain","XOR","AND:","OR:","Ord","bitRead","bitSet","bitClear","bitWrite","urlencode"],commonMath=["Log","Ln","Abs","Exp","Sqrt","Sq","Round","Sin","Cos","Tan","aSin","aCos","aTan","Sin_d","Cos_d","Tan_d","aSin_d","aCos_d","aTan_d","map","mapc"],commonWarning=["delay","Delay","ResetFlashWriteCounter"],taskSpecifics=["settings.Enabled","settings.Interval","settings.ValueCount","settings.Controller1.Enabled","settings.Controller2.Enabled","settings.Controller3.Enabled","settings.Controller1.Idx","settings.Controller2.Idx","settings.Controller3.Idx"],AnythingElse=["%eventvalue%","%eventpar%","%eventname%","%sysname%","%bootcause%","%systime%","%systm_hm%","%systm_hm_0%","%systm_hm_sp%","%systime_am%","%systime_am_0%","%systime_am_sp%","%systm_hm_am%","%systm_hm_am_0%","%systm_hm_am_sp%","%lcltime%","%sunrise%","%s_sunrise%","%m_sunrise%","%sunset%","%s_sunset%","%m_sunset%","%lcltime_am%","%syshour%","%syshour_0%","%sysmin%","%sysmin_0%","%syssec%","%syssec_0%","%sysday%","%sysday_0%","%sysmonth%","%sysmonth_0%","%sysyear%","%sysyear_0%","%sysyears%","%sysweekday%","%sysweekday_s%","%unixtime%","%uptime%","%uptime_ms%","%rssi%","%ip%","%unit%","%unit_0%","%ssid%","%bssid%","%wi_ch%","%iswifi%","%vcc%","%mac%","%mac_int%","%isntp%","%ismqtt%","%dns%","%dns1%","%dns2%","%flash_freq%","%flash_size%","%flash_chip_vendor%","%flash_chip_model%","%fs_free%","%fs_size%","%cpu_id%","%cpu_freq%","%cpu_model%","%cpu_rev%","%cpu_cores%","%board_name%","%inttemp%","%islimited_build%","%isvar_double%","substring","indexOf","indexOf_ci","equals","equals_ci","strtol","timeToMin","timeToSec","%ethwifimode%","%ethconnected%","%ethduplex%","%ethspeed%","%ethstate%","%ethspeedstate%","%c_w_dir%","%c_c2f%","%c_ms2Bft%","%c_dew_th%","%c_alt_pres_sea%","%c_sea_pres_alt%","%c_cm2imp%","%c_mm2imp%","%c_m2day%","%c_m2dh%","%c_m2dhm%","%c_s2dhms%","%c_random%","%c_2hex%","%c_u2ip%","%c_uname%","%c_uage%","%c_ubuild%","%c_ubuildstr%","%c_uload%","%c_utype%","%c_utypestr%","var","int"];for(const e of pluginDispKind)commonPlugins=commonPlugins.concat(e);for(const e of pluginDispKind)for(const t of pluginDispCmd){let n=e+t;commonPlugins=commonPlugins.concat(n)}var rEdit,EXTRAWORDS=commonAtoms.concat(commonPlugins,commonKeywords,commonCommands,commonEvents,commonTag,commonNumber,commonMath,commonWarning,taskSpecifics,AnythingElse);function initCM(){CodeMirror.commands.autocomplete=function(e){e.showHint({hint:CodeMirror.hint.anyword})},(rEdit=CodeMirror.fromTextArea(document.getElementById("rules"),{tabSize:2,indentWithTabs:!1,lineNumbers:!0,autoCloseBrackets:!0,extraKeys:{"Ctrl-Space":"autocomplete",Tab:e=>{"null"===e.getMode().name?e.execCommand("insertTab"):e.somethingSelected()?e.execCommand("indentMore"):e.execCommand("insertSoftTab")},"Shift-Tab":e=>e.execCommand("indentLess")}})).on("change",(function(){rEdit.save()})),rEdit.on("inputRead",(function(e,t){var n=e.getCursor(),o=e.getTokenAt(n);/[\w%,.]/.test(t.text)&&"comment"!=o.type&&e.showHint({completeSingle:!1})}))}!function(e){"object"==typeof exports&&"object"==typeof module?e(require("codemirror")):"function"==typeof define&&define.amd?define(["codemirror"],e):e(CodeMirror)}((function(e){"use strict";e.defineMode("espeasy",(function(){var e={};function t(t,n){for(var o=0;oe.toLowerCase()));commonCommands=commonCommands.concat(n);var o=commonEvents.map((e=>e.toLowerCase()));commonEvents=commonEvents.concat(o);var i=commonPlugins.map((e=>e.toLowerCase()));commonPlugins=commonPlugins.concat(i);var r=commonAtoms.map((e=>e.toLowerCase()));commonAtoms=commonAtoms.concat(r);var a=commonKeywords.map((e=>e.toLowerCase()));commonKeywords=commonKeywords.concat(a);var s=commonTag.map((e=>e.toLowerCase()));commonTag=commonTag.concat(s);var c=commonNumber.map((e=>e.toLowerCase()));commonNumber=commonNumber.concat(c);var l=commonMath.map((e=>e.toLowerCase()));commonMath=commonMath.concat(l);var m=AnythingElse.map((e=>e.toLowerCase()));AnythingElse=AnythingElse.concat(m);var d=taskSpecifics.map((e=>e.toLowerCase()));function u(t,n){if(t.eatSpace())return null;t.sol();var o=t.next();if(/\d/.test(o)){if("0"==o)return"x"===t.next()?(t.eatWhile(/\w/),"number"):(t.eatWhile(/\d|\./),"number");if(t.eatWhile(/\d|\./),!t.match("d")&&!t.match("output")&&(t.eol()||/\D/.test(t.peek())))return"number"}if(/\w/.test(o))for(const e of EXTRAWORDS){let n=e.substring(1);(e.includes(":")||e.includes(",")||e.includes("."))&&t.match(n)}if(/\w/.test(o)&&(t.eatWhile(/[\w]/),t.match(".gpio")||t.match(".pulse")||t.match(".frq")||t.match(".pwm")))return"def";if("\\"===o)return t.next(),null;if("("===o||")"===o)return"bracket";if("{"===o||"}"===o||":"===o)return"number";if("/"==o)return/\//.test(t.peek())?(t.skipToEnd(),"comment"):"operator";if("'"==o&&(t.eatWhile(/[^']/),t.match("'")))return"attribute";if("+"===o||"="===o||"<"===o||">"===o||"-"===o||","===o||"*"===o||"!"===o)return"operator";if("%"==o){if(/\d/.test(t.next()))return"number";if(t.eatWhile(/[^\s\%]/),t.match("%"))return"hr"}if("["==o&&(t.eatWhile(/[^\s\]]/),t.eat("]")))return"hr";t.eatWhile(/\w/);var i=t.current();return/\w/.test(o)&&t.match("#")?(t.eatWhile(/[\w.#]/),"events"):"#"===o?(t.eatWhile(/\w/),"number"):e.hasOwnProperty(i)?e[i]:null}function f(e,t){return(t.tokens[0]||u)(e,t)}return taskSpecifics=taskSpecifics.concat(d),t("atom",commonAtoms),t("keyword",commonKeywords),t("builtin",commonCommands),t("events",commonEvents),t("def",commonPlugins),t("tag",commonTag),t("number",commonNumber),t("bracket",commonMath),t("warning",commonWarning),t("hr",AnythingElse),t("comment",taskSpecifics),{startState:function(){return{tokens:[]}},token:function(e,t){return f(e,t)},closeBrackets:"[]{}''\"\"``()",lineComment:"//",fold:"brace"}}))})),function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],mod):e(CodeMirror)}((function(e){var t={pairs:"()[]{}''\"\"",closeBefore:")]}'\":;>",triples:"",explode:"[]{}"},n=e.Pos;function o(e,n){return"pairs"==n&&"string"==typeof e?e:"object"==typeof e&&null!=e[n]?e[n]:t[n]}e.defineOption("autoCloseBrackets",!1,(function(t,n,a){a&&a!=e.Init&&(t.removeKeyMap(i),t.state.closeBrackets=null),n&&(r(o(n,"pairs")),t.state.closeBrackets=n,t.addKeyMap(i))}));var i={Backspace:function(t){var i=s(t);if(!i||t.getOption("disableInput"))return e.Pass;for(var r=o(i,"pairs"),a=t.listSelections(),c=0;c=0;c--){var d=a[c].head;t.replaceRange("",n(d.line,d.ch-1),n(d.line,d.ch+1),"+delete")}},Enter:function(t){var n=s(t),i=n&&o(n,"explode");if(!i||t.getOption("disableInput"))return e.Pass;for(var r=t.listSelections(),a=0;a1&&p.indexOf(i)>=0&&t.getRange(n(M.line,M.ch-2),M)==i+i){if(M.ch>2&&/\bstring/.test(t.getTokenTypeAt(n(M.line,M.ch-2))))return e.Pass;S="addFour"}else if(h){var T=0==M.ch?" ":t.getRange(n(M.line,M.ch-1),M);if(e.isWordChar(b)||T==i||e.isWordChar(T))return e.Pass;S="both"}else{if(!x||!(0===b.length||/\s/.test(b)||f.indexOf(b)>-1))return e.Pass;S="both"}else S=h&&d(t,M)?"both":p.indexOf(i)>=0&&t.getRange(M,n(M.line,M.ch+3))==i+i+i?"skipThree":"skip";if(u){if(u!=S)return e.Pass}else u=S}var y=m%2?a.charAt(m-1):i,v=m%2?i:a.charAt(m+1);t.operation((function(){if("skip"==u)c(t,1);else if("skipThree"==u)c(t,3);else if("surround"==u){for(var e=t.getSelections(),n=0;n0?{line:a.head.line,ch:a.head.ch+t}:{line:a.head.line-1};n.push({anchor:s,head:s})}e.setSelections(n,i)}function l(t){var o=e.cmpPos(t.anchor,t.head)>0;return{anchor:new n(t.anchor.line,t.anchor.ch+(o?-1:1)),head:new n(t.head.line,t.head.ch+(o?1:-1))}}function m(e,t){var o=e.getRange(n(t.line,t.ch-1),n(t.line,t.ch+1));return 2==o.length?o:null}function d(e,t){var o=e.getTokenAt(n(t.line,t.ch+1));return/\bstring/.test(o.type)&&o.start==t.ch&&(0==t.ch||!/\bstring/.test(e.getTokenTypeAt(t)))}r(t.pairs+"`")})); +var rEdit,commonAtoms=["And","Or"],commonKeywords=["If","Else","Elseif","Endif"],commonCommands=["AccessInfo","Background","Build","ClearAccessBlock","ClearRTCam","Config","ControllerDisable","ControllerEnable","DateTime","Debug","Dec","DeepSleep","DisablePriorityTask","DNS","DST","EraseSDKWiFi","ExecuteRules","FactoryReset","Gateway","I2Cscanner","Inc","IP","Let","Load","LogEntry","LogPortStatus","LoopTimerSet","LoopTimerSet_ms","LoopTimerSetAndRun","LoopTimerSetAndRun_ms","MemInfo","MemInfoDetail","Name","Password","PostToHTTP","Publish","PublishR","Reboot","Save","SendTo","SendToHTTP","SendToUDP","SendToUDPMix","Settings","Subnet","Subscribe","TaskClear","TaskClearAll","TaskDisable","TaskEnable","TaskRun","TaskValueSet","TaskValueSetAndRun","TimerPause","TimerResume","TimerSet","TimerSet_ms","TimeZone","UdpPort","UdpTest","Unit","UseNTP","WdConfig","WdRead","WiFi","WiFiAllowAP","WiFiAPMode","WiFiConnect","WiFiDisconnect","WiFiKey","WiFiKey2","WiFiMode","WiFiScan","WiFiSSID","WiFiSSID2","WiFiSTAMode","Event","AsyncEvent","GPIO","GPIOToggle","LongPulse","LongPulse_mS","Monitor","Pulse","PWM","Servo","Status","Tone","RTTTL","UnMonitor","Provision","Provision,Config","Provision,Security","Provision,Notification","Provision,Provision","Provision,Rules,","Provision,CustomCdnUrl","Provision,Firmware,",],commonEvents=["Clock#Time","Login#Failed","MQTT#Connected","MQTT#Disconnected","MQTTimport#Connected","MQTTimport#Disconnected","Rules#Timer","System#Boot","System#BootMode","System#Sleep","System#Wake","TaskExit#","TaskInit#","ThingspeakReply","Time#Initialized","Time#Set","WiFi#APmodeDisabled","WiFi#APmodeEnabled","WiFi#ChangedAccesspoint","WiFi#ChangedWiFichannel","WiFi#Connected","WiFi#Disconnected","ProvisionFirmware",],commonPlugins=["ResetPulseCounter","SetPulseCounterTotal","LogPulseStatistic","analogout","MCPGPIO","MCPGPIOToggle","MCPLongPulse","MCPLongPulse_ms","MCPPulse","Status,MCP","Monitor,MCP","MonitorRange,MCP","UnMonitorRange,MCP","UnMonitor,MCP","MCPGPIORange","MCPGPIOPattern","MCPMode","MCPModeRange","ExtGpio","ExtPwm","ExtPulse","ExtLongPulse","Status,EXT,","LCDCmd","LCD","PCFGPIO","PCFGPIOToggle","PCFLongPulse","PCFLongPulse_ms","PCFPulse","Status,PCF","Monitor,PCF","MonitorRange,PCF","UnMonitorRange,PCF","UnMonitor,PCF","PCFGPIORange","PCFGPIOpattern","PCFMode","PCFmodeRange","SerialSend","SerialSendMix","Ser2NetClientSend","SerialSend_test","pcapwm","pcafrq","mode2","OLED","OLEDCMD","OLEDCMD,on","OLEDCMD,off","OLEDCMD,clear","IRSEND","IRSENDAC","OledFramedCmd","OledFramedCmd,Display","OledFramedCmd,low","OledFramedCmd,med","OledFramedCmd,high","OledFramedCmd,Frame","OledFramedCmd,linecount","OledFramedCmd,leftalign","OledFramedCmd,align","OledFramedCmd,userDef1","OledFramedCmd,userDef2","NeoPixel","NeoPixelAll","NeoPixelLine","NeoPixelHSV","NeoPixelAllHSV","NeoPixelLineHSV","NeoPixelBright","MotorShieldCmd,DCMotor","MotorShieldCmd,Stepper","MHZCalibrateZero","MHZReset","MHZABCEnable","MHZABCDisable","Sensair_SetRelay","PMSX003","PMSX003,Wake","PMSX003,Sleep","PMSX003,Reset","encwrite","Play","Vol","Eq","Mode","Repeat","tareChanA","tareChanB","7dn","7dst","7dsd","7dtext","7ddt","7dt","7dtfont","7dtbin","7don","7doff","7output","HLWCalibrate","HLWReset","csecalibrate","cseclearpulses","csereset","WemosMotorShieldCMD","LolinMotorShieldCMD","GPS","GPS,Sleep","GPS,Wake","GPS#GotFix","GPS#LostFix","GPS#Travelled","homieValueSet","SerialProxy_Write","SerialProxy_WriteMix","SerialProxy_Test","HeatPumpir","MitsubishiHP","MitsubishiHP,temperature","MitsubishiHP,power","MitsubishiHP,mode","MitsubishiHP,fan","MitsubishiHP,vane","MitsubishiHP,widevane","Culreader_Write","Touch","Touch,Rot","Touch,Flip","Touch,Enable","Touch,Disable","Touch,On","Touch,Off","Touch,Toggle","Touch,Setgrp","Touch,Incgrp","Touch,Decgrp","Touch,Incpage","Touch,Decpage","Touch,Updatebutton","WakeOnLan","DotMatrix","DotMatrix,clear","DotMatrix,update","DotMatrix,size","DotMatrix,txt","DotMatrix,settxt","DotMatrix,content","DotMatrix,alignment","DotMatrix,anim.in","DotMatrix,anim.out","DotMatrix,speed","DotMatrix,pause","DotMatrix,font","DotMatrix,layout","DotMatrix,inverted","DotMatrix,specialeffect","DotMatrix,offset","DotMatrix,brightness","DotMatrix,repeat","DotMatrix,setbar","DotMatrix,bar","Thermo","Thermo,Up","Thermo,Down","Thermo,Mode","Thermo,ModeBtn","Thermo,Setpoint","Max1704xclearalert","scdgetabc","scdgetalt","scdgettmp","scdsetcalibration","scdsetfrc","scdgetinterval","multirelay","multirelay,on","multirelay,off","multirelay,set","multirelay,get","multirelay,loop","ShiftOut","ShiftOut,Set","ShiftOut,SetNoUpdate","ShiftOut,Update","ShiftOut,SetAll","ShiftOut,SetAllNoUpdate","ShiftOut,SetAllLow","ShiftOut,SetAllHigh","ShiftOut,SetChipCount","ShiftOut,SetHexBin","cdmrst","nfx","nfx,off","nfx,on","nfx,dim","nfx,line,","nfx,hsvline,","nfx,one,","nfx,hsvone,","nfx,all,","nfx,rgb,","nfx,fade,","nfx,hsv,","nfx,colorfade,","nfx,rainbow","nfx,kitt,","nfx,comet,","nfx,theatre,","nfx,scan,","nfx,dualscan,","nfx,twinkle,","nfx,twinklefade,","nfx,sparkle,","nfx,wipe,","nfx,dualwipe","nfx,fire","nfx,fireflicker","nfx,faketv","nfx,simpleclock","nfx,stop","nfx,statusrequest","nfx,fadetime,","nfx,fadedelay,","nfx,speed,","nfx,count,","nfx,bgcolor","ShiftIn","ShiftIn,PinEvent","ShiftIn,ChipEvent","ShiftIn,SetChipCount","ShiftIn,SampleFrequency","ShiftIn,EventPerPin","scd4x","scd4x,storesettings","scd4x,facoryreset","scd4x,selftest","scd4x,setfrc,","axp","axp,ldo2","axp,ldo3","axp,ldoio","axp,gpio0","axp,gpio1","axp,gpio2","axp,gpio3","axp,gpio4","axp,dcdc2","axp,dcdc3","axp,ldo2map","axp,ldo3map","axp,ldoiomap","axp,dcdc2map","axp,dcdc3map","axp,ldo2perc","axp,ldo3perc","axp,ldoioperc","axp,dcdc2perc","axp,dcdc3perc","I2CEncoder","I2CEncoder,bright","I2CEncoder,led1","I2CEncoder,led2","I2CEncoder,gain","I2CEncoder,set","cachereader","cachereader,readpos","cachereader,sendtaskinfo","cachereader,flush","tm1621","tm1621,write,","tm1621,writerow,","tm1621,voltamp,","tm1621,energy,","tm1621,celcius,","tm1621,fahrenheit,","tm1621,humidity,","tm1621,raw,","dac","dac,1","dac,2","sht4x","sht4x,startup","ld2410","ld2410,factoryreset","ld2410,logall","digipot","digipot,reset","digipot,shutdown","digipot,","7dextra","7dbefore","7dgroup","7digit","7color","7digitcolor","7groupcolor","gp8403","gp8403,volt,","gp8403,mvolt,","gp8403,range,","gp8403,preset,","gp8403,init,","sen5x","sen5x,startclean","sen5x,techlog,","as3935","as3935,clearstats","as3935,calibrate","as3935,setgain,","as3935,setnf,","as3935,setwd,","as3925,setsrej,","lu9685","lu9685,servo,","lu9685,enable,","lu9685,disable,","lu9685,setrange,","geni2c","geni2c,cmd,","geni2c,exec,","geni2c,log,",],pluginDispKind=["tft","ili9341","ili9342","ili9481","ili9486","ili9488","epd","eink","epaper","il3897","uc8151d","ssd1680","ws2in7","ws1in54","st77xx","st7735","st7789","st7796","neomatrix","neo","pcd8544",],pluginDispCmd=["cmd,on","cmd,off","cmd,clear","cmd,backlight","cmd,bright","cmd,deepsleep","cmd,seq_start","cmd,seq_end","cmd,inv","cmd,rot",",clear",",rot",",tpm",",txt",",txp",",txz",",txc",",txs",",txtfull",",asciitable",",font",",l",",lh",",lv",",lm",",lmr",",r",",rf",",c",",cf",",rf",",t",",tf",",rr",",rrf",",px",",pxh",",pxv",",bmp",",btn",",win",",defwin",",delwin",],commonTag=["On","Do","Endon"],commonNumber=["toBin","toHex","Constrain","XOR","AND:","OR:","Ord","bitRead","bitSet","bitClear","bitWrite","urlencode"],commonMath=["Log","Ln","Abs","Exp","Sqrt","Sq","Round","Sin","Cos","Tan","aSin","aCos","aTan","Sin_d","Cos_d","Tan_d","aSin_d","aCos_d","aTan_d","map","mapc"],commonWarning=["delay","Delay","ResetFlashWriteCounter"],taskSpecifics=["settings.Enabled","settings.Interval","settings.ValueCount","settings.Controller1.Enabled","settings.Controller2.Enabled","settings.Controller3.Enabled","settings.Controller1.Idx","settings.Controller2.Idx","settings.Controller3.Idx"],AnythingElse=["%eventvalue%","%eventpar%","%eventname%","%sysname%","%bootcause%","%systime%","%systm_hm%","%systm_hm_0%","%systm_hm_sp%","%systime_am%","%systime_am_0%","%systime_am_sp%","%systm_hm_am%","%systm_hm_am_0%","%systm_hm_am_sp%","%lcltime%","%sunrise%","%s_sunrise%","%m_sunrise%","%sunset%","%s_sunset%","%m_sunset%","%lcltime_am%","%syshour%","%syshour_0%","%sysmin%","%sysmin_0%","%syssec%","%syssec_0%","%sysday%","%sysday_0%","%sysmonth%","%sysmonth_0%","%sysyear%","%sysyear_0%","%sysyears%","%sysweekday%","%sysweekday_s%","%unixtime%","%uptime%","%uptime_ms%","%rssi%","%ip%","%unit%","%unit_0%","%ssid%","%bssid%","%wi_ch%","%iswifi%","%vcc%","%mac%","%mac_int%","%isntp%","%ismqtt%","%dns%","%dns1%","%dns2%","%flash_freq%","%flash_size%","%flash_chip_vendor%","%flash_chip_model%","%fs_free%","%fs_size%","%cpu_id%","%cpu_freq%","%cpu_model%","%cpu_rev%","%cpu_cores%","%board_name%","%inttemp%","%islimited_build%","%isvar_double%","substring","indexOf","indexOf_ci","equals","equals_ci","strtol","timeToMin","timeToSec","%ethwifimode%","%ethconnected%","%ethduplex%","%ethspeed%","%ethstate%","%ethspeedstate%","%c_w_dir%","%c_c2f%","%c_ms2Bft%","%c_dew_th%","%c_alt_pres_sea%","%c_sea_pres_alt%","%c_cm2imp%","%c_mm2imp%","%c_m2day%","%c_m2dh%","%c_m2dhm%","%c_s2dhms%","%c_random%","%c_2hex%","%c_u2ip%","%c_uname%","%c_uage%","%c_ubuild%","%c_ubuildstr%","%c_uload%","%c_utype%","%c_utypestr%","var","int"];for(const element2 of pluginDispKind)commonPlugins=commonPlugins.concat(element2);for(const element2 of pluginDispKind)for(const element3 of pluginDispCmd){let e=element2+element3;commonPlugins=commonPlugins.concat(e)}var EXTRAWORDS=commonAtoms.concat(commonPlugins,commonKeywords,commonCommands,commonEvents,commonTag,commonNumber,commonMath,commonWarning,taskSpecifics,AnythingElse);function initCM(){CodeMirror.commands.autocomplete=function(e){e.showHint({hint:CodeMirror.hint.anyword})},(rEdit=CodeMirror.fromTextArea(document.getElementById("rules"),{tabSize:2,indentWithTabs:!1,lineNumbers:!0,autoCloseBrackets:!0,extraKeys:{"Ctrl-Space":"autocomplete",Tab(e){"null"===e.getMode().name?e.execCommand("insertTab"):e.somethingSelected()?e.execCommand("indentMore"):e.execCommand("insertSoftTab")},"Shift-Tab":e=>e.execCommand("indentLess")}})).on("change",function(){rEdit.save()}),rEdit.on("inputRead",function(e,t){var n=e.getCursor(),o=e.getTokenAt(n);/[\w%,.]/.test(t.text)&&"comment"!=o.type&&e.showHint({completeSingle:!1})})}!function(e){"object"==typeof exports&&"object"==typeof module?e(require("codemirror")):"function"==typeof define&&define.amd?define(["codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("espeasy",function(){var e={};function t(t,n){for(var o=0;oe.toLowerCase());commonCommands=commonCommands.concat(n);var o=commonEvents.map(e=>e.toLowerCase());commonEvents=commonEvents.concat(o);var i=commonPlugins.map(e=>e.toLowerCase());commonPlugins=commonPlugins.concat(i);var a=commonAtoms.map(e=>e.toLowerCase());commonAtoms=commonAtoms.concat(a);var s=commonKeywords.map(e=>e.toLowerCase());commonKeywords=commonKeywords.concat(s);var r=commonTag.map(e=>e.toLowerCase());commonTag=commonTag.concat(r);var c=commonNumber.map(e=>e.toLowerCase());commonNumber=commonNumber.concat(c);var l=commonMath.map(e=>e.toLowerCase());commonMath=commonMath.concat(l);var m=AnythingElse.map(e=>e.toLowerCase());AnythingElse=AnythingElse.concat(m);var d=taskSpecifics.map(e=>e.toLowerCase());function u(t,n){if(t.eatSpace())return null;t.sol();var o=t.next();if(/\d/.test(o)){if("0"==o)return"x"===t.next()?(t.eatWhile(/\w/),"number"):(t.eatWhile(/\d|\./),"number");if(t.eatWhile(/\d|\./),!t.match("d")&&!t.match("output")&&(t.eol()||/\D/.test(t.peek())))return"number"}if(/\w/.test(o))for(let i of EXTRAWORDS){let a=i.substring(1);(i.includes(":")||i.includes(",")||i.includes("."))&&t.match(a)}if(/\w/.test(o)&&(t.eatWhile(/[\w]/),t.match(".gpio")||t.match(".pulse")||t.match(".frq")||t.match(".pwm")))return"def";if("\\"===o)return t.next(),null;if("("===o||")"===o)return"bracket";if("{"===o||"}"===o||":"===o)return"number";if("/"==o)return/\//.test(t.peek())?(t.skipToEnd(),"comment"):"operator";if("'"==o&&(t.eatWhile(/[^']/),t.match("'")))return"attribute";if("+"===o||"="===o||"<"===o||">"===o||"-"===o||","===o||"*"===o||"!"===o)return"operator";if("%"==o){if(/\d/.test(t.next()))return"number";if(t.eatWhile(/[^\s\%]/),t.match("%"))return"hr"}if("["==o&&(t.eatWhile(/[^\s\]]/),t.eat("]")))return"hr";t.eatWhile(/\w/);var s=t.current();return/\w/.test(o)&&t.match("#")?(t.eatWhile(/[\w.#]/),"events"):"#"===o?(t.eatWhile(/\w/),"number"):e.hasOwnProperty(s)?e[s]:null}return taskSpecifics=taskSpecifics.concat(d),t("atom",commonAtoms),t("keyword",commonKeywords),t("builtin",commonCommands),t("events",commonEvents),t("def",commonPlugins),t("tag",commonTag),t("number",commonNumber),t("bracket",commonMath),t("warning",commonWarning),t("hr",AnythingElse),t("comment",taskSpecifics),{startState:function(){return{tokens:[]}},token:function(e,t){var n,o;return n=e,((o=t).tokens[0]||u)(n,o)},closeBrackets:"[]{}''\"\"``()",lineComment:"//",fold:"brace"}})}),function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],mod):e(CodeMirror)}(function(e){var t={pairs:"()[]{}''\"\"",closeBefore:")]}'\":;>",triples:"",explode:"[]{}"},n=e.Pos;function o(e,n){return"pairs"==n&&"string"==typeof e?e:"object"==typeof e&&null!=e[n]?e[n]:t[n]}e.defineOption("autoCloseBrackets",!1,function(t,n,s){s&&s!=e.Init&&(t.removeKeyMap(i),t.state.closeBrackets=null),n&&(a(o(n,"pairs")),t.state.closeBrackets=n,t.addKeyMap(i))});var i={Backspace:function t(i){var a=r(i);if(!a||i.getOption("disableInput"))return e.Pass;for(var s=o(a,"pairs"),c=i.listSelections(),l=0;l=0;l--){var u=c[l].head;i.replaceRange("",n(u.line,u.ch-1),n(u.line,u.ch+1),"+delete")}},Enter:function t(n){var i=r(n),a=i&&o(i,"explode");if(!a||n.getOption("disableInput"))return e.Pass;for(var s=n.listSelections(),l=0;l=0&&i.getRange(T,n(T.line,T.ch+3))==a+a+a?"skipThree":"skip";else if(h&&T.ch>1&&f.indexOf(a)>=0&&i.getRange(n(T.line,T.ch-2),T)==a+a){if(T.ch>2&&/\bstring/.test(i.getTokenTypeAt(n(T.line,T.ch-2))))return e.Pass;C="addFour"}else if(h){var y=0==T.ch?" ":i.getRange(n(T.line,T.ch-1),T);if(e.isWordChar(M)||y==a||e.isWordChar(y))return e.Pass;C="both"}else{if(!(x&&(0===M.length||/\s/.test(M)||p.indexOf(M)>-1)))return e.Pass;C="both"}if(P){if(P!=C)return e.Pass}else P=C}var v=u%2?m.charAt(u-1):a,D=u%2?a:m.charAt(u+1);i.operation(function(){if("skip"==P)c(i,1);else if("skipThree"==P)c(i,3);else if("surround"==P){for(var e=i.getSelections(),t=0;t0?{line:s.head.line,ch:s.head.ch+t}:{line:s.head.line-1};n.push({anchor:r,head:r})}e.setSelections(n,i)}function l(t){var o=e.cmpPos(t.anchor,t.head)>0;return{anchor:new n(t.anchor.line,t.anchor.ch+(o?-1:1)),head:new n(t.head.line,t.head.ch+(o?1:-1))}}function m(e,t){var o=e.getRange(n(t.line,t.ch-1),n(t.line,t.ch+1));return 2==o.length?o:null}function d(e,t){var o=e.getTokenAt(n(t.line,t.ch+1));return/\bstring/.test(o.type)&&o.start==t.ch&&(0==t.ch||!/\bstring/.test(e.getTokenTypeAt(t)))}a(t.pairs+"`")}); \ No newline at end of file From 8f3fd80f132170512f8beb20b4ea2c696823bd37 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Mon, 5 May 2025 14:20:35 +0200 Subject: [PATCH 06/56] [Docs] Add examples for substring for translation of day/month names --- docs/source/Rules/Rules.rst | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/source/Rules/Rules.rst b/docs/source/Rules/Rules.rst index 8afb71299..12a3beae3 100644 --- a/docs/source/Rules/Rules.rst +++ b/docs/source/Rules/Rules.rst @@ -1005,6 +1005,32 @@ For example (bit useless though, just for illustrative purposes): 221351 : Info : Command: logentry 221353 : Info : 87 +Translate the current day to a localized (German) 3 character abbreviation: (using named variables) + +.. code-block:: none + + Let,idx,(%sysweekday%-1)*3 // 3 characters per value + Let,idx3,%v_idx%+3 // 3 characters to display + [DSPLeft].7dtext,{substring:%v_idx%:%v_idx3%:SONMONDIEMITDONFRESAM}~%syshour_0%.%sysmin_0% + +Or using 2-character Dutch abbreviations: + +.. code-block:: none + + Let,idx,(%sysweekday%-1)*2 // 2 characters per value + Let,idx2,%v_idx%+2 // 2 characters to display + [DSPLeft].7dtext,{substring:%v_idx%:%v_idx2%:"ZOMADIWODOVRZA"}~%syshour_0%.%sysmin_0% + +Translate the current month to a Polish 3 character abbreviation, format DD MMM YY : + +.. code-block:: none + + Let,idx,(%sysmonth%-1)*3 // 3 characters per value + Let,idx3,%v_idx%+3 // 3 characters to display + [DSPLeft].7dtext,%sysday_0%~{substring:%v_idx%:%v_idx3%:STYLUTMARKWIMAJCZELIPSIEWRZPAZLISGRU}~%sysyears% + +NB: Using all uppercase here as that shows most readable on a 7-segment display, for other purposes, CamelCase/lowercase can of course be used. + IndexOf and IndexOf_ci ^^^^^^^^^^^^^^^^^^^^^^ From ab8a1a7090300f30dcb83065836190919f6795da Mon Sep 17 00:00:00 2001 From: TD-er Date: Mon, 5 May 2025 15:18:36 +0200 Subject: [PATCH 07/56] [Favicon] Serve favicon.ico as inline SVG --- .../ESPEasy/ESPEasyLogo_blue_on_white.svg | 91 ++++++++++++++++++ .../ESPEasy/ESPEasyLogo_blue_on_white_min.svg | 1 + docs/source/ESPEasy/ESPEasyLogo_color.svg | 92 +++++++++++++++++++ src/src/Static/WebStaticData.cpp | 11 +++ src/src/WebServer/SysVarPage.cpp | 3 +- 5 files changed, 197 insertions(+), 1 deletion(-) create mode 100755 docs/source/ESPEasy/ESPEasyLogo_blue_on_white.svg create mode 100755 docs/source/ESPEasy/ESPEasyLogo_blue_on_white_min.svg create mode 100755 docs/source/ESPEasy/ESPEasyLogo_color.svg diff --git a/docs/source/ESPEasy/ESPEasyLogo_blue_on_white.svg b/docs/source/ESPEasy/ESPEasyLogo_blue_on_white.svg new file mode 100755 index 000000000..64e33d0bb --- /dev/null +++ b/docs/source/ESPEasy/ESPEasyLogo_blue_on_white.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + diff --git a/docs/source/ESPEasy/ESPEasyLogo_blue_on_white_min.svg b/docs/source/ESPEasy/ESPEasyLogo_blue_on_white_min.svg new file mode 100755 index 000000000..f934864b1 --- /dev/null +++ b/docs/source/ESPEasy/ESPEasyLogo_blue_on_white_min.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/source/ESPEasy/ESPEasyLogo_color.svg b/docs/source/ESPEasy/ESPEasyLogo_color.svg new file mode 100755 index 000000000..1a419e054 --- /dev/null +++ b/docs/source/ESPEasy/ESPEasyLogo_color.svg @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/src/Static/WebStaticData.cpp b/src/src/Static/WebStaticData.cpp index 6a8f813e7..99a5f56b3 100644 --- a/src/src/Static/WebStaticData.cpp +++ b/src/src/Static/WebStaticData.cpp @@ -131,6 +131,17 @@ void serve_favicon() { addHtmlAttribute(F("type"), F("image/x-icon")); addHtmlAttribute(F("href"), generate_external_URL(F("favicon.ico"), true)); addHtml('/', '>'); + #else + addHtml(F("'); + +/* + +*/ #endif } diff --git a/src/src/WebServer/SysVarPage.cpp b/src/src/WebServer/SysVarPage.cpp index e5a73daba..614c77448 100644 --- a/src/src/WebServer/SysVarPage.cpp +++ b/src/src/WebServer/SysVarPage.cpp @@ -378,8 +378,9 @@ void handle_sysvars() { F("Mins to hcm: %c_m2hcm%(482)"), F("Secs to dhms: %c_s2dhms%(100000)"), +#ifndef LIMIT_BUILD_SIZE F("Random: %c_random%(0, 100)"), - +#endif // addFormSeparator(3, F("To HEX: %c_2hex%(100000)"), From c76e034080c6277c11d2f27b0592419c49a4e4d6 Mon Sep 17 00:00:00 2001 From: TD-er Date: Wed, 7 May 2025 14:13:06 +0200 Subject: [PATCH 08/56] [settings] Reduce initial default config.dat to 96k on ESP32 --- src/src/CustomBuild/StorageLayout.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/src/CustomBuild/StorageLayout.h b/src/src/CustomBuild/StorageLayout.h index 3afa28391..5b78641a0 100644 --- a/src/src/CustomBuild/StorageLayout.h +++ b/src/src/CustomBuild/StorageLayout.h @@ -216,7 +216,7 @@ # define DAT_OFFSET_CDN (DAT_OFFSET_CONTROLLER - DAT_CDN_SIZE) // single CDN settings block of 1k # endif # ifndef CONFIG_FILE_SIZE - # define CONFIG_FILE_SIZE 131072 + # define CONFIG_FILE_SIZE (DAT_OFFSET_TASKS + ((DAT_TASKS_SIZE + DAT_TASKS_CUSTOM_SIZE) * TASKS_MAX)) # endif // ifndef CONFIG_FILE_SIZE #endif // if defined(ESP32) From 1c34dd92c4c5a446a0eeef3ba793824db4774ac4 Mon Sep 17 00:00:00 2001 From: TD-er Date: Wed, 7 May 2025 14:15:24 +0200 Subject: [PATCH 09/56] [JSON] Tweak generating JSON via web requests --- src/src/DataStructs/PluginStats.cpp | 7 +-- src/src/DataStructs/PluginStats_array.cpp | 4 +- src/src/Helpers/StringConverter.cpp | 40 +++++++----- src/src/Helpers/StringConverter_Numerical.cpp | 62 ++++++++++++++----- src/src/Helpers/StringConverter_Numerical.h | 11 ++++ src/src/WebServer/Chart_JS.cpp | 25 +++++--- src/src/WebServer/HTML_wrappers.cpp | 28 +++++++-- src/src/WebServer/HTML_wrappers.h | 2 + src/src/WebServer/JSON.cpp | 14 ++--- 9 files changed, 131 insertions(+), 62 deletions(-) diff --git a/src/src/DataStructs/PluginStats.cpp b/src/src/DataStructs/PluginStats.cpp index 6d0fb343a..c836af50a 100644 --- a/src/src/DataStructs/PluginStats.cpp +++ b/src/src/DataStructs/PluginStats.cpp @@ -578,12 +578,7 @@ void PluginStats::plot_ChartJS_dataset() const addHtml(','); } - if (!isnan((*_samples)[i])) { - addHtmlFloat((*_samples)[i], _nrDecimals); - } - else { - addHtml(F("null")); - } + addHtmlFloat_NaN_toNull((*_samples)[i], _nrDecimals); } add_ChartJS_dataset_footer(); } diff --git a/src/src/DataStructs/PluginStats_array.cpp b/src/src/DataStructs/PluginStats_array.cpp index 37141eedf..754a1694a 100644 --- a/src/src/DataStructs/PluginStats_array.cpp +++ b/src/src/DataStructs/PluginStats_array.cpp @@ -368,8 +368,8 @@ void PluginStats_array::plot_ChartJS(bool onlyJSON) const if (_plugin_stats_timestamps != nullptr) { struct tm ts; uint32_t unix_time_frac{}; - const uint32_t uinxtime_sec = node_time.systemMicros_to_Unixtime((*_plugin_stats_timestamps)[i], unix_time_frac); - const uint32_t local_timestamp = time_zone.toLocal(uinxtime_sec); + const uint32_t unixtime_sec = node_time.systemMicros_to_Unixtime((*_plugin_stats_timestamps)[i], unix_time_frac); + const uint32_t local_timestamp = time_zone.toLocal(unixtime_sec); breakTime(local_timestamp, ts); addHtml('"'); addHtml(formatDateTimeString(ts)); diff --git a/src/src/Helpers/StringConverter.cpp b/src/src/Helpers/StringConverter.cpp index 19fc5e317..b8f2954ba 100644 --- a/src/src/Helpers/StringConverter.cpp +++ b/src/src/Helpers/StringConverter.cpp @@ -682,10 +682,12 @@ String to_json_value(const String& value, bool wrapInQuotes) { // Empty string return F("\"\""); } - if (value.length() > 2) { + const size_t val_length = value.length(); + + if (val_length > 2) { // Check for JSON objects or arrays const char firstchar = value[0]; - const char lastchar = value[value.length() - 1]; + const char lastchar = value[val_length - 1]; if ((firstchar == '[' && lastchar == ']') || (firstchar == '{' && lastchar == '}')) { @@ -698,26 +700,34 @@ String to_json_value(const String& value, bool wrapInQuotes) { // Is not a numerical value, or BIN/HEX notation, thus wrap with quotes // First we check for not allowed special characters. - const size_t val_length = value.length(); + + // Most frequently found in a string + const bool backslash_or_doubleQuote_found = + value.indexOf('\\') != -1 || + value.indexOf('"') != -1; + for (size_t i = 0; i < val_length; ++i) { const char c = value[i]; // Special characters not allowed in JSON: - if (c == '\n'|| // \n New line - c == '\r'|| // \r Carriage return - c == '\t'|| // \t Tab - c == '\\'|| // \\ Backslash character + if (backslash_or_doubleQuote_found || + (c >= '\b' && c <= '\r') +/* c == '\b'|| // \b Backspace (ascii code 08) + c == '\t'|| // \t Tab + c == '\n'|| // \n New line c == '\f'|| // \f Form feed (ascii code 0C) - c == '"') { // \" Double quote + c == '\r'|| // \r Carriage return +*/ + ) { // Must replace characters, so make a deepcopy String tmpValue(value); - tmpValue.replace('\n', '^'); - tmpValue.replace('\r', '^'); - tmpValue.replace('\t', ' '); - tmpValue.replace('\\', '^'); - tmpValue.replace('\b', '^'); - tmpValue.replace('\f', '^'); - tmpValue.replace('"', '\''); + tmpValue.replace('\b', '^'); // \b Backspace (ascii code 08) + tmpValue.replace('\t', ' '); // \t Tab + tmpValue.replace('\n', '^'); // \n New line + tmpValue.replace('\f', '^'); // \f Form feed (ascii code 0C) + tmpValue.replace('\r', '^'); // \r Carriage return + tmpValue.replace('\\', '^'); // Backslash + tmpValue.replace('"', '\''); // Double quote return wrap_String(tmpValue, '"'); } } diff --git a/src/src/Helpers/StringConverter_Numerical.cpp b/src/src/Helpers/StringConverter_Numerical.cpp index 4b7847bc6..92dc707b7 100644 --- a/src/src/Helpers/StringConverter_Numerical.cpp +++ b/src/src/Helpers/StringConverter_Numerical.cpp @@ -26,25 +26,40 @@ unsigned long str2int(const char *string) \*********************************************************************************************/ String toString(const float& value, unsigned int decimalPlaces, bool trimTrailingZeros) { -#ifdef ESP32 + String res; + toValidString(res, value, decimalPlaces, trimTrailingZeros); + return res; +} + +bool toValidString(String& str, + const float& value, + unsigned int decimalPlaces, + bool trimTrailingZeros) +{ + #ifdef ESP32 if (isnanf(value)) { - return F("NaN"); + str = F("NaN"); + return false; } if (isinff(value)) { - return F("Inf"); + str = F("Inf"); + return false; } #else if (isnan(value)) { - return F("NaN"); + str = F("NaN"); + return false; } if (isinf(value)) { - return F("Inf"); + str = F("Inf"); + return false; } #endif const double value_d(value); - return doubleToString(value_d, decimalPlaces, trimTrailingZeros); + return doubleToValidString(str, value_d, decimalPlaces, trimTrailingZeros); } + String ull2String(uint64_t value, uint8_t base) { String res; @@ -117,13 +132,25 @@ String toStringNoZero(int64_t value) { } String doubleToString(const double& value, unsigned int decimalPlaces, bool trimTrailingZeros_b) { + String res; + doubleToValidString(res, value, decimalPlaces, trimTrailingZeros); + return res; +} + + +bool doubleToValidString(String& str, + const double& value, + unsigned int decimalPlaces , + bool trimTrailingZeros_b) +{ if (isnan(value)) { - return F("NaN"); + str = F("NaN"); + return false; } if (isinf(value)) { - return F("Inf"); + str = F("Inf"); + return false; } - String res; #if FEATURE_USE_DOUBLE_AS_ESPEASY_RULES_FLOAT_TYPE // We use some trick here to prevent rounding errors @@ -150,9 +177,10 @@ String doubleToString(const double& value, unsigned int decimalPlaces, bool trim char *buf = (char *)malloc(expectedChars); if (nullptr == buf) { - return F("NaN"); + str = F("NaN"); + return false; } - move_special(res, String(dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf))); + move_special(str, String(dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf))); free(buf); #if FEATURE_USE_DOUBLE_AS_ESPEASY_RULES_FLOAT_TYPE @@ -182,7 +210,7 @@ String doubleToString(const double& value, unsigned int decimalPlaces, bool trim // Those cannot be used in the string format, so use it as a preformatted string const String tmp_str_before_dot = ull2String(int_value / factor); if (decimalPlaces == 0) { - res = tmp_str_before_dot; + str = tmp_str_before_dot; } else { String tmp_str_after_dot; tmp_str_after_dot.reserve(decimalPlaces); @@ -192,23 +220,23 @@ String doubleToString(const double& value, unsigned int decimalPlaces, bool trim tmp_str_after_dot = concat('0', tmp_str_after_dot); } - res = strformat( + str = strformat( F("%s.%s"), tmp_str_before_dot.c_str(), tmp_str_after_dot.c_str()); } if (value < 0) { - res = concat('-', res); + str = concat('-', str); } } #endif - res.trim(); + str.trim(); if (trimTrailingZeros_b) { - return trimTrailingZeros(res); + str = trimTrailingZeros(str); } - return res; + return true; } String floatToString(const float& value, diff --git a/src/src/Helpers/StringConverter_Numerical.h b/src/src/Helpers/StringConverter_Numerical.h index 769f6b66d..ec44ba4db 100644 --- a/src/src/Helpers/StringConverter_Numerical.h +++ b/src/src/Helpers/StringConverter_Numerical.h @@ -23,6 +23,12 @@ String toString(const float& value, unsigned int decimalPlaces = 2, bool trimTrailingZeros = false); +bool toValidString(String& str, + const float& value, + unsigned int decimalPlaces = 2, + bool trimTrailingZeros = false); + + String ull2String(uint64_t value, uint8_t base = 10); @@ -37,6 +43,11 @@ String doubleToString(const double& value, unsigned int decimalPlaces = 2, bool trimTrailingZeros = false); +bool doubleToValidString(String& str, + const double& value, + unsigned int decimalPlaces = 2, + bool trimTrailingZeros = false); + String floatToString(const float& value, unsigned int decimalPlaces = 2, bool trimTrailingZeros = false); diff --git a/src/src/WebServer/Chart_JS.cpp b/src/src/WebServer/Chart_JS.cpp index fbcdd5dbb..0990f7228 100644 --- a/src/src/WebServer/Chart_JS.cpp +++ b/src/src/WebServer/Chart_JS.cpp @@ -4,7 +4,7 @@ # include "../Helpers/StringConverter.h" # include "../WebServer/HTML_wrappers.h" - +# include "../WebServer/JSON.h" void add_ChartJS_array(int valueCount, const String array[]) @@ -25,7 +25,7 @@ void add_ChartJS_array(int valueCount, if (i != 0) { addHtml(',', '\n'); } - addHtmlFloat(array[i], nrDecimals); + addHtmlFloat_NaN_toNull(array[i], nrDecimals); } } @@ -174,10 +174,11 @@ void add_ChartJS_chart_labels( void add_ChartJS_scatter_data_point(float x, float y, int nrDecimals) { - addHtml(strformat( - F("{\"x\":%s,\"y\":%s},"), - toString(x, nrDecimals).c_str(), - toString(y, nrDecimals).c_str())); + addHtml(F("{\"x\":")); + addHtmlFloat_NaN_toNull(x, nrDecimals); + addHtml(F(",\"y\":")); + addHtmlFloat_NaN_toNull(y, nrDecimals); + addHtml('}', ','); } void add_ChartJS_dataset( @@ -197,16 +198,20 @@ void add_ChartJS_dataset_header(const ChartJS_dataset_config& config) addHtml('{'); if (!config.label.isEmpty()) { - addHtml(strformat(F("\"label\":\"%s\","), config.label.c_str())); + stream_to_json_object_value(F("label"), config.label); + addHtml(','); } if (!config.color.isEmpty()) { - addHtml(strformat(F("\"backgroundColor\":\"%s\","), config.color.c_str())); - addHtml(strformat(F("\"borderColor\":\"%s\","), config.color.c_str())); + stream_to_json_object_value(F("backgroundColor"), config.color); + addHtml(','); + stream_to_json_object_value(F("borderColor"), config.color); + addHtml(','); } if (!config.axisID.isEmpty()) { - addHtml(strformat(F("\"yAxisID\":\"%s\","), config.axisID.c_str())); + stream_to_json_object_value(F("yAxisID"), config.axisID); + addHtml(','); } if (config.hidden || config.displayConfig.showHidden()) { diff --git a/src/src/WebServer/HTML_wrappers.cpp b/src/src/WebServer/HTML_wrappers.cpp index 43ea53a9c..1820cc801 100644 --- a/src/src/WebServer/HTML_wrappers.cpp +++ b/src/src/WebServer/HTML_wrappers.cpp @@ -441,10 +441,30 @@ void addHtmlFloat(const float& value, unsigned int nrDecimals) { addHtml(toString(value, nrDecimals)); } +void addHtmlFloat_NaN_toNull(const float& value, unsigned int nrDecimals) { + String res; + if (toValidString(res, value, nrDecimals)) { + addHtml(res); + } else { + addHtml(F("null")); + } +} + + #if FEATURE_USE_DOUBLE_AS_ESPEASY_RULES_FLOAT_TYPE void addHtmlFloat(const double& value, unsigned int nrDecimals) { addHtml(doubleToString(value, nrDecimals)); } + +void addHtmlFloat_NaN_toNull(const double& value, unsigned int nrDecimals) { + String res; + if (doubleToValidString(res, value, nrDecimals)) { + addHtml(res); + } else { + addHtml(F("null")); + } +} + #endif @@ -496,17 +516,17 @@ void addHtmlAttribute(const __FlashStringHelper * label, const __FlashStringHelp void addHtmlAttribute(const __FlashStringHelper * label, const String& value) { addHtml(' '); addHtml(label); - addHtml(F("='")); + addHtml('=', '\''); addEncodedHtml(value); - addHtml(F("' ")); + addHtml('\'', ' '); } void addHtmlAttribute(const String& label, const String& value) { addHtml(' '); addHtml(label); - addHtml(F("='")); + addHtml('=', '\''); addEncodedHtml(value); - addHtml(F("' ")); + addHtml('\'', ' '); } void addDisabled() { diff --git a/src/src/WebServer/HTML_wrappers.h b/src/src/WebServer/HTML_wrappers.h index fa445b3d6..005393a84 100644 --- a/src/src/WebServer/HTML_wrappers.h +++ b/src/src/WebServer/HTML_wrappers.h @@ -139,8 +139,10 @@ void addHtmlInt(uint32_t int_val); void addHtmlInt(int64_t int_val); void addHtmlInt(uint64_t int_val); void addHtmlFloat(const float& value, unsigned int nrDecimals = 2u); +void addHtmlFloat_NaN_toNull(const float& value, unsigned int nrDecimals = 2u); #if FEATURE_USE_DOUBLE_AS_ESPEASY_RULES_FLOAT_TYPE void addHtmlFloat(const double& value, unsigned int nrDecimals = 2u); +void addHtmlFloat_NaN_toNull(const double& value, unsigned int nrDecimals = 2u); #endif void addEncodedHtml(const __FlashStringHelper * html); diff --git a/src/src/WebServer/JSON.cpp b/src/src/WebServer/JSON.cpp index 3e3487fbb..e2c6d9bf8 100644 --- a/src/src/WebServer/JSON.cpp +++ b/src/src/WebServer/JSON.cpp @@ -696,10 +696,9 @@ void stream_to_json_object_value(const __FlashStringHelper * object, const Stri } void stream_to_json_object_value(const String& object, const String& value) { - addHtml(strformat( - F("\"%s\":%s"), - object.c_str(), - to_json_value(value).c_str())); + addHtml(wrap_String(object, '"', '"')); + addHtml(':'); + addHtml(to_json_value(value)); } void stream_to_json_object_value(const __FlashStringHelper * object, int value) { @@ -707,10 +706,9 @@ void stream_to_json_object_value(const __FlashStringHelper * object, int value) } void stream_to_json_object_value(const String& object, int value) { - addHtml(strformat( - F("\"%s\":%d"), - object.c_str(), - value)); + addHtml(wrap_String(object, '"', '"')); + addHtml(':'); + addHtmlInt(value); } String jsonBool(bool value) { From 95510eef356b2246e3f8d31a50bc3a24f27d14e8 Mon Sep 17 00:00:00 2001 From: TD-er Date: Wed, 7 May 2025 14:16:55 +0200 Subject: [PATCH 10/56] [Favicon] Tweak blue color in SVG ESPEasy favicon --- src/src/Static/WebStaticData.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/src/Static/WebStaticData.cpp b/src/src/Static/WebStaticData.cpp index 99a5f56b3..79307b2b1 100644 --- a/src/src/Static/WebStaticData.cpp +++ b/src/src/Static/WebStaticData.cpp @@ -135,12 +135,12 @@ void serve_favicon() { addHtml(F("'); /* + href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='113.392' height='113.392' viewBox='0 0 30.002 30.002'%3E%3Cpath fill='%23f9f9f9' d='M0 24.728V5.272A5.272 5.272 0 0 1 5.272 0h19.456c2.91 0 5.274 2.36 5.274 5.272v19.456a5.276 5.276 0 0 1-5.274 5.274H5.272A5.274 5.274 0 0 1 0 24.728zM30.002 0'/%3E%3Cpath fill='%2307d' stroke='%2307d' stroke-linecap='round' stroke-width='2.636' d='m3.75 11.25 7.5-7.5M3.75 18.75l15-15M3.75 26.25l22.5-22.5M11.25 26.25l15-15'/%3E%3Cpath fill='%2307d' d='M27.374 24.377a2.999 2.999 0 1 0-5.999 0 2.999 2.999 0 0 0 3.002 2.997 2.997 2.997 0 0 0 2.997-2.997zm-2.997 0'/%3E%3C/svg%3E" /> */ #endif } From ac15f1839086cce16cf2a05c6c636d41261944d2 Mon Sep 17 00:00:00 2001 From: TD-er Date: Wed, 7 May 2025 15:49:47 +0200 Subject: [PATCH 11/56] [Time] Speedup printing date/time string --- src/src/Helpers/ESPEasy_time_calc.cpp | 14 ++++++++++++++ src/src/Helpers/StringConverter_Numerical.cpp | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/src/Helpers/ESPEasy_time_calc.cpp b/src/src/Helpers/ESPEasy_time_calc.cpp index 1c6be17a9..84a8b093b 100644 --- a/src/src/Helpers/ESPEasy_time_calc.cpp +++ b/src/src/Helpers/ESPEasy_time_calc.cpp @@ -142,10 +142,24 @@ void breakTime(unsigned long timeInput, struct tm& tm) { int year = 1970; unsigned long days = 0; + #ifndef LIMIT_BUILD_SIZE + if (time > 20089) { + // Skip checking 55 years for being leap year. + year = 2025; + days = 20089; + } + #endif while ((unsigned)(days += (isLeapYear(year) ? 366 : 365)) <= time) { year++; } +/* + addLog(LOG_LEVEL_INFO, strformat( + F("breakTime: time: %u year: %d, days: %u"), + time, + year, + days)); +*/ tm.tm_year = year - 1900; // tm_year starts at 1900 days -= isLeapYear(year) ? 366 : 365; diff --git a/src/src/Helpers/StringConverter_Numerical.cpp b/src/src/Helpers/StringConverter_Numerical.cpp index 92dc707b7..18e29ad7b 100644 --- a/src/src/Helpers/StringConverter_Numerical.cpp +++ b/src/src/Helpers/StringConverter_Numerical.cpp @@ -133,7 +133,7 @@ String toStringNoZero(int64_t value) { String doubleToString(const double& value, unsigned int decimalPlaces, bool trimTrailingZeros_b) { String res; - doubleToValidString(res, value, decimalPlaces, trimTrailingZeros); + doubleToValidString(res, value, decimalPlaces, trimTrailingZeros_b); return res; } From 6eb577e8bf017f8abb6b7bf6e76b547a00937708 Mon Sep 17 00:00:00 2001 From: TD-er Date: Wed, 7 May 2025 17:16:37 +0200 Subject: [PATCH 12/56] [Build] Remove TAR support from LIMIT_BUILD_SIZE builds (saves 5+ kB) --- src/src/CustomBuild/define_plugin_sets.h | 6 +++++- src/src/Helpers/TarStream.cpp | 4 ++-- src/src/Helpers/TarStream.h | 4 ++-- src/src/Static/WebStaticData.cpp | 20 +++++++++++++------- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/src/CustomBuild/define_plugin_sets.h b/src/src/CustomBuild/define_plugin_sets.h index 28c786d2a..aaa6cb794 100644 --- a/src/src/CustomBuild/define_plugin_sets.h +++ b/src/src/CustomBuild/define_plugin_sets.h @@ -3534,7 +3534,11 @@ To create/register a plugin, you have to : #endif #ifndef FEATURE_TARSTREAM_SUPPORT - #define FEATURE_TARSTREAM_SUPPORT 1 + #ifdef LIMIT_BUILD_SIZE + #define FEATURE_TARSTREAM_SUPPORT 0 + #else + #define FEATURE_TARSTREAM_SUPPORT 1 + #endif #endif // FEATURE_TARSTREAM_SUPPORT // Check for plugins that will use Extended Custom Settings storage when available diff --git a/src/src/Helpers/TarStream.cpp b/src/src/Helpers/TarStream.cpp index d11d4db8e..0e1b16084 100644 --- a/src/src/Helpers/TarStream.cpp +++ b/src/src/Helpers/TarStream.cpp @@ -32,10 +32,10 @@ TarFileInfo_struct::TarFileInfo_struct(const String fname, */ TarStream::TarStream() {} -TarStream::TarStream(const String fileName) +TarStream::TarStream(const String& fileName) : _fileName(fileName) {} -TarStream::TarStream(const String fileName, FileDestination_e destination) +TarStream::TarStream(const String& fileName, FileDestination_e destination) : _fileName(fileName), _destination(destination) {} TarStream::~TarStream() { diff --git a/src/src/Helpers/TarStream.h b/src/src/Helpers/TarStream.h index abc0e5003..155c1225e 100644 --- a/src/src/Helpers/TarStream.h +++ b/src/src/Helpers/TarStream.h @@ -129,8 +129,8 @@ class TarStream : public Stream { public: TarStream(); - TarStream(const String fileName); - TarStream(const String fileName, + TarStream(const String& fileName); + TarStream(const String& fileName, FileDestination_e destination); virtual ~TarStream(); diff --git a/src/src/Static/WebStaticData.cpp b/src/src/Static/WebStaticData.cpp index 79307b2b1..12b0a93a9 100644 --- a/src/src/Static/WebStaticData.cpp +++ b/src/src/Static/WebStaticData.cpp @@ -13,17 +13,16 @@ String generate_external_URL(const String& fname, bool isEmbedded) { // Generate some URL indicating static files which will need to be served with some cache-control header return concat(F("static_"), Cache.fileCacheClearMoment) + '_' + fname; } + #if FEATURE_ALTERNATIVE_CDN_URL String cdn = get_CDN_url_custom(); if (!cdn.isEmpty()) { cdn = parseTemplate(cdn); // Replace system variables. return concat(cdn, fname); // cdn.endsWith('/') check done at save - } else { - #endif // if FEATURE_ALTERNATIVE_CDN_URL - return concat(get_CDN_url_prefix(), fname); - #if FEATURE_ALTERNATIVE_CDN_URL - } + } #endif // if FEATURE_ALTERNATIVE_CDN_URL + + return concat(get_CDN_url_prefix(), fname); } void serve_CDN_CSS(const __FlashStringHelper * fname, const __FlashStringHelper * fname_alt, bool isEmbedded) { @@ -126,12 +125,19 @@ void serve_CSS(CSSfiles_e cssfile) { void serve_favicon() { #ifdef WEBSERVER_FAVICON_CDN + addHtml(F("")); + + /* addHtml(F("'); - #else +*/ + #endif + #ifndef LIMIT_BUILD_SIZE addHtml(F("