{"version":3,"sources":["pics/patreon.png","ikons/facebook.png","ikons/vk.png","ikons/instagram.png","locales/en/messages.js","locales/ru/messages.js","fonts/InkFree.ttf","fonts/homoarak.ttf","fonts/Slimamif.ttf","fonts/Freestyle.ttf","grammers/chart.ts","model/shape.ts","model/board.ts","helpers/WChart.ts","logging/logger.ts","math/Rect.ts","store/undoredo.ts","model/WImage.ts","math/AffineTransform.ts","tools/TransformerTool.ts","layers/LayerBase.ts","store/UIState.ts","layers/DynLayer.ts","layers/TransformerLayer.ts","layers/SelectionLayer.ts","components/BoundKonvaBoard.ts","ikons/l3.svg","ikons/segment.svg","components/Tools.tsx","components/ToolbarConfig.tsx","store/store.ts","controller/layerController.ts","model/CodeSticker.ts","helpers/simplify.ts","proto/request.js","connection/socketConnection.ts","socket/message2model.ts","socket/socketCallbacks.ts","controller/socketController.ts","controller/controller.ts","drawing.svg","components/sticker/stickerMarkdown.tsx","components/sticker/stickerVideo.tsx","components/sticker/stickerCode.tsx","components/sticker/stickerComponent.tsx","components/BoardComponent.tsx","components/LineEdit.tsx","components/TextAreaEdit.tsx","components/ColorPalette.tsx","components/Toolparam.tsx","components/ToolComponent.tsx","components/BoardApp.tsx","GreetApp.tsx","components/Login.tsx","App.tsx","serviceWorker.ts","index.tsx"],"names":["module","exports","languageData","n","ord","s","String","split","v0","t0","Number","n10","slice","n100","messages","a","i","i10","i100","id","d","ShapeType","FigureShapeType","StickerContentType","op","name","args","grammar","Lexer","undefined","ParserRules","join","parseInt","parseFloat","concat","ParserStart","AccessMode","Vars","Map","WChart","chart","ID","OwnerID","transform","Color","Type","Chart","Definition","Height","Width","LineWidth","Opacity","plotValue","plotArgs","this","calcDefinition","Error","definition","parser","nearley","Parser","Grammar","fromCompiled","grammer","feed","error","result","results","length","console","log","vars","set","Math","PI","E","expr","varName","varValue","calc","value","val","sin","cos","tan","number","res","push","pow","Array","isArray","map","get","NaN","range","b","add","subtract","multiply","divide","isInteger","winston","format","combine","timestamp","label","myFormat","printf","level","message","data","JSON","stringify","logger","createLogger","transports","Console","Rect","rect","x","y","width","height","p","l","t","r","ActionType","ObjectType","WImage","img","htmlImg","Loaded","Src","Image","Promise","resolve","reject","onload","info","src","copyShape","shape","newShape","image","copySticker","sticker","WAction","objectType","actionType","ShapeAction","before","after","Shape","StickerAction","Sticker","undoredo","_undo","_redo","action","addUndo","Create","Remove","Update","pop","undoShapeAction","undoStickerAction","redoShapeAction","redoStickerAction","store","board","stickers","controller","socketController","addSticker","removeSticker","Long","ZERO","removeShape","updateSticker","updateShape","shapes","addShape","layerController","updateRenderedFigures","applyTransform","ctx","m","applyMatrixTransform","AffineTransform","transform2Matrix","matrix2css","TransformerMode","w","h","translate","tx","ty","rotate","scale","sx","sy","matrix","m0","splice","m1","points","point","Tx","Ty","Sx","norm","Sy","Mr","v1","atan2","TransformerTool","mode","dragPosition","D","R","render","context","beginPath","fillStyle","strokeStyle","globalAlpha","lineWidth","lineJoin","rc","cp","getControlPoints","setLineDash","moveTo","lineTo","closePath","stroke","apply","save","restore","fm","pt","v2","pos","ppos","isDrag","P","isLeft","P0","P1","P2","b1","b2","b3","b4","isPointInside","delta","dragIdx","traslateHandle","idx","kx","ky","oidx","cp1","cx","cy","M","resTransform","matrix2Transform","v","center","alpha0","da","nt","Tool","DrawType","TextDisplayType","LayerBase","parent","canvas","curve","linear","hasGrid","d3","curveClosed","linearClosed","append","attr","style","node","getContext","x0","invertX","y0","invertY","x1","y1","k","addHLines","floor","ceil","addVLines","remove","clearRect","drawGrid","color","opacity","smooth","closed","line","ellipse","fill","lineStart","lineEnd","figure","col","Ellipse","StrokeWidth","abs","Rectangle","min","xdata","nelem","keys","margin","top","right","bottom","left","domain","row","transpose","ticks","tickFormat","forEach","textAlign","textBaseline","fillText","xAxis","yAxis","drawImage","text","font","Size","Family","measure","measureText","Content","actualBoundingBoxAscent","Text","mes","actualBoundingBoxDescent","TextArea","textarea","Figure","getRect","getRectTransformMatrix","p0","p1","ta","xs","ys","lines","xc","word","renderShape","Stroke","Highlight","renderStroke","PointArray","Smooth","Closed","renderImage","renderText","renderFigure","renderTextArea","renderChart","clear","DynLayer","transformerTool","transformedShape","dragHandleIdx","extend","includes","Transform","updateTransformerRect","getHandleIdx","beginUpdateShape","setDragHandlePosition","updateInputPosition","setDragPosition","endUpdateShape","SelectionLayer","nextCol","col2id","rects","alpha","classed","editedShape","boardUI","position","m2","g","getColorKey","getNextColor","posTransform","rect2shape","inv","inside","getImageData","key","fonts","Layer","uiStore","boards","boardUsers","ui","videoCallId","newStickerType","showChat","lineActiveButtons","tool","Pen","openToolLineIdx","showClearDialog","showShareDlg","makeObservable","observable","BoundKonvaBoard","ref","layers","currentTool","baseLayer","dynLayer","selLayer","zoom","onBoardResize","onToolChange","onInputChanged","evt","elem","editedText","redraw","onRemoveShape","onClear","getViewBox","getBoundingClientRect","p2","getBoundingRect","getClientTextPoints","transformer","setCanvasBoard","windowInnerHeight","window","innerHeight","windowInnerWidth","innerWidth","onorientationchange","createLayers","onresize","setLayers","Translate","filter","type","which","touches","on","setTransform","drag","clickDistance","invert","dragStart","dragRender","dragEnd","call","editedSticker","clearEditedShape","hideTransformer","click","layerTransform","removeLayers","layer","Dynamic","Staic","_extends","Object","assign","target","arguments","source","prototype","hasOwnProperty","_objectWithoutProperties","excluded","sourceKeys","indexOf","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","_ref","svgRef","title","props","createElement","viewBox","strokeWidth","imageRendering","strokeLinecap","strokeLinejoin","strokeOpacity","ForwardRef","forwardRef","ButtonId","_ref4","_ref5","_ref6","_ref7","tools","createToolLine","selectable","buttonIds","currentButtonId","getFullToolbarConfig","isOwner","toolLines","SelectTool","HighlightTool","TranslateTool","PenTool","MarkerTool","MultilineTool","SegmentTool","EllipseTool","RectagleTool","EraseTool","ImageTool","TextTool","TextAreaTool","UndoTool","RedoTool","ClearTool","ShareTool","TextStickerTool","VideoStickerTool","OptsTool","iconElement","icon","faMousePointer","size","onClick","textElement","Select","faArrowsAlt","faPen","faHighlighter","faPencilAlt","Marker","MultiLine","Segment","faEraser","Erase","faImage","faAlignLeft","faFont","faStickyNote","faVideo","StickerVideo","CodeStickerTool","faLaptopCode","StickerCode","faCog","faUndo","undo","faRedo","redo","faTrash","PlayTool","faPlayCircle","Play","faShareSquare","faCircle","faSquare","GraphTool","faChartArea","LayerType","accessMode","Collaboration","ownerId","fromInt","dynamicStrokes","highlighStrokes","defaultStrokeParam","smoothFactor","closedShape","snap","page","components","route","user","group","toolbarConfig","highlightFocusOthers","disposer","connectionState","BoardName","ConnectionID","autorun","uiShape","updateLayer","updateText","updateTextArea","when","excludeEdited","findIndex","equals","stickerId","setEditedShape","showTransformer","userId","shapeID","CodeSticker","FontSize","Code","content","path","substr","pathDefinitions","pathDefinition","simplifyCurve","tolerance","highQuality","simplify","LayerController","newStorke","newFigure","isDraggingTransformer","intervalHandler","dragStartTransformer","dragStartStroke","dragStartFigure","dragErase","dragTransformer","dragStroke","dragFigure","renderDynamicShapes","dragEndTransformer","dragEndStroke","dragEndFigure","dragEndTextArea","clickTransformer","clickText","clickTextArea","clickChart","clickSticker","setSelection","getShape","contentType","ReactGA","event","category","NEG_ONE","Markdown","callbacks","find","addText","textArea","Style","addTextArea","wchart","addWChart","shapeType","Fill","round","deleteShape","addFigure","addStroke","addHighlight","renderHighlight","clearInterval","setInterval","dynamicShapes","Selection","Static","C","allShapes","shapeLength","updateTransformerShape","$Reader","$protobuf","$Writer","$util","$root","wjite","properties","create","encode","writer","uint32","float","encodeDelimited","ldelim","decode","reader","end","len","tag","skipType","decodeDelimited","verify","fromObject","object","toObject","options","defaults","json","isFinite","toJSON","constructor","toJSONOptions","emptyArray","Point","fork","string","bool","isString","TypeError","Boolean","arrays","j","figureType","int32","enums","valuesById","values","family","fontSize","blob","newBuffer","bytes","base64","$oneOfFields","fromBits","ownerID","defineProperty","oneOfGetter","oneOfSetter","uint64","low","high","fromValue","unsigned","LongBits","toNumber","long","longs","toString","oneofs","AddShape","tempId","AddHighlight","focus","Notify","UpdateShape","RemoveShape","Clear","ShapeID","ShapeUpdated","ShapeRemoved","BoardCleared","RequestBoard","boardName","sessionID","Ping","Pong","UpdateShapeID","newId","Event","componentId","elementId","eventName","eventData","google","protobuf","Struct","User","role","ServerGet","ServerPut","sessionId","ClientPut","ToServer","requestBoard","requestRoute","ping","pong","boardContent","updateShapeId","ToClient","connectionId","socketConnection","fields","emptyObject","Value","end2","tag2","isObject","keys2","objects","nullValue","numberValue","stringValue","boolValue","structValue","listValue","double","ListValue","kind","NullValue","connectListeners","disconnectListeners","messageListeners","websocket","connected","connectInterval","requestConnection","WebSocket","binaryType","addEventListener","setConnected","callback","setTimeout","reconnect","err","clientMessage","Uint8Array","close","msg","send","finish","listener","message2modelTransform","message2modelShape","pnt","SocketCallbacks","setBoardList","boardList","debug","session","connectionStateID","SessionID","userID","localStorage","setItem","users","load","then","wshape","textShape","textAreaShape","stickerShape","strokeNotify","textNotify","setAccessMode","util","configure","SocketController","tempShapes","updateIdCallbacks","nextTempShapeID","ONE","reconnectTimeout","replyTimeout","pingTimeout","REPLY_TIMEOUT","PING_TIMEOUT","onConnect","requestBoardContent","onMessage","modelShape","setBoard","addMessageListener","arg1","arg0","imageFile","fn","arrayBuffer","array","getTempShapeID","shapeId","updateId","serverMessage","delete","login","stickerTransofrm","Nshapes","wimage","updateToolbarConfig","connect","bb","getBoundingBox","max","file","newImage","addImage","imageShape","fontFamily","letterSpacing","lineHeight","wordSpacing","xmlSpace","className","clipPath","Editor","useState","setDefinition","useEffect","flexGrow","onChange","ev","language","LoadableMarkdownRenderer","Loadable","loader","loading","isLoading","timedOut","pastDelay","styled","div","StickerMarkdown","observer","userCanErase","escapeHtml","VideoStickerEditor","changeValue","display","flexDirection","alignItems","VideoSticker","videoId","url","match","getId","opts","Container","Row","Button","PathDefinitions","code","setCode","pathIdx","setPathIdx","setPath","show","setShow","handleClose","Col","Dropdown","Toggle","Menu","item","Item","Modal","onHide","Header","closeButton","Title","Body","InputGroup","Prepend","FormControl","placeholder","aria-label","aria-describedby","Footer","variant","ButtonControl","button","InputControl","input","setValue","useRef","focused","current","Form","Control","onKeyPress","backgroundColor","Renderer","component","ctype","children","comp","inputComponent","uid","btn","Viewer","Alert","Heading","callSticker","SelectType","Video","ToolbarDiv","StickerPositionDiv","StickerComponent","onTouchEnd","pointerEvents","background","transformOrigin","faEdit","stopPropagation","customStyles","marginRight","AbsolutePositionedDiv","visible","AutoSelect","select","VCenterDiv","CopyButton","BoardComponent","canvasRef","createRef","outerRef","linkRef","konvaBoard","linkVisible","socialTop","socialLeft","inIframe","onResize","canvasRect","location","linkRect","overflow","contentLabel","document","execCommand","onContextMenu","href","data-services","React","Component","InputDiv","LineEdit","autoCapitalize","spellCheck","TextAreaDiv","attrs","TextAreaEdit","colors","ColorItem","ColorRow","VCenter","ColorPalette","isOpen","setIsOpen","colorgroup","onColorChange","checked","FontSelect","ColorSelector","TCloseBox","i18n","Check","_","TFocusBox","highlight","TSnapBox","PenToolParam","Navbar","bg","expand","Nav","inline","Label","HighlightToolParam","FigureToolParam","SegmentParam","MultilineParam","TextParam","EditTextParam","Toolparam","ToolComponent","setCurrentTool","buttonID","setTool","items","toolLine","drop","maxWidth","minWidth","toolID","ButtonGroup","vertical","_BoardApp","e","files","errs","every","addNewImage","URL","createObjectURL","inputRef","params","pageview","ts","BoardApp","withRouter","LineStart","LineCenter","Line","Line80","GreenGreetText","GreetText","CreateBoard","Email","Style3","InfoText","GreetApp","setBoardName","overflowY","data-patreon-widget-type","patreon","alt","async","faArrowCircleRight","replace","c","random","alignSelf","vk","instagram","facebook","marginLeft","FormRow","Login","useForm","register","handleSubmit","errors","redirect","setRedirect","to","from","onSubmit","App","initialize","init","exact","hostname","LocaleResolver","DETECTORS","NavigatorDetector","TRANSFORMERS","LanguageOnlyTransformer","getLocales","catalogs","en","catalogEn","ru","catalogRu","enableAll","ReactDOM","getElementById","navigator","serviceWorker","ready","registration","unregister","catch"],"mappings":"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","file":"static/js/main.95b74dea.chunk.js","sourcesContent":["module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbIAAABmCAYAAACuqxSRAAAABGdBTUEAALGPC/xhBQAAGWpJREFUeAHtnQfU3cSVx+9I76PYYEwxJfSOAZveew9JqCEksCEhwCEEFjZnAxsIYbMJe9iFkJyzJJvGLgTYhIADhE4ophlM6N1gQjfFVIOxKd+TZu+d79N7o5H02veK9N5/zrGfNDMazfxGn67mzp076tPjDtGEAAIgAAIgAAIFJeAVtN6oNgiAAAiAAAgYAhBkeBBAAARAAAQKTQCCrNDdh8qDAAiAAAhAkOEZAAEQAAEQKDQBCLJCdx8qDwIgAAIgAEGGZwAEQAAEQKDQBCDICt19qDwIgAAIgAAEGZ4BEAABEACBQhOAICt096HyIAACIAACEGR4BkAABEAABApNAIKs0N2HyoMACIAACECQ4RkAARAAARAoNAEIskJ3HyoPAiAAAiAAQYZnAARAAARAoNAEIMgK3X2oPAiAAAiAAAQZngEQAAEQAIFCE4AgK3T3ofIgAAIgAAIQZHgGQAAEQAAECk0AgqzQ3YfKgwAIgAAIQJDhGQABEAABECg0AQiyQncfKg8CIAACIABBhmcABEAABECg0AQgyArdfag8CIAACIAABBmeARAAARAAgUITgCArdPeh8iAAAiAAAhBkeAZAAARAAAQKTQCCrNDdh8qDAAiAAAhAkOEZAAEQAAEQKDQBCLJCdx8qDwIgAAIgAEGGZwAEQAAEQKDQBCDICt19qDwIgAAIgECp1wiWv28BaVKp1Ziz9ThatFlRWyqRWn9j8qZsSWrFlUkttTTRkksRfbKQ9Afvk373bdJPP0rhEw8RLfgo9b6IBAEQAAEQKA6BnguyhYHA0qnE0mNTsxKNW4L8zx9E3k57kVps8WSm8UuQWnZ5orXWJ9pqR9JhQPrxh6h89aVEb85J5kcMCIAACIBAIQj0XJC1g5K3yz7k738YqXHjGy5OeT6pTbemoalbUHjPbRRMu4ho+LOGr0dGEAABEACBfBAotiBjNaJ/+LfJ327XlmmKQPN32pvU6utQ+ddnE817r+WycCEIgAAIgED3CTQ7A9X9GmbdkQVQ6YQfjEmI2UV7q61FQ6f+J9HSy9rROAYBEAABEMg5gcIKMv+wY8jbYEpb8YphSOk73ydaZNG2lovCQAAEQAAEOkegkKpFb9tdyN9xz45Q8VZdk/yvHU3Bxb/qSPl9WyireWnC0qTEQlQMad56g+jTT9rTXJ/LXmriSNm+T3r+h0Qfzmtf+e2pJUoBgc4QwPNfl2vxBNnQIuQfcHjdho0lg7ftrhTefgPpV18aSzFNXevtuR+PMKfWv0aHpHkeT78zl+jtuRTOeozo44Xp102YSKVvnJCe1kBscOdNpGWZQlZQirwd9iBvs21JrbshqaGhWE6z3OGtNyl8cAaFM25lARfG0uudeNvvRt7m242U7YySNZelX3nBLKMIb7uuvlCrwyK4/XrSTz1as0pqk63MfGpWpvKfzid6561qcp17VjOmH9Xln35ZIlZN3ZL8nfdJxFMQUPn8c4nK5WRaszFNtFV/9CHpua8T8b/whWcbnpduth1KPkrb9K4IbphG+oXZ/LHW+N+Unj+P/075eXj7TdKvv0p6zktNUe3K8y/PwIXnmeVJWZVTm2zNz/1esWTzN33fnbG4Xp4UTpB5e3yR1MRlOspM8QvaP+jrVD7v3zt6H7twtfJq5G20qR3V0LHmtXDBLddQOP36pNUlC/1WyoxuHD7xYMbCCM6x3PJUOvJE8tbeIMqe+BVVrfzz1p1Meo8vUfkvfyT9yH2JfIkIKfuI48lbb6NEUhShPI/UGuuQx//0DrtTmUfQ+tkno+Tkbx0W+uMFFNQRZD5/4NTiqRYbF+dV557JSsZjavKPZ6155u/2hUw1vJqyBffJ32pe31Bii23Vw8PmozG48cqaL1OpQ9PtWGLJmv3VULtGMwV33zxy1GI75eLwyYcpuOr/jFAbLTb9p8vPv7/vwaZe6ZUhXrY0KcFRv/J8VvaexBdujszfbreugFIyOuqwwGxHQxSvjysdeDiVvn1KO4prqAwZhQ2dfm5NIeYWpJZfiYaO/R55+xzoJsXOPR45DP3wZzWFWOwCPlHLTKLSP/0rq4SPaXl+0wgoNiDKDKzeUW2ek828VzsT+BlWNT4I/G12aefdmi5LRvH+3gfQ0E94VMAv8MyQ83Zk1ttK8DbenEqn/5S8rXayYuOHvXj+Pf7QIVljW+BQKEGmPrcqyQuxG0FGZR6rkooS5EXs7XVAx6vr8YdE6evHpS86b+DuZr3fhukjT2+bnanERjxq0cUyS9I6fZm8GUXLesKvHpV5ba0Etfh4VmFOzsyi1tmg5TZnFtqFBG/rnUhGr1lBiRaAP4Z6HWRutXT0d4kyPiaK0o56HM1yn8OOTrWO7tXzLx8TJdZAFTkUSrWoMl6AneoAj+8X3vnXThVft9zw5eep/N9nVfPxC16tsLL5gk1Tu/k8pxTecnU1f8ZR+WpW8fH8Ur2g33gtnoU9pvg8+ksL4XNP81zYvTyPwHMeLGzUqmuQv++XEx8e8lKVF9bwv51EJEYbUWC1nH/wEdFZ7FfciQX3TCf9Is9RsAGJUSmySszbndXM/MFhBxG0ssDdzGfYCQ0cezyXFGSoJ72NNouVIALVvXcsQ42TlvnXKDMryXNGXJrnVdWkFSrZVWmIvC12oPCuzjzn5T/+rtoXHvfV0suZ0baMPNw5VW+NdfljbD8K//qXSv2ig1baod97h4LpN0RFxH49fn5sDpIobIzruljO0RNOqxXK5/+cwueeGs2iSE1YitTKq7O3oYNJrbRK7FL5aJKpi+CC/6rG9/j597bguejp61X7qlqzQhwVS5CxrrargVVWPQ0BT8LbL3s+lsnj8jNPUOm0s8njebVYkNGqGEV89mks2j3RLCD1rMfd6Lrn/he/wn+gExP5grtvoeDS/+E3QdWYQ7/2MoUPzeTlDP9C3uRNYteIBxZv6lZG4EQJ/n5fTS+b5/9kXkGEYxRkLkwEjn7xOfK/eQK/EBeJkoxwERVj+T9OjdWnksE60G++ZvxxRlHycgum/T46jf2KWigW+FpyXlCx9BonrfKvUWRqknxMeKzFsENw3x3kyweANQqTkUCnBJkYJcmzUAmvvkTB4w8agSHqYPdjwGM/qa4ga7kdbEwSTLuwcmv7QC2zXFKQvf5KZn772rRjmWO1/1b1/A+43a+YebGhM36emNf31lyXAqugXjz/1u3NoX/IkVQ+5wdudCHOs3UOOay+WmqZrtZKTVy6q/dr+GYs4PRTDyeyGxVSmp/JRM4WIlhIervtm7gwZKEa8Fe3LcQqmdjlV/mS35BOMcMXoVEJK65C3q5Jq7qQhW1w5SUxIVa5hg/Ch+6l4Kar7ChzLEsovB33SMS7EdrxsakmrUjEdUkEnj+wv6o1fyjo995OZMtbhDuKkfpp7i9dGTmM1Nhbaz0iaXsXg3yMaB7Fu0GtupYbRXluR6KybsTCBRQ+dr8bOzInFanQe/T8u5US4eqxH9oihkIJMlose+6kI/AXXbwjxbal0OiPwCpM8x+NWV9lxbXrUJYGKFnP4gSxmKwZ3n/HvDzdPGq9DSvzId5m2/A8TtLQIri5vppUVL8iWNwgZvv1QsijA/3Jx7FsHvvedENCrTibX8Ap9XWv6+m58sjbcodYFfSHPEpg9Wz42AOxeDnxeVTW7WDWGjo3VWxpSPbHWAHa4TQhefpRcpcNMxIdz23l0KvnXzQSMnK0g5k6YHVz0UKhBJmsS+pqkEW3eQysFkmzfOqUekgQqBU/lyCh333LbImTSHAiwscfMKokGT2VeV5g+Mzv0fApx/CQakS5kjbfZ1RSzzSg/lwwn8IU83G19vpEski7VuA1NLKljx1knswN3sabxaLEjJp1YrG4vJ2oyfzhIVsYWcGMDFhFG7JqT4va2gpiTNHtoHi+zA3mb9z6uChCO9w2uOdqldXdKObPz/68d018r55/zRqTQJbtWEEsgL09v2TFFOOwzl96zhoxr7uCTH/wXk8BiCWXLM6uBDH24D3WxLOJu1WNLCwNUibJK9daBzJHonkRc83AAiKQLW5Gg0pRuckXXSMhvPd2kn9ZQaxR3aDnvuFGZZ6nftnLvNlybNRQp44hb+Vjj97Umqxmky9lbr8J/HUq+9vZIWS1rsc7J7QaWuHf7L1k3ssN4cOja/h45C4qRmUZsIhaVfEWR8ZYx72wA+diCKHWT64TdBcN570d9dDIOj1ZyO0GmSelUQcBPXv+2fAqvIOdHrC1s71ziL/PQTx/PZ3n/OKjNbcNeTovlCCLTRp3gWK37+c2SV4uJTZmqBVkQbTZhua6y5MLojMuTBgupOSTDUjjgmzlRC6xCmtLGFWx2GU1NQeVMV8laqqqiYhdevU4fOoRnt4LKybqMs8ofMK/3WkyyRosZXkVMcLb9t5RLarho1b4N1y4ZOQPHlfQ6o/mk579ZKUYEWquytTbdmcKxOq0nUFGxZGqSkaxok1YfwoZw6Eo3rqfzLlWQp7aUalU+oGM5PWklUYSuZnGGQA7IncZR1cHtnVxz55/riiPfoMbr6DSl78RVc18JPv7f42CP/y2Epf3g0IJsvBJfumwSiRtrqYToMNHk3MJnbjPWMqUL9i0EclYykxcK6OSlF0B2qLqlVEm+090QzNl66yROm+2WjeIuySeN1KWhxKZJ4sEWUKtyIIv78HMuVjCV+pr5sVGRwDRuT782Bh7b/PtKbiMrfwcteNY2jt0/GkNXy5ahfC2qqorT+2o1wh/16QhVNY1wcw7SD86agDS6+efKxnefiNp2ZDYWqPrbb/7SDxbchYhFGqOjD5ZmGo40AnQYk5b0+VRJ27aQpliriwLlEvfP6tzlmfl4YRRhFRVNSIo6rXps8/Ysj45bmqmbNuUPHa7FGvJWProicwZ2cGsVxw1bHG/qM38mJ05h8dpVn7hIzPjNWXVqZ79VCxOOKopzjKDWI7OnYjRQfmC89isMqzcpIjtqFQ+5UDz31HAfkGDS35VTc3B8y8fLuU/X1StEx+JZsI/pDpKiyXm8KRQIzLhJwYD7sulE1yDW69r65dpK3UMef1NcMmvq5eKakYWlLLxgcydGXP70VSP5xxKx55M5bNO4ZdBUjBUC+FmsTWgODGtFfSncWs+GfUpVpXYQXywjTnIi2vhRyPzUlZhss6n4ZCVl9VpjQSZJyPLs4HMP4oTZDFmsb9SZRmBfm5WI0XWzNMK/5oF2okprpzMcgF23izPjh3Cv8/iNX5T7Si2XtyFytFoIZbSmRN5ucuIQNRbMefXBWtHPTqaDceGz+bRqauOz8HzL3UX5+Dh04+Rt+EmlabI+k9lnVcScnhQOEGm+Y9P1CSddB8laq3w1mt7313y4pRJYTu89HcK2PGunvMylQ79lp1CHltHicl1+MCMWLx7ErI1YLMLoo360hFkxpjCLTztXNagrb42hbyAmcRrvxNkPk658wRNCEmxtHKDjPIanmfj9WSuxwt5wUucHcRAoh1qt1b42/WodSzWrPYHjuSVOb5FfvKLWpdV0pRYaMpIWz4u2hBCVn0Tz+NWgvTLh++z93s25uGPo/D5Z4l4iYYb8tYOt37uefnaP7G3nBdNtHzwlXiBvx3EkYBi46O0eeWeP/+jFS1P+z37OT03pm6Whdrh/XfbTcnlceEEmVA0wHlOw6w5aTNWeQGWL+XtOFLWJrX5VmMqLmRvGponaN35JcVufqiOIGvpxilWhOJZRP5o67m7Eq/x4mFbgtnCgwVa+BL/4y9x+Qo3Ki5HSKpV1iBagU3+ZbuPWoHXc6V91Bjrt6ztbVLKE0/zYk0YBTP6tLxfSLzM0eY9pFn5NVNn47Jqy+3Z08fNzVyWmVcWtDf70SSF5a0dmQ0cTRAvM1E7ZTsgzQuLxcLYDv6B/5DqOSMPz7+pJ3/QyRIe2WUgCuI2zP2gi9Ly9FusObKIHKt8yr871xh+RFHt+g2u4S+rlAWj7Sq/beWwSobknxPaou5zypTTcM7I16ab5LHn8ppBrAB5wXMU1BITSLx6mP2xRuewwpTtU2TBqL/X/tFlmb/iiSDVECWlzMxCOCExT8aCVXw62kHM7vMcRPgn3Ja1UOGxCpEWbhm7pPDtYHVhcAOrSp0gnjPSTPHz8PxHVQ3Y+lksXO1gL0+x4/N0XMgRmQAU9zYBTw77R/5jzNfeWODKRGx405VjKaJr1xpv7Gzx5AaZ1+lEEOEevvoiifsnO8immpq9zmc5VzaOg50vU7k+nHkH/zcysa9Z1enq5yWPvFBDUaNmCSVW1fj7HSpZY0FGfXU9jsSukOdpFmkewanFx5kUWVdjr60JX2Prrfffda7K12maABKVsH5jTs2KysvV9nno8XoyozZOUQPXLKhNif3QjvDBe0h/gZ1mO8++bPRZls1qrXnsPDz/la7jNYbBtZeZXSiiOFfrE8Xn6bewgkwghg/PZCe6c41jWjVx2Za5GmsiVifWWrTbcuEduFAW6JaO+E5qyR3b1Zr/8MShrvfPP47dV+ZjSuykN2AHusLPqPREQLFXCVkr5O4sKxeL+ja4d3qsnPJl/0tDZ/yMRLUVBTkuHX8qBVdcYtbKied7E1idKHuDlb51IquXJ0TZK7/BVX9ofo6HvYyE7OXD32L7Sjn2QZpvSzu958fiyinFT175St7IMc3Xn1Xh0slnxpYfSJK4rAqun2bl6tJhv7RjdFRWOuqkGDhx4uxtzR9oo+sUo8SeP/9RRfhXpi3Cnfduy+jeKrajh4UWZEJG5meGzzyZt0s4iDxey+FuDVGPnhiOyM7F5DiQrXddN9JFxVI67ZzqrXi9lagOXa8eUQZjpCJfe3XC0Eln1MkxkhzcfxcFF1aNBGQUHLJFm7vYVnL7u3ze/DN+D1ngiFeSrBBcc6nZ/j2WLhP/bGAj217YQXwwlr5ypJkPNJaWbE0pW9jbi5Tt/GJQEjpC0k6vdazFDD9DkLVzfqxV/rXqriZPSbikMlaWjguutDLM4mhrHZ3kkVFRLwRZv7RDGGaOyliLIGkxw6EcPP9SZxNECPOuAd53fxTF5P63mHNkLla2sJJJ5eEfnWjMeI0ayM1jncsLP5hxKw2fczqVf8OCIodCTKorL2tvNfbkHv0T4wrboardJjFSuZjXp0Sulay0dh6WL7/AGGpklSl1rinEeK+wMMVjvZQn8woiKNOCjPyMVaYY+TiLfaP8okIrX/TL6LTp3xEvH0HiOrOm8PlnEvF5ikhVx8nibfanVy+k+qo0LqvYXVeXQ7+0w2DLmCtTvJuCxwuQ3dDr59+uj6yhzfpbtPPl5bjwI7IYSJ7DEGMNkn9ski36aeM4dUlWP7ErFj3vPbOOw/XnFiujgCdiVVS+4uKEA9yONIUZl3/6Q/J400wz/5XilSPtvma90F28b9kVF6Ulj8TJti+/5a3g2YGtf+hRsT2zsi/iUTmrMmU0F7AJNJXjznBrXZdIYzNx/Tx7+XB2ijbWaJZXjMR1vY4wrpyqBjVRddIEVJQW+2Xz95CXdXiOcYssSA5emB3L2tGTfmmHBSlzVMZWvEZzYFtH9/r5t+oth/JOGWJ/nM1quZxiunLaX4LMRsb+92QdUe2lwfYFxTkW/4pmEl8m8mVbjhm3xdUUnW6KCA6eP9HsBd4/5JukeD+rtG1YpBpGyPA6FLGGogYNUWTdSshfhD6rFM1OvlkjMK6HZjP+4M8sxGX36DYEMcP3HEHWTrViG6qYKMLblLfBcRiJZ/PM3Y4TJbAajI1qEoKMdw0OLr+wa89Wv7QjhjdjrkzWlckO52nGZb18/mN1Z/uDkL3j+/scGIvO44n69LhDevquX+KeBZlc3tluPC3WH8rPzDb2RYJY+K0zmXfBXZbVihNIRl9mAbUIWvEo0YB6K5OD+Hlch9WJ4sleto/3SmR23+WdCYyXjQ6rUjPrhQQQ6AYBPP8NUYYgawgTMoEACIAACOSVAMY7ee0Z1AsEQAAEQKAhAhBkDWFCJhAAARAAgbwSgCDLa8+gXiAAAiAAAg0RgCBrCBMygQAIgAAI5JUABFleewb1AgEQAAEQaIhAzwWZqlHNWmk1LkMSCIAACIDAABHo+YLo+TuMHyDcaCoIgAAIgEC7CfR8RNbuBqE8EAABEACBwSIAQTZY/Y3WggAIgEDfEYAg67suRYNAAARAYLAIQJANVn+jtSAAAiDQdwQgyPquS9EgEAABEBgsAhBkg9XfaC0IgAAI9B0BCLK+61I0CARAAAQGiwAE2WD1N1oLAiAAAn1HAIKs77oUDQIBEACBwSIAQTZY/Y3WggAIgEDfEYAg67suRYNAAARAYLAIQJANVn+jtSAAAiDQdwQgyPquS9EgEAABEBgsAhBkg9XfaC0IgAAI9B0BCLK+61I0CARAAAQGiwAE2WD1N1oLAiAAAn1HAIKs77oUDQIBEACBwSIAQTZY/Y3WggAIgEDfEYAg67suRYNAAARAYLAIQJANVn+jtSAAAiDQdwQgyPquS9EgEAABEBgsAhBkg9XfaC0IgAAI9B0BCLK+61I0CARAAAQGiwAE2WD1N1oLAiAAAn1HAIKs77oUDQIBEACBwSIAQTZY/Y3WggAIgEDfEYAg67suRYNAAARAYLAIQJANVn+jtSAAAiDQdwQgyPquS9EgEAABEBgsAhBkg9XfaC0IgAAI9B0BCLK+61I0CARAAAQGi8D/AwF5KQdADEupAAAAAElFTkSuQmCC\"","module.exports = __webpack_public_path__ + \"static/media/facebook.7cb72e0b.png\";","module.exports = __webpack_public_path__ + \"static/media/vk.c533ae10.png\";","module.exports = __webpack_public_path__ + \"static/media/instagram.762bb409.png\";","/* eslint-disable */module.exports={languageData:{\"plurals\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1),n100=t0&&s[0].slice(-2);if(ord)return n10==1&&n100!=11?\"one\":n10==2&&n100!=12?\"two\":n10==3&&n100!=13?\"few\":\"other\";return n==1&&v0?\"one\":\"other\"}},messages:{\"Board\":\"Board\",\"Board mode\":\"Board mode\",\"Chart\":\"Chart\",\"Chat\":\"Chat\",\"Circle\":\"Circle\",\"Clear\":\"Clear\",\"Co-working\":\"Co-working\",\"Collaboration\":\"Collaboration\",\"Copy\":\"Copy\",\"Create your board\":\"Create your board\",\"Education\":\"Education\",\"Enter your nickname\":\"Enter your nickname\",\"Erase\":\"Erase\",\"Fill\":\"Fill\",\"Focus others\":\"Focus others\",\"From\":\"From\",\"Function\":\"Function\",\"Generate chart\":\"Generate chart\",\"Highlight\":\"Highlight\",\"Image\":\"Image\",\"Invite\":\"Invite\",\"Line\":\"Line\",\"Link to this whiteboard\":\"Link to this whiteboard\",\"Marker\":\"Marker\",\"Move\":\"Move\",\"No\":\"No\",\"Opacity\":\"Opacity\",\"Opts\":\"Opts\",\"Parametric circle\":\"Parametric circle\",\"Pen\":\"Pen\",\"Play\":\"Play\",\"Power\":\"Power\",\"Presentation\":\"Presentation\",\"Quick & Easy\":\"Quick & Easy\",\"Rectangle\":\"Rectangle\",\"Redo\":\"Redo\",\"Remove all?\":\"Remove all?\",\"Save\":\"Save\",\"Segment\":\"Segment\",\"Select\":\"Select\",\"Share\":\"Share\",\"Smooth\":\"Smooth\",\"Snap\":\"Snap\",\"Sticker\":\"Sticker\",\"Text\":\"Text\",\"Textarea\":\"Textarea\",\"To\":\"To\",\"Trigonometric\":\"Trigonometric\",\"Tutor\":\"Tutor\",\"Undo\":\"Undo\",\"User\":\"User\",\"User is admin\":\"User is admin\",\"Users\":\"Users\",\"Video\":\"Video\",\"Width\":\"Width\",\"Yes\":\"Yes\",\"Youtube page url\":\"Youtube page url\",\"draw\":\"draw\",\"info1\":\"O-whiteboard - free online whiteboard for education, co-working, webinars all over the world. Here you can write and draw with different tools on an infinite whiteboard.\",\"info2\":\"O-whiteboard is quick and easy. All you need for working is an access to web browsers on any supported devices, including PCs, tablets, smartphones. It's speed allows comfortable stylus use in many applications.\",\"online whiteboard\":\"Online whiteboard\",\"share\":\"share\",\"unique_link\":\"A unique link to the personal whiteboard will be generated for you.\",\"uriNotValie\":\"Not valid YouTube url\",\"work_learn\":\"Work and learn together from any point of the world\",\"write\":\"write\",\"{0}\":function(a){return[a(\"0\")]}}};","/* eslint-disable */module.exports={languageData:{\"plurals\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1],i10=i.slice(-1),i100=i.slice(-2);if(ord)return\"other\";return v0&&i10==1&&i100!=11?\"one\":v0&&i10>=2&&i10<=4&&(i100<12||i100>14)?\"few\":v0&&i10==0||v0&&i10>=5&&i10<=9||v0&&i100>=11&&i100<=14?\"many\":\"other\"}},messages:{\"Board\":\"\\u0414\\u043E\\u0441\\u043A\\u0430\",\"Board mode\":\"\\u0420\\u0435\\u0436\\u0438\\u043C \\u0434\\u043E\\u0441\\u043A\\u0438\",\"Chart\":\"\\u0413\\u0440\\u0430\\u0444\\u0438\\u043A\",\"Chat\":\"\\u0427\\u0430\\u0442\",\"Circle\":\"\\u041A\\u0440\\u0443\\u0433\",\"Clear\":\"\\u041E\\u0447\\u0438\\u0441\\u0442\\u0438\\u0442\\u044C\",\"Co-working\":\"\\u0421\\u043E\\u0442\\u0440\\u0443\\u0434\\u043D\\u0438\\u0447\\u0435\\u0441\\u0442\\u0432\\u043E\",\"Collaboration\":\"\\u0412\\u0437\\u0430\\u0438\\u043C\\u043E\\u0434\\u0435\\u0439\\u0441\\u0442\\u0432\\u0438\\u0435\",\"Copy\":\"\\u041A\\u043E\\u043F\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C\",\"Create your board\":\"\\u0421\\u043E\\u0437\\u0434\\u0430\\u0439 \\u0441\\u0432\\u043E\\u044E \\u0434\\u043E\\u0441\\u043A\\u0443\",\"Education\":\"\\u041E\\u0431\\u0440\\u0430\\u0437\\u043E\\u0432\\u0430\\u043D\\u0438\\u0435\",\"Enter your nickname\":\"\\u0412\\u0432\\u0435\\u0434\\u0438\\u0442\\u0435 \\u0432\\u0430\\u0448\\u0435 \\u0438\\u043C\\u044F\",\"Erase\":\"\\u0421\\u0442\\u0435\\u0440\\u0435\\u0442\\u044C\",\"Fill\":\"\\u0417\\u0430\\u043F\\u043E\\u043B\\u043D\\u0438\\u0442\\u044C\",\"Focus others\":\"\\u0421\\u0444\\u043E\\u043A\\u0443\\u0441\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C \\u0434\\u0440\\u0443\\u0433\\u0438\\u0445\",\"From\":\"\\u0421\",\"Function\":\"\\u0424\\u0443\\u043D\\u043A\\u0446\\u0438\\u044F\",\"Generate chart\":\"\\u041F\\u043E\\u0441\\u0442\\u0440\\u043E\\u0438\\u0442\\u044C \\u0433\\u0440\\u0430\\u0444\\u0438\\u043A\",\"Highlight\":\"\\u0412\\u044B\\u0434\\u0435\\u043B\\u0438\\u0442\\u044C\",\"Image\":\"\\u0424\\u043E\\u0442\\u043E\",\"Invite\":\"\\u041F\\u0440\\u0438\\u0433\\u043B\\u0430\\u0441\\u0438\\u0442\\u044C\",\"Line\":\"\\u041B\\u0438\\u043D\\u0438\\u044F\",\"Link to this whiteboard\":\"\\u0421\\u043A\\u043E\\u043F\\u0438\\u0440\\u0443\\u0439\\u0442\\u0435 \\u044D\\u0442\\u0443 \\u0441\\u0441\\u044B\\u043B\\u043A\\u0443 \\u0438 \\u043F\\u0435\\u0440\\u0435\\u0448\\u043B\\u0438\\u0442\\u0435 \\u0434\\u0440\\u0443\\u0433\\u0438\\u043C \\u0443\\u0447\\u0430\\u0441\\u0442\\u043D\\u0438\\u043A\\u0430\\u043C\",\"Marker\":\"\\u041C\\u0430\\u0440\\u043A\\u0435\\u0440\",\"Move\":\"\\u0421\\u0434\\u0432\\u0438\\u0433\",\"No\":\"\\u041D\\u0435\\u0442\",\"Opacity\":\"\\u041D\\u0435\\u043F\\u0440\\u043E\\u0437\\u0440\\u0430\\u0447\\u043D\\u043E\\u0441\\u0442\\u044C\",\"Opts\":\"\\u041D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0438\",\"Parametric circle\":\"\\u041F\\u0430\\u0440\\u0430\\u043C\\u0435\\u0442\\u0440\\u0438\\u0437\\u043E\\u0432\\u0430\\u043D\\u043D\\u044B\\u0439 \\u043A\\u0440\\u0443\\u0433\",\"Pen\":\"\\u041F\\u0435\\u0440\\u043E\",\"Play\":\"\\u041F\\u0440\\u043E\\u0438\\u0433\\u0440\\u0430\\u0442\\u044C\",\"Power\":\"\\u0421\\u0442\\u0435\\u043F\\u0435\\u043D\\u044C\",\"Presentation\":\"\\u041F\\u0435\\u0440\\u0437\\u0435\\u043D\\u0442\\u0430\\u0446\\u0438\\u044F\",\"Quick & Easy\":\"Quick & Easy\",\"Rectangle\":\"\\u041A\\u0432\\u0430\\u0434\\u0440\\u0430\\u0442\",\"Redo\":\"\\u041F\\u043E\\u0432\\u0442\\u043E\\u0440\\u0438\\u0442\\u044C\",\"Remove all?\":\"\\u0423\\u0434\\u0430\\u043B\\u0438\\u0442\\u044C \\u0432\\u0441\\u0435?\",\"Save\":\"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C\",\"Segment\":\"\\u0421\\u0435\\u0433\\u043C\\u0435\\u043D\\u0442\",\"Select\":\"\\u0412\\u044B\\u0431\\u0440\\u0430\\u0442\\u044C\",\"Share\":\"\\u0421\\u0441\\u044B\\u043B\\u043A\\u0430\",\"Smooth\":\"\\u0421\\u0433\\u043B\\u0430\\u0434\\u0438\\u0442\\u044C\",\"Snap\":\"\\u041F\\u0440\\u0438\\u0432\\u044F\\u0437\\u0442\\u044C\",\"Sticker\":\"\\u0421\\u0442\\u0438\\u043A\\u0435\\u0440\",\"Text\":\"\\u0422\\u0435\\u043A\\u0441\\u0442\",\"Textarea\":\"\\u0422\\u0435\\u043A\\u0441\\u0442\",\"To\":\"\\u0414\\u043E\",\"Trigonometric\":\"\\u0422\\u0440\\u0438\\u0433\\u043E\\u043D\\u043E\\u043C\\u0435\\u0442\\u0440\\u0438\\u044F\",\"Tutor\":\"\\u041E\\u0431\\u0443\\u0447\\u0435\\u043D\\u0438\\u0435\",\"Undo\":\"\\u041E\\u0442\\u043C\\u0435\\u043D\\u0438\\u0442\\u044C\",\"User\":\"\\u041F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u0435\\u043B\\u044C\",\"User is admin\":\"\\u0410\\u0434\\u043C\\u0438\\u043D\",\"Users\":\"\\u041F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u0435\\u043B\\u0438\",\"Video\":\"\\u0412\\u0438\\u0434\\u0435\\u043E\",\"Width\":\"\\u0428\\u0438\\u0440\\u0438\\u043D\\u0430\",\"Yes\":\"\\u0414\\u0430\",\"Youtube page url\":\"\\u0421\\u0441\\u044B\\u043B\\u043A\\u0430 \\u043D\\u0430 \\u0440\\u043E\\u043B\\u0438\\u043A YouTube\",\"draw\":\"\\u0420\\u0438\\u0441\\u0443\\u0439\",\"info1\":\"O-whiteboard - \\u0431\\u0435\\u0441\\u043F\\u043B\\u0430\\u0442\\u043D\\u0430\\u044F \\u0438\\u043D\\u0442\\u0435\\u0440\\u0430\\u043A\\u0442\\u0438\\u0432\\u043D\\u0430\\u044F \\u0434\\u043E\\u0441\\u043A\\u0430 \\u0434\\u043B\\u044F \\u0441\\u043E\\u0432\\u043C\\u0435\\u0441\\u0442\\u043D\\u043E\\u0439 \\u0440\\u0430\\u0431\\u043E\\u0442\\u044B \\u0432 \\u0440\\u0435\\u0436\\u0438\\u043C\\u0435 \\u043E\\u043D\\u043B\\u0430\\u0439\\u043D. \",\"info2\":\"O-whiteboard \\u043F\\u0440\\u043E\\u0441\\u0442\\u0430 \\u0438 \\u0443\\u0434\\u043E\\u0431\\u043D\\u0430 \\u0432 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u043D\\u0438\\u0438 \\u0438 \\u043F\\u0440\\u0435\\u0434\\u043D\\u0430\\u0437\\u043D\\u0430\\u0447\\u0435\\u043D\\u0430 \\u0434\\u043B\\u044F \\u0441\\u043E\\u0432\\u043C\\u0435\\u0441\\u0442\\u043D\\u043E\\u0439 \\u0440\\u0430\\u0431\\u043E\\u0442\\u044B, \\u043F\\u0440\\u0435\\u043F\\u043E\\u0434\\u0430\\u0432\\u0430\\u043D\\u0438\\u044F, \\u043F\\u0440\\u043E\\u0432\\u0435\\u0434\\u0435\\u043D\\u0438\\u044F \\u0432\\u0435\\u0431\\u0438\\u043D\\u0430\\u0440\\u043E\\u0432 \\u0438 \\u0442\\u0434. \\u0412\\u0441\\u0435, \\u0447\\u0442\\u043E \\u043D\\u0443\\u0436\\u043D\\u043E \\u0434\\u043B\\u044F \\u043D\\u0430\\u0447\\u0430\\u043B\\u0430 \\u0440\\u0430\\u0431\\u043E\\u0442\\u044B - \\u044D\\u0442\\u043E \\u0432\\u044B\\u0445\\u043E\\u0434 \\u0432 \\u0418\\u043D\\u0442\\u0435\\u0440\\u043D\\u0435\\u0442, \\u0430 \\u0443\\u0447\\u0430\\u0441\\u0442\\u043D\\u0438\\u043A\\u0438 \\u043C\\u043E\\u0433\\u0443\\u0442 \\u043D\\u0430\\u0445\\u043E\\u0434\\u0438\\u0442\\u044C\\u0441\\u044F \\u0432 \\u043B\\u044E\\u0431\\u043E\\u0439 \\u0442\\u043E\\u0447\\u043A\\u0435 \\u043C\\u0438\\u0440\\u0430. \\u041F\\u043E\\u0437\\u0432\\u043E\\u043B\\u044F\\u0435\\u0442 \\u0440\\u0438\\u0441\\u043E\\u0432\\u0430\\u0442\\u044C \\u0438 \\u043F\\u0438\\u0441\\u0430\\u0442\\u044C \\u043C\\u0430\\u0440\\u043A\\u0435\\u0440\\u0430\\u043C\\u0438 \\u0440\\u0430\\u0437\\u043B\\u0438\\u0447\\u043D\\u044B\\u0445 \\u0446\\u0432\\u0435\\u0442\\u043E\\u0432, \\u0432\\u0441\\u0442\\u0430\\u0432\\u043B\\u044F\\u0442\\u044C \\u0442\\u0435\\u043A\\u0442\\u044B \\u0438 \\u0438\\u0437\\u043E\\u0431\\u0440\\u0430\\u0436\\u0435\\u043D\\u0438\\u044F. \",\"online whiteboard\":\"Online whiteboard\",\"share\":\"\\u0414\\u0435\\u043B\\u0438\\u0441\\u044C\",\"unique_link\":\"\\u0414\\u043B\\u044F \\u0412\\u0430\\u0441 \\u0431\\u0443\\u0434\\u0435\\u0442 \\u0441\\u043E\\u0437\\u0434\\u0430\\u043D\\u0430 \\u0443\\u043D\\u0438\\u043A\\u0430\\u043B\\u044C\\u043D\\u0430\\u044F \\u0441\\u0441\\u044B\\u043B\\u043A\\u0430 \\u043D\\u0430 \\u0434\\u043E\\u0441\\u043A\\u0443, \\u0432\\u0432\\u0435\\u0434\\u044F \\u043A\\u043E\\u0442\\u043E\\u0440\\u0443\\u044E, \\u0434\\u0440\\u0443\\u0433\\u0438\\u0435 \\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u0435\\u043B\\u0438 \\u0441\\u043C\\u043E\\u0433\\u0443\\u0442 \\u043F\\u043E\\u0434\\u043A\\u043B\\u044E\\u0447\\u0438\\u0442\\u044C\\u0441\\u044F \\u043A \\u0432\\u0430\\u0448\\u0435\\u0439 \\u0434\\u043E\\u0441\\u043A\\u0435\",\"uriNotValie\":\"\\u041D\\u0435 \\u0432\\u0435\\u0440\\u043D\\u0430\\u044F \\u0441\\u0442\\u0440\\u0430\\u043D\\u0438\\u0446\\u0430 YouTube \",\"work_learn\":\"\\u0420\\u0430\\u0431\\u043E\\u0442\\u0430\\u0439 \\u0438 \\u0443\\u0447\\u0438\\u0441\\u044C \\u0432\\u043C\\u0435\\u0441\\u0442\\u0435 \\u0438\\u0437 \\u043B\\u044E\\u0431\\u043E\\u0439 \\u0442\\u043E\\u0447\\u043A\\u0438 \\u043C\\u0438\\u0440\\u0430\",\"write\":\"\\u041F\\u0438\\u0448\\u0438\",\"{0}\":function(a){return[a(\"0\")]}}};","module.exports = __webpack_public_path__ + \"static/media/InkFree.0801c08e.ttf\";","module.exports = __webpack_public_path__ + \"static/media/homoarak.1fc7933e.ttf\";","module.exports = __webpack_public_path__ + \"static/media/Slimamif.00767a44.ttf\";","module.exports = __webpack_public_path__ + \"static/media/Freestyle.b6b6c03d.ttf\";","// Generated automatically by nearley, version 2.19.2\n// http://github.com/Hardmath123/nearley\n// Bypasses TS6133. Allow declared but unused functions.\n// @ts-ignore\nfunction id(d: any[]): any { return d[0]; }\n\n const op = (name : string , ...args: any[]) => {\n return {\n \"op\" : name,\n args\n }\n }\n\ninterface NearleyToken { value: any;\n [key: string]: any;\n};\n\ninterface NearleyLexer {\n reset: (chunk: string, info: any) => void;\n next: () => NearleyToken | undefined;\n save: () => any;\n formatError: (token: NearleyToken) => string;\n has: (tokenType: string) => boolean;\n};\n\ninterface NearleyRule {\n name: string;\n symbols: NearleySymbol[];\n postprocess?: (d: any[], loc?: number, reject?: {}) => any;\n};\n\ntype NearleySymbol = string | { literal: any } | { test: (token: any) => boolean };\n\ninterface Grammar {\n Lexer: NearleyLexer | undefined;\n ParserRules: NearleyRule[];\n ParserStart: string;\n};\n\nconst grammar: Grammar = {\n Lexer: undefined,\n ParserRules: [\n {\"name\": \"main\", \"symbols\": [\"plotexpr\"], \"postprocess\": d=>[d[0]]},\n {\"name\": \"main\", \"symbols\": [\"def\", \"sep\", \"plotexpr\"], \"postprocess\": (d)=>[...d[0],d[2]]},\n {\"name\": \"def\", \"symbols\": [\"definition\"], \"postprocess\": (d)=>[d[0]]},\n {\"name\": \"def\", \"symbols\": [\"def\", \"sep\", \"definition\"], \"postprocess\": (d)=>[...d[0], d[2]]},\n {\"name\": \"definition\", \"symbols\": [\"var\", {\"literal\":\"=\"}, \"expr\"], \"postprocess\": (d)=>op(\"def\", d[0], d[2])},\n {\"name\": \"plotexpr$string$1\", \"symbols\": [{\"literal\":\"p\"}, {\"literal\":\"l\"}, {\"literal\":\"o\"}, {\"literal\":\"t\"}], \"postprocess\": (d) => d.join('')},\n {\"name\": \"plotexpr\", \"symbols\": [\"plotexpr$string$1\", \"_\", {\"literal\":\"(\"}, \"expr\", {\"literal\":\")\"}], \"postprocess\": (d)=>op(\"plot\", d[3])},\n {\"name\": \"plotexpr$string$2\", \"symbols\": [{\"literal\":\"p\"}, {\"literal\":\"l\"}, {\"literal\":\"o\"}, {\"literal\":\"t\"}], \"postprocess\": (d) => d.join('')},\n {\"name\": \"plotexpr\", \"symbols\": [\"plotexpr$string$2\", \"_\", {\"literal\":\"(\"}, \"expr\", {\"literal\":\",\"}, \"expr\", {\"literal\":\")\"}], \"postprocess\": (d)=>op(\"plot\", d[3], d[5])},\n {\"name\": \"expr\", \"symbols\": [\"_\", \"AS\", \"_\"], \"postprocess\": function(d) {return d[1]; }},\n {\"name\": \"P\", \"symbols\": [{\"literal\":\"(\"}, \"_\", \"AS\", \"_\", {\"literal\":\")\"}], \"postprocess\": function(d) {return d[2]; }},\n {\"name\": \"P\", \"symbols\": [{\"literal\":\"-\"}, \"_\", {\"literal\":\"(\"}, \"_\", \"AS\", \"_\", {\"literal\":\")\"}], \"postprocess\": function(d) {return op(\"m1\", d[4]); }},\n {\"name\": \"P\", \"symbols\": [\"N\"], \"postprocess\": id},\n {\"name\": \"P\", \"symbols\": [{\"literal\":\"-\"}, \"_\", \"N\"], \"postprocess\": function(d) {return op(\"m1\", d[2]); }},\n {\"name\": \"E\", \"symbols\": [\"P\", \"_\", {\"literal\":\"^\"}, \"_\", \"E\"], \"postprocess\": function(d) {return op(\"pow\", d[0], d[4]); }},\n {\"name\": \"E\", \"symbols\": [\"P\"], \"postprocess\": id},\n {\"name\": \"MD\", \"symbols\": [\"MD\", \"_\", {\"literal\":\"*\"}, \"_\", \"E\"], \"postprocess\": function(d) {return op(\"mul\", d[0], d[4]); }},\n {\"name\": \"MD\", \"symbols\": [\"MD\", \"_\", {\"literal\":\"/\"}, \"_\", \"E\"], \"postprocess\": function(d) {return op(\"div\", d[0], d[4]); }},\n {\"name\": \"MD\", \"symbols\": [\"E\"], \"postprocess\": id},\n {\"name\": \"AS\", \"symbols\": [\"AS\", \"_\", {\"literal\":\"+\"}, \"_\", \"MD\"], \"postprocess\": function(d) {return op(\"add\", d[0], d[4]); }},\n {\"name\": \"AS\", \"symbols\": [\"AS\", \"_\", {\"literal\":\"-\"}, \"_\", \"MD\"], \"postprocess\": function(d) {return op(\"sub\", d[0], d[4]); }},\n {\"name\": \"AS\", \"symbols\": [\"MD\"], \"postprocess\": id},\n {\"name\": \"N\", \"symbols\": [\"part\"], \"postprocess\": id},\n {\"name\": \"N$string$1\", \"symbols\": [{\"literal\":\"s\"}, {\"literal\":\"i\"}, {\"literal\":\"n\"}], \"postprocess\": (d) => d.join('')},\n {\"name\": \"N\", \"symbols\": [\"N$string$1\", \"_\", \"P\"], \"postprocess\": function(d) {return op(\"sin\", d[2]); }},\n {\"name\": \"N$string$2\", \"symbols\": [{\"literal\":\"c\"}, {\"literal\":\"o\"}, {\"literal\":\"s\"}], \"postprocess\": (d) => d.join('')},\n {\"name\": \"N\", \"symbols\": [\"N$string$2\", \"_\", \"P\"], \"postprocess\": function(d) {return op(\"cos\", d[2]); }},\n {\"name\": \"N$string$3\", \"symbols\": [{\"literal\":\"t\"}, {\"literal\":\"a\"}, {\"literal\":\"n\"}], \"postprocess\": (d) => d.join('')},\n {\"name\": \"N\", \"symbols\": [\"N$string$3\", \"_\", \"P\"], \"postprocess\": function(d) {return op(\"tan\", d[2]); }},\n {\"name\": \"N$string$4\", \"symbols\": [{\"literal\":\"a\"}, {\"literal\":\"s\"}, {\"literal\":\"i\"}, {\"literal\":\"n\"}], \"postprocess\": (d) => d.join('')},\n {\"name\": \"N\", \"symbols\": [\"N$string$4\", \"_\", \"P\"], \"postprocess\": function(d) {return op(\"asin\",d[2]); }},\n {\"name\": \"N$string$5\", \"symbols\": [{\"literal\":\"a\"}, {\"literal\":\"c\"}, {\"literal\":\"o\"}, {\"literal\":\"s\"}], \"postprocess\": (d) => d.join('')},\n {\"name\": \"N\", \"symbols\": [\"N$string$5\", \"_\", \"P\"], \"postprocess\": function(d) {return op(\"acos\",d[2]); }},\n {\"name\": \"N$string$6\", \"symbols\": [{\"literal\":\"a\"}, {\"literal\":\"t\"}, {\"literal\":\"a\"}, {\"literal\":\"n\"}], \"postprocess\": (d) => d.join('')},\n {\"name\": \"N\", \"symbols\": [\"N$string$6\", \"_\", \"P\"], \"postprocess\": function(d) {return op(\"atan\",d[2]); }},\n {\"name\": \"N$string$7\", \"symbols\": [{\"literal\":\"s\"}, {\"literal\":\"q\"}, {\"literal\":\"r\"}, {\"literal\":\"t\"}], \"postprocess\": (d) => d.join('')},\n {\"name\": \"N\", \"symbols\": [\"N$string$7\", \"_\", \"P\"], \"postprocess\": function(d) {return op(\"sqrt\", d[2]); }},\n {\"name\": \"N$string$8\", \"symbols\": [{\"literal\":\"l\"}, {\"literal\":\"n\"}], \"postprocess\": (d) => d.join('')},\n {\"name\": \"N\", \"symbols\": [\"N$string$8\", \"_\", \"P\"], \"postprocess\": function(d) {return op(\"log\", d[2]); }},\n {\"name\": \"N$string$9\", \"symbols\": [{\"literal\":\"r\"}, {\"literal\":\"a\"}, {\"literal\":\"n\"}, {\"literal\":\"g\"}, {\"literal\":\"e\"}], \"postprocess\": (d) => d.join('')},\n {\"name\": \"N\", \"symbols\": [\"N$string$9\", \"_\", {\"literal\":\"(\"}, \"_\", \"int\", \"_\", {\"literal\":\")\"}], \"postprocess\": function(d) {return op(\"range\", parseInt(d[4])); }},\n {\"name\": \"N$string$10\", \"symbols\": [{\"literal\":\"r\"}, {\"literal\":\"a\"}, {\"literal\":\"n\"}, {\"literal\":\"g\"}, {\"literal\":\"e\"}], \"postprocess\": (d) => d.join('')},\n {\"name\": \"N\", \"symbols\": [\"N$string$10\", \"_\", {\"literal\":\"(\"}, \"expr\", {\"literal\":\",\"}, \"expr\", {\"literal\":\",\"}, \"_\", \"int\", \"_\", {\"literal\":\")\"}], \"postprocess\": function(d) {return op(\"range\",d[3], d[5], parseInt(d[8])); }},\n {\"name\": \"part\", \"symbols\": [\"float\"], \"postprocess\": id},\n {\"name\": \"part\", \"symbols\": [\"var\"], \"postprocess\": id},\n {\"name\": \"float\", \"symbols\": [\"int\", {\"literal\":\".\"}, \"int\"], \"postprocess\": function(d) {return op(\"val\", parseFloat(d[0] + d[1] + d[2]))}},\n {\"name\": \"float\", \"symbols\": [\"int\"], \"postprocess\": function(d) {return op(\"val\", parseInt(d[0]))}},\n {\"name\": \"int$ebnf$1\", \"symbols\": [/[0-9]/]},\n {\"name\": \"int$ebnf$1\", \"symbols\": [\"int$ebnf$1\", /[0-9]/], \"postprocess\": (d) => d[0].concat([d[1]])},\n {\"name\": \"int\", \"symbols\": [\"int$ebnf$1\"], \"postprocess\": function(d) { return d[0].join(\"\"); }},\n {\"name\": \"_$ebnf$1\", \"symbols\": []},\n {\"name\": \"_$ebnf$1\", \"symbols\": [\"_$ebnf$1\", /[\\s]/], \"postprocess\": (d) => d[0].concat([d[1]])},\n {\"name\": \"_\", \"symbols\": [\"_$ebnf$1\"], \"postprocess\": function(d) {return null; }},\n {\"name\": \"var$ebnf$1\", \"symbols\": []},\n {\"name\": \"var$ebnf$1\", \"symbols\": [\"var$ebnf$1\", /[a-zA-Z0-9]/], \"postprocess\": (d) => d[0].concat([d[1]])},\n {\"name\": \"var\", \"symbols\": [/[a-zA-Z]/, \"var$ebnf$1\"], \"postprocess\": function(d) {return op(\"var\", d[0] + d[1].join(\"\")); }},\n {\"name\": \"sep\", \"symbols\": [/[:;\\n]/]}\n ],\n ParserStart: \"main\",\n};\n\nexport default grammar;\n","\nexport enum ShapeType {\n Stroke = \"Stroke\",\n Text = \"Text\",\n Sticker = \"Sticker\",\n Figure = \"Figure\",\n TextArea = \"TextArea\",\n Chart = \"Chart\",\n Image = \"Image\",\n Highlight = \"Highlight\"\n}\n\n\nexport interface Transform {\n sx: number\n sy: number\n tx: number\n ty: number\n r: number\n }\n \n\nexport interface Shape {\n ID : Long.Long\n OwnerID : Long.Long\n Type: ShapeType\n transform : Transform\n}\n\nexport interface StrokeShape extends Shape {\n Type : ShapeType.Stroke | ShapeType.Highlight\n PointArray : number[][]\n Color : string\n Width : number\n Opacity : number\n Smooth : boolean\n Closed : boolean\n}\n\nexport interface TextShape extends Shape {\n Type : ShapeType.Text\n Content : string\n Color : string\n Family : string\n Size : number\n}\n\nexport enum FigureShapeType {\n Rectangle = 0,\n Ellipse = 1\n}\n\nexport interface FigureShape extends Shape {\n Type : ShapeType.Figure\n ShapeType: FigureShapeType;\n Color: string;\n Opacity: number;\n Width: number;\n Height: number;\n StrokeWidth: number;\n Fill: boolean;\n}\n\n\nexport interface TextAreaShape extends Shape {\n Type : ShapeType.TextArea\n \n Content: string;\n Family: string;\n Size: number;\n Style: string;\n Color: string;\n Width: number;\n Height: number;\n}\n\n\nexport interface ChartShape extends Shape {\n Type: ShapeType.Chart;\n Definition: string;\n LineWidth: number;\n Color: string;\n Opacity: number;\n Width: number;\n Height: number;\n}\n\n\nexport enum StickerContentType {\n Markdown = 0,\n Code = 1,\n Video = 2\n}\n\n\nexport interface StickerShape extends Shape {\n Type: ShapeType.Sticker;\n Width: number;\n Height: number;\n Content: string;\n FontSize: number;\n Color: string;\n StickerContentType: StickerContentType;\n}\n\n\nexport interface ImageShape extends Shape {\n Type : ShapeType.Image\n Src : string\n}\n","import { Shape, StickerShape } from \"./shape\";\n\n//TODO implement access mode\nexport enum AccessMode {\n Collaboration = \"Collaboration\",\n Tutor = \"Tutor\",\n Presentation = \"Presentation\"\n}\n","import grammer from \"../grammers/chart\"\nimport nearley from \"nearley\"\nimport { multiply, divide, add, subtract, sin, cos, pow, tan } from 'mathjs'\nimport { ChartShape, ShapeType, Transform } from \"../model/shape\"\n\ntype Arg = number | Op | string\n\ninterface Op {\n \"op\": string,\n \"args\": Arg[]\n}\n\n\nclass Vars extends Map{ }\nexport class WChart implements ChartShape {\n ID: Long.Long \n OwnerID : Long.Long\n transform: Transform\n Color: string\n Type : ShapeType.Chart = ShapeType.Chart\n Definition: string\n Height: number\n Width: number\n LineWidth: number\n Opacity: number\n //FIXME\n // Timestamp: Date\n // userId: number\n plotValue: number | number[] | undefined;\n plotArgs: number | number[] | undefined;\n\n\n constructor(chart: ChartShape) {\n this.ID = chart.ID\n this.OwnerID = chart.OwnerID\n this.transform = chart.transform\n this.Color = chart.Color\n this.Definition = chart.Definition\n this.Height = chart.Height\n this.Width = chart.Width\n this.LineWidth = chart.LineWidth\n this.Opacity = chart.Opacity\n //FIXME\n // this.timestamp = chart.timestamp\n // this.userId = chart.userId\n if (this.Definition !== \"\") this.calcDefinition()\n }\n\n chart(): ChartShape {\n if (this.ID !== undefined) {\n throw new Error(\"Chart with no Id\")\n }\n return {\n Color: this.Color,\n Definition: this.Definition,\n Height: this.Height,\n LineWidth: this.LineWidth,\n Opacity: this.Opacity,\n //FIXME\n // Timestamp: this.timestamp,\n // userId: this.userId,\n transform: this.transform,\n Type: this.Type,\n Width: this.Width,\n ID: this.ID,\n OwnerID : this.OwnerID\n\n }\n\n }\n\n setDefinition(definition: string) {\n this.Definition = definition\n this.calcDefinition()\n }\n\n calcDefinition() {\n const parser = new nearley.Parser(nearley.Grammar.fromCompiled(grammer));\n try {\n parser.feed(this.Definition)\n }\n catch (error) {\n this.plotValue = undefined\n this.plotArgs = undefined\n return \n }\n const result = parser.results as Op[][]\n //console.log(this.definition, result)\n if (result.length > 0) {\n console.log(\"parser result\", result)\n const vars = new Vars()\n vars.set('pi', Math.PI)\n vars.set('e', Math.E)\n for (let i = 0; i < result[0].length - 1; ++i) {\n const expr = result[0][i];\n if (expr.op === \"def\") {\n const varName = (expr.args[0] as Op).args[0] as string\n const varValue = this.calc(vars, expr.args[1] as Op)\n vars.set(varName, varValue)\n }\n }\n\n const expr = result[0][result[0].length - 1]\n if (expr.op === 'plot' && expr.args.length > 0) {\n if (expr.args.length === 1) {\n const value = this.calc(vars, expr.args[0] as Op)\n this.plotArgs = undefined\n this.plotValue = value\n\n } else {\n this.plotArgs = this.calc(vars, expr.args[0] as Op)\n\n this.plotValue = this.calc(vars, expr.args[1] as Op)\n\n }\n }\n else {\n this.plotValue = undefined\n this.plotArgs = undefined\n }\n\n } else {\n this.plotValue = undefined\n }\n\n\n }\n\n\n\n sin(val: number | number[]): number | number[] {\n if (typeof val === 'number')\n return sin(val)\n else\n return sin(val as number[]) as number[]\n }\n\n cos(val: number | number[]): number | number[] {\n if (typeof val === 'number')\n return cos(val)\n else\n return cos(val as number[]) as number[]\n }\n tan(val: number | number[]): number | number[] {\n if (typeof val === 'number')\n return tan(val)\n else\n return tan(val as number[]) as number[]\n }\n pow(val: number[], number: number) {\n let res: number[] = []\n for (let i = 0; i < val.length; ++i) {\n res.push(Math.pow(val[i], number))\n }\n\n return res\n }\n\n calc(vars: Vars, op: Op): number[] | number {\n switch (op.op) {\n case \"m1\": {\n const a = this.calc(vars, op.args[0] as Op);\n if (Array.isArray(a)) return a.map(n => -n)\n else return -a\n }\n case \"var\":\n return vars.get(op.args[0] as string) || NaN\n case \"val\":\n return op.args[0] as number\n case \"range\":\n return this.range(vars, op) as number[]\n case \"add\":\n const a = this.calc(vars, op.args[0] as Op) as number[]\n const b = this.calc(vars, op.args[1] as Op) as number[]\n return add(a, b) as number | number[]\n case \"sub\":\n return subtract(this.calc(vars, op.args[0] as Op), this.calc(vars, op.args[1] as Op)) as number | number[]\n case 'pow':\n return this.pow(this.calc(vars, op.args[0] as Op) as number[], this.calc(vars, op.args[1] as Op) as number) as number[]\n case \"mul\":\n {\n const a = this.calc(vars, op.args[0] as Op) as number[]\n const b = this.calc(vars, op.args[1] as Op) as number[]\n if (a.length && a.length === b.length) {\n const res: number[] = []\n for (let i = 0; i < a.length; i++) {\n res.push(a[i] * b[i])\n }\n return res\n }\n else\n return multiply(a, b) as number | number[]\n }\n case \"div\":\n {\n const a = this.calc(vars, op.args[0] as Op)\n const b = this.calc(vars, op.args[1] as Op)\n return divide(a, b) as number | number[]\n }\n case \"sin\":\n return this.sin(this.calc(vars, op.args[0] as Op)) as number | number[]\n case \"cos\":\n return this.cos(this.calc(vars, op.args[0] as Op)) as number | number[]\n case \"tan\":\n return this.tan(this.calc(vars, op.args[0] as Op)) as number | number[]\n default:\n return NaN\n\n }\n }\n range(vars: Vars, op: Op): number[] {\n if (op.args.length === 1) {\n const res = []\n for (let i = 0; i < op.args[0]; ++i) res.push(i)\n return res\n } else if (op.args.length === 3) {\n const a = this.calc(vars, op.args[0] as Op)\n const b = this.calc(vars, op.args[1] as Op)\n const n = op.args[2] as number\n if (Array.isArray(a) || (Array.isArray(b)) || !Number.isInteger(n)) return [NaN]\n const res = []\n for (let i = 0; i < n; ++i) {\n res.push(a + (i) / (n - 1) * (b - a))\n }\n return res\n\n\n } else return [NaN]\n }\n}","import winston from 'winston'\nconst { combine, timestamp, label, printf } = winston.format\nconst myFormat = printf(({ level, message, timestamp, data }) => {\n if (data)\n // return `${timestamp}: ${message}\\n${JSON.stringify(data, undefined, 2)}`;\n return `== ${message}\\n${JSON.stringify(data, undefined, 2)}\\n`;\n else\n return `== ${message}`;\n\n});\n\n\nexport const logger = winston.createLogger(\n {\n format: combine(\n label({ label: 'right meow!' }),\n timestamp(),\n myFormat\n ),\n transports: [new winston.transports.Console()]\n }\n)","export class Rect {\n x: number\n y: number\n width: number\n height: number\n constructor(rect: { x: number, y: number, width: number, height: number }) {\n this.x = rect.x\n this.y = rect.y\n this.width = rect.width\n this.height = rect.height\n }\n inside(p: { x: number, y: number }): boolean {\n return ((p.x >= this.x) && (p.x <= this.x + this.width) && (p.y >= this.y) && (p.y <= this.y + this.height));\n }\n\n points() : [number, number][] {\n return [\n [this.x, this.y],\n [this.x + this.width, this.y],\n [this.x + this.width, this.y + this.height],\n [this.x, this.y + this.height]\n ]\n }\n\n extend(l : number, t : number, r : number, b : number) {\n return new Rect({ x: this.x-l, y : this.y-l, width : this.width + r + l, height : this.height + t + b})\n\n }\n\n}\n\n\nexport function getBoundingBox(points: number[][]): Rect {\n let x0 = points[0][0]\n let y0 = points[0][1]\n let x1 = points[0][0]\n let y1 = points[0][1]\n for (let point of points) {\n if (point[0] < x0) x0 = point[0]\n if (point[0] > x1) x1 = point[0]\n if (point[1] < y0) y0 = point[1]\n if (point[1] > y1) y1 = point[1]\n }\n\n return new Rect({ x: x0, y: y0, width: x1 - x0, height: y1 - y0 })\n\n\n}\n","import { controller } from \"../controller/controller\";\nimport { store } from \"./store\";\nimport { WImage } from \"../model/WImage\";\nimport { Shape, ShapeType, ImageShape, StickerShape } from \"../model/shape\";\nimport Long from \"long\"\nexport enum ActionType {\n Create = 0,\n Remove,\n Update\n}\n\nexport enum ObjectType {\n Undefine = 0,\n Shape,\n Sticker\n}\n\n\nfunction copyShape(shape: Shape): Shape {\n let newShape: Shape = { ...shape, transform: { ...shape.transform } }\n if (newShape.Type === ShapeType.Image) {\n const image = new WImage(newShape as ImageShape, (shape as WImage).htmlImg)\n image.Loaded = (shape as WImage).Loaded\n newShape = image\n }\n //FIXME Add chart support\n return newShape\n}\n\nfunction copySticker(sticker: StickerShape): StickerShape {\n const newSticker = { ...sticker, }\n return newSticker\n}\n\n\n\nexport class WAction {\n constructor(public objectType: ObjectType, public actionType: ActionType) { }\n}\n\nexport class ShapeAction extends WAction {\n constructor(actionType: ActionType, public before?: Shape, public after?: Shape) {\n super(ObjectType.Shape, actionType)\n }\n}\n\nexport class StickerAction extends WAction {\n constructor(actionType: ActionType, public before?: StickerShape, public after?: StickerShape) {\n super(ObjectType.Sticker, actionType)\n }\n}\n\n\n\nexport class UndoRedo {\n clear() {\n this._redo = []\n this._undo = []\n }\n _undo: WAction[] = []\n _redo: WAction[] = []\n sticker?: StickerShape\n shape?: Shape\n\n addUndo(action: WAction) {\n this._undo.push(action)\n this._redo = []\n }\n\n\n addShape(shape: Shape) {\n this.addUndo(new ShapeAction(ActionType.Create, undefined, shape))\n\n }\n removeShape(shape: Shape) {\n\n this.addUndo(new ShapeAction(ActionType.Remove, shape, undefined))\n }\n\n beginUpdateShape(shape: Shape) {\n this.shape = copyShape(shape)\n }\n\n endUpdateShape(shape: Shape) {\n if (this.shape) {\n this.addUndo(new ShapeAction(ActionType.Update, this.shape, copyShape(shape)))\n }\n this.shape = undefined\n }\n\n addSticker(sticker: StickerShape) {\n this.addUndo(new StickerAction(ActionType.Create, undefined, sticker))\n }\n removeSticker(sticker: StickerShape) {\n this.addUndo(new StickerAction(ActionType.Remove, sticker, undefined))\n }\n\n\n\n beginUpdateSticker(sticker: StickerShape) {\n this.sticker = copySticker(sticker)\n }\n\n endUpdateSticker(sticker: StickerShape) {\n if (this.sticker) {\n this.addUndo(new StickerAction(ActionType.Update, this.sticker, copySticker(sticker)))\n }\n this.sticker = undefined\n\n }\n\n undo() {\n if (this._undo.length > 0) {\n const action = this._undo.pop() as WAction\n if (action.objectType === ObjectType.Shape) this.undoShapeAction(action as ShapeAction)\n if (action.objectType === ObjectType.Sticker) this.undoStickerAction(action as StickerAction)\n this._redo.push(action)\n }\n }\n\n\n redo() {\n if (this._redo.length > 0) {\n const action = this._redo.pop() as WAction\n if (action.objectType === ObjectType.Shape) this.redoShapeAction(action as ShapeAction)\n if (action.objectType === ObjectType.Sticker) this.redoStickerAction(action as StickerAction)\n this._undo.push(action)\n\n }\n\n }\n redoStickerAction(action: StickerAction) {\n switch (action.actionType) {\n case ActionType.Create: {\n store.board.stickers.push(action.after as StickerShape)\n const sticker = action.after as StickerShape\n controller.socketController.addSticker(sticker, (id) => { sticker.ID = id })\n // controller.updateSelection()\n break\n }\n case ActionType.Remove: {\n\n store.removeSticker(action.before?.ID || Long.ZERO)\n controller.socketController.removeShape(action.before?.ID || Long.ZERO, \"sticker\")\n // controller.updateSelection()\n\n break\n\n }\n case ActionType.Update: {\n store.updateSticker(action.after as StickerShape)\n controller.socketController.updateShape(action.after as StickerShape)\n // controller.updateSelection()\n break\n }\n\n\n }\n }\n redoShapeAction(action: ShapeAction) {\n switch (action.actionType) {\n case ActionType.Create: {\n store.board.shapes.push(action.after as Shape)\n const shape = action.after as Shape\n controller.socketController.addShape(shape, id => shape.ID = id)\n controller.layerController?.updateRenderedFigures()\n break\n }\n case ActionType.Remove: {\n store.removeShape(action.before as Shape)\n const shape = action.before as Shape\n controller.socketController.removeShape(shape.ID, shape.Type)\n controller.layerController?.updateRenderedFigures()\n\n break\n\n }\n case ActionType.Update: {\n controller.updateShape(action.after as Shape)\n\n controller.socketController?.updateShape(action.after as Shape)\n controller.layerController?.updateRenderedFigures()\n break\n }\n\n\n }\n\n }\n\n\n undoStickerAction(action: StickerAction) {\n switch (action.actionType) {\n case ActionType.Create: {\n store.removeSticker(action.after?.ID || Long.ZERO)\n controller.socketController.removeShape(action.after?.ID || Long.ZERO, \"sticker\")\n // controller.updateSelection()\n break\n }\n case ActionType.Remove: {\n store.board.stickers.push(action.before as StickerShape)\n const sticker = action.before as StickerShape\n controller.socketController.addSticker(sticker, (id) => sticker.ID = id)\n\n break\n }\n\n case ActionType.Update: {\n store.updateSticker(action.before as StickerShape)\n controller.socketController.updateShape(action.before as StickerShape)\n // controller.updateSelection()\n\n break\n }\n\n }\n }\n undoShapeAction(action: ShapeAction) {\n switch (action.actionType) {\n case ActionType.Create: {\n const shape = action.after as Shape\n\n store.removeShape(shape)\n\n controller.socketController.removeShape(shape.ID, shape.Type)\n controller.layerController?.updateRenderedFigures()\n break\n }\n case ActionType.Remove: {\n const shape = action.before as Shape\n store.board.shapes.push(shape)\n controller.socketController.addShape(shape, id => shape.ID = id)\n controller.layerController?.updateRenderedFigures()\n\n break\n }\n\n case ActionType.Update: {\n controller.updateShape(action.before as Shape)\n //store.updateShape(action.before as Shape)\n controller.socketController?.updateShape(action.before as Shape)\n\n break\n }\n\n }\n\n }\n\n\n\n}\n\nexport const undoredo = new UndoRedo()","import { Rect } from \"../math/Rect\";\nimport { ImageShape, Transform, ShapeType } from \"./shape\";\nimport { logger } from \"../logging/logger\";\n\nexport class WImage implements ImageShape {\n // userId: number\n OwnerID : Long.Long\n ID: Long.Long \n Loaded = false\n // timestamp: Date\n transform: Transform\n Src: string\n Type : ShapeType.Image\n htmlImg?: HTMLImageElement;\n constructor(img: ImageShape, htmlImg? : HTMLImageElement) {\n this.ID = img.ID\n this.OwnerID = img.OwnerID\n // this.userId = img.userId\n // this.timestamp = img.timestamp\n this.Src = img.Src\n this.Type = ShapeType.Image\n this.transform = img.transform\n this.htmlImg = htmlImg\n if (htmlImg) this.Loaded = true\n \n\n }\n\n async load() {\n return new Promise((resolve, reject) => {\n this.htmlImg = new Image()\n this.htmlImg.onload = () => {\n this.Loaded = true\n resolve(true)\n }\n logger.info({message:\"Requesting image file...\", data: this.Src})\n this.htmlImg.src = this.Src\n })\n }\n\n rect() {\n if (this.Loaded && this.htmlImg) {\n return new Rect({ x: 0, y: 0, width: this.htmlImg.width, height: this.htmlImg.height })\n } else {\n return new Rect({ x: 0, y: 0, width: 0, height: 0 })\n }\n }\n\n\n\n}","import { Matrix, matrix, multiply, norm } from \"mathjs\";\nimport { Transform } from \"../model/shape\";\n\n\nexport function applyMatrixTransform(ctx: CanvasRenderingContext2D, m: Matrix) {\n ctx.transform(m.get([0, 0]), m.get([1, 0]), m.get([0, 1]), m.get([1, 1]), m.get([0, 2]), m.get([1, 2]))\n}\nexport function applyTransform(ctx: CanvasRenderingContext2D, t: Transform) {\n const m = AffineTransform.transform2Matrix(t);\n applyMatrixTransform(ctx, m);\n}\n\nexport function matrix2css(m: Matrix) {\n return `matrix(${m.get([0, 0])},${m.get([1, 0])}, ${m.get([0, 1])}, ${m.get([1, 1])}, ${m.get([0, 2])}, ${m.get([1, 2])})`\n}\n\n\nexport function transform2css(t: Transform) {\n return matrix2css(AffineTransform.transform2Matrix(t))\n}\n\n\nexport class AffineTransform {\n constructor(public transform: Transform) { }\n static translate(tx: number, ty: number) {\n return matrix([[1, 0, tx], [0, 1, ty], [0, 0, 1]])\n }\n static scale(sx: number, sy: number) {\n return matrix([[sx, 0, 0], [0, sy, 0], [0, 0, 1]])\n }\n static rotate(r: number) {\n return matrix([[Math.cos(r), -Math.sin(r), 0], [Math.sin(r), Math.cos(r), 0], [0, 0, 1]])\n }\n static multiply(m0: Matrix, ...m: Matrix[]) {\n m.splice(0, 0, m0);\n let r = m.pop() as Matrix\n while (m.length > 0) {\n let m1 = m.pop() as Matrix\n r = multiply(m1, r)\n }\n return r\n }\n\n static apply(m: Matrix, points: number[][]): [number, number][] {\n return points.map(point => {\n const p = multiply(m, [[point[0]], [point[1]], [1]]) as Matrix\n return [p.get([0, 0]), p.get([1, 0])]\n })\n }\n\n getRectTransformMatrix(w: number, h: number): Matrix {\n let m = AffineTransform.multiply(\n AffineTransform.translate(this.transform.tx, this.transform.ty),\n //AffineTransform.translate(w/2, h/2),\n AffineTransform.rotate(this.transform.r ),\n AffineTransform.scale(this.transform.sx, this.transform.sy),\n AffineTransform.translate(-w / 2, -h / 2),\n )\n return m\n\n }\n\n static transform2Matrix(t: Transform) {\n return AffineTransform.multiply(\n AffineTransform.translate(t.tx, t.ty),\n AffineTransform.rotate(t.r),\n AffineTransform.scale(t.sx, t.sy),\n )\n }\n\n static matrix2Transform(m: Matrix) {\n const Tx = m.get([0, 2]);\n const Ty = m.get([1, 2]);\n const Sx = norm([m.get([0, 0]), m.get([1, 0])]) as number;\n const Sy = norm([m.get([0, 1]), m.get([1, 1])]) as number;\n\n\n const Mr = matrix([[m.get([0, 0]) / Sx, m.get([0, 1]) / Sy, 0],\n [m.get([1, 0]) / Sx, m.get([1, 1]) / Sy, 0],\n [0, 0, 1],\n ]);\n\n const v0 = matrix([1, 0, 1]);\n const v1 = multiply(Mr, [1, 0, 1]);\n\n const R = Math.atan2(v1.get([1]), v1.get([0])) - Math.atan2(v0.get([1]), v0.get([0]))\n\n const t: Transform = {\n r: R,\n sx: Sx,\n sy: Sy,\n tx: Tx,\n ty: Ty\n }\n return t\n\n }\n\n\n\n\n getRectScaleTranslateMatrix(w: number, h: number): Matrix {\n let m = AffineTransform.multiply(\n AffineTransform.translate(this.transform.tx, this.transform.ty),\n //AffineTransform.translate(w/2, h/2),\n AffineTransform.scale(this.transform.sx, this.transform.sy),\n AffineTransform.translate(-w / 2, -h / 2),\n )\n return m\n }\n\n\n}","import { add, multiply, norm, subtract } from 'mathjs';\nimport { AffineTransform } from \"../math/AffineTransform\";\nimport { Rect } from \"../math/Rect\";\nimport { Transform } from '../model/shape';\n\n\nexport enum TransformerMode {\n Rect = 0,\n Transform = 1,\n Sticker = 2\n}\n\n\nfunction isPointInside(cp: [number, number][], P: [number, number]) {\n const isLeft = (P0: [number, number], P1: [number, number], P2: [number, number]) => {\n return ((P1[0] - P0[0]) * (P2[1] - P0[1]) - (P2[0] - P0[0]) * (P1[1] - P0[1]));\n }\n const b1 = isLeft(cp[0], cp[2], P) > 0\n const b2 = isLeft(cp[2], cp[4], P) > 0\n const b3 = isLeft(cp[4], cp[6], P) > 0\n const b4 = isLeft(cp[6], cp[0], P) > 0\n return b1 && b2 && b3 && b4\n\n\n}\n\n\nexport class TransformerTool {\n\n rect: Rect\n transform: Transform\n mode: TransformerMode\n dragPosition: [number, number] = [0,0];\n\n constructor(rect: Rect, transform: Transform, mode: TransformerMode) {\n this.rect = rect\n this.transform = transform\n this.mode = mode\n\n }\n D = 20;\n R = 10\n\n getControlPoints(rect: Rect) {\n\n const m1 = AffineTransform.transform2Matrix(this.transform)\n\n\n const D = this.D\n\n const fm = m1\n //const fm = multiply(m2, m1);\n let pt = AffineTransform.apply(fm, rect.points()) //Image rect points after transform\n\n\n let v1 = subtract(pt[1], pt[0]) as number[];\n let v2 = subtract(pt[3], pt[0]) as number[];\n v1 = multiply(v1, 1. / (norm(v1) as number))\n v2 = multiply(v2, 1. / (norm(v2) as number))\n pt[0] = add(pt[0], multiply(v1, -D)) as [number, number]\n pt[0] = add(pt[0], multiply(v2, -D)) as [number, number]\n\n pt[1] = add(pt[1], multiply(v1, D)) as [number, number]\n pt[1] = add(pt[1], multiply(v2, -D)) as [number, number]\n\n pt[2] = add(pt[2], multiply(v1, D)) as [number, number]\n pt[2] = add(pt[2], multiply(v2, D)) as [number, number]\n\n pt[3] = add(pt[3], multiply(v1, -D)) as [number, number]\n pt[3] = add(pt[3], multiply(v2, D)) as [number, number]\n\n const res: [number, number][] = [\n pt[0], multiply(add(pt[0], pt[1]), 0.5) as [number, number],\n pt[1], multiply(add(pt[1], pt[2]), 0.5) as [number, number],\n pt[2], multiply(add(pt[2], pt[3]), 0.5) as [number, number],\n pt[3], multiply(add(pt[3], pt[0]), 0.5) as [number, number]\n \n\n ]\n if (this.mode !== TransformerMode.Sticker)\n res.push(add(multiply(add(pt[0], pt[1]), 0.5), multiply(v2, -2 * this.D)) as [number, number])\n return res\n }\n\n\n render = (context: CanvasRenderingContext2D) => {\n context.beginPath()\n\n\n context.fillStyle = \"gray\"\n context.strokeStyle = \"gray\"\n context.globalAlpha = 0.6\n context.lineWidth = 5\n context.lineJoin = 'round'\n\n\n\n const rc = this.rect;\n\n\n\n\n const cp = this.getControlPoints(rc)\n context.strokeStyle = \"green\"\n context.lineWidth = 3\n context.setLineDash([3, 6])\n\n\n\n context.beginPath()\n context.moveTo(cp[0][0], cp[0][1]);\n for (let i = 1; i < 4; ++i)\n context.lineTo(cp[i * 2][0], cp[i * 2][1])\n context.closePath()\n context.stroke() //Stroke path\n\n if (this.mode !== TransformerMode.Sticker) {\n context.beginPath()\n context.moveTo(cp[1][0], cp[1][1]);\n context.lineTo(cp[8][0], cp[8][1])\n context.stroke() //Stroke path\n }\n\n const R = this.R\n\n let points = [[-R, -R], [R, -R], [R, R], [-R, R]]\n points = AffineTransform.apply(AffineTransform.rotate(this.transform.r), points);\n\n for (let i = 0; i < cp.length; ++i) {\n context.setLineDash([1, 0])\n\n context.save()\n context.translate(cp[i][0], cp[i][1])\n context.beginPath()\n context.moveTo(points[0][0], points[0][1]);\n for (let i = 1; i < 4; ++i)\n context.lineTo(points[i][0], points[i][1])\n context.closePath()\n context.stroke() //Stroke path\n context.restore()\n }\n\n }\n\n isDrag(pos: { x: number, y: number }) {\n\n const ppos = [pos.x, pos.y] as [number, number]\n const rc = this.rect;\n const cp = this.getControlPoints(rc)\n const isDrag = isPointInside(cp, ppos)\n if (isDrag) {\n this.dragPosition = ppos\n\n }\n return isDrag\n }\n setDragPosition(pos: { x: number; y: number; }) {\n const ppos = [pos.x, pos.y] as [number, number]\n const delta = subtract(ppos, this.dragPosition) as [number, number]\n\n this.transform.tx += delta[0]\n this.transform.ty += delta[1]\n this.dragPosition = ppos\n \n }\n\n getHandleIdx(pos: { x: number, y: number }) {\n //let ppos = this._transform.invert([pos.x, pos.y])\n const ppos = [pos.x, pos.y]\n const rc = this.rect;\n const cp = this.getControlPoints(rc)\n for (let i = 0; i < cp.length; ++i) {\n const dist = norm(subtract(cp[i], ppos) as number[]) as number\n if (dist < this.R + 10) {\n return i\n }\n }\n return -1\n }\n\n\n setDragHandlePosition(dragIdx: number, pos: { x: number; y: number; }) {\n if (dragIdx < 8) {\n const transform = this.transform\n const rc = this.rect;\n const cp = this.getControlPoints(rc)\n\n\n\n\n\n const traslateHandle = (idx: number, kx: 1 | 0 | -1, ky: 1 | 0 | -1) => {\n const oidx = (idx + 4) % 8;\n const cp1 = AffineTransform.apply(\n AffineTransform.multiply(\n AffineTransform.rotate(-transform.r),\n AffineTransform.translate(-cp[oidx][0], -cp[oidx][1])\n )\n , cp\n )\n\n //let ppos = this._transform.invert([pos.x, pos.y]);\n let ppos = ([pos.x, pos.y]);\n\n ppos = AffineTransform.apply(\n AffineTransform.multiply(\n AffineTransform.rotate(-transform.r),\n AffineTransform.translate(-cp[oidx][0], -cp[oidx][1])\n )\n , [ppos]\n )[0]\n\n const w = cp1[2][0] - cp1[0][0]\n const h = cp1[6][1] - cp1[0][1]\n\n const W = w + kx * (ppos[0] - cp1[idx][0])\n const H = h + ky * (ppos[1] - cp1[idx][1])\n\n const cx = W / w\n const cy = H / h\n\n const M = AffineTransform.multiply(\n AffineTransform.translate(cp[oidx][0], cp[oidx][1]),\n AffineTransform.rotate(transform.r),\n AffineTransform.scale(cx, cy),\n AffineTransform.rotate(-transform.r),\n AffineTransform.translate(-cp[oidx][0], -cp[oidx][1]),\n )\n const resTransform = AffineTransform.matrix2Transform(\n AffineTransform.multiply(\n M,\n AffineTransform.transform2Matrix(transform)\n )\n )\n if (this.mode === TransformerMode.Rect || this.mode === TransformerMode.Sticker) {\n this.rect.width *= resTransform.sx\n this.rect.height *= resTransform.sy\n resTransform.sx = 1\n resTransform.sy = 1\n\n }\n\n return resTransform\n\n }\n\n\n\n\n\n switch (dragIdx) {\n case 0:\n {\n this.transform = traslateHandle(dragIdx, -1, -1)\n break\n }\n case 1:\n {\n this.transform = traslateHandle(dragIdx, 0, -1)\n break\n }\n\n case 2:\n {\n this.transform = traslateHandle(dragIdx, 1, -1)\n break\n }\n case 3:\n {\n this.transform = traslateHandle(dragIdx, 1, 0)\n break\n\n }\n\n\n case 4:\n {\n this.transform = traslateHandle(dragIdx, 1, 1)\n break\n\n\n }\n\n case 5:\n {\n this.transform = traslateHandle(dragIdx, 0, 1)\n\n\n break\n\n }\n\n\n case 6:\n {\n this.transform = traslateHandle(dragIdx, -1, 1)\n\n break\n\n }\n\n case 7:\n {\n this.transform = traslateHandle(dragIdx, -1, 0)\n break\n\n\n }\n\n\n }\n // console.log({ x0, y0, x1, y1 }, { x0n, y0n, x1n, y1n })\n\n // let dx = (x0n - x0) * boardStore.editedShape.transform.sx\n // let dy = (y0n - y0) * boardStore.editedShape.transform.sy\n // boardStore.editedShape.transform.tx += dx\n // boardStore.editedShape.transform.ty += dy\n\n // let cx = (x1n - x0n) / (x1 - x0)\n // let cy = (y1n - y0n) / (y1 - y0)\n // boardStore.editedShape.transform.sx = Math.max(0.1, boardStore.editedShape.transform.sx * cx)\n // boardStore.editedShape.transform.sy = Math.max(0.1, boardStore.editedShape.transform.sy * cy)\n\n\n\n } else {\n const cp = this.getControlPoints(this.rect)\n //const ppos = this._transform.invert([pos.x, pos.y]);\n const ppos = [pos.x, pos.y]\n let v = subtract(cp[0], cp[6]) as [number, number]\n //v = multiply(v, -1) as [number, number]\n const center = multiply(add(cp[0], cp[4]), 0.5) as [number, number];\n const v1 = subtract(ppos, center) as [number, number]\n let alpha0 = Math.atan2(v[1], v[0]);\n let alpha1 = Math.atan2(v1[1], v1[0]);\n const da = alpha1 - alpha0;\n\n const nt = AffineTransform.multiply(\n AffineTransform.translate(center[0], center[1]),\n AffineTransform.rotate(da),\n AffineTransform.translate(-center[0], -center[1]),\n AffineTransform.transform2Matrix(this.transform)\n )\n\n this.transform = AffineTransform.matrix2Transform(nt)\n }\n\n\n }\n}\n","import * as d3 from \"d3\";\nimport { WImage } from \"../model/WImage\";\nimport { AffineTransform, applyTransform } from \"../math/AffineTransform\";\nimport { Rect } from \"../math/Rect\";\nimport { WChart } from \"../helpers/WChart\";\nimport { Shape, FigureShape, FigureShapeType, TextShape, ShapeType, TextAreaShape, StickerShape, ChartShape, StrokeShape } from \"../model/shape\";\nimport { logger } from \"../logging/logger\";\n\n\nfunction transpose(matrix: number[][]) {\n return matrix[0].map((col, i) => matrix.map(row => row[i]));\n}\n\n\nexport class LayerBase {\n canvas: HTMLCanvasElement\n context: CanvasRenderingContext2D;\n curve: d3.CurveGenerator;\n linear: d3.CurveGenerator;\n hasGrid = false\n transform = d3.zoomIdentity\n curveClosed: d3.CurveGenerator;\n linearClosed: d3.CurveGenerator;\n shapes: Shape[] = []\n\n constructor(parent: HTMLDivElement, public rect: Rect) {\n this.canvas = d3.select(parent).append(\"canvas\")\n .attr(\"width\", rect.width)\n .attr(\"height\", rect.height)\n .style(\"position\", \"absolute\")\n .style('top', `0px`)\n .style(\"left\", `0px`)\n .node() as HTMLCanvasElement\n this.context = this.canvas.getContext('2d') as CanvasRenderingContext2D\n if (!this.context) { throw new Error(\"Error creating 2d context for HTML canvas\") }\n this.curve = d3.curveCatmullRom(this.context)\n this.curveClosed = d3.curveCatmullRomClosed(this.context)\n this.linear = d3.curveLinear(this.context)\n this.linearClosed = d3.curveLinearClosed(this.context)\n }\n\n drawGrid() {\n this.context.save()\n this.hasGrid = true\n let x0 = this.transform.invertX(0)\n let y0 = this.transform.invertY(0)\n let x1 = this.transform.invertX(this.rect.width)\n let y1 = this.transform.invertY(this.rect.height)\n this.context.translate(this.transform.x, this.transform.y);\n this.context.scale(this.transform.k, this.transform.k);\n\n this.context.fillStyle = 'white'\n //this.context.fillRect(x0, y0, x1-x0, y1-y0)\n this.context.beginPath()\n let d = 20\n let D = 200\n\n this.context.strokeStyle = 'blue'\n this.context.globalAlpha = 0.1\n\n\n\n const addHLines = (p: number, w: number) => {\n if ((y1 - y0) * 3 / p < 300) {\n for (let i = Math.floor(y0 / p); i <= Math.ceil(y1 / p); ++i) {\n this.context.moveTo(x0, i * p);\n this.context.lineTo(x1, i * p);\n }\n\n }\n }\n\n const addVLines = (p: number, w: number) => {\n if ((x1 - x0) * 3 / p < 300) {\n for (let i = Math.floor(x0 / p); i <= Math.ceil(x1 / p); ++i) {\n\n this.context.moveTo(i * p, y0)\n this.context.lineTo(i * p, y1)\n }\n\n }\n\n }\n\n this.context.lineWidth = 1\n addHLines(d, 1)\n addVLines(d, 1)\n this.context.stroke()\n\n this.context.beginPath()\n this.context.lineWidth = 4\n addHLines(D, 2)\n\n addVLines(D, 2)\n this.context.stroke()\n\n //this.context.resetTransform()\n this.context.restore()\n\n }\n remove() {\n d3.select(this.canvas).remove()\n }\n clear() {\n this.context.clearRect(0, 0, this.rect.width, this.rect.height)\n\n if (this.hasGrid)\n this.drawGrid()\n }\n click(x: number, y: number) {\n return false\n }\n\n\n\n renderStroke(points: number[][], color: string, width: number, opacity: number, smooth: boolean, closed: boolean) {\n let line = smooth ? this.curve : this.linear\n if (closed) {\n line = smooth ? this.curveClosed : this.linearClosed\n }\n this.context.lineWidth = width\n this.context.lineJoin = \"round\"\n this.context.strokeStyle = color\n this.context.globalAlpha = opacity\n this.context.beginPath()\n this.context.fillStyle = color\n\n if (points.length === 1) {\n this.context.ellipse(points[0][0], points[0][1], width / 1.5, width / 1.5, 0, 0, 360)\n\n this.context.fill()\n } else {\n\n line.lineStart()\n for (const point of points) {\n line.point(point[0], point[1])\n }\n\n line.lineEnd()\n if (closed)\n this.context.fill()\n else\n this.context.stroke()\n\n }\n\n }\n\n\n renderFigure(figure: FigureShape, col: string | undefined = undefined, lineWidth: number | undefined = undefined) {\n if (figure.ShapeType === FigureShapeType.Ellipse) {\n this.context.save()\n //this.context.translate(figure.Transform.Tx, figure.Transform.Ty)\n this.context.lineWidth = lineWidth || figure.StrokeWidth\n this.context.strokeStyle = col || figure.Color\n this.context.globalAlpha = figure.Opacity\n\n this.context.beginPath()\n\n const x0 = figure.transform.tx\n const x1 = figure.transform.tx + figure.Width;\n\n const y0 = figure.transform.ty\n const y1 = figure.transform.ty + figure.Height;\n const cx = (x0 + x1) / 2\n const cy = (y0 + y1) / 2\n const width = Math.abs(figure.Width) / 2\n const height = Math.abs(figure.Height) / 2\n\n\n\n\n this.context.ellipse(cx, cy, width, height, 0, 0, 360)\n this.context.stroke()\n\n\n\n this.context.restore()\n }\n\n if (figure.ShapeType === FigureShapeType.Rectangle) {\n this.context.save()\n //this.context.translate(figure.Transform.Tx, figure.Transform.Ty)\n this.context.lineWidth = lineWidth || figure.StrokeWidth\n this.context.strokeStyle = col || figure.Color\n\n this.context.globalAlpha = figure.Opacity\n\n this.context.beginPath()\n\n const x0 = figure.transform.tx\n const x1 = figure.transform.tx + figure.Width;\n\n const y0 = figure.transform.ty\n const y1 = figure.transform.ty + figure.Height;\n const width = Math.abs(figure.Width)\n const height = Math.abs(figure.Height)\n\n this.context.rect(Math.min(x0, x1), Math.min(y0, y1), width, height)\n this.context.stroke()\n\n\n\n this.context.restore()\n }\n\n }\n\n renderChart(chart: WChart) {\n this.context.save()\n applyTransform(this.context, chart.transform)\n\n\n if (chart.plotValue && (chart.plotValue as number[]).length) {\n const yAxis = () => {\n var tickCount = 10,\n tickSize = 6,\n tickPadding = 3,\n ticks = y.ticks(tickCount),\n tickFormat = y.tickFormat(tickCount);\n\n this.context.beginPath();\n ticks.forEach((d) => {\n this.context.moveTo(0, y(d) as number);\n this.context.lineTo(-6, y(d)as number);\n });\n this.context.strokeStyle = \"black\";\n this.context.stroke();\n\n this.context.beginPath();\n this.context.moveTo(-tickSize, 0);\n this.context.lineTo(0.5, 0);\n this.context.lineTo(0.5, height);\n this.context.lineTo(-tickSize, height);\n this.context.strokeStyle = \"black\";\n this.context.stroke();\n\n this.context.textAlign = \"right\";\n this.context.textBaseline = \"middle\";\n ticks.forEach((d) => {\n this.context.fillText(tickFormat(d), -tickSize - tickPadding, y(d) as number);\n });\n }\n\n const xAxis = () => {\n var tickCount = 10,\n tickSize = 6,\n ticks = x.ticks(tickCount),\n tickFormat = x.tickFormat();\n\n this.context.beginPath();\n ticks.forEach((d) => {\n this.context.moveTo(x(d) as number, height);\n this.context.lineTo(x(d)as number, height + tickSize);\n });\n this.context.strokeStyle = \"black\";\n this.context.stroke();\n\n this.context.textAlign = \"center\";\n this.context.textBaseline = \"top\";\n ticks.forEach((d) => {\n this.context.fillText(tickFormat(d), x(d) as number, height + tickSize);\n });\n\n this.context.beginPath();\n this.context.moveTo(0, height + tickSize);\n this.context.lineTo(0, height);\n this.context.lineTo(width, height);\n this.context.lineTo(width, height + tickSize);\n this.context.strokeStyle = \"black\";\n this.context.stroke();\n\n }\n\n const nelem = (chart.plotValue as number[]).length\n let xdata: number[];\n if (chart.plotArgs && (chart.plotArgs as number[]).length)\n xdata = chart.plotArgs as number[]\n else\n xdata = [...Array(nelem).keys()]\n\n\n const margin = { top: 5, right: 5, bottom: 5, left: 5 },\n width = chart.Width - margin.left - margin.right,\n height = chart.Height - margin.top - margin.bottom;\n\n\n\n\n const x = d3.scaleLinear()\n .range([0, width]);\n const y = d3.scaleLinear()\n .range([height, 0]);\n\n x.domain(d3.extent(xdata) as [number, number])\n y.domain(d3.extent(chart.plotValue as number[]) as [number, number])\n\n const line = d3.line()\n .x(function (d) { return x(d[0])as number; })\n .y(function (d) { return y(d[1])as number; })\n .curve(d3.curveLinear)\n .context(this.context);\n this.context.translate(margin.left, margin.top);\n\n\n const matrix = transpose([xdata, chart.plotValue as number[]])\n\n this.context.beginPath()\n line(matrix as [number, number][])\n this.context.lineWidth = 2.5;\n this.context.strokeStyle = \"steelblue\";\n this.context.stroke()\n xAxis()\n yAxis()\n\n\n\n\n } else {\n this.context.beginPath()\n this.context.moveTo(0, 0)\n this.context.lineTo(chart.Width, chart.Height)\n this.context.moveTo(0, chart.Height)\n this.context.lineTo(chart.Width, 0)\n this.context.strokeStyle = \"red\"\n this.context.lineWidth = 2\n this.context.stroke()\n\n }\n this.context.restore()\n }\n\n\n renderImage(image: WImage) {\n\n if (image.Loaded) {\n\n\n this.context.save()\n\n this.context.translate(image.transform.tx, image.transform.ty)\n\n //this.context.translate(image.img.Width / 2, image.img.Height / 2)\n this.context.rotate(image.transform.r)\n this.context.scale(image.transform.sx, image.transform.sy)\n this.context.drawImage(image.htmlImg as HTMLImageElement, 0, 0)\n this.context.restore()\n }\n }\n\n\n renderText(text: TextShape) {\n this.context.save()\n this.context.globalAlpha = 1\n\n\n const font = `${text.Size}px ${text.Family}`\n this.context.font = font;\n\n let measure = this.context.measureText(text.Content)\n\n applyTransform(this.context, text.transform)\n let value = text.Content;\n this.context.translate(0, measure.actualBoundingBoxAscent)\n\n this.context.font = font;\n\n this.context.fillStyle = text.Color\n this.context.fillText(value, 0, 0)\n\n this.context.restore()\n }\n\n\n getRect(shape: Shape): Rect {\n switch (shape.Type) {\n\n case ShapeType.Text:\n {\n const text = shape as TextShape\n this.context.font = `${text.Size}px ${text.Family}`\n let mes = this.context.measureText(text.Content)\n let rect = new Rect({ x: 0, y: 0, width: mes.width, height: mes.actualBoundingBoxAscent + mes.actualBoundingBoxDescent })\n if (rect.width < 20) rect.width = 20\n if (rect.height < 10) rect.height = 10\n\n return rect\n }\n case ShapeType.Image:\n {\n const image = shape as WImage\n return image.rect()\n }\n case ShapeType.TextArea:\n {\n const textarea = shape as TextAreaShape\n return new Rect({ x: 0, y: 0, width: textarea.Width, height: textarea.Height })\n\n }\n case ShapeType.Sticker:\n {\n const sticker = shape as StickerShape\n return new Rect({ x: 0, y: 0, width: sticker.Width, height: sticker.Height })\n\n }\n\n case ShapeType.Chart:\n {\n const chart = shape as ChartShape\n return new Rect({ x: 0, y: 0, width: chart.Width, height: chart.Height })\n\n }\n\n case ShapeType.Figure:\n {\n const figure = shape as FigureShape\n return new Rect({ x: 0, y: 0, width: figure.Width, height: figure.Height })\n }\n default:\n return new Rect({ x: 0, y: 0, width: 0, height: 0 })\n\n }\n }\n\n getClientTextPoints(text: TextShape) {\n let rect = this.getRect(text)\n const m = new AffineTransform(text.transform).getRectTransformMatrix(rect.width, rect.height)\n let points = AffineTransform.apply(m, rect.points())\n points = points.map(p => this.transform.apply(p))\n return points\n }\n getClientTextRect(text: TextShape) {\n let rect = this.getRect(text)\n let p0 = this.transform.apply([rect.x, rect.y])\n let p1 = this.transform.apply([rect.x + rect.width, rect.y + rect.height])\n return new Rect({ x: p0[0] + this.rect.x, y: p0[1] + this.rect.y, width: p1[0] - p0[0], height: p1[1] - p0[1] })\n }\n\n renderTextArea(ta: TextAreaShape) {\n this.context.save()\n this.context.beginPath()\n const x0 = ta.transform.tx\n const x1 = ta.transform.tx + ta.Width;\n const y0 = ta.transform.ty\n const y1 = ta.transform.ty + ta.Height;\n const width = Math.abs(ta.Width)\n // const height = Math.abs(ta.Height)\n let xs = Math.min(x0, x1)\n let ys = Math.min(y0, y1)\n\n this.context.translate(xs, ys)\n this.context.rotate(ta.transform.r)\n\n this.context.fillStyle = ta.Color\n\n // this.context.rect(0, 0, width, height)\n // this.context.stroke()\n\n this.context.font = `${ta.Size}px ${ta.Family}`\n const lines = ta.Content.split('\\n')\n xs = 0; ys = 0;\n\n for (let line of lines) {\n const m1 = this.context.measureText(line)\n let xc = xs\n for (let word of line.split(' ')) {\n const m = this.context.measureText(word)\n if (xc + m.width > xs + width) {\n xc = xs\n ys += m1.actualBoundingBoxAscent + m1.actualBoundingBoxDescent + 5;\n }\n this.context.fillText(word, xc, ys + m1.actualBoundingBoxAscent)\n xc += m.width + 5\n\n }\n\n\n ys += m1.actualBoundingBoxAscent + m1.actualBoundingBoxDescent + 5;\n\n\n // let words = line.split(' ')\n // for (let word of words) {\n // const m = this.context.measureText(word)\n // }\n }\n this.context.restore()\n\n }\n\n\n\n render(shapes: Shape[]) {\n this.shapes = shapes\n for (let shape of shapes) {\n this.renderShape(shape)\n }\n // this.context.resetTransform()\n }\n\n renderShape(shape: Shape) {\n // logger.info({message: \"LayerBase::renderShape\", data : shape})\n this.context.save()\n this.context.translate(this.transform.x, this.transform.y);\n this.context.scale(this.transform.k, this.transform.k);\n if (shape.Type === ShapeType.Stroke || shape.Type === ShapeType.Highlight) {\n const stroke = shape as StrokeShape\n this.renderStroke(stroke.PointArray, stroke.Color, stroke.Width, stroke.Opacity, stroke.Smooth, stroke.Closed)\n } else if (shape.Type === ShapeType.Image) {\n const image = shape as WImage\n this.renderImage(image)\n }\n else if (shape.Type === ShapeType.Text) {\n const text = shape as TextShape\n this.renderText(text)\n } else if (shape.Type === ShapeType.Figure) {\n const figure = shape as FigureShape\n this.renderFigure(figure)\n } else if (shape.Type === ShapeType.TextArea) {\n const ta = shape as TextAreaShape\n this.renderTextArea(ta)\n } else if (shape.Type === ShapeType.Chart) {\n const chart = shape as WChart\n this.renderChart(chart)\n }\n this.context.restore()\n\n }\n\n redraw() {\n this.clear()\n this.render(this.shapes)\n }\n\n dragEnd(x: number, y: number) { return false; }\n dragRender() { return false }\n drag(x: number, y: number) { return false; }\n dragStart(x: number, y: number) { return false; }\n\n}","\nimport { observable, makeObservable } from \"mobx\";\nimport { Shape } from \"../model/shape\"\nimport { Message } from \"../model/message\"\nimport { User } from \"./store\";\n\n\nexport const fonts = [\n \"Arial\",\n \"Roboto\",\n \"Times New Roman\",\n \"Times\",\n \"Courier New\",\n \"Courier\",\n \"Verdana\",\n \"Georgia\",\n \"Comic Sans MS\",\n \"Arial Black\"\n]\n\nexport enum Tool {\n Pen = 1,\n Marker,\n MultiLine,\n Segment,\n Erase,\n Translate,\n Select,\n Text,\n EditText,\n Image,\n Sticker,\n Play,\n Ellipse,\n Rectangle,\n TextArea,\n Chart,\n StickerVideo,\n Highlight,\n StickerCode\n}\n\n\nexport enum DrawType {\n Draw = 0,\n Highlight,\n MultiLine\n}\n\n\n\nexport enum TextDisplayType {\n None = 0, \n Line,\n Area \n\n}\n\n\n\nexport class UIState {\n boards: { boardName: string }[] = [];\n boardUsers: User[] = [];\n editedShape?: Shape;\n\n ui = {\n videoCallId: undefined as string | undefined,\n newStickerType: 'markdown',\n showChat: false,\n lineActiveButtons: [] as string[],\n tool: Tool.Pen,\n openToolLineIdx: undefined as number | undefined,\n showClearDialog: false,\n showShareDlg: false,\n messages: [] as Message[],\n\n\n };\n\n\n\n constructor() {\n makeObservable(this, {\n boards: observable,\n boardUsers: observable,\n editedShape: observable,\n ui: observable\n });\n }\n}\n\nexport const uiStore = new UIState()","import { TransformerLayer } from \"./TransformerLayer\";\n\nexport class DynLayer extends TransformerLayer {\n \n\n\n}\n","import { controller } from \"../controller/controller\";\nimport { undoredo } from \"../store/undoredo\";\nimport { TransformerMode, TransformerTool } from \"../tools/TransformerTool\";\nimport { LayerBase } from \"./LayerBase\";\nimport { Shape, ShapeType, TextAreaShape, ChartShape, StickerShape } from \"../model/shape\";\n\nexport class TransformerLayer extends LayerBase {\n transformerTool?: TransformerTool\n transformedShape?: Shape;\n dragHandleIdx: number = -1;\n isDrag: boolean = false;\n\n\n\n showTransformer(shape: Shape) {\n this.transformedShape = shape\n\n let rect = this.getRect(shape)\n if (shape.Type === ShapeType.Text)\n rect = rect.extend(0, 0, 5, 5)\n let mode: TransformerMode\n if ([ShapeType.Text, ShapeType.Image].includes(shape.Type))\n mode = TransformerMode.Transform\n else if (shape.Type === ShapeType.Sticker) {\n mode = TransformerMode.Sticker\n } else \n mode = TransformerMode.Rect\n this.transformerTool = new TransformerTool(rect, shape.transform, mode)\n\n }\n\n hideTransformer() {\n this.transformedShape = undefined\n this.transformerTool = undefined\n }\n\n updateTransformerShape(shape: Shape) {\n this.transformedShape = shape\n this.updateTransformerRect()\n }\n\n\n updateTransformerRect() {\n if (this.transformedShape && this.transformerTool) {\n this.transformerTool.rect = this.getRect(this.transformedShape)\n this.transformerTool.transform = this.transformedShape.transform\n }\n }\n\n render(shapes: Shape[]) {\n\n super.render(shapes)\n\n\n if (this.transformerTool) {\n this.context.save()\n this.context.translate(this.transform.x, this.transform.y);\n this.context.scale(this.transform.k, this.transform.k);\n\n this.transformerTool.render(this.context)\n this.context.restore()\n }\n\n }\n\n dragRender() {\n if (this.isDrag || this.dragHandleIdx > -1) return true\n else return false\n }\n\n dragStartTransformer(x: number, y: number) {\n // const ppos = this.transform.invert([x, y])\n const ppos = [x, y]\n if (this.transformerTool && this.transformedShape) {\n this.dragHandleIdx = this.transformerTool.getHandleIdx({ x: ppos[0], y: ppos[1] })\n if (this.dragHandleIdx > -1) {\n undoredo.beginUpdateShape(this.transformedShape)\n return true\n }\n\n this.isDrag = this.transformerTool.isDrag({ x: ppos[0], y: ppos[1] })\n if (this.isDrag) {\n undoredo.beginUpdateShape(this.transformedShape)\n\n return true\n }\n }\n return false\n }\n\n dragTransformer(x: number, y: number) {\n const ppos = [x, y]\n if (this.transformerTool && this.transformedShape) {\n if (this.dragHandleIdx > -1) {\n //this.transformedShape.rect = this.transformerTool.transform\n\n this.transformerTool.setDragHandlePosition(this.dragHandleIdx, { x: ppos[0], y: ppos[1] })\n this.transformedShape.transform = this.transformerTool.transform\n if (this.transformerTool.mode === TransformerMode.Rect || this.transformerTool.mode === TransformerMode.Sticker) {\n if (this.transformedShape.Type === ShapeType.TextArea) {\n const ta = this.transformedShape as TextAreaShape\n ta.Width = this.transformerTool.rect.width\n ta.Height = this.transformerTool.rect.height\n } \n if (this.transformedShape.Type === ShapeType.Chart) {\n const chart = this.transformedShape as ChartShape\n chart.Width = this.transformerTool.rect.width\n chart.Height = this.transformerTool.rect.height\n }\n\n if (this.transformedShape.Type === ShapeType.Sticker) {\n const sticker = this.transformedShape as StickerShape\n sticker.Width = this.transformerTool.rect.width\n sticker.Height = this.transformerTool.rect.height\n }\n\n }\n if ([ShapeType.Text, ShapeType.TextArea, ShapeType.Chart].includes(this.transformedShape.Type)) controller.board?.updateInputPosition()\n\n return true\n }\n\n if (this.isDrag) {\n this.transformerTool.setDragPosition({ x: ppos[0], y: ppos[1] })\n this.transformedShape.transform = this.transformerTool.transform\n if ([ShapeType.Text, ShapeType.TextArea, ShapeType.Chart].includes(this.transformedShape.Type)) controller.board?.updateInputPosition()\n\n\n return true\n }\n }\n return false\n\n }\n\n dragEndTransformer(x: number, y: number) {\n // const ppos = this.transform.invert([x, y])\n const ppos = [x, y]\n\n if (this.transformerTool && this.transformedShape) {\n if (this.dragHandleIdx > -1) {\n this.transformerTool.setDragHandlePosition(this.dragHandleIdx, { x: ppos[0], y: ppos[1] })\n controller.socketController?.updateShape(this.transformedShape)\n undoredo.endUpdateShape(this.transformedShape)\n return true\n }\n\n if (this.isDrag) {\n this.transformerTool.setDragPosition({ x: ppos[0], y: ppos[1] })\n controller.socketController?.updateShape(this.transformedShape)\n undoredo.endUpdateShape(this.transformedShape)\n return true\n }\n }\n return false\n\n\n }\n}\n","import * as d3 from \"d3\";\nimport { inv, multiply } from 'mathjs';\nimport { AffineTransform, matrix2css } from \"../math/AffineTransform\";\nimport { Rect } from \"../math/Rect\";\nimport { store } from \"../store/store\";\nimport { LayerBase } from \"./LayerBase\";\nimport { Shape, ShapeType, StrokeShape, FigureShape } from \"../model/shape\";\n\nexport class SelectionLayer extends LayerBase {\n updateInputPosition() {\n if (store.board.editedShape) {\n const rc = this.getRect(store.board.editedShape)\n const width = rc.width\n const height = rc.height\n store.boardUI.position.width = width\n store.boardUI.position.height = height\n const m1 = AffineTransform.transform2Matrix(store.board.editedShape.transform)\n const m2 = AffineTransform.transform2Matrix({\n sx: this.transform.k,\n sy: this.transform.k,\n tx: this.transform.x,\n ty: this.transform.y,\n r: 0\n })\n store.boardUI.position.transform = matrix2css(multiply(m2, m1));\n }\n\n }\n nextCol = 1\n col2id = new Map()\n\n rects: [Rect, Shape][] = []\n\n constructor(parent: HTMLDivElement, rect: Rect) {\n super(parent, rect)\n this.context = this.canvas.getContext('2d', { alpha: true }) as CanvasRenderingContext2D\n d3.select(this.canvas).classed(\"displayHidden\", true)\n\n }\n\n getNextColor() {\n if (this.nextCol < 16777215) {\n let r = this.nextCol & 0xff;\n let g = (this.nextCol & 0xff00) >> 8\n let b = (this.nextCol & 0xff0000) >> 16\n this.nextCol += 1\n return { r, g, b }\n\n }\n else {\n throw new Error(\"Too many objects in scene for selection (>16777215) \")\n }\n\n\n }\n\n clear() {\n super.clear()\n this.nextCol = 1\n this.col2id = new Map()\n this.rects = []\n }\n\n getColorKey(color: { r: number, g: number, b: number }) {\n return `rgb(${color.r},${color.g},${color.b})`\n }\n\n render(shapes: Shape[]) {\n this.context.save()\n this.shapes = shapes\n this.nextCol = 1\n this.col2id = new Map()\n this.rects = []\n this.context.translate(this.transform.x, this.transform.y);\n this.context.scale(this.transform.k, this.transform.k);\n\n for (let shape of shapes) {\n if (shape.Type === ShapeType.Stroke) {\n let stroke = shape as StrokeShape\n let col = this.getColorKey(this.getNextColor())\n if (stroke.ID)\n this.col2id.set(col, stroke)\n this.renderStroke(stroke.PointArray, col, (stroke.Width + 10) / this.transform.k, 1, stroke.Smooth, stroke.Closed)\n }\n if (shape.Type === ShapeType.Figure) {\n let figure = shape as FigureShape\n let col = this.getColorKey(this.getNextColor())\n\n if (figure.ID)\n this.col2id.set(col, figure)\n this.renderFigure(figure, col, (figure.StrokeWidth + 10) / this.transform.k)\n // this.rects.push([this.getRect(shape), shape])\n }\n\n if ([ShapeType.Text, ShapeType.TextArea, ShapeType.Image, ShapeType.Chart].includes(shape.Type)) {\n //if ([\"text\", \"textarea\", \"image\", \"chart\"].includes(shape.Type)) {\n this.rects.push([this.getRect(shape), shape])\n\n }\n }\n\n this.context.restore()\n }\n\n\n\n getShape(pos: { x: number, y: number }): Shape | undefined {\n\n let posTransform = [pos.x, pos.y]\n\n for (let rect2shape of this.rects) {\n let [rect, shape] = rect2shape;\n let m = AffineTransform.transform2Matrix(shape.transform)\n m = inv(m)\n let pt = AffineTransform.apply(m, [posTransform])[0]\n if (rect.inside({ x: pt[0], y: pt[1] })) return shape\n }\n\n let [x,y] = this.transform.apply([pos.x,pos.y])\n\n let data = this.context.getImageData(x, y, 1, 1).data\n\n\n if (data[3] === 255) {\n let key = this.getColorKey({ r: data[0], g: data[1], b: data[2] })\n return this.col2id.get(key)\n }\n }\n\n // click(x: number, y: number) {\n // console.log(\"click!!\")\n\n // if ([Tool.Select, Tool.TextArea].includes(uiStore.ui.tool)) {\n // const shape = this.getShape({ x, y })\n\n // if (shape) {\n // store.setEditedShape(shape)\n // controller.updateSelection()\n // // store.on(\"render\", ()=> {\n // // console.log(\"###render\", (shape as TextArea).value, this.shapes)\n // // //this.redraw()\n // // })\n // return true\n // }\n // else if (store.board.editedShape) {\n // console.log(\"clear!!!\")\n // store.clearEditedShape()\n // controller.updateSelection()\n // return true\n // }\n // }\n // return false\n\n // }\n\n // drag(x: number, y: number) {\n // if (uiStore.ui.tool === Tool.Erase) {\n // const shape = this.getShape({ x, y })\n // if (shape) {\n // store.removeShape(shape)\n // controller.updateSelection()\n // controller.notifyRemoveShape(shape)\n // undoredo.removeShape(shape)\n\n // }\n\n\n // }\n // return false\n // }\n\n}","import * as d3 from \"d3\";\nimport { controller } from \"../controller/controller\";\nimport { LayerController } from \"../controller/layerController\";\nimport { DynLayer } from \"../layers/DynLayer\";\nimport { LayerBase } from \"../layers/LayerBase\";\nimport { SelectionLayer } from \"../layers/SelectionLayer\";\nimport { Rect } from \"../math/Rect\";\nimport { store } from \"../store/store\";\nimport { Tool, uiStore } from \"../store/UIState\";\nimport \"./LinkAnim.css\";\nimport { Shape, TextShape } from \"../model/shape\";\nimport { logger } from \"../logging/logger\";\n\n\nexport enum Layer {\n Dynamic = 0,\n Staic,\n Selection\n}\n\n\nexport class BoundKonvaBoard {\n\n layers: LayerBase[] = []\n currentTool: Tool = uiStore.ui.tool\n\n transform = d3.zoomIdentity\n baseLayer: LayerBase;\n dynLayer: DynLayer;\n selLayer: SelectionLayer;\n layerController?: LayerController\n\n constructor(private ref: HTMLDivElement) {\n controller.setCanvasBoard(this)\n store.windowInnerHeight = window.innerHeight\n store.windowInnerWidth = window.innerWidth\n\n window.onorientationchange = () => {\n this.createLayers()\n }\n window.onresize = () => {\n this.createLayers()\n store.windowInnerHeight = window.innerHeight\n store.windowInnerWidth = window.innerWidth\n\n }\n this.baseLayer = new LayerBase(this.ref, new Rect(this.ref.getBoundingClientRect()))\n this.selLayer = new SelectionLayer(this.ref, new Rect(this.ref.getBoundingClientRect()))\n this.dynLayer = new DynLayer(this.ref, new Rect(this.ref.getBoundingClientRect()))\n this.createLayers()\n\n\n\n }\n\n zoom = d3.zoom();\n\n createLayers() {\n logger.info(\"createLayers\")\n this.baseLayer.remove()\n this.selLayer.remove()\n this.dynLayer.remove()\n\n this.baseLayer = new LayerBase(this.ref, new Rect(this.ref.getBoundingClientRect()))\n this.selLayer = new SelectionLayer(this.ref, new Rect(this.ref.getBoundingClientRect()))\n this.dynLayer = new DynLayer(this.ref, new Rect(this.ref.getBoundingClientRect()))\n this.setLayers(this.baseLayer, this.selLayer, this.dynLayer)\n\n \n this.zoom = d3.zoom();\n\n if (uiStore.ui.tool !== Tool.Translate)\n this.zoom.filter(function () {\n switch (d3.event.type) {\n case \"mousedown\": return d3.event.which === 3\n case \"wheel\": return true\n case \"touchstart\": return d3.event.touches.length === 2\n case \"touchmove\": return d3.event.touches.length === 2\n case \"touchend\": return true\n default: return false\n }\n })\n this.zoom.on(\"zoom\", () => {\n this.setTransform(d3.event.transform)\n }).on('end', () => {\n\n })\n\n\n let drag = d3.drag()\n .clickDistance(5)\n\n //.subject(dragsubject)\n .on(\"start\", () => {\n let [x, y] = this.baseLayer.transform.invert([d3.event.x, d3.event.y])\n\n controller.layerController?.dragStart(x, y)\n })\n .on(\"drag\", () => {\n let [x, y] = this.baseLayer.transform.invert([d3.event.x, d3.event.y])\n controller.layerController?.drag(x, y)\n\n })\n\n .on(\"start.render drag.render\", () => {\n controller.layerController?.dragRender()\n })\n .on(\"end\", () => {\n let [x, y] = this.baseLayer.transform.invert([d3.event.x, d3.event.y])\n controller.layerController?.dragEnd(x, y)\n\n })\n\n\n\n\n\n d3.select(this.dynLayer.canvas).call(this.zoom);\n d3.select(this.dynLayer.canvas).call(this.zoom.transform, d3.zoomIdentity.translate(this.transform.x, this.transform.y).scale(this.transform.k))\n d3.select(this.dynLayer.canvas).call(drag);\n\n\n d3.select(this.dynLayer.canvas).on(\"click\", () => {\n if (store.boardUI.editedSticker) {\n store.boardUI.editedSticker = undefined\n store.clearEditedShape()\n this.dynLayer.hideTransformer()\n controller.layerController?.updateRenderedFigures()\n\n return\n }\n\n // if (store.editedShape) {\n // controller.layerController?.clearSelection()\n // return\n // }\n let [x, y] = this.baseLayer.transform.invert([d3.event.x, d3.event.y])\n controller.layerController?.click(x, y)\n // for (let layer of this.layers) {\n // if (layer.click(x, y)) break;\n // }\n // for (let layer of this.layers) {\n // layer.redraw()\n // }\n\n\n\n })\n\n this.baseLayer.drawGrid()\n this.baseLayer.render(store.shapes())\n this.selLayer.render(store.shapes())\n if (store.board.editedShape) {\n this.dynLayer.render([store.board.editedShape])\n }\n\n }\n\n onBoardResize = () => {\n this.onToolChange(uiStore.ui.tool)\n\n }\n\n removeLayers() {\n for (let layer of this.layers) layer.remove()\n this.layers = []\n }\n\n setTransform(transform: d3.ZoomTransform) {\n\n this.transform = transform\n store.board.layerTransform = transform\n for (let layer of this.layers) layer.transform = transform\n\n this.updateInputPosition()\n if (uiStore.ui.tool === Tool.Pen) {\n controller.layerController?.updateRenderedFigures()\n }\n\n for (let layer of this.layers) {\n layer.redraw()\n }\n}\n\n\n setLayers(...layers: LayerBase[]) {\n this.removeLayers()\n this.layers = layers\n this.setTransform(this.transform)\n\n }\n\n updateInputPosition() {\n this.selLayer.updateInputPosition()\n }\n\n\n onInputChanged = (evt: Event) => {\n const elem = d3.select('#input-element').node() as HTMLInputElement\n if (store.boardUI.editedText) {\n store.boardUI.editedText.Content = elem.value\n controller.layerController?.redraw()\n }\n\n\n }\n\n onRemoveShape = (shape: Shape) => { for (let layer of this.layers) layer.redraw() }\n onClear = () => {\n this.onToolChange(uiStore.ui.tool)\n }\n\n onToolChange(tool: Tool) {\n if (this.currentTool === Tool.Translate || tool === Tool.Translate) {\n this.createLayers()\n }\n this.currentTool = tool\n }\n getViewBox = () => {\n let rect = this.ref.getBoundingClientRect()\n let p1 = { x: this.transform.invertX(0), y: this.transform.invertY(0) }\n let p2 = { x: this.transform.invertX(rect.width), y: this.transform.invertY(rect.height) }\n let rc = { x: p1.x, y: p1.y, width: p2.x - p1.x, height: p2.y - p1.y }\n\n return new Rect(rc)\n\n\n }\n getBoundingRect = (shape: Shape) => {\n if (this.layers.length > 0) {\n let rc = this.layers[0].getClientTextPoints(shape as TextShape)\n //rc = rc.map(point=>this.layers[0].transform.apply(point))\n return rc\n }\n return [[0, 0]]\n }\n\n updateLayer(layer: Layer) {\n if (layer === Layer.Dynamic)\n this.dynLayer.redraw()\n if (layer === Layer.Staic) {\n this.baseLayer.redraw()\n this.selLayer.redraw()\n }\n }\n\n\n transformer = () => { }\n\n\n}","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport React from \"react\";\n\nvar SvgL3 = function SvgL3(_ref) {\n var svgRef = _ref.svgRef,\n title = _ref.title,\n props = _objectWithoutProperties(_ref, [\"svgRef\", \"title\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n viewBox: \"0 0 100 100\",\n ref: svgRef\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", null, title) : null, /*#__PURE__*/React.createElement(\"rect\", {\n y: 0.49504945,\n x: 0.49504945,\n height: 99.009903,\n width: 99.009903,\n id: \"rect10\",\n style: {\n fill: \"none\",\n stroke: \"#000000\",\n strokeWidth: 6,\n imageRendering: \"optimizeQuality\"\n }\n }), /*#__PURE__*/React.createElement(\"path\", {\n id: \"path3789\",\n d: \"M 6.607143,49.285735 40.714258,16.248846 72.6786,83.038353 95.357262,65.18016\",\n style: {\n fill: \"none\",\n stroke: \"#000000\",\n strokeWidth: 6,\n strokeLinecap: \"butt\",\n strokeLinejoin: \"miter\",\n strokeOpacity: 1\n }\n }));\n};\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(function (props, ref) {\n return /*#__PURE__*/React.createElement(SvgL3, _extends({\n svgRef: ref\n }, props));\n});\nexport default __webpack_public_path__ + \"static/media/l3.7e71dc73.svg\";\nexport { ForwardRef as ReactComponent };","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"circle\", {\n cx: 44.962,\n cy: 10.969,\n r: 5.2263\n});\n\nvar _ref3 = /*#__PURE__*/React.createElement(\"circle\", {\n cx: 11.828,\n cy: 48.745,\n r: 5.2263\n});\n\nvar _ref4 = /*#__PURE__*/React.createElement(\"circle\", {\n cx: 14.828,\n cy: 69.23,\n r: 5.2263\n});\n\nvar _ref5 = /*#__PURE__*/React.createElement(\"circle\", {\n cx: 79.879,\n cy: 80.735,\n r: 5.2263\n});\n\nvar _ref6 = /*#__PURE__*/React.createElement(\"circle\", {\n cx: 67.025,\n cy: 14.804,\n r: 5.2263\n});\n\nvar _ref7 = /*#__PURE__*/React.createElement(\"circle\", {\n cx: 90.625,\n cy: 67.558,\n r: 5.2263\n});\n\nvar SvgSegment = function SvgSegment(_ref) {\n var svgRef = _ref.svgRef,\n title = _ref.title,\n props = _objectWithoutProperties(_ref, [\"svgRef\", \"title\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n viewBox: \"0 0 100 100\",\n ref: svgRef\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", null, title) : null, /*#__PURE__*/React.createElement(\"rect\", {\n x: 0.49505,\n y: 0.49505,\n width: 99.01,\n height: 99.01,\n style: {\n fill: \"none\",\n imageRendering: \"optimizeQuality\",\n strokeWidth: 6,\n stroke: \"#000\"\n }\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"m6.6071 49.286 34.107-33.037 31.964 66.79 22.679-17.858\",\n style: {\n fill: \"none\",\n strokeWidth: 0\n }\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"m11.791 48.515 32.571-36.689\",\n style: {\n fill: \"none\",\n strokeWidth: 5.9981,\n stroke: \"#000\"\n }\n }), /*#__PURE__*/React.createElement(\"path\", {\n d: \"m15.03 68.97 66.061 12\",\n style: {\n fill: \"none\",\n strokeWidth: 5.9981,\n stroke: \"#000\"\n }\n }), _ref2, _ref3, _ref4, _ref5, /*#__PURE__*/React.createElement(\"g\", {\n transform: \"translate(-3.4284 -1.3714)\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n d: \"m66.909 14.545 23.152 52.848\",\n style: {\n fill: \"none\",\n strokeWidth: 5.9981,\n stroke: \"#000\"\n }\n }), _ref6, _ref7));\n};\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(function (props, ref) {\n return /*#__PURE__*/React.createElement(SvgSegment, _extends({\n svgRef: ref\n }, props));\n});\nexport default __webpack_public_path__ + \"static/media/segment.48b638c8.svg\";\nexport { ForwardRef as ReactComponent };","import { faAlignLeft, faArrowsAlt, faChartArea, faCircle, faCog, faEraser, faFont, faHighlighter, faImage, faLaptopCode, faMousePointer, faPen, faPencilAlt, faPlayCircle, faRedo, faShareSquare, faSquare, faStickyNote, faTrash, faUndo, faVideo } from \"@fortawesome/free-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { Trans } from \"@lingui/macro\";\nimport * as d3 from \"d3\";\nimport React from \"react\";\nimport { ReactComponent as L3 } from \"../ikons/l3.svg\";\nimport { ReactComponent as Segment } from \"../ikons/segment.svg\";\nimport { Tool, uiStore } from \"../store/UIState\";\nimport { undoredo } from \"../store/undoredo\";\nimport { ToolConfig } from \"./ToolbarConfig\";\n\n\n\n\nexport enum ButtonId {\n SelectTool = 0,\n TranslateTool,\n PenTool,\n MarkerTool,\n MultilineTool,\n SegmentTool,\n EllipseTool,\n RectagleTool,\n EraseTool,\n ImageTool,\n TextTool,\n TextStickerTool,\n OptsTool,\n UndoTool,\n RedoTool,\n ClearTool,\n PlayTool,\n ShareTool,\n VideoStickerTool,\n TextAreaTool,\n GraphTool,\n HighlightTool,\n CodeStickerTool\n}\n\n\nexport const tools = new Map()\ntools.set(ButtonId.SelectTool, {\n iconElement: (),\n onClick: () => { },\n\n textElement:
Select
,\n tool: Tool.Select\n})\n\n\n\ntools.set(ButtonId.TranslateTool, {\n iconElement: (),\n onClick: () => { },\n\n textElement:
Move
,\n tool: Tool.Translate\n})\n\n\ntools.set(ButtonId.PenTool, {\n iconElement: (),\n onClick: () => { },\n\n textElement:
Pen
,\n tool: Tool.Pen\n\n})\n\ntools.set(ButtonId.HighlightTool, {\n iconElement: (),\n onClick: () => { },\n\n textElement:
Highlight
,\n tool: Tool.Highlight\n\n})\n\ntools.set(ButtonId.MarkerTool, {\n iconElement: (),\n onClick: () => { },\n\n textElement:
Marker
,\n tool: Tool.Marker\n})\ntools.set(ButtonId.MultilineTool, {\n iconElement: (),\n onClick: () => { },\n\n textElement:
Line
,\n tool: Tool.MultiLine\n})\n\ntools.set(ButtonId.SegmentTool, {\n iconElement: (),\n onClick: () => { },\n\n textElement:
Segment
,\n tool: Tool.Segment\n})\n\n\ntools.set(ButtonId.EraseTool, {\n iconElement: (),\n onClick: () => { },\n\n textElement:
Erase
,\n tool: Tool.Erase\n\n})\n\ntools.set(ButtonId.ImageTool, {\n iconElement: (),\n onClick: () => {\n let elem = d3.select(\"#imageUploadPlaceholder\").node() as HTMLInputElement;\n if (elem) elem.click()\n \n uiStore.ui.tool = Tool.Pen\n },\n\n textElement:
Image
,\n // tool: Tool.Image\n\n})\n\n\ntools.set(ButtonId.TextAreaTool, {\n iconElement: (),\n onClick: () => { },\n\n textElement:
Textarea
,\n tool: Tool.TextArea\n})\n\ntools.set(ButtonId.TextTool, {\n iconElement: (),\n onClick: () => { },\n\n textElement:
Text
,\n tool: Tool.Text\n})\n\n\ntools.set(ButtonId.TextStickerTool, {\n iconElement: (),\n onClick: () => { },\n\n textElement:
Sticker
,\n tool: Tool.Sticker\n})\n\ntools.set(ButtonId.VideoStickerTool, {\n iconElement: (),\n onClick: () => { },\n\n textElement:
Video
,\n tool: Tool.StickerVideo\n})\n\n\ntools.set(ButtonId.CodeStickerTool, {\n iconElement: (),\n onClick: () => { },\n\n textElement:
Code
,\n tool: Tool.StickerCode\n})\n\n\ntools.set(ButtonId.OptsTool, {\n iconElement: (),\n onClick: () => { },\n\n textElement:
Opts
,\n\n})\n\ntools.set(ButtonId.UndoTool, {\n iconElement: (),\n onClick: () => { undoredo.undo() },\n\n textElement:
Undo
,\n\n})\ntools.set(ButtonId.RedoTool, {\n iconElement: (),\n onClick: () => { undoredo.redo() },\n\n textElement:
Redo
,\n\n})\n\n\n\n\ntools.set(ButtonId.ClearTool, {\n\n iconElement: (),\n onClick: () => { uiStore.ui.showClearDialog = true },\n\n textElement:
\n Clear\n
,\n})\n\n\n\ntools.set(ButtonId.PlayTool, {\n\n iconElement: (),\n onClick: () => { /*controller.playBoard()*/ },\n\n textElement:
\n Play\n
,\n tool: Tool.Play\n\n\n})\n\n\n\n\n\ntools.set(ButtonId.ShareTool, {\n\n iconElement: (),\n onClick: () => { uiStore.ui.showShareDlg = true },\n textElement: Share,\n\n\n})\n\ntools.set(ButtonId.EllipseTool, {\n iconElement: (),\n onClick: () => { },\n\n textElement: Circle,\n tool: Tool.Ellipse\n})\n\n\ntools.set(ButtonId.RectagleTool, {\n iconElement: (),\n onClick: () => { },\n\n textElement: Rectangle,\n tool: Tool.Rectangle\n})\n\n\ntools.set(ButtonId.GraphTool, {\n iconElement: (),\n onClick: () => { },\n\n textElement: Chart,\n tool: Tool.Chart\n})\n\n\n\n\n","import { Tool } from \"../store/UIState\";\nimport { ButtonId } from \"./Tools\";\n\nexport interface ToolConfig {\n tool?: Tool\n iconElement: JSX.Element\n textElement: JSX.Element\n onClick: () => void\n}\n\nexport interface ToolLineConfig {\n buttonIds: ButtonId[]\n currentButtonId : ButtonId\n selectable?: boolean\n}\n\nexport function createToolLine(tools : ButtonId[], selectable = true) : ToolLineConfig {\n return {\n buttonIds: tools, \n currentButtonId : tools[0], \n selectable\n }\n} \n\nexport interface ToolbarConfig {\n toolLines: ToolLineConfig[]\n}\n\n\nexport function getViewToolbarConfig(): ToolbarConfig {\n return {\n toolLines: [\n createToolLine([ButtonId.TranslateTool],)\n ]\n }\n}\n\nexport function getFullToolbarConfig(isOwner: boolean): ToolbarConfig {\n let height = window.innerHeight;\n if (height > 630) {\n return {\n toolLines: [\n createToolLine([ButtonId.SelectTool, ButtonId.HighlightTool]),\n createToolLine([ButtonId.TranslateTool]),\n createToolLine([ButtonId.PenTool, ButtonId.MarkerTool]),\n createToolLine([ButtonId.MultilineTool, ButtonId.SegmentTool, ButtonId.EllipseTool, ButtonId.RectagleTool]),\n createToolLine([ButtonId.EraseTool]),\n createToolLine([ButtonId.ImageTool]),\n createToolLine([ButtonId.TextTool, ButtonId.TextAreaTool]),\n createToolLine([ButtonId.UndoTool, ButtonId.RedoTool]),\n createToolLine([ButtonId.ClearTool]),\n createToolLine([ButtonId.ShareTool]),\n ]\n }\n } else {\n return {\n toolLines: [\n createToolLine([ButtonId.SelectTool, ButtonId.TranslateTool]),\n createToolLine([ButtonId.PenTool, ButtonId.MarkerTool, ButtonId.MultilineTool, ButtonId.SegmentTool, ButtonId.EllipseTool, ButtonId.RectagleTool]),\n createToolLine([ButtonId.EraseTool]),\n createToolLine( [ButtonId.ImageTool, ButtonId.TextTool, ButtonId.TextAreaTool, ButtonId.TextStickerTool, ButtonId.VideoStickerTool]),\n createToolLine([ButtonId.OptsTool, ButtonId.UndoTool, ButtonId.RedoTool, ButtonId.ClearTool, ButtonId.ShareTool])\n ]\n }\n }\n}\n\n","// import * as d3 from \"d3\";\nimport { ZoomTransform } from \"d3\";\nimport * as d3 from \"d3\"\nimport { IComponent } from \"ihti\";\nimport Long from \"long\";\nimport { autorun, IReactionDisposer, makeObservable, observable, when } from \"mobx\";\nimport { Layer } from \"../components/BoundKonvaBoard\";\nimport { getFullToolbarConfig, getViewToolbarConfig, ToolbarConfig, ToolConfig } from \"../components/ToolbarConfig\";\nimport { ButtonId, tools } from \"../components/Tools\";\nimport { controller } from \"../controller/controller\";\nimport { AccessMode } from \"../model/board\";\nimport { ConnectionState } from \"../model/connectionState\";\nimport { Shape, ShapeType, StickerShape, StrokeShape, TextAreaShape, TextShape } from \"../model/shape\";\nimport { Tool } from \"./UIState\";\n\n// type eventType = \"render\" | \"position\" | \"finish\"\n\n\n\nexport interface User {\n ID? : Long.Long \n name : string\n group : string\n}\n\nexport interface BoardStore {\n name : string\n accessMode : AccessMode\n ownerId : Long.Long\n\n shapes : Shape[]\n stickers: StickerShape[] ;\n highlighStrokes: StrokeShape[]\n dynamicStrokes: StrokeShape[] \n layerTransform : ZoomTransform\n editedShape?: Shape\n\n}\n\nexport interface BoardUIStore {\n editedText?: TextShape\n editedShape?: Shape;\n position : { width: number, height: number, transform: string };\n editedSticker?: StickerShape;\n\n}\n\nexport interface PageStore {\n route : string \n components : IComponent []\n\n}\n\n\n// export const DefaultStrokeParams = {\n// color: \"black\",\n// font: \"Arial\",\n// strokeWidth: 2,\n// smoothFactor: 0,\n// opacity: 0.5,\n// closedShape: false,\n// snap: false,\n// };\n\n\nexport class Store {\n board : BoardStore = {\n name : \"\",\n accessMode : AccessMode.Collaboration,\n ownerId : Long.fromInt(0),\n shapes : [],\n dynamicStrokes : [],\n highlighStrokes : [],\n stickers : [],\n layerTransform : d3.zoomIdentity,\n }\n\n defaultStrokeParam = {\n color: \"black\",\n font: \"Arial\",\n strokeWidth: 2,\n smoothFactor: 0,\n opacity: 0.5,\n closedShape: false,\n snap: false,\n \n }\n\n boardUI : BoardUIStore = {\n position : {width : 0, height : 0, transform :''},\n }\n\n page : PageStore = {\n components : [],\n route : \"\"\n\n }\n\n user: User = {group : \"\", name : \"\", ID: Long.ZERO};\n\n windowInnerHeight = 0;\n windowInnerWidth = 0;\n\n toolbarConfig: ToolbarConfig;\n highlightFocusOthers = true;\n disposer?: IReactionDisposer;\n connectionState: ConnectionState = {\n BoardName : \"\",\n ConnectionID : 0\n };\n\n\n constructor() {\n //this.board is not observable!\n makeObservable(this, {\n user: observable,\n defaultStrokeParam : observable,\n boardUI : observable,\n page : observable,\n windowInnerHeight : observable,\n windowInnerWidth : observable,\n toolbarConfig : observable,\n highlightFocusOthers : observable,\n connectionState : observable\n\n });\n\n this.toolbarConfig = getFullToolbarConfig(true)\n }\n\n clear() {\n this.board.shapes = []\n // this.board.shapes = []\n // this.board.stickers = []\n this.board.stickers = []\n this.clearEditedShape()\n this.boardUI.editedSticker = undefined\n this.board.editedShape = undefined\n\n }\n\n\n\n setEditedShape(shape: Shape) {\n this.clearEditedShape()\n this.board.editedShape = shape\n this.boardUI.editedShape = shape\n this.disposer = undefined\n switch (shape.Type) {\n case ShapeType.Text:\n this.disposer = autorun(() => {\n if (this.boardUI.editedShape) {\n\n const shape = this.board.editedShape as TextShape\n const uiShape = this.boardUI.editedShape as TextShape\n if (shape.Content != uiShape.Content){\n shape.Content = uiShape.Content\n shape.Color = uiShape.Color\n shape.Family = uiShape.Family\n \n controller.board?.updateLayer(Layer.Dynamic)\n controller.socketController?.updateText(shape)\n }\n }\n })\n controller.board?.updateInputPosition()\n break\n case ShapeType.TextArea:\n this.disposer = autorun(() => {\n if (this.boardUI.editedShape) {\n const shape = this.board.editedShape as TextAreaShape\n const uiShape = this.boardUI.editedShape as TextAreaShape\n shape.Content = uiShape.Content\n shape.Color = uiShape.Color\n shape.Family = uiShape.Family\n\n controller.board?.updateLayer(Layer.Dynamic)\n controller.socketController?.updateTextArea(shape)\n }\n })\n controller.board?.updateInputPosition()\n break\n //TODO Reimplement Chart shape type\n // case \"chart\":\n // this.disposer = autorun(() => {\n // if (this.uiEditedShape) {\n // const shape = this.editedShape as WChart\n // const uiShape = this.uiEditedShape as WChart\n // shape.definition = uiShape.definition\n // shape.color = uiShape.color\n\n // controller.board?.updateLayer(Layer.Dynamic)\n // controller.socketController?.updateShape(shape)\n // }\n // })\n // controller.board?.updateInputPosition()\n // break\n\n\n }\n when(() => this.boardUI.editedShape === undefined, () => {\n if (this.disposer) this.disposer()\n })\n }\n\n shapes(excludeEdited = true) {\n if (excludeEdited)\n return this.board.shapes.filter(shape => shape !== this.board.editedShape)\n else {\n return this.board.shapes\n\n }\n }\n\n\n\n clearEditedShape() {\n if (this.boardUI.editedShape && this.boardUI.editedShape.Type === ShapeType.Text && this.board.editedShape) {\n if ((this.boardUI.editedShape as TextShape).Content.length === 0) {\n store.removeShape(this.board.editedShape)\n }\n }\n this.boardUI.editedShape = undefined\n this.board.editedShape = undefined\n\n }\n\n\n\n updateSticker(sticker: StickerShape) {\n let idx = this.board.stickers.findIndex(s => s.ID.equals( sticker.ID))\n if (idx > -1) this.board.stickers[idx] = sticker\n return idx\n }\n\n removeSticker(stickerId: Long.Long) {\n\n let idx = this.board.stickers.findIndex(s => s.ID.equals(stickerId))\n if (idx > -1) {\n this.board.stickers.splice(idx, 1)\n\n }\n\n\n }\n \n\n updateShape(shape: Shape) {\n if (shape.Type === ShapeType.Sticker) {\n this.updateSticker(shape as StickerShape)\n }\n\n let idx = this.board.shapes.findIndex(s => s.ID.equals( shape.ID))\n if (idx > -1) {\n if (store.board.editedShape && store.board.editedShape.ID.equals((this.board.shapes[idx] as Shape).ID)) {\n store.setEditedShape(shape)\n controller.board?.dynLayer.hideTransformer()\n controller.board?.dynLayer.showTransformer(shape)\n controller.layerController?.updateRenderedFigures()\n\n }\n this.board.shapes[idx] = shape\n //if ()\n }\n }\n\n\n\n userCanErase(userId: Long.Long) {\n return true\n // return (\n // (this.boardAccessMode === AccessMode.Collaboration) ||\n // (this.boardAccessMode === AccessMode.Tutor && store.user?.ID.equals( userId)) ||\n // (this.board.OwnerId === store.user?.ID)\n // )\n }\n\n\n updateToolbarConfig() {\n // const isOwner = store.user?.ID.equals( this.boardOwnerId)\n //FIXME Check board owner\n if (true)\n this.toolbarConfig = getFullToolbarConfig(true)\n else {\n switch (store.board.accessMode) {\n case AccessMode.Collaboration:\n case AccessMode.Tutor:\n {\n store.toolbarConfig = getFullToolbarConfig(false)\n break\n }\n\n case AccessMode.Presentation:\n {\n store.toolbarConfig = getViewToolbarConfig()\n controller.setTool((tools.get(ButtonId.TranslateTool) as ToolConfig).tool as Tool)\n break\n\n }\n }\n }\n }\n\n\n addShape(shape: Shape) {\n this.board.shapes.push(shape)\n }\n\n getShape(shapeID: Long.Long) {\n let idx = this.board.shapes.findIndex(s => s.ID .equals( shapeID))\n return store.board.shapes[idx]\n }\n\n removeShape(shape: Shape) {\n this.board.shapes = this.board.shapes.filter(s => s !== shape)\n if (this.board.editedShape?.ID.equals(shape.ID)) {\n this.boardUI.editedShape = undefined\n this.board.editedShape = undefined\n }\n }\n\n\n}\nexport const store = new Store()","import * as d3 from \"d3\";\nimport ReactGA from \"react-ga\";\nimport simplify from 'simplify-js';\nimport { BoundKonvaBoard } from \"../components/BoundKonvaBoard\";\nimport { WChart } from \"../helpers/WChart\";\nimport { store } from \"../store/store\";\nimport { Tool, uiStore } from \"../store/UIState\";\nimport { undoredo } from \"../store/undoredo\";\nimport { controller } from \"./controller\";\nimport { CodeSticker } from \"../model/CodeSticker\";\nimport { Shape, StrokeShape, FigureShape, StickerShape, StickerContentType, ShapeType, TextShape, TextAreaShape, ChartShape, FigureShapeType } from \"../model/shape\";\nimport { simplifyCurve } from \"../helpers/simplify\";\nimport { logger } from \"../logging/logger\";\nimport Long from \"long\"\nexport enum LayerType {\n Static = 0,\n Dynamic,\n Selection\n}\n\nexport class LayerController {\n newStorke?: StrokeShape\n newFigure?: FigureShape\n isDraggingTransformer: boolean\n dragHandleIdx: number\n\n constructor(public board: BoundKonvaBoard) {\n this.isDraggingTransformer = false\n this.dragHandleIdx = -1\n }\n\n setTransform(transform: d3.ZoomTransform) {\n logger.info(\"setTransform\")\n d3.select(this.board.dynLayer.canvas).call(this.board.zoom.transform, transform)\n }\n\n\n dragStart(x: number, y: number) {\n if (this.dragStartTransformer(x, y)) return true\n if (this.dragStartStroke(x, y)) return true\n if (this.dragStartFigure(x, y)) return true\n return false\n }\n\n drag(x: number, y: number) {\n if (this.dragErase(x, y)) return true;\n if (this.dragTransformer(x, y)) return true\n if (this.dragStroke(x, y)) return true\n if (this.dragFigure(x, y)) return true\n\n return false\n\n }\n dragRender() {\n if ([Tool.Pen, Tool.Marker, Tool.MultiLine, Tool.Highlight].includes(uiStore.ui.tool) && (this.newStorke)) {\n this.board.dynLayer.render([this.newStorke])\n }\n if ([Tool.Segment].includes(uiStore.ui.tool) && (this.newStorke)) {\n this.renderDynamicShapes()\n }\n\n if ([Tool.Ellipse, Tool.Rectangle, Tool.TextArea].includes(uiStore.ui.tool) && this.newFigure) {\n this.renderDynamicShapes()\n }\n\n if (this.isDraggingTransformer) {\n this.renderDynamicShapes()\n }\n }\n\n\n dragEnd(x: number, y: number) {\n if (this.dragEndTransformer(x, y)) return true\n if (this.dragEndStroke()) return true\n if (this.dragEndFigure()) return true\n if (this.dragEndTextArea()) return true\n return false\n }\n\n click(x: number, y: number) {\n if (this.clickTransformer(x, y)) return true\n if (this.clickText(x, y)) return true\n if (this.clickTextArea(x, y)) return true\n if (this.clickChart(x, y)) return true\n\n if (this.clickSticker(x, y)) return true\n this.setSelection(undefined)\n\n //this.board.dynLayer.hideTransformer()\n return false\n }\n\n clickTransformer(x: number, y: number) {\n\n if ([Tool.Select, Tool.TextArea].includes(uiStore.ui.tool)) {\n const shape = this.board.selLayer.getShape({ x, y })\n\n if (shape) {\n this.setSelection(shape)\n return true\n }\n }\n return false\n\n\n // return this.board.dynLayer.clickTransformer(x,y)\n }\n\n clickSticker(x: number, y: number) {\n console.log(\"clickSticker\")\n if ([Tool.Sticker, Tool.StickerVideo, Tool.StickerCode].includes(uiStore.ui.tool)) {\n let contentType = \"markdown\"\n switch (uiStore.ui.tool) {\n case Tool.StickerVideo:\n contentType = \"video\"\n break\n case Tool.StickerCode:\n contentType = \"code\"\n break\n }\n\n ReactGA.event({\n category: 'Sticker',\n action: 'Add sticker',\n });\n let sticker: StickerShape = {\n OwnerID : store.user?.ID || Long.NEG_ONE,\n ID : Long.NEG_ONE, \n transform : {sx : 1, sy : 1, tx : x, ty : y, r : 0},\n Width: 300,\n Height: 300,\n Content: \"\",\n StickerContentType : StickerContentType.Markdown,\n FontSize: 14,\n Color: \"lightyellow\",\n Type : ShapeType.Sticker\n\n }\n if (contentType === 'code') {\n sticker = new CodeSticker(sticker)\n }\n\n controller.socketController.addSticker(sticker, (id)=> {\n sticker.ID = id\n controller.socketController.callbacks.addSticker(sticker)\n store.boardUI.editedSticker = store.board.stickers.find(sticker=>sticker.ID.equals( id))\n })\n return true\n }\n return false\n }\n clickText(x: number, y: number) {\n if (uiStore.ui.tool === Tool.Text) {\n ReactGA.event({\n category: 'Text',\n action: 'Add text',\n });\n logger.info(\"LayerController::clickText\")\n\n let text: TextShape = {\n OwnerID : store.user?.ID || Long.NEG_ONE,\n ID : Long.NEG_ONE, \n Family: store.defaultStrokeParam.font,\n Size: 24,\n Color: store.defaultStrokeParam.color,\n Content :\"\",\n transform: { sx: 2, sy: 2, tx: x,ty: y, r: 0 },\n Type : ShapeType.Text, \n }\n\n\n store.addShape(text)\n // controller.notifyAddShape(text)\n controller.socketController.addText(text, (id)=> {text.ID = id})\n this.setSelection(text)\n undoredo.addShape(text)\n return true\n }\n return false\n\n }\n\n clickTextArea(x: number, y: number) {\n if (uiStore.ui.tool === Tool.TextArea) {\n ReactGA.event({\n category: 'TextArea',\n action: 'Add text area',\n });\n\n let textArea: TextAreaShape = {\n OwnerID : store.user?.ID || Long.NEG_ONE,\n ID : Long.NEG_ONE,\n Family: store.defaultStrokeParam.font,\n Size: 24,\n Color: store.defaultStrokeParam.color,\n Style: \"bold\",\n Content: \"\",\n transform: { sx: 1, sy: 1, tx: x, ty: y, r: 0 },\n Type : ShapeType.TextArea,\n Width: 300,\n Height: 300\n }\n store.addShape(textArea)\n controller.socketController.addTextArea(textArea, (id)=> {textArea.ID = id})\n this.setSelection(textArea)\n undoredo.addShape(textArea)\n return true\n }\n return false\n\n }\n\n clickChart(x: number, y: number) {\n if (uiStore.ui.tool === Tool.Chart) {\n ReactGA.event({\n category: 'Chart',\n action: 'Add chart',\n });\n\n const chart: ChartShape = {\n OwnerID : store.user?.ID || Long.NEG_ONE,\n ID : Long.NEG_ONE, \n Color: store.defaultStrokeParam.color,\n LineWidth: store.defaultStrokeParam.strokeWidth,\n Opacity: 1,\n Definition: \"x=sin(range(100)/10);plot(x)\",\n transform: { sx: 1, sy: 1, tx: x, ty: y, r: 0 },\n Type: ShapeType.Chart,\n //userId: uiStore.user?.id || 0,\n // timestamp: new Date(),\n Width: 300,\n Height: 300\n }\n\n const wchart = new WChart(chart)\n store.addShape(wchart)\n controller.socketController.addWChart(wchart.chart(), (id)=>wchart.ID=id)\n this.setSelection(wchart)\n undoredo.addShape(wchart)\n return true\n }\n return false\n\n }\n\n\n dragStartTransformer(x: number, y: number) {\n if (this.board.dynLayer.dragStartTransformer(x, y)) {\n this.isDraggingTransformer = true\n return true\n } else {\n this.isDraggingTransformer = false\n return false\n }\n\n\n }\n\n\n\n dragTransformer(x: number, y: number) {\n if (this.board.dynLayer.dragTransformer(x, y)) {\n this.redraw([LayerType.Dynamic])\n return true\n } else\n return false\n\n }\n dragEndTransformer(x: number, y: number) {\n return this.board.dynLayer.dragEndTransformer(x, y)\n\n }\n\n dragStartFigure(x: number, y: number) {\n if ([Tool.Ellipse, Tool.Rectangle, Tool.TextArea].includes(uiStore.ui.tool)) {\n\n let shapeType: FigureShapeType;\n switch (uiStore.ui.tool) {\n case Tool.Ellipse:\n shapeType = FigureShapeType.Ellipse\n break\n case Tool.Rectangle:\n shapeType = FigureShapeType.Rectangle\n break\n default:\n shapeType = FigureShapeType.Rectangle\n }\n\n this.newFigure = {\n OwnerID : store.user?.ID || Long.NEG_ONE,\n ID : Long.NEG_ONE, \n Type : ShapeType.Figure,\n //timestamp: new Date(),\n Color: store.defaultStrokeParam.color,\n Opacity: uiStore.ui.tool === Tool.Marker ? 0.5 : 1,\n transform: { sx: 1, sy: 1, tx: x, ty: y, r: 0 },\n Fill: false,\n StrokeWidth: store.defaultStrokeParam.strokeWidth,\n Height: 0,\n Width: 0,\n ShapeType: shapeType\n // type: \"figure\",\n // userId: uiStore.user?.id\n // || 0\n }\n this.board.dynLayer.render([this.newFigure])\n return true\n }\n return false\n }\n dragStartStroke(x: number, y: number) {\n if ([Tool.Pen, Tool.Marker, Tool.MultiLine, Tool.Segment, Tool.Highlight].includes(uiStore.ui.tool)) {\n\n if (uiStore.ui.tool === Tool.Segment && store.defaultStrokeParam.snap) {\n x = Math.round(x / 20) * 20\n y = Math.round(y / 20) * 20\n }\n this.newStorke = {\n OwnerID : store.user?.ID || Long.NEG_ONE,\n ID : Long.NEG_ONE, \n // timestamp: new Date(),\n PointArray: [],\n Color: store.defaultStrokeParam.color,\n Opacity: [Tool.Marker, Tool.MultiLine].includes(uiStore.ui.tool)? store.defaultStrokeParam.opacity : 1,\n Smooth: store.defaultStrokeParam.smoothFactor > 0,\n transform: { sx: 1, sy: 1, tx: 0, ty: 0, r: 0 },\n Type: uiStore.ui.tool === Tool.Highlight ? ShapeType.Highlight : ShapeType.Stroke,\n Width: uiStore.ui.tool === Tool.Pen ? store.defaultStrokeParam.strokeWidth : store.defaultStrokeParam.strokeWidth * 2,\n Closed: false,\n // userId: uiStore.user?.id || 0\n }\n\n if (uiStore.ui.tool === Tool.Highlight) this.newStorke.Width *= 2\n this.newStorke.PointArray.push([ x, y ])\n this.board.dynLayer.render([this.newStorke])\n return true\n }\n return false\n }\n\n private dragErase(x: number, y: number) {\n if (uiStore.ui.tool === Tool.Erase) {\n const shape = this.board.selLayer.getShape({ x, y })\n\n\n if (shape) {\n return controller.deleteShape(shape)\n\n }\n }\n return false\n }\n\n\n private dragFigure(x: number, y: number) {\n if ([Tool.Ellipse, Tool.Rectangle, Tool.TextArea].includes(uiStore.ui.tool) && this.newFigure) {\n const width = x - this.newFigure.transform.tx;\n const height = y - this.newFigure.transform.ty;\n this.newFigure.Width = width;\n this.newFigure.Height = height;\n return true\n }\n return false\n }\n\n private dragStroke(x: number, y: number) {\n if ([Tool.Pen, Tool.Marker, Tool.MultiLine, Tool.Highlight].includes(uiStore.ui.tool) && this.newStorke) {\n this.newStorke.PointArray.push([x, y ]);\n return true\n }\n else if (uiStore.ui.tool === Tool.Segment && this.newStorke) {\n if (store.defaultStrokeParam.snap) {\n x = Math.round(x / 20) * 20;\n y = Math.round(y / 20) * 20;\n }\n this.newStorke.PointArray[1] = ( [x, y] );\n return true\n }\n return false\n }\n private dragEndTextArea() {\n if (uiStore.ui.tool === Tool.TextArea && this.newFigure) {\n const newFigure = this.newFigure;\n this.addTextArea(newFigure);\n this.newFigure = undefined;\n return true\n }\n return false\n }\n\n private dragEndFigure() {\n if ([Tool.Ellipse, Tool.Rectangle].includes(uiStore.ui.tool) && this.newFigure) {\n this.addFigure(this.newFigure);\n return true\n }\n return false\n }\n\n\n private dragEndStroke() {\n if ([Tool.Pen, Tool.Marker, Tool.MultiLine, Tool.Segment].includes(uiStore.ui.tool) && this.newStorke) {\n store.board.dynamicStrokes.push(this.newStorke)\n const stroke = this.newStorke;\n this.addStroke(stroke);\n\n this.newStorke = undefined;\n if ([Tool.Pen, Tool.Marker, Tool.MultiLine].includes(uiStore.ui.tool) && store.defaultStrokeParam.closedShape) {\n this.updateRenderedFigures()\n }\n\n if (store.defaultStrokeParam.smoothFactor > 0) this.renderDynamicShapes()\n\n\n return true\n }\n if (uiStore.ui.tool === Tool.Highlight && this.newStorke) {\n const stroke = this.newStorke\n stroke.PointArray = simplifyCurve(stroke.PointArray);\n stroke.Smooth = true\n\n this.newStorke = undefined\n store.board.highlighStrokes.push(stroke)\n controller.socketController.addHighlight(stroke, store.highlightFocusOthers)\n this.renderHighlight()\n\n }\n\n return false\n }\n intervalHandler?: number\n\n renderHighlight() { \n if (!this.intervalHandler) {\n this.intervalHandler = setInterval(() => this.renderHighlight(), 30)\n } else {\n store.board.highlighStrokes.forEach(stroke => stroke.Opacity -= 0.02)\n store.board.highlighStrokes = store.board.highlighStrokes.filter(stroke => stroke.Opacity > 0)\n this.renderDynamicShapes()\n if (store.board.highlighStrokes.length === 0) {\n clearInterval(this.intervalHandler)\n this.intervalHandler = undefined\n }\n\n\n }\n }\n\n renderDynamicShapes() {\n const dynamicShapes: Shape[] = [...store.board.highlighStrokes, ...store.board.dynamicStrokes]\n if (this.newFigure) dynamicShapes.push(this.newFigure)\n if (this.newStorke) dynamicShapes.push(this.newStorke)\n if (store.board.editedShape) dynamicShapes.push(store.board.editedShape)\n this.board.dynLayer.clear()\n this.board.dynLayer.render(dynamicShapes)\n }\n\n\n private addTextArea(newFigure: FigureShape) {\n if (newFigure.Width > 5 && newFigure.Height > 5) {\n const ta: TextAreaShape = {\n OwnerID : store.user?.ID || Long.NEG_ONE,\n ID : Long.NEG_ONE, \n Color: newFigure.Color,\n Family: store.defaultStrokeParam.font,\n Height: newFigure.Height,\n Width: newFigure.Width,\n Size: 24,\n Style: \"\",\n transform: newFigure.transform,\n Type: ShapeType.TextArea,\n //userId: newFigure.userId,\n Content: \"\",\n };\n store.addShape(ta);\n\n controller.socketController.addTextArea(ta, (id)=> ta.ID =id)\n undoredo.addShape(ta)\n this.setSelection(ta)\n\n this.redraw()\n\n }\n }\n\n\n redraw(which: LayerType[] = []) {\n if (which.length === 0) {\n this.board.baseLayer.redraw()\n this.board.selLayer.redraw()\n this.board.dynLayer.redraw()\n } else {\n for (let layer of which) {\n switch (layer) {\n case LayerType.Dynamic:\n this.board.dynLayer.redraw()\n break\n case LayerType.Selection:\n this.board.selLayer.redraw()\n break\n case LayerType.Static:\n this.board.baseLayer.redraw()\n break\n }\n }\n }\n }\n\n private addFigure(figure: FigureShape) {\n ReactGA.event({\n category: 'Figure',\n action: 'Add figure',\n });\n\n store.addShape(figure);\n\n controller.socketController.addFigure(figure, (id)=>figure.ID = id)\n undoredo.addShape(figure)\n this.updateRenderedFigures()\n }\n\n private addStroke(stroke: StrokeShape) {\n ReactGA.event({\n category: 'Stroke',\n action: 'Add stroke',\n });\n if (store.defaultStrokeParam.smoothFactor > 0 && (uiStore.ui.tool === Tool.Pen || uiStore.ui.tool === Tool.Marker)) {\n let C = store.defaultStrokeParam.smoothFactor * 3;\n stroke.PointArray = simplifyCurve(stroke.PointArray, C, C > 10 ? true : false);\n let p1 = stroke.PointArray[0];\n let p2 = stroke.PointArray[stroke.PointArray.length - 1];\n if ((p2[0] - p1[0]) * (p2[0] - p1[0]) + (p2[1] - p1[1]) * (p2[1] - p1[1]) < C * C && stroke.PointArray.length > 2) {\n stroke.PointArray.pop();\n }\n }\n else if (uiStore.ui.tool === Tool.MultiLine) {\n stroke.PointArray = simplifyCurve(stroke.PointArray, 30, true);\n stroke.Smooth = false;\n if (store.defaultStrokeParam.snap) {\n stroke.PointArray = stroke.PointArray.map((point) => {\n return [Math.round(point[0] / 20) * 20, Math.round(point[1] / 20) * 20]\n });\n }\n }\n stroke.Closed = store.defaultStrokeParam.closedShape;\n if (stroke.PointArray.length === 2)\n stroke.Closed = false;\n\n store.addShape(stroke);\n controller.socketController.addStroke(stroke, (id )=> stroke.ID = id)\n undoredo.addShape(stroke)\n if (uiStore.ui.tool !== Tool.Pen) this.updateRenderedFigures()\n }\n\n\n\n updateRenderedFigures() {\n const allShapes = store.shapes()\n logger.info({message: \"updateRenderedFigures\", data: {shapeLength : allShapes.length}})\n this.board.baseLayer.clear()\n this.board.dynLayer.clear()\n this.board.selLayer.clear()\n store.board.dynamicStrokes = []\n\n this.board.baseLayer.render(store.shapes())\n this.board.selLayer.render(store.shapes(false))\n\n if (store.board.editedShape) {\n //this.board.dynLayer.updateTransformer()\n this.renderDynamicShapes()\n\n }\n else\n this.board.dynLayer.render([])\n }\n\n\n\n setSelection(shape?: Shape) {\n if (shape) {\n // if ([\"text\", \"textarea\", \"image\", \"chart\", \"sticker\"].includes(shape.type)) {\n if ([ShapeType.Text, ShapeType.TextArea, ShapeType.Image, ShapeType.Chart, ShapeType.Sticker].includes(shape.Type)) {\n this.board.dynLayer.showTransformer(shape)\n store.setEditedShape(shape)\n } else {\n store.clearEditedShape()\n\n }\n } else {\n this.board.dynLayer.hideTransformer()\n store.clearEditedShape()\n\n\n }\n this.updateRenderedFigures()\n\n }\n\n\n updateShape(shape : Shape) {\n if (this.board.dynLayer.transformedShape?.ID.equals(shape.ID)){\n this.board.dynLayer.updateTransformerShape(shape)\n this.redraw([LayerType.Dynamic])\n }\n this.updateRenderedFigures()\n }\n}","import { observable, makeObservable } from \"mobx\";\nimport { CodeComponent } from \"./ui/def\";\nimport { StickerShape, StickerContentType, ShapeType, Transform } from \"./shape\";\n\nexport class CodeSticker implements StickerShape {\n ID: Long.Long\n //timestamp: Date\n transform: Transform\n Width: number;\n Height: number;\n Content: string;\n StickerContentType: StickerContentType.Code\n FontSize: number;\n Color: string;\n Type: ShapeType.Sticker;\n OwnerID : Long.Long\n result?: CodeComponent;\n error?: string;\n\n constructor(sticker: StickerShape) {\n makeObservable(this, {\n result: observable,\n error: observable\n });\n\n this.ID = sticker.ID\n this.OwnerID = sticker.OwnerID\n this.transform = sticker.transform\n this.Width = sticker.Width\n this.Height = sticker.Height\n this.Content = sticker.Content\n this.FontSize = sticker.FontSize\n this.Color = sticker.Color\n this.Type = sticker.Type\n this.StickerContentType = StickerContentType.Code\n }\n\n static split(content: string) {\n const definitions = content.split('!!!/')\n return definitions.map((definition, idx) => {\n if (idx === 0) return { path: \"/\", definition }\n else {\n const idx = definition.indexOf('\\n')\n return { path: definition.substr(0, idx), definition: definition.substr(idx + 1) }\n }\n })\n\n }\n\n static join(pathDefinitions: { path: string, definition: string }[]) {\n const content = pathDefinitions.map((pathDefinition, idx) => {\n if (idx > 0) { return \"!!!/\" + pathDefinition.path + \"\\n\" + pathDefinition.definition }\n else return pathDefinition.definition\n }).join(\"\\n\")\n return content\n }\n\n\n}","import simplify from \"simplify-js\";\n\nexport function simplifyCurve(points: number[][], tolerance = 3, highQuality = false): number[][] {\n\n return simplify(points.map(p => ({ x: p[0], y: p[1] })), tolerance, highQuality).map(p => [p.x, p.y])\n}","/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/\nimport * as $protobuf from \"protobufjs/minimal\";\n\n// Common aliases\nconst $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;\n\n// Exported root namespace\nconst $root = $protobuf.roots[\"default\"] || ($protobuf.roots[\"default\"] = {});\n\nexport const wjite = $root.wjite = (() => {\n\n /**\n * Namespace wjite.\n * @exports wjite\n * @namespace\n */\n const wjite = {};\n\n wjite.message = (function() {\n\n /**\n * Namespace message.\n * @memberof wjite\n * @namespace\n */\n const message = {};\n\n message.Transform = (function() {\n\n /**\n * Properties of a Transform.\n * @memberof wjite.message\n * @interface ITransform\n * @property {number|null} [sx] Transform sx\n * @property {number|null} [sy] Transform sy\n * @property {number|null} [tx] Transform tx\n * @property {number|null} [ty] Transform ty\n * @property {number|null} [r] Transform r\n */\n\n /**\n * Constructs a new Transform.\n * @memberof wjite.message\n * @classdesc Represents a Transform.\n * @implements ITransform\n * @constructor\n * @param {wjite.message.ITransform=} [properties] Properties to set\n */\n function Transform(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Transform sx.\n * @member {number} sx\n * @memberof wjite.message.Transform\n * @instance\n */\n Transform.prototype.sx = 0;\n\n /**\n * Transform sy.\n * @member {number} sy\n * @memberof wjite.message.Transform\n * @instance\n */\n Transform.prototype.sy = 0;\n\n /**\n * Transform tx.\n * @member {number} tx\n * @memberof wjite.message.Transform\n * @instance\n */\n Transform.prototype.tx = 0;\n\n /**\n * Transform ty.\n * @member {number} ty\n * @memberof wjite.message.Transform\n * @instance\n */\n Transform.prototype.ty = 0;\n\n /**\n * Transform r.\n * @member {number} r\n * @memberof wjite.message.Transform\n * @instance\n */\n Transform.prototype.r = 0;\n\n /**\n * Creates a new Transform instance using the specified properties.\n * @function create\n * @memberof wjite.message.Transform\n * @static\n * @param {wjite.message.ITransform=} [properties] Properties to set\n * @returns {wjite.message.Transform} Transform instance\n */\n Transform.create = function create(properties) {\n return new Transform(properties);\n };\n\n /**\n * Encodes the specified Transform message. Does not implicitly {@link wjite.message.Transform.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.Transform\n * @static\n * @param {wjite.message.ITransform} message Transform message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Transform.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.sx != null && Object.hasOwnProperty.call(message, \"sx\"))\n writer.uint32(/* id 1, wireType 5 =*/13).float(message.sx);\n if (message.sy != null && Object.hasOwnProperty.call(message, \"sy\"))\n writer.uint32(/* id 2, wireType 5 =*/21).float(message.sy);\n if (message.tx != null && Object.hasOwnProperty.call(message, \"tx\"))\n writer.uint32(/* id 3, wireType 5 =*/29).float(message.tx);\n if (message.ty != null && Object.hasOwnProperty.call(message, \"ty\"))\n writer.uint32(/* id 4, wireType 5 =*/37).float(message.ty);\n if (message.r != null && Object.hasOwnProperty.call(message, \"r\"))\n writer.uint32(/* id 5, wireType 5 =*/45).float(message.r);\n return writer;\n };\n\n /**\n * Encodes the specified Transform message, length delimited. Does not implicitly {@link wjite.message.Transform.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.Transform\n * @static\n * @param {wjite.message.ITransform} message Transform message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Transform.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Transform message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.Transform\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.Transform} Transform\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Transform.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.Transform();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n message.sx = reader.float();\n break;\n case 2:\n message.sy = reader.float();\n break;\n case 3:\n message.tx = reader.float();\n break;\n case 4:\n message.ty = reader.float();\n break;\n case 5:\n message.r = reader.float();\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Transform message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.Transform\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.Transform} Transform\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Transform.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Transform message.\n * @function verify\n * @memberof wjite.message.Transform\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Transform.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.sx != null && message.hasOwnProperty(\"sx\"))\n if (typeof message.sx !== \"number\")\n return \"sx: number expected\";\n if (message.sy != null && message.hasOwnProperty(\"sy\"))\n if (typeof message.sy !== \"number\")\n return \"sy: number expected\";\n if (message.tx != null && message.hasOwnProperty(\"tx\"))\n if (typeof message.tx !== \"number\")\n return \"tx: number expected\";\n if (message.ty != null && message.hasOwnProperty(\"ty\"))\n if (typeof message.ty !== \"number\")\n return \"ty: number expected\";\n if (message.r != null && message.hasOwnProperty(\"r\"))\n if (typeof message.r !== \"number\")\n return \"r: number expected\";\n return null;\n };\n\n /**\n * Creates a Transform message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.Transform\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.Transform} Transform\n */\n Transform.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.Transform)\n return object;\n let message = new $root.wjite.message.Transform();\n if (object.sx != null)\n message.sx = Number(object.sx);\n if (object.sy != null)\n message.sy = Number(object.sy);\n if (object.tx != null)\n message.tx = Number(object.tx);\n if (object.ty != null)\n message.ty = Number(object.ty);\n if (object.r != null)\n message.r = Number(object.r);\n return message;\n };\n\n /**\n * Creates a plain object from a Transform message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.Transform\n * @static\n * @param {wjite.message.Transform} message Transform\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Transform.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults) {\n object.sx = 0;\n object.sy = 0;\n object.tx = 0;\n object.ty = 0;\n object.r = 0;\n }\n if (message.sx != null && message.hasOwnProperty(\"sx\"))\n object.sx = options.json && !isFinite(message.sx) ? String(message.sx) : message.sx;\n if (message.sy != null && message.hasOwnProperty(\"sy\"))\n object.sy = options.json && !isFinite(message.sy) ? String(message.sy) : message.sy;\n if (message.tx != null && message.hasOwnProperty(\"tx\"))\n object.tx = options.json && !isFinite(message.tx) ? String(message.tx) : message.tx;\n if (message.ty != null && message.hasOwnProperty(\"ty\"))\n object.ty = options.json && !isFinite(message.ty) ? String(message.ty) : message.ty;\n if (message.r != null && message.hasOwnProperty(\"r\"))\n object.r = options.json && !isFinite(message.r) ? String(message.r) : message.r;\n return object;\n };\n\n /**\n * Converts this Transform to JSON.\n * @function toJSON\n * @memberof wjite.message.Transform\n * @instance\n * @returns {Object.} JSON object\n */\n Transform.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return Transform;\n })();\n\n message.Stroke = (function() {\n\n /**\n * Properties of a Stroke.\n * @memberof wjite.message\n * @interface IStroke\n * @property {Array.|null} [points] Stroke points\n * @property {string|null} [color] Stroke color\n * @property {number|null} [width] Stroke width\n * @property {number|null} [opacity] Stroke opacity\n * @property {boolean|null} [smooth] Stroke smooth\n * @property {boolean|null} [closed] Stroke closed\n */\n\n /**\n * Constructs a new Stroke.\n * @memberof wjite.message\n * @classdesc Represents a Stroke.\n * @implements IStroke\n * @constructor\n * @param {wjite.message.IStroke=} [properties] Properties to set\n */\n function Stroke(properties) {\n this.points = [];\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Stroke points.\n * @member {Array.} points\n * @memberof wjite.message.Stroke\n * @instance\n */\n Stroke.prototype.points = $util.emptyArray;\n\n /**\n * Stroke color.\n * @member {string} color\n * @memberof wjite.message.Stroke\n * @instance\n */\n Stroke.prototype.color = \"\";\n\n /**\n * Stroke width.\n * @member {number} width\n * @memberof wjite.message.Stroke\n * @instance\n */\n Stroke.prototype.width = 0;\n\n /**\n * Stroke opacity.\n * @member {number} opacity\n * @memberof wjite.message.Stroke\n * @instance\n */\n Stroke.prototype.opacity = 0;\n\n /**\n * Stroke smooth.\n * @member {boolean} smooth\n * @memberof wjite.message.Stroke\n * @instance\n */\n Stroke.prototype.smooth = false;\n\n /**\n * Stroke closed.\n * @member {boolean} closed\n * @memberof wjite.message.Stroke\n * @instance\n */\n Stroke.prototype.closed = false;\n\n /**\n * Creates a new Stroke instance using the specified properties.\n * @function create\n * @memberof wjite.message.Stroke\n * @static\n * @param {wjite.message.IStroke=} [properties] Properties to set\n * @returns {wjite.message.Stroke} Stroke instance\n */\n Stroke.create = function create(properties) {\n return new Stroke(properties);\n };\n\n /**\n * Encodes the specified Stroke message. Does not implicitly {@link wjite.message.Stroke.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.Stroke\n * @static\n * @param {wjite.message.IStroke} message Stroke message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Stroke.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.points != null && message.points.length)\n for (let i = 0; i < message.points.length; ++i)\n $root.wjite.message.Stroke.Point.encode(message.points[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n if (message.color != null && Object.hasOwnProperty.call(message, \"color\"))\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.color);\n if (message.width != null && Object.hasOwnProperty.call(message, \"width\"))\n writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.width);\n if (message.opacity != null && Object.hasOwnProperty.call(message, \"opacity\"))\n writer.uint32(/* id 4, wireType 5 =*/37).float(message.opacity);\n if (message.smooth != null && Object.hasOwnProperty.call(message, \"smooth\"))\n writer.uint32(/* id 5, wireType 0 =*/40).bool(message.smooth);\n if (message.closed != null && Object.hasOwnProperty.call(message, \"closed\"))\n writer.uint32(/* id 6, wireType 0 =*/48).bool(message.closed);\n return writer;\n };\n\n /**\n * Encodes the specified Stroke message, length delimited. Does not implicitly {@link wjite.message.Stroke.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.Stroke\n * @static\n * @param {wjite.message.IStroke} message Stroke message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Stroke.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Stroke message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.Stroke\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.Stroke} Stroke\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Stroke.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.Stroke();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n if (!(message.points && message.points.length))\n message.points = [];\n message.points.push($root.wjite.message.Stroke.Point.decode(reader, reader.uint32()));\n break;\n case 2:\n message.color = reader.string();\n break;\n case 3:\n message.width = reader.uint32();\n break;\n case 4:\n message.opacity = reader.float();\n break;\n case 5:\n message.smooth = reader.bool();\n break;\n case 6:\n message.closed = reader.bool();\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Stroke message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.Stroke\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.Stroke} Stroke\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Stroke.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Stroke message.\n * @function verify\n * @memberof wjite.message.Stroke\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Stroke.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.points != null && message.hasOwnProperty(\"points\")) {\n if (!Array.isArray(message.points))\n return \"points: array expected\";\n for (let i = 0; i < message.points.length; ++i) {\n let error = $root.wjite.message.Stroke.Point.verify(message.points[i]);\n if (error)\n return \"points.\" + error;\n }\n }\n if (message.color != null && message.hasOwnProperty(\"color\"))\n if (!$util.isString(message.color))\n return \"color: string expected\";\n if (message.width != null && message.hasOwnProperty(\"width\"))\n if (!$util.isInteger(message.width))\n return \"width: integer expected\";\n if (message.opacity != null && message.hasOwnProperty(\"opacity\"))\n if (typeof message.opacity !== \"number\")\n return \"opacity: number expected\";\n if (message.smooth != null && message.hasOwnProperty(\"smooth\"))\n if (typeof message.smooth !== \"boolean\")\n return \"smooth: boolean expected\";\n if (message.closed != null && message.hasOwnProperty(\"closed\"))\n if (typeof message.closed !== \"boolean\")\n return \"closed: boolean expected\";\n return null;\n };\n\n /**\n * Creates a Stroke message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.Stroke\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.Stroke} Stroke\n */\n Stroke.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.Stroke)\n return object;\n let message = new $root.wjite.message.Stroke();\n if (object.points) {\n if (!Array.isArray(object.points))\n throw TypeError(\".wjite.message.Stroke.points: array expected\");\n message.points = [];\n for (let i = 0; i < object.points.length; ++i) {\n if (typeof object.points[i] !== \"object\")\n throw TypeError(\".wjite.message.Stroke.points: object expected\");\n message.points[i] = $root.wjite.message.Stroke.Point.fromObject(object.points[i]);\n }\n }\n if (object.color != null)\n message.color = String(object.color);\n if (object.width != null)\n message.width = object.width >>> 0;\n if (object.opacity != null)\n message.opacity = Number(object.opacity);\n if (object.smooth != null)\n message.smooth = Boolean(object.smooth);\n if (object.closed != null)\n message.closed = Boolean(object.closed);\n return message;\n };\n\n /**\n * Creates a plain object from a Stroke message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.Stroke\n * @static\n * @param {wjite.message.Stroke} message Stroke\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Stroke.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.arrays || options.defaults)\n object.points = [];\n if (options.defaults) {\n object.color = \"\";\n object.width = 0;\n object.opacity = 0;\n object.smooth = false;\n object.closed = false;\n }\n if (message.points && message.points.length) {\n object.points = [];\n for (let j = 0; j < message.points.length; ++j)\n object.points[j] = $root.wjite.message.Stroke.Point.toObject(message.points[j], options);\n }\n if (message.color != null && message.hasOwnProperty(\"color\"))\n object.color = message.color;\n if (message.width != null && message.hasOwnProperty(\"width\"))\n object.width = message.width;\n if (message.opacity != null && message.hasOwnProperty(\"opacity\"))\n object.opacity = options.json && !isFinite(message.opacity) ? String(message.opacity) : message.opacity;\n if (message.smooth != null && message.hasOwnProperty(\"smooth\"))\n object.smooth = message.smooth;\n if (message.closed != null && message.hasOwnProperty(\"closed\"))\n object.closed = message.closed;\n return object;\n };\n\n /**\n * Converts this Stroke to JSON.\n * @function toJSON\n * @memberof wjite.message.Stroke\n * @instance\n * @returns {Object.} JSON object\n */\n Stroke.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n Stroke.Point = (function() {\n\n /**\n * Properties of a Point.\n * @memberof wjite.message.Stroke\n * @interface IPoint\n * @property {number|null} [x] Point x\n * @property {number|null} [y] Point y\n */\n\n /**\n * Constructs a new Point.\n * @memberof wjite.message.Stroke\n * @classdesc Represents a Point.\n * @implements IPoint\n * @constructor\n * @param {wjite.message.Stroke.IPoint=} [properties] Properties to set\n */\n function Point(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Point x.\n * @member {number} x\n * @memberof wjite.message.Stroke.Point\n * @instance\n */\n Point.prototype.x = 0;\n\n /**\n * Point y.\n * @member {number} y\n * @memberof wjite.message.Stroke.Point\n * @instance\n */\n Point.prototype.y = 0;\n\n /**\n * Creates a new Point instance using the specified properties.\n * @function create\n * @memberof wjite.message.Stroke.Point\n * @static\n * @param {wjite.message.Stroke.IPoint=} [properties] Properties to set\n * @returns {wjite.message.Stroke.Point} Point instance\n */\n Point.create = function create(properties) {\n return new Point(properties);\n };\n\n /**\n * Encodes the specified Point message. Does not implicitly {@link wjite.message.Stroke.Point.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.Stroke.Point\n * @static\n * @param {wjite.message.Stroke.IPoint} message Point message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Point.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.x != null && Object.hasOwnProperty.call(message, \"x\"))\n writer.uint32(/* id 1, wireType 5 =*/13).float(message.x);\n if (message.y != null && Object.hasOwnProperty.call(message, \"y\"))\n writer.uint32(/* id 2, wireType 5 =*/21).float(message.y);\n return writer;\n };\n\n /**\n * Encodes the specified Point message, length delimited. Does not implicitly {@link wjite.message.Stroke.Point.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.Stroke.Point\n * @static\n * @param {wjite.message.Stroke.IPoint} message Point message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Point.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Point message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.Stroke.Point\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.Stroke.Point} Point\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Point.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.Stroke.Point();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n message.x = reader.float();\n break;\n case 2:\n message.y = reader.float();\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Point message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.Stroke.Point\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.Stroke.Point} Point\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Point.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Point message.\n * @function verify\n * @memberof wjite.message.Stroke.Point\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Point.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.x != null && message.hasOwnProperty(\"x\"))\n if (typeof message.x !== \"number\")\n return \"x: number expected\";\n if (message.y != null && message.hasOwnProperty(\"y\"))\n if (typeof message.y !== \"number\")\n return \"y: number expected\";\n return null;\n };\n\n /**\n * Creates a Point message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.Stroke.Point\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.Stroke.Point} Point\n */\n Point.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.Stroke.Point)\n return object;\n let message = new $root.wjite.message.Stroke.Point();\n if (object.x != null)\n message.x = Number(object.x);\n if (object.y != null)\n message.y = Number(object.y);\n return message;\n };\n\n /**\n * Creates a plain object from a Point message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.Stroke.Point\n * @static\n * @param {wjite.message.Stroke.Point} message Point\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Point.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults) {\n object.x = 0;\n object.y = 0;\n }\n if (message.x != null && message.hasOwnProperty(\"x\"))\n object.x = options.json && !isFinite(message.x) ? String(message.x) : message.x;\n if (message.y != null && message.hasOwnProperty(\"y\"))\n object.y = options.json && !isFinite(message.y) ? String(message.y) : message.y;\n return object;\n };\n\n /**\n * Converts this Point to JSON.\n * @function toJSON\n * @memberof wjite.message.Stroke.Point\n * @instance\n * @returns {Object.} JSON object\n */\n Point.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return Point;\n })();\n\n return Stroke;\n })();\n\n message.Figure = (function() {\n\n /**\n * Properties of a Figure.\n * @memberof wjite.message\n * @interface IFigure\n * @property {wjite.message.Figure.Type|null} [figureType] Figure figureType\n * @property {string|null} [color] Figure color\n * @property {number|null} [opacity] Figure opacity\n * @property {number|null} [width] Figure width\n * @property {number|null} [height] Figure height\n * @property {number|null} [strokeWidth] Figure strokeWidth\n * @property {boolean|null} [fill] Figure fill\n */\n\n /**\n * Constructs a new Figure.\n * @memberof wjite.message\n * @classdesc Represents a Figure.\n * @implements IFigure\n * @constructor\n * @param {wjite.message.IFigure=} [properties] Properties to set\n */\n function Figure(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Figure figureType.\n * @member {wjite.message.Figure.Type} figureType\n * @memberof wjite.message.Figure\n * @instance\n */\n Figure.prototype.figureType = 0;\n\n /**\n * Figure color.\n * @member {string} color\n * @memberof wjite.message.Figure\n * @instance\n */\n Figure.prototype.color = \"\";\n\n /**\n * Figure opacity.\n * @member {number} opacity\n * @memberof wjite.message.Figure\n * @instance\n */\n Figure.prototype.opacity = 0;\n\n /**\n * Figure width.\n * @member {number} width\n * @memberof wjite.message.Figure\n * @instance\n */\n Figure.prototype.width = 0;\n\n /**\n * Figure height.\n * @member {number} height\n * @memberof wjite.message.Figure\n * @instance\n */\n Figure.prototype.height = 0;\n\n /**\n * Figure strokeWidth.\n * @member {number} strokeWidth\n * @memberof wjite.message.Figure\n * @instance\n */\n Figure.prototype.strokeWidth = 0;\n\n /**\n * Figure fill.\n * @member {boolean} fill\n * @memberof wjite.message.Figure\n * @instance\n */\n Figure.prototype.fill = false;\n\n /**\n * Creates a new Figure instance using the specified properties.\n * @function create\n * @memberof wjite.message.Figure\n * @static\n * @param {wjite.message.IFigure=} [properties] Properties to set\n * @returns {wjite.message.Figure} Figure instance\n */\n Figure.create = function create(properties) {\n return new Figure(properties);\n };\n\n /**\n * Encodes the specified Figure message. Does not implicitly {@link wjite.message.Figure.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.Figure\n * @static\n * @param {wjite.message.IFigure} message Figure message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Figure.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.figureType != null && Object.hasOwnProperty.call(message, \"figureType\"))\n writer.uint32(/* id 2, wireType 0 =*/16).int32(message.figureType);\n if (message.color != null && Object.hasOwnProperty.call(message, \"color\"))\n writer.uint32(/* id 3, wireType 2 =*/26).string(message.color);\n if (message.opacity != null && Object.hasOwnProperty.call(message, \"opacity\"))\n writer.uint32(/* id 4, wireType 5 =*/37).float(message.opacity);\n if (message.width != null && Object.hasOwnProperty.call(message, \"width\"))\n writer.uint32(/* id 5, wireType 5 =*/45).float(message.width);\n if (message.height != null && Object.hasOwnProperty.call(message, \"height\"))\n writer.uint32(/* id 6, wireType 5 =*/53).float(message.height);\n if (message.strokeWidth != null && Object.hasOwnProperty.call(message, \"strokeWidth\"))\n writer.uint32(/* id 7, wireType 0 =*/56).uint32(message.strokeWidth);\n if (message.fill != null && Object.hasOwnProperty.call(message, \"fill\"))\n writer.uint32(/* id 8, wireType 0 =*/64).bool(message.fill);\n return writer;\n };\n\n /**\n * Encodes the specified Figure message, length delimited. Does not implicitly {@link wjite.message.Figure.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.Figure\n * @static\n * @param {wjite.message.IFigure} message Figure message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Figure.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Figure message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.Figure\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.Figure} Figure\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Figure.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.Figure();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 2:\n message.figureType = reader.int32();\n break;\n case 3:\n message.color = reader.string();\n break;\n case 4:\n message.opacity = reader.float();\n break;\n case 5:\n message.width = reader.float();\n break;\n case 6:\n message.height = reader.float();\n break;\n case 7:\n message.strokeWidth = reader.uint32();\n break;\n case 8:\n message.fill = reader.bool();\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Figure message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.Figure\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.Figure} Figure\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Figure.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Figure message.\n * @function verify\n * @memberof wjite.message.Figure\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Figure.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.figureType != null && message.hasOwnProperty(\"figureType\"))\n switch (message.figureType) {\n default:\n return \"figureType: enum value expected\";\n case 0:\n case 1:\n break;\n }\n if (message.color != null && message.hasOwnProperty(\"color\"))\n if (!$util.isString(message.color))\n return \"color: string expected\";\n if (message.opacity != null && message.hasOwnProperty(\"opacity\"))\n if (typeof message.opacity !== \"number\")\n return \"opacity: number expected\";\n if (message.width != null && message.hasOwnProperty(\"width\"))\n if (typeof message.width !== \"number\")\n return \"width: number expected\";\n if (message.height != null && message.hasOwnProperty(\"height\"))\n if (typeof message.height !== \"number\")\n return \"height: number expected\";\n if (message.strokeWidth != null && message.hasOwnProperty(\"strokeWidth\"))\n if (!$util.isInteger(message.strokeWidth))\n return \"strokeWidth: integer expected\";\n if (message.fill != null && message.hasOwnProperty(\"fill\"))\n if (typeof message.fill !== \"boolean\")\n return \"fill: boolean expected\";\n return null;\n };\n\n /**\n * Creates a Figure message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.Figure\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.Figure} Figure\n */\n Figure.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.Figure)\n return object;\n let message = new $root.wjite.message.Figure();\n switch (object.figureType) {\n case \"Rectangle\":\n case 0:\n message.figureType = 0;\n break;\n case \"Ellipse\":\n case 1:\n message.figureType = 1;\n break;\n }\n if (object.color != null)\n message.color = String(object.color);\n if (object.opacity != null)\n message.opacity = Number(object.opacity);\n if (object.width != null)\n message.width = Number(object.width);\n if (object.height != null)\n message.height = Number(object.height);\n if (object.strokeWidth != null)\n message.strokeWidth = object.strokeWidth >>> 0;\n if (object.fill != null)\n message.fill = Boolean(object.fill);\n return message;\n };\n\n /**\n * Creates a plain object from a Figure message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.Figure\n * @static\n * @param {wjite.message.Figure} message Figure\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Figure.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults) {\n object.figureType = options.enums === String ? \"Rectangle\" : 0;\n object.color = \"\";\n object.opacity = 0;\n object.width = 0;\n object.height = 0;\n object.strokeWidth = 0;\n object.fill = false;\n }\n if (message.figureType != null && message.hasOwnProperty(\"figureType\"))\n object.figureType = options.enums === String ? $root.wjite.message.Figure.Type[message.figureType] : message.figureType;\n if (message.color != null && message.hasOwnProperty(\"color\"))\n object.color = message.color;\n if (message.opacity != null && message.hasOwnProperty(\"opacity\"))\n object.opacity = options.json && !isFinite(message.opacity) ? String(message.opacity) : message.opacity;\n if (message.width != null && message.hasOwnProperty(\"width\"))\n object.width = options.json && !isFinite(message.width) ? String(message.width) : message.width;\n if (message.height != null && message.hasOwnProperty(\"height\"))\n object.height = options.json && !isFinite(message.height) ? String(message.height) : message.height;\n if (message.strokeWidth != null && message.hasOwnProperty(\"strokeWidth\"))\n object.strokeWidth = message.strokeWidth;\n if (message.fill != null && message.hasOwnProperty(\"fill\"))\n object.fill = message.fill;\n return object;\n };\n\n /**\n * Converts this Figure to JSON.\n * @function toJSON\n * @memberof wjite.message.Figure\n * @instance\n * @returns {Object.} JSON object\n */\n Figure.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Type enum.\n * @name wjite.message.Figure.Type\n * @enum {number}\n * @property {number} Rectangle=0 Rectangle value\n * @property {number} Ellipse=1 Ellipse value\n */\n Figure.Type = (function() {\n const valuesById = {}, values = Object.create(valuesById);\n values[valuesById[0] = \"Rectangle\"] = 0;\n values[valuesById[1] = \"Ellipse\"] = 1;\n return values;\n })();\n\n return Figure;\n })();\n\n message.Text = (function() {\n\n /**\n * Properties of a Text.\n * @memberof wjite.message\n * @interface IText\n * @property {string|null} [content] Text content\n * @property {string|null} [color] Text color\n * @property {string|null} [family] Text family\n * @property {number|null} [size] Text size\n */\n\n /**\n * Constructs a new Text.\n * @memberof wjite.message\n * @classdesc Represents a Text.\n * @implements IText\n * @constructor\n * @param {wjite.message.IText=} [properties] Properties to set\n */\n function Text(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Text content.\n * @member {string} content\n * @memberof wjite.message.Text\n * @instance\n */\n Text.prototype.content = \"\";\n\n /**\n * Text color.\n * @member {string} color\n * @memberof wjite.message.Text\n * @instance\n */\n Text.prototype.color = \"\";\n\n /**\n * Text family.\n * @member {string} family\n * @memberof wjite.message.Text\n * @instance\n */\n Text.prototype.family = \"\";\n\n /**\n * Text size.\n * @member {number} size\n * @memberof wjite.message.Text\n * @instance\n */\n Text.prototype.size = 0;\n\n /**\n * Creates a new Text instance using the specified properties.\n * @function create\n * @memberof wjite.message.Text\n * @static\n * @param {wjite.message.IText=} [properties] Properties to set\n * @returns {wjite.message.Text} Text instance\n */\n Text.create = function create(properties) {\n return new Text(properties);\n };\n\n /**\n * Encodes the specified Text message. Does not implicitly {@link wjite.message.Text.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.Text\n * @static\n * @param {wjite.message.IText} message Text message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Text.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.content != null && Object.hasOwnProperty.call(message, \"content\"))\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.content);\n if (message.color != null && Object.hasOwnProperty.call(message, \"color\"))\n writer.uint32(/* id 3, wireType 2 =*/26).string(message.color);\n if (message.family != null && Object.hasOwnProperty.call(message, \"family\"))\n writer.uint32(/* id 4, wireType 2 =*/34).string(message.family);\n if (message.size != null && Object.hasOwnProperty.call(message, \"size\"))\n writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.size);\n return writer;\n };\n\n /**\n * Encodes the specified Text message, length delimited. Does not implicitly {@link wjite.message.Text.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.Text\n * @static\n * @param {wjite.message.IText} message Text message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Text.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Text message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.Text\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.Text} Text\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Text.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.Text();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 2:\n message.content = reader.string();\n break;\n case 3:\n message.color = reader.string();\n break;\n case 4:\n message.family = reader.string();\n break;\n case 5:\n message.size = reader.uint32();\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Text message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.Text\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.Text} Text\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Text.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Text message.\n * @function verify\n * @memberof wjite.message.Text\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Text.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.content != null && message.hasOwnProperty(\"content\"))\n if (!$util.isString(message.content))\n return \"content: string expected\";\n if (message.color != null && message.hasOwnProperty(\"color\"))\n if (!$util.isString(message.color))\n return \"color: string expected\";\n if (message.family != null && message.hasOwnProperty(\"family\"))\n if (!$util.isString(message.family))\n return \"family: string expected\";\n if (message.size != null && message.hasOwnProperty(\"size\"))\n if (!$util.isInteger(message.size))\n return \"size: integer expected\";\n return null;\n };\n\n /**\n * Creates a Text message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.Text\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.Text} Text\n */\n Text.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.Text)\n return object;\n let message = new $root.wjite.message.Text();\n if (object.content != null)\n message.content = String(object.content);\n if (object.color != null)\n message.color = String(object.color);\n if (object.family != null)\n message.family = String(object.family);\n if (object.size != null)\n message.size = object.size >>> 0;\n return message;\n };\n\n /**\n * Creates a plain object from a Text message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.Text\n * @static\n * @param {wjite.message.Text} message Text\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Text.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults) {\n object.content = \"\";\n object.color = \"\";\n object.family = \"\";\n object.size = 0;\n }\n if (message.content != null && message.hasOwnProperty(\"content\"))\n object.content = message.content;\n if (message.color != null && message.hasOwnProperty(\"color\"))\n object.color = message.color;\n if (message.family != null && message.hasOwnProperty(\"family\"))\n object.family = message.family;\n if (message.size != null && message.hasOwnProperty(\"size\"))\n object.size = message.size;\n return object;\n };\n\n /**\n * Converts this Text to JSON.\n * @function toJSON\n * @memberof wjite.message.Text\n * @instance\n * @returns {Object.} JSON object\n */\n Text.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return Text;\n })();\n\n message.TextArea = (function() {\n\n /**\n * Properties of a TextArea.\n * @memberof wjite.message\n * @interface ITextArea\n * @property {string|null} [content] TextArea content\n * @property {string|null} [family] TextArea family\n * @property {number|null} [size] TextArea size\n * @property {string|null} [style] TextArea style\n * @property {string|null} [color] TextArea color\n * @property {number|null} [width] TextArea width\n * @property {number|null} [height] TextArea height\n */\n\n /**\n * Constructs a new TextArea.\n * @memberof wjite.message\n * @classdesc Represents a TextArea.\n * @implements ITextArea\n * @constructor\n * @param {wjite.message.ITextArea=} [properties] Properties to set\n */\n function TextArea(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * TextArea content.\n * @member {string} content\n * @memberof wjite.message.TextArea\n * @instance\n */\n TextArea.prototype.content = \"\";\n\n /**\n * TextArea family.\n * @member {string} family\n * @memberof wjite.message.TextArea\n * @instance\n */\n TextArea.prototype.family = \"\";\n\n /**\n * TextArea size.\n * @member {number} size\n * @memberof wjite.message.TextArea\n * @instance\n */\n TextArea.prototype.size = 0;\n\n /**\n * TextArea style.\n * @member {string} style\n * @memberof wjite.message.TextArea\n * @instance\n */\n TextArea.prototype.style = \"\";\n\n /**\n * TextArea color.\n * @member {string} color\n * @memberof wjite.message.TextArea\n * @instance\n */\n TextArea.prototype.color = \"\";\n\n /**\n * TextArea width.\n * @member {number} width\n * @memberof wjite.message.TextArea\n * @instance\n */\n TextArea.prototype.width = 0;\n\n /**\n * TextArea height.\n * @member {number} height\n * @memberof wjite.message.TextArea\n * @instance\n */\n TextArea.prototype.height = 0;\n\n /**\n * Creates a new TextArea instance using the specified properties.\n * @function create\n * @memberof wjite.message.TextArea\n * @static\n * @param {wjite.message.ITextArea=} [properties] Properties to set\n * @returns {wjite.message.TextArea} TextArea instance\n */\n TextArea.create = function create(properties) {\n return new TextArea(properties);\n };\n\n /**\n * Encodes the specified TextArea message. Does not implicitly {@link wjite.message.TextArea.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.TextArea\n * @static\n * @param {wjite.message.ITextArea} message TextArea message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TextArea.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.content != null && Object.hasOwnProperty.call(message, \"content\"))\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.content);\n if (message.family != null && Object.hasOwnProperty.call(message, \"family\"))\n writer.uint32(/* id 3, wireType 2 =*/26).string(message.family);\n if (message.size != null && Object.hasOwnProperty.call(message, \"size\"))\n writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.size);\n if (message.style != null && Object.hasOwnProperty.call(message, \"style\"))\n writer.uint32(/* id 5, wireType 2 =*/42).string(message.style);\n if (message.color != null && Object.hasOwnProperty.call(message, \"color\"))\n writer.uint32(/* id 6, wireType 2 =*/50).string(message.color);\n if (message.width != null && Object.hasOwnProperty.call(message, \"width\"))\n writer.uint32(/* id 7, wireType 5 =*/61).float(message.width);\n if (message.height != null && Object.hasOwnProperty.call(message, \"height\"))\n writer.uint32(/* id 8, wireType 5 =*/69).float(message.height);\n return writer;\n };\n\n /**\n * Encodes the specified TextArea message, length delimited. Does not implicitly {@link wjite.message.TextArea.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.TextArea\n * @static\n * @param {wjite.message.ITextArea} message TextArea message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TextArea.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a TextArea message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.TextArea\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.TextArea} TextArea\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TextArea.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.TextArea();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 2:\n message.content = reader.string();\n break;\n case 3:\n message.family = reader.string();\n break;\n case 4:\n message.size = reader.uint32();\n break;\n case 5:\n message.style = reader.string();\n break;\n case 6:\n message.color = reader.string();\n break;\n case 7:\n message.width = reader.float();\n break;\n case 8:\n message.height = reader.float();\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a TextArea message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.TextArea\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.TextArea} TextArea\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TextArea.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a TextArea message.\n * @function verify\n * @memberof wjite.message.TextArea\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n TextArea.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.content != null && message.hasOwnProperty(\"content\"))\n if (!$util.isString(message.content))\n return \"content: string expected\";\n if (message.family != null && message.hasOwnProperty(\"family\"))\n if (!$util.isString(message.family))\n return \"family: string expected\";\n if (message.size != null && message.hasOwnProperty(\"size\"))\n if (!$util.isInteger(message.size))\n return \"size: integer expected\";\n if (message.style != null && message.hasOwnProperty(\"style\"))\n if (!$util.isString(message.style))\n return \"style: string expected\";\n if (message.color != null && message.hasOwnProperty(\"color\"))\n if (!$util.isString(message.color))\n return \"color: string expected\";\n if (message.width != null && message.hasOwnProperty(\"width\"))\n if (typeof message.width !== \"number\")\n return \"width: number expected\";\n if (message.height != null && message.hasOwnProperty(\"height\"))\n if (typeof message.height !== \"number\")\n return \"height: number expected\";\n return null;\n };\n\n /**\n * Creates a TextArea message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.TextArea\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.TextArea} TextArea\n */\n TextArea.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.TextArea)\n return object;\n let message = new $root.wjite.message.TextArea();\n if (object.content != null)\n message.content = String(object.content);\n if (object.family != null)\n message.family = String(object.family);\n if (object.size != null)\n message.size = object.size >>> 0;\n if (object.style != null)\n message.style = String(object.style);\n if (object.color != null)\n message.color = String(object.color);\n if (object.width != null)\n message.width = Number(object.width);\n if (object.height != null)\n message.height = Number(object.height);\n return message;\n };\n\n /**\n * Creates a plain object from a TextArea message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.TextArea\n * @static\n * @param {wjite.message.TextArea} message TextArea\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n TextArea.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults) {\n object.content = \"\";\n object.family = \"\";\n object.size = 0;\n object.style = \"\";\n object.color = \"\";\n object.width = 0;\n object.height = 0;\n }\n if (message.content != null && message.hasOwnProperty(\"content\"))\n object.content = message.content;\n if (message.family != null && message.hasOwnProperty(\"family\"))\n object.family = message.family;\n if (message.size != null && message.hasOwnProperty(\"size\"))\n object.size = message.size;\n if (message.style != null && message.hasOwnProperty(\"style\"))\n object.style = message.style;\n if (message.color != null && message.hasOwnProperty(\"color\"))\n object.color = message.color;\n if (message.width != null && message.hasOwnProperty(\"width\"))\n object.width = options.json && !isFinite(message.width) ? String(message.width) : message.width;\n if (message.height != null && message.hasOwnProperty(\"height\"))\n object.height = options.json && !isFinite(message.height) ? String(message.height) : message.height;\n return object;\n };\n\n /**\n * Converts this TextArea to JSON.\n * @function toJSON\n * @memberof wjite.message.TextArea\n * @instance\n * @returns {Object.} JSON object\n */\n TextArea.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return TextArea;\n })();\n\n message.Sticker = (function() {\n\n /**\n * Properties of a Sticker.\n * @memberof wjite.message\n * @interface ISticker\n * @property {wjite.message.Sticker.Type|null} [contentType] Sticker contentType\n * @property {string|null} [content] Sticker content\n * @property {number|null} [width] Sticker width\n * @property {number|null} [height] Sticker height\n * @property {number|null} [fontSize] Sticker fontSize\n * @property {string|null} [color] Sticker color\n */\n\n /**\n * Constructs a new Sticker.\n * @memberof wjite.message\n * @classdesc Represents a Sticker.\n * @implements ISticker\n * @constructor\n * @param {wjite.message.ISticker=} [properties] Properties to set\n */\n function Sticker(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Sticker contentType.\n * @member {wjite.message.Sticker.Type} contentType\n * @memberof wjite.message.Sticker\n * @instance\n */\n Sticker.prototype.contentType = 0;\n\n /**\n * Sticker content.\n * @member {string} content\n * @memberof wjite.message.Sticker\n * @instance\n */\n Sticker.prototype.content = \"\";\n\n /**\n * Sticker width.\n * @member {number} width\n * @memberof wjite.message.Sticker\n * @instance\n */\n Sticker.prototype.width = 0;\n\n /**\n * Sticker height.\n * @member {number} height\n * @memberof wjite.message.Sticker\n * @instance\n */\n Sticker.prototype.height = 0;\n\n /**\n * Sticker fontSize.\n * @member {number} fontSize\n * @memberof wjite.message.Sticker\n * @instance\n */\n Sticker.prototype.fontSize = 0;\n\n /**\n * Sticker color.\n * @member {string} color\n * @memberof wjite.message.Sticker\n * @instance\n */\n Sticker.prototype.color = \"\";\n\n /**\n * Creates a new Sticker instance using the specified properties.\n * @function create\n * @memberof wjite.message.Sticker\n * @static\n * @param {wjite.message.ISticker=} [properties] Properties to set\n * @returns {wjite.message.Sticker} Sticker instance\n */\n Sticker.create = function create(properties) {\n return new Sticker(properties);\n };\n\n /**\n * Encodes the specified Sticker message. Does not implicitly {@link wjite.message.Sticker.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.Sticker\n * @static\n * @param {wjite.message.ISticker} message Sticker message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Sticker.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.contentType != null && Object.hasOwnProperty.call(message, \"contentType\"))\n writer.uint32(/* id 2, wireType 0 =*/16).int32(message.contentType);\n if (message.content != null && Object.hasOwnProperty.call(message, \"content\"))\n writer.uint32(/* id 3, wireType 2 =*/26).string(message.content);\n if (message.width != null && Object.hasOwnProperty.call(message, \"width\"))\n writer.uint32(/* id 8, wireType 5 =*/69).float(message.width);\n if (message.height != null && Object.hasOwnProperty.call(message, \"height\"))\n writer.uint32(/* id 9, wireType 5 =*/77).float(message.height);\n if (message.fontSize != null && Object.hasOwnProperty.call(message, \"fontSize\"))\n writer.uint32(/* id 10, wireType 0 =*/80).uint32(message.fontSize);\n if (message.color != null && Object.hasOwnProperty.call(message, \"color\"))\n writer.uint32(/* id 11, wireType 2 =*/90).string(message.color);\n return writer;\n };\n\n /**\n * Encodes the specified Sticker message, length delimited. Does not implicitly {@link wjite.message.Sticker.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.Sticker\n * @static\n * @param {wjite.message.ISticker} message Sticker message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Sticker.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Sticker message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.Sticker\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.Sticker} Sticker\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Sticker.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.Sticker();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 2:\n message.contentType = reader.int32();\n break;\n case 3:\n message.content = reader.string();\n break;\n case 8:\n message.width = reader.float();\n break;\n case 9:\n message.height = reader.float();\n break;\n case 10:\n message.fontSize = reader.uint32();\n break;\n case 11:\n message.color = reader.string();\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Sticker message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.Sticker\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.Sticker} Sticker\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Sticker.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Sticker message.\n * @function verify\n * @memberof wjite.message.Sticker\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Sticker.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.contentType != null && message.hasOwnProperty(\"contentType\"))\n switch (message.contentType) {\n default:\n return \"contentType: enum value expected\";\n case 0:\n case 1:\n case 2:\n break;\n }\n if (message.content != null && message.hasOwnProperty(\"content\"))\n if (!$util.isString(message.content))\n return \"content: string expected\";\n if (message.width != null && message.hasOwnProperty(\"width\"))\n if (typeof message.width !== \"number\")\n return \"width: number expected\";\n if (message.height != null && message.hasOwnProperty(\"height\"))\n if (typeof message.height !== \"number\")\n return \"height: number expected\";\n if (message.fontSize != null && message.hasOwnProperty(\"fontSize\"))\n if (!$util.isInteger(message.fontSize))\n return \"fontSize: integer expected\";\n if (message.color != null && message.hasOwnProperty(\"color\"))\n if (!$util.isString(message.color))\n return \"color: string expected\";\n return null;\n };\n\n /**\n * Creates a Sticker message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.Sticker\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.Sticker} Sticker\n */\n Sticker.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.Sticker)\n return object;\n let message = new $root.wjite.message.Sticker();\n switch (object.contentType) {\n case \"Markdown\":\n case 0:\n message.contentType = 0;\n break;\n case \"Code\":\n case 1:\n message.contentType = 1;\n break;\n case \"Video\":\n case 2:\n message.contentType = 2;\n break;\n }\n if (object.content != null)\n message.content = String(object.content);\n if (object.width != null)\n message.width = Number(object.width);\n if (object.height != null)\n message.height = Number(object.height);\n if (object.fontSize != null)\n message.fontSize = object.fontSize >>> 0;\n if (object.color != null)\n message.color = String(object.color);\n return message;\n };\n\n /**\n * Creates a plain object from a Sticker message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.Sticker\n * @static\n * @param {wjite.message.Sticker} message Sticker\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Sticker.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults) {\n object.contentType = options.enums === String ? \"Markdown\" : 0;\n object.content = \"\";\n object.width = 0;\n object.height = 0;\n object.fontSize = 0;\n object.color = \"\";\n }\n if (message.contentType != null && message.hasOwnProperty(\"contentType\"))\n object.contentType = options.enums === String ? $root.wjite.message.Sticker.Type[message.contentType] : message.contentType;\n if (message.content != null && message.hasOwnProperty(\"content\"))\n object.content = message.content;\n if (message.width != null && message.hasOwnProperty(\"width\"))\n object.width = options.json && !isFinite(message.width) ? String(message.width) : message.width;\n if (message.height != null && message.hasOwnProperty(\"height\"))\n object.height = options.json && !isFinite(message.height) ? String(message.height) : message.height;\n if (message.fontSize != null && message.hasOwnProperty(\"fontSize\"))\n object.fontSize = message.fontSize;\n if (message.color != null && message.hasOwnProperty(\"color\"))\n object.color = message.color;\n return object;\n };\n\n /**\n * Converts this Sticker to JSON.\n * @function toJSON\n * @memberof wjite.message.Sticker\n * @instance\n * @returns {Object.} JSON object\n */\n Sticker.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Type enum.\n * @name wjite.message.Sticker.Type\n * @enum {number}\n * @property {number} Markdown=0 Markdown value\n * @property {number} Code=1 Code value\n * @property {number} Video=2 Video value\n */\n Sticker.Type = (function() {\n const valuesById = {}, values = Object.create(valuesById);\n values[valuesById[0] = \"Markdown\"] = 0;\n values[valuesById[1] = \"Code\"] = 1;\n values[valuesById[2] = \"Video\"] = 2;\n return values;\n })();\n\n return Sticker;\n })();\n\n message.Image = (function() {\n\n /**\n * Properties of an Image.\n * @memberof wjite.message\n * @interface IImage\n * @property {string|null} [src] Image src\n * @property {Uint8Array|null} [blob] Image blob\n */\n\n /**\n * Constructs a new Image.\n * @memberof wjite.message\n * @classdesc Represents an Image.\n * @implements IImage\n * @constructor\n * @param {wjite.message.IImage=} [properties] Properties to set\n */\n function Image(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Image src.\n * @member {string} src\n * @memberof wjite.message.Image\n * @instance\n */\n Image.prototype.src = \"\";\n\n /**\n * Image blob.\n * @member {Uint8Array} blob\n * @memberof wjite.message.Image\n * @instance\n */\n Image.prototype.blob = $util.newBuffer([]);\n\n /**\n * Creates a new Image instance using the specified properties.\n * @function create\n * @memberof wjite.message.Image\n * @static\n * @param {wjite.message.IImage=} [properties] Properties to set\n * @returns {wjite.message.Image} Image instance\n */\n Image.create = function create(properties) {\n return new Image(properties);\n };\n\n /**\n * Encodes the specified Image message. Does not implicitly {@link wjite.message.Image.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.Image\n * @static\n * @param {wjite.message.IImage} message Image message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Image.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.src != null && Object.hasOwnProperty.call(message, \"src\"))\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.src);\n if (message.blob != null && Object.hasOwnProperty.call(message, \"blob\"))\n writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.blob);\n return writer;\n };\n\n /**\n * Encodes the specified Image message, length delimited. Does not implicitly {@link wjite.message.Image.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.Image\n * @static\n * @param {wjite.message.IImage} message Image message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Image.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes an Image message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.Image\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.Image} Image\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Image.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.Image();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 2:\n message.src = reader.string();\n break;\n case 3:\n message.blob = reader.bytes();\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes an Image message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.Image\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.Image} Image\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Image.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies an Image message.\n * @function verify\n * @memberof wjite.message.Image\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Image.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.src != null && message.hasOwnProperty(\"src\"))\n if (!$util.isString(message.src))\n return \"src: string expected\";\n if (message.blob != null && message.hasOwnProperty(\"blob\"))\n if (!(message.blob && typeof message.blob.length === \"number\" || $util.isString(message.blob)))\n return \"blob: buffer expected\";\n return null;\n };\n\n /**\n * Creates an Image message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.Image\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.Image} Image\n */\n Image.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.Image)\n return object;\n let message = new $root.wjite.message.Image();\n if (object.src != null)\n message.src = String(object.src);\n if (object.blob != null)\n if (typeof object.blob === \"string\")\n $util.base64.decode(object.blob, message.blob = $util.newBuffer($util.base64.length(object.blob)), 0);\n else if (object.blob.length)\n message.blob = object.blob;\n return message;\n };\n\n /**\n * Creates a plain object from an Image message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.Image\n * @static\n * @param {wjite.message.Image} message Image\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Image.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults) {\n object.src = \"\";\n if (options.bytes === String)\n object.blob = \"\";\n else {\n object.blob = [];\n if (options.bytes !== Array)\n object.blob = $util.newBuffer(object.blob);\n }\n }\n if (message.src != null && message.hasOwnProperty(\"src\"))\n object.src = message.src;\n if (message.blob != null && message.hasOwnProperty(\"blob\"))\n object.blob = options.bytes === String ? $util.base64.encode(message.blob, 0, message.blob.length) : options.bytes === Array ? Array.prototype.slice.call(message.blob) : message.blob;\n return object;\n };\n\n /**\n * Converts this Image to JSON.\n * @function toJSON\n * @memberof wjite.message.Image\n * @instance\n * @returns {Object.} JSON object\n */\n Image.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return Image;\n })();\n\n message.Shape = (function() {\n\n /**\n * Properties of a Shape.\n * @memberof wjite.message\n * @interface IShape\n * @property {Long|null} [ID] Shape ID\n * @property {Long|null} [ownerID] Shape ownerID\n * @property {wjite.message.ITransform|null} [transform] Shape transform\n * @property {wjite.message.IStroke|null} [stroke] Shape stroke\n * @property {wjite.message.IFigure|null} [figure] Shape figure\n * @property {wjite.message.IText|null} [text] Shape text\n * @property {wjite.message.ITextArea|null} [textArea] Shape textArea\n * @property {wjite.message.ISticker|null} [sticker] Shape sticker\n * @property {wjite.message.IImage|null} [image] Shape image\n */\n\n /**\n * Constructs a new Shape.\n * @memberof wjite.message\n * @classdesc Represents a Shape.\n * @implements IShape\n * @constructor\n * @param {wjite.message.IShape=} [properties] Properties to set\n */\n function Shape(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Shape ID.\n * @member {Long} ID\n * @memberof wjite.message.Shape\n * @instance\n */\n Shape.prototype.ID = $util.Long ? $util.Long.fromBits(0,0,true) : 0;\n\n /**\n * Shape ownerID.\n * @member {Long} ownerID\n * @memberof wjite.message.Shape\n * @instance\n */\n Shape.prototype.ownerID = $util.Long ? $util.Long.fromBits(0,0,true) : 0;\n\n /**\n * Shape transform.\n * @member {wjite.message.ITransform|null|undefined} transform\n * @memberof wjite.message.Shape\n * @instance\n */\n Shape.prototype.transform = null;\n\n /**\n * Shape stroke.\n * @member {wjite.message.IStroke|null|undefined} stroke\n * @memberof wjite.message.Shape\n * @instance\n */\n Shape.prototype.stroke = null;\n\n /**\n * Shape figure.\n * @member {wjite.message.IFigure|null|undefined} figure\n * @memberof wjite.message.Shape\n * @instance\n */\n Shape.prototype.figure = null;\n\n /**\n * Shape text.\n * @member {wjite.message.IText|null|undefined} text\n * @memberof wjite.message.Shape\n * @instance\n */\n Shape.prototype.text = null;\n\n /**\n * Shape textArea.\n * @member {wjite.message.ITextArea|null|undefined} textArea\n * @memberof wjite.message.Shape\n * @instance\n */\n Shape.prototype.textArea = null;\n\n /**\n * Shape sticker.\n * @member {wjite.message.ISticker|null|undefined} sticker\n * @memberof wjite.message.Shape\n * @instance\n */\n Shape.prototype.sticker = null;\n\n /**\n * Shape image.\n * @member {wjite.message.IImage|null|undefined} image\n * @memberof wjite.message.Shape\n * @instance\n */\n Shape.prototype.image = null;\n\n // OneOf field names bound to virtual getters and setters\n let $oneOfFields;\n\n /**\n * Shape shapeType.\n * @member {\"stroke\"|\"figure\"|\"text\"|\"textArea\"|\"sticker\"|\"image\"|undefined} shapeType\n * @memberof wjite.message.Shape\n * @instance\n */\n Object.defineProperty(Shape.prototype, \"shapeType\", {\n get: $util.oneOfGetter($oneOfFields = [\"stroke\", \"figure\", \"text\", \"textArea\", \"sticker\", \"image\"]),\n set: $util.oneOfSetter($oneOfFields)\n });\n\n /**\n * Creates a new Shape instance using the specified properties.\n * @function create\n * @memberof wjite.message.Shape\n * @static\n * @param {wjite.message.IShape=} [properties] Properties to set\n * @returns {wjite.message.Shape} Shape instance\n */\n Shape.create = function create(properties) {\n return new Shape(properties);\n };\n\n /**\n * Encodes the specified Shape message. Does not implicitly {@link wjite.message.Shape.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.Shape\n * @static\n * @param {wjite.message.IShape} message Shape message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Shape.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.ID != null && Object.hasOwnProperty.call(message, \"ID\"))\n writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.ID);\n if (message.ownerID != null && Object.hasOwnProperty.call(message, \"ownerID\"))\n writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.ownerID);\n if (message.transform != null && Object.hasOwnProperty.call(message, \"transform\"))\n $root.wjite.message.Transform.encode(message.transform, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();\n if (message.stroke != null && Object.hasOwnProperty.call(message, \"stroke\"))\n $root.wjite.message.Stroke.encode(message.stroke, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();\n if (message.figure != null && Object.hasOwnProperty.call(message, \"figure\"))\n $root.wjite.message.Figure.encode(message.figure, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();\n if (message.text != null && Object.hasOwnProperty.call(message, \"text\"))\n $root.wjite.message.Text.encode(message.text, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();\n if (message.textArea != null && Object.hasOwnProperty.call(message, \"textArea\"))\n $root.wjite.message.TextArea.encode(message.textArea, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();\n if (message.sticker != null && Object.hasOwnProperty.call(message, \"sticker\"))\n $root.wjite.message.Sticker.encode(message.sticker, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();\n if (message.image != null && Object.hasOwnProperty.call(message, \"image\"))\n $root.wjite.message.Image.encode(message.image, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified Shape message, length delimited. Does not implicitly {@link wjite.message.Shape.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.Shape\n * @static\n * @param {wjite.message.IShape} message Shape message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Shape.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Shape message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.Shape\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.Shape} Shape\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Shape.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.Shape();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n message.ID = reader.uint64();\n break;\n case 2:\n message.ownerID = reader.uint64();\n break;\n case 4:\n message.transform = $root.wjite.message.Transform.decode(reader, reader.uint32());\n break;\n case 5:\n message.stroke = $root.wjite.message.Stroke.decode(reader, reader.uint32());\n break;\n case 6:\n message.figure = $root.wjite.message.Figure.decode(reader, reader.uint32());\n break;\n case 7:\n message.text = $root.wjite.message.Text.decode(reader, reader.uint32());\n break;\n case 8:\n message.textArea = $root.wjite.message.TextArea.decode(reader, reader.uint32());\n break;\n case 9:\n message.sticker = $root.wjite.message.Sticker.decode(reader, reader.uint32());\n break;\n case 10:\n message.image = $root.wjite.message.Image.decode(reader, reader.uint32());\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Shape message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.Shape\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.Shape} Shape\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Shape.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Shape message.\n * @function verify\n * @memberof wjite.message.Shape\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Shape.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n let properties = {};\n if (message.ID != null && message.hasOwnProperty(\"ID\"))\n if (!$util.isInteger(message.ID) && !(message.ID && $util.isInteger(message.ID.low) && $util.isInteger(message.ID.high)))\n return \"ID: integer|Long expected\";\n if (message.ownerID != null && message.hasOwnProperty(\"ownerID\"))\n if (!$util.isInteger(message.ownerID) && !(message.ownerID && $util.isInteger(message.ownerID.low) && $util.isInteger(message.ownerID.high)))\n return \"ownerID: integer|Long expected\";\n if (message.transform != null && message.hasOwnProperty(\"transform\")) {\n let error = $root.wjite.message.Transform.verify(message.transform);\n if (error)\n return \"transform.\" + error;\n }\n if (message.stroke != null && message.hasOwnProperty(\"stroke\")) {\n properties.shapeType = 1;\n {\n let error = $root.wjite.message.Stroke.verify(message.stroke);\n if (error)\n return \"stroke.\" + error;\n }\n }\n if (message.figure != null && message.hasOwnProperty(\"figure\")) {\n if (properties.shapeType === 1)\n return \"shapeType: multiple values\";\n properties.shapeType = 1;\n {\n let error = $root.wjite.message.Figure.verify(message.figure);\n if (error)\n return \"figure.\" + error;\n }\n }\n if (message.text != null && message.hasOwnProperty(\"text\")) {\n if (properties.shapeType === 1)\n return \"shapeType: multiple values\";\n properties.shapeType = 1;\n {\n let error = $root.wjite.message.Text.verify(message.text);\n if (error)\n return \"text.\" + error;\n }\n }\n if (message.textArea != null && message.hasOwnProperty(\"textArea\")) {\n if (properties.shapeType === 1)\n return \"shapeType: multiple values\";\n properties.shapeType = 1;\n {\n let error = $root.wjite.message.TextArea.verify(message.textArea);\n if (error)\n return \"textArea.\" + error;\n }\n }\n if (message.sticker != null && message.hasOwnProperty(\"sticker\")) {\n if (properties.shapeType === 1)\n return \"shapeType: multiple values\";\n properties.shapeType = 1;\n {\n let error = $root.wjite.message.Sticker.verify(message.sticker);\n if (error)\n return \"sticker.\" + error;\n }\n }\n if (message.image != null && message.hasOwnProperty(\"image\")) {\n if (properties.shapeType === 1)\n return \"shapeType: multiple values\";\n properties.shapeType = 1;\n {\n let error = $root.wjite.message.Image.verify(message.image);\n if (error)\n return \"image.\" + error;\n }\n }\n return null;\n };\n\n /**\n * Creates a Shape message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.Shape\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.Shape} Shape\n */\n Shape.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.Shape)\n return object;\n let message = new $root.wjite.message.Shape();\n if (object.ID != null)\n if ($util.Long)\n (message.ID = $util.Long.fromValue(object.ID)).unsigned = true;\n else if (typeof object.ID === \"string\")\n message.ID = parseInt(object.ID, 10);\n else if (typeof object.ID === \"number\")\n message.ID = object.ID;\n else if (typeof object.ID === \"object\")\n message.ID = new $util.LongBits(object.ID.low >>> 0, object.ID.high >>> 0).toNumber(true);\n if (object.ownerID != null)\n if ($util.Long)\n (message.ownerID = $util.Long.fromValue(object.ownerID)).unsigned = true;\n else if (typeof object.ownerID === \"string\")\n message.ownerID = parseInt(object.ownerID, 10);\n else if (typeof object.ownerID === \"number\")\n message.ownerID = object.ownerID;\n else if (typeof object.ownerID === \"object\")\n message.ownerID = new $util.LongBits(object.ownerID.low >>> 0, object.ownerID.high >>> 0).toNumber(true);\n if (object.transform != null) {\n if (typeof object.transform !== \"object\")\n throw TypeError(\".wjite.message.Shape.transform: object expected\");\n message.transform = $root.wjite.message.Transform.fromObject(object.transform);\n }\n if (object.stroke != null) {\n if (typeof object.stroke !== \"object\")\n throw TypeError(\".wjite.message.Shape.stroke: object expected\");\n message.stroke = $root.wjite.message.Stroke.fromObject(object.stroke);\n }\n if (object.figure != null) {\n if (typeof object.figure !== \"object\")\n throw TypeError(\".wjite.message.Shape.figure: object expected\");\n message.figure = $root.wjite.message.Figure.fromObject(object.figure);\n }\n if (object.text != null) {\n if (typeof object.text !== \"object\")\n throw TypeError(\".wjite.message.Shape.text: object expected\");\n message.text = $root.wjite.message.Text.fromObject(object.text);\n }\n if (object.textArea != null) {\n if (typeof object.textArea !== \"object\")\n throw TypeError(\".wjite.message.Shape.textArea: object expected\");\n message.textArea = $root.wjite.message.TextArea.fromObject(object.textArea);\n }\n if (object.sticker != null) {\n if (typeof object.sticker !== \"object\")\n throw TypeError(\".wjite.message.Shape.sticker: object expected\");\n message.sticker = $root.wjite.message.Sticker.fromObject(object.sticker);\n }\n if (object.image != null) {\n if (typeof object.image !== \"object\")\n throw TypeError(\".wjite.message.Shape.image: object expected\");\n message.image = $root.wjite.message.Image.fromObject(object.image);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a Shape message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.Shape\n * @static\n * @param {wjite.message.Shape} message Shape\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Shape.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults) {\n if ($util.Long) {\n let long = new $util.Long(0, 0, true);\n object.ID = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.ID = options.longs === String ? \"0\" : 0;\n if ($util.Long) {\n let long = new $util.Long(0, 0, true);\n object.ownerID = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.ownerID = options.longs === String ? \"0\" : 0;\n object.transform = null;\n }\n if (message.ID != null && message.hasOwnProperty(\"ID\"))\n if (typeof message.ID === \"number\")\n object.ID = options.longs === String ? String(message.ID) : message.ID;\n else\n object.ID = options.longs === String ? $util.Long.prototype.toString.call(message.ID) : options.longs === Number ? new $util.LongBits(message.ID.low >>> 0, message.ID.high >>> 0).toNumber(true) : message.ID;\n if (message.ownerID != null && message.hasOwnProperty(\"ownerID\"))\n if (typeof message.ownerID === \"number\")\n object.ownerID = options.longs === String ? String(message.ownerID) : message.ownerID;\n else\n object.ownerID = options.longs === String ? $util.Long.prototype.toString.call(message.ownerID) : options.longs === Number ? new $util.LongBits(message.ownerID.low >>> 0, message.ownerID.high >>> 0).toNumber(true) : message.ownerID;\n if (message.transform != null && message.hasOwnProperty(\"transform\"))\n object.transform = $root.wjite.message.Transform.toObject(message.transform, options);\n if (message.stroke != null && message.hasOwnProperty(\"stroke\")) {\n object.stroke = $root.wjite.message.Stroke.toObject(message.stroke, options);\n if (options.oneofs)\n object.shapeType = \"stroke\";\n }\n if (message.figure != null && message.hasOwnProperty(\"figure\")) {\n object.figure = $root.wjite.message.Figure.toObject(message.figure, options);\n if (options.oneofs)\n object.shapeType = \"figure\";\n }\n if (message.text != null && message.hasOwnProperty(\"text\")) {\n object.text = $root.wjite.message.Text.toObject(message.text, options);\n if (options.oneofs)\n object.shapeType = \"text\";\n }\n if (message.textArea != null && message.hasOwnProperty(\"textArea\")) {\n object.textArea = $root.wjite.message.TextArea.toObject(message.textArea, options);\n if (options.oneofs)\n object.shapeType = \"textArea\";\n }\n if (message.sticker != null && message.hasOwnProperty(\"sticker\")) {\n object.sticker = $root.wjite.message.Sticker.toObject(message.sticker, options);\n if (options.oneofs)\n object.shapeType = \"sticker\";\n }\n if (message.image != null && message.hasOwnProperty(\"image\")) {\n object.image = $root.wjite.message.Image.toObject(message.image, options);\n if (options.oneofs)\n object.shapeType = \"image\";\n }\n return object;\n };\n\n /**\n * Converts this Shape to JSON.\n * @function toJSON\n * @memberof wjite.message.Shape\n * @instance\n * @returns {Object.} JSON object\n */\n Shape.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return Shape;\n })();\n\n message.AddShape = (function() {\n\n /**\n * Properties of an AddShape.\n * @memberof wjite.message\n * @interface IAddShape\n * @property {wjite.message.IShape|null} [shape] AddShape shape\n * @property {Long|null} [tempId] AddShape tempId\n */\n\n /**\n * Constructs a new AddShape.\n * @memberof wjite.message\n * @classdesc Represents an AddShape.\n * @implements IAddShape\n * @constructor\n * @param {wjite.message.IAddShape=} [properties] Properties to set\n */\n function AddShape(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * AddShape shape.\n * @member {wjite.message.IShape|null|undefined} shape\n * @memberof wjite.message.AddShape\n * @instance\n */\n AddShape.prototype.shape = null;\n\n /**\n * AddShape tempId.\n * @member {Long} tempId\n * @memberof wjite.message.AddShape\n * @instance\n */\n AddShape.prototype.tempId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;\n\n /**\n * Creates a new AddShape instance using the specified properties.\n * @function create\n * @memberof wjite.message.AddShape\n * @static\n * @param {wjite.message.IAddShape=} [properties] Properties to set\n * @returns {wjite.message.AddShape} AddShape instance\n */\n AddShape.create = function create(properties) {\n return new AddShape(properties);\n };\n\n /**\n * Encodes the specified AddShape message. Does not implicitly {@link wjite.message.AddShape.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.AddShape\n * @static\n * @param {wjite.message.IAddShape} message AddShape message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n AddShape.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.shape != null && Object.hasOwnProperty.call(message, \"shape\"))\n $root.wjite.message.Shape.encode(message.shape, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n if (message.tempId != null && Object.hasOwnProperty.call(message, \"tempId\"))\n writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.tempId);\n return writer;\n };\n\n /**\n * Encodes the specified AddShape message, length delimited. Does not implicitly {@link wjite.message.AddShape.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.AddShape\n * @static\n * @param {wjite.message.IAddShape} message AddShape message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n AddShape.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes an AddShape message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.AddShape\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.AddShape} AddShape\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n AddShape.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.AddShape();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n message.shape = $root.wjite.message.Shape.decode(reader, reader.uint32());\n break;\n case 2:\n message.tempId = reader.uint64();\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes an AddShape message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.AddShape\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.AddShape} AddShape\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n AddShape.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies an AddShape message.\n * @function verify\n * @memberof wjite.message.AddShape\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n AddShape.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.shape != null && message.hasOwnProperty(\"shape\")) {\n let error = $root.wjite.message.Shape.verify(message.shape);\n if (error)\n return \"shape.\" + error;\n }\n if (message.tempId != null && message.hasOwnProperty(\"tempId\"))\n if (!$util.isInteger(message.tempId) && !(message.tempId && $util.isInteger(message.tempId.low) && $util.isInteger(message.tempId.high)))\n return \"tempId: integer|Long expected\";\n return null;\n };\n\n /**\n * Creates an AddShape message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.AddShape\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.AddShape} AddShape\n */\n AddShape.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.AddShape)\n return object;\n let message = new $root.wjite.message.AddShape();\n if (object.shape != null) {\n if (typeof object.shape !== \"object\")\n throw TypeError(\".wjite.message.AddShape.shape: object expected\");\n message.shape = $root.wjite.message.Shape.fromObject(object.shape);\n }\n if (object.tempId != null)\n if ($util.Long)\n (message.tempId = $util.Long.fromValue(object.tempId)).unsigned = true;\n else if (typeof object.tempId === \"string\")\n message.tempId = parseInt(object.tempId, 10);\n else if (typeof object.tempId === \"number\")\n message.tempId = object.tempId;\n else if (typeof object.tempId === \"object\")\n message.tempId = new $util.LongBits(object.tempId.low >>> 0, object.tempId.high >>> 0).toNumber(true);\n return message;\n };\n\n /**\n * Creates a plain object from an AddShape message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.AddShape\n * @static\n * @param {wjite.message.AddShape} message AddShape\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n AddShape.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults) {\n object.shape = null;\n if ($util.Long) {\n let long = new $util.Long(0, 0, true);\n object.tempId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.tempId = options.longs === String ? \"0\" : 0;\n }\n if (message.shape != null && message.hasOwnProperty(\"shape\"))\n object.shape = $root.wjite.message.Shape.toObject(message.shape, options);\n if (message.tempId != null && message.hasOwnProperty(\"tempId\"))\n if (typeof message.tempId === \"number\")\n object.tempId = options.longs === String ? String(message.tempId) : message.tempId;\n else\n object.tempId = options.longs === String ? $util.Long.prototype.toString.call(message.tempId) : options.longs === Number ? new $util.LongBits(message.tempId.low >>> 0, message.tempId.high >>> 0).toNumber(true) : message.tempId;\n return object;\n };\n\n /**\n * Converts this AddShape to JSON.\n * @function toJSON\n * @memberof wjite.message.AddShape\n * @instance\n * @returns {Object.} JSON object\n */\n AddShape.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return AddShape;\n })();\n\n message.AddHighlight = (function() {\n\n /**\n * Properties of an AddHighlight.\n * @memberof wjite.message\n * @interface IAddHighlight\n * @property {wjite.message.IShape|null} [shape] AddHighlight shape\n * @property {boolean|null} [focus] AddHighlight focus\n */\n\n /**\n * Constructs a new AddHighlight.\n * @memberof wjite.message\n * @classdesc Represents an AddHighlight.\n * @implements IAddHighlight\n * @constructor\n * @param {wjite.message.IAddHighlight=} [properties] Properties to set\n */\n function AddHighlight(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * AddHighlight shape.\n * @member {wjite.message.IShape|null|undefined} shape\n * @memberof wjite.message.AddHighlight\n * @instance\n */\n AddHighlight.prototype.shape = null;\n\n /**\n * AddHighlight focus.\n * @member {boolean} focus\n * @memberof wjite.message.AddHighlight\n * @instance\n */\n AddHighlight.prototype.focus = false;\n\n /**\n * Creates a new AddHighlight instance using the specified properties.\n * @function create\n * @memberof wjite.message.AddHighlight\n * @static\n * @param {wjite.message.IAddHighlight=} [properties] Properties to set\n * @returns {wjite.message.AddHighlight} AddHighlight instance\n */\n AddHighlight.create = function create(properties) {\n return new AddHighlight(properties);\n };\n\n /**\n * Encodes the specified AddHighlight message. Does not implicitly {@link wjite.message.AddHighlight.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.AddHighlight\n * @static\n * @param {wjite.message.IAddHighlight} message AddHighlight message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n AddHighlight.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.shape != null && Object.hasOwnProperty.call(message, \"shape\"))\n $root.wjite.message.Shape.encode(message.shape, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n if (message.focus != null && Object.hasOwnProperty.call(message, \"focus\"))\n writer.uint32(/* id 2, wireType 0 =*/16).bool(message.focus);\n return writer;\n };\n\n /**\n * Encodes the specified AddHighlight message, length delimited. Does not implicitly {@link wjite.message.AddHighlight.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.AddHighlight\n * @static\n * @param {wjite.message.IAddHighlight} message AddHighlight message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n AddHighlight.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes an AddHighlight message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.AddHighlight\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.AddHighlight} AddHighlight\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n AddHighlight.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.AddHighlight();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n message.shape = $root.wjite.message.Shape.decode(reader, reader.uint32());\n break;\n case 2:\n message.focus = reader.bool();\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes an AddHighlight message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.AddHighlight\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.AddHighlight} AddHighlight\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n AddHighlight.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies an AddHighlight message.\n * @function verify\n * @memberof wjite.message.AddHighlight\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n AddHighlight.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.shape != null && message.hasOwnProperty(\"shape\")) {\n let error = $root.wjite.message.Shape.verify(message.shape);\n if (error)\n return \"shape.\" + error;\n }\n if (message.focus != null && message.hasOwnProperty(\"focus\"))\n if (typeof message.focus !== \"boolean\")\n return \"focus: boolean expected\";\n return null;\n };\n\n /**\n * Creates an AddHighlight message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.AddHighlight\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.AddHighlight} AddHighlight\n */\n AddHighlight.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.AddHighlight)\n return object;\n let message = new $root.wjite.message.AddHighlight();\n if (object.shape != null) {\n if (typeof object.shape !== \"object\")\n throw TypeError(\".wjite.message.AddHighlight.shape: object expected\");\n message.shape = $root.wjite.message.Shape.fromObject(object.shape);\n }\n if (object.focus != null)\n message.focus = Boolean(object.focus);\n return message;\n };\n\n /**\n * Creates a plain object from an AddHighlight message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.AddHighlight\n * @static\n * @param {wjite.message.AddHighlight} message AddHighlight\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n AddHighlight.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults) {\n object.shape = null;\n object.focus = false;\n }\n if (message.shape != null && message.hasOwnProperty(\"shape\"))\n object.shape = $root.wjite.message.Shape.toObject(message.shape, options);\n if (message.focus != null && message.hasOwnProperty(\"focus\"))\n object.focus = message.focus;\n return object;\n };\n\n /**\n * Converts this AddHighlight to JSON.\n * @function toJSON\n * @memberof wjite.message.AddHighlight\n * @instance\n * @returns {Object.} JSON object\n */\n AddHighlight.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return AddHighlight;\n })();\n\n message.Notify = (function() {\n\n /**\n * Properties of a Notify.\n * @memberof wjite.message\n * @interface INotify\n * @property {wjite.message.IShape|null} [shape] Notify shape\n */\n\n /**\n * Constructs a new Notify.\n * @memberof wjite.message\n * @classdesc Represents a Notify.\n * @implements INotify\n * @constructor\n * @param {wjite.message.INotify=} [properties] Properties to set\n */\n function Notify(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Notify shape.\n * @member {wjite.message.IShape|null|undefined} shape\n * @memberof wjite.message.Notify\n * @instance\n */\n Notify.prototype.shape = null;\n\n /**\n * Creates a new Notify instance using the specified properties.\n * @function create\n * @memberof wjite.message.Notify\n * @static\n * @param {wjite.message.INotify=} [properties] Properties to set\n * @returns {wjite.message.Notify} Notify instance\n */\n Notify.create = function create(properties) {\n return new Notify(properties);\n };\n\n /**\n * Encodes the specified Notify message. Does not implicitly {@link wjite.message.Notify.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.Notify\n * @static\n * @param {wjite.message.INotify} message Notify message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Notify.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.shape != null && Object.hasOwnProperty.call(message, \"shape\"))\n $root.wjite.message.Shape.encode(message.shape, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified Notify message, length delimited. Does not implicitly {@link wjite.message.Notify.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.Notify\n * @static\n * @param {wjite.message.INotify} message Notify message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Notify.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Notify message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.Notify\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.Notify} Notify\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Notify.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.Notify();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n message.shape = $root.wjite.message.Shape.decode(reader, reader.uint32());\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Notify message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.Notify\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.Notify} Notify\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Notify.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Notify message.\n * @function verify\n * @memberof wjite.message.Notify\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Notify.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.shape != null && message.hasOwnProperty(\"shape\")) {\n let error = $root.wjite.message.Shape.verify(message.shape);\n if (error)\n return \"shape.\" + error;\n }\n return null;\n };\n\n /**\n * Creates a Notify message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.Notify\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.Notify} Notify\n */\n Notify.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.Notify)\n return object;\n let message = new $root.wjite.message.Notify();\n if (object.shape != null) {\n if (typeof object.shape !== \"object\")\n throw TypeError(\".wjite.message.Notify.shape: object expected\");\n message.shape = $root.wjite.message.Shape.fromObject(object.shape);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a Notify message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.Notify\n * @static\n * @param {wjite.message.Notify} message Notify\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Notify.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults)\n object.shape = null;\n if (message.shape != null && message.hasOwnProperty(\"shape\"))\n object.shape = $root.wjite.message.Shape.toObject(message.shape, options);\n return object;\n };\n\n /**\n * Converts this Notify to JSON.\n * @function toJSON\n * @memberof wjite.message.Notify\n * @instance\n * @returns {Object.} JSON object\n */\n Notify.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return Notify;\n })();\n\n message.UpdateShape = (function() {\n\n /**\n * Properties of an UpdateShape.\n * @memberof wjite.message\n * @interface IUpdateShape\n * @property {wjite.message.IShape|null} [shape] UpdateShape shape\n */\n\n /**\n * Constructs a new UpdateShape.\n * @memberof wjite.message\n * @classdesc Represents an UpdateShape.\n * @implements IUpdateShape\n * @constructor\n * @param {wjite.message.IUpdateShape=} [properties] Properties to set\n */\n function UpdateShape(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * UpdateShape shape.\n * @member {wjite.message.IShape|null|undefined} shape\n * @memberof wjite.message.UpdateShape\n * @instance\n */\n UpdateShape.prototype.shape = null;\n\n /**\n * Creates a new UpdateShape instance using the specified properties.\n * @function create\n * @memberof wjite.message.UpdateShape\n * @static\n * @param {wjite.message.IUpdateShape=} [properties] Properties to set\n * @returns {wjite.message.UpdateShape} UpdateShape instance\n */\n UpdateShape.create = function create(properties) {\n return new UpdateShape(properties);\n };\n\n /**\n * Encodes the specified UpdateShape message. Does not implicitly {@link wjite.message.UpdateShape.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.UpdateShape\n * @static\n * @param {wjite.message.IUpdateShape} message UpdateShape message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n UpdateShape.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.shape != null && Object.hasOwnProperty.call(message, \"shape\"))\n $root.wjite.message.Shape.encode(message.shape, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified UpdateShape message, length delimited. Does not implicitly {@link wjite.message.UpdateShape.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.UpdateShape\n * @static\n * @param {wjite.message.IUpdateShape} message UpdateShape message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n UpdateShape.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes an UpdateShape message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.UpdateShape\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.UpdateShape} UpdateShape\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n UpdateShape.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.UpdateShape();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n message.shape = $root.wjite.message.Shape.decode(reader, reader.uint32());\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes an UpdateShape message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.UpdateShape\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.UpdateShape} UpdateShape\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n UpdateShape.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies an UpdateShape message.\n * @function verify\n * @memberof wjite.message.UpdateShape\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n UpdateShape.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.shape != null && message.hasOwnProperty(\"shape\")) {\n let error = $root.wjite.message.Shape.verify(message.shape);\n if (error)\n return \"shape.\" + error;\n }\n return null;\n };\n\n /**\n * Creates an UpdateShape message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.UpdateShape\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.UpdateShape} UpdateShape\n */\n UpdateShape.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.UpdateShape)\n return object;\n let message = new $root.wjite.message.UpdateShape();\n if (object.shape != null) {\n if (typeof object.shape !== \"object\")\n throw TypeError(\".wjite.message.UpdateShape.shape: object expected\");\n message.shape = $root.wjite.message.Shape.fromObject(object.shape);\n }\n return message;\n };\n\n /**\n * Creates a plain object from an UpdateShape message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.UpdateShape\n * @static\n * @param {wjite.message.UpdateShape} message UpdateShape\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n UpdateShape.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults)\n object.shape = null;\n if (message.shape != null && message.hasOwnProperty(\"shape\"))\n object.shape = $root.wjite.message.Shape.toObject(message.shape, options);\n return object;\n };\n\n /**\n * Converts this UpdateShape to JSON.\n * @function toJSON\n * @memberof wjite.message.UpdateShape\n * @instance\n * @returns {Object.} JSON object\n */\n UpdateShape.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return UpdateShape;\n })();\n\n message.RemoveShape = (function() {\n\n /**\n * Properties of a RemoveShape.\n * @memberof wjite.message\n * @interface IRemoveShape\n * @property {Long|null} [shapeID] RemoveShape shapeID\n */\n\n /**\n * Constructs a new RemoveShape.\n * @memberof wjite.message\n * @classdesc Represents a RemoveShape.\n * @implements IRemoveShape\n * @constructor\n * @param {wjite.message.IRemoveShape=} [properties] Properties to set\n */\n function RemoveShape(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * RemoveShape shapeID.\n * @member {Long} shapeID\n * @memberof wjite.message.RemoveShape\n * @instance\n */\n RemoveShape.prototype.shapeID = $util.Long ? $util.Long.fromBits(0,0,true) : 0;\n\n /**\n * Creates a new RemoveShape instance using the specified properties.\n * @function create\n * @memberof wjite.message.RemoveShape\n * @static\n * @param {wjite.message.IRemoveShape=} [properties] Properties to set\n * @returns {wjite.message.RemoveShape} RemoveShape instance\n */\n RemoveShape.create = function create(properties) {\n return new RemoveShape(properties);\n };\n\n /**\n * Encodes the specified RemoveShape message. Does not implicitly {@link wjite.message.RemoveShape.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.RemoveShape\n * @static\n * @param {wjite.message.IRemoveShape} message RemoveShape message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n RemoveShape.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.shapeID != null && Object.hasOwnProperty.call(message, \"shapeID\"))\n writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.shapeID);\n return writer;\n };\n\n /**\n * Encodes the specified RemoveShape message, length delimited. Does not implicitly {@link wjite.message.RemoveShape.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.RemoveShape\n * @static\n * @param {wjite.message.IRemoveShape} message RemoveShape message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n RemoveShape.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a RemoveShape message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.RemoveShape\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.RemoveShape} RemoveShape\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n RemoveShape.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.RemoveShape();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n message.shapeID = reader.uint64();\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a RemoveShape message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.RemoveShape\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.RemoveShape} RemoveShape\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n RemoveShape.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a RemoveShape message.\n * @function verify\n * @memberof wjite.message.RemoveShape\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n RemoveShape.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.shapeID != null && message.hasOwnProperty(\"shapeID\"))\n if (!$util.isInteger(message.shapeID) && !(message.shapeID && $util.isInteger(message.shapeID.low) && $util.isInteger(message.shapeID.high)))\n return \"shapeID: integer|Long expected\";\n return null;\n };\n\n /**\n * Creates a RemoveShape message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.RemoveShape\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.RemoveShape} RemoveShape\n */\n RemoveShape.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.RemoveShape)\n return object;\n let message = new $root.wjite.message.RemoveShape();\n if (object.shapeID != null)\n if ($util.Long)\n (message.shapeID = $util.Long.fromValue(object.shapeID)).unsigned = true;\n else if (typeof object.shapeID === \"string\")\n message.shapeID = parseInt(object.shapeID, 10);\n else if (typeof object.shapeID === \"number\")\n message.shapeID = object.shapeID;\n else if (typeof object.shapeID === \"object\")\n message.shapeID = new $util.LongBits(object.shapeID.low >>> 0, object.shapeID.high >>> 0).toNumber(true);\n return message;\n };\n\n /**\n * Creates a plain object from a RemoveShape message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.RemoveShape\n * @static\n * @param {wjite.message.RemoveShape} message RemoveShape\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n RemoveShape.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults)\n if ($util.Long) {\n let long = new $util.Long(0, 0, true);\n object.shapeID = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.shapeID = options.longs === String ? \"0\" : 0;\n if (message.shapeID != null && message.hasOwnProperty(\"shapeID\"))\n if (typeof message.shapeID === \"number\")\n object.shapeID = options.longs === String ? String(message.shapeID) : message.shapeID;\n else\n object.shapeID = options.longs === String ? $util.Long.prototype.toString.call(message.shapeID) : options.longs === Number ? new $util.LongBits(message.shapeID.low >>> 0, message.shapeID.high >>> 0).toNumber(true) : message.shapeID;\n return object;\n };\n\n /**\n * Converts this RemoveShape to JSON.\n * @function toJSON\n * @memberof wjite.message.RemoveShape\n * @instance\n * @returns {Object.} JSON object\n */\n RemoveShape.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return RemoveShape;\n })();\n\n message.Clear = (function() {\n\n /**\n * Properties of a Clear.\n * @memberof wjite.message\n * @interface IClear\n */\n\n /**\n * Constructs a new Clear.\n * @memberof wjite.message\n * @classdesc Represents a Clear.\n * @implements IClear\n * @constructor\n * @param {wjite.message.IClear=} [properties] Properties to set\n */\n function Clear(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Creates a new Clear instance using the specified properties.\n * @function create\n * @memberof wjite.message.Clear\n * @static\n * @param {wjite.message.IClear=} [properties] Properties to set\n * @returns {wjite.message.Clear} Clear instance\n */\n Clear.create = function create(properties) {\n return new Clear(properties);\n };\n\n /**\n * Encodes the specified Clear message. Does not implicitly {@link wjite.message.Clear.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.Clear\n * @static\n * @param {wjite.message.IClear} message Clear message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Clear.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n return writer;\n };\n\n /**\n * Encodes the specified Clear message, length delimited. Does not implicitly {@link wjite.message.Clear.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.Clear\n * @static\n * @param {wjite.message.IClear} message Clear message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Clear.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Clear message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.Clear\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.Clear} Clear\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Clear.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.Clear();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Clear message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.Clear\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.Clear} Clear\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Clear.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Clear message.\n * @function verify\n * @memberof wjite.message.Clear\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Clear.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n return null;\n };\n\n /**\n * Creates a Clear message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.Clear\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.Clear} Clear\n */\n Clear.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.Clear)\n return object;\n return new $root.wjite.message.Clear();\n };\n\n /**\n * Creates a plain object from a Clear message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.Clear\n * @static\n * @param {wjite.message.Clear} message Clear\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Clear.toObject = function toObject() {\n return {};\n };\n\n /**\n * Converts this Clear to JSON.\n * @function toJSON\n * @memberof wjite.message.Clear\n * @instance\n * @returns {Object.} JSON object\n */\n Clear.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return Clear;\n })();\n\n message.ShapeID = (function() {\n\n /**\n * Properties of a ShapeID.\n * @memberof wjite.message\n * @interface IShapeID\n * @property {Long|null} [shapeID] ShapeID shapeID\n */\n\n /**\n * Constructs a new ShapeID.\n * @memberof wjite.message\n * @classdesc Represents a ShapeID.\n * @implements IShapeID\n * @constructor\n * @param {wjite.message.IShapeID=} [properties] Properties to set\n */\n function ShapeID(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * ShapeID shapeID.\n * @member {Long} shapeID\n * @memberof wjite.message.ShapeID\n * @instance\n */\n ShapeID.prototype.shapeID = $util.Long ? $util.Long.fromBits(0,0,true) : 0;\n\n /**\n * Creates a new ShapeID instance using the specified properties.\n * @function create\n * @memberof wjite.message.ShapeID\n * @static\n * @param {wjite.message.IShapeID=} [properties] Properties to set\n * @returns {wjite.message.ShapeID} ShapeID instance\n */\n ShapeID.create = function create(properties) {\n return new ShapeID(properties);\n };\n\n /**\n * Encodes the specified ShapeID message. Does not implicitly {@link wjite.message.ShapeID.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.ShapeID\n * @static\n * @param {wjite.message.IShapeID} message ShapeID message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ShapeID.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.shapeID != null && Object.hasOwnProperty.call(message, \"shapeID\"))\n writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.shapeID);\n return writer;\n };\n\n /**\n * Encodes the specified ShapeID message, length delimited. Does not implicitly {@link wjite.message.ShapeID.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.ShapeID\n * @static\n * @param {wjite.message.IShapeID} message ShapeID message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ShapeID.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a ShapeID message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.ShapeID\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.ShapeID} ShapeID\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ShapeID.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.ShapeID();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n message.shapeID = reader.uint64();\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a ShapeID message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.ShapeID\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.ShapeID} ShapeID\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ShapeID.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a ShapeID message.\n * @function verify\n * @memberof wjite.message.ShapeID\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n ShapeID.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.shapeID != null && message.hasOwnProperty(\"shapeID\"))\n if (!$util.isInteger(message.shapeID) && !(message.shapeID && $util.isInteger(message.shapeID.low) && $util.isInteger(message.shapeID.high)))\n return \"shapeID: integer|Long expected\";\n return null;\n };\n\n /**\n * Creates a ShapeID message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.ShapeID\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.ShapeID} ShapeID\n */\n ShapeID.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.ShapeID)\n return object;\n let message = new $root.wjite.message.ShapeID();\n if (object.shapeID != null)\n if ($util.Long)\n (message.shapeID = $util.Long.fromValue(object.shapeID)).unsigned = true;\n else if (typeof object.shapeID === \"string\")\n message.shapeID = parseInt(object.shapeID, 10);\n else if (typeof object.shapeID === \"number\")\n message.shapeID = object.shapeID;\n else if (typeof object.shapeID === \"object\")\n message.shapeID = new $util.LongBits(object.shapeID.low >>> 0, object.shapeID.high >>> 0).toNumber(true);\n return message;\n };\n\n /**\n * Creates a plain object from a ShapeID message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.ShapeID\n * @static\n * @param {wjite.message.ShapeID} message ShapeID\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n ShapeID.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults)\n if ($util.Long) {\n let long = new $util.Long(0, 0, true);\n object.shapeID = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.shapeID = options.longs === String ? \"0\" : 0;\n if (message.shapeID != null && message.hasOwnProperty(\"shapeID\"))\n if (typeof message.shapeID === \"number\")\n object.shapeID = options.longs === String ? String(message.shapeID) : message.shapeID;\n else\n object.shapeID = options.longs === String ? $util.Long.prototype.toString.call(message.shapeID) : options.longs === Number ? new $util.LongBits(message.shapeID.low >>> 0, message.shapeID.high >>> 0).toNumber(true) : message.shapeID;\n return object;\n };\n\n /**\n * Converts this ShapeID to JSON.\n * @function toJSON\n * @memberof wjite.message.ShapeID\n * @instance\n * @returns {Object.} JSON object\n */\n ShapeID.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return ShapeID;\n })();\n\n message.ShapeUpdated = (function() {\n\n /**\n * Properties of a ShapeUpdated.\n * @memberof wjite.message\n * @interface IShapeUpdated\n */\n\n /**\n * Constructs a new ShapeUpdated.\n * @memberof wjite.message\n * @classdesc Represents a ShapeUpdated.\n * @implements IShapeUpdated\n * @constructor\n * @param {wjite.message.IShapeUpdated=} [properties] Properties to set\n */\n function ShapeUpdated(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Creates a new ShapeUpdated instance using the specified properties.\n * @function create\n * @memberof wjite.message.ShapeUpdated\n * @static\n * @param {wjite.message.IShapeUpdated=} [properties] Properties to set\n * @returns {wjite.message.ShapeUpdated} ShapeUpdated instance\n */\n ShapeUpdated.create = function create(properties) {\n return new ShapeUpdated(properties);\n };\n\n /**\n * Encodes the specified ShapeUpdated message. Does not implicitly {@link wjite.message.ShapeUpdated.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.ShapeUpdated\n * @static\n * @param {wjite.message.IShapeUpdated} message ShapeUpdated message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ShapeUpdated.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n return writer;\n };\n\n /**\n * Encodes the specified ShapeUpdated message, length delimited. Does not implicitly {@link wjite.message.ShapeUpdated.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.ShapeUpdated\n * @static\n * @param {wjite.message.IShapeUpdated} message ShapeUpdated message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ShapeUpdated.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a ShapeUpdated message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.ShapeUpdated\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.ShapeUpdated} ShapeUpdated\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ShapeUpdated.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.ShapeUpdated();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a ShapeUpdated message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.ShapeUpdated\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.ShapeUpdated} ShapeUpdated\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ShapeUpdated.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a ShapeUpdated message.\n * @function verify\n * @memberof wjite.message.ShapeUpdated\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n ShapeUpdated.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n return null;\n };\n\n /**\n * Creates a ShapeUpdated message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.ShapeUpdated\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.ShapeUpdated} ShapeUpdated\n */\n ShapeUpdated.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.ShapeUpdated)\n return object;\n return new $root.wjite.message.ShapeUpdated();\n };\n\n /**\n * Creates a plain object from a ShapeUpdated message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.ShapeUpdated\n * @static\n * @param {wjite.message.ShapeUpdated} message ShapeUpdated\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n ShapeUpdated.toObject = function toObject() {\n return {};\n };\n\n /**\n * Converts this ShapeUpdated to JSON.\n * @function toJSON\n * @memberof wjite.message.ShapeUpdated\n * @instance\n * @returns {Object.} JSON object\n */\n ShapeUpdated.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return ShapeUpdated;\n })();\n\n message.ShapeRemoved = (function() {\n\n /**\n * Properties of a ShapeRemoved.\n * @memberof wjite.message\n * @interface IShapeRemoved\n */\n\n /**\n * Constructs a new ShapeRemoved.\n * @memberof wjite.message\n * @classdesc Represents a ShapeRemoved.\n * @implements IShapeRemoved\n * @constructor\n * @param {wjite.message.IShapeRemoved=} [properties] Properties to set\n */\n function ShapeRemoved(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Creates a new ShapeRemoved instance using the specified properties.\n * @function create\n * @memberof wjite.message.ShapeRemoved\n * @static\n * @param {wjite.message.IShapeRemoved=} [properties] Properties to set\n * @returns {wjite.message.ShapeRemoved} ShapeRemoved instance\n */\n ShapeRemoved.create = function create(properties) {\n return new ShapeRemoved(properties);\n };\n\n /**\n * Encodes the specified ShapeRemoved message. Does not implicitly {@link wjite.message.ShapeRemoved.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.ShapeRemoved\n * @static\n * @param {wjite.message.IShapeRemoved} message ShapeRemoved message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ShapeRemoved.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n return writer;\n };\n\n /**\n * Encodes the specified ShapeRemoved message, length delimited. Does not implicitly {@link wjite.message.ShapeRemoved.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.ShapeRemoved\n * @static\n * @param {wjite.message.IShapeRemoved} message ShapeRemoved message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ShapeRemoved.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a ShapeRemoved message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.ShapeRemoved\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.ShapeRemoved} ShapeRemoved\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ShapeRemoved.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.ShapeRemoved();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a ShapeRemoved message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.ShapeRemoved\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.ShapeRemoved} ShapeRemoved\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ShapeRemoved.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a ShapeRemoved message.\n * @function verify\n * @memberof wjite.message.ShapeRemoved\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n ShapeRemoved.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n return null;\n };\n\n /**\n * Creates a ShapeRemoved message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.ShapeRemoved\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.ShapeRemoved} ShapeRemoved\n */\n ShapeRemoved.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.ShapeRemoved)\n return object;\n return new $root.wjite.message.ShapeRemoved();\n };\n\n /**\n * Creates a plain object from a ShapeRemoved message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.ShapeRemoved\n * @static\n * @param {wjite.message.ShapeRemoved} message ShapeRemoved\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n ShapeRemoved.toObject = function toObject() {\n return {};\n };\n\n /**\n * Converts this ShapeRemoved to JSON.\n * @function toJSON\n * @memberof wjite.message.ShapeRemoved\n * @instance\n * @returns {Object.} JSON object\n */\n ShapeRemoved.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return ShapeRemoved;\n })();\n\n message.BoardCleared = (function() {\n\n /**\n * Properties of a BoardCleared.\n * @memberof wjite.message\n * @interface IBoardCleared\n */\n\n /**\n * Constructs a new BoardCleared.\n * @memberof wjite.message\n * @classdesc Represents a BoardCleared.\n * @implements IBoardCleared\n * @constructor\n * @param {wjite.message.IBoardCleared=} [properties] Properties to set\n */\n function BoardCleared(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Creates a new BoardCleared instance using the specified properties.\n * @function create\n * @memberof wjite.message.BoardCleared\n * @static\n * @param {wjite.message.IBoardCleared=} [properties] Properties to set\n * @returns {wjite.message.BoardCleared} BoardCleared instance\n */\n BoardCleared.create = function create(properties) {\n return new BoardCleared(properties);\n };\n\n /**\n * Encodes the specified BoardCleared message. Does not implicitly {@link wjite.message.BoardCleared.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.BoardCleared\n * @static\n * @param {wjite.message.IBoardCleared} message BoardCleared message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n BoardCleared.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n return writer;\n };\n\n /**\n * Encodes the specified BoardCleared message, length delimited. Does not implicitly {@link wjite.message.BoardCleared.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.BoardCleared\n * @static\n * @param {wjite.message.IBoardCleared} message BoardCleared message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n BoardCleared.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a BoardCleared message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.BoardCleared\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.BoardCleared} BoardCleared\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n BoardCleared.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.BoardCleared();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a BoardCleared message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.BoardCleared\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.BoardCleared} BoardCleared\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n BoardCleared.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a BoardCleared message.\n * @function verify\n * @memberof wjite.message.BoardCleared\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n BoardCleared.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n return null;\n };\n\n /**\n * Creates a BoardCleared message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.BoardCleared\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.BoardCleared} BoardCleared\n */\n BoardCleared.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.BoardCleared)\n return object;\n return new $root.wjite.message.BoardCleared();\n };\n\n /**\n * Creates a plain object from a BoardCleared message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.BoardCleared\n * @static\n * @param {wjite.message.BoardCleared} message BoardCleared\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n BoardCleared.toObject = function toObject() {\n return {};\n };\n\n /**\n * Converts this BoardCleared to JSON.\n * @function toJSON\n * @memberof wjite.message.BoardCleared\n * @instance\n * @returns {Object.} JSON object\n */\n BoardCleared.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return BoardCleared;\n })();\n\n message.Content = (function() {\n\n /**\n * Properties of a Content.\n * @memberof wjite.message\n * @interface IContent\n * @property {Array.|null} [shapes] Content shapes\n */\n\n /**\n * Constructs a new Content.\n * @memberof wjite.message\n * @classdesc Represents a Content.\n * @implements IContent\n * @constructor\n * @param {wjite.message.IContent=} [properties] Properties to set\n */\n function Content(properties) {\n this.shapes = [];\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Content shapes.\n * @member {Array.} shapes\n * @memberof wjite.message.Content\n * @instance\n */\n Content.prototype.shapes = $util.emptyArray;\n\n /**\n * Creates a new Content instance using the specified properties.\n * @function create\n * @memberof wjite.message.Content\n * @static\n * @param {wjite.message.IContent=} [properties] Properties to set\n * @returns {wjite.message.Content} Content instance\n */\n Content.create = function create(properties) {\n return new Content(properties);\n };\n\n /**\n * Encodes the specified Content message. Does not implicitly {@link wjite.message.Content.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.Content\n * @static\n * @param {wjite.message.IContent} message Content message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Content.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.shapes != null && message.shapes.length)\n for (let i = 0; i < message.shapes.length; ++i)\n $root.wjite.message.Shape.encode(message.shapes[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified Content message, length delimited. Does not implicitly {@link wjite.message.Content.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.Content\n * @static\n * @param {wjite.message.IContent} message Content message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Content.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Content message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.Content\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.Content} Content\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Content.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.Content();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n if (!(message.shapes && message.shapes.length))\n message.shapes = [];\n message.shapes.push($root.wjite.message.Shape.decode(reader, reader.uint32()));\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Content message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.Content\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.Content} Content\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Content.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Content message.\n * @function verify\n * @memberof wjite.message.Content\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Content.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.shapes != null && message.hasOwnProperty(\"shapes\")) {\n if (!Array.isArray(message.shapes))\n return \"shapes: array expected\";\n for (let i = 0; i < message.shapes.length; ++i) {\n let error = $root.wjite.message.Shape.verify(message.shapes[i]);\n if (error)\n return \"shapes.\" + error;\n }\n }\n return null;\n };\n\n /**\n * Creates a Content message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.Content\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.Content} Content\n */\n Content.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.Content)\n return object;\n let message = new $root.wjite.message.Content();\n if (object.shapes) {\n if (!Array.isArray(object.shapes))\n throw TypeError(\".wjite.message.Content.shapes: array expected\");\n message.shapes = [];\n for (let i = 0; i < object.shapes.length; ++i) {\n if (typeof object.shapes[i] !== \"object\")\n throw TypeError(\".wjite.message.Content.shapes: object expected\");\n message.shapes[i] = $root.wjite.message.Shape.fromObject(object.shapes[i]);\n }\n }\n return message;\n };\n\n /**\n * Creates a plain object from a Content message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.Content\n * @static\n * @param {wjite.message.Content} message Content\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Content.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.arrays || options.defaults)\n object.shapes = [];\n if (message.shapes && message.shapes.length) {\n object.shapes = [];\n for (let j = 0; j < message.shapes.length; ++j)\n object.shapes[j] = $root.wjite.message.Shape.toObject(message.shapes[j], options);\n }\n return object;\n };\n\n /**\n * Converts this Content to JSON.\n * @function toJSON\n * @memberof wjite.message.Content\n * @instance\n * @returns {Object.} JSON object\n */\n Content.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return Content;\n })();\n\n message.RequestBoard = (function() {\n\n /**\n * Properties of a RequestBoard.\n * @memberof wjite.message\n * @interface IRequestBoard\n * @property {string|null} [boardName] RequestBoard boardName\n * @property {string|null} [sessionID] RequestBoard sessionID\n */\n\n /**\n * Constructs a new RequestBoard.\n * @memberof wjite.message\n * @classdesc Represents a RequestBoard.\n * @implements IRequestBoard\n * @constructor\n * @param {wjite.message.IRequestBoard=} [properties] Properties to set\n */\n function RequestBoard(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * RequestBoard boardName.\n * @member {string} boardName\n * @memberof wjite.message.RequestBoard\n * @instance\n */\n RequestBoard.prototype.boardName = \"\";\n\n /**\n * RequestBoard sessionID.\n * @member {string} sessionID\n * @memberof wjite.message.RequestBoard\n * @instance\n */\n RequestBoard.prototype.sessionID = \"\";\n\n /**\n * Creates a new RequestBoard instance using the specified properties.\n * @function create\n * @memberof wjite.message.RequestBoard\n * @static\n * @param {wjite.message.IRequestBoard=} [properties] Properties to set\n * @returns {wjite.message.RequestBoard} RequestBoard instance\n */\n RequestBoard.create = function create(properties) {\n return new RequestBoard(properties);\n };\n\n /**\n * Encodes the specified RequestBoard message. Does not implicitly {@link wjite.message.RequestBoard.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.RequestBoard\n * @static\n * @param {wjite.message.IRequestBoard} message RequestBoard message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n RequestBoard.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.boardName != null && Object.hasOwnProperty.call(message, \"boardName\"))\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.boardName);\n if (message.sessionID != null && Object.hasOwnProperty.call(message, \"sessionID\"))\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.sessionID);\n return writer;\n };\n\n /**\n * Encodes the specified RequestBoard message, length delimited. Does not implicitly {@link wjite.message.RequestBoard.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.RequestBoard\n * @static\n * @param {wjite.message.IRequestBoard} message RequestBoard message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n RequestBoard.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a RequestBoard message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.RequestBoard\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.RequestBoard} RequestBoard\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n RequestBoard.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.RequestBoard();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n message.boardName = reader.string();\n break;\n case 2:\n message.sessionID = reader.string();\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a RequestBoard message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.RequestBoard\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.RequestBoard} RequestBoard\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n RequestBoard.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a RequestBoard message.\n * @function verify\n * @memberof wjite.message.RequestBoard\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n RequestBoard.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.boardName != null && message.hasOwnProperty(\"boardName\"))\n if (!$util.isString(message.boardName))\n return \"boardName: string expected\";\n if (message.sessionID != null && message.hasOwnProperty(\"sessionID\"))\n if (!$util.isString(message.sessionID))\n return \"sessionID: string expected\";\n return null;\n };\n\n /**\n * Creates a RequestBoard message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.RequestBoard\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.RequestBoard} RequestBoard\n */\n RequestBoard.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.RequestBoard)\n return object;\n let message = new $root.wjite.message.RequestBoard();\n if (object.boardName != null)\n message.boardName = String(object.boardName);\n if (object.sessionID != null)\n message.sessionID = String(object.sessionID);\n return message;\n };\n\n /**\n * Creates a plain object from a RequestBoard message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.RequestBoard\n * @static\n * @param {wjite.message.RequestBoard} message RequestBoard\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n RequestBoard.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults) {\n object.boardName = \"\";\n object.sessionID = \"\";\n }\n if (message.boardName != null && message.hasOwnProperty(\"boardName\"))\n object.boardName = message.boardName;\n if (message.sessionID != null && message.hasOwnProperty(\"sessionID\"))\n object.sessionID = message.sessionID;\n return object;\n };\n\n /**\n * Converts this RequestBoard to JSON.\n * @function toJSON\n * @memberof wjite.message.RequestBoard\n * @instance\n * @returns {Object.} JSON object\n */\n RequestBoard.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return RequestBoard;\n })();\n\n message.Ping = (function() {\n\n /**\n * Properties of a Ping.\n * @memberof wjite.message\n * @interface IPing\n */\n\n /**\n * Constructs a new Ping.\n * @memberof wjite.message\n * @classdesc Represents a Ping.\n * @implements IPing\n * @constructor\n * @param {wjite.message.IPing=} [properties] Properties to set\n */\n function Ping(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Creates a new Ping instance using the specified properties.\n * @function create\n * @memberof wjite.message.Ping\n * @static\n * @param {wjite.message.IPing=} [properties] Properties to set\n * @returns {wjite.message.Ping} Ping instance\n */\n Ping.create = function create(properties) {\n return new Ping(properties);\n };\n\n /**\n * Encodes the specified Ping message. Does not implicitly {@link wjite.message.Ping.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.Ping\n * @static\n * @param {wjite.message.IPing} message Ping message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Ping.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n return writer;\n };\n\n /**\n * Encodes the specified Ping message, length delimited. Does not implicitly {@link wjite.message.Ping.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.Ping\n * @static\n * @param {wjite.message.IPing} message Ping message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Ping.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Ping message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.Ping\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.Ping} Ping\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Ping.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.Ping();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Ping message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.Ping\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.Ping} Ping\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Ping.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Ping message.\n * @function verify\n * @memberof wjite.message.Ping\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Ping.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n return null;\n };\n\n /**\n * Creates a Ping message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.Ping\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.Ping} Ping\n */\n Ping.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.Ping)\n return object;\n return new $root.wjite.message.Ping();\n };\n\n /**\n * Creates a plain object from a Ping message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.Ping\n * @static\n * @param {wjite.message.Ping} message Ping\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Ping.toObject = function toObject() {\n return {};\n };\n\n /**\n * Converts this Ping to JSON.\n * @function toJSON\n * @memberof wjite.message.Ping\n * @instance\n * @returns {Object.} JSON object\n */\n Ping.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return Ping;\n })();\n\n message.Pong = (function() {\n\n /**\n * Properties of a Pong.\n * @memberof wjite.message\n * @interface IPong\n */\n\n /**\n * Constructs a new Pong.\n * @memberof wjite.message\n * @classdesc Represents a Pong.\n * @implements IPong\n * @constructor\n * @param {wjite.message.IPong=} [properties] Properties to set\n */\n function Pong(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Creates a new Pong instance using the specified properties.\n * @function create\n * @memberof wjite.message.Pong\n * @static\n * @param {wjite.message.IPong=} [properties] Properties to set\n * @returns {wjite.message.Pong} Pong instance\n */\n Pong.create = function create(properties) {\n return new Pong(properties);\n };\n\n /**\n * Encodes the specified Pong message. Does not implicitly {@link wjite.message.Pong.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.Pong\n * @static\n * @param {wjite.message.IPong} message Pong message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Pong.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n return writer;\n };\n\n /**\n * Encodes the specified Pong message, length delimited. Does not implicitly {@link wjite.message.Pong.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.Pong\n * @static\n * @param {wjite.message.IPong} message Pong message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Pong.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Pong message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.Pong\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.Pong} Pong\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Pong.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.Pong();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Pong message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.Pong\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.Pong} Pong\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Pong.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Pong message.\n * @function verify\n * @memberof wjite.message.Pong\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Pong.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n return null;\n };\n\n /**\n * Creates a Pong message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.Pong\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.Pong} Pong\n */\n Pong.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.Pong)\n return object;\n return new $root.wjite.message.Pong();\n };\n\n /**\n * Creates a plain object from a Pong message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.Pong\n * @static\n * @param {wjite.message.Pong} message Pong\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Pong.toObject = function toObject() {\n return {};\n };\n\n /**\n * Converts this Pong to JSON.\n * @function toJSON\n * @memberof wjite.message.Pong\n * @instance\n * @returns {Object.} JSON object\n */\n Pong.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return Pong;\n })();\n\n message.UpdateShapeID = (function() {\n\n /**\n * Properties of an UpdateShapeID.\n * @memberof wjite.message\n * @interface IUpdateShapeID\n * @property {Long|null} [tempId] UpdateShapeID tempId\n * @property {Long|null} [newId] UpdateShapeID newId\n */\n\n /**\n * Constructs a new UpdateShapeID.\n * @memberof wjite.message\n * @classdesc Represents an UpdateShapeID.\n * @implements IUpdateShapeID\n * @constructor\n * @param {wjite.message.IUpdateShapeID=} [properties] Properties to set\n */\n function UpdateShapeID(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * UpdateShapeID tempId.\n * @member {Long} tempId\n * @memberof wjite.message.UpdateShapeID\n * @instance\n */\n UpdateShapeID.prototype.tempId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;\n\n /**\n * UpdateShapeID newId.\n * @member {Long} newId\n * @memberof wjite.message.UpdateShapeID\n * @instance\n */\n UpdateShapeID.prototype.newId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;\n\n /**\n * Creates a new UpdateShapeID instance using the specified properties.\n * @function create\n * @memberof wjite.message.UpdateShapeID\n * @static\n * @param {wjite.message.IUpdateShapeID=} [properties] Properties to set\n * @returns {wjite.message.UpdateShapeID} UpdateShapeID instance\n */\n UpdateShapeID.create = function create(properties) {\n return new UpdateShapeID(properties);\n };\n\n /**\n * Encodes the specified UpdateShapeID message. Does not implicitly {@link wjite.message.UpdateShapeID.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.UpdateShapeID\n * @static\n * @param {wjite.message.IUpdateShapeID} message UpdateShapeID message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n UpdateShapeID.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.tempId != null && Object.hasOwnProperty.call(message, \"tempId\"))\n writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.tempId);\n if (message.newId != null && Object.hasOwnProperty.call(message, \"newId\"))\n writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.newId);\n return writer;\n };\n\n /**\n * Encodes the specified UpdateShapeID message, length delimited. Does not implicitly {@link wjite.message.UpdateShapeID.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.UpdateShapeID\n * @static\n * @param {wjite.message.IUpdateShapeID} message UpdateShapeID message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n UpdateShapeID.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes an UpdateShapeID message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.UpdateShapeID\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.UpdateShapeID} UpdateShapeID\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n UpdateShapeID.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.UpdateShapeID();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n message.tempId = reader.uint64();\n break;\n case 2:\n message.newId = reader.uint64();\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes an UpdateShapeID message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.UpdateShapeID\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.UpdateShapeID} UpdateShapeID\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n UpdateShapeID.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies an UpdateShapeID message.\n * @function verify\n * @memberof wjite.message.UpdateShapeID\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n UpdateShapeID.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.tempId != null && message.hasOwnProperty(\"tempId\"))\n if (!$util.isInteger(message.tempId) && !(message.tempId && $util.isInteger(message.tempId.low) && $util.isInteger(message.tempId.high)))\n return \"tempId: integer|Long expected\";\n if (message.newId != null && message.hasOwnProperty(\"newId\"))\n if (!$util.isInteger(message.newId) && !(message.newId && $util.isInteger(message.newId.low) && $util.isInteger(message.newId.high)))\n return \"newId: integer|Long expected\";\n return null;\n };\n\n /**\n * Creates an UpdateShapeID message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.UpdateShapeID\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.UpdateShapeID} UpdateShapeID\n */\n UpdateShapeID.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.UpdateShapeID)\n return object;\n let message = new $root.wjite.message.UpdateShapeID();\n if (object.tempId != null)\n if ($util.Long)\n (message.tempId = $util.Long.fromValue(object.tempId)).unsigned = true;\n else if (typeof object.tempId === \"string\")\n message.tempId = parseInt(object.tempId, 10);\n else if (typeof object.tempId === \"number\")\n message.tempId = object.tempId;\n else if (typeof object.tempId === \"object\")\n message.tempId = new $util.LongBits(object.tempId.low >>> 0, object.tempId.high >>> 0).toNumber(true);\n if (object.newId != null)\n if ($util.Long)\n (message.newId = $util.Long.fromValue(object.newId)).unsigned = true;\n else if (typeof object.newId === \"string\")\n message.newId = parseInt(object.newId, 10);\n else if (typeof object.newId === \"number\")\n message.newId = object.newId;\n else if (typeof object.newId === \"object\")\n message.newId = new $util.LongBits(object.newId.low >>> 0, object.newId.high >>> 0).toNumber(true);\n return message;\n };\n\n /**\n * Creates a plain object from an UpdateShapeID message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.UpdateShapeID\n * @static\n * @param {wjite.message.UpdateShapeID} message UpdateShapeID\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n UpdateShapeID.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults) {\n if ($util.Long) {\n let long = new $util.Long(0, 0, true);\n object.tempId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.tempId = options.longs === String ? \"0\" : 0;\n if ($util.Long) {\n let long = new $util.Long(0, 0, true);\n object.newId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.newId = options.longs === String ? \"0\" : 0;\n }\n if (message.tempId != null && message.hasOwnProperty(\"tempId\"))\n if (typeof message.tempId === \"number\")\n object.tempId = options.longs === String ? String(message.tempId) : message.tempId;\n else\n object.tempId = options.longs === String ? $util.Long.prototype.toString.call(message.tempId) : options.longs === Number ? new $util.LongBits(message.tempId.low >>> 0, message.tempId.high >>> 0).toNumber(true) : message.tempId;\n if (message.newId != null && message.hasOwnProperty(\"newId\"))\n if (typeof message.newId === \"number\")\n object.newId = options.longs === String ? String(message.newId) : message.newId;\n else\n object.newId = options.longs === String ? $util.Long.prototype.toString.call(message.newId) : options.longs === Number ? new $util.LongBits(message.newId.low >>> 0, message.newId.high >>> 0).toNumber(true) : message.newId;\n return object;\n };\n\n /**\n * Converts this UpdateShapeID to JSON.\n * @function toJSON\n * @memberof wjite.message.UpdateShapeID\n * @instance\n * @returns {Object.} JSON object\n */\n UpdateShapeID.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return UpdateShapeID;\n })();\n\n message.Event = (function() {\n\n /**\n * Properties of an Event.\n * @memberof wjite.message\n * @interface IEvent\n * @property {Long|null} [componentId] Event componentId\n * @property {string|null} [elementId] Event elementId\n * @property {string|null} [eventName] Event eventName\n * @property {google.protobuf.IStruct|null} [eventData] Event eventData\n */\n\n /**\n * Constructs a new Event.\n * @memberof wjite.message\n * @classdesc Represents an Event.\n * @implements IEvent\n * @constructor\n * @param {wjite.message.IEvent=} [properties] Properties to set\n */\n function Event(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Event componentId.\n * @member {Long} componentId\n * @memberof wjite.message.Event\n * @instance\n */\n Event.prototype.componentId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;\n\n /**\n * Event elementId.\n * @member {string} elementId\n * @memberof wjite.message.Event\n * @instance\n */\n Event.prototype.elementId = \"\";\n\n /**\n * Event eventName.\n * @member {string} eventName\n * @memberof wjite.message.Event\n * @instance\n */\n Event.prototype.eventName = \"\";\n\n /**\n * Event eventData.\n * @member {google.protobuf.IStruct|null|undefined} eventData\n * @memberof wjite.message.Event\n * @instance\n */\n Event.prototype.eventData = null;\n\n /**\n * Creates a new Event instance using the specified properties.\n * @function create\n * @memberof wjite.message.Event\n * @static\n * @param {wjite.message.IEvent=} [properties] Properties to set\n * @returns {wjite.message.Event} Event instance\n */\n Event.create = function create(properties) {\n return new Event(properties);\n };\n\n /**\n * Encodes the specified Event message. Does not implicitly {@link wjite.message.Event.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.Event\n * @static\n * @param {wjite.message.IEvent} message Event message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Event.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.componentId != null && Object.hasOwnProperty.call(message, \"componentId\"))\n writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.componentId);\n if (message.elementId != null && Object.hasOwnProperty.call(message, \"elementId\"))\n writer.uint32(/* id 4, wireType 2 =*/34).string(message.elementId);\n if (message.eventName != null && Object.hasOwnProperty.call(message, \"eventName\"))\n writer.uint32(/* id 5, wireType 2 =*/42).string(message.eventName);\n if (message.eventData != null && Object.hasOwnProperty.call(message, \"eventData\"))\n $root.google.protobuf.Struct.encode(message.eventData, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified Event message, length delimited. Does not implicitly {@link wjite.message.Event.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.Event\n * @static\n * @param {wjite.message.IEvent} message Event message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Event.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes an Event message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.Event\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.Event} Event\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Event.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.Event();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 2:\n message.componentId = reader.uint64();\n break;\n case 4:\n message.elementId = reader.string();\n break;\n case 5:\n message.eventName = reader.string();\n break;\n case 6:\n message.eventData = $root.google.protobuf.Struct.decode(reader, reader.uint32());\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes an Event message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.Event\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.Event} Event\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Event.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies an Event message.\n * @function verify\n * @memberof wjite.message.Event\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Event.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.componentId != null && message.hasOwnProperty(\"componentId\"))\n if (!$util.isInteger(message.componentId) && !(message.componentId && $util.isInteger(message.componentId.low) && $util.isInteger(message.componentId.high)))\n return \"componentId: integer|Long expected\";\n if (message.elementId != null && message.hasOwnProperty(\"elementId\"))\n if (!$util.isString(message.elementId))\n return \"elementId: string expected\";\n if (message.eventName != null && message.hasOwnProperty(\"eventName\"))\n if (!$util.isString(message.eventName))\n return \"eventName: string expected\";\n if (message.eventData != null && message.hasOwnProperty(\"eventData\")) {\n let error = $root.google.protobuf.Struct.verify(message.eventData);\n if (error)\n return \"eventData.\" + error;\n }\n return null;\n };\n\n /**\n * Creates an Event message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.Event\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.Event} Event\n */\n Event.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.Event)\n return object;\n let message = new $root.wjite.message.Event();\n if (object.componentId != null)\n if ($util.Long)\n (message.componentId = $util.Long.fromValue(object.componentId)).unsigned = true;\n else if (typeof object.componentId === \"string\")\n message.componentId = parseInt(object.componentId, 10);\n else if (typeof object.componentId === \"number\")\n message.componentId = object.componentId;\n else if (typeof object.componentId === \"object\")\n message.componentId = new $util.LongBits(object.componentId.low >>> 0, object.componentId.high >>> 0).toNumber(true);\n if (object.elementId != null)\n message.elementId = String(object.elementId);\n if (object.eventName != null)\n message.eventName = String(object.eventName);\n if (object.eventData != null) {\n if (typeof object.eventData !== \"object\")\n throw TypeError(\".wjite.message.Event.eventData: object expected\");\n message.eventData = $root.google.protobuf.Struct.fromObject(object.eventData);\n }\n return message;\n };\n\n /**\n * Creates a plain object from an Event message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.Event\n * @static\n * @param {wjite.message.Event} message Event\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Event.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults) {\n if ($util.Long) {\n let long = new $util.Long(0, 0, true);\n object.componentId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.componentId = options.longs === String ? \"0\" : 0;\n object.elementId = \"\";\n object.eventName = \"\";\n object.eventData = null;\n }\n if (message.componentId != null && message.hasOwnProperty(\"componentId\"))\n if (typeof message.componentId === \"number\")\n object.componentId = options.longs === String ? String(message.componentId) : message.componentId;\n else\n object.componentId = options.longs === String ? $util.Long.prototype.toString.call(message.componentId) : options.longs === Number ? new $util.LongBits(message.componentId.low >>> 0, message.componentId.high >>> 0).toNumber(true) : message.componentId;\n if (message.elementId != null && message.hasOwnProperty(\"elementId\"))\n object.elementId = message.elementId;\n if (message.eventName != null && message.hasOwnProperty(\"eventName\"))\n object.eventName = message.eventName;\n if (message.eventData != null && message.hasOwnProperty(\"eventData\"))\n object.eventData = $root.google.protobuf.Struct.toObject(message.eventData, options);\n return object;\n };\n\n /**\n * Converts this Event to JSON.\n * @function toJSON\n * @memberof wjite.message.Event\n * @instance\n * @returns {Object.} JSON object\n */\n Event.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return Event;\n })();\n\n message.User = (function() {\n\n /**\n * Properties of a User.\n * @memberof wjite.message\n * @interface IUser\n * @property {string|null} [name] User name\n * @property {string|null} [role] User role\n */\n\n /**\n * Constructs a new User.\n * @memberof wjite.message\n * @classdesc Represents a User.\n * @implements IUser\n * @constructor\n * @param {wjite.message.IUser=} [properties] Properties to set\n */\n function User(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * User name.\n * @member {string} name\n * @memberof wjite.message.User\n * @instance\n */\n User.prototype.name = \"\";\n\n /**\n * User role.\n * @member {string} role\n * @memberof wjite.message.User\n * @instance\n */\n User.prototype.role = \"\";\n\n /**\n * Creates a new User instance using the specified properties.\n * @function create\n * @memberof wjite.message.User\n * @static\n * @param {wjite.message.IUser=} [properties] Properties to set\n * @returns {wjite.message.User} User instance\n */\n User.create = function create(properties) {\n return new User(properties);\n };\n\n /**\n * Encodes the specified User message. Does not implicitly {@link wjite.message.User.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.User\n * @static\n * @param {wjite.message.IUser} message User message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n User.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.name != null && Object.hasOwnProperty.call(message, \"name\"))\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);\n if (message.role != null && Object.hasOwnProperty.call(message, \"role\"))\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.role);\n return writer;\n };\n\n /**\n * Encodes the specified User message, length delimited. Does not implicitly {@link wjite.message.User.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.User\n * @static\n * @param {wjite.message.IUser} message User message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n User.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a User message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.User\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.User} User\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n User.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.User();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n message.name = reader.string();\n break;\n case 2:\n message.role = reader.string();\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a User message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.User\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.User} User\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n User.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a User message.\n * @function verify\n * @memberof wjite.message.User\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n User.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.name != null && message.hasOwnProperty(\"name\"))\n if (!$util.isString(message.name))\n return \"name: string expected\";\n if (message.role != null && message.hasOwnProperty(\"role\"))\n if (!$util.isString(message.role))\n return \"role: string expected\";\n return null;\n };\n\n /**\n * Creates a User message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.User\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.User} User\n */\n User.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.User)\n return object;\n let message = new $root.wjite.message.User();\n if (object.name != null)\n message.name = String(object.name);\n if (object.role != null)\n message.role = String(object.role);\n return message;\n };\n\n /**\n * Creates a plain object from a User message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.User\n * @static\n * @param {wjite.message.User} message User\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n User.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults) {\n object.name = \"\";\n object.role = \"\";\n }\n if (message.name != null && message.hasOwnProperty(\"name\"))\n object.name = message.name;\n if (message.role != null && message.hasOwnProperty(\"role\"))\n object.role = message.role;\n return object;\n };\n\n /**\n * Converts this User to JSON.\n * @function toJSON\n * @memberof wjite.message.User\n * @instance\n * @returns {Object.} JSON object\n */\n User.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return User;\n })();\n\n message.ServerGet = (function() {\n\n /**\n * Properties of a ServerGet.\n * @memberof wjite.message\n * @interface IServerGet\n * @property {string|null} [route] ServerGet route\n * @property {string|null} [board] ServerGet board\n */\n\n /**\n * Constructs a new ServerGet.\n * @memberof wjite.message\n * @classdesc Represents a ServerGet.\n * @implements IServerGet\n * @constructor\n * @param {wjite.message.IServerGet=} [properties] Properties to set\n */\n function ServerGet(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * ServerGet route.\n * @member {string} route\n * @memberof wjite.message.ServerGet\n * @instance\n */\n ServerGet.prototype.route = \"\";\n\n /**\n * ServerGet board.\n * @member {string} board\n * @memberof wjite.message.ServerGet\n * @instance\n */\n ServerGet.prototype.board = \"\";\n\n /**\n * Creates a new ServerGet instance using the specified properties.\n * @function create\n * @memberof wjite.message.ServerGet\n * @static\n * @param {wjite.message.IServerGet=} [properties] Properties to set\n * @returns {wjite.message.ServerGet} ServerGet instance\n */\n ServerGet.create = function create(properties) {\n return new ServerGet(properties);\n };\n\n /**\n * Encodes the specified ServerGet message. Does not implicitly {@link wjite.message.ServerGet.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.ServerGet\n * @static\n * @param {wjite.message.IServerGet} message ServerGet message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ServerGet.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.route != null && Object.hasOwnProperty.call(message, \"route\"))\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.route);\n if (message.board != null && Object.hasOwnProperty.call(message, \"board\"))\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.board);\n return writer;\n };\n\n /**\n * Encodes the specified ServerGet message, length delimited. Does not implicitly {@link wjite.message.ServerGet.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.ServerGet\n * @static\n * @param {wjite.message.IServerGet} message ServerGet message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ServerGet.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a ServerGet message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.ServerGet\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.ServerGet} ServerGet\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ServerGet.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.ServerGet();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n message.route = reader.string();\n break;\n case 2:\n message.board = reader.string();\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a ServerGet message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.ServerGet\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.ServerGet} ServerGet\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ServerGet.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a ServerGet message.\n * @function verify\n * @memberof wjite.message.ServerGet\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n ServerGet.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.route != null && message.hasOwnProperty(\"route\"))\n if (!$util.isString(message.route))\n return \"route: string expected\";\n if (message.board != null && message.hasOwnProperty(\"board\"))\n if (!$util.isString(message.board))\n return \"board: string expected\";\n return null;\n };\n\n /**\n * Creates a ServerGet message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.ServerGet\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.ServerGet} ServerGet\n */\n ServerGet.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.ServerGet)\n return object;\n let message = new $root.wjite.message.ServerGet();\n if (object.route != null)\n message.route = String(object.route);\n if (object.board != null)\n message.board = String(object.board);\n return message;\n };\n\n /**\n * Creates a plain object from a ServerGet message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.ServerGet\n * @static\n * @param {wjite.message.ServerGet} message ServerGet\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n ServerGet.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults) {\n object.route = \"\";\n object.board = \"\";\n }\n if (message.route != null && message.hasOwnProperty(\"route\"))\n object.route = message.route;\n if (message.board != null && message.hasOwnProperty(\"board\"))\n object.board = message.board;\n return object;\n };\n\n /**\n * Converts this ServerGet to JSON.\n * @function toJSON\n * @memberof wjite.message.ServerGet\n * @instance\n * @returns {Object.} JSON object\n */\n ServerGet.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return ServerGet;\n })();\n\n message.ServerPut = (function() {\n\n /**\n * Properties of a ServerPut.\n * @memberof wjite.message\n * @interface IServerPut\n * @property {string|null} [sessionId] ServerPut sessionId\n */\n\n /**\n * Constructs a new ServerPut.\n * @memberof wjite.message\n * @classdesc Represents a ServerPut.\n * @implements IServerPut\n * @constructor\n * @param {wjite.message.IServerPut=} [properties] Properties to set\n */\n function ServerPut(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * ServerPut sessionId.\n * @member {string} sessionId\n * @memberof wjite.message.ServerPut\n * @instance\n */\n ServerPut.prototype.sessionId = \"\";\n\n /**\n * Creates a new ServerPut instance using the specified properties.\n * @function create\n * @memberof wjite.message.ServerPut\n * @static\n * @param {wjite.message.IServerPut=} [properties] Properties to set\n * @returns {wjite.message.ServerPut} ServerPut instance\n */\n ServerPut.create = function create(properties) {\n return new ServerPut(properties);\n };\n\n /**\n * Encodes the specified ServerPut message. Does not implicitly {@link wjite.message.ServerPut.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.ServerPut\n * @static\n * @param {wjite.message.IServerPut} message ServerPut message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ServerPut.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.sessionId != null && Object.hasOwnProperty.call(message, \"sessionId\"))\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.sessionId);\n return writer;\n };\n\n /**\n * Encodes the specified ServerPut message, length delimited. Does not implicitly {@link wjite.message.ServerPut.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.ServerPut\n * @static\n * @param {wjite.message.IServerPut} message ServerPut message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ServerPut.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a ServerPut message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.ServerPut\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.ServerPut} ServerPut\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ServerPut.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.ServerPut();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n message.sessionId = reader.string();\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a ServerPut message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.ServerPut\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.ServerPut} ServerPut\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ServerPut.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a ServerPut message.\n * @function verify\n * @memberof wjite.message.ServerPut\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n ServerPut.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.sessionId != null && message.hasOwnProperty(\"sessionId\"))\n if (!$util.isString(message.sessionId))\n return \"sessionId: string expected\";\n return null;\n };\n\n /**\n * Creates a ServerPut message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.ServerPut\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.ServerPut} ServerPut\n */\n ServerPut.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.ServerPut)\n return object;\n let message = new $root.wjite.message.ServerPut();\n if (object.sessionId != null)\n message.sessionId = String(object.sessionId);\n return message;\n };\n\n /**\n * Creates a plain object from a ServerPut message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.ServerPut\n * @static\n * @param {wjite.message.ServerPut} message ServerPut\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n ServerPut.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults)\n object.sessionId = \"\";\n if (message.sessionId != null && message.hasOwnProperty(\"sessionId\"))\n object.sessionId = message.sessionId;\n return object;\n };\n\n /**\n * Converts this ServerPut to JSON.\n * @function toJSON\n * @memberof wjite.message.ServerPut\n * @instance\n * @returns {Object.} JSON object\n */\n ServerPut.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return ServerPut;\n })();\n\n message.ClientPut = (function() {\n\n /**\n * Properties of a ClientPut.\n * @memberof wjite.message\n * @interface IClientPut\n */\n\n /**\n * Constructs a new ClientPut.\n * @memberof wjite.message\n * @classdesc Represents a ClientPut.\n * @implements IClientPut\n * @constructor\n * @param {wjite.message.IClientPut=} [properties] Properties to set\n */\n function ClientPut(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Creates a new ClientPut instance using the specified properties.\n * @function create\n * @memberof wjite.message.ClientPut\n * @static\n * @param {wjite.message.IClientPut=} [properties] Properties to set\n * @returns {wjite.message.ClientPut} ClientPut instance\n */\n ClientPut.create = function create(properties) {\n return new ClientPut(properties);\n };\n\n /**\n * Encodes the specified ClientPut message. Does not implicitly {@link wjite.message.ClientPut.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.ClientPut\n * @static\n * @param {wjite.message.IClientPut} message ClientPut message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ClientPut.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n return writer;\n };\n\n /**\n * Encodes the specified ClientPut message, length delimited. Does not implicitly {@link wjite.message.ClientPut.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.ClientPut\n * @static\n * @param {wjite.message.IClientPut} message ClientPut message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ClientPut.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a ClientPut message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.ClientPut\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.ClientPut} ClientPut\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ClientPut.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.ClientPut();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a ClientPut message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.ClientPut\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.ClientPut} ClientPut\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ClientPut.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a ClientPut message.\n * @function verify\n * @memberof wjite.message.ClientPut\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n ClientPut.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n return null;\n };\n\n /**\n * Creates a ClientPut message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.ClientPut\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.ClientPut} ClientPut\n */\n ClientPut.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.ClientPut)\n return object;\n return new $root.wjite.message.ClientPut();\n };\n\n /**\n * Creates a plain object from a ClientPut message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.ClientPut\n * @static\n * @param {wjite.message.ClientPut} message ClientPut\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n ClientPut.toObject = function toObject() {\n return {};\n };\n\n /**\n * Converts this ClientPut to JSON.\n * @function toJSON\n * @memberof wjite.message.ClientPut\n * @instance\n * @returns {Object.} JSON object\n */\n ClientPut.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return ClientPut;\n })();\n\n message.ToServer = (function() {\n\n /**\n * Properties of a ToServer.\n * @memberof wjite.message\n * @interface IToServer\n * @property {string|null} [requestBoard] ToServer requestBoard\n * @property {string|null} [requestRoute] ToServer requestRoute\n * @property {wjite.message.IAddShape|null} [addShape] ToServer addShape\n * @property {wjite.message.IUpdateShape|null} [updateShape] ToServer updateShape\n * @property {wjite.message.IRemoveShape|null} [removeShape] ToServer removeShape\n * @property {wjite.message.IClear|null} [clear] ToServer clear\n * @property {wjite.message.IPing|null} [ping] ToServer ping\n * @property {wjite.message.IPong|null} [pong] ToServer pong\n * @property {wjite.message.IContent|null} [boardContent] ToServer boardContent\n * @property {wjite.message.IUpdateShapeID|null} [updateShapeId] ToServer updateShapeId\n * @property {wjite.message.IEvent|null} [event] ToServer event\n * @property {wjite.message.IUser|null} [user] ToServer user\n * @property {string|null} [sessionId] ToServer sessionId\n * @property {wjite.message.IAddHighlight|null} [addHighlight] ToServer addHighlight\n */\n\n /**\n * Constructs a new ToServer.\n * @memberof wjite.message\n * @classdesc Represents a ToServer.\n * @implements IToServer\n * @constructor\n * @param {wjite.message.IToServer=} [properties] Properties to set\n */\n function ToServer(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * ToServer requestBoard.\n * @member {string} requestBoard\n * @memberof wjite.message.ToServer\n * @instance\n */\n ToServer.prototype.requestBoard = \"\";\n\n /**\n * ToServer requestRoute.\n * @member {string} requestRoute\n * @memberof wjite.message.ToServer\n * @instance\n */\n ToServer.prototype.requestRoute = \"\";\n\n /**\n * ToServer addShape.\n * @member {wjite.message.IAddShape|null|undefined} addShape\n * @memberof wjite.message.ToServer\n * @instance\n */\n ToServer.prototype.addShape = null;\n\n /**\n * ToServer updateShape.\n * @member {wjite.message.IUpdateShape|null|undefined} updateShape\n * @memberof wjite.message.ToServer\n * @instance\n */\n ToServer.prototype.updateShape = null;\n\n /**\n * ToServer removeShape.\n * @member {wjite.message.IRemoveShape|null|undefined} removeShape\n * @memberof wjite.message.ToServer\n * @instance\n */\n ToServer.prototype.removeShape = null;\n\n /**\n * ToServer clear.\n * @member {wjite.message.IClear|null|undefined} clear\n * @memberof wjite.message.ToServer\n * @instance\n */\n ToServer.prototype.clear = null;\n\n /**\n * ToServer ping.\n * @member {wjite.message.IPing|null|undefined} ping\n * @memberof wjite.message.ToServer\n * @instance\n */\n ToServer.prototype.ping = null;\n\n /**\n * ToServer pong.\n * @member {wjite.message.IPong|null|undefined} pong\n * @memberof wjite.message.ToServer\n * @instance\n */\n ToServer.prototype.pong = null;\n\n /**\n * ToServer boardContent.\n * @member {wjite.message.IContent|null|undefined} boardContent\n * @memberof wjite.message.ToServer\n * @instance\n */\n ToServer.prototype.boardContent = null;\n\n /**\n * ToServer updateShapeId.\n * @member {wjite.message.IUpdateShapeID|null|undefined} updateShapeId\n * @memberof wjite.message.ToServer\n * @instance\n */\n ToServer.prototype.updateShapeId = null;\n\n /**\n * ToServer event.\n * @member {wjite.message.IEvent|null|undefined} event\n * @memberof wjite.message.ToServer\n * @instance\n */\n ToServer.prototype.event = null;\n\n /**\n * ToServer user.\n * @member {wjite.message.IUser|null|undefined} user\n * @memberof wjite.message.ToServer\n * @instance\n */\n ToServer.prototype.user = null;\n\n /**\n * ToServer sessionId.\n * @member {string} sessionId\n * @memberof wjite.message.ToServer\n * @instance\n */\n ToServer.prototype.sessionId = \"\";\n\n /**\n * ToServer addHighlight.\n * @member {wjite.message.IAddHighlight|null|undefined} addHighlight\n * @memberof wjite.message.ToServer\n * @instance\n */\n ToServer.prototype.addHighlight = null;\n\n /**\n * Creates a new ToServer instance using the specified properties.\n * @function create\n * @memberof wjite.message.ToServer\n * @static\n * @param {wjite.message.IToServer=} [properties] Properties to set\n * @returns {wjite.message.ToServer} ToServer instance\n */\n ToServer.create = function create(properties) {\n return new ToServer(properties);\n };\n\n /**\n * Encodes the specified ToServer message. Does not implicitly {@link wjite.message.ToServer.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.ToServer\n * @static\n * @param {wjite.message.IToServer} message ToServer message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ToServer.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.requestBoard != null && Object.hasOwnProperty.call(message, \"requestBoard\"))\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.requestBoard);\n if (message.requestRoute != null && Object.hasOwnProperty.call(message, \"requestRoute\"))\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.requestRoute);\n if (message.addShape != null && Object.hasOwnProperty.call(message, \"addShape\"))\n $root.wjite.message.AddShape.encode(message.addShape, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();\n if (message.updateShape != null && Object.hasOwnProperty.call(message, \"updateShape\"))\n $root.wjite.message.UpdateShape.encode(message.updateShape, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();\n if (message.removeShape != null && Object.hasOwnProperty.call(message, \"removeShape\"))\n $root.wjite.message.RemoveShape.encode(message.removeShape, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();\n if (message.clear != null && Object.hasOwnProperty.call(message, \"clear\"))\n $root.wjite.message.Clear.encode(message.clear, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();\n if (message.ping != null && Object.hasOwnProperty.call(message, \"ping\"))\n $root.wjite.message.Ping.encode(message.ping, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();\n if (message.pong != null && Object.hasOwnProperty.call(message, \"pong\"))\n $root.wjite.message.Pong.encode(message.pong, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();\n if (message.boardContent != null && Object.hasOwnProperty.call(message, \"boardContent\"))\n $root.wjite.message.Content.encode(message.boardContent, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();\n if (message.updateShapeId != null && Object.hasOwnProperty.call(message, \"updateShapeId\"))\n $root.wjite.message.UpdateShapeID.encode(message.updateShapeId, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim();\n if (message.event != null && Object.hasOwnProperty.call(message, \"event\"))\n $root.wjite.message.Event.encode(message.event, writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim();\n if (message.user != null && Object.hasOwnProperty.call(message, \"user\"))\n $root.wjite.message.User.encode(message.user, writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim();\n if (message.sessionId != null && Object.hasOwnProperty.call(message, \"sessionId\"))\n writer.uint32(/* id 14, wireType 2 =*/114).string(message.sessionId);\n if (message.addHighlight != null && Object.hasOwnProperty.call(message, \"addHighlight\"))\n $root.wjite.message.AddHighlight.encode(message.addHighlight, writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified ToServer message, length delimited. Does not implicitly {@link wjite.message.ToServer.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.ToServer\n * @static\n * @param {wjite.message.IToServer} message ToServer message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ToServer.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a ToServer message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.ToServer\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.ToServer} ToServer\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ToServer.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.ToServer();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n message.requestBoard = reader.string();\n break;\n case 2:\n message.requestRoute = reader.string();\n break;\n case 3:\n message.addShape = $root.wjite.message.AddShape.decode(reader, reader.uint32());\n break;\n case 4:\n message.updateShape = $root.wjite.message.UpdateShape.decode(reader, reader.uint32());\n break;\n case 5:\n message.removeShape = $root.wjite.message.RemoveShape.decode(reader, reader.uint32());\n break;\n case 6:\n message.clear = $root.wjite.message.Clear.decode(reader, reader.uint32());\n break;\n case 7:\n message.ping = $root.wjite.message.Ping.decode(reader, reader.uint32());\n break;\n case 8:\n message.pong = $root.wjite.message.Pong.decode(reader, reader.uint32());\n break;\n case 9:\n message.boardContent = $root.wjite.message.Content.decode(reader, reader.uint32());\n break;\n case 10:\n message.updateShapeId = $root.wjite.message.UpdateShapeID.decode(reader, reader.uint32());\n break;\n case 12:\n message.event = $root.wjite.message.Event.decode(reader, reader.uint32());\n break;\n case 13:\n message.user = $root.wjite.message.User.decode(reader, reader.uint32());\n break;\n case 14:\n message.sessionId = reader.string();\n break;\n case 15:\n message.addHighlight = $root.wjite.message.AddHighlight.decode(reader, reader.uint32());\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a ToServer message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.ToServer\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.ToServer} ToServer\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ToServer.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a ToServer message.\n * @function verify\n * @memberof wjite.message.ToServer\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n ToServer.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.requestBoard != null && message.hasOwnProperty(\"requestBoard\"))\n if (!$util.isString(message.requestBoard))\n return \"requestBoard: string expected\";\n if (message.requestRoute != null && message.hasOwnProperty(\"requestRoute\"))\n if (!$util.isString(message.requestRoute))\n return \"requestRoute: string expected\";\n if (message.addShape != null && message.hasOwnProperty(\"addShape\")) {\n let error = $root.wjite.message.AddShape.verify(message.addShape);\n if (error)\n return \"addShape.\" + error;\n }\n if (message.updateShape != null && message.hasOwnProperty(\"updateShape\")) {\n let error = $root.wjite.message.UpdateShape.verify(message.updateShape);\n if (error)\n return \"updateShape.\" + error;\n }\n if (message.removeShape != null && message.hasOwnProperty(\"removeShape\")) {\n let error = $root.wjite.message.RemoveShape.verify(message.removeShape);\n if (error)\n return \"removeShape.\" + error;\n }\n if (message.clear != null && message.hasOwnProperty(\"clear\")) {\n let error = $root.wjite.message.Clear.verify(message.clear);\n if (error)\n return \"clear.\" + error;\n }\n if (message.ping != null && message.hasOwnProperty(\"ping\")) {\n let error = $root.wjite.message.Ping.verify(message.ping);\n if (error)\n return \"ping.\" + error;\n }\n if (message.pong != null && message.hasOwnProperty(\"pong\")) {\n let error = $root.wjite.message.Pong.verify(message.pong);\n if (error)\n return \"pong.\" + error;\n }\n if (message.boardContent != null && message.hasOwnProperty(\"boardContent\")) {\n let error = $root.wjite.message.Content.verify(message.boardContent);\n if (error)\n return \"boardContent.\" + error;\n }\n if (message.updateShapeId != null && message.hasOwnProperty(\"updateShapeId\")) {\n let error = $root.wjite.message.UpdateShapeID.verify(message.updateShapeId);\n if (error)\n return \"updateShapeId.\" + error;\n }\n if (message.event != null && message.hasOwnProperty(\"event\")) {\n let error = $root.wjite.message.Event.verify(message.event);\n if (error)\n return \"event.\" + error;\n }\n if (message.user != null && message.hasOwnProperty(\"user\")) {\n let error = $root.wjite.message.User.verify(message.user);\n if (error)\n return \"user.\" + error;\n }\n if (message.sessionId != null && message.hasOwnProperty(\"sessionId\"))\n if (!$util.isString(message.sessionId))\n return \"sessionId: string expected\";\n if (message.addHighlight != null && message.hasOwnProperty(\"addHighlight\")) {\n let error = $root.wjite.message.AddHighlight.verify(message.addHighlight);\n if (error)\n return \"addHighlight.\" + error;\n }\n return null;\n };\n\n /**\n * Creates a ToServer message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.ToServer\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.ToServer} ToServer\n */\n ToServer.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.ToServer)\n return object;\n let message = new $root.wjite.message.ToServer();\n if (object.requestBoard != null)\n message.requestBoard = String(object.requestBoard);\n if (object.requestRoute != null)\n message.requestRoute = String(object.requestRoute);\n if (object.addShape != null) {\n if (typeof object.addShape !== \"object\")\n throw TypeError(\".wjite.message.ToServer.addShape: object expected\");\n message.addShape = $root.wjite.message.AddShape.fromObject(object.addShape);\n }\n if (object.updateShape != null) {\n if (typeof object.updateShape !== \"object\")\n throw TypeError(\".wjite.message.ToServer.updateShape: object expected\");\n message.updateShape = $root.wjite.message.UpdateShape.fromObject(object.updateShape);\n }\n if (object.removeShape != null) {\n if (typeof object.removeShape !== \"object\")\n throw TypeError(\".wjite.message.ToServer.removeShape: object expected\");\n message.removeShape = $root.wjite.message.RemoveShape.fromObject(object.removeShape);\n }\n if (object.clear != null) {\n if (typeof object.clear !== \"object\")\n throw TypeError(\".wjite.message.ToServer.clear: object expected\");\n message.clear = $root.wjite.message.Clear.fromObject(object.clear);\n }\n if (object.ping != null) {\n if (typeof object.ping !== \"object\")\n throw TypeError(\".wjite.message.ToServer.ping: object expected\");\n message.ping = $root.wjite.message.Ping.fromObject(object.ping);\n }\n if (object.pong != null) {\n if (typeof object.pong !== \"object\")\n throw TypeError(\".wjite.message.ToServer.pong: object expected\");\n message.pong = $root.wjite.message.Pong.fromObject(object.pong);\n }\n if (object.boardContent != null) {\n if (typeof object.boardContent !== \"object\")\n throw TypeError(\".wjite.message.ToServer.boardContent: object expected\");\n message.boardContent = $root.wjite.message.Content.fromObject(object.boardContent);\n }\n if (object.updateShapeId != null) {\n if (typeof object.updateShapeId !== \"object\")\n throw TypeError(\".wjite.message.ToServer.updateShapeId: object expected\");\n message.updateShapeId = $root.wjite.message.UpdateShapeID.fromObject(object.updateShapeId);\n }\n if (object.event != null) {\n if (typeof object.event !== \"object\")\n throw TypeError(\".wjite.message.ToServer.event: object expected\");\n message.event = $root.wjite.message.Event.fromObject(object.event);\n }\n if (object.user != null) {\n if (typeof object.user !== \"object\")\n throw TypeError(\".wjite.message.ToServer.user: object expected\");\n message.user = $root.wjite.message.User.fromObject(object.user);\n }\n if (object.sessionId != null)\n message.sessionId = String(object.sessionId);\n if (object.addHighlight != null) {\n if (typeof object.addHighlight !== \"object\")\n throw TypeError(\".wjite.message.ToServer.addHighlight: object expected\");\n message.addHighlight = $root.wjite.message.AddHighlight.fromObject(object.addHighlight);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a ToServer message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.ToServer\n * @static\n * @param {wjite.message.ToServer} message ToServer\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n ToServer.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults) {\n object.requestBoard = \"\";\n object.requestRoute = \"\";\n object.addShape = null;\n object.updateShape = null;\n object.removeShape = null;\n object.clear = null;\n object.ping = null;\n object.pong = null;\n object.boardContent = null;\n object.updateShapeId = null;\n object.event = null;\n object.user = null;\n object.sessionId = \"\";\n object.addHighlight = null;\n }\n if (message.requestBoard != null && message.hasOwnProperty(\"requestBoard\"))\n object.requestBoard = message.requestBoard;\n if (message.requestRoute != null && message.hasOwnProperty(\"requestRoute\"))\n object.requestRoute = message.requestRoute;\n if (message.addShape != null && message.hasOwnProperty(\"addShape\"))\n object.addShape = $root.wjite.message.AddShape.toObject(message.addShape, options);\n if (message.updateShape != null && message.hasOwnProperty(\"updateShape\"))\n object.updateShape = $root.wjite.message.UpdateShape.toObject(message.updateShape, options);\n if (message.removeShape != null && message.hasOwnProperty(\"removeShape\"))\n object.removeShape = $root.wjite.message.RemoveShape.toObject(message.removeShape, options);\n if (message.clear != null && message.hasOwnProperty(\"clear\"))\n object.clear = $root.wjite.message.Clear.toObject(message.clear, options);\n if (message.ping != null && message.hasOwnProperty(\"ping\"))\n object.ping = $root.wjite.message.Ping.toObject(message.ping, options);\n if (message.pong != null && message.hasOwnProperty(\"pong\"))\n object.pong = $root.wjite.message.Pong.toObject(message.pong, options);\n if (message.boardContent != null && message.hasOwnProperty(\"boardContent\"))\n object.boardContent = $root.wjite.message.Content.toObject(message.boardContent, options);\n if (message.updateShapeId != null && message.hasOwnProperty(\"updateShapeId\"))\n object.updateShapeId = $root.wjite.message.UpdateShapeID.toObject(message.updateShapeId, options);\n if (message.event != null && message.hasOwnProperty(\"event\"))\n object.event = $root.wjite.message.Event.toObject(message.event, options);\n if (message.user != null && message.hasOwnProperty(\"user\"))\n object.user = $root.wjite.message.User.toObject(message.user, options);\n if (message.sessionId != null && message.hasOwnProperty(\"sessionId\"))\n object.sessionId = message.sessionId;\n if (message.addHighlight != null && message.hasOwnProperty(\"addHighlight\"))\n object.addHighlight = $root.wjite.message.AddHighlight.toObject(message.addHighlight, options);\n return object;\n };\n\n /**\n * Converts this ToServer to JSON.\n * @function toJSON\n * @memberof wjite.message.ToServer\n * @instance\n * @returns {Object.} JSON object\n */\n ToServer.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return ToServer;\n })();\n\n message.ToClient = (function() {\n\n /**\n * Properties of a ToClient.\n * @memberof wjite.message\n * @interface IToClient\n * @property {string|null} [sessionId] ToClient sessionId\n * @property {string|null} [route] ToClient route\n * @property {wjite.message.IAddShape|null} [addShape] ToClient addShape\n * @property {wjite.message.IUpdateShape|null} [updateShape] ToClient updateShape\n * @property {wjite.message.IRemoveShape|null} [removeShape] ToClient removeShape\n * @property {wjite.message.IClear|null} [clear] ToClient clear\n * @property {wjite.message.IPing|null} [ping] ToClient ping\n * @property {wjite.message.IPong|null} [pong] ToClient pong\n * @property {wjite.message.IContent|null} [boardContent] ToClient boardContent\n * @property {wjite.message.IUpdateShapeID|null} [updateShapeId] ToClient updateShapeId\n * @property {wjite.message.IEvent|null} [event] ToClient event\n * @property {wjite.message.IUser|null} [user] ToClient user\n * @property {Long|null} [connectionId] ToClient connectionId\n * @property {wjite.message.IAddHighlight|null} [addHighlight] ToClient addHighlight\n */\n\n /**\n * Constructs a new ToClient.\n * @memberof wjite.message\n * @classdesc Represents a ToClient.\n * @implements IToClient\n * @constructor\n * @param {wjite.message.IToClient=} [properties] Properties to set\n */\n function ToClient(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * ToClient sessionId.\n * @member {string} sessionId\n * @memberof wjite.message.ToClient\n * @instance\n */\n ToClient.prototype.sessionId = \"\";\n\n /**\n * ToClient route.\n * @member {string} route\n * @memberof wjite.message.ToClient\n * @instance\n */\n ToClient.prototype.route = \"\";\n\n /**\n * ToClient addShape.\n * @member {wjite.message.IAddShape|null|undefined} addShape\n * @memberof wjite.message.ToClient\n * @instance\n */\n ToClient.prototype.addShape = null;\n\n /**\n * ToClient updateShape.\n * @member {wjite.message.IUpdateShape|null|undefined} updateShape\n * @memberof wjite.message.ToClient\n * @instance\n */\n ToClient.prototype.updateShape = null;\n\n /**\n * ToClient removeShape.\n * @member {wjite.message.IRemoveShape|null|undefined} removeShape\n * @memberof wjite.message.ToClient\n * @instance\n */\n ToClient.prototype.removeShape = null;\n\n /**\n * ToClient clear.\n * @member {wjite.message.IClear|null|undefined} clear\n * @memberof wjite.message.ToClient\n * @instance\n */\n ToClient.prototype.clear = null;\n\n /**\n * ToClient ping.\n * @member {wjite.message.IPing|null|undefined} ping\n * @memberof wjite.message.ToClient\n * @instance\n */\n ToClient.prototype.ping = null;\n\n /**\n * ToClient pong.\n * @member {wjite.message.IPong|null|undefined} pong\n * @memberof wjite.message.ToClient\n * @instance\n */\n ToClient.prototype.pong = null;\n\n /**\n * ToClient boardContent.\n * @member {wjite.message.IContent|null|undefined} boardContent\n * @memberof wjite.message.ToClient\n * @instance\n */\n ToClient.prototype.boardContent = null;\n\n /**\n * ToClient updateShapeId.\n * @member {wjite.message.IUpdateShapeID|null|undefined} updateShapeId\n * @memberof wjite.message.ToClient\n * @instance\n */\n ToClient.prototype.updateShapeId = null;\n\n /**\n * ToClient event.\n * @member {wjite.message.IEvent|null|undefined} event\n * @memberof wjite.message.ToClient\n * @instance\n */\n ToClient.prototype.event = null;\n\n /**\n * ToClient user.\n * @member {wjite.message.IUser|null|undefined} user\n * @memberof wjite.message.ToClient\n * @instance\n */\n ToClient.prototype.user = null;\n\n /**\n * ToClient connectionId.\n * @member {Long} connectionId\n * @memberof wjite.message.ToClient\n * @instance\n */\n ToClient.prototype.connectionId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;\n\n /**\n * ToClient addHighlight.\n * @member {wjite.message.IAddHighlight|null|undefined} addHighlight\n * @memberof wjite.message.ToClient\n * @instance\n */\n ToClient.prototype.addHighlight = null;\n\n /**\n * Creates a new ToClient instance using the specified properties.\n * @function create\n * @memberof wjite.message.ToClient\n * @static\n * @param {wjite.message.IToClient=} [properties] Properties to set\n * @returns {wjite.message.ToClient} ToClient instance\n */\n ToClient.create = function create(properties) {\n return new ToClient(properties);\n };\n\n /**\n * Encodes the specified ToClient message. Does not implicitly {@link wjite.message.ToClient.verify|verify} messages.\n * @function encode\n * @memberof wjite.message.ToClient\n * @static\n * @param {wjite.message.IToClient} message ToClient message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ToClient.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.sessionId != null && Object.hasOwnProperty.call(message, \"sessionId\"))\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.sessionId);\n if (message.route != null && Object.hasOwnProperty.call(message, \"route\"))\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.route);\n if (message.addShape != null && Object.hasOwnProperty.call(message, \"addShape\"))\n $root.wjite.message.AddShape.encode(message.addShape, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();\n if (message.updateShape != null && Object.hasOwnProperty.call(message, \"updateShape\"))\n $root.wjite.message.UpdateShape.encode(message.updateShape, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();\n if (message.removeShape != null && Object.hasOwnProperty.call(message, \"removeShape\"))\n $root.wjite.message.RemoveShape.encode(message.removeShape, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();\n if (message.clear != null && Object.hasOwnProperty.call(message, \"clear\"))\n $root.wjite.message.Clear.encode(message.clear, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();\n if (message.ping != null && Object.hasOwnProperty.call(message, \"ping\"))\n $root.wjite.message.Ping.encode(message.ping, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();\n if (message.pong != null && Object.hasOwnProperty.call(message, \"pong\"))\n $root.wjite.message.Pong.encode(message.pong, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();\n if (message.boardContent != null && Object.hasOwnProperty.call(message, \"boardContent\"))\n $root.wjite.message.Content.encode(message.boardContent, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();\n if (message.updateShapeId != null && Object.hasOwnProperty.call(message, \"updateShapeId\"))\n $root.wjite.message.UpdateShapeID.encode(message.updateShapeId, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim();\n if (message.event != null && Object.hasOwnProperty.call(message, \"event\"))\n $root.wjite.message.Event.encode(message.event, writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim();\n if (message.user != null && Object.hasOwnProperty.call(message, \"user\"))\n $root.wjite.message.User.encode(message.user, writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim();\n if (message.connectionId != null && Object.hasOwnProperty.call(message, \"connectionId\"))\n writer.uint32(/* id 14, wireType 0 =*/112).uint64(message.connectionId);\n if (message.addHighlight != null && Object.hasOwnProperty.call(message, \"addHighlight\"))\n $root.wjite.message.AddHighlight.encode(message.addHighlight, writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified ToClient message, length delimited. Does not implicitly {@link wjite.message.ToClient.verify|verify} messages.\n * @function encodeDelimited\n * @memberof wjite.message.ToClient\n * @static\n * @param {wjite.message.IToClient} message ToClient message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ToClient.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a ToClient message from the specified reader or buffer.\n * @function decode\n * @memberof wjite.message.ToClient\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {wjite.message.ToClient} ToClient\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ToClient.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.wjite.message.ToClient();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n message.sessionId = reader.string();\n break;\n case 2:\n message.route = reader.string();\n break;\n case 3:\n message.addShape = $root.wjite.message.AddShape.decode(reader, reader.uint32());\n break;\n case 4:\n message.updateShape = $root.wjite.message.UpdateShape.decode(reader, reader.uint32());\n break;\n case 5:\n message.removeShape = $root.wjite.message.RemoveShape.decode(reader, reader.uint32());\n break;\n case 6:\n message.clear = $root.wjite.message.Clear.decode(reader, reader.uint32());\n break;\n case 7:\n message.ping = $root.wjite.message.Ping.decode(reader, reader.uint32());\n break;\n case 8:\n message.pong = $root.wjite.message.Pong.decode(reader, reader.uint32());\n break;\n case 9:\n message.boardContent = $root.wjite.message.Content.decode(reader, reader.uint32());\n break;\n case 10:\n message.updateShapeId = $root.wjite.message.UpdateShapeID.decode(reader, reader.uint32());\n break;\n case 12:\n message.event = $root.wjite.message.Event.decode(reader, reader.uint32());\n break;\n case 13:\n message.user = $root.wjite.message.User.decode(reader, reader.uint32());\n break;\n case 14:\n message.connectionId = reader.uint64();\n break;\n case 15:\n message.addHighlight = $root.wjite.message.AddHighlight.decode(reader, reader.uint32());\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a ToClient message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof wjite.message.ToClient\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {wjite.message.ToClient} ToClient\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ToClient.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a ToClient message.\n * @function verify\n * @memberof wjite.message.ToClient\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n ToClient.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.sessionId != null && message.hasOwnProperty(\"sessionId\"))\n if (!$util.isString(message.sessionId))\n return \"sessionId: string expected\";\n if (message.route != null && message.hasOwnProperty(\"route\"))\n if (!$util.isString(message.route))\n return \"route: string expected\";\n if (message.addShape != null && message.hasOwnProperty(\"addShape\")) {\n let error = $root.wjite.message.AddShape.verify(message.addShape);\n if (error)\n return \"addShape.\" + error;\n }\n if (message.updateShape != null && message.hasOwnProperty(\"updateShape\")) {\n let error = $root.wjite.message.UpdateShape.verify(message.updateShape);\n if (error)\n return \"updateShape.\" + error;\n }\n if (message.removeShape != null && message.hasOwnProperty(\"removeShape\")) {\n let error = $root.wjite.message.RemoveShape.verify(message.removeShape);\n if (error)\n return \"removeShape.\" + error;\n }\n if (message.clear != null && message.hasOwnProperty(\"clear\")) {\n let error = $root.wjite.message.Clear.verify(message.clear);\n if (error)\n return \"clear.\" + error;\n }\n if (message.ping != null && message.hasOwnProperty(\"ping\")) {\n let error = $root.wjite.message.Ping.verify(message.ping);\n if (error)\n return \"ping.\" + error;\n }\n if (message.pong != null && message.hasOwnProperty(\"pong\")) {\n let error = $root.wjite.message.Pong.verify(message.pong);\n if (error)\n return \"pong.\" + error;\n }\n if (message.boardContent != null && message.hasOwnProperty(\"boardContent\")) {\n let error = $root.wjite.message.Content.verify(message.boardContent);\n if (error)\n return \"boardContent.\" + error;\n }\n if (message.updateShapeId != null && message.hasOwnProperty(\"updateShapeId\")) {\n let error = $root.wjite.message.UpdateShapeID.verify(message.updateShapeId);\n if (error)\n return \"updateShapeId.\" + error;\n }\n if (message.event != null && message.hasOwnProperty(\"event\")) {\n let error = $root.wjite.message.Event.verify(message.event);\n if (error)\n return \"event.\" + error;\n }\n if (message.user != null && message.hasOwnProperty(\"user\")) {\n let error = $root.wjite.message.User.verify(message.user);\n if (error)\n return \"user.\" + error;\n }\n if (message.connectionId != null && message.hasOwnProperty(\"connectionId\"))\n if (!$util.isInteger(message.connectionId) && !(message.connectionId && $util.isInteger(message.connectionId.low) && $util.isInteger(message.connectionId.high)))\n return \"connectionId: integer|Long expected\";\n if (message.addHighlight != null && message.hasOwnProperty(\"addHighlight\")) {\n let error = $root.wjite.message.AddHighlight.verify(message.addHighlight);\n if (error)\n return \"addHighlight.\" + error;\n }\n return null;\n };\n\n /**\n * Creates a ToClient message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof wjite.message.ToClient\n * @static\n * @param {Object.} object Plain object\n * @returns {wjite.message.ToClient} ToClient\n */\n ToClient.fromObject = function fromObject(object) {\n if (object instanceof $root.wjite.message.ToClient)\n return object;\n let message = new $root.wjite.message.ToClient();\n if (object.sessionId != null)\n message.sessionId = String(object.sessionId);\n if (object.route != null)\n message.route = String(object.route);\n if (object.addShape != null) {\n if (typeof object.addShape !== \"object\")\n throw TypeError(\".wjite.message.ToClient.addShape: object expected\");\n message.addShape = $root.wjite.message.AddShape.fromObject(object.addShape);\n }\n if (object.updateShape != null) {\n if (typeof object.updateShape !== \"object\")\n throw TypeError(\".wjite.message.ToClient.updateShape: object expected\");\n message.updateShape = $root.wjite.message.UpdateShape.fromObject(object.updateShape);\n }\n if (object.removeShape != null) {\n if (typeof object.removeShape !== \"object\")\n throw TypeError(\".wjite.message.ToClient.removeShape: object expected\");\n message.removeShape = $root.wjite.message.RemoveShape.fromObject(object.removeShape);\n }\n if (object.clear != null) {\n if (typeof object.clear !== \"object\")\n throw TypeError(\".wjite.message.ToClient.clear: object expected\");\n message.clear = $root.wjite.message.Clear.fromObject(object.clear);\n }\n if (object.ping != null) {\n if (typeof object.ping !== \"object\")\n throw TypeError(\".wjite.message.ToClient.ping: object expected\");\n message.ping = $root.wjite.message.Ping.fromObject(object.ping);\n }\n if (object.pong != null) {\n if (typeof object.pong !== \"object\")\n throw TypeError(\".wjite.message.ToClient.pong: object expected\");\n message.pong = $root.wjite.message.Pong.fromObject(object.pong);\n }\n if (object.boardContent != null) {\n if (typeof object.boardContent !== \"object\")\n throw TypeError(\".wjite.message.ToClient.boardContent: object expected\");\n message.boardContent = $root.wjite.message.Content.fromObject(object.boardContent);\n }\n if (object.updateShapeId != null) {\n if (typeof object.updateShapeId !== \"object\")\n throw TypeError(\".wjite.message.ToClient.updateShapeId: object expected\");\n message.updateShapeId = $root.wjite.message.UpdateShapeID.fromObject(object.updateShapeId);\n }\n if (object.event != null) {\n if (typeof object.event !== \"object\")\n throw TypeError(\".wjite.message.ToClient.event: object expected\");\n message.event = $root.wjite.message.Event.fromObject(object.event);\n }\n if (object.user != null) {\n if (typeof object.user !== \"object\")\n throw TypeError(\".wjite.message.ToClient.user: object expected\");\n message.user = $root.wjite.message.User.fromObject(object.user);\n }\n if (object.connectionId != null)\n if ($util.Long)\n (message.connectionId = $util.Long.fromValue(object.connectionId)).unsigned = true;\n else if (typeof object.connectionId === \"string\")\n message.connectionId = parseInt(object.connectionId, 10);\n else if (typeof object.connectionId === \"number\")\n message.connectionId = object.connectionId;\n else if (typeof object.connectionId === \"object\")\n message.connectionId = new $util.LongBits(object.connectionId.low >>> 0, object.connectionId.high >>> 0).toNumber(true);\n if (object.addHighlight != null) {\n if (typeof object.addHighlight !== \"object\")\n throw TypeError(\".wjite.message.ToClient.addHighlight: object expected\");\n message.addHighlight = $root.wjite.message.AddHighlight.fromObject(object.addHighlight);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a ToClient message. Also converts values to other types if specified.\n * @function toObject\n * @memberof wjite.message.ToClient\n * @static\n * @param {wjite.message.ToClient} message ToClient\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n ToClient.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.defaults) {\n object.sessionId = \"\";\n object.route = \"\";\n object.addShape = null;\n object.updateShape = null;\n object.removeShape = null;\n object.clear = null;\n object.ping = null;\n object.pong = null;\n object.boardContent = null;\n object.updateShapeId = null;\n object.event = null;\n object.user = null;\n if ($util.Long) {\n let long = new $util.Long(0, 0, true);\n object.connectionId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.connectionId = options.longs === String ? \"0\" : 0;\n object.addHighlight = null;\n }\n if (message.sessionId != null && message.hasOwnProperty(\"sessionId\"))\n object.sessionId = message.sessionId;\n if (message.route != null && message.hasOwnProperty(\"route\"))\n object.route = message.route;\n if (message.addShape != null && message.hasOwnProperty(\"addShape\"))\n object.addShape = $root.wjite.message.AddShape.toObject(message.addShape, options);\n if (message.updateShape != null && message.hasOwnProperty(\"updateShape\"))\n object.updateShape = $root.wjite.message.UpdateShape.toObject(message.updateShape, options);\n if (message.removeShape != null && message.hasOwnProperty(\"removeShape\"))\n object.removeShape = $root.wjite.message.RemoveShape.toObject(message.removeShape, options);\n if (message.clear != null && message.hasOwnProperty(\"clear\"))\n object.clear = $root.wjite.message.Clear.toObject(message.clear, options);\n if (message.ping != null && message.hasOwnProperty(\"ping\"))\n object.ping = $root.wjite.message.Ping.toObject(message.ping, options);\n if (message.pong != null && message.hasOwnProperty(\"pong\"))\n object.pong = $root.wjite.message.Pong.toObject(message.pong, options);\n if (message.boardContent != null && message.hasOwnProperty(\"boardContent\"))\n object.boardContent = $root.wjite.message.Content.toObject(message.boardContent, options);\n if (message.updateShapeId != null && message.hasOwnProperty(\"updateShapeId\"))\n object.updateShapeId = $root.wjite.message.UpdateShapeID.toObject(message.updateShapeId, options);\n if (message.event != null && message.hasOwnProperty(\"event\"))\n object.event = $root.wjite.message.Event.toObject(message.event, options);\n if (message.user != null && message.hasOwnProperty(\"user\"))\n object.user = $root.wjite.message.User.toObject(message.user, options);\n if (message.connectionId != null && message.hasOwnProperty(\"connectionId\"))\n if (typeof message.connectionId === \"number\")\n object.connectionId = options.longs === String ? String(message.connectionId) : message.connectionId;\n else\n object.connectionId = options.longs === String ? $util.Long.prototype.toString.call(message.connectionId) : options.longs === Number ? new $util.LongBits(message.connectionId.low >>> 0, message.connectionId.high >>> 0).toNumber(true) : message.connectionId;\n if (message.addHighlight != null && message.hasOwnProperty(\"addHighlight\"))\n object.addHighlight = $root.wjite.message.AddHighlight.toObject(message.addHighlight, options);\n return object;\n };\n\n /**\n * Converts this ToClient to JSON.\n * @function toJSON\n * @memberof wjite.message.ToClient\n * @instance\n * @returns {Object.} JSON object\n */\n ToClient.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return ToClient;\n })();\n\n return message;\n })();\n\n return wjite;\n})();\n\nexport const google = $root.google = (() => {\n\n /**\n * Namespace google.\n * @exports google\n * @namespace\n */\n const google = {};\n\n google.protobuf = (function() {\n\n /**\n * Namespace protobuf.\n * @memberof google\n * @namespace\n */\n const protobuf = {};\n\n protobuf.Struct = (function() {\n\n /**\n * Properties of a Struct.\n * @memberof google.protobuf\n * @interface IStruct\n * @property {Object.|null} [fields] Struct fields\n */\n\n /**\n * Constructs a new Struct.\n * @memberof google.protobuf\n * @classdesc Represents a Struct.\n * @implements IStruct\n * @constructor\n * @param {google.protobuf.IStruct=} [properties] Properties to set\n */\n function Struct(properties) {\n this.fields = {};\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Struct fields.\n * @member {Object.} fields\n * @memberof google.protobuf.Struct\n * @instance\n */\n Struct.prototype.fields = $util.emptyObject;\n\n /**\n * Creates a new Struct instance using the specified properties.\n * @function create\n * @memberof google.protobuf.Struct\n * @static\n * @param {google.protobuf.IStruct=} [properties] Properties to set\n * @returns {google.protobuf.Struct} Struct instance\n */\n Struct.create = function create(properties) {\n return new Struct(properties);\n };\n\n /**\n * Encodes the specified Struct message. Does not implicitly {@link google.protobuf.Struct.verify|verify} messages.\n * @function encode\n * @memberof google.protobuf.Struct\n * @static\n * @param {google.protobuf.IStruct} message Struct message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Struct.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.fields != null && Object.hasOwnProperty.call(message, \"fields\"))\n for (let keys = Object.keys(message.fields), i = 0; i < keys.length; ++i) {\n writer.uint32(/* id 1, wireType 2 =*/10).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]);\n $root.google.protobuf.Value.encode(message.fields[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim();\n }\n return writer;\n };\n\n /**\n * Encodes the specified Struct message, length delimited. Does not implicitly {@link google.protobuf.Struct.verify|verify} messages.\n * @function encodeDelimited\n * @memberof google.protobuf.Struct\n * @static\n * @param {google.protobuf.IStruct} message Struct message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Struct.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Struct message from the specified reader or buffer.\n * @function decode\n * @memberof google.protobuf.Struct\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {google.protobuf.Struct} Struct\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Struct.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.Struct(), key, value;\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n if (message.fields === $util.emptyObject)\n message.fields = {};\n let end2 = reader.uint32() + reader.pos;\n key = \"\";\n value = null;\n while (reader.pos < end2) {\n let tag2 = reader.uint32();\n switch (tag2 >>> 3) {\n case 1:\n key = reader.string();\n break;\n case 2:\n value = $root.google.protobuf.Value.decode(reader, reader.uint32());\n break;\n default:\n reader.skipType(tag2 & 7);\n break;\n }\n }\n message.fields[key] = value;\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Struct message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof google.protobuf.Struct\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {google.protobuf.Struct} Struct\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Struct.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Struct message.\n * @function verify\n * @memberof google.protobuf.Struct\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Struct.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.fields != null && message.hasOwnProperty(\"fields\")) {\n if (!$util.isObject(message.fields))\n return \"fields: object expected\";\n let key = Object.keys(message.fields);\n for (let i = 0; i < key.length; ++i) {\n let error = $root.google.protobuf.Value.verify(message.fields[key[i]]);\n if (error)\n return \"fields.\" + error;\n }\n }\n return null;\n };\n\n /**\n * Creates a Struct message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof google.protobuf.Struct\n * @static\n * @param {Object.} object Plain object\n * @returns {google.protobuf.Struct} Struct\n */\n Struct.fromObject = function fromObject(object) {\n if (object instanceof $root.google.protobuf.Struct)\n return object;\n let message = new $root.google.protobuf.Struct();\n if (object.fields) {\n if (typeof object.fields !== \"object\")\n throw TypeError(\".google.protobuf.Struct.fields: object expected\");\n message.fields = {};\n for (let keys = Object.keys(object.fields), i = 0; i < keys.length; ++i) {\n if (typeof object.fields[keys[i]] !== \"object\")\n throw TypeError(\".google.protobuf.Struct.fields: object expected\");\n message.fields[keys[i]] = $root.google.protobuf.Value.fromObject(object.fields[keys[i]]);\n }\n }\n return message;\n };\n\n /**\n * Creates a plain object from a Struct message. Also converts values to other types if specified.\n * @function toObject\n * @memberof google.protobuf.Struct\n * @static\n * @param {google.protobuf.Struct} message Struct\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Struct.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.objects || options.defaults)\n object.fields = {};\n let keys2;\n if (message.fields && (keys2 = Object.keys(message.fields)).length) {\n object.fields = {};\n for (let j = 0; j < keys2.length; ++j)\n object.fields[keys2[j]] = $root.google.protobuf.Value.toObject(message.fields[keys2[j]], options);\n }\n return object;\n };\n\n /**\n * Converts this Struct to JSON.\n * @function toJSON\n * @memberof google.protobuf.Struct\n * @instance\n * @returns {Object.} JSON object\n */\n Struct.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return Struct;\n })();\n\n protobuf.Value = (function() {\n\n /**\n * Properties of a Value.\n * @memberof google.protobuf\n * @interface IValue\n * @property {google.protobuf.NullValue|null} [nullValue] Value nullValue\n * @property {number|null} [numberValue] Value numberValue\n * @property {string|null} [stringValue] Value stringValue\n * @property {boolean|null} [boolValue] Value boolValue\n * @property {google.protobuf.IStruct|null} [structValue] Value structValue\n * @property {google.protobuf.IListValue|null} [listValue] Value listValue\n */\n\n /**\n * Constructs a new Value.\n * @memberof google.protobuf\n * @classdesc Represents a Value.\n * @implements IValue\n * @constructor\n * @param {google.protobuf.IValue=} [properties] Properties to set\n */\n function Value(properties) {\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Value nullValue.\n * @member {google.protobuf.NullValue} nullValue\n * @memberof google.protobuf.Value\n * @instance\n */\n Value.prototype.nullValue = 0;\n\n /**\n * Value numberValue.\n * @member {number} numberValue\n * @memberof google.protobuf.Value\n * @instance\n */\n Value.prototype.numberValue = 0;\n\n /**\n * Value stringValue.\n * @member {string} stringValue\n * @memberof google.protobuf.Value\n * @instance\n */\n Value.prototype.stringValue = \"\";\n\n /**\n * Value boolValue.\n * @member {boolean} boolValue\n * @memberof google.protobuf.Value\n * @instance\n */\n Value.prototype.boolValue = false;\n\n /**\n * Value structValue.\n * @member {google.protobuf.IStruct|null|undefined} structValue\n * @memberof google.protobuf.Value\n * @instance\n */\n Value.prototype.structValue = null;\n\n /**\n * Value listValue.\n * @member {google.protobuf.IListValue|null|undefined} listValue\n * @memberof google.protobuf.Value\n * @instance\n */\n Value.prototype.listValue = null;\n\n // OneOf field names bound to virtual getters and setters\n let $oneOfFields;\n\n /**\n * Value kind.\n * @member {\"nullValue\"|\"numberValue\"|\"stringValue\"|\"boolValue\"|\"structValue\"|\"listValue\"|undefined} kind\n * @memberof google.protobuf.Value\n * @instance\n */\n Object.defineProperty(Value.prototype, \"kind\", {\n get: $util.oneOfGetter($oneOfFields = [\"nullValue\", \"numberValue\", \"stringValue\", \"boolValue\", \"structValue\", \"listValue\"]),\n set: $util.oneOfSetter($oneOfFields)\n });\n\n /**\n * Creates a new Value instance using the specified properties.\n * @function create\n * @memberof google.protobuf.Value\n * @static\n * @param {google.protobuf.IValue=} [properties] Properties to set\n * @returns {google.protobuf.Value} Value instance\n */\n Value.create = function create(properties) {\n return new Value(properties);\n };\n\n /**\n * Encodes the specified Value message. Does not implicitly {@link google.protobuf.Value.verify|verify} messages.\n * @function encode\n * @memberof google.protobuf.Value\n * @static\n * @param {google.protobuf.IValue} message Value message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Value.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.nullValue != null && Object.hasOwnProperty.call(message, \"nullValue\"))\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.nullValue);\n if (message.numberValue != null && Object.hasOwnProperty.call(message, \"numberValue\"))\n writer.uint32(/* id 2, wireType 1 =*/17).double(message.numberValue);\n if (message.stringValue != null && Object.hasOwnProperty.call(message, \"stringValue\"))\n writer.uint32(/* id 3, wireType 2 =*/26).string(message.stringValue);\n if (message.boolValue != null && Object.hasOwnProperty.call(message, \"boolValue\"))\n writer.uint32(/* id 4, wireType 0 =*/32).bool(message.boolValue);\n if (message.structValue != null && Object.hasOwnProperty.call(message, \"structValue\"))\n $root.google.protobuf.Struct.encode(message.structValue, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();\n if (message.listValue != null && Object.hasOwnProperty.call(message, \"listValue\"))\n $root.google.protobuf.ListValue.encode(message.listValue, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified Value message, length delimited. Does not implicitly {@link google.protobuf.Value.verify|verify} messages.\n * @function encodeDelimited\n * @memberof google.protobuf.Value\n * @static\n * @param {google.protobuf.IValue} message Value message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Value.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Value message from the specified reader or buffer.\n * @function decode\n * @memberof google.protobuf.Value\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {google.protobuf.Value} Value\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Value.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.Value();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n message.nullValue = reader.int32();\n break;\n case 2:\n message.numberValue = reader.double();\n break;\n case 3:\n message.stringValue = reader.string();\n break;\n case 4:\n message.boolValue = reader.bool();\n break;\n case 5:\n message.structValue = $root.google.protobuf.Struct.decode(reader, reader.uint32());\n break;\n case 6:\n message.listValue = $root.google.protobuf.ListValue.decode(reader, reader.uint32());\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Value message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof google.protobuf.Value\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {google.protobuf.Value} Value\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Value.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Value message.\n * @function verify\n * @memberof google.protobuf.Value\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Value.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n let properties = {};\n if (message.nullValue != null && message.hasOwnProperty(\"nullValue\")) {\n properties.kind = 1;\n switch (message.nullValue) {\n default:\n return \"nullValue: enum value expected\";\n case 0:\n break;\n }\n }\n if (message.numberValue != null && message.hasOwnProperty(\"numberValue\")) {\n if (properties.kind === 1)\n return \"kind: multiple values\";\n properties.kind = 1;\n if (typeof message.numberValue !== \"number\")\n return \"numberValue: number expected\";\n }\n if (message.stringValue != null && message.hasOwnProperty(\"stringValue\")) {\n if (properties.kind === 1)\n return \"kind: multiple values\";\n properties.kind = 1;\n if (!$util.isString(message.stringValue))\n return \"stringValue: string expected\";\n }\n if (message.boolValue != null && message.hasOwnProperty(\"boolValue\")) {\n if (properties.kind === 1)\n return \"kind: multiple values\";\n properties.kind = 1;\n if (typeof message.boolValue !== \"boolean\")\n return \"boolValue: boolean expected\";\n }\n if (message.structValue != null && message.hasOwnProperty(\"structValue\")) {\n if (properties.kind === 1)\n return \"kind: multiple values\";\n properties.kind = 1;\n {\n let error = $root.google.protobuf.Struct.verify(message.structValue);\n if (error)\n return \"structValue.\" + error;\n }\n }\n if (message.listValue != null && message.hasOwnProperty(\"listValue\")) {\n if (properties.kind === 1)\n return \"kind: multiple values\";\n properties.kind = 1;\n {\n let error = $root.google.protobuf.ListValue.verify(message.listValue);\n if (error)\n return \"listValue.\" + error;\n }\n }\n return null;\n };\n\n /**\n * Creates a Value message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof google.protobuf.Value\n * @static\n * @param {Object.} object Plain object\n * @returns {google.protobuf.Value} Value\n */\n Value.fromObject = function fromObject(object) {\n if (object instanceof $root.google.protobuf.Value)\n return object;\n let message = new $root.google.protobuf.Value();\n switch (object.nullValue) {\n case \"NULL_VALUE\":\n case 0:\n message.nullValue = 0;\n break;\n }\n if (object.numberValue != null)\n message.numberValue = Number(object.numberValue);\n if (object.stringValue != null)\n message.stringValue = String(object.stringValue);\n if (object.boolValue != null)\n message.boolValue = Boolean(object.boolValue);\n if (object.structValue != null) {\n if (typeof object.structValue !== \"object\")\n throw TypeError(\".google.protobuf.Value.structValue: object expected\");\n message.structValue = $root.google.protobuf.Struct.fromObject(object.structValue);\n }\n if (object.listValue != null) {\n if (typeof object.listValue !== \"object\")\n throw TypeError(\".google.protobuf.Value.listValue: object expected\");\n message.listValue = $root.google.protobuf.ListValue.fromObject(object.listValue);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a Value message. Also converts values to other types if specified.\n * @function toObject\n * @memberof google.protobuf.Value\n * @static\n * @param {google.protobuf.Value} message Value\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Value.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (message.nullValue != null && message.hasOwnProperty(\"nullValue\")) {\n object.nullValue = options.enums === String ? $root.google.protobuf.NullValue[message.nullValue] : message.nullValue;\n if (options.oneofs)\n object.kind = \"nullValue\";\n }\n if (message.numberValue != null && message.hasOwnProperty(\"numberValue\")) {\n object.numberValue = options.json && !isFinite(message.numberValue) ? String(message.numberValue) : message.numberValue;\n if (options.oneofs)\n object.kind = \"numberValue\";\n }\n if (message.stringValue != null && message.hasOwnProperty(\"stringValue\")) {\n object.stringValue = message.stringValue;\n if (options.oneofs)\n object.kind = \"stringValue\";\n }\n if (message.boolValue != null && message.hasOwnProperty(\"boolValue\")) {\n object.boolValue = message.boolValue;\n if (options.oneofs)\n object.kind = \"boolValue\";\n }\n if (message.structValue != null && message.hasOwnProperty(\"structValue\")) {\n object.structValue = $root.google.protobuf.Struct.toObject(message.structValue, options);\n if (options.oneofs)\n object.kind = \"structValue\";\n }\n if (message.listValue != null && message.hasOwnProperty(\"listValue\")) {\n object.listValue = $root.google.protobuf.ListValue.toObject(message.listValue, options);\n if (options.oneofs)\n object.kind = \"listValue\";\n }\n return object;\n };\n\n /**\n * Converts this Value to JSON.\n * @function toJSON\n * @memberof google.protobuf.Value\n * @instance\n * @returns {Object.} JSON object\n */\n Value.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return Value;\n })();\n\n /**\n * NullValue enum.\n * @name google.protobuf.NullValue\n * @enum {number}\n * @property {number} NULL_VALUE=0 NULL_VALUE value\n */\n protobuf.NullValue = (function() {\n const valuesById = {}, values = Object.create(valuesById);\n values[valuesById[0] = \"NULL_VALUE\"] = 0;\n return values;\n })();\n\n protobuf.ListValue = (function() {\n\n /**\n * Properties of a ListValue.\n * @memberof google.protobuf\n * @interface IListValue\n * @property {Array.|null} [values] ListValue values\n */\n\n /**\n * Constructs a new ListValue.\n * @memberof google.protobuf\n * @classdesc Represents a ListValue.\n * @implements IListValue\n * @constructor\n * @param {google.protobuf.IListValue=} [properties] Properties to set\n */\n function ListValue(properties) {\n this.values = [];\n if (properties)\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * ListValue values.\n * @member {Array.} values\n * @memberof google.protobuf.ListValue\n * @instance\n */\n ListValue.prototype.values = $util.emptyArray;\n\n /**\n * Creates a new ListValue instance using the specified properties.\n * @function create\n * @memberof google.protobuf.ListValue\n * @static\n * @param {google.protobuf.IListValue=} [properties] Properties to set\n * @returns {google.protobuf.ListValue} ListValue instance\n */\n ListValue.create = function create(properties) {\n return new ListValue(properties);\n };\n\n /**\n * Encodes the specified ListValue message. Does not implicitly {@link google.protobuf.ListValue.verify|verify} messages.\n * @function encode\n * @memberof google.protobuf.ListValue\n * @static\n * @param {google.protobuf.IListValue} message ListValue message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ListValue.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.values != null && message.values.length)\n for (let i = 0; i < message.values.length; ++i)\n $root.google.protobuf.Value.encode(message.values[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified ListValue message, length delimited. Does not implicitly {@link google.protobuf.ListValue.verify|verify} messages.\n * @function encodeDelimited\n * @memberof google.protobuf.ListValue\n * @static\n * @param {google.protobuf.IListValue} message ListValue message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ListValue.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a ListValue message from the specified reader or buffer.\n * @function decode\n * @memberof google.protobuf.ListValue\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {google.protobuf.ListValue} ListValue\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ListValue.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.protobuf.ListValue();\n while (reader.pos < end) {\n let tag = reader.uint32();\n switch (tag >>> 3) {\n case 1:\n if (!(message.values && message.values.length))\n message.values = [];\n message.values.push($root.google.protobuf.Value.decode(reader, reader.uint32()));\n break;\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a ListValue message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof google.protobuf.ListValue\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {google.protobuf.ListValue} ListValue\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ListValue.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a ListValue message.\n * @function verify\n * @memberof google.protobuf.ListValue\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n ListValue.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.values != null && message.hasOwnProperty(\"values\")) {\n if (!Array.isArray(message.values))\n return \"values: array expected\";\n for (let i = 0; i < message.values.length; ++i) {\n let error = $root.google.protobuf.Value.verify(message.values[i]);\n if (error)\n return \"values.\" + error;\n }\n }\n return null;\n };\n\n /**\n * Creates a ListValue message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof google.protobuf.ListValue\n * @static\n * @param {Object.} object Plain object\n * @returns {google.protobuf.ListValue} ListValue\n */\n ListValue.fromObject = function fromObject(object) {\n if (object instanceof $root.google.protobuf.ListValue)\n return object;\n let message = new $root.google.protobuf.ListValue();\n if (object.values) {\n if (!Array.isArray(object.values))\n throw TypeError(\".google.protobuf.ListValue.values: array expected\");\n message.values = [];\n for (let i = 0; i < object.values.length; ++i) {\n if (typeof object.values[i] !== \"object\")\n throw TypeError(\".google.protobuf.ListValue.values: object expected\");\n message.values[i] = $root.google.protobuf.Value.fromObject(object.values[i]);\n }\n }\n return message;\n };\n\n /**\n * Creates a plain object from a ListValue message. Also converts values to other types if specified.\n * @function toObject\n * @memberof google.protobuf.ListValue\n * @static\n * @param {google.protobuf.ListValue} message ListValue\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n ListValue.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n let object = {};\n if (options.arrays || options.defaults)\n object.values = [];\n if (message.values && message.values.length) {\n object.values = [];\n for (let j = 0; j < message.values.length; ++j)\n object.values[j] = $root.google.protobuf.Value.toObject(message.values[j], options);\n }\n return object;\n };\n\n /**\n * Converts this ListValue to JSON.\n * @function toJSON\n * @memberof google.protobuf.ListValue\n * @instance\n * @returns {Object.} JSON object\n */\n ListValue.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n return ListValue;\n })();\n\n return protobuf;\n })();\n\n return google;\n})();\n\nexport { $root as default };\n","import { action, makeAutoObservable, makeObservable, observable } from \"mobx\"\nimport { wjite } from \"../proto/request\"\n\nconst RECONNECT_TIMEOUT = 1000\n\nexport class SocketConnection {\n connectListeners: (() => void)[] = []\n disconnectListeners: (() => void)[] = []\n messageListeners: ((msg: wjite.message.IToClient) => void)[] = []\n\n websocket?: WebSocket\n connected = false\n connectInterval?: number\n\n constructor() {\n console.log(\"New connection\")\n makeObservable(this, {\n connected:observable\n })\n\n }\n reconnect() {\n this.requestConnection()\n }\n\n @action\n setConnected(connected: boolean) {\n console.log(\"SetConnected\", connected)\n this.connected = connected\n }\n\n requestConnection() {\n console.log(\"SocketConnection::requestConnection\")\n if (this.websocket) return\n //export const WSOCKET_URL = \n let url = \"wss://o-whiteboard.com/ws\"\n if (!process.env.NODE_ENV || process.env.NODE_ENV === 'development') {\n url = \"ws://localhost:8080/ws\"\n }\n\n\n this.websocket = new WebSocket(url)\n this.websocket.binaryType = \"arraybuffer\"\n this.websocket.addEventListener(\"open\", () => {\n console.log(\"Websocket open\")\n this.setConnected(true);\n if (this.connectInterval) { clearInterval(this.connectInterval); this.connectInterval = undefined }\n this.connectListeners.forEach(callback => { callback() });\n })\n\n this.websocket.addEventListener(\"close\", () => {\n console.log(\"Websocket close\")\n\n this.websocket = undefined\n this.setConnected(false)\n this.disconnectListeners.forEach(callback => { callback() });\n this.connectInterval = setTimeout(() => { this.reconnect() }, RECONNECT_TIMEOUT)\n })\n\n this.websocket.addEventListener(\"error\", (err) => {\n console.log(\"Websocket error\")\n })\n\n this.websocket.addEventListener(\"message\", (event) => {\n const clientMessage = wjite.message.ToClient.decode(new Uint8Array(event.data as ArrayBuffer))\n this.messageListeners.forEach(callback => callback(clientMessage))\n })\n }\n\n disconnect() {\n console.log(\"Disconnecting web socket\")\n this.connected = false\n this.websocket?.close()\n this.connectInterval && clearInterval(this.connectInterval)\n }\n\n send(msg: wjite.message.IToServer) {\n if (this.websocket)\n this.websocket.send(wjite.message.ToServer.encode(msg).finish())\n else {\n throw new Error(\"Sending with invalid connection state\")\n }\n }\n\n addEventListener(event: \"connect\" | \"disconnect\", listener: () => void) {\n if (event === \"connect\")\n this.connectListeners.push(listener)\n else if (event === \"disconnect\")\n this.disconnectListeners.push(listener)\n }\n\n addMessageListener(listener: (msg: wjite.message.IToClient) => void) {\n this.messageListeners.push(listener)\n }\n}\n\nexport const socketConnection = new SocketConnection()","import { FigureShape, FigureShapeType, ImageShape, Shape, ShapeType, StickerContentType, StickerShape, StrokeShape, TextAreaShape, TextShape, Transform } from \"../model/shape\"\nimport { wjite } from \"../proto/request\"\nimport Long from \"long\"\n\nexport function message2modelTransform(transform: wjite.message.ITransform | null | undefined): Transform {\n return {\n r: transform?.r || 0,\n sx: transform?.sx || 1,\n sy: transform?.sy || 1,\n tx: transform?.tx || 0,\n ty: transform?.ty || 0,\n\n }\n}\n\nexport function message2modelShape(shape : wjite.message.IShape) : Shape {\n if (shape.stroke) {\n\n const PointArray = (shape.stroke.points || []).map(pnt => [pnt.x as number, pnt.y as number])\n const s: StrokeShape = {\n Closed: shape.stroke.closed || false,\n Color: shape.stroke.color || \"black\",\n ID: shape.ID || Long.ZERO,\n Opacity: shape.stroke.opacity || 1,\n OwnerID: shape.ownerID || Long.ZERO,\n Smooth: shape.stroke.smooth || false,\n Type: ShapeType.Stroke,\n Width: shape.stroke.width || 1,\n transform: message2modelTransform(shape.transform),\n PointArray\n\n\n }\n return s\n\n }else if (shape.figure) {\n const s: FigureShape = {\n ID: shape.ID || Long.ZERO,\n OwnerID: shape.ownerID || Long.ZERO,\n transform: message2modelTransform(shape.transform),\n Type: ShapeType.Figure,\n Color: shape.figure.color || \"black\",\n Fill: shape.figure.fill || false,\n Width : shape.figure.width || 100,\n Height : shape.figure.height || 100,\n Opacity : shape.figure.opacity || 1,\n ShapeType : shape.figure.figureType as number as FigureShapeType || FigureShapeType.Rectangle,\n StrokeWidth : shape.figure.strokeWidth || 2\n\n\n }\n return s\n\n } else if (shape.text) {\n const s: TextShape = {\n ID: shape.ID || Long.ZERO,\n OwnerID: shape.ownerID || Long.ZERO,\n transform: message2modelTransform(shape.transform),\n Type: ShapeType.Text,\n Color: shape.text.color || \"black\",\n Content: shape.text.content || \"\",\n Family: shape.text.family || \"\",\n Size: shape.text.size || 12,\n\n\n }\n return s\n } else if (shape.textArea) {\n const s: TextAreaShape = {\n ID: shape.ID || Long.ZERO,\n OwnerID: shape.ownerID || Long.ZERO,\n transform: message2modelTransform(shape.transform),\n Type: ShapeType.TextArea,\n Color: shape.textArea.color || \"black\",\n Content: shape.textArea.content || \"\",\n Family: shape.textArea.family || \"\",\n Size: shape.textArea.size || 12,\n Height: shape.textArea.height || 100,\n Width: shape.textArea.width || 100,\n Style: shape.textArea.style || \"\"\n\n\n }\n return s\n } else if (shape.sticker) {\n let contentType : StickerContentType = StickerContentType.Markdown\n if (shape.sticker.contentType) {\n contentType = shape.sticker.contentType as number as StickerContentType\n }\n const s: StickerShape = {\n ID: shape.ID || Long.ZERO,\n OwnerID: shape.ownerID || Long.ZERO,\n transform: message2modelTransform(shape.transform),\n Type: ShapeType.Sticker,\n Color : \"lightyellow\",\n Content : shape.sticker.content || \"\",\n FontSize : shape.sticker.fontSize || 12,\n Height : shape.sticker.height || 100,\n Width : shape.sticker.width || 100,\n StickerContentType : contentType\n }\n return s\n \n } else if (shape.image) {\n const s : ImageShape = {\n ID: shape.ID || Long.ZERO,\n OwnerID: shape.ownerID || Long.ZERO,\n transform: message2modelTransform(shape.transform),\n Type: ShapeType.Image,\n Src : shape.image.src || \"\"\n }\n return s\n \n } else throw new Error(\"Converting unknown shape\")\n\n\n}\n","\nimport log from \"loglevel\";\nimport { controller } from '../controller/controller';\nimport { WChart } from \"../helpers/WChart\";\nimport { logger } from \"../logging/logger\";\nimport { AccessMode } from \"../model/board\";\nimport { ConnectionState } from \"../model/connectionState\";\nimport { Session } from \"../model/session\";\nimport { ChartShape, ImageShape, ShapeType, StickerShape, StrokeShape, TextAreaShape, TextShape } from \"../model/shape\";\nimport { WImage } from \"../model/WImage\";\nimport { wjite } from \"../proto/request\";\nimport { store, User } from \"../store/store\";\nimport { uiStore } from '../store/UIState';\nimport { message2modelShape, message2modelTransform } from \"./message2model\";\nimport { AddStrokeNotify, UpdateTextNotify } from \"./socketReponse\";\n\n\nexport class SocketCallbacks {\n setConnectionState(connectionState: ConnectionState, session: Session) {\n logger.info({ message: \"setConnectionState\", data: { connectionStateID: connectionState.ConnectionID, SessionID: session.SessionID, userID: session.User.ID } })\n store.connectionState = connectionState\n localStorage.setItem('sessionID', session.SessionID)\n }\n setBoardList = (boardList: { _id: string, boardName: string }[]) => {\n log.debug(\"Controller::setBoardList\", boardList)\n uiStore.boards = boardList\n }\n setBoardUsers(users: User[]) {\n log.info('<= setBoardUsers', users);\n uiStore.boardUsers = users\n // rpcController.setBoardUsers(users)\n }\n addShape(addShape: wjite.message.IAddShape) {\n\n if (addShape.shape) {\n logger.info({ message: \"SocketCallbacks::addShape notify\", data: { ID: addShape.shape.ID } })\n const shape = message2modelShape(addShape.shape)\n if (shape?.Type === ShapeType.Image) {\n const img = new WImage(shape as ImageShape)\n img.load().then(() => {\n store.board.shapes.push(img)\n controller.layerController?.updateRenderedFigures()\n })\n } else if (shape?.Type === ShapeType.Sticker) {\n store.board.stickers.push(shape as StickerShape)\n store.board.shapes.push(shape)\n controller.layerController?.updateRenderedFigures()\n\n\n } else if (shape?.Type === ShapeType.Chart) {\n const wshape = new WChart(shape as ChartShape)\n wshape.calcDefinition()\n store.addShape(wshape)\n controller.layerController?.updateRenderedFigures()\n\n\n } else if (shape) {\n store.board.shapes.push(shape)\n controller.layerController?.updateRenderedFigures()\n\n }\n\n }\n\n\n\n }\n addHighlight(msg: wjite.message.IAddHighlight) {\n // addHighlight(msg: { stroke: StrokeShape, transform?: { k: number, x: number, y: number } }) {\n if (!msg.shape) throw new Error(\"Highlight shape not defined\")\n const shape = message2modelShape(msg.shape)\n\n log.info(\"=>onAddHighligh\", msg)\n controller.addHighlight(shape as StrokeShape, msg.focus as boolean )\n }\n\n\n removeShape(msg: wjite.message.IRemoveShape) {\n log.info('<= removeShape', msg);\n const shape = store.board.shapes.find(shape => shape.ID.equals(msg.shapeID as Long.Long))\n if (shape) {\n store.removeShape(shape)\n controller.layerController?.updateRenderedFigures()\n } else {\n logger.error({ message: \"Shape id not found\", data: msg.shapeID })\n }\n // }\n }\n\n updateShape(updateShape: wjite.message.IUpdateShape) {\n logger.info(\"socketCallbacks::updateShape\")\n if (updateShape.shape && updateShape.shape.ID) {\n const shape = store.getShape(updateShape.shape.ID)\n shape.transform = message2modelTransform(updateShape.shape.transform)\n if (updateShape.shape.text && shape.Type === ShapeType.Text) {\n const textShape = shape as TextShape\n textShape.Color = updateShape.shape.text.color || \"black\"\n textShape.Content = updateShape.shape.text.content || \"\"\n textShape.Family = updateShape.shape.text.family || \"\"\n textShape.Size = updateShape.shape.text.size || 12\n\n }\n if (updateShape.shape.textArea && shape.Type === ShapeType.TextArea) {\n const textAreaShape = shape as TextAreaShape\n textAreaShape.Color = updateShape.shape.textArea.color || \"black\"\n textAreaShape.Content = updateShape.shape.textArea.content || \"\"\n textAreaShape.Family = updateShape.shape.textArea.family || \"\"\n textAreaShape.Size = updateShape.shape.textArea.size || 12\n textAreaShape.Width = updateShape.shape.textArea.width || 100\n textAreaShape.Height = updateShape.shape.textArea.height || 100\n }\n if (updateShape.shape.sticker && shape.Type === ShapeType.Sticker) {\n\n const stickerShape = shape as StickerShape\n stickerShape.Color = updateShape.shape.sticker.color || \"black\"\n stickerShape.Content = updateShape.shape.sticker.content || \"\"\n stickerShape.Width = updateShape.shape.sticker.width || 100\n stickerShape.Height = updateShape.shape.sticker.height || 100\n stickerShape.FontSize = updateShape.shape.sticker.fontSize || 12\n\n let idx = store.board.stickers.findIndex(s => s.ID.equals(stickerShape.ID))\n if (idx > -1) store.board.stickers[idx] = stickerShape\n\n }\n\n controller.layerController?.updateShape(shape)\n if (store.board.editedShape && store.board.editedShape.ID.equals(shape.ID)) {\n store.setEditedShape(shape)\n controller.board?.dynLayer.hideTransformer()\n controller.board?.dynLayer.showTransformer(shape)\n controller.layerController?.updateRenderedFigures()\n\n }\n\n\n\n }\n //controller.updateShape(shape)\n }\n addSticker(sticker: StickerShape) {\n store.board.stickers.push(sticker)\n\n }\n\n addStroke(strokeNotify: AddStrokeNotify) {\n logger.info({ message: \"SocketCallbacks::addStroke\", data: strokeNotify.Stroke.ID })\n store.board.shapes.push(strokeNotify.Stroke)\n // controller.layerController?.board.baseLayer.clear()\n controller.layerController?.updateRenderedFigures()\n\n }\n\n updateText(textNotify: UpdateTextNotify) {\n logger.info({ message: \"SocketCallbacks::updateText\", data: textNotify.Text.Content })\n controller.updateShape(textNotify.Text)\n }\n\n\n\n\n\n setAccessMode(msg: { accessMode: AccessMode }) {\n controller.setAccessMode(msg.accessMode)\n\n }\n\n clear() {\n logger.info('SocketCallbacks::clear');\n store.clear()\n controller.layerController?.updateRenderedFigures()\n // controller.layerController?.redraw()\n\n }\n}","import Long from \"long\";\nimport protobuf from 'protobufjs/minimal';\nimport { socketConnection } from '../connection/socketConnection';\nimport { logger } from \"../logging/logger\";\nimport { AccessMode } from \"../model/board\";\nimport { ChartShape, FigureShape, ImageShape, Shape, ShapeType, StickerShape, StrokeShape, TextAreaShape, TextShape } from \"../model/shape\";\nimport { wjite } from '../proto/request';\nimport { message2modelShape } from \"../socket/message2model\";\nimport { SocketCallbacks } from \"../socket/socketCallbacks\";\nimport { store, User } from '../store/store';\nimport { Controller } from \"./controller\";\nprotobuf.util.Long = Long\nprotobuf.configure()\n\nfunction getUserToken() {\n return localStorage['token']\n}\n\n\nexport class SocketController {\n controller: Controller;\n tempShapes: Map;\n updateIdCallbacks: Mapvoid>;\n \n addShape(shape: Shape, arg1: (id: any) => any) {\n throw new Error(\"Method not implemented.\");\n }\n addWChart(arg0: ChartShape, arg1: (id: any) => any) {\n throw new Error(\"Method not implemented.\");\n }\n\n websocket?: WebSocket;\n nextTempShapeID: Long.Long = Long.ONE\n callbacks: SocketCallbacks;\n reconnectTimeout: number = 0;\n replyTimeout: number = 0;\n pingTimeout: number = 0\n\n REPLY_TIMEOUT = 5000\n PING_TIMEOUT = 5000\n\n\n constructor(controller: Controller) {\n this.callbacks = new SocketCallbacks()\n socketConnection.addEventListener(\"connect\", this.onConnect)\n socketConnection.addMessageListener(this.onMessage)\n this.controller= controller\n this.tempShapes = new Map()\n this.updateIdCallbacks = new Map()\n }\n\n connect() {\n socketConnection.requestConnection()\n }\n\n onConnect = () => {\n if (store.board.name != \"\")\n this.requestBoardContent(store.board.name)\n\n // clearTimeout(this.replyTimeout); this.replyTimeout = 0;\n // logger.info({ message: \"SocketController:...:onopen\" })\n //establishing connection\n\n // socketConnection.send({\n // connect: message.Connect.create({\n // boardName: store.connectionState.BoardName,\n // sessionID: localStorage['sessionID']\n // })\n // })\n\n //this.websocket?.send(msg)\n //this.replyTimeout = setTimeout(this.noReplyTimeoutHandler, this.REPLY_TIMEOUT) \n }\n\n onMessage = (message: wjite.message.IToClient) => {\n console.log(\"^^Receive message\", message);\n // clearTimeout(this.replyTimeout); this.replyTimeout = 0;\n // clearTimeout(this.pingTimeout); this.pingTimeout = 0;\n // this.pingTimeout = setTimeout(this.ping, this.PING_TIMEOUT);\n if (message.sessionId) {\n localStorage.setItem('SessionID', message.sessionId)\n }\n if (message.boardContent) {\n const shapes : Shape[] = []\n\n const stickers : StickerShape[] = []\n for (let shape of message.boardContent.shapes || []) {\n const modelShape = message2modelShape(shape)\n if (modelShape) shapes.push(modelShape)\n if (modelShape?.Type === ShapeType.Sticker)\n stickers.push(modelShape as StickerShape)\n \n }\n this.controller.setBoard(Long.ZERO, shapes, stickers)\n \n }\n\n if (message.updateShapeId) {\n this.updateShapeId(message.updateShapeId.tempId as Long.Long, message.updateShapeId.newId as Long.Long)\n }\n\n if (message.addShape) {\n this.callbacks.addShape(message.addShape)\n }\n\n if (message.addHighlight) {\n this.callbacks.addHighlight(message.addHighlight)\n }\n if (message.updateShape) {\n this.callbacks.updateShape(message.updateShape)\n }\n if (message.removeShape) {\n this.callbacks.removeShape(message.removeShape)\n }\n if (message.clear) {\n this.callbacks.clear()\n }\n }\n\n\n setAccessMode(accessMode: AccessMode) {\n // this.socket.emit(\"setAccessMode\", { accessMode })\n }\n async addImage(image: ImageShape, imageFile: Blob, fn: (id: Long.Long, src: string) => void) {\n logger.info({ message: \"SocketController::addIamge\", data: imageFile.size })\n const array = new Uint8Array(await imageFile.arrayBuffer())\n const tempId = this.getTempShapeID(image)\n socketConnection.send({\n addShape: wjite.message.AddShape.create({\n shape: wjite.message.Shape.create({\n transform: wjite.message.Transform.fromObject(image.transform),\n image: wjite.message.Image.create({\n blob: array\n })\n }),\n tempId\n \n }),\n\n })\n\n\n // this.addRequest(new AddImageRequest(image, array, this.getCallbackId(), (id) => fn(id, \"\")))\n\n }\n\n updateShape(shape: Shape) {\n logger.info({ message: \"SocketController::updateShape\", data: shape.transform })\n if (shape.Type === ShapeType.Sticker)\n this.updateSticker(shape as StickerShape)\n else if (shape.ID > Long.ZERO) {\n //TODO check update shape\n socketConnection.send({\n updateShape: wjite.message.UpdateShape.create({\n\n shape: {\n ID: shape.ID,\n transform: shape.transform\n }\n })\n })\n }\n\n\n\n }\n\n clear() {\n logger.info(\"SocketController::clear\")\n socketConnection.send({\n clear: {}\n })\n // this.addRequest(new ClearRequest(this.getCallbackId(),))\n }\n\n removeShape(shapeId: Long.Long, type: string) {\n logger.info({ message: \"SocketController::removeShape\", data: shapeId })\n\n socketConnection.send({\n removeShape: { shapeID: shapeId }\n })\n // this.addRequest(new RemoveShapeRequest(shapeId, this.getCallbackId(),))\n }\n\n // setBoardName(boardName?: string) {\n\n // store.connectionState.BoardName = boardName || \"\"\n\n // }\n\n requestBoardContent(boardName : string) {\n logger.info(\"SocketController::getBoardContent\")\n socketConnection.send({\n requestBoard : boardName, \n sessionId : localStorage['sessionID']\n })\n // this.addRequest(new GetBoardContentRequest(this.getCallbackId(),))\n // this.send()\n }\n\n\n addStroke(stroke: StrokeShape, updateId: (id: Long.Long) => void) {\n const tempId = this.getTempShapeID(stroke)\n\n socketConnection.send({\n addShape: wjite.message.AddShape.create({\n shape: wjite.message.Shape.create({\n transform: wjite.message.Transform.fromObject(stroke.transform),\n stroke: wjite.message.Stroke.create({\n color: stroke.Color,\n points: stroke.PointArray.map(p => { return { x: p[0], y: p[1] } }),\n width: stroke.Width,\n closed: stroke.Closed,\n opacity: stroke.Opacity,\n smooth: stroke.Smooth\n\n })\n }),\n tempId\n }),\n })\n // this.requests.push(new AddStrokeRequest(stroke, this.getCallbackId(), updateId))\n //this.sendRequest(new AddStrokeRequest(stroke, updateId))\n }\n\n addFigure(figure: FigureShape, updateId: (id: Long.Long) => void) {\n // this.requests.push(new AddFigureRequest(figure, this.getCallbackId(), updateId))\n const tempId = this.getTempShapeID(figure, updateId)\n\n socketConnection.send({\n addShape: wjite.message.AddShape.create({\n shape: wjite.message.Shape.create({\n transform: wjite.message.Transform.fromObject(figure.transform),\n figure: wjite.message.Figure.create({\n color: figure.Color,\n width: figure.Width,\n height: figure.Height,\n figureType: figure.ShapeType as number as wjite.message.Figure.Type,\n fill: figure.Fill,\n opacity: figure.Opacity,\n strokeWidth: figure.StrokeWidth\n\n\n })\n }),\n tempId\n\n }),\n })\n\n }\n\n\n addText(text: TextShape, updateId: (id: Long.Long) => void) {\n logger.info(\"SocketController::addText\")\n const tempId = this.getTempShapeID(text, updateId)\n\n const serverMessage = wjite.message.ToServer.create({\n addShape: wjite.message.AddShape.create({\n shape: wjite.message.Shape.create({\n transform: wjite.message.Transform.fromObject(text.transform),\n text: wjite.message.Text.create({\n color: text.Color,\n content: text.Content,\n family: text.Family,\n size: text.Size\n\n\n })\n }),\n tempId\n }),\n })\n socketConnection.send(serverMessage)\n\n\n // this.requests.push(new AddTextRequest(text, this.getCallbackId(), updateId))\n // this.send()\n }\n\n updateText(text: TextShape) {\n if (text.ID === Long.NEG_ONE) return\n \n logger.info(`SocketController::updateText ${text.ID}`)\n const serverMessage = wjite.message.ToServer.create({\n updateShape: wjite.message.UpdateShape.create({\n shape: wjite.message.Shape.create({\n ID: text.ID,\n transform: wjite.message.Transform.fromObject(text.transform),\n text: wjite.message.Text.create({\n color: text.Color,\n content: text.Content,\n family: text.Family,\n size: text.Size,\n\n\n })\n })\n }),\n\n })\n socketConnection.send(serverMessage)\n\n // this.requests.push(new UpdateTextRequest(text, this.getCallbackId()))\n // this.send()\n\n }\n addTextArea(textArea: TextAreaShape, updateId: (id: Long.Long) => void) {\n logger.info(\"SocketController::addTextArea\")\n const tempId = this.getTempShapeID(textArea, updateId)\n\n const serverMessage = wjite.message.ToServer.create({\n addShape: wjite.message.AddShape.create({\n shape: wjite.message.Shape.create({\n transform: wjite.message.Transform.fromObject(textArea.transform),\n textArea: wjite.message.TextArea.create({\n color: textArea.Color,\n content: textArea.Content,\n family: textArea.Family,\n size: textArea.Size,\n height: textArea.Height,\n width: textArea.Width,\n style: textArea.Style\n\n\n })\n }),\n tempId\n }),\n // callbackId: this.requestId\n })\n socketConnection.send(serverMessage)\n\n // this.requests.push(new AddTextAreaRequest(textArea, this.getCallbackId(), updateId))\n // this.send()\n }\n\n updateTextArea(textArea: TextAreaShape) {\n if (textArea.ID === Long.NEG_ONE) return\n\n logger.info(`SocketController::updateTextArea ${textArea.ID}`)\n const serverMessage = wjite.message.ToServer.create({\n updateShape: wjite.message.UpdateShape.create({\n shape: wjite.message.Shape.create({\n ID: textArea.ID,\n\n transform: wjite.message.Transform.fromObject(textArea.transform),\n textArea: wjite.message.TextArea.create({\n color: textArea.Color,\n content: textArea.Content,\n family: textArea.Family,\n size: textArea.Size,\n height: textArea.Height,\n width: textArea.Width,\n style: textArea.Style\n\n\n })\n })\n }),\n \n })\n\n socketConnection.send(serverMessage)\n // this.send()\n\n // if (textArea.ID > 0)\n // this.sendRequest(new UpdateTextAreaRequest(textArea))\n }\n\n\n getTempShapeID(shape : Shape, updateId? : (id : Long.Long)=>void): Long.Long {\n this.nextTempShapeID = this.nextTempShapeID.add(Long.ONE);\n this.tempShapes.set(this.nextTempShapeID.toString(),shape )\n if (updateId)\n this.updateIdCallbacks.set(this.nextTempShapeID.toString(), updateId)\n return this.nextTempShapeID\n }\n\n updateShapeId(tempId : Long.Long, newId : Long.Long) {\n console.log(\"Update shape ID\", tempId, newId)\n const shape = this.tempShapes.get(tempId.toString())\n if (shape) {\n shape.ID = newId\n this.tempShapes.delete(tempId.toString())\n } else {\n throw new Error(\"Error updating shape id\")\n }\n\n const updateId = this.updateIdCallbacks.get(tempId.toString())\n if (updateId) {\n updateId(newId)\n this.updateIdCallbacks.delete(tempId.toString())\n }\n \n }\n\n\n // addShape(shape: Shape, updateId: (id: number) => void) {\n // logger.info(`SocketController::addShape ${shape.ID}, ${shape.Type}`)\n // this.addRequest(new AddShapeRequest(shape,this.getCallbackId(), updateId))\n // }\n\n addHighlight(stroke: StrokeShape, focus : boolean) {\n socketConnection.send({\n addHighlight: wjite.message.AddHighlight.create({\n shape: wjite.message.Shape.create({\n transform: wjite.message.Transform.fromObject(stroke.transform),\n stroke: wjite.message.Stroke.create({\n color: stroke.Color,\n points: stroke.PointArray.map(p => { return { x: p[0], y: p[1] } }),\n width: stroke.Width,\n closed: stroke.Closed,\n opacity: stroke.Opacity,\n smooth: stroke.Smooth\n\n })\n }),\n focus \n })\n })\n \n \n }\n\n addSticker(sticker: StickerShape, updateId: (id: Long.Long) => void) {\n logger.info(`SocketController::addSticker ${sticker.ID}`)\n const tempId = this.getTempShapeID(sticker, updateId)\n\n const serverMessage = wjite.message.ToServer.create({\n addShape: wjite.message.AddShape.create({\n shape: wjite.message.Shape.create({\n transform: wjite.message.Transform.fromObject(sticker.transform),\n sticker: wjite.message.Sticker.create({\n color: sticker.Color,\n content: sticker.Content,\n height: sticker.Height,\n width: sticker.Width,\n contentType: sticker.StickerContentType as number as wjite.message.Sticker.Type,\n fontSize: sticker.FontSize\n\n\n })\n }),\n tempId\n\n }),\n // tempId : t/his.getTempShapeID()\n })\n socketConnection.send(serverMessage)\n\n // this.requests.push(new AddStickerRequest(sticker, this.getCallbackId(), updateId))\n // this.send()\n\n }\n updateSticker(sticker: StickerShape) {\n if (sticker.ID === Long.NEG_ONE) return\n\n logger.info(`SocketController::updateStikcer ${sticker.ID}`)\n const serverMessage = wjite.message.ToServer.create({\n updateShape: wjite.message.UpdateShape.create({\n shape: wjite.message.Shape.create({\n ID: sticker.ID,\n transform: wjite.message.Transform.fromObject(sticker.transform),\n sticker: wjite.message.Sticker.create({\n color: sticker.Color,\n content: sticker.Content,\n height: sticker.Height,\n width: sticker.Width,\n\n\n })\n })\n }),\n // callbackId: this.requestId\n })\n socketConnection.send(serverMessage)\n\n\n }\n\n\n\n\n login(login: { email: string; password: string; }, callback: (user: User | undefined) => void) {\n // this.socket.emit('login', login, callback)\n }\n\n \n \n\n}","import * as d3 from \"d3\"\nimport Long from \"long\"\nimport ReactGA from \"react-ga\"\nimport { BoundKonvaBoard } from \"../components/BoundKonvaBoard\"\nimport { WChart } from \"../helpers/WChart\"\nimport { logger } from \"../logging/logger\"\nimport { getBoundingBox } from \"../math/Rect\"\nimport { AccessMode } from \"../model/board\"\nimport { ChartShape, ImageShape, Shape, ShapeType, StickerShape, StrokeShape } from \"../model/shape\"\nimport { WImage } from \"../model/WImage\"\nimport { store } from \"../store/store\"\nimport { Tool, uiStore } from '../store/UIState'\nimport { undoredo } from \"../store/undoredo\"\nimport { LayerController } from \"./layerController\"\nimport { SocketController } from './socketController'\n\n\nexport class Controller {\n board?: BoundKonvaBoard\n layerController?: LayerController\n stickerTransofrm = d3.zoomIdentity\n socketController: SocketController\n\n constructor() {\n this.socketController = new SocketController(this)\n }\n\n connect() {\n this.socketController.connect()\n \n }\n\n\n setBoardName(name?: string) {\n //this.socketController.setBoardName(name)\n store.connectionState.BoardName = name || \"\"\n // uiStore.boardName = name\n }\n\n setCanvasBoard(board?: BoundKonvaBoard) {\n // this.socketController.setBoardName(board?.boardName)\n this.board = board\n // uiStore.boardName = board?.boardName\n if (board)\n this.layerController = new LayerController(board)\n // if (uiStore.boardName)\n // this.socketController.requestBoardContent(uiStore.boardName)\n }\n\n \n\n addHighlight(stroke: StrokeShape, focus : boolean) {\n // addHighlight(stroke: StrokeShape, transform?: { k: number, x: number, y: number }) {\n store.board.highlighStrokes.push(stroke)\n this.layerController?.renderHighlight()\n if (focus) {\n const bb = getBoundingBox(stroke.PointArray)\n const width = store.windowInnerWidth\n const height = store.windowInnerHeight\n const x0 = bb.x\n const x1 = bb.x + bb.width\n const y0 = bb.y\n const y1 = bb.y + bb.height\n const t = d3.zoomIdentity\n .translate(width / 2, height / 2)\n .scale(Math.min(8, 0.6 / Math.max((x1 - x0) / width, (y1 - y0) / height)))\n .translate(-(x0 + x1) / 2, -(y0 + y1) / 2);\n this.layerController?.setTransform(t)\n\n }\n // }\n }\n\n setAccessMode(accessMode: AccessMode) {\n store.board.accessMode = accessMode\n store.updateToolbarConfig()\n }\n\n\n // newMessage(msg: Message) {\n // uiStore.ui.messages.push(msg)\n // this.socketController.pushMessage(msg)\n\n // }\n\n closeAllPopup() {\n uiStore.ui.openToolLineIdx = undefined\n uiStore.ui.showChat = false\n uiStore.ui.showClearDialog = false\n uiStore.ui.showShareDlg = false\n\n }\n\n\n notifyUpdateUser() {\n if (store.user) {\n // this.socketController.updateUser(store.user)\n }\n }\n\n addNewImage(file: File | Blob, img: HTMLImageElement) {\n ReactGA.event({\n category: 'Image',\n action: 'Add image',\n });\n let rect = (this.board as BoundKonvaBoard).getViewBox()\n\n let sx = (rect.width / 3) / img.width\n let sy = (rect.height / 3) / img.height\n let s = Math.min(sx, sy)\n\n let transform = { sx: s, sy: s, tx: rect.x + rect.width / 3, ty: rect.y + rect.height / 3, r: 0 };\n let image: ImageShape = {\n // userId: uiStore.user?.id || 0,\n OwnerID: store.user?.ID || Long.NEG_ONE,\n ID: Long.NEG_ONE,\n\n Src: \"\",\n transform: transform,\n Type: ShapeType.Image,\n // timestamp: new Date()\n }\n\n const newImage: WImage = new WImage(image, img)\n\n\n store.board.shapes.push(newImage)\n\n\n this.layerController?.updateRenderedFigures()\n\n this.socketController.addImage(image, file, (id, src) => {\n newImage.ID = id\n newImage.Src = src\n undoredo.addShape(newImage)\n })\n\n\n\n\n\n\n }\n\n\n clear() {\n store.clear()\n this.socketController.clear()\n undoredo.clear()\n this.layerController?.updateRenderedFigures()\n }\n\n\n setBoard = (ownerId : Long, shapes: Shape[], stickers: StickerShape[]) => {\n logger.info({ message: \"Controller::setBoard\", data: { Nshapes: shapes.length } })\n store.board.accessMode = AccessMode.Collaboration \n store.board.ownerId = ownerId\n store.board.shapes = shapes.map(shape => {\n\n if (shape.Type === ShapeType.Image) {\n const wimage = new WImage(shape as ImageShape)\n wimage.load().then(() => {\n this.layerController?.updateRenderedFigures()\n\n })\n return wimage\n } else if (shape.Type === ShapeType.Chart) {\n const wchart = new WChart(shape as ChartShape)\n wchart.calcDefinition()\n return wchart\n } else {\n return shape\n }\n })\n\n store.board.stickers = stickers\n\n this.layerController?.updateRenderedFigures()\n store.updateToolbarConfig()\n\n // rpcController.connect()\n\n }\n\n\n init() {\n logger.info({ message: \"Controller::init\" })\n\n\n }\n\n\n\n\n\n\n setTool(tool: Tool) {\n logger.info({ message: \"Controller::setTool\", data: { Tool: tool } })\n\n if (uiStore.ui.tool === Tool.Pen) this.layerController?.updateRenderedFigures()\n\n\n\n uiStore.ui.tool = tool\n store.boardUI.editedSticker = undefined\n this.board?.onToolChange(tool)\n\n }\n\n setEditedShape(shape: Shape) {\n }\n\n\n deleteShape(shape: Shape) {\n logger.info({ message: \"Controller::deleteShape\", data: { ID: shape.ID } })\n\n //FIXME Add access wrigihts check\n // if (!store.userCanErase(shape.userId)) return false\n store.removeShape(shape)\n controller.socketController.removeShape(shape.ID, shape.Type)\n undoredo.removeShape(shape)\n this.layerController?.setSelection(undefined)\n this.layerController?.updateRenderedFigures()\n return true\n\n }\n\n updateShape(shape: Shape) {\n logger.info({ message: \"Controller::updateShape\", data: { ID: shape.ID } })\n store.updateShape(shape)\n this.layerController?.updateShape(shape)\n }\n\n updateImage(image: ImageShape) {\n const imageShape = store.getShape(image.ID)\n imageShape.transform = image.transform\n this.layerController?.updateShape(imageShape)\n }\n\n}\n\nexport const controller = new Controller()\n\n\n","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport React from \"react\";\n\nvar SvgDrawing = function SvgDrawing(_ref) {\n var svgRef = _ref.svgRef,\n title = _ref.title,\n props = _objectWithoutProperties(_ref, [\"svgRef\", \"title\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"117.7mm\",\n height: \"20.101mm\",\n viewBox: \"0 0 117.7 20.101\",\n ref: svgRef\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", null, title) : null, /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"clipPath\", {\n id: \"clipPath1265\"\n }, /*#__PURE__*/React.createElement(\"text\", {\n transform: \"scale(1.0213 .97918)\",\n x: 33.631577,\n y: 65.402649,\n style: {\n fill: \"#000000\",\n fontFamily: \"'Freestyle Script'\",\n fontSize: \"16.561px\",\n letterSpacing: 0,\n lineHeight: 1.25,\n strokeWidth: 0.41402,\n wordSpacing: 0\n },\n xmlSpace: \"preserve\"\n }, /*#__PURE__*/React.createElement(\"tspan\", {\n x: 33.631577,\n y: 65.402649,\n style: {\n fontSize: \"22.081px\",\n strokeWidth: 0.41402\n }\n }, \"(c) O-whiteboard.com\")))), /*#__PURE__*/React.createElement(\"g\", {\n transform: \"translate(-44.219 -48.564)\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n className: \"c1\",\n d: \"m60.937 35.468c0.8473 3.1623 7.1669 8.1827 8.8914 8.8914 1.7245 0.7087 2.6694 2.764 1.819 3.7798-0.8505 1.0158-2.008 2.1891-2.9399 3.2784-0.9319 1.0893-3.0369 3.3244-3.4621 3.9622-0.4252 0.6378-2.4472 3.7825-2.4923 5.3625-0.01911 1.2202 0.01063 2.2172 0.73233 2.7876 0.7324 0.57883 2.138-0.35435 2.9648-0.98037 0.8268-0.6261 3.1655-3.3546 3.8034-4.2877s1.7926-3.286 2.1616-4.3467c0.37798-1.0867 0.51429-2.049 0.03544-3.0829-0.5197-1.1221-2.3032-1.2166-3.1537-1.0276-0.8504 0.189-3.7915 1.2166-5.0672 3.7207-1.2756 2.5041 0.9922 6.2366 2.44 6.3781 0 0 4.7035-0.33408 5.5303-0.4522 0.8071-0.10233 3.3955-0.28348 4.225 0.01789 0.6972 0.2533 1.3363-1.7707 1.1693-2.5057-0.16705-0.735-0.56799-1.9377 0.43431-2.372 1.0023-0.43434 2.1381-0.16705 2.7061 0.63476 0.56795 0.8018-0.19715 2.1027-0.89225 2.6882-0.6763 0.5697-1.927 2.493-2.2482 3.7597-0.36576 1.4427 0.32001 0.88724 0.93544 0.56795l4.4602-4.7369s-2.0881 3.601-2.0881 4.2692c0 0.66817 0.20045 1.1693 0.56795 0.96885 0.3675-0.2005 1.9377-1.5368 2.2718-2.2384 0.3341-0.7016 1.4366-3.2072 1.4366-3.5079v-2.6393s-0.10022-3.1404 0.60136-4.6772c0.7016-1.5368 1.7039-3.1738 2.7729-3.1738s2.9065 0.73497 3.6081 1.6036c0.70158 0.8687-0.10023 2.5725-0.26727 2.94-0.167 0.3674-2.6726 4.5435-3.1738 5.5792s-2.9667 6.885-2.9667 6.885 3.0501-4.8638 3.6515-5.2814c0.6013-0.41762 1.7539-1.2862 1.9711-1.1025 0.2171 0.1837-1.6036 2.6393-1.8375 3.1905-0.23386 0.5513-0.50687 2.053-0.13937 2.1866 0.36754 0.13364 1.0248-0.33241 1.2252-0.51616s0.25057-0.18375 0.25057-0.18375l2.0045-2.9233s1.1025-1.7205 1.2695-1.9711c0.167-0.2506 0.40088-1.3864 1.2194-1.5702 0.81851-0.18375 0.58465 0.96885 0.58465 0.96885s-0.60139 1.0357-1.0023 1.5535c-0.4009 0.5178-1.4867 2.8063-1.6036 3.1237-0.11693 0.3174-0.7684 2.0546-0.7684 2.2718s1.4867-3.9923 1.4867-3.9923 2.8731-5.3621 3.2072-5.7463c0.3341-0.3842 0.568-1.5201 1.8709-2.2384 1.3029-0.71829 2.2216-0.28397 2.4722 0.11693 0.25057 0.40095 0.13364 0.90208-0.16704 1.3698-0.3007 0.4677-1.5869 2.1715-2.205 3.1905-0.618 1.019-2.0045 3.2574-2.1047 4.2095-0.10023 0.9521-0.30068 2.372 0.0835 2.4889 0.3842 0.11693 1.2862-0.03341 1.5368-0.26727 0.2506-0.2339 1.3531-1.5869 1.7707-2.3052 0.41761-0.7183 0.50113-2.7061 0.0334-2.823-0.4677-0.11693-3.0402 0.45102-3.4578 0.08352-0.41762-0.36749-0.60135-0.25056-0.43431-0.70158 0.167-0.45102 1.353-0.60136 1.353-0.60136s3.5413-0.86865 4.3264-1.0691c0.78507-0.20045 1.4365-0.08352 1.637 0.18375 0.20045 0.26726-0.26727 0.86861-0.63477 1.2027-0.3675 0.3341-2.038 2.0714-2.2217 2.9901-0.18375 0.9187 0.0334 1.1693 0.51783 1.3029 0.4844 0.13367 1.8542-0.56795 2.3052-0.88533 0.45097-0.3174 0.91869-0.73498 1.353-1.5869 0.43434-0.85192-0.25056-1.1192-0.63476-0.98556-0.3842 0.1337-1.5535 0.95218-1.9544 1.4032-0.40089 0.451-1.6704 2.5056-1.2027 3.2406 0.4677 0.73498 1.3029 1.019 2.0713 0.7517 0.7684-0.2672 2.2718-1.3196 2.7896-2.0045 0.5178-0.6849 2.8063-4.4767 3.5413-5.8465 0.735-1.3698 0.75169-1.3698 0.75169-1.3698s0.7517-3.9255 1.5034-4.7106c0.7517-0.78511 1.6036-0.88533 2.0546-0.25057 0.45102 0.6348 0.0501 1.6871-0.35079 2.3219-0.4009 0.6348-3.6883 6.5662-4.0224 7.201-0.334 0.6348-2.1548 4.2763-2.4555 5.0113-0.3007 0.735 1.6671-3.6764 2.1515-4.2109 0.4844-0.53458 2.3386-1.9879 3.0402-1.3531 0.7015 0.6348-0.40095 3.0235-1.3698 4.1761-0.9688 1.1526-1.7038 1.3363-2.088 1.3029-0.3842-0.0334-1.2528-0.31736-1.4533-1.2695-0.20046-0.9521-0.7517-1.7874-0.21716-3.842 0.5346-2.0546 1.7206-2.4388 2.1883-2.656 0.4677-0.21716 3.5079-1.4867 4.7607-0.0167 1.2529 1.47-0.96882 3.7919-1.2862 5.479-0.3174 1.6872 2.088 1.2027 2.7228 0.60136 0.6348-0.6014 2.0213-2.2384 2.1883-2.6727 0 0 0.30068-0.50113 0.30068-0.81851s-0.0334-0.7684-0.43431-0.88533c-0.4009-0.11693-1.2696 0.30067-1.7874 0.81851-0.5178 0.5178-1.6203 2.5725-1.7372 3.0235s-0.48443 1.47-0.13363 1.8041 0.91874 0.51783 1.5034 0.11693c0.5846-0.4009 1.6203-2.1381 1.9878-2.8564 0.3674-0.7183 2.1548-4.8776 3.6248-5.1282s3.1237 0.0167 3.8086 0.71829c0.68488 0.7016 0.46772 1.9712-0.0334 2.5391-0.5011 0.56796-1.0524-0.08352-1.2695-0.55124-0.21716-0.46772-0.55125-0.48442-0.88533-0.46772-0.3341 0.0167-1.6705 0.70157-2.2217 1.5869-0.5512 0.8853-1.3029 2.4722-1.3029 3.2573 0 0.78513 0.21716 0.95217 0.60136 1.0524 0.3842 0.1002 1.2695-0.53456 1.637-1.0691 0.3675-0.5346 2.0713-3.2741 2.0713-3.2741s-0.86866 1.754-1.0023 2.2885c-0.13363 0.5345-0.26727 1.5869 0.10023 2.0212 0.36749 0.43431 0.48442 0.96885 1.1526 0.96885 0.66819 0 1.6538-1.1025 1.4867-2.1382-0.16704-1.0356-0.20045-3.558 0.50113-4.4099 0.7016-0.85193 1.7539-1.637 2.0379-1.5201 0.28398 0.11693 0.31738 0.35079 0.28398 0.66817-0.0334 0.3174-0.48443 1.0023-0.68488 1.3698-0.2004 0.3675-1.2862 2.0379-1.5368 2.4722-0.25055 0.4343-1.0524 2.4388-1.186 2.7729-0.1337 0.334 1.019-2.038 1.6203-2.5224 0.6013-0.4844 1.5368-1.4199 2.0212-1.8375 0.4844-0.4177 2.5556-1.7967 2.5556-1.7967s-1.804 1.6798-1.9042 2.1976c-0.10023 0.51783 0.0501 0.81851 0.45102 0.81851 0.4009 0 1.3531-0.50123 1.7874-0.86863s3.2574-4.2595 3.7919-5.1783 2.0212-3.4912 3.5413-4.0926c1.5201-0.60136 1.5368-0.35079 1.754 0.01671 0.21718 0.3675 0.15033 0.6348-0.81852 2.2217-0.9689 1.5869-2.4556 3.8754-2.9233 4.9779-0.4677 1.1025-1.5702 3.2239-2.0045 3.9589-0.4343 0.735-1.3029 1.8542-1.6537 2.0546-0.35079 0.20048-1.1693-0.35079-1.1693-0.85192 0-0.5011 0.0501-1.8374 0.70158-2.8731 0.6515-1.0357 1.6036-2.0045 2.3553-1.9377 0.7517 0.06682 0.18375 0.03341 0.58465 0.05011 0.40089 0.0167 0.95215 0.4677 0.35079 1.8876-0.60135 1.4199-0.68487 2.5892-0.50113 3.0736 0.1837 0.4844 0.53451 1.1693 1.2361 1.2528 0.70158 0.0835 0.4176-1.2027 1.1693-1.5869s1.0858 0 1.1693 0.16704c0.0835 0.167-0.35079 1.0858-0.53454 1.6537-0.18375 0.5679-1.3698 2.9065-0.21715 3.9088s2.3469-0.5465 2.8194-2.2474c0.47244-1.7009-2.5514-7.7957-0.56696-9.6856 1.9843-1.8899 0.771 2.9629 2.2744 3.4974s2.5391 0.43431 3.107 0.03341 0.90203-1.3029 0.90203-1.6871-0.58463-0.73499-1.2194-0.33409c-0.6348 0.4009-1.4199 1.1192-1.9043 1.9711-0.48445 0.8519-1.2528 1.9711-1.0524 2.7228s0.23386 1.4032 1.1359 1.2194c0.902-0.1837 1.8207-0.8185 2.5056-1.5702 0.6849-0.7517 1.4533-1.8542 1.921-2.5391s1.5869-1.186 2.3052-0.81851c0.71833 0.3675-0.53454 1.5034-0.28397 2.372 0.2506 0.86858 1.5034-0.35079 1.921-0.85192 0.41762-0.5011 1.186-1.7038 1.0858-2.2718-0.1003-0.56795-1.1193-0.78513-1.7707-0.11693s-1.5368 1.637-2.0379 2.656-0.68488 2.4388-0.20046 2.6727c0.4844 0.23387 0.81849 0.11694 1.2361-0.10022 0.4176-0.2172 1.1192-1.186 1.5535-1.921 0.43431-0.735 0.91874-1.921 1.1359-2.5558 0.2172-0.6348 1.2863-2.6894 2.2384-2.5892s1.0356 0.16704 1.2862 0.65147c0.25057 0.48441 0.28398 0.63475-0.0835 1.2194-0.3675 0.5846-1.2361 1.8207-1.6036 2.4722-0.3675 0.6515-1.4842 3.9897-1.4842 3.9897s0.94964-2.6032 1.551-3.1712c0.60135-0.56796 1.0691-1.0691 1.5535-1.47 0.4844-0.4009 2.4248-1.7241 2.4248-1.7241s-1.7233 2.2252-2.1576 3.1774c-0.4343 0.9521-1.0144 2.6607-1.0144 2.6607s1.3653-2.5939 1.8998-3.0449c0.5345-0.45102 0.7016-0.6682 1.2862-1.1359s2.8929-1.7762 2.8929-1.7762-1.2726 1.0078-1.7737 1.7428-1.1693 1.6704-1.2027 2.4388 0.18375 1.6203 0.45102 1.9043c0.2672 0.28397 1.5702 0.70158 2.8063 0.23386 1.2362-0.4677 2.372-1.3029 2.94-1.6871\",\n clipPath: \"url(#clipPath1265)\",\n style: {\n fill: \"none\",\n strokeLinecap: \"round\",\n strokeWidth: 2.1,\n stroke: \"#067a17\"\n }\n }), /*#__PURE__*/React.createElement(\"text\", {\n x: 43.654129,\n y: 62.202866,\n style: {\n fill: \"#067a17\",\n fontFamily: \"'Freestyle Script'\",\n fontSize: \"14.111px\",\n letterSpacing: 0,\n lineHeight: 1.25,\n strokeWidth: 0.26458,\n wordSpacing: 0\n },\n xmlSpace: \"preserve\"\n }, /*#__PURE__*/React.createElement(\"tspan\", {\n x: 43.654129,\n y: 62.202866,\n style: {\n fill: \"#067a17\",\n fontSize: \"14.111px\",\n strokeWidth: 0.26458\n }\n }, \"(C)\"))));\n};\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(function (props, ref) {\n return /*#__PURE__*/React.createElement(SvgDrawing, _extends({\n svgRef: ref\n }, props));\n});\nexport default __webpack_public_path__ + \"static/media/drawing.dd139a62.svg\";\nexport { ForwardRef as ReactComponent };","import { ControlledEditor } from '@monaco-editor/react';\nimport \"github-markdown-css\";\nimport 'katex/dist/katex.min.css';\nimport { observer } from \"mobx-react\";\nimport React, { useEffect, useState } from \"react\";\nimport Loadable from 'react-loadable';\nimport \"react-mde/lib/styles/css/react-mde-all.css\";\nimport styled from \"styled-components\";\nimport { controller } from \"../../controller/controller\";\nimport { StickerShape } from \"../../model/shape\";\nimport { store } from \"../../store/store\";\nimport { Tool, uiStore } from \"../../store/UIState\";\nimport { undoredo } from \"../../store/undoredo\";\n//import { MarkdownRender } from \"./markdown/MarkdownRenderer\";\nimport \"./stickerComponent.css\";\n\n\n\n\nconst Editor: React.FC<{ definition: string, onChange: (definition: string) => void }> = (props) => {\n const [definition, setDefinition] = useState(props.definition)\n\n useEffect(()=> {\n setDefinition(props.definition)\n }, [props.definition])\n\n return
\n {\n if (value) {\n setDefinition(value)\n props.onChange(value)\n }\n\n }}\n\n language=\"markdown\"\n />\n
\n\n}\n\n\n\nfunction Loading(props: any) {\n if (props.isLoading) {\n if (props.timedOut) {\n return
Loader timed out!
;\n } else if (props.pastDelay) {\n return
Loading...
;\n } else {\n return null;\n }\n } else if (props.error) {\n return
Error! Component failed to load
;\n } else {\n return null;\n }\n}\nconst LoadableMarkdownRenderer = Loadable({\n loader: () => import('./markdown/MarkdownRenderer'),\n loading: Loading,\n});\n\n\nconst Markdown = styled.div`\n flex-grow:1;\n padding : 10px;\n overflow : auto;\n p {\n text-align:justify;\n }\n input {\n margin-right:5px;\n }\n`\n\n\nconst MDEDiv = styled.div`\n display : flex;\n flex-direction:column;\n flex-grow:1; \n border: 2px solid red;\n .react-mde { \n flex-grow: 1;\n display:flex;\n flex-direction:column;\n };\n .rde div[class=\"\"] {\n display:flex;\n flex-direction:column;\n flex-grow:1; \n };\n .mde-textarea-wrapper {\n flex-grow:1;\n display:flex;\n border : 3px;\n border-style:solid;\n flex-direction:column;\n }; \n .mde-textarea-wrapper textarea{\n flex-grow:1;\n };\n\n .grip {\n display : none;\n };\n .mde-tabs {\n display:none;\n };\n`\n\nconst MDEInputDiv = styled.div`\n display : flex;\n`\n\n\n\n\n// @observer\n// class Editor extends React.Component<{ sticker: StickerShape, height: number }> {\n// editorDiv = createRef()\n// @observable height = 0\n// @observable width = 0\n\n// componentDidMount() {\n// if (this.editorDiv.current) {\n// let elem = (d3.select(this.editorDiv.current).select('.mde-text').node() as HTMLTextAreaElement);\n// this.height = (d3.select(this.editorDiv.current).node() as HTMLDivElement).getBoundingClientRect().height\n// this.width = (d3.select(this.editorDiv.current).node() as HTMLDivElement).getBoundingClientRect().width\n\n// elem.select()\n// elem.focus()\n// undoredo.beginUpdateSticker(this.props.sticker)\n// }\n// }\n// componentWillUnmount() {\n// undoredo.endUpdateSticker(this.props.sticker)\n\n// }\n\n// render() {\n// let listCommands = [\n// {\n// commands: [\n// commands.headerCommand,\n// commands.boldCommand,\n// commands.italicCommand\n// ]\n// },\n\n// {\n// commands: [\n// commands.orderedListCommand,\n// commands.unorderedListCommand,\n// commands.checkedListCommand\n// ]\n// },\n// {\n// commands: [\n// commands.linkCommand,\n// commands.imageCommand,\n// commands.quoteCommand\n// ]\n// }\n\n// ]\n\n\n\n// return \n// \n// \n// Font size\n// \n// {\n// this.props.sticker.FontSize = parseInt(evt.target.value);\n// controller.socketController.updateShape(this.props.sticker)\n// }} />\n// \n// \n// \n// Color\n// \n//
\n// { this.props.sticker.Color = val; controller.socketController.updateShape(this.props.sticker) }} />\n//
\n//
\n//
\n//
\n\n// {\n// this.props.sticker.Content = value;\n// controller.socketController.updateShape(this.props.sticker)\n// }}\n\n// />\n//
\n//
\n\n// }\n// }\n\n\nexport const StickerMarkdown: React.FC<{ sticker: StickerShape }> = observer( (props) => {\n if (store.boardUI.editedSticker && store.boardUI.editedSticker === props.sticker) {\n return {\n props.sticker.Content=definition\n controller.socketController.updateSticker(props.sticker)\n }} />\n }\n \n else {\n return {\n if (uiStore.ui.tool !== Tool.Erase) {\n store.boardUI.editedSticker = props.sticker;\n }\n else if (store.userCanErase(props.sticker.OwnerID)) {\n store.removeSticker(props.sticker.ID )\n controller.socketController.removeShape(props.sticker.ID, \"sticker\");\n undoredo.removeSticker(props.sticker)\n }\n }}>
\n }\n\n})","import { Trans } from \"@lingui/macro\";\nimport { observer } from \"mobx-react\";\nimport React, { useState } from \"react\";\nimport YouTube from \"react-youtube\";\nimport { controller } from \"../../controller/controller\";\nimport { store } from \"../../store/store\";\nimport { StickerShape } from \"../../model/shape\";\n\n\n\nconst VideoStickerEditor: React.FC<{ sticker: StickerShape }> = (props) => {\n\n const [value, changeValue] = useState(props.sticker.Content)\n return
\n

Youtube page url

\n\n {\n\n changeValue(evt.target.value)\n\n }} />\n\n \n
\n}\n\nconst VideoSticker: React.FC<{ sticker: StickerShape }> = observer((props) => {\n function getId(url: string) {\n const regExp = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n const match = url.match(regExp);\n\n return (match && match[2].length === 11)\n ? match[2]\n : null;\n }\n const videoId = getId(props.sticker.Content)\n const opts = {\n height: (props.sticker.Height - 30).toString(),\n width: (props.sticker.Width - 5).toString(),\n };\n\n if (videoId)\n return \n else\n return
Not valid YouTube URL: {props.sticker.Content}
\n})\n\n\nexport const StickerVideo: React.FC<{ sticker: StickerShape }> = (props) => {\n if (store.boardUI.editedSticker === props.sticker)\n return \n else {\n return \n }\n\n\n}","import { observer } from \"mobx-react\"\nimport React, { useState, useRef, useEffect } from \"react\"\nimport Col from \"react-bootstrap/Col\"\nimport Container from \"react-bootstrap/Container\"\nimport Row from \"react-bootstrap/Row\"\nimport Form from \"react-bootstrap/Form\"\nimport Alert from \"react-bootstrap/Alert\"\n\nimport { ControlledEditor } from '@monaco-editor/react';\n\nimport { controller } from \"../../controller/controller\"\n// import { rpcController } from \"../../controller/rpcController\"\nimport { CodeSticker } from \"../../model/CodeSticker\"\nimport { CodeComponent } from \"../../model/ui/def\"\nimport { store } from \"../../store/store\"\nimport { Input, Btn } from '../../model/ui/def'\nimport { inputCSS } from \"react-select/src/components/Input\"\nimport Dropdown from \"react-bootstrap/Dropdown\"\nimport Button from \"react-bootstrap/Button\"\nimport Modal from \"react-bootstrap/Modal\"\nimport InputGroup from \"react-bootstrap/InputGroup\"\nimport FormControl from \"react-bootstrap/FormControl\"\n\n\n\nconst Editor: React.FC<{ definition: string, onChange: (definition: string) => void }> = (props) => {\n const [definition, setDefinition] = useState(props.definition)\n\n useEffect(()=> {\n setDefinition(props.definition)\n }, [props.definition])\n\n return <>
\n {\n if (value) {\n setDefinition(value)\n }\n\n }}\n\n language=\"python\"\n />\n
\n \n \n \n \n\n}\n\nconst PathDefinitions: React.FC<{ sticker: CodeSticker }> = (props) => {\n const [code, setCode] = useState(props.sticker.Content);\n // const [pathDefinitions, setPathDefinitions] = useState(CodeSticker.split(props.sticker.content))\n const pathDefinitions = CodeSticker.split(code)\n const [pathIdx, setPathIdx] = useState(0)\n const [path, setPath] = useState(\"\")\n\n const [show, setShow] = useState(false);\n\n\n const handleClose = () => setShow(false);\n const handleShow = () => setShow(true);\n const addPath = () => {\n pathDefinitions.push({ path, definition: \"\" })\n setCode(CodeSticker.join(pathDefinitions))\n setPathIdx(pathDefinitions.length - 1)\n setShow(false)\n\n }\n return
\n \n \n \n \n {pathDefinitions[pathIdx].path}\n \n {pathDefinitions.map((item, idx) => {\n setPathIdx(idx)\n }}>{item.path})}\n\n \n \n \n \n \n \n \n \n \n Add path\n \n \n \n \n New component path\n \n setPath(evt.target.value)}\n />\n \n \n \n \n \n \n \n \n { \n pathDefinitions[pathIdx].definition = definition\n const code = CodeSticker.join(pathDefinitions)\n setCode(code)\n props.sticker.Content = code\n controller.socketController.updateShape(props.sticker)\n }} />\n\n
\n}\n\n\nconst ButtonControl: React.FC<{ button: Btn, onClick: () => void }> = (props) => {\n return \n}\n\nconst InputControl: React.FC<{ input: Input, onChange: (value: string) => void }> = (props) => {\n const [value, setValue] = useState(props.input.value || \"\")\n\n const ref = useRef(null)\n useEffect(() => {\n if (props.input.focused) ref.current?.focus()\n })\n let style = {}\n if (props.input.style) style = props.input.style\n return setValue(evt.target.value)} value={value} onKeyPress={(evt: React.KeyboardEvent) => {\n if (evt.key === \"Enter\") {\n props.onChange(value)\n }\n\n\n }} style={{ backgroundColor: props.input.style?.backgroundColor || \"white\" }} />\n}\n\n\nconst Renderer: React.FC<{ component?: CodeComponent, onChange: (elementId: string, event: string, value: string) => void\n}> = observer((props) => {\n if (props.component) {\n switch (props.component.ctype) {\n case \"p\":\n return

{props.component.text}

\n case \"container\":\n return {props.component.children && props.component.children.map((comp, idx) => )}\n case \"row\":\n return {props.component.children && props.component.children.map((comp, idx) => )}\n case \"col\":\n return {props.component.children && props.component.children.map((comp, idx) => )}\n case \"input\":\n const inputComponent = props.component\n return props.onChange(inputComponent.uid || \"\", \"change\", value)} />\n case \"button\":\n const btn = props.component\n return {\n props.onChange(btn.uid || \"\", \"click\", \"\")\n }\n }/>\n default:\n return

Component not implemented

\n\n }\n\n } else {\n return

Unevaluated

\n }\n})\n\nconst Viewer: React.FC<{ sticker: CodeSticker }> = observer((props) => {\n if (props.sticker.error) {\n return \n Error in code execution\n
\n            {props.sticker.error}\n            
\n
\n } else\n return {\n // rpcController.update(props.sticker, elementId, event, value)\n\n }} />\n})\nexport const StickerCode: React.FC<{ sticker: CodeSticker }> = observer((props) => {\n const callSticker = async () => {\n // await rpcController.init(props.sticker)\n // await rpcController.mount(props.sticker)\n\n }\n if (store.boardUI.editedSticker === props.sticker) {\n return \n } else {\n callSticker()\n return \n }\n})","import { faEdit } from \"@fortawesome/free-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport \"github-markdown-css\";\nimport 'katex/dist/katex.min.css';\nimport { observer } from \"mobx-react\";\nimport React from \"react\";\nimport \"react-mde/lib/styles/css/react-mde-all.css\";\nimport styled from \"styled-components\";\nimport { controller } from \"../../controller/controller\";\nimport { store } from \"../../store/store\";\nimport { Tool, uiStore } from \"../../store/UIState\";\n//import { MarkdownRender } from \"./markdown/MarkdownRenderer\";\nimport \"./stickerComponent.css\";\nimport { StickerMarkdown } from \"./stickerMarkdown\";\nimport { StickerVideo } from \"./stickerVideo\";\nimport { StickerCode } from \"./stickerCode\";\nimport { CodeSticker } from \"../../model/CodeSticker\";\nimport { StickerShape, StickerContentType } from \"../../model/shape\";\n\nconst SelectType: React.FC<{ sticker: StickerShape }> = observer((props) => {\n switch (props.sticker.StickerContentType) {\n case StickerContentType.Markdown:\n return \n case StickerContentType.Video:\n return \n case StickerContentType.Code:\n return \n\n default:\n return null\n }\n\n\n})\n\n\nexport const ToolbarDiv = styled.div`\n background-color: lightgray;\n display: flex;\n justify-content: flex-end;\n height: 25px ;\n div {\n padding : 2px;\n };\n`\nconst StickerPositionDiv = observer(styled.div<{ width: number, height: number, x: number, y: number }>`\nposition : absolute;\nleft : -1px;\ntop: -1px;\ndisplay : inline-block ;\nwidth : ${props => props.width}px;\nheight: ${props => props.height}px;\ntransform : ${props => `translate(${props.x}px, ${props.y}px)`};\nmargin :0;\npadding : 0;\noutline:0;\nbackground:white;\nz-index:30;\nline-height: normal;\nborder : solid;\nborder-color:gray;\nborder-width:1px;\ntransform-origin:0% 0%;\ncaret-color: gray;\n-webkit-appearance: none;\nborder-radius: 0;\nbox-sizing:border-box;\n`)\n\nexport const StickerComponent: React.FC<{ sticker: StickerShape }> = observer((props) => {\n const [x, y] = store.board.layerTransform.apply([props.sticker.transform.tx, props.sticker.transform.ty])\n const width = props.sticker.Width * store.board.layerTransform.k\n const height = props.sticker.Height * store.board.layerTransform.k\n\n return \n\n\n\n\n {\n\n if (uiStore.ui.tool === Tool.Erase && store.userCanErase(props.sticker.OwnerID)) {\n store.removeSticker(props.sticker.ID)\n controller.socketController.removeShape(props.sticker.ID, \"sticker\")\n }\n\n controller.layerController?.setSelection(props.sticker)\n\n }}\n\n onTouchEnd={() => {\n if (uiStore.ui.tool === Tool.Erase && store.userCanErase(props.sticker.OwnerID)) {\n store.removeSticker(props.sticker.ID || 0)\n controller.socketController.removeShape(props.sticker.ID || 0, \"sticker\")\n }\n\n }}\n\n style={{\n pointerEvents: \"all\"\n }}>\n\n
\n\n \n
\n {uiStore.ui.tool !== Tool.Erase &&\n {\n store.boardUI.editedSticker = props.sticker; evt.stopPropagation()\n }}\n onTouchEnd={(evt) => { store.boardUI.editedSticker = props.sticker; evt.stopPropagation() }}\n />}\n {/* */}\n
\n
\n\n {/*
*/}\n\n
\n \n
\n {/*
*/}\n\n
\n \n\n \n})\n\n","import { Trans } from \"@lingui/macro\";\nimport { observable, makeObservable } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport React, { createRef, useEffect, useRef } from \"react\";\nimport Modal from 'react-bootstrap/Modal';\nimport Alert from 'react-bootstrap/Alert';\n\nimport { RouteComponentProps, withRouter } from \"react-router-dom\";\nimport 'react-splitter-layout/lib/index.css';\nimport styled from \"styled-components\";\nimport { ReactComponent as Logo } from '../drawing.svg';\nimport { store } from \"../store/store\";\nimport { uiStore } from \"../store/UIState\";\nimport { BoundKonvaBoard } from \"./BoundKonvaBoard\";\nimport { StickerComponent } from \"./sticker/stickerComponent\";\nimport { controller } from \"../controller/controller\";\n\n\n\n\nconst customStyles = {\n content: {\n top: '50%',\n left: '50%',\n right: 'auto',\n bottom: 'auto',\n marginRight: '-50%',\n transform: 'translate(-50%, -50%)',\n\n }\n};\n\n\n\n\n\nconst AbsolutePositionedDiv = styled.div<{ visible: boolean, top: number, left: number }>`\nposition:absolute;\ndisplay:${props => props.visible ? \"block\" : \"none\"};\ntop: ${props => props.top + \"px\"};\nleft: ${props => props.left + \"px\"};\n`;\n\nconst AutoSelect: React.FC<{ value: string }> = (props) => {\n const ref = useRef(null)\n useEffect(() => {\n if (ref.current) {\n ref.current.focus()\n ref.current.select()\n\n }\n })\n return \n\n}\n\nconst VCenterDiv = styled.div`\n display : flex;\n flex-direction: column;\n align-items: center;\n`\n\nconst CopyButton = styled.button`\n font-size : 20px;\n padding : 10px;\n margin : 10px;\n`\n\n\nexport const BoardComponent = observer(class BoardComponent extends React.Component {\n private canvasRef = createRef();\n private outerRef = createRef();\n private linkRef = createRef();\n\n konvaBoard?: BoundKonvaBoard;\n linkVisible = false;\n top = 20;\n left = 20;\n socialTop = 100;\n socialLeft = 100;\n inIframe = false;\n width = 0;\n constructor(props: any) {\n super(props)\n\n makeObservable(this, {\n linkVisible: observable,\n top: observable,\n left: observable,\n socialTop: observable,\n socialLeft: observable,\n inIframe: observable,\n width: observable\n });\n\n if (window.location !== window.parent.location) {\n // if (true) {\n this.inIframe = true;\n this.linkVisible = true\n window.setTimeout(() => {\n this.linkVisible = false;\n }, 1500)\n }\n }\n onResize = () => {\n if (this.canvasRef.current && this.outerRef.current && this.linkRef.current) {\n let canvasRect = this.canvasRef.current.getBoundingClientRect()\n this.socialLeft = 55\n this.socialTop = canvasRect.height - 30\n\n }\n }\n\n componentDidMount() {\n if (this.canvasRef.current && this.outerRef.current && this.linkRef.current) {\n this.konvaBoard = new BoundKonvaBoard(this.canvasRef.current)\n\n let canvasRect = this.canvasRef.current.getBoundingClientRect()\n if (this.linkVisible) {\n let linkRect = this.linkRef.current.getBoundingClientRect()\n this.top = 0;\n this.left = (canvasRect.width - linkRect.width) * 5 / 6;\n }\n this.socialLeft = 55\n this.socialTop = canvasRect.height - 30\n\n window.addEventListener('resize', this.onResize)\n this.width = this.outerRef.current.getBoundingClientRect().width\n }\n }\n\n onLoadLink() {\n }\n\n\n render() {\n\n return (\n
\n\n { uiStore.ui.showShareDlg = false }}\n style={customStyles}\n contentLabel=\"Shareable link\"\n >\n \n Invite\n\n \n \n \n\n Link to this whiteboard\n\n { document.execCommand('copy'); uiStore.ui.showShareDlg = false; }}>Copy\n \n \n \n\n
false} />\n \n {store.board.stickers.map((sticker) => {\n return \n })}\n\n \n
\n
\n\n )\n }\n // else {\n // return
\n // Connecting\n //
\n // }\n});\n\n\n","import React, { useRef, useEffect } from \"react\"\nimport { observer } from \"mobx-react\";\nimport styled from \"styled-components\";\nimport { undoredo } from \"../store/undoredo\";\nimport { TextShape } from \"../model/shape\";\n\n\nexport const InputDiv = observer(styled.input<{ width: number, height: number, transform: string, fontSize: number }>`\n position : absolute;\n left : -1px;\n top: -1px;\n display:'inline-block';\n width : ${props => props.width + 5}px;\n height: ${props => props.height + 5}px;\n /* -webkit-transform: ${props => props.transform}; */\n transform: ${props => props.transform};\n /* transform: translate(100px,100px); */\n margin :0;\n padding : 0;\n /* overflow : hidden; */\n outline:0;\n background:white;\n z-index:30;\n line-height: normal;\n font-size : ${props => props.fontSize}px;\n border : solid;\n border-color:gray;\n border-width:1px;\n transform-origin:0% 0%;\n caret-color: gray;\n -webkit-appearance: none;\n border-radius: 0;\n box-sizing:border-box;\n`)\n\n\nexport const LineEdit: React.FC<{\n value: string,\n onChange: (value: string) => void,\n width: number,\n height: number,\n transform: string,\n fontSize: number,\n shape: TextShape\n}> = observer(((props) => {\n const ref = useRef(null);\n useEffect(() => {\n if (ref.current) {\n ref.current.focus();\n ref.current.select()\n undoredo.beginUpdateShape(props.shape)\n }\n return () => {\n undoredo.endUpdateShape(props.shape)\n\n\n }\n\n }, [ref, props.shape])\n\n return props.onChange(evt.target.value)}\n fontSize={props.fontSize} width={props.width} height={props.height} transform={props.transform} />\n}))\n","import React, { useRef, useEffect, useState } from \"react\"\nimport { observer } from \"mobx-react\";\nimport styled from \"styled-components\";\nimport { undoredo } from \"../store/undoredo\";\nimport { controller } from \"../controller/controller\";\n\nimport Select from 'react-select'\nimport { Trans } from \"@lingui/macro\";\nimport { Shape } from \"../model/shape\";\n\ninterface TextAreaProps {\n width: number\n height: number\n transform: string\n fontSize: number\n}\n\n\nconst TextAreaDiv = observer(styled.div.attrs(({width, height, transform, fontSize })=> ({\n width : `${width + 5}px`,\n height:`${height + 5}px`,\n transform,\n fontSize : fontSize\n}))`\nposition : absolute;\nleft : -1px;\ntop: -1px;\ndisplay : inline-block ;\n/* -webkit-transform: ${props => props.transform}; */\ntransform: ${props => props.transform};\n/* transform: translate(100px,100px); */\nmargin :0;\npadding : 0;\n/* overflow : hidden; */\noutline:0;\nbackground:white;\nz-index:30;\nline-height: normal;\nfont-size : ${props => props.fontSize}px;\nborder : solid;\nborder-color:gray;\nborder-width:1px;\ntransform-origin:0% 0%;\ncaret-color: gray;\n-webkit-appearance: none;\nborder-radius: 0;\nbox-sizing:border-box;\n`)\n\n\nexport const TextAreaEdit: React.FC<{\n value: string,\n onChange: (value: string) => void,\n width: number,\n height: number,\n transform: string,\n fontSize: number,\n shape: Shape\n}> = observer(((props) => {\n const ref = useRef(null);\n useEffect(() => {\n if (ref.current) {\n ref.current.focus();\n ref.current.select()\n undoredo.beginUpdateShape(props.shape)\n }\n return () => {\n undoredo.endUpdateShape(props.shape)\n }\n\n }, [ref, props.shape])\n\n let height = props.height\n\n\n\n const [value, setValue] = useState(props.value)\n\n return \n