package Ġcost anza . ge orge . ui Ċ Ċ import Ġan td . dropdown . dropdown Ċ import Ġan td . layout . content Ċ import Ġan td . menu . Menu Info Ċ import Ġan td . menu . menu Ċ import Ġan td . menu . menuItem Ċ import Ġcost anza . ge orge . di agrams . To gether Ċ import Ġcost anza . ge orge . di agrams . base . Diagram Ċ import Ġcost anza . ge orge . di agrams . drawing Entity Types Ċ import Ġcost anza . ge orge . geometry . Coord Ċ import Ġcost anza . ge orge . reflect . ObjectType Registry Ċ import Ġcost anza . ge orge . reflect . Token Provider Ċ import Ġcost anza . ge orge . reflect . operations . Deserializer Ċ import Ġcost anza . ge orge . reflect . operations . Serializer Ċ import Ġcost anza . ge orge . reflect . und ore do . Ch anger Ċ import Ġcost anza . ge orge . reflect . und ore do . Differ Ċ import Ġcost anza . ge orge . reflect . und ore do . Group Change Ċ import Ġcost anza . ge orge . reflect . und ore do . Id Assign er Ċ import Ġcost anza . ge orge . ui . commands . I Tool Ċ import Ġio . ktor . client .* Ċ import Ġio . ktor . client . features . websocket .* Ċ import Ġio . ktor . client . request .* Ċ import Ġio . ktor . client . statement .* Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . http . c io . websocket .* Ċ import Ġkotlin ext . js . js Ċ import Ġkotlinx . browser . window Ċ import Ġkotlinx . coroutines . Main Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . html . unsafe Ċ import Ġorg . w 3 c . dom . HTML Div Element Ċ import Ġreact .* Ċ import Ġreact . dom . div Ċ import Ġreact . dom . js Style Ċ import Ġkotlin . js . Json ĊĊ Ċ external Ġinterface ĠDiagram Props Ġ: ĠR Props Ġ{ ĊĠĠĠ Ġvar Ġtool : ĠI Tool Ċ } Ċ Ċ class ĠDiagram State ( ĊĠĠĠ Ġvar Ġsvg : ĠString , ĊĠĠĠ Ġvar Ġsvg 2 : ĠString , ĊĠĠĠ Ġvar Ġsvg 3 : ĠString , ĊĠĠĠ Ġvar Ġtime : ĠInt Ġ= Ġ 0 , ĊĠĠĠ Ġvar Ġx : ĠDouble Ġ= Ġ 0 . 0 , ĊĠĠĠ Ġvar Ġy : ĠDouble Ġ= Ġ 0 . 0 , ĊĠĠĠ Ġvar Ġcursor : ĠString Ġ= Ġ" cross hair ") Ġ: ĠR State Ċ Ċ class ĠDiagram View ( props : ĠDiagram Props ) Ġ: ĠR Component < Diagram Props , ĠDiagram State >( props ) Ġ{ ĊĠĠĠ Ġval Ġtogether Ġ= ĠTo gether () ĊĠĠĠ Ġvar Ġdiagram : ĠDiagram ĊĠĠĠ Ġval Ġdiagram 2 : ĠDiagram ĊĠĠĠ Ġval Ġdiagram 3 : ĠDiagram ĊĠĠĠ Ġval Ġregistry Ġ= ĠObjectType Registry () ĊĠĠĠ Ġval Ġids Ġ= ĠId Assign er () ĊĠĠĠ Ġval Ġcalc Ġ= ĠClient Text Calculator () ĊĠĠĠ Ġvar Ġmargin X Ġ= Ġ 0 . 0 ĊĠĠĠ Ġvar Ġmargin Y Ġ= Ġ 0 . 0 ĊĠĠĠ Ġvar Ġstart X Ġ= Ġ 0 . 0 ĊĠĠĠ Ġvar Ġstart Y Ġ= Ġ 0 . 0 ĊĠĠĠ Ġvar Ġx Ġ= Ġ 0 . 0 ĊĠĠĠ Ġvar Ġy Ġ= Ġ 0 . 0 ĊĠĠĠ Ġval Ġmain Scope Ġ= ĠMain Scope () ĊĠĠĠ Ġval Ġclient : ĠHttpClient Ġ= ĠHttpClient Ġ{ ĊĠĠĠĠĠĠĠ Ġinstall ( WebSocket s ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** Ġwhere Ġare Ġwe Ġb rowsing Ġfrom ? Ġ*/ ĊĠĠĠ Ġval Ġorigin Ġ= Ġwindow . origin ĊĠĠĠ Ġval Ġscheme less Ġ= Ġorigin . replace (" http :// ", Ġ""). replace (" https :// ", Ġ"") ĊĠĠĠ Ġval Ġport less Ġ= Ġscheme less . split (": ")[ 0 ] ĊĠĠĠ Ġval Ġuse W ss Ġ= Ġorigin . startsWith (" https :// ") ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserial Ġ= Ġfetch Diagram () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiagram Ġ= Ġmake Diagram ( serial ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetState Ġ{ Ġsvg Ġ= Ġtogether . make SVG ( diagram ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġregistry . addAll ( drawing Entity Types ) ĊĠĠĠĠĠĠĠ Ġdiagram Ġ= Ġmake Diagram () ĊĠĠĠĠĠĠĠ Ġdiagram 2 Ġ= Ġtogether . make Diagram 2 ( calc ) ĊĠĠĠĠĠĠĠ Ġdiagram 3 Ġ= Ġtogether . make Diagram 3 ( calc ) ĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠDiagram State ( together . make SVG ( diagram ), Ġtogether . make SVG ( diagram 2 ), Ġtogether . make SVG ( diagram 3 )) ĊĊĠĠĠĠĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use W ss ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Using Ġsecure Ġwebsocket s ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Using Ġin secure Ġwebsocket s ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock : Ġsuspend ĠDefault Client WebSocket Session . () Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( ids . client Session ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġframe Ġ= Ġincoming . receive ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFrame . Text Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠJSON . parse < Json >( frame . read Text ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserial Ġ= Ġjson [" payload "] Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġforward Ġ= Ġjson [" forward "] Ġas ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchanges : ĠGroup Change Ġ= ĠDeserial izer ( registry ). deserialize ( Token Provider (( serial ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiagram . apply Collabor ative Changes ( changes , Ġforward ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetState Ġ{ Ġsvg Ġ= Ġtogether . make SVG ( diagram ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use W ss ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . wss ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Ġ= ĠHttpMethod . Get , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost Ġ= Ġport less , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ= Ġ"/ diagram - changes ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ġ= Ġblock ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . ws ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Ġ= ĠHttpMethod . Get , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost Ġ= Ġscheme less , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ= Ġ"/ diagram - changes ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ġ= Ġblock ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmake Diagram ( serial : ĠString ? Ġ= Ġnull ): ĠDiagram Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( serial Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiagram Ġ= ĠDeserial izer ( registry ). deserialize ( Token Provider (( serial ))) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiagram Ġ= ĠDiagram () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdiagram . ch anger Ġ= ĠCh anger ( ids . client Session , Ġregistry , Ġdiagram ) ĊĠĠĠĠĠĠĠ Ġdiagram . calc Ġ= Ġcalc ĊĠĠĠĠĠĠĠ Ġdiagram . differ Ġ= ĠD iffer ( ids , Ġregistry , Ġdiagram ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdiagram ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġmark Mouse ( e : Ġan td . MouseEvent < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġe . native Event ĊĠĠĠĠĠĠĠ Ġx Ġ= Ġn . offset X ĊĠĠĠĠĠĠĠ Ġy Ġ= Ġn . offset Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġignore Ġ= Ġfalse ĊĠĠĠ Ġoverride Ġfun ĠR Builder . render () Ġ{ ĊĠĠĠĠĠĠĠ Ġcontent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattrs . style Ġ= Ġjs Ġ{ Ġcursor Ġ= Ġstate . cursor Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattrs Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon MouseDown Ġ= Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ignore ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignore Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark Mouse ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . buttons Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignore Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . buttons Ġ== Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmargin X Ġ= Ġstate . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmargin Y Ġ= Ġstate . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart X Ġ= Ġe . client X . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Y Ġ= Ġe . client Y . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetState Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġe . client X . toDouble () Ġ- Ġstart X Ġ+ Ġmargin X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġe . client Y . toDouble () Ġ- Ġstart Y Ġ+ Ġmargin Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġ" grab " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( e . buttons Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprops . tool . diagram Ġ= Ġdiagram ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprops . tool . click ( Coord ( x , Ġy )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchanges Ġ= Ġdiagram . record Changes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetState Ġ{ Ġsvg Ġ= Ġtogether . make SVG ( diagram ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Changes ( changes , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonMouse Up Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetState Ġ{ Ġ Ġcursor Ġ= Ġ" cross hair " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonMouse Move Ġ= Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark Mouse ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . buttons Ġ== Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetState Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġe . client X . toDouble () Ġ- Ġstart X Ġ+ Ġmargin X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġe . client Y . toDouble () Ġ- Ġstart Y Ġ+ Ġmargin Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġ" grab bing " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon ContextMenu Ġ= Ġ{ Ġe : Ġan td . MouseEvent < HTML Div Element > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark Mouse ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetState Ġ{ Ġtime ++ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiv Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdropdown Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay Ġ= Ġbuild Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs . onClick Ġ= Ġ{ Ġinf : ĠMenu Info Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inf . key Ġ== Ġ" undo ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchanges Ġ= Ġdiagram . undo () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetState Ġ{ Ġsvg Ġ= Ġtogether . make SVG ( diagram ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( changes Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Changes ( changes , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inf . key Ġ== Ġ" redo ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchanges Ġ= Ġdiagram . redo () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetState Ġ{ Ġsvg Ġ= Ġtogether . make SVG ( diagram ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( changes Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Changes ( changes , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Item Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġ" undo " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisabled Ġ= Ġ! diagram . can Undo () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+" Undo " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Item Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġ" redo " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisabled Ġ= Ġ! diagram . can Redo () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+" Redo " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrigger Ġ= ĠarrayOf (" context Menu ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiv Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiv (" overlay ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjs Style Ġ{ Ġtop Ġ= Ġstate . y ; Ġleft Ġ= Ġstate . x Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunsafe Ġ{ Ġ+ state . svg Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiv (" overlay ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjs Style Ġ{ Ġtop Ġ= Ġstate . y ; Ġleft Ġ= Ġstate . x Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunsafe Ġ{ Ġ+ state . svg 2 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiv (" overlay ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunsafe Ġ{ Ġ+ state . svg 3 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġfetch Diagram (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġclient . get < HttpResponse > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl ("$ origin / diagram ") ĊĠĠĠĠĠĠĠ Ġ}. read Text () ĊĠĠĠĠĠĠĠ Ġval Ġjs : ĠI Json Payload Ġ= ĠJSON . parse ( content ) ĊĠĠĠĠĠĠĠ Ġreturn Ġjs . payload ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġsend Changes ( change : ĠGroup Change , Ġredo : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient . put < HttpResponse > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcontentType ( ContentType . Application . Json ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= ĠJSON . stringify ( js Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Ġ= ĠSerializer (). serialize ( change ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforward Ġ= Ġredo }) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl ("$ origin / changes ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠR Builder . diagram view ( handler : ĠDiagram Props . () Ġ-> ĠUnit ): ĠReact Element Ġ{ ĊĠĠĠ Ġreturn Ġchild ( Diagram View :: class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . attrs ( handler ) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ external Ġinterface ĠI Json Payload Ġ{ ĊĠĠĠ Ġval Ġpayload : ĠString ĊĠĠĠ Ġval Ġforward : ĠBoolean Ċ } ĊĊ