-
Notifications
You must be signed in to change notification settings - Fork 7
Interface
This document was generated from 'src/documentation/print-interface-wiki.ts' on 2025-07-17, 13:48:31 UTC presenting an overview of flowR's interfaces (v2.2.16, using R v4.5.0). Please do not edit this file/wiki page directly.
Although far from being as detailed as the in-depth explanation of flowR, this wiki page explains how to interface with flowR in more detail. In general, command line arguments and other options provide short descriptions on hover over.
As explained in the Overview, you can simply run the TCP server by adding the --server
flag (and, due to the interactive mode, exit with the conventional CTRL+C).
Currently, every connection is handled by the same underlying RShell
- so the server is not designed to handle many clients at a time.
Additionally, the server is not well guarded against attacks (e.g., you can theoretically spawn an arbitrary number of RShell sessions on the target machine).
Every message has to be given in a single line (i.e., without a newline in-between) and end with a newline character. Nevertheless, we will pretty-print example given in the following segments for the ease of reading.
Note
The default --server
uses a simple TCP
connection. If you want flowR to expose a WebSocket server instead, add the --ws
flag (i.e., --server
--ws
) when starting flowR from the command line.
-
Hello Message (
hello
)View Details. The server informs the client about the successful connection and provides Meta-Information.
sequenceDiagram autonumber participant Client participant Server Client-->Server: connects Server->>Client: hello
After launching flowR, for example, with
docker run -it --rm eagleoutice/flowr --server
(🐳️), simply connecting should present you with ahello
message, that amongst others should reveal the versions of flowR and R, using the semver 2.0 versioning scheme. The message looks like this:{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.16", "r": "4.5.0", "engine": "r-shell" } }
There are currently a few messages that you can send after the hello message. If you want to slice a piece of R code you first have to send an analysis request, so that you can send one or multiple slice requests afterward. Requests for the REPL are independent of that.
Message schema (
hello
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-hello.ts
.-
. object [required]
- type string [required] The type of the hello message. Allows only the values: 'hello'
- id any [forbidden] The id of the message is always undefined (as it is the initial message and not requested).
- clientName string [required] A unique name that is assigned to each client. It has no semantic meaning and is only used/useful for debugging.
-
versions object [required]
- flowr string [required] The version of the flowr server running in semver format.
- r string [required] The version of the underlying R shell running in semver format.
- engine string [required] The parser backend that is used to parse the R code.
-
. object [required]
-
Analysis Message (
request-file-analysis
)View Details. The server builds the dataflow graph for a given input file (or a set of files).
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-file-analysis alt Server-->>Client: response-file-analysis else Server-->>Client: error end deactivate Server
The request allows the server to analyze a file and prepare it for slicing. The message can contain a
filetoken
, which is used to identify the file in later slice or lineage requests (if you do not add one, the request will not be stored and therefore, it is not available for subsequent requests).Please note!
If you want to send and process a lot of analysis requests, but do not want to slice them, please do not pass thefiletoken
field. This will save the server a lot of memory allocation.Furthermore, the request must contain either a
content
field to directly pass the file's content or afilepath
field which contains the path to the file (this path must be accessible for the server to be useful). If you add theid
field, the answer will use the sameid
so you can match requests and the corresponding answers. See the implementation of the request-file-analysis message for more information.Example of the
request-file-analysis
MessageNote: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.16", "r": "4.5.0", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
Let' suppose you simply want to analyze the following script:
x <- 1 x + 1
For this, you can send the following request:
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1" }
-
response-file-analysis
(response)Show Details
The
results
field of the response effectively contains three keys of importance:-
parse
: which contains 1:1 the parse result in CSV format that we received from theRShell
(i.e., the AST produced by the parser of the R interpreter). -
normalize
: which contains the normalized AST, including ids (see theinfo
field and the Normalized AST wiki page). -
dataflow
: especially important is thegraph
field which contains the dataflow graph as a set of root vertices (see the Dataflow Graph wiki page).
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":5}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8066-9i67VbS2FwIv-.R"}},"rhs":{"location":[1,6,1,6],"lexeme":"1","info":{"fullRange":[1,6,1,6],"additionalTokens":[],"id":1,"parent":2,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-8066-9i67VbS2FwIv-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,1,1,6],"additionalTokens":[],"id":2,"parent":6,"nesting":0,"file":"/tmp/tmp-8066-9i67VbS2FwIv-.R","index":0,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[2,3,2,3],"lhs":{"type":"RSymbol","location":[2,1,2,1],"content":"x","lexeme":"x","info":{"fullRange":[2,1,2,1],"additionalTokens":[],"id":3,"parent":5,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8066-9i67VbS2FwIv-.R"}},"rhs":{"location":[2,5,2,5],"lexeme":"1","info":{"fullRange":[2,5,2,5],"additionalTokens":[],"id":4,"parent":5,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-8066-9i67VbS2FwIv-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"+","lexeme":"+","info":{"fullRange":[2,1,2,5],"additionalTokens":[],"id":5,"parent":6,"nesting":0,"file":"/tmp/tmp-8066-9i67VbS2FwIv-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8066-9i67VbS2FwIv-.R","role":"root","index":0}},".meta":{"timing":3}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":12,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-8066-9i67VbS2FwIv-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":4}}}}
-
The complete round-trip took 18.5 ms (including time required to validate the messages, start, and stop the internal mock server).
You receive an error if, for whatever reason, the analysis fails (e.g., the message or code you sent contained syntax errors). It contains a human-readable description why the analysis failed (see the error message implementation for more details).
Example Error Message
Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.16", "r": "4.5.0", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filename": "sample.R", "content": "x <-" }
-
error
(response)Show Details
{ "id": "1", "type": "error", "fatal": false, "reason": "Error while analyzing file sample.R: GuardError: unable to parse R code (see the log for more information) for request {\"request\":\"file\",\"content\":\"/tmp/tmp-8066-RkYPqSu33sY6-.R\"}}\n Report a Bug: https://github.com/flowr-analysis/flowr/issues/new?body=%3C!%2D%2D%20Please%20describe%20your%20issue%20in%20more%20detail%20below!%20%2D%2D%3E%0A%0A%0A%3C!%2D%2D%20Automatically%20generated%20issue%20metadata%2C%20please%20do%20not%20edit%20or%20delete%20content%20below%20this%20line%20%2D%2D%3E%0A%2D%2D%2D%0A%0AflowR%20version%3A%202.2.16%0Anode%20version%3A%20v22.14.0%0Anode%20arch%3A%20x64%0Anode%20platform%3A%20linux%0Amessage%3A%20%60unable%20to%20parse%20R%20code%20%28see%20the%20log%20for%20more%20information%29%20for%20request%20%7B%22request%22%3A%22file%22%2C%22content%22%3A%22%2Ftmp%2Ftmp%2D8066%2DRkYPqSu33sY6%2D.R%22%7D%7D%60%0Astack%20trace%3A%0A%60%60%60%0A%20%20%20%20at%20guard%20%28%3C%3E%2Fsrc%2Futil%2Fassert.ts%3A75%3A9%29%0A%20%20%20%20at%20guardRetrievedOutput%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A184%3A7%29%0A%20%20%20%20at%20%2Fhome%2Frunner%2Fwork%2Fflowr%2Fflowr%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A148%3A4%0A%20%20%20%20at%20processTicksAndRejections%20%28node%3Ainternal%2Fprocess%2Ftask_queues%3A105%3A5%29%0A%20%20%20%20at%20async%20Object.parseRequests%20%5Bas%20processor%5D%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fparser.ts%3A58%3A18%29%0A%20%20%20%20at%20async%20PipelineExecutor.nextStep%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A207%3A25%29%0A%20%20%20%20at%20async%20PipelineExecutor.allRemainingSteps%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A266%3A4%29%0A%20%20%20%20at%20async%20FlowRServerConnection.handleFileAnalysisRequest%20%28%3C%3E%2Fsrc%2Fcli%2Frepl%2Fserver%2Fconnection.ts%3A152%3A3%29%0A%60%60%60%0A%0A%2D%2D%2D%0A%09" }
The complete round-trip took 8.6 ms (including time required to validate the messages, start, and stop the internal mock server).
Including the Control Flow Graph
While flowR does (for the time being) not use an explicit control flow graph but instead relies on control-dependency edges within the dataflow graph, the respective structure can still be exposed using the server (note that, as this feature is not needed within flowR, it is tested significantly less - so please create a new issue for any bug you may encounter). For this, the analysis request may add
cfg: true
to its list of options.Requesting a Control Flow Graph
Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.16", "r": "4.5.0", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "if(unknown > 0) { x <- 2 } else { x <- 5 }\nfor(i in 1:x) { print(x); print(i) }", "cfg": true }
-
response-file-analysis
(response)Show Details
The response looks basically the same as a response sent without the
cfg
flag. However, additionally it contains acfg
field. If you are interested in a visual representation of the control flow graph, see the visualization with mermaid.As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","cfg":{"returns":[],"entryPoints":[32],"exitPoints":["32-exit"],"breaks":[],"nexts":[],"graph":{"rootVertices":[32,15,"15-condition","15-exit",0,1,2,"2-exit",8,5,6,7,"7-exit","8-exit",14,11,12,13,"13-exit","14-exit",16,31,17,18,19,"19-exit",30,22,25,"25-name","25-exit",24,"24-before-value",23,"24-exit",26,29,"29-name","29-exit",28,"28-before-value",27,"28-exit","30-exit","31-head","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["15-condition"],"end":["15-exit"]}],["15-condition",{"id":"15-condition","kind":"condition","type":"mid","root":15}],["15-exit",{"id":"15-exit","type":"end","root":15}],[0,{"id":0,"type":"expr"}],[1,{"id":1,"type":"expr"}],[2,{"id":2,"type":"expr","end":["2-exit"]}],["2-exit",{"id":"2-exit","type":"end","root":2}],[8,{"id":8,"type":"expr","end":["8-exit"]}],[5,{"id":5,"type":"expr"}],[6,{"id":6,"type":"expr"}],[7,{"id":7,"type":"expr","end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],["8-exit",{"id":"8-exit","type":"end","root":8}],[14,{"id":14,"type":"expr","end":["14-exit"]}],[11,{"id":11,"type":"expr"}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr","end":["13-exit"]}],["13-exit",{"id":"13-exit","type":"end","root":13}],["14-exit",{"id":"14-exit","type":"end","root":14}],[16,{"id":16,"type":"expr"}],[31,{"id":31,"type":"stm","end":["31-exit"],"mid":["31-head"]}],[17,{"id":17,"type":"expr"}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr","end":["19-exit"]}],["19-exit",{"id":"19-exit","type":"end","root":19}],[30,{"id":30,"type":"expr","end":["30-exit"]}],[22,{"id":22,"type":"expr"}],[25,{"id":25,"type":"stm","mid":["25-name"],"end":["25-exit"]}],["25-name",{"id":"25-name","kind":"name","type":"mid","root":25}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":["24-before-value"],"end":["24-exit"]}],["24-before-value",{"id":"24-before-value","kind":"before-value","type":"mid","root":24}],[23,{"id":23,"type":"expr"}],["24-exit",{"id":"24-exit","type":"end","root":24}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"stm","mid":["29-name"],"end":["29-exit"]}],["29-name",{"id":"29-name","kind":"name","type":"mid","root":29}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":["28-before-value"],"end":["28-exit"]}],["28-before-value",{"id":"28-before-value","kind":"before-value","type":"mid","root":28}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["31-head",{"id":"31-head","type":"mid","root":31,"kind":"head"}],["31-exit",{"id":"31-exit","type":"end","root":31}],["32-exit",{"id":"32-exit","type":"end","root":32}]],"bbChildren":[],"edgeInformation":[[15,[[32,{"label":0}]]],[1,[[0,{"label":0}]]],[0,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[7,[[8,{"label":0}]]],[6,[[5,{"label":0}]]],[5,[[7,{"label":0}]]],["7-exit",[[6,{"label":0}]]],["8-exit",[["7-exit",{"label":0}]]],[13,[[14,{"label":0}]]],[12,[[11,{"label":0}]]],[11,[[13,{"label":0}]]],["13-exit",[[12,{"label":0}]]],["14-exit",[["13-exit",{"label":0}]]],["15-condition",[["2-exit",{"label":0}]]],[8,[["15-condition",{"label":1,"when":"TRUE","caused":15}]]],[14,[["15-condition",{"label":1,"when":"FALSE","caused":15}]]],[2,[[15,{"label":0}]]],["15-exit",[["8-exit",{"label":0}],["14-exit",{"label":0}]]],[31,[["15-exit",{"label":0}],["30-exit",{"label":0}]]],[18,[[17,{"label":0}]]],[17,[[19,{"label":0}]]],["19-exit",[[18,{"label":0}]]],[25,[[30,{"label":0}]]],[22,[[25,{"label":0}]]],["25-name",[[22,{"label":0}]]],["24-before-value",[[24,{"label":0}]]],[23,[["24-before-value",{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[["25-name",{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],["29-name",[[26,{"label":0}]]],["28-before-value",[[28,{"label":0}]]],[27,[["28-before-value",{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[["29-name",{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],["31-head",[[16,{"label":0}]]],[30,[["31-head",{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[["31-head",{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false}},"results":{"parse":{"parsed":"[1,1,1,42,38,0,\"expr\",false,\"if(unknown > 0) { x <- 2 } else { x <- 5 }\"],[1,1,1,2,1,38,\"IF\",true,\"if\"],[1,3,1,3,2,38,\"'('\",true,\"(\"],[1,4,1,14,9,38,\"expr\",false,\"unknown > 0\"],[1,4,1,10,3,5,\"SYMBOL\",true,\"unknown\"],[1,4,1,10,5,9,\"expr\",false,\"unknown\"],[1,12,1,12,4,9,\"GT\",true,\">\"],[1,14,1,14,6,7,\"NUM_CONST\",true,\"0\"],[1,14,1,14,7,9,\"expr\",false,\"0\"],[1,15,1,15,8,38,\"')'\",true,\")\"],[1,17,1,26,22,38,\"expr\",false,\"{ x <- 2 }\"],[1,17,1,17,12,22,\"'{'\",true,\"{\"],[1,19,1,24,19,22,\"expr\",false,\"x <- 2\"],[1,19,1,19,13,15,\"SYMBOL\",true,\"x\"],[1,19,1,19,15,19,\"expr\",false,\"x\"],[1,21,1,22,14,19,\"LEFT_ASSIGN\",true,\"<-\"],[1,24,1,24,16,17,\"NUM_CONST\",true,\"2\"],[1,24,1,24,17,19,\"expr\",false,\"2\"],[1,26,1,26,18,22,\"'}'\",true,\"}\"],[1,28,1,31,23,38,\"ELSE\",true,\"else\"],[1,33,1,42,35,38,\"expr\",false,\"{ x <- 5 }\"],[1,33,1,33,25,35,\"'{'\",true,\"{\"],[1,35,1,40,32,35,\"expr\",false,\"x <- 5\"],[1,35,1,35,26,28,\"SYMBOL\",true,\"x\"],[1,35,1,35,28,32,\"expr\",false,\"x\"],[1,37,1,38,27,32,\"LEFT_ASSIGN\",true,\"<-\"],[1,40,1,40,29,30,\"NUM_CONST\",true,\"5\"],[1,40,1,40,30,32,\"expr\",false,\"5\"],[1,42,1,42,31,35,\"'}'\",true,\"}\"],[2,1,2,36,84,0,\"expr\",false,\"for(i in 1:x) { print(x); print(i) }\"],[2,1,2,3,41,84,\"FOR\",true,\"for\"],[2,4,2,13,53,84,\"forcond\",false,\"(i in 1:x)\"],[2,4,2,4,42,53,\"'('\",true,\"(\"],[2,5,2,5,43,53,\"SYMBOL\",true,\"i\"],[2,7,2,8,44,53,\"IN\",true,\"in\"],[2,10,2,12,51,53,\"expr\",false,\"1:x\"],[2,10,2,10,45,46,\"NUM_CONST\",true,\"1\"],[2,10,2,10,46,51,\"expr\",false,\"1\"],[2,11,2,11,47,51,\"':'\",true,\":\"],[2,12,2,12,48,50,\"SYMBOL\",true,\"x\"],[2,12,2,12,50,51,\"expr\",false,\"x\"],[2,13,2,13,49,53,\"')'\",true,\")\"],[2,15,2,36,81,84,\"expr\",false,\"{ print(x); print(i) }\"],[2,15,2,15,54,81,\"'{'\",true,\"{\"],[2,17,2,24,64,81,\"expr\",false,\"print(x)\"],[2,17,2,21,55,57,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,17,2,21,57,64,\"expr\",false,\"print\"],[2,22,2,22,56,64,\"'('\",true,\"(\"],[2,23,2,23,58,60,\"SYMBOL\",true,\"x\"],[2,23,2,23,60,64,\"expr\",false,\"x\"],[2,24,2,24,59,64,\"')'\",true,\")\"],[2,25,2,25,65,81,\"';'\",true,\";\"],[2,27,2,34,77,81,\"expr\",false,\"print(i)\"],[2,27,2,31,68,70,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,27,2,31,70,77,\"expr\",false,\"print\"],[2,32,2,32,69,77,\"'('\",true,\"(\"],[2,33,2,33,71,73,\"SYMBOL\",true,\"i\"],[2,33,2,33,73,77,\"expr\",false,\"i\"],[2,34,2,34,72,77,\"')'\",true,\")\"],[2,36,2,36,78,81,\"'}'\",true,\"}\"]",".meta":{"timing":3}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RIfThenElse","condition":{"type":"RBinaryOp","location":[1,12,1,12],"lhs":{"type":"RSymbol","location":[1,4,1,10],"content":"unknown","lexeme":"unknown","info":{"fullRange":[1,4,1,10],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R"}},"rhs":{"location":[1,14,1,14],"lexeme":"0","info":{"fullRange":[1,14,1,14],"additionalTokens":[],"id":1,"parent":2,"role":"binop-rhs","index":1,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R"},"type":"RNumber","content":{"num":0,"complexNumber":false,"markedAsInt":false}},"operator":">","lexeme":">","info":{"fullRange":[1,4,1,14],"additionalTokens":[],"id":2,"parent":15,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R","role":"if-cond"}},"then":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,21,1,22],"lhs":{"type":"RSymbol","location":[1,19,1,19],"content":"x","lexeme":"x","info":{"fullRange":[1,19,1,19],"additionalTokens":[],"id":5,"parent":7,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R"}},"rhs":{"location":[1,24,1,24],"lexeme":"2","info":{"fullRange":[1,24,1,24],"additionalTokens":[],"id":6,"parent":7,"role":"binop-rhs","index":1,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R"},"type":"RNumber","content":{"num":2,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,19,1,24],"additionalTokens":[],"id":7,"parent":8,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R","index":0,"role":"expr-list-child"}}],"grouping":[{"type":"RSymbol","location":[1,17,1,17],"content":"{","lexeme":"{","info":{"fullRange":[1,17,1,26],"additionalTokens":[],"id":3,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R"}},{"type":"RSymbol","location":[1,26,1,26],"content":"}","lexeme":"}","info":{"fullRange":[1,17,1,26],"additionalTokens":[],"id":4,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R","index":1,"role":"if-then"}},"location":[1,1,1,2],"lexeme":"if","info":{"fullRange":[1,1,1,42],"additionalTokens":[],"id":15,"parent":32,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R","index":0,"role":"expr-list-child"},"otherwise":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,37,1,38],"lhs":{"type":"RSymbol","location":[1,35,1,35],"content":"x","lexeme":"x","info":{"fullRange":[1,35,1,35],"additionalTokens":[],"id":11,"parent":13,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R"}},"rhs":{"location":[1,40,1,40],"lexeme":"5","info":{"fullRange":[1,40,1,40],"additionalTokens":[],"id":12,"parent":13,"role":"binop-rhs","index":1,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R"},"type":"RNumber","content":{"num":5,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,35,1,40],"additionalTokens":[],"id":13,"parent":14,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R","index":0,"role":"expr-list-child"}}],"grouping":[{"type":"RSymbol","location":[1,33,1,33],"content":"{","lexeme":"{","info":{"fullRange":[1,33,1,42],"additionalTokens":[],"id":9,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R"}},{"type":"RSymbol","location":[1,42,1,42],"content":"}","lexeme":"}","info":{"fullRange":[1,33,1,42],"additionalTokens":[],"id":10,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R","index":2,"role":"if-otherwise"}}},{"type":"RForLoop","variable":{"type":"RSymbol","location":[2,5,2,5],"content":"i","lexeme":"i","info":{"additionalTokens":[],"id":16,"parent":31,"role":"for-variable","index":0,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R"}},"vector":{"type":"RBinaryOp","location":[2,11,2,11],"lhs":{"location":[2,10,2,10],"lexeme":"1","info":{"fullRange":[2,10,2,10],"additionalTokens":[],"id":17,"parent":19,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"rhs":{"type":"RSymbol","location":[2,12,2,12],"content":"x","lexeme":"x","info":{"fullRange":[2,12,2,12],"additionalTokens":[],"id":18,"parent":19,"role":"binop-rhs","index":1,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R","index":1,"role":"for-vector"}},"body":{"type":"RExpressionList","children":[{"type":"RFunctionCall","named":true,"location":[2,17,2,21],"lexeme":"print","functionName":{"type":"RSymbol","location":[2,17,2,21],"content":"print","lexeme":"print","info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":22,"parent":25,"role":"call-name","index":0,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R"}},"arguments":[{"type":"RArgument","location":[2,23,2,23],"lexeme":"x","value":{"type":"RSymbol","location":[2,23,2,23],"content":"x","lexeme":"x","info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":23,"parent":24,"role":"arg-value","index":0,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R","index":0,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[2,27,2,31],"lexeme":"print","functionName":{"type":"RSymbol","location":[2,27,2,31],"content":"print","lexeme":"print","info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":26,"parent":29,"role":"call-name","index":0,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R"}},"arguments":[{"type":"RArgument","location":[2,33,2,33],"lexeme":"i","value":{"type":"RSymbol","location":[2,33,2,33],"content":"i","lexeme":"i","info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":27,"parent":28,"role":"arg-value","index":0,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R","index":1,"role":"expr-list-child"}}],"grouping":[{"type":"RSymbol","location":[2,15,2,15],"content":"{","lexeme":"{","info":{"fullRange":[2,15,2,36],"additionalTokens":[],"id":20,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R"}},{"type":"RSymbol","location":[2,36,2,36],"content":"}","lexeme":"}","info":{"fullRange":[2,15,2,36],"additionalTokens":[],"id":21,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R","role":"root","index":0}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":15,"name":"if","type":2},{"nodeId":0,"name":"unknown","type":1},{"nodeId":2,"name":">","type":2},{"nodeId":7,"name":"<-","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":13,"name":"<-","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":8,"name":"{","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":14,"name":"{","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":31,"name":"for","type":2},{"name":":","nodeId":19,"type":2},{"name":"print","nodeId":25,"type":2},{"name":"print","nodeId":29,"type":2}],"out":[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":true}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":false},{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]},{"nodeId":16,"name":"i","type":1}],"environment":{"current":{"id":93,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]}]],["i",[{"nodeId":16,"name":"i","type":4,"definedAt":31}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-8066-Zbmfuhm1vZB8-.R"],"_unknownSideEffects":[{"id":25,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":29,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[0,1,2,6,5,7,8,12,11,13,14,15,16,17,18,19,23,25,27,29,30,31],"vertexInformation":[[0,{"tag":"use","id":0}],[1,{"tag":"value","id":1}],[2,{"tag":"function-call","id":2,"name":">","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:default"]}],[6,{"tag":"value","id":6}],[5,{"tag":"variable-definition","id":5,"cds":[{"id":15,"when":true}]}],[7,{"tag":"function-call","id":7,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":5,"type":32},{"nodeId":6,"type":32}],"origin":["builtin:assignment"]}],[8,{"tag":"function-call","id":8,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":7,"type":32}],"origin":["builtin:expression-list"]}],[12,{"tag":"value","id":12}],[11,{"tag":"variable-definition","id":11,"cds":[{"id":15,"when":false}]}],[13,{"tag":"function-call","id":13,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":11,"type":32},{"nodeId":12,"type":32}],"origin":["builtin:assignment"]}],[14,{"tag":"function-call","id":14,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":13,"type":32}],"origin":["builtin:expression-list"]}],[15,{"tag":"function-call","id":15,"name":"if","onlyBuiltin":true,"args":[{"nodeId":2,"type":32},{"nodeId":8,"type":32},{"nodeId":14,"type":32}],"origin":["builtin:if-then-else"]}],[16,{"tag":"variable-definition","id":16}],[17,{"tag":"value","id":17}],[18,{"tag":"use","id":18}],[19,{"tag":"function-call","id":19,"name":":","onlyBuiltin":true,"args":[{"nodeId":17,"type":32},{"nodeId":18,"type":32}],"origin":["builtin:default"]}],[23,{"tag":"use","id":23,"cds":[{"id":31,"when":true}]}],[25,{"tag":"function-call","id":25,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":23,"type":32}],"origin":["builtin:default"]}],[27,{"tag":"use","id":27,"cds":[{"id":31,"when":true}]}],[29,{"tag":"function-call","id":29,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":27,"type":32}],"origin":["builtin:default"]}],[30,{"tag":"function-call","id":30,"name":"{","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":25,"type":32},{"nodeId":29,"type":32}],"origin":["builtin:expression-list"]}],[31,{"tag":"function-call","id":31,"name":"for","onlyBuiltin":true,"args":[{"nodeId":16,"type":32},{"nodeId":19,"type":32},{"nodeId":30,"type":32}],"origin":["builtin:for-loop"]}]],"edgeInformation":[[2,[[0,{"types":65}],[1,{"types":65}],["built-in:>",{"types":5}]]],[7,[[6,{"types":64}],[5,{"types":72}],["built-in:<-",{"types":5}]]],[5,[[6,{"types":2}],[7,{"types":2}]]],[8,[[7,{"types":72}],["built-in:{",{"types":5}]]],[15,[[8,{"types":72}],[14,{"types":72}],[2,{"types":65}],["built-in:if",{"types":5}]]],[13,[[12,{"types":64}],[11,{"types":72}],["built-in:<-",{"types":5}]]],[11,[[12,{"types":2}],[13,{"types":2}]]],[14,[[13,{"types":72}],["built-in:{",{"types":5}]]],[19,[[17,{"types":65}],[18,{"types":65}],["built-in::",{"types":5}]]],[18,[[5,{"types":1}],[11,{"types":1}]]],[25,[[23,{"types":73}],["built-in:print",{"types":5}]]],[23,[[5,{"types":1}],[11,{"types":1}]]],[29,[[27,{"types":73}],["built-in:print",{"types":5}]]],[27,[[16,{"types":1}]]],[30,[[25,{"types":64}],[29,{"types":72}],["built-in:{",{"types":5}]]],[16,[[19,{"types":2}]]],[31,[[16,{"types":64}],[19,{"types":65}],[30,{"types":320}],["built-in:for",{"types":5}]]]]},"entryPoint":15,"exitPoints":[{"type":0,"nodeId":31}],".meta":{"timing":2}}}}
The complete round-trip took 10.8 ms (including time required to validate the messages, start, and stop the internal mock server).
Retrieve the Output as RDF N-Quads
The default response is formatted as JSON. However, by specifying
format: "n-quads"
, you can retrieve the individual results (e.g., the Normalized AST), as RDF N-Quads. This works with and without the control flow graph as described above.Requesting RDF N-Quads
Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.16", "r": "4.5.0", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1", "format": "n-quads", "cfg": true }
-
response-file-analysis
(response)Show Details
Please note, that the base message format is still JSON. Only the individual results get converted. While the context is derived from the
filename
, we currently offer no way to customize other parts of the quads (please open a new issue if you require this).As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"n-quads","id":"1","cfg":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/id> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/id> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/id> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/from> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/from> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/from> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/from> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/from> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/to> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/from> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/to> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/entryPoints> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/exitPoints> \"6-exit\" <unknown> .\n","results":{"parse":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/token> \"exprlist\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/text> \"\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/text> \"x <- 1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/parent> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/token> \"SYMBOL\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col1> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col2> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/token> \"LEFT_ASSIGN\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/text> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col1> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col1> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/parent> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/token> \"NUM_CONST\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/text> \"x + 1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"12\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/id> \"10\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/parent> \"12\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/token> \"SYMBOL\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col1> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col2> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/id> \"11\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/token> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/text> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col1> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/id> \"14\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col1> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/id> \"13\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/parent> \"14\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/token> \"NUM_CONST\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n","normalize":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/type> \"RExpressionList\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/type> \"RBinaryOp\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/lhs> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/type> \"RSymbol\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/content> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/lexeme> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/rhs> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/lexeme> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/type> \"RNumber\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/content> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/num> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/operator> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/lexeme> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/type> \"RBinaryOp\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/lhs> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/type> \"RSymbol\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/content> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/lexeme> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/rhs> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/lexeme> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/type> \"RNumber\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/content> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/num> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/operator> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/lexeme> \"+\" <unknown> .\n","dataflow":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/tag> \"value\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/tag> \"variable-definition\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/tag> \"function-call\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/name> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/onlyBuiltin> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/nodeId> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/nodeId> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/origin> \"builtin:assignment\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/tag> \"use\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/tag> \"value\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/tag> \"function-call\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/name> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/onlyBuiltin> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/nodeId> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/nodeId> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/origin> \"builtin:default\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"returns\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"built-in:<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"calls\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"defined-by\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/type> \"defined-by\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/from> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/to> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/to> \"built-in:+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"calls\" <unknown> .\n"}}
The complete round-trip took 7.4 ms (including time required to validate the messages, start, and stop the internal mock server).
Retrieve the Output in a Compacted Form
The default response is formatted as JSON. But this can get very big quickly. By specifying
format: "compact"
, you can retrieve the results heavily compacted (using lz-string). This works with and without the control flow graph as described above.Requesting Compacted Results
Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.16", "r": "4.5.0", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1", "format": "compact", "cfg": true }
-
response-file-analysis
(response)Show Details
Please note, that the base message format is still JSON. Only the individual results are printed as binary objects.
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"compact","id":"1","cfg":"ᯡ࠳䅬̀坐ᶡ乀洢琣℥犸ŜHߐএ妔Ǔ㗠ߙ⣬啕㑡偍Ɇ傧値㒠ࢀඁ潾⩬ᰡ暁∠ᰠ䆥ᕅ-ℬਖ਼�Ю᩸8堢ᣐŐ牝砂֠ᦫ+ଠ⬮῭泡猁Ы栠湦⡞D帠ڊ⌠˺䑭┐祔ᗈᲠʊ䋑Ţॴ䙵ᠸ⼸庮అҀƝ墈嬢掍䳂啲䇋咕ヰ吧㾅㫏䭲Ի⍚♱乓䈁綜ᇓ䬂沪ⲣ矼壋推墙㚈ヶ৳櫂Ჷ廋漭峣Ɖ㠊尐综弱又્Ġ⮃䇼䶀䄈ᄽン崈䚤㢋厇㤀༡ԯ焼㱘ⴂĵ唢㔁ڃ恽ܳₕ䉁,ᝳ䠠ශ⤡旰稤ࡴ⡀䒪⺴旨泎ⴃℒ≫ᩂࡀᚊඃ博ܤ己Dž妜劤⩐嵸殀䩶畬坈⪵ㆥ桨䩆掆嚍橡ㆾ榒䩭埋ℜঋ殍ᯕ獺䭡㾛堹qij尓ࠍ侓⪐䭃ឈǏ穝㵨'梅Рɴ↨b兂چᙹ剉䥅₲儫ᢠ䃺㚰 ","results":"ᯡࠣ䄬Ԁ朥ᢠ⭘ʄ䠭偃TȨۯ䂖㸠ᨐςภẁ⏟�ࠡ寫␦0Đ˳笃倫埧䡶⣞�⼠攠䴠夠℠礠N⠡⺑㰺❯侴兮凓⬮溆瑌䅩䩰‥侠়䯫倥ࠡ䐠⨠素⃒奠ीܰǪ౭⹀ᅫҿࠀօ烄ŵ橱�㚪㥢Ẻ㘇࢙⸐禍粂川থ䈮持燳᭝Ĥ䄂湉᪾毴琼搨Lj扙ㆠ峕ᜰᝦ勳桖ᛷ㌋淢⥌燿崄ᰆᵊϜ䐷ဠ㤲瘐篤幞ᑮড়㼽ٰ嗊嫝⿲᤺懏懔䴜⧏ă琦ᜳ⥇瑠=+㎠రሴP¶ᱩဣ堡晨ʠؓ吐ဥဧ奠㣎ҰƘშࠢƠ䠠怢㳠幨\"⢥㵘أ²Ⲫ㝢☫ᢠᣠÑፘ琴ܠ劰汑Ṍ䫅䵅ᴥう᧡㉕ࡉᨨ漡╁Řోⰴ峅ઑ1䖹揻༇⥴㙀㊋௱坊٣⡸䈑盦ว䖀౬㊶惓䋖ᣩ抐动᪻晆牏∮䏀Ⓑ⊵恤Ⲡ气䥓ѣ⤀㐽ᩢɀᐲᲵ䎴䭌ذ綞卒佢ᡨ侶䧴䜉䮂疲䀾䂁拠ᏹ籀Yᒂጰ灼ଙ泠भ㊣䐠溄カ䀦ⓩⁿⱈᵇ⫹崮䉡㵮ι獬殢ପⱺ䮒楻⭊⭻爸ᓪᮆ櫻孎揻ඞ桘࠱悈⤬慙❘ᖢ杶⃘䄅戢垕梠⣍桊⤺督斠⾓檘枘挙弯渚羟栥ᤠ溈劃ู恈卑柨⥕ᒠ⢴暙悦ે哭ᢠ湓Ƞ㥈倸䜛⣄օ°མ㔇⛩〱ම楊粵护䭞♸⭊捹ℙౠᭆ拹捂᷸⥾涡䤑擪倽ᩣᦍ毥眰�棬汇ԋ殛潧洚得樘罟性˕恻磩浙や⣙唣ృ㕽⦡ó⠺㌫▉※➉ᦐᬺ崤椐㘥ଦ䃞ⳅ̰渺⎈愥掃⻑䚄淇ᳬ恹✘᥈他ስ储妦歝塡抢ᢶ㠮沶匔墡ᑪᏇ屴䁦ᝰᓴ㣭架睶呷ཱᙷ䓪啄櫹ὴᓗዥ䂸椥曮䜪惓喡ᄀ媥䌔ᤵヽ厬♧傷ᕄ剥笵桙粏咖绚ፙ枆ሮ⼆傅ᦎᏙ礁洭Ӹ㩇䪩ᕷ⓺坄䵀暅䌭ᗇ⢽ᨡ璼⟬䁃ᘠ䴅㫎ⲥ䓪洛ᤄቃ嬆ᦗᅉ⁏ᆄ䁅䠄ˌৰ娣䊬ᔷ㈑䧳⧢ࢴ婦ᧄక㋃厴售Ҳ噎⾘㥇⪹擦召㢪Ử㫾䗶վ叉畠ᝫ筋埫為㛻ϗ嘽壡挼⇁ぇ绲幌叉㒬㏙㰧嫬敘奁⨬嫪܆熜⡨囒✿䞻㺣ᴨ۠ᴠ༌ᖬՉ浹⬑Ⓟᰦ恔懁嘅Ι▭⛒擷ɨ᱇ᮀ䋒ォ䕶戯焹☝㼧㽅㯐垦尒稶♐ೢ㓬䖜瀦簪䠛獓穋∦㍕恜ⷠ牔ⓨ徫䅬㥒⇂縲⊼੧䑧⨠᪸惀ન㍈.ƶ㹬唼券渥➨㢭䥥ᣳ〨ƴ⺥梞䌡᠌₨ႝᒣ�͐Ǒ䌊ུ剤ȁ㸾䆸ᯨ穢娙䈠䚂⭄缦丣ᄴ䝃┷䌠䉢㱗Ӥ㼪ൾ∱♤䇂᪣㩚⎤ᙤ剅䙈朢惤ű並儺ἃ恇⍓瑡䗨斯នࢨ⥪⡁փ翦掤㤥䑤䒤玭䤈䶩䱡䆾ᯨ傺撀㍒㉼⠓Ъ䄀䴩᪂兞ጤ⥄Ი䕘纪哤¨沴全ྲ繒⡚㓅ʄ䟄畭唉Ġィࣚೀ╀␀㛤䁝䓀獨唁䱠᥅ሠ㥋拌埅ず杬嚫ᓡ戹嚻ᄧᜳᅌ㋢ễ暃╌橬唓䴉岲牆泩橒⢎₆旄姬ᢻ䫙⸰�宼֘癄∾◅䉸ᕒઁℲ␂倠㒭䌰ᖦჀ哚㌖㹩孢䤠Ѹয়ᜪ浌⧻䆏ቢ瑎ⓧॹx䂟撪େภㅶᔂ幎儢⣨≹禎撓͟狢㧻⥳筨㖨ᦟʥֳՉᅫ㉆⮕奰㦐参䎵狼⥁̨ᗆొ⯔㲷╟㕈Jⵏ䫥ⱹᕹ㖍ឋ࣓⩱㭷㦎嚐㙏欜⼉ⅷ妹䜊擜卮ⱅ涕ᔾ㷌焥⢅⚸秋ጻ滙❶嘒䇊ŕ揦ᔶ儺浆ᯉ‡疃㺵ᖃᝌ熍䢪浭搹埋糐欣㣷ͨV墋糇䱑૽┠ࡩ⸑嵻⬬⒖ᮇ坖矌曟⮍峿䵸൛㷒㬰җ⥠В䞃坊卋団᧾专嫺㧃嬓⯔侚瓚沭滻⮕妱փ唋߂⭽㑗妌痂稊期⠵⯲嵁娻曜᭟㙤浴㖸壨~᰻溤涥篸ㄨ㛌䷏窙ថඖ稹粨䐮䏣墧㋁ሽ㤯ᵱ皎礸櫔欕汘嶷墡Ӌ媧㺯䃿㛌朽ࠠ㹄Ἵᑛ⍢㪚䲇橸恕声㒜䐗欳繕䣢㼛㗒ܬだㄏ疒猾暹ᾃ祘થ呧⭛⟉䣫痲專ậṃ⭓厇忇�宄珗ř愹熶⪓橸ჶ㝊營㪋⥔奰⽙撸⺣ᨣཝ㵾㦸冗晗⩏⥠ʰ㋺俹䑻ӌ庫㧺珘ザ₄*畎儂5智Ẍ壃᠅⸊㞶浃ᜊ烍ヴ䷥箺ᨂ⮋竔厺㵷涓ᚍ㻌泵䴺ඬ嬻໗卽㜇䯋宆悏㣦盍䪸旪✻ე毙㇖㮞㙻✮夏Ⲫ暆涪⍻掸㯷㋇ᦡ堀㾏䋦癝䌼憥嶫◗䍩㖡ᖖ䝓᪴ൄ桭桾冯湃ႜ㰟嵇熜瘿娼ǰ潣畏䀠ґ旷嫋ಓߥ㚖犘䮑礿ऎ᷃尧⏈䎢⍤篏嘶Ꮗ้檾ാṍ䥸⏩⃧暓➣㩮䴚乴殽㡒僲ⵝ娚㴳⇔ᜮ䯘ኈ囹悾㳱ᵓ烝䯾㵹榒អ煮墲䡧䰼廣ự䙝氇Ꮇ仝簌确ងm潾䳿䶤州㦊⫄ᠬめ䖮䜈㛽揾娅幋找ዿ㴗ኚ奁狇⯧⧕☑൧䥁䠓㬛௸㏶焜ਉ斶㏶僉䛄瀡♼Η㏸筦؈思畟戚㹪֘⨧㣽笗瓴峸㢧綫澎䰗弱官矊絛㔔坖矿ὕ䗶櫎䟾თ氺焒⇇៳㱧琀㼁柎毶ˏ墙㋵绅㪫焮ຕ㈯涟㬒渝娙濐䭟橷场⼠ᪿ⻛榞∊摟娦䀓稛動涿甞ሆ枸␠ᜠ瀓⎧帀̞䩗δ淿拪瞓شʟ斎成㽂ΰ㚰悞ၴ懨̢➱紀ኞ帖㨶㲟⌆֒ྰ㲍澡ⴐ俍ഈើ㒗⎴ǀ漓䞦嵸ᐡ䗕㱗暡云炃㲑扁橰䀲泞喴䢋घĖ偹ⴄᩁ婕⢐ᶠⅨ䰣涺懚⧤漮䉞毆Ꮧ⿅綩⢁洫⡪᳔ၔ娔ᔣ凜䯁堯桵ⱷ䋨朩ᢅʴK性䋜ს⇔҆䧉⊜嵧攫䌭旡ᙰ䒇Âḁ縬྿䊈ᄜ碬⒐⎨憱巣⎪ᑉɨ㘦䢜ʽ澱䊩₀㳪棈⩠ᑱ⋐ᭂ檭呪䳁Ũ൦ᑩˢ⋱㚮➹䉏氖扲瑭䎨桑橰㩈岨ᜁ婓⎴ᗺ榯咁䗆ᩑᙢ剎ňᛕ䢸拶ፑ咫ᗖ揶ბ䐠ᱪ䳦 ඨ溹掖ᡁ㒬䨵抮ᖑ歔⍘ፁЯ椯⎁柱䀓緛嶾ᰡ氯楞緙⃞堖ῆ挬➨櫦履䎈ሩ↭Ꮙ⧜ቧ⎶Ѿຫ㒪ዱႠ侯揌挞掩瑨ʌ䖩Ⴀ橴䁀儑ᅑϒ喵ዳ̩纩宣ᩩ䌵㉪䵹ᢑ婫ឰ淙ᓩᾮአ劮၉悖窶ၕ̠屵ⲕ⥉楬੧᳐ཉ⥩䩱捵ᣉ簑䀶ႜ⭉婓⩎台䓉且晁匕ᒑ獮᪕ᓕ䇄䔗橰涍ᔠ筯扵̖ᗺ❩㪛Ꮬ➪杫㑤䊕᷈栠䁓絵䆩灨溠充ᗈ惭چ䥽ᰁᮩ⢀㊃ᾌ㣨≫ᓃᐹ㓫☸∼ᔹࠒ慜㎙天檁㋣ᒱ䔨ࢌሿ䁹疂ᙦ㋢⽹㓤㙠㋑ّ䔒瀣厨改仪㨴〳፹晫噮君᷹⎫癪招ᔸ盬窗≫ᬱ曩檜牭 䳢䚊獇ዙ彯媛㐐ᴉ䐓ʑɁᢠ⣨ṩ၎䃁劍溙杤ṳ㋺ℙ⌤幪䳀ࣤᴬ拢⨙嗣⺍扵ᘙ柭䣟珌ᎉ⧧⽘㉯ᇚ䆀૪漥ᙦ䆗厰廜᭩♀犟ቱ㚵㒆梧ⓨ究ୠ墂籍乣䊬ੈ䪣ၾ㲀契⇖再ਨὥ⫩幱᥈晋兹捥幎勒ህࣈ坠ㅽᎈ汅ա流௬䥢䦈䪙斱喴⥮槉⇠栖㡮ᭂ䵈ᠷ䏏ኾ乏䥠≣ႅ磮窞䯜俞㕤⩌岔媙牦䥺岬寱怖⪆ㆼ待冖窗䰒仹䘀ሶჸྌ㳧ॿᏉ䀨⫢囩㝊籧䭭Ῠ棊⼼⩥ⷙⱡ䕦⬓૾瓍ֆ⬼凚ᖘ⯸岅㥋幣祪張㹍啨咍ᬵᙧቛξ欑屍䢻パ˵ᛤⅧ厺嫵㹎疏⪥ু布ྯ㍶┥缕䦗捜围ৎ便આ奕⛎ⵤ⭫ዪ姈喛䭰ᐥ䳡浪䯖囕ܫ㈺熫Კ䙎ᇙ歋ᢵɯ㩿涎妅揋ӓ歮ᢈ⩠ᡝப啶檒絻ఎ圉手緟毞埥ゎゞ㉉Ǣ䷊犁念㿖噌ᯝክᕓ㞴橹⦭㧎▚父♨竌紿Ἑ㢍繻ᖙཱ碍父啭㹈㎘≠幭仌ᢦ偹寕Ⓩ浹ⱙ倥⎫獤਼哪捸⑥崠⒎ኤ婾宖⫑䭷Ᏸݱ忍冸µ啍ᙯ⮈叵嵪\"塪ᲂ坱尋⸡㹴ۤ斑⬡⛻狷嗔䛺岰狃㙥㖄怪犺㝄⫊୶盻㗫㕻㤰烵狎ԫḃ¸䑳㙤䇽傰璋⍝䇺庑稛⢌凾䀸癲▱ʣ-⍚Ⱐ海✨柲⍛ۍ亲⌇㙛ኦB疇❚䀷㛹㍚◶⼊⡐୵⳻勣㏵㣳曎榗㟻拌⎞瓉嚑➡p㭛⮊慊Ắ≭ི܂⣯㲚籼廛≲ㅜ榤㳐璕⏛ࠦm矎ߛᔵ洣皦⌈痱擣琶᱂ဨℶⅤൻ䫹Ἐ㛨䧱矸绍㟯㠺囹䲗畮ᐚ甽生瑟⨛̅籣㔏㌳➽ᔓ㒛㫒♽⫮㡠澫げồ憫ⷄ憡䈃瘲⦚㡝甌࿏⪫Լ终ష㚭⒦恀౻⺺⥵⇀ⶭ匠�瀰䱊樻㬮綶浒暀碏䕢ễᩇ†恼䓡沩䒍䆲ᷡ揷०⌲ᰂ劮⒏ⵍ䗬咮౷ⴺᯚ簬㣋浉⧱䆢㒈燦ᳱ畉珜⸴᪂禕〶嵩游䪻䟃⓯ଁ澅涿燔ᱡ䋴岝䢜Ⱁ盓ǭ捏梮憫粜溅ォ矇粚䬓䖌⢔㡚̻垩岃摟⍀Ƭ䰢䨫㱛惄㊠ܮAہ堤湟㢌䅞Ὴ笿䠵䞶ㅊ劙⢩氾櫨᪔᱄欠㻒懝揇眾杯曽䐬۰ᬡ䈳㳯燺⭰羨㍃ᶈ殃埿㋅Ũᵮ桗厼զ匮柏叴坰૭㪔ᎌ池㛬㪕㐝Ự挡⚔㍸擼⟫了㎑䎹暁䈡㍫ᢞ⇭窈燏ṙ棤皋⏧༙犘چ玃ᶺᜳ⺘㌷ᯙ睻暑㐛ఙ矆௨猼፧`㪁ǐ婒䁍䆖珠帉⁎暒ଯ᪙啦憉䍐ܙ畈ちୟᣅ寬⫃௳ᨥ粀䆏ࣘ墥容↙玲䛅燭๋䮨墐溣ᆏ㎛栵敏纔玣᳥䍌疲㎲寥孌চ儵䵍ᢙ⮿ᢐ犢֜䏐⫋⛎䖖䰂妅癏೨欴䟙磪ঋ媚奵掮噺氊彑!哕㒳ᬾᇓ堕㺫䍽䬘暹㜠卿ᬃ朵㠖ཹ嬓♹⨻ݻಫ基岳⫓⋦✉㸫姃彈᠉㝋㛷㋪䐕㓣㉺公㠓友䨸✃ങһⱿ䙊㞹㐋敤܅圞恨嫫ᔻ㧓ܨ䐡㟌㑻⇐眇圳㸋瓿㠝㍻㍿拥垣㱪廻۱㒛㞻猶そ巻媙䗻᮷ᨬŢᓁ氎㱌䀵⛐נ䇬擠傒㷜ᑏ攁➪㢜栕瘨ⷝ२仦ࠡ䬷HỀ睟㊰#ც櫛ܿ۸┠瞡ᅈ䁙ᦷ㇚樕ጄ㧛ᠦ滶冗㹳⠤哮ᗊ㲛䱢攙眒び㗡弉⠏㌡䟺漫癹ܛ⌄缆冯㐛у绻䦩⌧࡛㊚柠繬橵⽔*ᔍ浾嶊擘甠ṛ䄉㜟⇛⅜⇮砑㟛㑘Ủຯ㭳♡戎❏㾧⊹ᓽ砝༢剞㼋眫敧ⱜ⋍ྟ䀛ਐ优庇È㢞妧䐓孝灦➫େ䏸溂佯㶳ᕝ漺伨秇ᗆ槢⋨矇矽畁侕䲇穝᧿氼知ᣜ剣倬㠦䅪ᙠ炷ⓝⅱ䮼级㞐⧩瞴熛潞廦俼愛䃝槥န爛マ绩伸狩瓚湊સㄇ⦣�࿌儱糧⻚痘秖旼侒眇糛ỷ仏でዞᇫ碔繧䩞嘛侊礷竘㽏⼢竧曻Һ濚绳᾽你瀗㬇᪹ự䇙₀䝃Хᆈ孳チڞჂը杬ืԫ拌⬮Ҵ癗䋘业侏㩷ᗼ滊稷䗘䘏း癶線Პ濢ᅢ剰坯Ṣ⠠⏡湼罇ᇞ㽚ᗮ猠䯞巴ㆎ犜̠㷳澭จ䤫䁛潔䨗ཝ戊侪耗様׳瞡爷橚᧥ㄈ焯⣞ኪự灍碘剣䋩˧᾽໒碗䲞ḖỮ熗⯚懱礗娰☥Ỿ眤᪙嬡⼐磯≚樐榆簷͛ϷἊ癶ঘ渐▏ሉ㈳2琓ࣤ㯽侳桗⏛؉澽Ïʝᘽ湩竏柘毵ổ爀ᶞ緾彆瓯䎛岋ṭ烗ϱᆙ玎យ䗱揳甏圖བ㋌㟁掍矎㽳ᤇ兜ᕔ徦筏积溜畗多怰ḳ稯┟ᰒ滪檽噏झ⮫緿ࠩ℺硔䆿哜ɠ繰呟➟㯥㽐缇嶘㐔㸭耇⎚㠅⿹獷攞⁊㿰༭⼤绽縉瞓绀ܷܫٔƧ璯怉罇煵ྙ䯷庑簏▚笠㽩盏ៜ吕ΰ絿窚ᗡ㽟ᳪ瞯喞厚尉恗ṉ磍捘☝砒ヶ罓緬⟠䬞㹚ః榡䀹硟浟Ṽ猑篯ཥ㲎瞟墾倛Њ篈㸿㡧捿ᒜ羔À峠౯䚮㜘稃v糮䆀ồܣ娐㡧⢕⃀狋ྡ匚㻨翅㺁㧯栠洣䀬ϴę屻皀㈡ங㭤ၿ׃䚸栩㭡ĭϱ燫䚞凛⠿ᾴ䄠磭拟Ტᴗץ䄈ˊᗰ⤂橩ʀ為灉⃖ᚢ右㒹惥⃥ϰ⢎̧ㄉ࿑䇞㪸ዯ̢ᘯ⿺惭糸೬圧櫃氼ↈ燐䱜ᛁ䨠䄴挱簺ᙨ㰊㒧ᴪ㇖ĸ禨᭟ሮљ侅綄ध勡◚堵⣖⇉߄्甭摄捵㇢ᕬᠤ䯋尺绛᪽Ѱ䰀柝䔪ᡔ儚粷环䱁⪤∸傛㹽兂䂅â˷瑏ᤥ洿悾䟁セ矆墀慯第ဠ濼攨㟳ᢓˆୗ䚁媦俍墈勻ݲ䫣⪠ ⩯榰憨眬㱀罉㴪တ䀞燙氃࿘憭穴ᛟ᧢倪䑌噷䐀䷄灥洂滘偯ݿ敶̠炯㱉朼ˑ眘㛞綛むሀшረ摜緶≈ݹ沧噄ぼ㟩ຆ矓憨ȪνᘢἯ桗¬⊈ౘ䀁掦焴悇ἇӸᗺᵃ◴灒ࢦ䕉Ⲅモ垪䂋国嬱么䍃⢬籙䣚㲞⑁દ☴ѤĤ䖏捘ӂႩ寶≹⊘དᏞ㞧琊烚Ǹ欯ઈ仢䔬ᡟヿ䌈র㵱㱧㤵咔Åᅺៈ楃⭁ᩈ棑䥛璴㙖㝸紼Ḽ内窨ᘐ勃ᢪU⢩䉊眨㠱┥绠౷円㉺ᦠ忂层࡚梡Έ曬㼞䙥簸呤䄧֬ὠ粃✬橉ᤂ⨓䦦嫥䛄灢ↂ䄆፨汢ⶨᙞ⣆⏱બ㖱㋥ᴱⱦ刘䝶㎃⊡晛榖揧೬␠璒嬰䒍ಓ䚖Ḹ婂嘕癈ᄞ抑ດ⮱⬤示ѷ㑫䗶ᑈ憩ެ㙜抔㧱搬ブ繘奡㱸ㅂێṀ䥣▫籜壖㱽ⷱ㋑漺䲃岍ᄞጨ䎤ឯ乃ㄝ䶠乼∑դ笲Ᵽ凸䚤ᡘ䠂㔭牏皐ኯ┑叧渀怨ॲ䓾ᵝϜᎬᙈホ⎵ব㳁㣧弳屲ਛ䘝䌏Ԃࠨᅆ㣐悸ڗ䖩⨙₶屬ॊ䞱ဨ眃爭㩄㢧熸䮾䄡ᙄ̓C偷䖖枤䰄ત䥂ӽᡃ์㨑塆挻扢ॴ⒏桨牔牨樰⤔ዯᗲ㑱㨐㏇㺾䨐䚡៝ᬩⓔ➾磥ጿ௸㒩ጤ碱摿৵։᷈圙♭套礈ᷜ佒〩猳礶>㹟ᬥᨴ笳嶬煅┎ኮ๗冡繆㼸ኇᲴ䑥ᢟ⩲☑⦸堪ফϴ੩̛㐶ॖ⥰̅Ạᶳ᳂⥚Ҹ勨䮪━⇤һ泥⚵ῄ矂Ⳇ㕒ᡒ劇උ䤱筛匋檄⥥䕵ቐ䰃ສ湃ⓤ又仲㡲绅嚌㲞竓▒⺷㎼㢧ᘰ䡼搙ᙺⶰ嗆㒄ㅼ⓵Ứ籲প噑咹厧䄪安㗆挅媛ჷ⟥憔刨ဧᘬ椐瘖㖋䨉ៅ皼剨槊ⓙᲔ斃䎫ᵁ坧刯䚚㽤ᯆ䆱怷椯♅曘⍤絭́ೡ厨䠨㠉壅ື⪂ा⟚ሔ糁礴䍎ജ㊊Ⴤ㨠䒹̽ᑦ尤䋠ด烳皨捍礆緼䲨㪉ᮒԦ⚊۴擯亂ңؿᔓ〉䮉ឹ䤫䪺Ⱓ䥄❦ᴄ浳Წ䵇㖧䔶㟩⫐䖿暗⥺䆽洯ൂ怠歙梈㰪પ⨑璆ຸ晢⧬明䐐㫬歅㵱▕䬾墦࿅尠妏☏⧷⢨拫ԢⳔ㐉䥖ₑ䩅斲暇䦹䂛ጌ狓䜆㭎�በՔ㻸䦽㱥冁ᇧᮔ㩬⮨煈泟㏅䳦㙹玅㼵浊㤩昑⑼嘱峫ಠ桧層典䱊Ὰ⮰㐼䦯㯈䭬瑳䛩杔河务䣘「笇⮴溟扬ᬗ涓哀䘷ὁ㶽甐䂢冻墄妝䛞ြ卓匨䓉琙盗䷉籇䞺䟐廨Ң⬌演买ὁ⒪劝䦄⎑䘇䚸ພ㧩▏䊜娲寬卡糓拦⁁Ẑ炼乻┏斛ᘌ㨓殭ొ紘䥾⼙䳢羱沰ᘥᙒ␡ф❚┏琋叞䚹娆活癳䦌䒗ᠬ䍳差ੵˆ䲿䥡℥紓朩ౕᄫ䔭䊸▕⟯᳧ዅ仡⦙㎅䁼ښ⌄ᕠ嶱✫お晛吺玻䣺㢬ℤѵ熷ㅣ⛗ᶼ猫埮⽑ᤖı㿙唧硴兺᳖㪈ᘜ僒ഷ⣅峌狐⳼␥夶亿䅻ᥚ៸Ꮒ棥峁⼷Ł୶⎢ᦘ㡃п㉣ؓ晿ᙔ憫ⱋ䣄抧爌⻑⒱㓥䉫熃䗭ंఠㆴض抶浢⼩◦崶ᡰ庛䖊䑭ᮜ粫癑䓂ይ爢⮉ᔐザ㉴媐硴燘ᧂ䞣痰◨匘䭼⨡⥅溒ਇ⒳淫㟄ຐ哖ഛ䋇ᕰ仢ᆰ〧╌䆔剨ཫ桏浚唖牸ⴎ⼥ڴ䆷榇◽ᘳῲ惪㵍䍀匽厽àᾘ䕣倬惝ᛌ囔媁栤泀㠽䯘Ӊ㌥☴౼䦈վᝬ喌䉽筌ឰ猃䯖ⷹ㑲䤠㥦昘曜嚒汒債ܪዔ嶧䀥㵙䡆ධ䥻䖐❼坲哪㑬㓔ૢ㌱⮩䄾㰚⡹㊉牌䋂堜禜⹈峑ገ⮊ⴑ㣥㮶┥䖞缞ᘞᭂ㥊棍㽋䈦爧ў⹖婐橪ᄹ摢啲棳ӏ⥆犲Ⰱ⧗ᖵ囇㉶ʯ救査᭝ᙁ朲ˍ利⯧劵㴅ఇ⩳斋䥉ᗐ市䊪㛫!⫃䔅㴂冫ಬṔ啔䚐Ҋ䆡勈ᭂ⋝⸡☵扷橰ᕯ䘆噺哣ຐ᫁憛ᕛʅ㡑Щᾃ䖅⦲᠈垊克ፊ╍ደ爣⬁⍼棶硲ᑃ9䟂割潢沄⛐᪠ਮ伹♥ݵ慹㚗ଉ哦勻↋燊柸櫩獽烕ㅵ䀷㥶劊喜噚徺䌰༐竕㴶樲甕↖㦵ٹ⠢№㮖姸⾋嗊曚⊯⪺瀠ݴᶈ勳嘖妃╁撩䫖∽悷⫕㔹╶歿究ᦺ✧Ἀ欋䋊勐戣毚䢦㦕佾嵼稘啢坺䁓畨䛃⫌ȕ䓅⎔៴哥პ噳ዪ⠊拓㫟劅䮒㵵創〧統㖁ၡ强琺ئ狦䣸ᮺ⩂㬕䁔ᦱᦎ֯喡妸∺獨᥇گ櫉۹䜴⭣ヅ↑ಿ唱啨ऻ䏋㬛⯧⾶⯔‥⎍㢜⭑屦嬻⼂別ᡪয়⦲㙤俶磻╭ඍ旱嘺䘺Ꮟ㩈⛖橘䙭㹔朹綜\"䍊爫ن⧛䨩ࠝ㎵ᕷ㵮畡摻ᥚ嚻⪍槒ۖ䧬槳♙俷᰿呈䕟墈⎺䩉ೇ瓉⢳∕⥕䫢玖䉳䏙帉z溉Ӎ㋨浹ᴼ綇ჱ䆊พ攆僦弋徯歉䌸婷唱嵭ⴴ伷厕喰嘹巚库₊㫒⡫拌溱䙙㑪Ꮳ疇礴搩劘咨᪥嗝䬐Ⱂ欅⠭崄䃻㦉͵島戊ᯇ病囚ⰙġЙ擷櫱卹猃㘅凚䶋ᶉ惗曦᮱喻⋍䌳Ằ㊽䵯㦂ഠ㲓႐⇇㛝宎䔳⯭僶祻ֆෝ㞁咖攨➏䧖眝嬗䬹චȱ㤨纳偱ˮබ楫م㷛䠯婀̛㓚㨷㶰͢消㕅奆䫻䓇緝皰务漛㶍䭁廸ސᵑ旣堮俭ᤈ⏔皰檊⣛㝕⯕᭹䰮ᵮ䈑♮慀᩵⏁່䈙凄㊽㪗ⱁ獽ᨘ瓊徚癒⦊皱伞㓌凇㐍K⧰ލᴸ᎔ኺ曣⨩濍㌍㽗㧿杰ᵲ甼⥎擔䌏㷚嵘ǃ䯋⥙᳔凰ݶ嵚盕崂纺曌㬈㫙檊㔽⎖۾烍巹残冮橚㢤緉嬕減矕巸䝨ᵆ疿Ḯ䤋庌Ꮩᛳ᯽೧璗ᇵྛ崡皭圾竲㯜亶㮣⦷㶽捖剴綉᷉矍䁚缊敟Ệ㯟ካ㷉化秷ஈ斂㚧坎党ଉ寈庡㮹汏㟽圗汎ㄲ㵱Ë劾䮛䬌䭽ẻ⨩⩓㣍Ổ䧸⩉㵊矗唰㒚匈毊ဢ禬ۄ䱽⧗痹䞒緋睫婞养嶏狒㻭筜⛿㕽咕㟱ㆣ䊸瑙嶮橛堎࿀囍殠歵⊝䧵⿺獥ᷗ矟左篙⤑緕ᬅᰁ玻┭ዹ㞒淶眧䰎〛䤈�Ș歋号ᄥˇ㷰䃰ഗ璽挟Ģ编⯰ὒ㷵着㠞媘䏾㭣㸁盏᱉ୁ࠽䗲䇀ᡄጬᶎᾺ⑀愚Θ܃澯ᰝՠ翨ᾒ㰨ᬯ䢣婗毱枎由瓈⽡睽Ꮃ࢟垝磗喚⤙桘摝庌ะᡯㄢ⬓悛罭㵈བྷ㱭ㄕⷲჷ㑘䁈㌯ʧ⌵ࢩǡ㏝潻䰵厗嫺愋繤ڐ㉠眧砹翯䇊ˮ涷⡣ፗ䡓㝕䌰殸㳱⊊㽖ᢊ笘婥Ӡ綣䜮㓎僷繁稰㈁孚搏濑嫩止᪁哣ܩ悥䉓᷆喻⼞䬦䩤䒅∟㶼ᣰ繃眬瑘ᄖ㵅㙯嶱䅦烗撈ⶓ३Σㄾ㝪椝ࢥ㽏ᘦ䒗ǘ䞘Ự搣棿儏䌯憔㖲刋䱓㒙挦õҀ榃ᬭ϶㞏␘դ㫁厧ㄻ၍懱䞨ᬐ曃᠗崱J挡㺽⫬咣ॻ⳨慥ט枼ᬖᔴ僣䍛ฬ㩠伦ܾ毪冲ߜ᧯⬭瀠Ṕ礕͗එ磁亡絢庰᰾Რậ幟椔⍼ྴ㉑濦挽梔䇩䟠⸤疆ѭ壂毜Ᏸ䶒≨㭧挏㵜䧥ުỠ浣↯癕儆፧ඇ幞䈛Ꮘὶ㇗毉ἴ尜珶ဠ㐿ᎁᲩ盧┻沛燆✟狤竃㙮剞璀叏嗪⩳㛘咤庿䨘õᠭळ婬ٖ䔐损ཪ㋩牧倏㊝棭⟵ᱟ䳺䯰⑉ℬ㬜不徉烇⼽檕䘭᪴羣㬗繒㣹半৺ソlƿᝋ䈸ţ¬അ൯䍙搔ᒌ㩉䥦㠺粕懯✲ᳯ⓳۵獹ᵸ㌻≦㢟㒆罊ŝຆډࣜ㦣杬笰䳽Ꮫ㥉䔣䲸ࢇ槙⛓ᾔⳓ焯㵆泴䍥仒ij⦇椁皌⊮⬌ᩈ濃ㅭፒ焆䐕䴺㣹燧䶾Ꮢ㪫戧ᥱ忓淄㽎綦䠩��汆浇嬵㻭曥燴璓䓯楜䴄猩ผ㭙䩦ⶺ䓽㧈/ᮣ備㯬筷ӄ䐋П֦滭ṽ禢ރᬧ㹓坬㹟唃፳䶚㨁歇垿亟㪰㭟ᰂ堓㡏Ǭいڴ丏⊀ࢼ涏䷊姝⟽ᴢ挓ᥭ᭕˳㶶ୁ㋕⤷⼃䨎گ攓佑⤁捓乡㪉糇續冄ᛒ㵧䢗䋕ᩯཝⴇ挳乑ヹ矆垽ㆆ秎桽玍✚ܨ௪⺯暒ⷯ⌑斆䁿ખ妴曠孬瞝⠖㍝̏ᨩࢩὔ抶砰灆䈖標ᥠⳫ翯羾ޖஎ䱪㇅縷䚻濜◝ᜬᵒ檣ᢘ㳛⃣䌘ఘㆅ珁繸嚍㣛ហ巢滓❏ᣑ䴜嵐睌朦恦广䖛䐯欀Ɗ䦝摜敯峉⺤劸✐乏Ⲙ㧭䞴ᠲ搫࣎⩐⋸䯚⼱㎎ᘰ楻斍㭆ഊ巪捋ᓍ勘戴℞η凱啹䵾ς䡮垬ᙲ摋問䝞䔁吀ⵄ㌅畷ㅸ㼯單囚徃❋绎ۖ櫬▵殖ആ狷ᶖᄯ䗺ᝪ弪燫᳓勬⬰㷕䛶岽疒痽坽智環溬ჰ笀䡔ⲵ㎥䎷枾ᶊᘉ囮塐瀌㻎ờ㬍ಠ温ྕ婷涂ඵ⛾徘浫ٌㅝᴈ䭌Ⳮ㺕峷䭼䎞⚬㙵ἦ瑅㋠⮅۾ᯩ孜㹂嘷⍽Ẉ◤㝆彬砋䜖曙ᐿⰘ浪断婶䳼䄷ළ竇t䊎㧑京\\滣㊩塷উඨែ密活ڏᛝ仟ᮢ沥孍坖˿⯁慞囇౺檫旌㗔ᬉᯠລ㼭敖፺榖竺㛨ᯤ絻㗘固⭚淍㔰ጧ戾㶍ᗧ㠚父沓એ䛚䴅獈渝㕑䳖䢘ฌ圣墀掻ു✩粰緮溤儽孀૾羞ᙞ彲氋♏ᇙ宱咠ߵ岖函䭯܅圓娆籛㭯珓ӯ⭀洷㙽渝ó殜ᆣ㛦夔獫ᾎ㏛䔖㯙泷㴠ᅇ獬瞒᷺砍彑䱒ᤍ∤ἅ䪩濙棽柗䷼䖃ᷓ㟻巯❛旍䟔嫺⭋沓㉹伇ʎ妩癐Ṯ绫唍䗝✖䭽㛙㍵穖楿ᚉ喽皖獶筻秕᱾氏⸿キ燗ⷿ侜ȟ垣悞旡ἤ姚ও笼涨浤⯶⏽Ĉභ省媎漫濍柚㫴孟汽㚵搯⽹宔ዔဈ䄡猼ⶎ傛䈐⭩瀍㊽簗廼喗淄ဝ弣㦋௦埙䈆᱘ᵳ䔍圗᪉儒乽砋头粻積ූ⇩殇滃㲣昗瑚ㄍ涬ໂÜ㑧埭៖䫥厃䈀猲症牜ᄒ㸎༤嬖旛爽寝绵߸㞍㓃捷㷿椋⦷㨏嫞栞庌Ȑ宦沈筝䓖忼珈⎠睢⫑瀧⪐ⲑ更燋ⱈ田㞯囻澞憻ྀ㽊絛ܾ႕伂箶瀟㩈ྯ扟礋廑䤚從ぎ庌办㹛宔⿈獝簯慘ए涫㞶彩祪⌽勜⨝尓֔ᯭ敯⤟㸂币獧總ᛴ爎䝒᳕㵤ᕯ湙唅ツ侶孍㍋㽵⃰ᨛ㖡痦㑵唖㱛夗Ꮙ噂㡾栳种䚔哵㰍⽌煳䄴⏽ᅳᎣ坥嫆擻䋗暓刁⠕ⰱ⹃椴傚墁䩧嫙殘欼㷝᧮➁ᷬ羳攮❝ӎ琁䯤㬙绻䔶殻爟枢ᗴ琳揯奛䄅玺㚮㮉搇⢡Ɛẉ⟁២砓朗ᗹމமວᭆ愛ᆍ娇篰弨㻳彶媦徑⻣孑瑅凣Ᏺ戂�Ⳳ焓噮敺ᶒ௳睺㩅瘷䙿岘旧᭐ǐㆦ⏿猐Ⰰ䚖㥁槇笾庑旯䏐岪纱祏狞ҏ䰚䎙妠ᕷ煾᪓᧻ំ渲筋䞗學欜␕⻇䪦峤䂍䖒Ἀ⎡Ხン湏㔇痝⼡ớ⏇兼ᠢ娚庭崳瞣⊢疊၂儀䜊甫只続灠㝡岀ӫ滮磘羋⏧ཙ㡕盻⮏倨ฎ僡巰砃檏槟㷱Ꮞच应䱐䅆䘙സ沲౻墴⃝嬕縛⽅㶹樷㞾⊘姥㝵岴硽䑗ᗙ渞㧁厧ᝬ熛㈓杂⸄獋䯏ᐋ疏尗༛㬑瑑嶕ၿ垚嬫徬瀥擮橙㌍᷑濅㽣㤇擽�帇堅廻㒛緗ⅰ厶䌂䯷漗ㆻ͢⼰磬㜲徊珛厎Ꮭ和朅噏㢝秅ᰎ姟㷵矝巆໐梎ᯆ优߇滕㴽类巽⇿巴⟻ⱡ筛䐾䗌尐禶嶫ᕏޒ៏忒矛䱎ߛ俖洑ཱྀ狅翋䶎溙␠⟸㲭㮧甖იሗⰆ渶㶕纋婟ే縇杼㿻㺥潖ʜ欞宷満箝梯⓼ᄑ܉ఎᰩ燭弆ᤫ匐寛杀礳稯ᐎ夞縉搞㒃㋇沾⪘玕ǃȎ椾棯⟖唒ḓྂ㸱眧焾劝ӌ栛寤㲓橈䍝䳛曱伶㸁緛疿᪘䨟ⰛἿ垓緧作㧑嚖竀㳽㚵硾庚㈔ᎶἮ㮃縯囿⌔㻘䝑㲓㯳溏礋ៈ澕嫥罻䷾໓珦侩㶉砉医㋾ⱛ᠈溚㧋罏箎כ㧰絕張㌣屿碝稜堟㴝緋囜礕箊将崴窫摿⭝Ӌ硬⽐婋熯➽ⴖⰃ絩㷹犷哾擜眝㟛睦竞瑤獞粞寞澍㵬縫籿嶞⸂埖ᛊ緻殐⏝ܘ㯩涹㳯ᗓ䴓䞞ᘏ㐘湺㸋搗楖旚篰漻査㡩䞿Ⓘ染庶类㰏浟⼐琈΅㺲㜇硇◘下毋潡ᬧ篯搌ຑ㰔㰣㳕穟嗚จ促ℙ㠵淧慼⨑㈆᾽㺵环呟㚜䨍㟐䯉箛䭗ᅽⲕ燸熣爻丏耋羏毾㼺緇憏࢜ᨙݸϋ㲑瑏殢⌘朎堘亙粭煿糽嶝妘ズ祟㛄∕䘜⿎彁窷抃擞昛㜎忺翘秏廟㕗ޕ兢ࠫ惄恿䶦珐矺ෝ罗槾䜜䰔dz㺅窽棛瞝ḕ丑碮羀瘊䅀┐㖈㎿檽暯絋糌ณ砝ἤ峍糯每泩䠕嘛̳綯璹ኛῑ唂㿥綛瞋硟㼟⠒瞩ឞᕏ爛㴟ᴭ䷬➥糍㌷䦞丘疝怒缋㳏浟ӿᶓ簍䆽繲ܫ婾ⓔ⠋怕懴ि悋橝榝俪殔㸵烽篾燛焉殬縢稤熟㤟翃繍㍟䥜缵夶Ꮶტ䱯洟正竒俶矸罷瞯嗾瘚㠆耑儏粏生㕃倗㿩羔睘ᖈ涛䯽⪊䘝Ց䂐ă濣埁從繿㲹箏狯梿尠倡亄丛ာ⑅忍ܮ繄秐ՠษ杯刟Ğ⸜綛䵔⠇䁂㾶¦ຸɩ牑ޏ捨償Հ漜㛛嬐ဳH䁼ĉ㺹絇橐༏楠㚠敀㐥㻷ⴃ䁄₅㖛繅㱘ڏ燏朅嘟ⴡ儣楪㰗ⴏ翭䶬䨦Ʃ糴ݶ熀ኗ䈟㹎戣㈤⿑╄濫㞂દᄷ窸ඏ槨ҹᢡᬢ⓸堒焍矯₇漹ǯ綋礳䑯澀㔠䥜漣耙猓Ⰵ㿩徠⃜溲ɞ碏灡扠⢟ὂ紜කȪ耎䫫厥ў㻍緿竤瞿溧䝡ᰞ”㠛᠕上忹恴䄝Ƽȣ箐涟䝀䠞殍簥䉴吾䡝⿂罩༃㱽簌撈ợ巓ມ㘜໙▗ਏT䂐罼ȍˤ㣴ઈᷗ䲄⌞庼䄤琒Ỿ䞱ݾ繸綪טఈᴰ㹠扡֤䰭剋ࡆる㽱⃥籔矸ჿ张塎ᜢᄧ䞗㠷ၓ恱惒繕ήӗ砟暰ⲟѾᚣ滨⨩戫翹䁼惵ລϢٚ璨ᢀ㺻ᘠ䘝伥砨 硋炔羁Ɖɒۃ畇न㫰ṡ嬭壘Ⱄⰺ灐ࡵ惃ŀ䌱ޭۈᄨ㭀柡③ധ【ଂ䰼电偔恿䴄ᤃ䕄ẵ䊰宀⩢愧堐ȹ㡅ぬὕ䅂巩ՠڌࣨ㔘ɡḰ礬刺㸿羢✴䆂ϥګ畘ᳫ䣀䙁㙢尤ဩ瀿Ꭲ彰䄩˅ؤઘᇋ儀樞⍽ᴥ縩㈳框柂儞䅑˿示燈ኋ䕁⮞㮍ኦ厖㈽桑宩僲䅪䏪珔ᓀ⣟ρ耜怱㗅樵桠睧ţ峱ذᦨ㶰繞ᮢ┑̩砸ృ⠮娸ↄᨁճ永㽀厡ャ氤⌨⨺瑌梇ღత䍯礴⠟斣姿ࠡ䶥ത癳ĉ矠梖ヴ绲̓ں൸ጸ≧ඁ⠼ध䬭㠎⒪ぴ⁾憂紻܆ඣ拸⎰宁Ǣ座笨ᑫ䒶桪從㺵䍺ӊื沨ニ⩁֣憧攩฿䱕塻᥅戒縑йᑿ悳嗟⢜匉瀡笭Ḷ<碀焓䇌䋗ԙ启漈㙐䖀㏣䇸ᄪ㠉㱜硳惚䆝䋲ٚࢍ揋䟏ᒁ涥缨ਲ਼籌⡮㝱㸡䊕塪ᬻ䧰怱岝䁤㰭渱瑊Ҝ⃩懐⌺簟瓟晀⼨簱柽檙縗ಀ籌偹ù缑䍏箞ࣱ✐☦ߡ翣⊛ท簆≍桥ए縨崯ёઘᖕ堐漱ᯢ犤ⸯ帷僬濒僗缜⍇ԍ㓺殤⾯㸱奃ѥ℔⸂≛ঠጽ戈े篩ৈᣤᙦ唩粺弆妋䕰ׁ僤ᄩ㶰䚮ຬ᠁佨屌ന呰㖳戫潲䇜烅滾痞倥Ғ᭢h翡换纘傮尳㜭摣䣏恮␀对Ȅ㵿ⁱ烂咥搐㗆挬ᒈ垞Ȫ⋴祉ટ栄㬰暀⣃१ྕⲥ䩆ᒓ∤刓煥犱哨᧱敀拃౧ࢫ┱㉄Ѡ⤒儥࡙¾惨惴㋈斬ӂऱ⤢樫ਗ਼㚶⣮函⋊䛅ࡐᖨ㠰晱ໂ⣀ڪᱧ橂㒈浈允ೢ䘭ࢷ捴㮐夁竃⻡⚨ⴾ橝摶࠾刚瓒䔍౺ᕿ墈穱凂⊠ከᴱ婛㒎ɍ儮⊻䬠᪺很緐咉疧圩昹屗傍⣴ᇳ෮䝝പᷔ〈䷱烃沧䴾牄ಗ杷凰ʧҝঔ⃐䃤ӂყ纨㤼䙈綝Ც䀷ᇲ狪௲ᑑ㘢ュҬ紲婒摯椗ᆘ揚◦⾒ᶱ睃殓甠䀢䮧ಘ梴ख慒焜࿉朔⢸币ኃ烥咮煦晃'ᢴ㈁⌹䚫སᲀൺ㫪も▪ՠ䪫䲈⇾⎽ܙଚ 㲸糑ᦃಲ⺩欸噀咛䢰㢥灯䇫༪ኌ⼎⇱堣䬦㖨收㩘汮嵋㈚才䕛ୖẬ⫙㷱搭ས纫䀢穙ⲍ㞈㇗䊜䔡᪔⨈忑ㆃ┒⎯⌾ᑼ汷浮ㅁ䊐硖ฮỌ㑘楑㫃嫧䊫䜲癁ᱱ墧ᄻ壸ȋৄ➴㣠ᆑ▂䧤ᤑ✸䱼ᢱᆯ䐗⡅៌㪸厑㌃ಳ冩翅簾㹐筶㈎⋛䔗ම㺀傑ᬂ⇧䲨朽穈ⲟ㤘㲣拃䐯斴䐞ׄڕ䯧ൂ礴㑍ᱤ碡㇋∿䊜ピ䖅州䰔敻祕ḁ幔撙潦㺁揅妹✪櫎䳋ڴမ⯣涡ȇ≃㩇挷熄㰩䖼ାᗜ㬘攑ⶃኢ㾭㼱❹粈Ҷ瓏㢚煠䣞ဤ⳨䀩Ḃ擧亡䂽璡䀴Өত標ᧀ䳡Ჴᎁ㳣ࡆ㎮₳䅉䍖ӧ̆ᅥà䧄⥢㉢㗑簳䉤煕हᵦ䊈㲏ቴ扰䳡ᵢ⅂℆䳣↤禭✴䉁ʝ㤒ᆅㅘ⚑ṂぼĄ熃≁χ窪ဣႩ搬ʄ╨瞱ᣂ㥤堌ăⰦ羫⬴ᅄ濁Ӊ煀䋴⟍惱ᗈ।烁㙕瘪䱫䢰ᰳ≵䔎撈烴┦猩Ⱗ媰噶劐⹄㎓㢽摰㔱熤挤⟠䱑ቂⶨ啤漲ᖢ籪帺䆲ኇ�䥁䶍懈䫢䛨ᒾ⎀牭呠䵰「䥂䊴T䧭䇳ɺ刞ᫌ㎘䆩ᙂ慄ᆫ㍃䥁栾Ⓠ爥ፒ⛤䬀ิ╄浩箁畅⭶㢴楌႐儼䄔䃈仩ᗲㅰཀ剝絇㑮༻硚岞䒰䨅ጸࢩᑒ⟄棩厵悦璲᥏剪擮䦋ቲ❄ຌ壘惩ᶲᑉ癫⨤睥岑⒤ᆐዏ䚤䮹ᩂ⾱㕩⺤繙乨ᨢ湄䭃擳䤧Ꮔ㦇⌉ዲ†窀㢤᪺ṫ撾䁒�擂ᅣ≪Ը䨡ኂ㠄湩羲ဦ烲氳祘牭⒤⥈ϖ➥එᢜᶰ㪀弃╧ぃ䒸挾ᓁ熜Ꮃ䐨䰞ᙲ㒨䕩䆃ヅ噮抲╝ⱆ悱⨶ʩ│䡕䯵᪩⸠㫩Ǵ沰᥀䩣∾⦼ę❌䢼䮢㴰煑㬂睇䉨㲵楗䩬㊑⧭∯碪䬵၊㊪ၲ≲畄㉭洽睥੶ᒿग़厴㮢䱲ᓔ㤈丑朽瓆൪䒼㕐揁焍⦍᎕❨䱹ቒヸ偉坳䃦断䂴扙⒌卂ᛇ∭⟌䬕ᜒ㕴柉㼽㋦ㅮ昋潰䈠灕ⁿ㓢䤲䡁ԗṔ欩卲⥧䵪䊻╗㲇᱄槑吖⑆䧑ᗲ㗤犉㣲〠፪䚰怰⮹ဪ愯⋋䫍ᩨ㪉㰳䎧禮暴䅚橴楕卶➥឵᮴坩痙䩣ᕬ⚼ᵔ≈璭⦔ዻ⓪䵲Ꮊ⯔䤉㍠揅୫Ⲵ嵂⠸瓈榪吝桲š๚ⶄ眉绌範絮唱㕐ʝ壀榧匸䌾䱟䛊⥴瘉棼凅繬笿嵙劜ᒷ楇十⛻ཝᠺ㠴璑⑳Ⳇ椳纲絉穩擶䨉ᐄ㫈䮥ᄈ᥀巉ˌፙ圭༽᥆犌攙榽卣䢜伣Ỳ⿔究ᡒ墇ᵪ䚶ㅞ扥䔗⥰㋷◸䡱ቦ㯴擉勄㖩纻㹃٤瓆峤㉃⚦䢕᳦㥎⬹䎃₅兮剥㱋ተ哖⧰㍲⠑䦠Ѳ❤溡⩲㍄業䪹⥝Ŀ瓑哣⛂䴳ἂ㏕㣡㿳◄୭ަ⍍空ᔍᧉ劇⛣࿃ᴪ⌔嚹糲䚆坯榺䥐暙㓯㡱厦➇ೄಚ⽬炉⏲䬘孪䪻⹔晧㓂ॽ劼撙俿懦ⶄ恹߲ദワ撻啅碼㢱㌀摘ཅᕼ㊴爹晃㊅僯禴捕⚌ೇ⨉䃬ء䨭ᯒ㼬幹ᝳ撄壬冲嵍晱ಪ姳卟⚆伝ᚆ㠔朹猲⯆潮㖺捚㩴㒲榶㏫➃ਲ਼ᐦ㣔侩㭒䰋೫冾乑嚃ೄ䦣㋂✭䫆ἒ㪌籩姓▄浯䒻⭍暋䓺奔㏾䖭仾᠆㣤噹ᗓⶇ曨㊳煓噰瓵ᦙ撚䣛ጺ╔潹凒㺇䛫涳Հ皎ᥝ㉦杹䮛ᦖ␌翄珓އ癯ⵛ沝㒥姯ዞ伾᱂嵉埓⹆ǭ㲶籃⸱ᒤ㨘䇞◈䰫罹ᤄ幫⎹ݟ粍撬娛㋆暥䩹ᖮ⤼䈤ಒᔇ燨眿筚᪘榬牼暙䲳ᗰ㬄婹ᕃ㺺㋫Ꮈ㭉乷泷६狚攭䤛ᴄ歡㳲瞅粔Ꮍ╛乼玓ᦀ玦朥乥ᕎⳔ䳙幒佄㥭ኼ杈嚑ᓼ⧬厅擩侷်㊌慹こ笆㥩㊷湾೫㥚獕攝亷Ṏ㋣⠡伅෩↾䭇争㨏㉝斝䰙㦌瞉㙓碢筮嶿浌ṳ㒪煩㌢☈䵉㿴稖⛒歅⭬⬳ཇښ㴕䪹猼敌䴥ᘌ㗼桙犒⍄௬箵杙Ẁ䞖付琓映థᛶⓜ硱㌓҄⣬⢶⽒ẚ䓶ᨍ狖朓ધᱮ⟼䯹㺓Ḅ⫮瞼㭖⊙Ⳗ禕犜ਖ਼䳩⦂㞰惉哣唅٭侵兜广哢ᙉ狭撃䥿ᤂ╴䡹烃ㅈ㝭⾲潂㹩㧠犫晫例ᅶ㊼嬙旂ᎅ㶽⭑⊍糏姯狯摣䤷ᔲ㖜䞙圲䀄篮ҵ睄溆糧祣猟朏䧣ḡ㺜曉䵒嵆抔枱潞Ť㲠ײ㊠ᙷ䡉涽䡔別狈搅∦恾䝄♾Ⓙ禎㌞⠟䬓᭦㈌滹ᢒெ廭ၱÐẜᔃ礬猢朰⩙႞⦄夥皒♦㧯⾵⫣Ƃ笺祃ᐟ最⦀儡㍼柩䟌成㯫殿奒ⅾ䘩䧼抰晇䭠凞⫝̸幆㾒ሶᘖ宱崣ⅾ⓹պ柟亯ᄾ⫌殙⩒榠၉⁺䭗䅥ܶ湹綌⚿乐厡╬礙⹒㠄班皵嵔⩲唖禎㌯➗佀巖㊢瑙ናІ⽮硴ݴ㹫䊧㘱௱⒀ᡡ⅄滙硲抅濫Ằ罚庂䴗क़㌞⛄⬐噊㘜徥墫々ⱎ⡱⽕↟ʽ纗务梴ⷠ墚㜜堙碳⒅塎䚾畔内礒䖜㪀⥧ᵦ㜢籙䣲അ⭨ᨪ䕺硻䴁䖐Ŧᛧ䥤䪄奥ᬫ婛景䪶佊ဨ拧硴犽恖䵸契㶂䢙圲ই᧯汻䭚䑂ⲹ䔥̆ᒔ⡸墻乴濤䝲ႄ乌䁴㕘煡䁒㻬撘⼪䜆㌼䟥榫⮦晉▿ᣞ纓泥㦭犼ᒌⱅḺ⍜枥ړㅛ昴刬〸ȧ䔁丰䫶⛢༩ㄲ婥ⳳ吷僪ྶ䓌ξ䡬╿㐑ᔎd勞䑜廙咫刴ⷪ剾棇䅰ኼ◜玔ᕄ⢀垎⽂䍙㾳稶耆剶䕋䥴䋚◞刹ᚤ⤤历⽢睰̫Ⲷ剫牵敁ᆖⳂؔ੨ᑻ䴀僁╸嗩䅫椷ō➳㍙႐䌈䖚犸ᛪ⼪ᬳ䨲查ᚫ䚴繊扰歓⥶糘ր䪐枺⣐崩ヲ咮凳Դ婏⺼ٜ纅匆愬㍠ᔦ䤔帮⠼丹êഴ㥈宼᭗♫⋝㤱䯝ᐰ仔堉㉌䲅䥫䤤捏摴啄楥紏晚ொᗺ⯋ᒔ㬲烅ㄴੈ婵筞入勰ᤤ䫩ា丐唹㴲慅ᘔ焵䅪灱㣞䥦勦◞犒╶Ɽ哹䷙⻫⒴筎㞰杈倳粧જ▦̼彁⹜擩k᜵Ոྲᓑ五猍֑㋡敮䍉㘢桹娓㖴燮澲熷妌㊦থ䪍ᜎ⩜唱㾜幪䯪吅禆㩹擋楯ዉ╯䨥ᚾ䡌哙⣒搅ኵ䕌羶湵泥■⮞撾⾍ᇹⱂ抅偋䦵ᷯ⮷筙楠㌝斫獖ᚑ䴽ေ◒紅㛪ᾴᗪᙸ䋎禐㋩槫厧ᑞ⣗ᗈᴲ〵➲摶繈↿磉Ⅲ猖文䨳ᒩ乨ᕥ❂椵ⰰ⠅屌⢰憃䊡㦏䫟┚⣨廁⇢圵ଳ籶灊ᝀ֊⓶ᗯ䬒◩⠲彶⡪粅䲫शᓍ恷祕䕬糃斐䨻ᕂ⾯抩ℜ洙㵋喵䃋亹糜禑䫽ᘕ䫬喝䱟㯒祅焫ぴ୩㮵䳝㥼勻娊爪竮Ɒ吲㔢来嬫沘砪䅰ཁ庖勷ᘑ剂枦䵒呩Ⰲ勩㣋撵獉嬲勂֒狠奩⪨⠵䧇ቒ⭊䕅硲殅歋⊹子ᆏ㳂㧈㍌啑⧛᧖㍪慵櫠孄᧯ᙽ䝙ձ䬂昉䯈斵Ⱐ吵ㆂ緩宪ેੋ瑽ࣙ啡˴▁ᑤቀ⼺囡ᳪ澹瓊䖶抑䀡᫂ᕾˉ嗃㖑曯䨂勱⇪偹侅曊女㳃㩤䬈䗻⯄坚⪓ᳮ⌊䩵稳恶ᣋ⥸潇٥櫧㨖猭柩⦚徰䯊恵⮫И桊ྷ祛⺋欅嘟⪹⑿兂埦㷤䱹ף滩㉋確㣏熙括ᘊ䯐嚻今婉⅄繹绫व䓭㱾㫉㊗ᜤ啃Ꮩ㥉喉㾊橕睒䓴䑋捾䔤ṥ罶㨎⪉ܻ䍱㞔孙ᕫǤˎ塸峇ա檶㕗厐ᘓⲝጩげ扙暓䚶彌絵曁䕵⬛啦䩥吳乄彍㺼珅䏳祴㯭⭻㋈䦑喑䫩囫⾊吮䵺狵ඊ乶ቪں煍沿०歅嘢⺶叭㲺䗕䶋䥷ᛊ㭺㛐憁ભ榶毽᚛Ⲓ塙◺淕穋䣴䁏歰ೈ涄䫿㘋ɑ⦲岰⥬牥㙫檆益偷㫄▓䨑檀呄䣳ᨹ剌䚅Ԋ佇珎嵻ᵖ㖊㪾䘉殓ᔣ⣗᾽◪耉̊㦆⎮ᝲ㍏㕹㪡ؑ㈭Ȗ⻬兽僥⪐⬰癀瞵ⵄ焳㪽奁અ嗇⥸屝㦊儕缋欲⭪⭹䳑䵴屍䕅ଣ喁ⵆ嫽⫂坩甓⾶灉潿糌ඊ┏㔧䬲ᓻ⣢坥㶚婵下瘶俎㭽䫓൭洜啱卶䂗䦞巍✊䖵ދ竵忍恺娪❕䖈å垌⪸岽Ⲛ堕ਊ狶�帼嫀ͮ拀欀昩䶊届㯚珥॓泶瑩ᒴໃ㶘笒畾⪰㗑⯗ᡣ㨊冕稶䭏㽲⻅嵾ۖ疩ફ啷⸄兹♪䔭ᛋㆅ價櫜綇㗡櫴᠀武囱⻊匭斊㮵⏮ὲ䇘♪拓疸᫄敫Ⰱ奱✚璭㰊娅⏏楰⫎湱⪳畾⭪垐桯Ꭳ⬚洭⸊㩔᫈䪼ᇉ特洇╧ఎᕶ嘟ᔑ⛦䘭㽋⪴Ⅾ⥻囚綈⫐㦤ᬥ柸澉ᎽⰢ句䜊囶浨睶ǟ幤ڡ剟⛛⠩徙ⱦ对㤊ჷ毈杸䧄㶐⋐䵈氕噲⥩壣⨄癕ഺ但㛎棹ે㖊⛞禵⯢㗰欒岕㬒廙㏊煕繬ᓹᇀ㙭洞ᖋ檱圀棉岃ⴺ畭喓व檍杸䣀煻櫁䵴ᮻ哇⩑哃ⴺ䣭猻䖄ṍ坼棈厜⛶෴⯷㩁䨁傃ⷦ䓭༺幵ҋ橽⻐ㅵ䚿৲䫷楣⦡䊮㱲睅冻⏷劉ݹǕ入朞☝મ㑜滼偓✌尹̋㍗惭⳻⋝㎅竭䶽ᭆ㞝䪫᳃䚆䡍匼ࡵ䱋⣷㋗䕸䬈櫺㟞⤉决⼆冥焋儵冉⣳勒挜䫅ᩊ垛䰥巓㫪摪旊癉碷ወⓥᖨ嬤吢楥儳㗤䚵梫䳔㣈㎱瓙亇ⶒ珰បⳉ嬁⠚䙍律祗ሪⅾ懙㵥㬔ᗒᩙ柔汑呫㭓⑹⯫㵕㳎ᅷ亅Ⲷ䔺宔㓪漀坋↶淭ࢻ嫖䲋澲嗓楷擭楃䪜➪浙嗽┌呩楺乔㧏棿秔祶曥ⶀ玵㔅ⴕ徥䀚徕喨㲱䵏竰Ị獺✒䶬娥㓍⪾偍㡖崕ᇶ᪈䫵煕֒瓶䶚ᯐ㛚淚弋㳳⢵凲㵗㶋ᖿ䐵ᮝ᪰禁㐉呛㇆凾Ⳗ歕㓼䓵榍㣶痁⭮㜐樁㉋㞒䒚哒㗖潎憊୕恶པ᎘㛣ⶱ娽អⵡ噕➬澕䓻㛖㳊䞶䷗⮋㌝ⶭ婃㖔洯Ά√崍ዻ壗䶊ٵⷖ㺊笔涊䪱㟪楽含㮊浥Ꮛ篕㵍坹峜㦓猄䇗媇ᖼ⫬㤖䇍縻ᇖ檍⇀厗眙痝媳㝃仾偛➶劙ફ糖垎枾捌殈㳩淮䩕㓺母ᖞⶄ䈽籋ₔ告瑷ヘ䭢笃敿㍰琢亿ᓵ≂獙淳ϖỽ䏔䝹㌂ᶭ呮⪩ᦽ㑖奭牛䏖垍㢸揉獣ໄ痯⬿㒼橣崭⿆砍瑚㵷⹏䦻䵐❶狕攼᩺㘞櫕唲Ⲧ䭥ƫື᭬Ỳ燄䵩盶ᵠ媴瞧亐嶙㭮溙昫㐅㒋相㳃㩮囇㟲湽姇㬮盵嫋៕ཌ壿⧂湤䛠ᵫ狜哨棓坃㞦牍孚Ỗ㴉⣵仉統໑⧌ଶ㘾乴帇㙶對᭚ῖ垌䗿⃘涌⊣░᯿斒歐噧㠢籽⁻榕忬旿ố㖔櫡痋⫒瘒櫣倷⩜兽᳂ẕ⬏ࡧᏞቾ⛛ർ㮁喵漣具㧖緍䛛奖㤎痺毊ᩳ唄喎㌦砘䠡␇⎆屽䔻墔䜉憳ᯓ⅔㽘1ij⫐揎⣌䵐ዽོ⮗Ԏ絵ࡗ畴瀥崻㨬ƍ榩䛗ㆎ狽㦣䥲箫㝭ᄣ₌ေ獽格ಗ㻖窽矺厖❷巵㯆睪橫嶯㪞瞪ₛ圠稠唠痩缎ϴ箬ྖ漎㔴㭞瑣椧崯♆ɝ⢚ផȉϾߝཧ୷嵚歆瑡涕昗䀎枱撚外桠瑎㪰⯜㤣ᖑ⏙׆癓株䦮䅍泚ᾗ崵叹⟚塝竆硢䌉畳歁Ⅿ⚗ൂ㚚㏚ᨍ狾毄ᖄ畁㵥䈬䩫氇叨⦝㢬粅傳祓㏴琭䅂廘㕔⨱呿⩽喻⧖䋒છ⬕⤩ሤ埘͗Ἑ㶊笵͢❇坏ℐ㾰ڋṆ噣㏻㟍䶔⻝ⷑ㮕痣涇嚏㧾䫙䁒伖⽂୳晻潡䬥ᛡ簄壣濖娏㽾䷝ᄚ䬨⨉⼯ዺ潺㞁媈㲺㗓楯帜㕮姉㟚礔㬎䟼俉囇ご婦Ⳮ璇沖♒䕘ᖳ䬕上埱ᕇཧ竲痹尓瘦䪋涝㜛㌕厕⟾珌ሻỌḫ孿㝹椗怇⯾䕝挛匕丈刄࿂侍ֈ皔峹矯歅ᴛ㾤盝瞛␋䱆㟙㽿綱䁦硷溿婓˛搚⋱嬌懾ៜ㽼廵刷笃盿楟巿㖂穩ؒ縗ֳ畞彶㺬楙筧甅沿⛯Ⱎ箝㦬䀮怉䁵愺塋ဥ嶬⚽泟尵⦤姦㠦〮❁⁐㧚᭚Ƕ恫瑷根◂㵢ᘣ㣠㠮ԡ㕠䂗啭挂⡰۶眰ὁ扤怹樧刚栽恖₂ℱȅ⁏穯棲ኀ㍔�ʾ⟻烴徏⿲ΐ㽸纵м࠘ฉ獦䥀殡桕䰧倭砽ሆ繀䃰汾ϸܧ盛汽凟⧞廝⻱樯࠼俵塀愇ƹ紪ڈຐᬸ䩨㕝槔☬ے塓㞍䬸巂ޔඏ湦䭀燡䶣¸帬噆塚簾漯ყ碳斢ව儷嘧⬞刣㋐ᆡ䈼珵⬶ქ橤䦿咆᭙匚䋸໐倝囲捗䂈硙õᄜ䶔䌫ತ児ć廀⺷Π㊧娥㈾禼揙侞ứ窵ټଳ瞺⓰楪સ⚦様硩㘫ゟ⻇⇆ໍ⦼༹㜀暦庣㿑累㨿ᦍ璲ㄌ碖桅݀Έ〈⍂⠆㽣ͳ搮䔍䎳栱ヺ㞕䍧ࣶೌᶗՂḹ㎺控粤∸懸䂉ㅠ᭓䐑١嫼ᲯଜⰍ↙ཋ㒁㾫,碃ワ櫼☏ݞ഼☘㘸ᙆ将ӂቨቇ导䓅㪨ᇨ惤稻睰漹幐焸羑桧㼕晒攺Ҍ依ᢧᅺ䄚敔櫪ᶨ氁滽屪碭曯䵌⒟Ი⣦G戂╕枮ᥨ檾ᑠᩦሔᒈ㑖䣡ᑽሊ⏩㣃䟒ᢄ㧨紸成ᚃ綅㊯牐⒈ࢄ況⎼䞓䜪ὦᔏ䥾䦑ӂ㊬㘉糵埏獮廑̠ݹ࿑↭㏃㳃ⵧ播∠❫嚾ᲁ冱⍃⋥॔㮼⓱瓃⸠㢯怌䉑♖椉决分䜽ຐńや圸參璃⠣掭穔撏枚処爎␝໗ब㢟㠱箱ᑰ罧祒攽ಂ_壁終ػ㠟榇噶๑己⤃熭ĸ㬰牔औ>䦉嶰㟺ṝ┨烜㏄Ṡ䖯ᴼ媾槭࣡纪挸Ś寯࿌㡸槑穑癧㒬ᠢ剝ⲗ榍㇖⍽䛉熒ᠼㄠ睑䕃⑱㵳砳䩞牌Œ倩揿嬬ḿ劸浱媃⻰奤朽㈬犦坹⤉搃䛗ညữ歫偱䡃検؊愹摓㧈ᤚㆳ捫戇䚾ῴ㯿㕡烤䋃ᨕጹ⩓傌ヾ⇕儮⊬ม䫪 牑䎱Ϡओ㻄Ⴆᐮ,椘燠⠑Ċ䩈ȩ坱秦䙤㞓㯺ᢞࣷ燌爉屠仡ἢ㤤牱䥀汆息悼䅞沏㤗⠣⍚䃸㕞ᷪᛨ沩惀ⶠ嚈⹒䊄ㄒ爗Ђ۷ᶼ㗘憩琽㿦屮㜿ᅐ伴⎀焢䄷呛榍䂴⌞భ珧坕ފ幙抝摬䧑淅䞴侩ῴ㶴孢ἣ⡆瘰璸ّ发ⓣ㘤兺⚢僩⌬㐤潩策䱧慥⤥❥ᒾᱽ䧧ٸ䵎ᰟ勘斱炃寃癭渺ㅮ㩇攞冽䐘厑ਪ㋟⡡嬝矦桮爸煜㊜ᤉ晉ᶞ⠂䱽⁜㋸狑粑糦ථ糍⿱╙ᤛ䨖፦✱ฆ᭪㓏䗈剃狧֮䮍侷晾拑䁫嗵⚸ᮒ䏊や縎枳ֲ឴㝩啔檑畣⨚۽➈疥ῃ弲ら䭳崛堗媼ᶲ፴ⓡ叻宩ᥓ峞⤒烃凇⦭媾Ⱳ○凒ⷓ狅⯩ᷨ熱䔵撣ݯ㚻䥖ළ䞁⧊䤵歮何揹垎㜉棍Պ皯⢽嗴姎வᤓ厕ߪ瞭㼔缱嚕籦ͬುᔸ媋垃稰㍝䞤啒樑ᮽഇ⽽ࢇ᭢椊ᗱ唓楁吀婍⫃ᰊ㺬疉䞳㴚罯ⲍ磽䚖唃挀䴮ᩩ倕᱓寅⧱弍᪇溭↽⥷㧛㕠爯⍐㩹侚ᢋ圂㜑獽滚㳬⸹৽碉䥱ᓣ掄朙䰲ʚ㥬眹燳㲲嵮熸寔⤙㦒枺䴄湨ᫌ特䭩䤭悮⧛ⴀ⺌匱➒䵥ᮂ㨘癉兘䣓ۮ秷䡆洓⌷Ḁ檙侰漆ㅌ漹䅳嗧絴滭糍泵ᶝ匩䏘侕ɩ吼灩剱⿆䴔纾䑗窏燙损婮䷱᭺呪㖹䙓㔆Ửⶺ嵐卌㨉向ዳ佃ẘ啌秉畍䲆◮ᦻ歷㧈䴎咪現ᯩ俔䣎㝔槿ɜ䌑㤹㛉ȵ崕ゃ㎺箤රῪ㖼毹嗓◆廵㮺口溇唎䬑玍暂哽䤺㬌檉撓冚儯⸹ཟẇ峳↛叉ᎆ丧㱵⨄匓᪦ᐷ㺻௳ປ洑⛉厖朒✏ᱞ垲㨩栳㡆⚭㭐纇ԑᎵ柼㙵渥圜梩琓淦海终ᅓʟ糩শദ䚀ĺᮚ妈慹汝䮇坬滭䃖ך椕槞枑㔾⸖㜢牞䈫ᴆᵬ幟㋖㺈姤ഡ⠏㛴佁㎢禱䅓ఇ潭Ჸ㥕仁䋹嫟楹⬋仛ᮁ㧌獙稳㰷抖Ή彷⺇⓮ஈ朊仱椌㯬灐焃〇世হ碱ᆟ᳴䘎揯⩶仟᭚㲜桂樓嘆絷垻⍲媈⌜榯㕻䅧⒀娖岂禔瘫昇ᄭ⸹棘䆐⭥䗂௫⨣ᚰ孡㴴㼎幀傆▯浙⟗ᠧ䖹ନ䜌⸽⮑㠂炑焫⏫➒㸬立䌋姎௴ᜣ༯ᨩ㠒㹅塍䶇佴ᶽ歗源䗼䥚昢ⲁᰁ㚭㍅倍岶㕇牽凲⦒⋵▤䮦⚲ 屛፲愹䥫嬋♎ᚊ擿暊挅憪㫛⒔徖㻌祆渃婛ᚭ䮽䃕榐ⴁሁ㎀现⻒樑᪢焚緓媆㋯昈㍝憆ᔖ㧂䰏✓使ᵹ㼥⧹囙့炼网↋Ԉׇ玘➊⻕᷁㯂縉怓䮷❎ٿ᳜㦃糠棺ᴠ曫䰣ộ㙔紙巫智泬ᶴڕ拲紨繂ᄴ犀嬖帪桗ū帶Ƅ䳉䋑䷪㴔ᖯ㸰噧ྻ⾱㱘枱䋳⼷ᣍ≬㵞妒礝◍䯎ጩ⹈岚㴕㍉敳㟋哏劺ዐ劄䫿▴䕅♱武坪灞䇫χ前廈⣑ᦑ⳹刅㐐刴ⶢ椌㭽≥䫫繶ᩏ䫉⽓㆒䄒▫㧂埗䲽ằ㭧㙅抽ἳ煌տ䃙妋媋䓴䮓ᛂ⟄対㤬洅屓熲娭岽揶媖猂嗛㤶圳䳿Ღ㭽⧰Հఱ⇭嵸竐斒瓳ᗺ㯋Κ庙㘊恙帓䲇縣塸ὕ秂ᬖ喹⯽⬥Ⳛḵ㚪┹懋᪻濇傊㝘ຓ䫶☉嫬䯓ⷢ寵䀊液歋❶慈䭼䶃⬛▫㥉坤ⰶ尕㠕⛕斋㫶䱏᭹捖ᆋ䳨㘔玡囯෦嬚寊懕繋̆㷍䖿䯾疔ᬗᗤ㎾䳁⾾㚊栅淋忆瑍繬㫗皑欓櫢⯎柩ⴊ巡㡺燕婉牶拏ㅹ剑嶙ᴇ曐猩暝⿴ᯕヲ砶粓緦绯潹ݞᆌ笄䗇欱望汩㻔溥奋埶ᓍ佽凰禄狫秭⭱Ꭰ淜婢〲⺒平᭷磭糓煂۠ױ毨㟠⹌嬙夺竕焭指㇍弹㫺咓泯痛䮚猀昨巹㙦擵䘻䌶杏瑹滓ↁܝ嗍㧻➖⸍ᬭㆼ接浓炍繺㇜ᆋ䛸ᛢ獼杴ⶡ復ᝦ琕澽㪷䒍ɼ㊷㪏❲⍼枸ⲃṳ㖚穙嬓ᥖ䛅⡸⍜厙疇旈欿⠋⽩川㗅〵䜍恺䍽⧚皕✗ෂ᭗囖⽞仳㷜犥玳粻粏䝿ổ涍⛹禭ᭆ㠁➙塑㗺稊攻ᛶ㚎烹㛗㎈㴑䷧ᰉ嚌㞱妓㹼檭屭癚◎⑿曓玛⋢嗻毉㙊俲山㾺狅䂫⫶惮ᗙஞ䜗疧ᰚ埍垵徍㩚摥絻嬋⍌྾ᦂ⛤滥毜㠜添䶹㚺矍含䗬婮㧌ᮗቱ上字㘂沭墛ⵖ粍砚䀭敋炡䑽ᶟ䝸㝈ٿ䅺⭍始䇶獖伻㽖㛺淔氥㜛ൃ孫㙮涁斦⍚孹ɼ᧴册硻滐玾盫⹛尓嗯焗ᰟ⧐䌞㚤䪬ࣸ繘箁嫯淖⪠ᘭઝ媂✠峕㽆䐤᷈⛼㇔ቪ།䛢౨眜㒤䙍朤绬璖絭绿睐ޚᔑᖸ寚ၑ漻匧㢂ܽ晛╔癮䖪冃➙䱮綛ᬨ眮浓ள㗐㻭ⓑ嵃瑭ㇻ潥⮱絈ᶆᐓ㐸澕寘伛᾽搒䁒紌掱Ỉ⥿Ш⍥櫧㞛䵊᷏⎒禽綬֖ឍ奺喣ភ恳ぅ勚皓》冝ℍ佽佦憖ޏί梢㞋⼊婋㮒砏憎㜪ጜㆩ磜䞖گᵀ岳兜漍䖧灶秽泛峔䜎秽䢳㙀漍ᴥ条™ⓤᇣ࢞矣澩抂㲤桽啻㖖暱䏿ྏ䕌㸔箱癑剬Ⲵ䶾惰㗠徣珸䟘⾌漒㶱㭸ƫ溷壯㒑岛ᴗ⸁珸ೂ䱋拭㷶箬矂湭婵ɾ珝綛呐哠!∙䩞琂㢼ⷸ劓文༥洼㼗剱篫ऻĜ悔ೞ祜㼮ằ㈆怯䤶佑ᑵ策皦怿嵘䋨ᇐ⧻絃⠎殌ⷡ䦣㻦⁴䒗沄Ͽ㠁匝稛㡹」竏䐵㱁帝⧿皵溠ן㣰烼䠗☣羕̴В㢩㨀ǵ炀ᾨର㰧/䐦㟼商Ď$Ϯ㡨ὠ㮠緎嵿Ҁ琠⼭៉䩅㸱ᤇ汀߶⁐Ἇ妨ㅡ淕धⳅ孩幰㏂意ᦱ䪊ࠗ皦䪀㻠瀱ᶣ澳扐⭪癲८疞絑Ѩᤵۤᴰ䁕བண䠧哀琽㭧悮ᄖ∞戉ߪ䆄ᴩ⇩ૐ杣壌昔殢ކ⨭䃡㕄拓ڔỿ⏵᪺䈨លₗ䔍翆㨧忉懺᱀瓌⣢䧘㽀䶧垣啤伮㷺༫碑㯒㼘ἀ䜳瘰煁慣䯌චἰੀⰈཱྀ䀯楤簼䥧〲入⬤㪩侨᎖璮创朢怇䤙Ḽ⏧Ⴉ࿋䣄㴩ై佃涢ʯ楪⩝撐㺭䁔Ȝ䠕༺Ḵ㾠檐ቧॄ政①咜椆ࢬℙ悥ࡺ᳴㰈穖厒䐠ᮼ瓛䙜䌱䦣⡔␑恑߱⎜灠ⓑ敬ᜀོ㽓噚⅗ᤏ䑝ု⒂峰半炐䨠ᾳ১癈斁乚リ-ื⅓ㄺ䶎᱇峄�渠ᆧ䓭栿瞃Щభ㰻搷u࠾Ề栘絪த㽆恮ᕱᑔ嬬氩ሃ䢅�䥁䋙̍榦ᜨ䂼椶怪Ԉ敘ᐍҩ爅͢㶤矤ḳ忸瑮米फ़加$䐓ʳ犘ⱯႾ煙䀣ԙ楄ᠥ呴保ၲ㻅 g獇ᐊ❘硁ᴂ㦠ީ熳弰岿㵄犟㼭廬痻㰹䎟≻抷嗐㳂Ӈ⪘挵榔ᑬ唉䓼吕➹眯䃘Ū涁痿ඪ玮喛䧿匍㩋ᇅ㞛⁷決㻔Ƕᾂ⭮༰ᵙ晟㷪≙㷛嵵笨₊㬍ଉ毳濽櫕؎ˡ䪣⑨ᐥ⩗⮺ĀЏĜ抜ᙣ刬ὀ曃暵礭┸ᙟⴚᡦ⧣Ṧ㮖ဴई˴⹑獪ღ劢⌧猱㏨䱽偫ᾚ≌繄䂹φ楉㘥䅙㇏䐹歓剦匢ᥲ千፦䭹机翂ਇ灬Ფ皔⾇姸䒞柩烱ጯΠೀ 䉸╀ఢ㚜㟏唋㏕悥熛ṙތ瓣ও䊃⇮࣪ˢԢഔ᧱䪗㢖慷 ▬秞捓咇厃妼㌠ဴ᧳ٻ柶值ጨܳͨ娓糸ᠠ岑䀠云Ⅎ卖䈮汘冐ᅮ㼫䅨ɓ䘇㯙➼勃㺔㢭稔吡ᡏ伉㭞㱳�穸䚰揮㔰⃞�紜㵗玷Ჟ亇ᵾ䉓䈥獓璇⯯ⶾმ煮⌚䨠RᔷᾸ㑿曤ឥ搣䈰䆝 ݰ歏డ㕝䔔⿈己㢂焠ফ䄷稠㥁┠熕挕娍ᝊ〠ę擙糠匈◨䮶᠂⽄峓䙖比㊷⎩䩿⥤⦟擰日⩦⽗滑㢲猠Ꭻ暷䉯䓃ヨ匀昜ఞ妒⺰怈捋ଅ澪➷䳐ʂ盧疱䬷旽厵墡⺮ဥ㻫Džᢻ㙚䣏▽᪶䖕㊲ᘕᐺÌ�ॅ㨪砖ᕋ凤哏≐ᅊ兖守㚮⮤篃仳θ➂狸୰чめ徨⣭⬂IJɶ䙀Ⴣ渋ᣐᤡNj柛㌘䕽܂⺪⬛甥⯑灵ॺ峖Ҋ窣ႋ䜌ᄖ憢㫞㯩ᬄ㧡⮲垅⼚岎ƨ㵕炦⓷婱榖㧦䬖ະ⊙劻ၪʐ翩䐼᧼ˋ⎱ᶑ咼痫䏠瑅悺工র瑮ߏ⩮အ㶑䚥䡞㷨⮔嵳冝㳕㯆᳖ᓌ囁ᯢ㫝㲘崓瘅䆕朰潟澸䋤Dz亁䠫Ᾰ烿ᵅ㕨䜌⭓⡳Ⱕ尵㬦琥懙⒀ҙᛠ䈠梑ᄈ琮㬧‷禇ᆖ䙦炭恾㟄⣽分劥䐲汎㊋॔䑹归仑ႋ̻椌Ⲏᒢ䇜䖗䜞⠡ᯨ࠴䆩彆䳰珄䭀䪎᳑〤玖朜懡䥥㜺⃘梫暅Ꭺ㤘᷷槕 㗝㑠供珼㞻皅㋜㽕䳠Ϩ⫁䋩燨ڧ義圈簡寬笮滈䏛ઐ◴咣撳グ䶠概ᥤ㜍ᠩ寛篹恅㌃㸽䀻Ზࡴ丁狼戰箟⪶᷹䍩掔尲႞媚睑љ叇畡愰ᓕᶞ䢯㾖尷䖳⡕ᰂǺ亹竐⠷⳯ㆾ癡ਣᴎ㧫㏍�䁬㮠ීᑰૐ兎Ტ䔠!Ⴀ¯ᵠᭀ⇄ୱ⁂ᵠ㿸帉橀匘䇙猔ᰟむኛ糸珮ᗼ璢垝♧㒍㮥栕濌䂒܌˽淛倷༏巾篟瞚现㷤篢睶䲇嶯㼸ᾨᯐ⟗椗㒩㝶ഌ帑௫枵濾⍏㲌灸滛喗丏䷼ጹ澙徏㷯㰆瞧潑猿㡐ඝ缣䐯堯埿啄ȏ沚剧睤⻠峦㱾眝曛栗㘏忽ᯞ澗䤨Ḁޣ眦䂯峅⊠䌣爧䈯紎͑䊷ᖮ㷳箴࿄⿷彮㠢筙猧煰氾寽翛愜Ā䐐߂࿀Ṩ㳰縆ྀ䡧瑁爎㮣᪥䄐忴⏣d࿅澰㱏㫖ຣ斧欗瘿潀翝愞漁ᤞ篞༣漤㱨粀ࢣ撶ಯᥩ〽爳燱沴砳ഁ➥ϯ㥂笝洰㖗ᔾ汞礠焛缕帗ޭ矺Ạ㸗䀁籗ధ禯簮䅝技別䐱䀿⪞⛪䇢㵌㉢㵡泌㑯ࢾ⚾ኝ䔘᜴⠮刴侱Ḹ߄稊䘳楇岧丝ϼ犜攒㔌ᦦ⟜俉Ὁ၏瀋ᨸ玣慯ᓉ↬嬀䙒ᐿ棩㣺佗砊䀃ⓠ⡗咱濃㲩睘㕒㻠⨒ႀ篁倖Ҧ㱎冦䝔㙑挊榾ᕳ抛⹛ᨁ㑴棅俎慛䓸劼㞸烳嵯ᆿ瑐䄼᪖⪋㐈浿✦䅇幠Ϙ爉恓尠㎿仧暜甐㪫䨵枻侗ྱ畜笿ຓ穧ț枾㫿痲紞稖珮柜丫⤞㽯䄙焭ጝ矯朸♐䍂権槔᠍ₐ弎㼌翦䞰䘷剏峸ࣞ憟紖眜戠偘⽜ܰ焂硯ビ杩ُ秅磟ঝᱬ甛ᕈ傛烶仇ׅ罫綝緯筯䚦㌜檭ឲࠔ怏情DŸର㧯仠ⲑ⟝⛉䳐埱。徦㴢祪䕋桷朠ᅾ↱䖛ᝌ眚⯪培⼺帥㶊缷䡋枍妜剿䓁ᖛפ憬民礓ࢶ怂╱圚䠎ᾳාߘ敼ᶞ⌐嘟ള埛⾄⭸⑺籕箊◷䎹ඎ嫟ᶛ䇋⅑毿埻⼹ۣ㷚継惕咏獫掝ܘบ毤㠀㨦b⍕價竉絗椔⳿嶡抛㌟㜘ᰞ㠃ù幭ᵚ筍煻敬Ꮟ⮎ⲝṧ⸊_毮⡆庍捖礠㇚Ꮧ涏瓾盜ඞܟ渕䯪ឧ俩录㽊礭篻硗瓄䢊祽⫢㬓ḞⰌ㟥〉強㹺╽瘘在❿占ᮜ德座㯬ぶ濢䇻㼛彭篛粗爌㼊α➘会ᣜ償ⳇ〗忊༺繍砖ਗ搘獇㻟Ξ㼕帄\"夕䪯棵㷪耄性浐ဿ曔ₜ掚㜀媬࠘⢽〇ڸ㇡碣绋瑰纄Ɀసㄞ༞瘁珺д幐罂◽ᑵື✐ᠱ墟ស捦␓ᕗ劊ᾣ厭ࣛᨚ秲揇䤏༙糯坞灰䉄刼㱟῝歖ʠϧ洎ॏ㟿䓀Ԛਔᫀ擘俇㨸ۘ 紆汇棝愨՞屖徝㈕派⟬俞᎓ൔ缑祳ȸՒᬨ怗⧈ഞ䙤㐉㯬ྴ哆㿕ι穘䶇歰㦿≟斐纄漬琂䠅俊ἴ䃼绱笓煓猝∀ⱡԕ礝⛍ذ៤ẫῇ氶劥稫煮䁏䱿ൈ熞ഡሟ歚៲⾵ᶊ㺐綵䕫繧櫪≿ᠰঝ悤䩯ᰦ縓⯫အ㺈⩰㷳છ砤祿拟㆞ଘ嘕䩠侦㫭㻦㽡粫犵ᑏ瞿☹嶝紞矀గ匡⍶徥㺦緗吥祧戇桿㇟ࠍќฑ榫约嘼俚槂峲ᕓ狗悻㮿仟磳圛䖔憷㟡ᭀ⟛伉㮀熳ݴ⒯≽ẞ䰶桇䠫ᔑ佑�笁竹甏䊇ͅ澜哥Ḝ㰟噯瀕⡠楎线Ȣ玗紫巿㮀粥ڒ簓揻澧杄倁糂㸛瓳㴳姿㌘សㅚ帒ࠓ姡咛怖愾罅䝵̯耛䩴咞ᾝ㘫ᐝ簟矯晴㾈罞悃緄箺༨炞ྟ㲦▭ࠇЋ濘枹䆉羳簣涃夘撞幌㯣吚セ樰ῆ㾍侎罱ϧ礯炿珿⺟ㄜ稞ᦣ.稜楑㾯俬↫礷畉毊ミ熟ᐱ☞帒栎ᾢ㽹ř纐祷烕罟㦭眜㇃ሥ堉⠛㲁㼠翮繫糧簯玝桟劎أ昜尝㠃揩“㑳爅�窳猏揿珟瞟吃戟犁ဝ⿱忩ᡆ翑織◧熏綿嗟⊟䬝䐘㴜們 焸缩纳῁箜䈲ર廟㧿樰沜圈欝〇怔㿾缹纻糯端缿亟ᄟᩞ嘟ᤐ瀚忣忨攕绋繧绷紻ҟ掟䔞㰮⠞堚倞⹚㿟㾆缣羇粖౿碿垯ᔩ㐞␚䠜゛㿪䀑羰ڌ㳷粍籟棠㴟仑ఝϟ簕倍俺翜罖縫綏罟瑟繖䐟粣မ‟帔祙䠂羠纝緅粏絛簵經粵紿絗縔絿紋緯緫粙䥑䗟絾⤰λ縉絻縙᷻綅籷紏精絭䈓絀̞憻憗紝異Г愰ʰ˨ᴽ瑈˰Ʌ紻Ï綠ᶠϭ綐ə簿絣紨̙炈̗瓘͌⥻䲻籷沖ᗘO簶怸ό䂸ʐ˛縏締ϸͻᲇ丘ȾᄤИΘε᷇粳崴П糝縈̠ːˡ綸̈́ˁ糸Λ綡㷴ɨ̆ᤄ̱簼ᅶ倳綣ᴉ㣌˧絹慤ι籛純͠ʛ緙簶儌Єɮ璶刌Ϧ傽粮嵏ㄭ綈έ緔ɓ緐ʣ緛糼籲兜Ϋ紧䤢˫籟糐兽粋畘rϟ儼ʅ綔Ʉͼ̬ϼɲ冲粶ࣲ籚ࡪ̲ͣ痪ʗ綢˳絢ʷ綼ʒΣ糂ʿ緗瓊ȯ紗畃½緘塨ᵈ˝峐えᶤȹ結ˢϒɂ˄АɀͻᶨᵥŬʏ瀦ɟ緆ʹК收̦ɐˑ縊Ϣͷ簬τʬɲ偶ʀʦ或ɚ౩尭↚Ώ屴ᲄᷳŶ˔˻籦ȣ糦̻̐嵆͵籎˅巈䆆ˊ慾ȣ縀˦⃞ͮˮͪ紞ˎώϰŒϤȾʖВБ傡Ͼɞ̈́偮Ρɟ綤Ფʌɲ簤ᱡˡη籁̿䃁ςБ偱˜Κ籑αɑȡ̂䔩ɔɻ粎Φɖͦ˖́Ɇʄ͵絉Ёɢჩɟ糩ᷩφ棙ʊȷ絢ˋ巡ȹΑʹΖБ写̘偅ϩᲶʺ㓙͑ȥϾ₥ɸˠͥρȾ㴅ȮΨ恕ɴ懹ᷙЕ榕̙͏簵ʼ㲵Д̵絵БȾ㰭̘凍əᲅ˜ⶕЅΎ̥ϑΥϷ簨ͻᴽ͕Ͷ⃝Ί↉煸⇸⅘⃓H恇惎ㅶ焀↦䈎↽⁇ǖ⇐䂐⃬↉炇䴶岹»䢕䦥ëⲟ᷃㧵灛䆳䁊䅳䇅䆱䅓䁺`Çһ㣲䈛䆧䄽ご䇌ඡ粄LjȆ䂪Ýű⣗免䆤᳑䇱ᰨƩ@烐ƃ̫Ǩ䆐⇐LjÛ̘䃖ⅼ㶤Ķ₋䄛̶嵦ȐƧȢᆩ夲䣵熧ㄾεŶㅔǪᷘ巏緗江䁍↧�䀴ÿ䆇̏⁈䈗̠₹ùq⇯䇵煲᱖榷緣煜´ć͓Ă᳇͞䀧̜¿ͧ;⇣䀰‧ΪşͬԷ˟䃛℟䅷ͥǷʚᵗ̸ϗ̏⃞䅯Ͽ䄏↹䈀䊠↽ᅸ槩炏̰Ş䡁䨃˝PÐ䅻ɸ᷻ϐĢ[ʯδ䆛¤‧ʧȲ↛èï˘₦悢䇌↛Īł⅜LjŨ䎸䈶ᲇ˘䍿䃸䏄´DZ᷈䏨䈬䈘䏐ƪDZᴿʈ䊰ƨŸ䍜_τ䌰Ƅ䈧Έ懽䆘䌄䈳ʍ䇳Ǧ䈎ৼ祿䄐ↂ㶔䋈ᠳb慗ą億䊹Ň䁅䲇䈇悥䈟゠ "}
The complete round-trip took 53.7 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-file-analysis
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-analysis.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'request-file-analysis'
- id string [optional] You may pass an id to link requests with responses (they get the same id).
- filetoken string [optional] A unique token to identify the file for subsequent requests. Only use this if you plan to send more queries!
- filename string [optional] A human-readable name of the file, only for debugging purposes.
- content string [optional] The content of the file or an R expression (either give this or the filepath).
-
filepath alternatives [optional]
The path to the file(s) on the local machine (either give this or the content).
- . string
-
. array
Valid item types:
- . string
- cfg boolean [optional] If you want to extract the control flow information of the file.
- format string [optional] The format of the results, if missing we assume json. Allows only the values: 'json', 'n-quads', 'compact'
Message schema (
response-file-analysis
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-analysis.ts
.-
. alternatives [required]
The response to a file analysis request (based on the
format
field).-
. object
The response in JSON format.
- type string [required] The type of the message. Allows only the values: 'response-file-analysis'
- id string [optional] The id of the message, if you passed one in the request.
- format string [required] The format of the results in json format. Allows only the values: 'json'
- results object [required] The results of the analysis (one field per step).
- cfg object [optional] The control flow information of the file, only present if requested.
-
. object
The response as n-quads.
- type string [required] The type of the message. Allows only the values: 'response-file-analysis'
- id string [optional] The id of the message, if you passed one in the request.
- format string [required] The format of the results in n-quads format. Allows only the values: 'n-quads'
- results object [required] The results of the analysis (one field per step). Quads are presented as string.
- cfg string [optional] The control flow information of the file, only present if requested.
-
. object
- type string [required] The type of the message. Allows only the values: 'response-file-analysis'
- id string [optional] The id of the message, if you passed one in the request.
- format string [required] The format of the results in bson format. Allows only the values: 'bson'
- results string [required] The results of the analysis (one field per step).
- cfg string [optional] The control flow information of the file, only present if requested.
-
. object
The response in JSON format.
-
-
Slice Message (
request-slice
)View Details. (deprecated) The server slices a file based on the given criteria.
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-slice alt Server-->>Client: response-slice else Server-->>Client: error end deactivate Server
We deprecated the slice request in favor of the
static-slice
Query.To slice, you have to send a file analysis request first. The
filetoken
you assign is of use here as you can re-use it to repeatedly slice the same file. Besides that, you only need to add an array of slicing criteria, using one of the formats described on the terminology wiki page (however, instead of using;
, you can simply pass separate array elements). See the implementation of the request-slice message for more information.Additionally, you may pass
"noMagicComments": true
to disable the automatic selection of elements based on magic comments (see below).Example of the
request-slice
MessageNote: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.16", "r": "4.5.0", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
Let's assume you want to slice the following script:
x <- 1 x + 1
For this we first request the analysis, using a
filetoken
ofx
to slice the file in the next request.{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1" }
-
response-file-analysis
(response)Show Details
See above for the general structure of the response.
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":7}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8066-vYT1yUtfqUSU-.R"}},"rhs":{"location":[1,6,1,6],"lexeme":"1","info":{"fullRange":[1,6,1,6],"additionalTokens":[],"id":1,"parent":2,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-8066-vYT1yUtfqUSU-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,1,1,6],"additionalTokens":[],"id":2,"parent":6,"nesting":0,"file":"/tmp/tmp-8066-vYT1yUtfqUSU-.R","index":0,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[2,3,2,3],"lhs":{"type":"RSymbol","location":[2,1,2,1],"content":"x","lexeme":"x","info":{"fullRange":[2,1,2,1],"additionalTokens":[],"id":3,"parent":5,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8066-vYT1yUtfqUSU-.R"}},"rhs":{"location":[2,5,2,5],"lexeme":"1","info":{"fullRange":[2,5,2,5],"additionalTokens":[],"id":4,"parent":5,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-8066-vYT1yUtfqUSU-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"+","lexeme":"+","info":{"fullRange":[2,1,2,5],"additionalTokens":[],"id":5,"parent":6,"nesting":0,"file":"/tmp/tmp-8066-vYT1yUtfqUSU-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8066-vYT1yUtfqUSU-.R","role":"root","index":0}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":131,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-8066-vYT1yUtfqUSU-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":1}}}}
-
request-slice
(request)Show Details
Of course, the second slice criterion
2:1
is redundant for the input, as they refer to the same variable. It is only for demonstration purposes.{ "type": "request-slice", "id": "2", "filetoken": "x", "criterion": [ "2@x", "2:1" ] }
-
response-slice
(response)Show Details
The
results
field of the response contains two keys of importance:-
slice
: which contains the result of the slicing (e.g., the ids included in the slice inresult
). -
reconstruct
: contains the reconstructed code, as well as additional meta information. The automatically selected lines correspond to additional filters (e.g., magic comments) which force the unconditiojnal inclusion of certain elements.
{ "type": "response-slice", "id": "2", "results": { "slice": { "timesHitThreshold": 0, "result": [ 3, 0, 1, 2, "built-in:<-" ], "decodedCriteria": [ { "criterion": "2@x", "id": 3 }, { "criterion": "2:1", "id": 3 } ], ".meta": { "timing": 2 } }, "reconstruct": { "code": "x <- 1\nx", "linesWithAutoSelected": 0, ".meta": { "timing": 1 } } } }
-
The complete round-trip took 14.5 ms (including time required to validate the messages, start, and stop the internal mock server).
The semantics of the error message are similar. If, for example, the slicing criterion is invalid or the
filetoken
is unknown, flowR will respond with an error.Within a document that is to be sliced, you can use magic comments to influence the slicing process:
-
# flowr@include_next_line
will cause the next line to be included, independent of if it is important for the slice. -
# flowr@include_this_line
will cause the current line to be included, independent of if it is important for the slice. -
# flowr@include_start
and# flowr@include_end
will cause the lines between them to be included, independent of if they are important for the slice. These magic comments can be nested but should appear on a separate line.
Message schema (
request-slice
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-slice.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'request-slice'
- id string [optional] The id of the message, if you passed one in the request.
- filetoken string [required] The filetoken of the file to slice must be the same as with the analysis request.
-
criterion array [required]
The slicing criteria to use.
Valid item types:
- . string
Message schema (
response-slice
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-slice.ts
.-
. object
The response to a slice request.
- type string [required] The type of the message. Allows only the values: 'response-slice'
- id string [optional] The id of the message, if you passed one in the request.
- results object [required] The results of the slice (one field per step slicing step).
-
-
REPL Message (
request-repl-execution
)View Details. Access the read evaluate print loop of flowR.
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-repl-execution alt Server-->>Client: error else loop Server-->>Client: response-repl-execution end Server-->>Client: end-repl-execution end deactivate Server
[!WARNING] To execute arbitrary R commands with a request, the server has to be started explicitly with
--r-session-access
. Please be aware that this introduces a security risk.The REPL execution message allows to send a REPL command to receive its output. For more on the REPL, see the introduction, or the description below. You only have to pass the command you want to execute in the
expression
field. Furthermore, you can set theansi
field totrue
if you are interested in output formatted using ANSI escape codes. We strongly recommend you to make use of theid
field to link answers with requests as you can theoretically request the execution of multiple scripts at the same time, which then happens in parallel.[!WARNING] There is currently no automatic sandboxing or safeguarding against such requests. They simply execute the respective R code on your machine. Please be very careful (and do not use
--r-session-access
if you are unsure).The answer on such a request is different from the other messages as the
response-repl-execution
message may be sent multiple times. This allows to better handle requests that require more time but already output intermediate results. You can detect the end of the execution by receiving theend-repl-execution
message.The semantics of the error message are similar to that of the other messages.
Example of the
request-slice
MessageNote: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.16", "r": "4.5.0", "engine": "r-shell" } }
-
request-repl-execution
(request)Show Details
{ "type": "request-repl-execution", "id": "1", "expression": ":help" }
-
response-repl-execution
(response)Show Details
The
stream
field (eitherstdout
orstderr
) informs you of the output's origin: either the standard output or the standard error channel. After this message follows the end marker.Pretty-Printed Result
If enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away: R> 1 + 1 [1] 2 Besides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. There are the following basic commands: :controlflow[*] Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf) :controlflowbb[*] Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb) :dataflow[*] Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df) :dataflowsimple[*] Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs) :execute Execute the given code as R code (essentially similar to using now command). This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r) :help Show help information (aliases: :h, :?) :lineage Get the lineage of an R object (alias: :lin) :normalize[*] Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n) :parse Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p) :query[*] Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.) :quit End the repl (aliases: :q, :exit) :version Prints the version of flowR as well as the current version of R Furthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command. :benchmark Benchmark the static backwards slicer :export-quads Export quads of the normalized AST of a given R code file :slicer Static backwards executable slicer for R :stats Generate usage Statistics for R scripts :summarizer Summarize the results of the benchmark You can combine commands by separating them with a semicolon ;.
{ "type": "response-repl-execution", "id": "1", "result": "\nIf enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away:\nR> 1 + 1\n[1] 2\n\nBesides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. \nThere are the following basic commands:\n :controlflow[*] Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf)\n :controlflowbb[*] Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb)\n :dataflow[*] Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df)\n :dataflowsimple[*] Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs)\n :execute Execute the given code as R code (essentially similar to using now command). This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r)\n :help Show help information (aliases: :h, :?)\n :lineage Get the lineage of an R object (alias: :lin)\n :normalize[*] Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n)\n :parse Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p)\n :query[*] Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.)\n :quit End the repl (aliases: :q, :exit)\n :version Prints the version of flowR as well as the current version of R\n\nFurthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command.\n :benchmark Benchmark the static backwards slicer\n :export-quads Export quads of the normalized AST of a given R code file\n :slicer Static backwards executable slicer for R\n :stats Generate usage Statistics for R scripts\n :summarizer Summarize the results of the benchmark\n\nYou can combine commands by separating them with a semicolon ;.\n", "stream": "stdout" }
-
end-repl-execution
(response)Show Details
{ "type": "end-repl-execution", "id": "1" }
The complete round-trip took 1.4 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-repl-execution
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-repl.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'request-repl-execution'
- id string [optional] The id of the message, will be the same for the request.
-
ansi boolean [optional]
Should ansi formatting be enabled for the response? Is
false
by default. - expression string [required] The expression to execute.
Message schema (
response-repl-execution
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-repl.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'response-repl-execution'
- id string [optional] The id of the message, will be the same for the request.
- stream string [required] The stream the message is from. Allows only the values: 'stdout', 'stderr'
- result string [required] The output of the execution.
Message schema (
end-repl-execution
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-repl.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'end-repl-execution'
- id string [optional] The id of the message, will be the same for the request.
-
-
Query Message (
request-query
)View Details. Query an analysis result for specific information.
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-query alt Server-->>Client: response-query else Server-->>Client: error end deactivate Server
To send queries, you have to send an analysis request first. The
filetoken
you assign is of use here as you can re-use it to repeatedly query the same file. This message provides direct access to flowR's Query API. Please consult the Query API documentation for more information.Example of the
request-query
MessageNote: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.16", "r": "4.5.0", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
Let's assume you want to query the following script:
library(ggplot) library(dplyr) library(readr) # read data with read_csv data <- read_csv('data.csv') data2 <- read_csv('data2.csv') m <- mean(data$x) print(m) data %>% ggplot(aes(x = x, y = y)) + geom_point() plot(data2$x, data2$y) points(data2$x, data2$y) print(mean(data2$k))
.
For this we first request the analysis, using a dummy
filetoken
ofx
to slice the file in the next request.{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "library(ggplot)\nlibrary(dplyr)\nlibrary(readr)\n\n# read data with read_csv\ndata <- read_csv('data.csv')\ndata2 <- read_csv('data2.csv')\n\nm <- mean(data$x) \nprint(m)\n\ndata %>%\n\tggplot(aes(x = x, y = y)) +\n\tgeom_point()\n\t\nplot(data2$x, data2$y)\npoints(data2$x, data2$y)\n\t\nprint(mean(data2$k))" }
-
response-file-analysis
(response)Show Details
See above for the general structure of the response.
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,15,10,0,\"expr\",false,\"library(ggplot)\"],[1,1,1,7,1,3,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[1,1,1,7,3,10,\"expr\",false,\"library\"],[1,8,1,8,2,10,\"'('\",true,\"(\"],[1,9,1,14,4,6,\"SYMBOL\",true,\"ggplot\"],[1,9,1,14,6,10,\"expr\",false,\"ggplot\"],[1,15,1,15,5,10,\"')'\",true,\")\"],[2,1,2,14,23,0,\"expr\",false,\"library(dplyr)\"],[2,1,2,7,14,16,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[2,1,2,7,16,23,\"expr\",false,\"library\"],[2,8,2,8,15,23,\"'('\",true,\"(\"],[2,9,2,13,17,19,\"SYMBOL\",true,\"dplyr\"],[2,9,2,13,19,23,\"expr\",false,\"dplyr\"],[2,14,2,14,18,23,\"')'\",true,\")\"],[3,1,3,14,36,0,\"expr\",false,\"library(readr)\"],[3,1,3,7,27,29,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[3,1,3,7,29,36,\"expr\",false,\"library\"],[3,8,3,8,28,36,\"'('\",true,\"(\"],[3,9,3,13,30,32,\"SYMBOL\",true,\"readr\"],[3,9,3,13,32,36,\"expr\",false,\"readr\"],[3,14,3,14,31,36,\"')'\",true,\")\"],[5,1,5,25,42,-59,\"COMMENT\",true,\"# read data with read_csv\"],[6,1,6,28,59,0,\"expr\",false,\"data <- read_csv('data.csv')\"],[6,1,6,4,45,47,\"SYMBOL\",true,\"data\"],[6,1,6,4,47,59,\"expr\",false,\"data\"],[6,6,6,7,46,59,\"LEFT_ASSIGN\",true,\"<-\"],[6,9,6,28,57,59,\"expr\",false,\"read_csv('data.csv')\"],[6,9,6,16,48,50,\"SYMBOL_FUNCTION_CALL\",true,\"read_csv\"],[6,9,6,16,50,57,\"expr\",false,\"read_csv\"],[6,17,6,17,49,57,\"'('\",true,\"(\"],[6,18,6,27,51,53,\"STR_CONST\",true,\"'data.csv'\"],[6,18,6,27,53,57,\"expr\",false,\"'data.csv'\"],[6,28,6,28,52,57,\"')'\",true,\")\"],[7,1,7,30,76,0,\"expr\",false,\"data2 <- read_csv('data2.csv')\"],[7,1,7,5,62,64,\"SYMBOL\",true,\"data2\"],[7,1,7,5,64,76,\"expr\",false,\"data2\"],[7,7,7,8,63,76,\"LEFT_ASSIGN\",true,\"<-\"],[7,10,7,30,74,76,\"expr\",false,\"read_csv('data2.csv')\"],[7,10,7,17,65,67,\"SYMBOL_FUNCTION_CALL\",true,\"read_csv\"],[7,10,7,17,67,74,\"expr\",false,\"read_csv\"],[7,18,7,18,66,74,\"'('\",true,\"(\"],[7,19,7,29,68,70,\"STR_CONST\",true,\"'data2.csv'\"],[7,19,7,29,70,74,\"expr\",false,\"'data2.csv'\"],[7,30,7,30,69,74,\"')'\",true,\")\"],[9,1,9,17,98,0,\"expr\",false,\"m <- mean(data$x)\"],[9,1,9,1,81,83,\"SYMBOL\",true,\"m\"],[9,1,9,1,83,98,\"expr\",false,\"m\"],[9,3,9,4,82,98,\"LEFT_ASSIGN\",true,\"<-\"],[9,6,9,17,96,98,\"expr\",false,\"mean(data$x)\"],[9,6,9,9,84,86,\"SYMBOL_FUNCTION_CALL\",true,\"mean\"],[9,6,9,9,86,96,\"expr\",false,\"mean\"],[9,10,9,10,85,96,\"'('\",true,\"(\"],[9,11,9,16,91,96,\"expr\",false,\"data$x\"],[9,11,9,14,87,89,\"SYMBOL\",true,\"data\"],[9,11,9,14,89,91,\"expr\",false,\"data\"],[9,15,9,15,88,91,\"'$'\",true,\"$\"],[9,16,9,16,90,91,\"SYMBOL\",true,\"x\"],[9,17,9,17,92,96,\"')'\",true,\")\"],[10,1,10,8,110,0,\"expr\",false,\"print(m)\"],[10,1,10,5,101,103,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[10,1,10,5,103,110,\"expr\",false,\"print\"],[10,6,10,6,102,110,\"'('\",true,\"(\"],[10,7,10,7,104,106,\"SYMBOL\",true,\"m\"],[10,7,10,7,106,110,\"expr\",false,\"m\"],[10,8,10,8,105,110,\"')'\",true,\")\"],[12,1,14,20,158,0,\"expr\",false,\"data %>%\\n\\tggplot(aes(x = x, y = y)) +\\n\\tgeom_point()\"],[12,1,13,33,149,158,\"expr\",false,\"data %>%\\n\\tggplot(aes(x = x, y = y))\"],[12,1,12,4,116,118,\"SYMBOL\",true,\"data\"],[12,1,12,4,118,149,\"expr\",false,\"data\"],[12,6,12,8,117,149,\"SPECIAL\",true,\"%>%\"],[13,9,13,33,147,149,\"expr\",false,\"ggplot(aes(x = x, y = y))\"],[13,9,13,14,120,122,\"SYMBOL_FUNCTION_CALL\",true,\"ggplot\"],[13,9,13,14,122,147,\"expr\",false,\"ggplot\"],[13,15,13,15,121,147,\"'('\",true,\"(\"],[13,16,13,32,142,147,\"expr\",false,\"aes(x = x, y = y)\"],[13,16,13,18,123,125,\"SYMBOL_FUNCTION_CALL\",true,\"aes\"],[13,16,13,18,125,142,\"expr\",false,\"aes\"],[13,19,13,19,124,142,\"'('\",true,\"(\"],[13,20,13,20,126,142,\"SYMBOL_SUB\",true,\"x\"],[13,22,13,22,127,142,\"EQ_SUB\",true,\"=\"],[13,24,13,24,128,130,\"SYMBOL\",true,\"x\"],[13,24,13,24,130,142,\"expr\",false,\"x\"],[13,25,13,25,129,142,\"','\",true,\",\"],[13,27,13,27,134,142,\"SYMBOL_SUB\",true,\"y\"],[13,29,13,29,135,142,\"EQ_SUB\",true,\"=\"],[13,31,13,31,136,138,\"SYMBOL\",true,\"y\"],[13,31,13,31,138,142,\"expr\",false,\"y\"],[13,32,13,32,137,142,\"')'\",true,\")\"],[13,33,13,33,143,147,\"')'\",true,\")\"],[13,35,13,35,148,158,\"'+'\",true,\"+\"],[14,9,14,20,156,158,\"expr\",false,\"geom_point()\"],[14,9,14,18,151,153,\"SYMBOL_FUNCTION_CALL\",true,\"geom_point\"],[14,9,14,18,153,156,\"expr\",false,\"geom_point\"],[14,19,14,19,152,156,\"'('\",true,\"(\"],[14,20,14,20,154,156,\"')'\",true,\")\"],[16,1,16,22,184,0,\"expr\",false,\"plot(data2$x, data2$y)\"],[16,1,16,4,163,165,\"SYMBOL_FUNCTION_CALL\",true,\"plot\"],[16,1,16,4,165,184,\"expr\",false,\"plot\"],[16,5,16,5,164,184,\"'('\",true,\"(\"],[16,6,16,12,170,184,\"expr\",false,\"data2$x\"],[16,6,16,10,166,168,\"SYMBOL\",true,\"data2\"],[16,6,16,10,168,170,\"expr\",false,\"data2\"],[16,11,16,11,167,170,\"'$'\",true,\"$\"],[16,12,16,12,169,170,\"SYMBOL\",true,\"x\"],[16,13,16,13,171,184,\"','\",true,\",\"],[16,15,16,21,179,184,\"expr\",false,\"data2$y\"],[16,15,16,19,175,177,\"SYMBOL\",true,\"data2\"],[16,15,16,19,177,179,\"expr\",false,\"data2\"],[16,20,16,20,176,179,\"'$'\",true,\"$\"],[16,21,16,21,178,179,\"SYMBOL\",true,\"y\"],[16,22,16,22,180,184,\"')'\",true,\")\"],[17,1,17,24,209,0,\"expr\",false,\"points(data2$x, data2$y)\"],[17,1,17,6,188,190,\"SYMBOL_FUNCTION_CALL\",true,\"points\"],[17,1,17,6,190,209,\"expr\",false,\"points\"],[17,7,17,7,189,209,\"'('\",true,\"(\"],[17,8,17,14,195,209,\"expr\",false,\"data2$x\"],[17,8,17,12,191,193,\"SYMBOL\",true,\"data2\"],[17,8,17,12,193,195,\"expr\",false,\"data2\"],[17,13,17,13,192,195,\"'$'\",true,\"$\"],[17,14,17,14,194,195,\"SYMBOL\",true,\"x\"],[17,15,17,15,196,209,\"','\",true,\",\"],[17,17,17,23,204,209,\"expr\",false,\"data2$y\"],[17,17,17,21,200,202,\"SYMBOL\",true,\"data2\"],[17,17,17,21,202,204,\"expr\",false,\"data2\"],[17,22,17,22,201,204,\"'$'\",true,\"$\"],[17,23,17,23,203,204,\"SYMBOL\",true,\"y\"],[17,24,17,24,205,209,\"')'\",true,\")\"],[19,1,19,20,235,0,\"expr\",false,\"print(mean(data2$k))\"],[19,1,19,5,215,217,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[19,1,19,5,217,235,\"expr\",false,\"print\"],[19,6,19,6,216,235,\"'('\",true,\"(\"],[19,7,19,19,230,235,\"expr\",false,\"mean(data2$k)\"],[19,7,19,10,218,220,\"SYMBOL_FUNCTION_CALL\",true,\"mean\"],[19,7,19,10,220,230,\"expr\",false,\"mean\"],[19,11,19,11,219,230,\"'('\",true,\"(\"],[19,12,19,18,225,230,\"expr\",false,\"data2$k\"],[19,12,19,16,221,223,\"SYMBOL\",true,\"data2\"],[19,12,19,16,223,225,\"expr\",false,\"data2\"],[19,17,19,17,222,225,\"'$'\",true,\"$\"],[19,18,19,18,224,225,\"SYMBOL\",true,\"k\"],[19,19,19,19,226,230,\"')'\",true,\")\"],[19,20,19,20,231,235,\"')'\",true,\")\"]",".meta":{"timing":5}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RFunctionCall","named":true,"location":[1,1,1,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[1,1,1,7],"content":"library","lexeme":"library","info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":0,"parent":3,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"arguments":[{"type":"RArgument","location":[1,9,1,14],"lexeme":"ggplot","value":{"type":"RSymbol","location":[1,9,1,14],"content":"ggplot","lexeme":"ggplot","info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":1,"parent":2,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":0,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[2,1,2,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[2,1,2,7],"content":"library","lexeme":"library","info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":4,"parent":7,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"arguments":[{"type":"RArgument","location":[2,9,2,13],"lexeme":"dplyr","value":{"type":"RSymbol","location":[2,9,2,13],"content":"dplyr","lexeme":"dplyr","info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":5,"parent":6,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[3,1,3,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[3,1,3,7],"content":"library","lexeme":"library","info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":8,"parent":11,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"arguments":[{"type":"RArgument","location":[3,9,3,13],"lexeme":"readr","value":{"type":"RSymbol","location":[3,9,3,13],"content":"readr","lexeme":"readr","info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":9,"parent":10,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":2,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[6,6,6,7],"lhs":{"type":"RSymbol","location":[6,1,6,4],"content":"data","lexeme":"data","info":{"fullRange":[6,1,6,4],"additionalTokens":[],"id":12,"parent":17,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"rhs":{"type":"RFunctionCall","named":true,"location":[6,9,6,16],"lexeme":"read_csv","functionName":{"type":"RSymbol","location":[6,9,6,16],"content":"read_csv","lexeme":"read_csv","info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":13,"parent":16,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"arguments":[{"type":"RArgument","location":[6,18,6,27],"lexeme":"'data.csv'","value":{"type":"RString","location":[6,18,6,27],"content":{"str":"data.csv","quotes":"'"},"lexeme":"'data.csv'","info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":14,"parent":15,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[6,1,6,28],"additionalTokens":[{"type":"RComment","location":[5,1,5,25],"content":" read data with read_csv","lexeme":"# read data with read_csv","info":{"fullRange":[6,1,6,28],"additionalTokens":[]}}],"id":17,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":3,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[7,7,7,8],"lhs":{"type":"RSymbol","location":[7,1,7,5],"content":"data2","lexeme":"data2","info":{"fullRange":[7,1,7,5],"additionalTokens":[],"id":18,"parent":23,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"rhs":{"type":"RFunctionCall","named":true,"location":[7,10,7,17],"lexeme":"read_csv","functionName":{"type":"RSymbol","location":[7,10,7,17],"content":"read_csv","lexeme":"read_csv","info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":19,"parent":22,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"arguments":[{"type":"RArgument","location":[7,19,7,29],"lexeme":"'data2.csv'","value":{"type":"RString","location":[7,19,7,29],"content":{"str":"data2.csv","quotes":"'"},"lexeme":"'data2.csv'","info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":20,"parent":21,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":4,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[9,3,9,4],"lhs":{"type":"RSymbol","location":[9,1,9,1],"content":"m","lexeme":"m","info":{"fullRange":[9,1,9,1],"additionalTokens":[],"id":24,"parent":32,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"rhs":{"type":"RFunctionCall","named":true,"location":[9,6,9,9],"lexeme":"mean","functionName":{"type":"RSymbol","location":[9,6,9,9],"content":"mean","lexeme":"mean","info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":25,"parent":31,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"arguments":[{"type":"RArgument","location":[9,11,9,16],"lexeme":"data$x","value":{"type":"RAccess","location":[9,15,9,15],"lexeme":"$","accessed":{"type":"RSymbol","location":[9,11,9,14],"content":"data","lexeme":"data","info":{"fullRange":[9,11,9,14],"additionalTokens":[],"id":26,"parent":29,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"operator":"$","access":[{"type":"RArgument","location":[9,16,9,16],"lexeme":"x","value":{"type":"RSymbol","location":[9,16,9,16],"content":"x","lexeme":"x","info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":27,"parent":28,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":5,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[10,1,10,5],"lexeme":"print","functionName":{"type":"RSymbol","location":[10,1,10,5],"content":"print","lexeme":"print","info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":33,"parent":36,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"arguments":[{"type":"RArgument","location":[10,7,10,7],"lexeme":"m","value":{"type":"RSymbol","location":[10,7,10,7],"content":"m","lexeme":"m","info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":34,"parent":35,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":6,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[13,35,13,35],"lhs":{"type":"RFunctionCall","named":true,"infixSpecial":true,"lexeme":"data %>%\n\tggplot(aes(x = x, y = y))","location":[12,6,12,8],"functionName":{"type":"RSymbol","location":[12,6,12,8],"lexeme":"%>%","content":"%>%","info":{"id":37,"parent":52,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"arguments":[{"type":"RArgument","location":[12,1,12,4],"value":{"type":"RSymbol","location":[12,1,12,4],"content":"data","lexeme":"data","info":{"fullRange":[12,1,12,4],"additionalTokens":[],"id":38,"parent":39,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[13,9,13,14],"value":{"type":"RFunctionCall","named":true,"location":[13,9,13,14],"lexeme":"ggplot","functionName":{"type":"RSymbol","location":[13,9,13,14],"content":"ggplot","lexeme":"ggplot","info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":40,"parent":50,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"arguments":[{"type":"RArgument","location":[13,16,13,32],"lexeme":"aes(x = x, y = y)","value":{"type":"RFunctionCall","named":true,"location":[13,16,13,18],"lexeme":"aes","functionName":{"type":"RSymbol","location":[13,16,13,18],"content":"aes","lexeme":"aes","info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":41,"parent":48,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"arguments":[{"type":"RArgument","location":[13,20,13,20],"lexeme":"x","name":{"type":"RSymbol","location":[13,20,13,20],"content":"x","lexeme":"x","info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":42,"parent":44,"role":"arg-name","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"value":{"type":"RSymbol","location":[13,24,13,24],"content":"x","lexeme":"x","info":{"fullRange":[13,24,13,24],"additionalTokens":[],"id":43,"parent":44,"role":"arg-value","index":1,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[13,27,13,27],"lexeme":"y","name":{"type":"RSymbol","location":[13,27,13,27],"content":"y","lexeme":"y","info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":45,"parent":47,"role":"arg-name","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"value":{"type":"RSymbol","location":[13,31,13,31],"content":"y","lexeme":"y","info":{"fullRange":[13,31,13,31],"additionalTokens":[],"id":46,"parent":47,"role":"arg-value","index":1,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","role":"binop-lhs"}},"rhs":{"type":"RFunctionCall","named":true,"location":[14,9,14,18],"lexeme":"geom_point","functionName":{"type":"RSymbol","location":[14,9,14,18],"content":"geom_point","lexeme":"geom_point","info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":53,"parent":54,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":7,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[16,1,16,4],"lexeme":"plot","functionName":{"type":"RSymbol","location":[16,1,16,4],"content":"plot","lexeme":"plot","info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":56,"parent":67,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"arguments":[{"type":"RArgument","location":[16,6,16,12],"lexeme":"data2$x","value":{"type":"RAccess","location":[16,11,16,11],"lexeme":"$","accessed":{"type":"RSymbol","location":[16,6,16,10],"content":"data2","lexeme":"data2","info":{"fullRange":[16,6,16,10],"additionalTokens":[],"id":57,"parent":60,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"operator":"$","access":[{"type":"RArgument","location":[16,12,16,12],"lexeme":"x","value":{"type":"RSymbol","location":[16,12,16,12],"content":"x","lexeme":"x","info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":58,"parent":59,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[16,15,16,21],"lexeme":"data2$y","value":{"type":"RAccess","location":[16,20,16,20],"lexeme":"$","accessed":{"type":"RSymbol","location":[16,15,16,19],"content":"data2","lexeme":"data2","info":{"fullRange":[16,15,16,19],"additionalTokens":[],"id":62,"parent":65,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"operator":"$","access":[{"type":"RArgument","location":[16,21,16,21],"lexeme":"y","value":{"type":"RSymbol","location":[16,21,16,21],"content":"y","lexeme":"y","info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":63,"parent":64,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":8,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[17,1,17,6],"lexeme":"points","functionName":{"type":"RSymbol","location":[17,1,17,6],"content":"points","lexeme":"points","info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":68,"parent":79,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"arguments":[{"type":"RArgument","location":[17,8,17,14],"lexeme":"data2$x","value":{"type":"RAccess","location":[17,13,17,13],"lexeme":"$","accessed":{"type":"RSymbol","location":[17,8,17,12],"content":"data2","lexeme":"data2","info":{"fullRange":[17,8,17,12],"additionalTokens":[],"id":69,"parent":72,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"operator":"$","access":[{"type":"RArgument","location":[17,14,17,14],"lexeme":"x","value":{"type":"RSymbol","location":[17,14,17,14],"content":"x","lexeme":"x","info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":70,"parent":71,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[17,17,17,23],"lexeme":"data2$y","value":{"type":"RAccess","location":[17,22,17,22],"lexeme":"$","accessed":{"type":"RSymbol","location":[17,17,17,21],"content":"data2","lexeme":"data2","info":{"fullRange":[17,17,17,21],"additionalTokens":[],"id":74,"parent":77,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"operator":"$","access":[{"type":"RArgument","location":[17,23,17,23],"lexeme":"y","value":{"type":"RSymbol","location":[17,23,17,23],"content":"y","lexeme":"y","info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":75,"parent":76,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":9,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[19,1,19,5],"lexeme":"print","functionName":{"type":"RSymbol","location":[19,1,19,5],"content":"print","lexeme":"print","info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":80,"parent":89,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"arguments":[{"type":"RArgument","location":[19,7,19,19],"lexeme":"mean(data2$k)","value":{"type":"RFunctionCall","named":true,"location":[19,7,19,10],"lexeme":"mean","functionName":{"type":"RSymbol","location":[19,7,19,10],"content":"mean","lexeme":"mean","info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":81,"parent":87,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"arguments":[{"type":"RArgument","location":[19,12,19,18],"lexeme":"data2$k","value":{"type":"RAccess","location":[19,17,19,17],"lexeme":"$","accessed":{"type":"RSymbol","location":[19,12,19,16],"content":"data2","lexeme":"data2","info":{"fullRange":[19,12,19,16],"additionalTokens":[],"id":82,"parent":85,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"operator":"$","access":[{"type":"RArgument","location":[19,18,19,18],"lexeme":"k","value":{"type":"RSymbol","location":[19,18,19,18],"content":"k","lexeme":"k","info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":83,"parent":84,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","role":"root","index":0}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":3,"name":"library","type":2},{"nodeId":7,"name":"library","type":2},{"nodeId":11,"name":"library","type":2},{"nodeId":17,"name":"<-","type":2},{"nodeId":23,"name":"<-","type":2},{"nodeId":32,"name":"<-","type":2},{"nodeId":16,"name":"read_csv","type":2},{"nodeId":22,"name":"read_csv","type":2},{"nodeId":29,"name":"$","type":2},{"nodeId":60,"name":"$","type":2},{"nodeId":65,"name":"$","type":2},{"nodeId":72,"name":"$","type":2},{"nodeId":77,"name":"$","type":2},{"nodeId":85,"name":"$","type":2},{"nodeId":31,"name":"mean","type":2},{"nodeId":87,"name":"mean","type":2},{"nodeId":36,"name":"print","type":2},{"nodeId":89,"name":"print","type":2},{"nodeId":43,"name":"x","type":1},{"nodeId":46,"name":"y","type":1},{"nodeId":48,"name":"aes","type":2},{"nodeId":50,"name":"ggplot","type":2},{"nodeId":52,"name":"%>%","type":2},{"nodeId":54,"name":"geom_point","type":2},{"nodeId":55,"name":"+","type":2},{"nodeId":67,"name":"plot","type":2},{"nodeId":79,"name":"points","type":2}],"out":[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]},{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]},{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}],"environment":{"current":{"id":240,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-8066-0mDCMFnPUCny-.R"],"_unknownSideEffects":[3,7,11,{"id":36,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":50,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":67,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":89,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[1,3,5,7,9,11,14,16,12,17,20,22,18,23,26,27,29,31,24,32,34,36,38,43,44,46,47,48,50,52,54,55,57,58,60,62,63,65,67,69,70,72,74,75,77,79,82,83,85,87,89],"vertexInformation":[[1,{"tag":"value","id":1}],[3,{"tag":"function-call","id":3,"name":"library","onlyBuiltin":true,"args":[{"nodeId":1,"type":32}],"origin":["builtin:library"]}],[5,{"tag":"value","id":5}],[7,{"tag":"function-call","id":7,"name":"library","onlyBuiltin":true,"args":[{"nodeId":5,"type":32}],"origin":["builtin:library"]}],[9,{"tag":"value","id":9}],[11,{"tag":"function-call","id":11,"name":"library","onlyBuiltin":true,"args":[{"nodeId":9,"type":32}],"origin":["builtin:library"]}],[14,{"tag":"value","id":14}],[16,{"tag":"function-call","id":16,"environment":{"current":{"id":147,"parent":"<BuiltInEnvironment>","memory":[]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":14,"type":32}],"origin":["function"]}],[12,{"tag":"variable-definition","id":12}],[17,{"tag":"function-call","id":17,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":12,"type":32},{"nodeId":16,"type":32}],"origin":["builtin:assignment"]}],[20,{"tag":"value","id":20}],[22,{"tag":"function-call","id":22,"environment":{"current":{"id":157,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]]]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":20,"type":32}],"origin":["function"]}],[18,{"tag":"variable-definition","id":18}],[23,{"tag":"function-call","id":23,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":18,"type":32},{"nodeId":22,"type":32}],"origin":["builtin:assignment"]}],[26,{"tag":"use","id":26}],[27,{"tag":"value","id":27}],[29,{"tag":"function-call","id":29,"name":"$","onlyBuiltin":true,"args":[{"nodeId":26,"type":32},{"nodeId":27,"type":32}],"origin":["builtin:access"]}],[31,{"tag":"function-call","id":31,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":29,"type":32}],"origin":["builtin:default"]}],[24,{"tag":"variable-definition","id":24}],[32,{"tag":"function-call","id":32,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":24,"type":32},{"nodeId":31,"type":32}],"origin":["builtin:assignment"]}],[34,{"tag":"use","id":34}],[36,{"tag":"function-call","id":36,"name":"print","onlyBuiltin":true,"args":[{"nodeId":34,"type":32}],"origin":["builtin:default"]}],[38,{"tag":"use","id":38}],[43,{"tag":"use","id":43}],[44,{"tag":"use","id":44}],[46,{"tag":"use","id":46}],[47,{"tag":"use","id":47}],[48,{"tag":"function-call","id":48,"environment":{"current":{"id":189,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"name":"aes","onlyBuiltin":false,"args":[{"nodeId":44,"name":"x","type":32},{"nodeId":47,"name":"y","type":32}],"origin":["function"]}],[50,{"tag":"function-call","id":50,"name":"ggplot","onlyBuiltin":true,"args":[{"nodeId":38,"type":2},{"nodeId":48,"type":32}],"origin":["builtin:default"]}],[52,{"tag":"function-call","id":52,"name":"%>%","onlyBuiltin":true,"args":[{"nodeId":38,"type":32},{"nodeId":50,"type":32}],"origin":["builtin:pipe"]}],[54,{"tag":"function-call","id":54,"name":"geom_point","onlyBuiltin":true,"args":[],"origin":["builtin:default"]}],[55,{"tag":"function-call","id":55,"name":"+","onlyBuiltin":true,"args":[{"nodeId":52,"type":32},{"nodeId":54,"type":32}],"origin":["builtin:default"]}],[57,{"tag":"use","id":57}],[58,{"tag":"value","id":58}],[60,{"tag":"function-call","id":60,"name":"$","onlyBuiltin":true,"args":[{"nodeId":57,"type":32},{"nodeId":58,"type":32}],"origin":["builtin:access"]}],[62,{"tag":"use","id":62}],[63,{"tag":"value","id":63}],[65,{"tag":"function-call","id":65,"name":"$","onlyBuiltin":true,"args":[{"nodeId":62,"type":32},{"nodeId":63,"type":32}],"origin":["builtin:access"]}],[67,{"tag":"function-call","id":67,"name":"plot","onlyBuiltin":true,"args":[{"nodeId":60,"type":32},{"nodeId":65,"type":32}],"origin":["builtin:default"]}],[69,{"tag":"use","id":69}],[70,{"tag":"value","id":70}],[72,{"tag":"function-call","id":72,"name":"$","onlyBuiltin":true,"args":[{"nodeId":69,"type":32},{"nodeId":70,"type":32}],"origin":["builtin:access"]}],[74,{"tag":"use","id":74}],[75,{"tag":"value","id":75}],[77,{"tag":"function-call","id":77,"name":"$","onlyBuiltin":true,"args":[{"nodeId":74,"type":32},{"nodeId":75,"type":32}],"origin":["builtin:access"]}],[79,{"tag":"function-call","id":79,"name":"points","onlyBuiltin":true,"args":[{"nodeId":72,"type":32},{"nodeId":77,"type":32}],"origin":["builtin:default"]}],[82,{"tag":"use","id":82}],[83,{"tag":"value","id":83}],[85,{"tag":"function-call","id":85,"name":"$","onlyBuiltin":true,"args":[{"nodeId":82,"type":32},{"nodeId":83,"type":32}],"origin":["builtin:access"]}],[87,{"tag":"function-call","id":87,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":85,"type":32}],"origin":["builtin:default"]}],[89,{"tag":"function-call","id":89,"name":"print","onlyBuiltin":true,"args":[{"nodeId":87,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[3,[[1,{"types":64}],["built-in:library",{"types":5}]]],[7,[[5,{"types":64}],["built-in:library",{"types":5}]]],[11,[[9,{"types":64}],["built-in:library",{"types":5}]]],[16,[[14,{"types":64}]]],[17,[[16,{"types":64}],[12,{"types":72}],["built-in:<-",{"types":5}]]],[12,[[16,{"types":2}],[17,{"types":2}]]],[22,[[20,{"types":64}]]],[23,[[22,{"types":64}],[18,{"types":72}],["built-in:<-",{"types":5}]]],[18,[[22,{"types":2}],[23,{"types":2}]]],[26,[[12,{"types":1}]]],[29,[[26,{"types":73}],[27,{"types":65}],["built-in:$",{"types":5}]]],[31,[[29,{"types":65}],["built-in:mean",{"types":5}]]],[32,[[31,{"types":64}],[24,{"types":72}],["built-in:<-",{"types":5}]]],[24,[[31,{"types":2}],[32,{"types":2}]]],[36,[[34,{"types":73}],["built-in:print",{"types":5}]]],[34,[[24,{"types":1}]]],[38,[[12,{"types":1}]]],[52,[[38,{"types":64}],[50,{"types":64}],["built-in:%>%",{"types":5}]]],[44,[[43,{"types":1}]]],[48,[[43,{"types":1}],[44,{"types":64}],[46,{"types":1}],[47,{"types":64}]]],[47,[[46,{"types":1}]]],[50,[[48,{"types":65}],["built-in:ggplot",{"types":5}],[38,{"types":65}]]],[55,[[52,{"types":65}],[54,{"types":65}],["built-in:+",{"types":5}]]],[54,[["built-in:geom_point",{"types":5}],[50,{"types":1}]]],[57,[[18,{"types":1}]]],[60,[[57,{"types":73}],[58,{"types":65}],["built-in:$",{"types":5}]]],[67,[[60,{"types":65}],[65,{"types":65}],["built-in:plot",{"types":5}]]],[62,[[18,{"types":1}]]],[65,[[62,{"types":73}],[63,{"types":65}],["built-in:$",{"types":5}]]],[69,[[18,{"types":1}]]],[72,[[69,{"types":73}],[70,{"types":65}],["built-in:$",{"types":5}]]],[79,[[72,{"types":65}],[77,{"types":65}],["built-in:points",{"types":5}],[67,{"types":1}]]],[74,[[18,{"types":1}]]],[77,[[74,{"types":73}],[75,{"types":65}],["built-in:$",{"types":5}]]],[82,[[18,{"types":1}]]],[85,[[82,{"types":73}],[83,{"types":65}],["built-in:$",{"types":5}]]],[87,[[85,{"types":65}],["built-in:mean",{"types":5}]]],[89,[[87,{"types":73}],["built-in:print",{"types":5}]]]]},"entryPoint":3,"exitPoints":[{"type":0,"nodeId":89}],".meta":{"timing":7}}}}
-
request-query
(request)Show Details
{ "type": "request-query", "id": "2", "filetoken": "x", "query": [ { "type": "compound", "query": "call-context", "commonArguments": { "kind": "visualize", "subkind": "text", "callTargets": "global" }, "arguments": [ { "callName": "^mean$" }, { "callName": "^print$", "callTargets": "local" } ] } ] }
-
response-query
(response)Show Details
{ "type": "response-query", "id": "2", "results": { "call-context": { ".meta": { "timing": 0 }, "kinds": { "visualize": { "subkinds": { "text": [ { "id": 31, "name": "mean", "calls": [ "built-in" ] }, { "id": 87, "name": "mean", "calls": [ "built-in" ] } ] } } } }, ".meta": { "timing": 1 } } }
The complete round-trip took 28.0 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-query
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-query.ts
.-
. object
Request a query to be run on the file analysis information.
- type string [required] The type of the message. Allows only the values: 'request-query'
- id string [optional] If you give the id, the response will be sent to the client with the same id.
- filetoken string [required] The filetoken of the file/data retrieved from the analysis request.
-
query array [required]
The query to run on the file analysis information.
Valid item types:
-
. alternatives
Any query
-
. alternatives
Supported queries
-
. object
Call context query used to find calls in the dataflow graph
- type string [required] The type of the query. Allows only the values: 'call-context'
- callName string [required] Regex regarding the function name!
-
callNameExact boolean [optional]
Should we automatically add the
^
and$
anchors to the regex to make it an exact match? -
kind string [optional]
The kind of the call, this can be used to group calls together (e.g., linking
plot
tovisualize
). Defaults to.
-
subkind string [optional]
The subkind of the call, this can be used to uniquely identify the respective call type when grouping the output (e.g., the normalized name, linking
ggplot
toplot
). Defaults to.
-
callTargets string [optional]
Call targets the function may have. This defaults to
any
. Request this specifically to gain all call targets we can resolve. Allows only the values: 'global', 'must-include-global', 'local', 'must-include-local', 'any' - ignoreParameterValues boolean [optional] Should we ignore default values for parameters in the results?
-
includeAliases boolean [optional]
Consider a case like
f <- function_of_interest
, do you want uses off
to be included in the results? -
fileFilter object [optional]
Filter that, when set, a node's file attribute must match to be considered
- fileFilter string [required] Regex that a node's file attribute must match to be considered
-
includeUndefinedFiles boolean [optional]
If
fileFilter
is set, but a nodesfile
attribute isundefined
, should we include it in the results? Defaults totrue
.
-
linkTo alternatives [optional]
Links the current call to the last call of the given kind. This way, you can link a call like
points
to the latest graphics plot etc.-
. object
- type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
-
callName string [required]
Regex regarding the function name of the last call. Similar to
callName
, strings are interpreted as a regular expression. - ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
- cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
- attachLinkInfo object [optional] Additional information to attach to the link.
-
. array
Valid item types:
-
. object
- type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
-
callName string [required]
Regex regarding the function name of the last call. Similar to
callName
, strings are interpreted as a regular expression. - ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
- cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
- attachLinkInfo object [optional] Additional information to attach to the link.
-
. object
-
. object
-
. object
The config query retrieves the current configuration of the flowR instance.
- type string [required] The type of the query. Allows only the values: 'config'
-
. object
The control flow query provides the control flow graph of the analysis, optionally simplified.
- type string [required] The type of the query. Allows only the values: 'control-flow'
-
config object [optional]
Optional configuration for the control flow query.
-
simplificationPasses array
The simplification passes to apply to the control flow graph. If unset, the default simplification order will be used.
Valid item types:
- . string Allows only the values: 'unique-cf-sets', 'analyze-dead-code', 'remove-dead-code', 'to-basic-blocks'
-
simplificationPasses array
The simplification passes to apply to the control flow graph. If unset, the default simplification order will be used.
Valid item types:
-
. object
The dataflow query simply returns the dataflow graph, there is no need to pass it multiple times!
- type string [required] The type of the query. Allows only the values: 'dataflow'
-
. object
The dataflow-lens query returns a simplified view on the dataflow graph
- type string [required] The type of the query. Allows only the values: 'dataflow-lens'
-
. object
The id map query retrieves the id map from the normalized AST.
- type string [required] The type of the query. Allows only the values: 'id-map'
-
. object
The normalized AST query simply returns the normalized AST, there is no need to pass it multiple times!
- type string [required] The type of the query. Allows only the values: 'normalized-ast'
-
. object
The cluster query calculates and returns all clusters in the dataflow graph.
- type string [required] The type of the query. Allows only the values: 'dataflow-cluster'
-
. object
Slice query used to slice the dataflow graph
- type string [required] The type of the query. Allows only the values: 'static-slice'
-
criteria array [required]
The slicing criteria to use.
Valid item types:
- . string
- noReconstruction boolean [optional] Do not reconstruct the slice into readable code.
- noMagicComments boolean [optional] Should the magic comments (force-including lines within the slice) be ignored?
-
. object
Lineage query used to find the lineage of a node in the dataflow graph
- type string [required] The type of the query. Allows only the values: 'lineage'
- criterion string [required] The slicing criterion of the node to get the lineage of.
-
. object
The dependencies query retrieves and returns the set of all dependencies in the dataflow graph, which includes libraries, sourced files, read data, and written data.
- type string [required] The type of the query. Allows only the values: 'dependencies'
- ignoreDefaultFunctions boolean [optional] Should the set of functions that are detected by default be ignored/skipped?
-
libraryFunctions array [optional]
The set of library functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
sourceFunctions array [optional]
The set of source functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
readFunctions array [optional]
The set of data reading functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
writeFunctions array [optional]
The set of data writing functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
. object
The location map query retrieves the location of every id in the ast.
- type string [required] The type of the query. Allows only the values: 'location-map'
-
. object
The search query searches the normalized AST and dataflow graph for nodes that match the given search query.
- type string [required] The type of the query. Allows only the values: 'search'
- search object [required] The search query to execute.
-
. object
Happens-Before tracks whether a always happens before b.
- type string [required] The type of the query. Allows only the values: 'happens-before'
- a string [required] The first slicing criterion.
- b string [required] The second slicing criterion.
-
. object
The resolve value query used to get definitions of an identifier
- type string [required] The type of the query. Allows only the values: 'resolve-value'
-
criteria array [required]
The slicing criteria to use.
Valid item types:
- . string
-
. object
The project query provides information on the analyzed project.
- type string [required] The type of the query. Allows only the values: 'project'
-
. object
The resolve value query used to get definitions of an identifier
- type string [required] The type of the query. Allows only the values: 'origin'
- criterion string [required] The slicing criteria to use
-
. object
The linter query lints for the given set of rules and returns the result.
- type string [required] The type of the query. Allows only the values: 'linter'
-
rules array
The rules to lint for. If unset, all rules will be included.
Valid item types:
- . string Allows only the values: 'deprecated-functions', 'file-path-validity', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention'
-
. object
- name string [required] Allows only the values: 'deprecated-functions', 'file-path-validity', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention'
- config object
-
. object
Call context query used to find calls in the dataflow graph
-
. alternatives
Virtual queries (used for structure)
-
. object
Compound query used to combine queries of the same type
- type string [required] The type of the query. Allows only the values: 'compound'
- query string [required] The query to run on the file analysis information.
- commonArguments object [required] Common arguments for all queries.
-
arguments array [required]
Arguments for each query.
Valid item types:
- . object
-
. object
Compound query used to combine queries of the same type
-
. alternatives
Supported queries
-
. alternatives
Any query
Message schema (
response-query
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-query.ts
.-
. object
The response to a query request.
- type string [required] Allows only the values: 'response-query'
- id string [optional] The id of the message, will be the same for the request.
- results object [required] The results of the query.
-
-
Lineage Message (
request-lineage
)View Details. (deprecated) Obtain the lineage of a given slicing criterion.
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-lineage alt Server-->>Client: response-lineage else Server-->>Client: error end deactivate Server
We deprecated the lineage request in favor of the
lineage
Query.In order to retrieve the lineage of an object, you have to send a file analysis request first. The
filetoken
you assign is of use here as you can re-use it to repeatedly retrieve the lineage of the same file. Besides that, you will need to add a criterion that specifies the object whose lineage you're interested in.Example of the
request-query
MessageNote: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.16", "r": "4.5.0", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1" }
-
response-file-analysis
(response)Show Details
See above for the general structure of the response.
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":3}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8066-71MIqIFsCv8I-.R"}},"rhs":{"location":[1,6,1,6],"lexeme":"1","info":{"fullRange":[1,6,1,6],"additionalTokens":[],"id":1,"parent":2,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-8066-71MIqIFsCv8I-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,1,1,6],"additionalTokens":[],"id":2,"parent":6,"nesting":0,"file":"/tmp/tmp-8066-71MIqIFsCv8I-.R","index":0,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[2,3,2,3],"lhs":{"type":"RSymbol","location":[2,1,2,1],"content":"x","lexeme":"x","info":{"fullRange":[2,1,2,1],"additionalTokens":[],"id":3,"parent":5,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8066-71MIqIFsCv8I-.R"}},"rhs":{"location":[2,5,2,5],"lexeme":"1","info":{"fullRange":[2,5,2,5],"additionalTokens":[],"id":4,"parent":5,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-8066-71MIqIFsCv8I-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"+","lexeme":"+","info":{"fullRange":[2,1,2,5],"additionalTokens":[],"id":5,"parent":6,"nesting":0,"file":"/tmp/tmp-8066-71MIqIFsCv8I-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8066-71MIqIFsCv8I-.R","role":"root","index":0}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":256,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-8066-71MIqIFsCv8I-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":1}}}}
-
request-lineage
(request)Show Details
{ "type": "request-lineage", "id": "2", "filetoken": "x", "criterion": "2@x" }
-
response-lineage
(response)Show Details
The response contains the lineage of the desired object in form of an array of IDs (as the representation of a set).
{ "type": "response-lineage", "id": "2", "lineage": [ 3, 0, 1, 2, "built-in:<-" ] }
The complete round-trip took 7.4 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-lineage
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-lineage.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'request-lineage'
- id string [optional] If you give the id, the response will be sent to the client with the same id.
- filetoken string [required] The filetoken of the file/data retrieved from the analysis request.
- criterion string [required] The criterion to start the lineage from.
Message schema (
response-lineage
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-lineage.ts
.-
. object
- type string [required] Allows only the values: 'response-lineage'
- id string [optional] The id of the message, will be the same for the request.
-
lineage array [required]
The lineage of the given criterion.
Valid item types:
- . string
-
If you are interested in clients that communicate with flowR, please check out the R adapter as well as the Visual Studio Code extension.
-
Using Netcat
Without Websocket
Suppose, you want to launch the server using a docker container. Then, start the server by (forwarding the internal default port):
docker run -p1042:1042 -it --rm eagleoutice/flowr --server
Now, using a tool like netcat to connect:
nc 127.0.0.1 1042
Within the started session, type the following message (as a single line) and press enter to see the response:
{"type":"request-file-analysis","content":"x <- 1","id":"1"}
- Using Python
Without Websocket
In Python, a similar process would look like this. After starting the server as with using netcat, you can use the following script to connect:
import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect(('127.0.0.1', 1042)) print(s.recv(4096)) # for the hello message s.send(b'{"type":"request-file-analysis","content":"x <- 1","id":"1"}\n') print(s.recv(65536)) # for the response (please use a more sophisticated mechanism)
Note
To execute arbitrary R commands with a repl request, flowR has to be started explicitly with --r-session-access
.
Please be aware that this introduces a security risk and note that this relies on the r-shell
engine.
Although primarily meant for users to explore, there is nothing which forbids simply calling flowR as a subprocess to use standard-in, -output, and -error for communication (although you can access the REPL using the server as well, with the REPL Request message).
The read-eval-print loop (REPL) works relatively simple.
You can submit an expression (using enter),
which is interpreted as an R expression by default but interpreted as a command if it starts with a colon (:
).
The best command to get started with the REPL is :help
.
Besides, you can leave the REPL either with the command :quit
or by pressing CTRL+C twice.
Available Commands
We currently offer the following commands (this with a [*]
suffix are available with and without the star):
Command | Description |
---|---|
:quit | End the repl (aliases: :q, :exit) |
:execute | Execute the given code as R code (essentially similar to using now command). This requires the --r-session-access flag to be set and requires the r-shell engine. (aliases: :e, :r) |
:controlflow[*] | Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf) |
:controlflowbb[*] | Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb) |
:dataflow[*] | Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df) |
:normalize[*] | Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n) |
:dataflowsimple[*] | Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs) |
:lineage | Get the lineage of an R object (alias: :lin) |
:parse | Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p) |
:version | Prints the version of flowR as well as the current version of R |
:query[*] | Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.) |
:help | Show help information (aliases: :h, :?) |
To retrieve a URL to the mermaid diagram of the dataflow of a given expression,
use :dataflow*
(or :dataflow
to get the mermaid code in the cli):
$ docker run -it --rm eagleoutice/flowr # or npm run flowr
flowR repl using flowR v2.2.16, R v4.5.0 (r-shell engine)
R> :dataflow* y <- 1 + x
Output
https://mermaid.live/view#base64:eyJjb2RlIjoiZmxvd2NoYXJ0IEJUXG4gICAgMXt7XCJgIzkxO1JOdW1iZXIjOTM7IDFcbiAgICAgICgxKVxuICAgICAgKjEuNipgXCJ9fVxuICAgIDIoW1wiYCM5MTtSU3ltYm9sIzkzOyB4XG4gICAgICAoMilcbiAgICAgICoxLjEwKmBcIl0pXG4gICAgM1tbXCJgIzkxO1JCaW5hcnlPcCM5MzsgIzQzO1xuICAgICAgKDMpXG4gICAgICAqMS42LTEwKlxuICAgICgxLCAyKWBcIl1dXG4gICAgYnVpbHQtaW46X1tcImBCdWlsdC1JbjpcbiM0MztgXCJdXG4gICAgc3R5bGUgYnVpbHQtaW46XyBzdHJva2U6Z3JheSxmaWxsOmxpZ2h0Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMFtcImAjOTE7UlN5bWJvbCM5MzsgeVxuICAgICAgKDApXG4gICAgICAqMS4xKmBcIl1cbiAgICA0W1tcImAjOTE7UkJpbmFyeU9wIzkzOyAjNjA7IzQ1O1xuICAgICAgKDQpXG4gICAgICAqMS4xLTEwKlxuICAgICgwLCAzKWBcIl1dXG4gICAgYnVpbHQtaW46Xy1bXCJgQnVpbHQtSW46XG4jNjA7IzQ1O2BcIl1cbiAgICBzdHlsZSBidWlsdC1pbjpfLSBzdHJva2U6Z3JheSxmaWxsOmxpZ2h0Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMyAtLT58XCJyZWFkcywgYXJndW1lbnRcInwgMVxuICAgIDMgLS0+fFwicmVhZHMsIGFyZ3VtZW50XCJ8IDJcbiAgICAzIC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46X1xuICAgIGxpbmtTdHlsZSAyIHN0cm9rZTpncmF5O1xuICAgIDAgLS0+fFwiZGVmaW5lZC1ieVwifCAzXG4gICAgMCAtLT58XCJkZWZpbmVkLWJ5XCJ8IDRcbiAgICA0IC0tPnxcImFyZ3VtZW50XCJ8IDNcbiAgICA0IC0tPnxcInJldHVybnMsIGFyZ3VtZW50XCJ8IDBcbiAgICA0IC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46Xy1cbiAgICBsaW5rU3R5bGUgNyBzdHJva2U6Z3JheTsiLCJtZXJtYWlkIjp7ImF1dG9TeW5jIjp0cnVlfX0=
Retrieve the dataflow graph of the expression y <- 1 + x
. It looks like this:
flowchart LR
1{{"`#91;RNumber#93; 1
(1)
*1.6*`"}}
2(["`#91;RSymbol#93; x
(2)
*1.10*`"])
3[["`#91;RBinaryOp#93; #43;
(3)
*1.6-10*
(1, 2)`"]]
built-in:_["`Built-In:
#43;`"]
style built-in:_ stroke:gray,fill:lightgray,stroke-width:2px,opacity:.8;
0["`#91;RSymbol#93; y
(0)
*1.1*`"]
4[["`#91;RBinaryOp#93; #60;#45;
(4)
*1.1-10*
(0, 3)`"]]
built-in:_-["`Built-In:
#60;#45;`"]
style built-in:_- stroke:gray,fill:lightgray,stroke-width:2px,opacity:.8;
3 -->|"reads, argument"| 1
3 -->|"reads, argument"| 2
3 -.->|"reads, calls"| built-in:_
linkStyle 2 stroke:gray;
0 -->|"defined-by"| 3
0 -->|"defined-by"| 4
4 -->|"argument"| 3
4 -->|"returns, argument"| 0
4 -.->|"reads, calls"| built-in:_-
linkStyle 7 stroke:gray;
R Code of the Dataflow Graph
The analysis required 2.1 ms (including parse and normalize, using the r-shell engine) within the generation environment. We encountered no unknown side effects during the analysis.
y <- 1 + x
For the slicing with :slicer
, you have access to the same magic comments as with the slice request.
Many commands that allow for an R-expression (like :dataflow*
) allow for a file as well
if the argument starts with file://
.
If you are working from the root directory of the flowR repository, the following gives you the parsed AST of the example file using the :parse
command:
$ docker run -it --rm eagleoutice/flowr # or npm run flowr
flowR repl using flowR v2.2.16, R v4.5.0 (r-shell engine)
R> :parse file://test/testfiles/example.R
Output
exprlist
├ expr
│ ├ expr
│ │ ╰ SYMBOL "sum" (1:1─3)
│ ├ LEFT_ASSIGN "<-" (1:5─6)
│ ╰ expr
│ ╰ NUM_CONST "0" (1:8)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "product" (2:1─7)
│ ├ LEFT_ASSIGN "<-" (2:9─10)
│ ╰ expr
│ ╰ NUM_CONST "1" (2:12)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "w" (3:1)
│ ├ LEFT_ASSIGN "<-" (3:3─4)
│ ╰ expr
│ ╰ NUM_CONST "7" (3:6)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "N" (4:1)
│ ├ LEFT_ASSIGN "<-" (4:3─4)
│ ╰ expr
│ ╰ NUM_CONST "10" (4:6─7)
├ expr
│ ├ FOR "for" (6:1─3)
│ ├ forcond
│ │ ├ ( "(" (6:5)
│ │ ├ SYMBOL "i" (6:6)
│ │ ├ IN "in" (6:8─9)
│ │ ├ expr
│ │ │ ├ expr
│ │ │ │ ╰ NUM_CONST "1" (6:11)
│ │ │ ├ : ":" (6:12)
│ │ │ ╰ expr
│ │ │ ├ ( "(" (6:13)
│ │ │ ├ expr
│ │ │ │ ├ expr
│ │ │ │ │ ╰ SYMBOL "N" (6:14)
│ │ │ │ ├ - "-" (6:15)
│ │ │ │ ╰ expr
│ │ │ │ ╰ NUM_CONST "1" (6:16)
│ │ │ ╰ ) ")" (6:17)
│ │ ╰ ) ")" (6:18)
│ ╰ expr
│ ├ { "{" (6:20)
│ ├ expr
│ │ ├ expr
│ │ │ ╰ SYMBOL "sum" (7:3─5)
│ │ ├ LEFT_ASSIGN "<-" (7:7─8)
│ │ ╰ expr
│ │ ├ expr
│ │ │ ├ expr
│ │ │ │ ╰ SYMBOL "sum" (7:10─12)
│ │ │ ├ + "+" (7:14)
│ │ │ ╰ expr
│ │ │ ╰ SYMBOL "i" (7:16)
│ │ ├ + "+" (7:18)
│ │ ╰ expr
│ │ ╰ SYMBOL "w" (7:20)
│ ├ expr
│ │ ├ expr
│ │ │ ╰ SYMBOL "product" (8:3─9)
│ │ ├ LEFT_ASSIGN "<-" (8:11─12)
│ │ ╰ expr
│ │ ├ expr
│ │ │ ╰ SYMBOL "product" (8:14─20)
│ │ ├ * "*" (8:22)
│ │ ╰ expr
│ │ ╰ SYMBOL "i" (8:24)
│ ╰ } "}" (9:1)
├ expr
│ ├ expr
│ │ ╰ SYMBOL_FUNCTION_CALL "cat" (11:1─3)
│ ├ ( "(" (11:4)
│ ├ expr
│ │ ╰ STR_CONST "\"Sum:\"" (11:5─10)
│ ├ , "," (11:11)
│ ├ expr
│ │ ╰ SYMBOL "sum" (11:13─15)
│ ├ , "," (11:16)
│ ├ expr
│ │ ╰ STR_CONST "\"\\n\"" (11:18─21)
│ ╰ ) ")" (11:22)
╰ expr
├ expr
│ ╰ SYMBOL_FUNCTION_CALL "cat" (12:1─3)
├ ( "(" (12:4)
├ expr
│ ╰ STR_CONST "\"Product:\"" (12:5─14)
├ , "," (12:15)
├ expr
│ ╰ SYMBOL "product" (12:17─23)
├ , "," (12:24)
├ expr
│ ╰ STR_CONST "\"\\n\"" (12:26─29)
╰ ) ")" (12:30)
Retrieve the parsed AST of the example file.
File Content
sum <- 0
product <- 1
w <- 7
N <- 10
for (i in 1:(N-1)) {
sum <- sum + i + w
product <- product * i
}
cat("Sum:", sum, "\n")
cat("Product:", product, "\n")
As flowR directly transforms this AST the output focuses on being human-readable instead of being machine-readable.
When running flowR, you may want to specify some behaviors with a dedicated configuration file.
By default, flowR looks for a file named flowr.json
in the current working directory (or any higher directory).
You can also specify a different file with --config-file
or pass the configuration inline using --config-json
.
To inspect the current configuration, you can run flowr with the --verbose
flag, or use the config
Query.
Within the REPL this works by running the following:
:query @config
The following summarizes the configuration options:
-
ignoreSourceCalls
: If set totrue
, flowR will ignore source calls when analyzing the code, i.e., ignoring the inclusion of other files. -
semantics
: allows to configure the way flowR handles R, although we currently only supportsemantics/environment/overwriteBuiltIns
. You may use this to overwrite flowR's handling of built-in function and even completely clear the preset definitions shipped with flowR. See Configure BuiltIn Semantics for more information. -
solver
: allows to configure how flowR resolves variables and their values (currently we support:disabled
,alias
,builtin
), as well as if pointer analysis should be active. -
engines
: allows to configure the engines used by flowR to interact with R code. See the Engines wiki page for more information. -
defaultEngine
: allows to specify the default engine to use for interacting with R code. If not set, an arbitrary engine from the specified list will be used.
So you can configure flowR by adding a file like the following:
Example Configuration File
{
"ignoreSourceCalls": true,
"semantics": {
"environment": {
"overwriteBuiltIns": {
"definitions": [
{
"type": "function",
"names": [
"foo"
],
"processor": "builtin:assignment",
"config": {}
}
]
}
}
},
"engines": [
{
"type": "r-shell"
}
],
"solver": {
"variables": "alias",
"evalStrings": true,
"pointerTracking": true,
"resolveSource": {
"dropPaths": "no",
"ignoreCapitalization": true,
"inferWorkingDirectory": "active-script",
"searchPath": []
},
"slicer": {
"threshold": 50
}
}
}
Configure Built-In Semantics
semantics/environment/overwriteBuiltins
accepts two keys:
-
loadDefaults
(boolean, initiallytrue
): If set totrue
, the default built-in definitions are loaded before applying the custom definitions. Setting this flag tofalse
explicitly disables the loading of the default definitions. -
definitions
(array, initially empty): Allows to overwrite or define new built-in elements. Each object within must have atype
which is one of the below. Furthermore, they may define a string array ofnames
which specifies the identifiers to bind the definitions to. You may useassumePrimitive
to specify whether flowR should assume that this is a primitive non-library definition (so you probably just do not want to specify the key).Type Description Example constant
Additionally allows for a value
this should resolve to.{ type: 'constant', names: ['NULL', 'NA'], value: null }
function
Is a rather flexible way to define and bind built-in functions. For the time, we do not have extensive documentation to cover all the cases, so please either consult the sources with the default-builtin-config.ts
or open a new issue.{ type: 'function', names: ['next'], processor: 'builtin:default', config: { cfg: ExitPointType.Next } }
replacement
A comfortable way to specify replacement functions like $<-
ornames<-
.suffixes
describes the... suffixes to attach automatically.{ type: 'replacement', suffixes: ['<-', '<<-'], names: ['[', '[['] }
Full Configuration-File Schema
-
. object
The configuration file format for flowR.
- ignoreSourceCalls boolean [optional] Whether source calls should be ignored, causing {@link processSourceCall}'s behavior to be skipped.
-
semantics object
Configure language semantics and how flowR handles them.
-
environment object [optional]
Semantics regarding how to handle the R environment.
-
overwriteBuiltIns object [optional]
Do you want to overwrite (parts) of the builtin definition?
- loadDefaults boolean [optional] Should the default configuration still be loaded?
-
definitions array [optional]
The definitions to load/overwrite.
Valid item types:
- . object
-
overwriteBuiltIns object [optional]
Do you want to overwrite (parts) of the builtin definition?
-
environment object [optional]
Semantics regarding how to handle the R environment.
-
engines array
The engine or set of engines to use for interacting with R code. An empty array means all available engines will be used.
Valid item types:
-
. alternatives
-
. object
The configuration for the tree sitter engine.
- type string [required] Use the tree sitter engine. Allows only the values: 'tree-sitter'
- wasmPath string [optional] The path to the tree-sitter-r WASM binary to use. If this is undefined, this uses the default path.
- treeSitterWasmPath string [optional] The path to the tree-sitter WASM binary to use. If this is undefined, this uses the default path.
- lax boolean [optional] Whether to use the lax parser for parsing R code (allowing for syntax errors). If this is undefined, the strict parser will be used.
-
. object
The configuration for the R shell engine.
- type string [required] Use the R shell engine. Allows only the values: 'r-shell'
- rPath string [optional] The path to the R executable to use. If this is undefined, this uses the default path.
-
. object
The configuration for the tree sitter engine.
-
. alternatives
- defaultEngine string [optional] The default engine to use for interacting with R code. If this is undefined, an arbitrary engine from the specified list will be used. Allows only the values: 'tree-sitter', 'r-shell'
-
solver object
How to resolve constants, constraints, cells, ...
- variables string How to resolve variables and their values. Allows only the values: 'disabled', 'alias', 'builtin'
- evalStrings boolean Should we include eval(parse(text="...")) calls in the dataflow graph?
-
pointerTracking alternatives
Whether to track pointers in the dataflow graph, if not, the graph will be over-approximated wrt. containers and accesses.
- . boolean
-
. object
- maxIndexCount number [required] The maximum number of indices tracked per object with the pointer analysis.
-
resolveSource object [optional]
If lax source calls are active, flowR searches for sourced files much more freely, based on the configurations you give it. This option is only in effect if
ignoreSourceCalls
is set to false.- dropPaths string Allow to drop the first or all parts of the sourced path, if it is relative. Allows only the values: 'no', 'once', 'all'
- ignoreCapitalization boolean Search for filenames matching in the lowercase.
- inferWorkingDirectory string Try to infer the working directory from the main or any script to analyze. Allows only the values: 'no', 'main-script', 'active-script', 'any-script'
-
searchPath array
Additionally search in these paths.
Valid item types:
- . string
- repeatedSourceLimit number [optional] How often the same file can be sourced within a single run? Please be aware: in case of cyclic sources this may not reach a fixpoint so give this a sensible limit.
-
applyReplacements array
Provide name replacements for loaded files
Valid item types:
- . object
-
slicer object [optional]
The configuration for the slicer.
- threshold number [optional] The maximum number of iterations to perform on a single function call during slicing.
flowR can be used as a module and offers several main classes and interfaces that are interesting for extension writers (see the Visual Studio Code extension or the core wiki page for more information).
Using the RShell
to Interact with R
The RShell
class allows interfacing with the R
ecosystem installed on the host system.
Please have a look at flowR's engines for more information on alterantives (for example, the TreeSitterExecutor
).
Important
Each RShell
controls a new instance of the R interpreter,
make sure to call RShell::close()
when you are done.
You can start a new "session" simply by constructing a new object with new RShell()
.
However, there are several options that may be of interest (e.g., to automatically revive the shell in case of errors or to control the name location of the R process on the system).
With a shell object (let's call it shell
), you can execute R code by using RShell::sendCommand
,
for example shell.sendCommand("1 + 1")
.
However, this does not return anything, so if you want to collect the output of your command, use
RShell::sendCommandWithOutput
instead.
Besides that, the command tryToInjectHomeLibPath
may be of interest, as it enables all libraries available on the host system.
Once, in the beginning, flowR was meant to produce a dataflow graph merely to provide program slices.
However, with continuous updates, the dataflow graph repeatedly proves to be the more interesting part.
With this, we restructured flowR's originally hardcoded pipeline to be far more flexible.
Now, it can be theoretically extended or replaced with arbitrary steps, optional steps, and what we call 'decorations' of these steps.
In short, if you still "just want to slice" you can do it like this with the PipelineExecutor
:
const slicer = new PipelineExecutor(DEFAULT_SLICING_PIPELINE, {
parser: new RShell(),
request: requestFromInput('x <- 1\nx + 1'),
criterion: ['2@x']
})
const slice = await slicer.allRemainingSteps()
// console.log(slice.reconstruct.code)
More Information
If you compare this, with what you would have done with the old (and removed) SteppingSlicer
,
this essentially just requires you to replace the SteppingSlicer
with the PipelineExecutor
and to pass the DEFAULT_SLICING_PIPELINE
as the first argument.
The PipelineExecutor
...
- Provides structures to investigate the results of all intermediate steps
- Can be executed step-by-step
- Can repeat steps (e.g., to calculate multiple slices on the same input)
See the in-code documentation for more information.
Adding a New Feature to Extract
In this example, we construct a new feature to extract, with the name "example". Whenever this name appears, you may substitute this with whatever name fits your feature best (as long as the name is unique).
-
Create a new file in
src/statistics/features/supported
Create the fileexample.ts
, and add its export to theindex.ts
file in the same directory (if not done automatically). -
Create the basic structure
To get a better feel of what a feature must have, let's look at the basic structure (of course, due to TypeScript syntax, there are other ways to achieve the same goal):const initialExampleInfo = { /* whatever start value is good for you */ someCounter: 0 } export type ExampleInfo = Writable<typeof initialExampleInfo> export const example: Feature<ExampleInfo> = { name: 'Example Feature', description: 'A longer example description', process(existing: ExampleInfo, input: FeatureProcessorInput): ExampleInfo { /* perform analysis on the input */ return existing }, initialValue: initialExampleInfo }
The
initialExampleInfo
type holds the initial values for each counter that you want to maintain during the feature extraction (they will usually be initialized with 0). The resultingExampleInfo
type holds the structure of the data that is to be counted. Due to the vast amount of data processed, information like the name and location of a function call is not stored here, but instead written to disk (see below).Every new feature must be of the
Feature<Info>
type, withInfo
referring to aFeatureInfo
(likeExampleInfo
in this example). Next to aname
and adescription
, each Feature must provide:- a processor that extracts the information from the input, adding it to the existing information.
- a function returning the initial value of the information (in this case,
initialExampleInfo
).
-
Add it to the feature-mapping
Now, in thefeature.ts
file insrc/statistics/features
, add your feature to theALL_FEATURES
object.
Now, we want to extract something. For the example feature created in the previous steps, we choose to count the amount of COMMENT
tokens.
So we define a corresponding XPath query:
const commentQuery: Query = xpath.parse('//COMMENT')
Within our feature's process
function, running the query is as simple as:
const comments = commentQuery.select({ node: input.parsedRAst })
Now we could do a lot of further processing, but for simplicity, we only record every comment found this way:
appendStatisticsFile(example.name, 'comments', comments, input.filepath)
We use example.name
to avoid duplication with the name that we’ve assigned to the feature. It corresponds to the name of the folder in the statistics output.
'comments'
refers to a freely chosen (but unique) name, that will be used as the name for the output file within the folder. The comments
variable holds the result of the query, which is an array of nodes. Finally, we pass the filepath
of the file that was analyzed (if known), so that it can be added to the statistics file (as additional information).
Currently maintained by Florian Sihler at Ulm University
Email | GitHub | Penguins | Portfolio