Skip to content

Interface

github-actions[bot] edited this page Jun 17, 2025 · 1 revision

This document was generated from 'src/documentation/print-interface-wiki.ts' on 2025-06-17, 11:09:14 UTC presenting an overview of flowR's interfaces (v2.2.15, 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.

💬 Communicating with the Server

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
    	
    
    Loading

    After launching flowR, for example, with docker run -it --rm eagleoutice/flowr --server (🐳️), simply connecting should present you with a hello 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.15",
        "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.

  • 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
    	
    
    Loading

    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 the filetoken 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 a filepath field which contains the path to the file (this path must be accessible for the server to be useful). If you add the id field, the answer will use the same id 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 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:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.15",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. 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"
      }
    3. 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 the RShell (i.e., the AST produced by the parser of the R interpreter).
      • normalize: which contains the normalized AST, including ids (see the info field and the Normalized AST wiki page).
      • dataflow: especially important is the graph 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-8139-EJKxAh15NbTF-.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-8139-EJKxAh15NbTF-.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-8139-EJKxAh15NbTF-.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-8139-EJKxAh15NbTF-.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-8139-EJKxAh15NbTF-.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-8139-EJKxAh15NbTF-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8139-EJKxAh15NbTF-.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-8139-EJKxAh15NbTF-.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 17.0 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:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.15",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filename": "sample.R",
        "content": "x <-"
      }
    3. 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-8139-6F5zKQsny7X0-.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.15%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%2D8139%2D6F5zKQsny7X0%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%3A204%3A25%29%0A%20%20%20%20at%20async%20PipelineExecutor.allRemainingSteps%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A263%3A4%29%0A%20%20%20%20at%20async%20FlowRServerConnection.handleFileAnalysisRequest%20%28%3C%3E%2Fsrc%2Fcli%2Frepl%2Fserver%2Fconnection.ts%3A144%3A3%29%0A%60%60%60%0A%0A%2D%2D%2D%0A%09"
      }

    The complete round-trip took 8.3 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:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.15",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. 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
      }
    3. response-file-analysis (response)
      Show Details

      The response looks basically the same as a response sent without the cfg flag. However, additionally it contains a cfg 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-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-8139-gCRm0xx0jlxW-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-8139-gCRm0xx0jlxW-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-8139-gCRm0xx0jlxW-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-8139-gCRm0xx0jlxW-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-8139-gCRm0xx0jlxW-.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-8139-gCRm0xx0jlxW-.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 9.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:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.15",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1",
        "format": "n-quads",
        "cfg": true
      }
    3. 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 6.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:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.15",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1",
        "format": "compact",
        "cfg": true
      }
    3. 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㠥)昲呴堸䃆㮺Ѫ禄�ᡐ䖪䩀Ʋ㉰៶ਮ䧵㚎䏁ၾ厡暙单悥䊶ᛅ峔囵䪵圙ᘪ㊭姕㜍䯑盦忔ฤҐᨴ䍐乳帪惓喰⻀㦑Ë嶔₴⮔઴䚲༛儒怷崕ḫ䜗庯娕㼏向纟䀪Ŭ䁗ᩉᣧڐਤ櫉䲓爴嵪₴╓ἐ↣⤺⭬⁗ೡ<䨦眈ف䀩ڪ⃶㠩ē卮㪌䬡ࣹ䆥暲忩⻈ⓓ犅䋒噕娯䣤ǒ㙍乖ᇽ䊵相Ჯ๬唥槄ᦶ溜⾑'䆬時⑮廗䈒㹏丐繿堗纠㑋⸥䁬仳䬦⊫䵰ᣢ᭵檸ᠭ᪡卐婶䨡媖䦰䇑嗰⚯΀⢐Ⱛ牊⡑܁剖䚰⹖ᬋಆ♚㗬春䚈↲䴏ㆁ㴪䕸㛐ᶤŌᇩ㎠盉㵌斨ॢ凚㣀病␢㈓冓ō㎬渥㞗㕅㤓व≮嗲⻋䦭ㅨ秌㰩䙰↌璐丨嵸᤭ֈ≈懱㬯涘抆㵩㥱◄⿑⺣俥絇䀏兓云ㆀ笍㖦⦱煛微໐硯䎂㋌䥕♯嘒⧊⥂䳲܆ⱔ槺⚭槀Ὡ戢搦ᦀᓭⰊ櫨ⱬ仨㥮◨朎ㆴ礲䨡禶␢Ⱑ⡊惎撿׀ቌ慑㜿ಽᚺᆏ⒫▄㦺℟❉ᶙ⡼ᕐ桫ᔲ猔⍲㛍䤭Ⅾ㖜玬冼母瑝ぷ畚佲Ɣ忑嶜䂫厍员紱綬ຑ樹஢〿ᖲ浙䭈歘⭀㏌晳䖲଀淌倾㜷护䶋ሩ眠稈᧰䂌ǰĎ慸懞噽㱲⥮ǐ䵐梊祩干捻Ⳓ㗡ሮ৭婁Ⲹ⊂痑И䙪糿䇿瑟䥳测凎繾䋩䘣ᡭᦳ⾼˿ᅵ羜憞斈䃌曘ޫ㤼嚩ᥗ熐⦣㨩ӎ♨㓿䉨厢䤑Ԋ䀦匸ᐦ儬攠Ǩ㋘֙奴㣨㧙ાᄂᭅઃ⛠ဦ⣚ு紼Ϳ墡ႁ穲ء䐬戦挫咝⥩࠯䈤⌥わᐉքନҞ䔹䓌䘝౦⍘๤⤢䚴㼪ĩԐ帳ࢢቕ㲤⊹ᤧ䑺ࠈ沮࢙२欼冼ඣ࠭⍘ͥ㒇䑠庬晐恑⌰凶᥽ᙂჅᓀ䈭䐠嶭ࢴࢱ⤶ৎὃㅞፑጧ㲏ᅢඵ䃬曩Ҹᚰᴣ⅜ዼ㣦䪙䓤扮ࢴ䪑䤲熦፳ࠢᆒ╥၁␤擂甒䤩椹䧕έ判âق瑒䆴储ℛठ䜺䇍ᕳ⍑Æ⚅䩨Ȅ侮妞䫠䶻ᥚᅳΤ㏺㹥๢❤䓫Ѧ䡹暲娉ᵳ᝛吒ⷩ䷓ኈ擃峁䪡㎱䤷ᲂ睆犘‡縎㒋㙃Ռ墪㳖䢩ࡴ摉䪤Ⓙ䕠òᬬ⁶ౢ䁊❲瓫沥ឍ䕄±㡇繢ᒔ䑍ʷ㒥幭Ԯᜪ楊䰄䀘兡珂攃䁌⧥㱰╔⑪ᤤ䯞⏸亐昢䑭㭺⺞椫ㆦ ベ㉹ⶅƂ˪绖⩮⸴䱸犜徫⑀悥㓠䖃碊溬勵⢩栋┠կ┪哋䳙拍⏇涒ᖊ婉檾⯵丫䔦填㵘⨮㍓嵥ᙴ秨䔛ⷅ⏠畼⣊䳕ች㉔㪌㒚橊狽⻥㽿斦岊瀴殯ᱶ⵪㟨沍加ϳ䛦ⶥ⓺姅岂嗝ᯕ⾱㎞吪凊ڳ⤭ဤ渁倪⽑實➤A᫔ᎍ㓔珯ⳑ溍⽺浞嶻练尓フが砖歎ᣑ淅/朽❷ⷳ囋篎㭓㆗孾㖖䆉盳泽坿ማ型滞㋁⊗ᖒ㙪寋ڮ⾽౱㵙倻˚竷㑕䍥呦堏䣻⺭଱ᤠ௯̧墺友㬰ᄬ㖫㠞潌Ƶ椣ự䎟ᤧϝڰ皴䝲෪剬㪴ᾥ߽嶴㧊᧛檐禕⾂̲侈刂湃᧶⎐㏢/䲧Ꮞ䘻ㄣӹ瓑濋㇠椃惵禯楇矜➤皶Ш䲞綊䈃ࣳ⥐巌㮺犓䜴硈磠矌䚽勡᳃埰昏崋媄䚌猭羗ᘹ值眙Ἅ单䁎㑦ᚍ⩼絮洜埦戍√ᱠ䄨揟庚ẏߜ朖紆ュ离⇔巅*⋫䵘珧儲㦕栂晭ഐ൅根B堫㑔⯹㒙㦊䝿䛕㓡Ⲕ噸㘂庳◶⭾㊇Ⓝ场敬甂ȭ焊嗻ⲋ㭓⏂㋋抋ᝆ毌ഉ⺙欉皥娻ࡘ஥㣗妒䣆汌嬞⻵绺⸌᥻䓟毂妸妔皊橎滥ጅ浌晆塡⏔㶈㬖䲋߼挏壵湟㟺淏弻ͭ᫳㸷㒎㙦簽仿洕櫿憴弅槌᭄㜯㓞 ᇯ᝞橌爜ᷖ游Υᵅ䊟㰂㡮夎Ǒ橃悱凝專䗑᤻Ჟ➦䑮�⟪瀾╛᱓穸ᏺ㤇⍣➔痡䪦䢹绬姬Ჱ筜䯽柳珘䞷㙯垄ĵ懳ᘚῌ盚䰑姧Ⱪ⒃椮ᾒᛉ皼下䣋䉜弃᣷䠌㟆瑎圛ຍ桲極რㆣٜ㳗ᇓ瞞痮ঔ亜璷П平傝簟㷅瘃哺䀿ⴄ䜳撳ᏽ弳佛症㲴甙侚益؋⧦捲㠠华㧘㨜㼳猙⿁耗༂ὕ络ᔻ岭宛空⺌ᱫ繵碖㘐Ṩ矟簃㷋碞◲ⴿ澶所甶㐏৛恮沥磫䳽㗔ὄ䚓箎㶿㶍㙱箜㯩༿浈牓囏㦙緇焠坮៚懾秾㶀ؙ―䮟婺㞺⼠᪬漧笜于妏秀ဝ搄罼磗刘※网焷䉄〷Pփ俽瀯羊ᥣ嚌㠏坴ࠂᰢ┌潉窋乜栾罕⢰⼣栌瑬祿娽堶售‸ნဌ嬩稰㋍స⾙箩厣★䞌㥠ᴣ䶄ὴ簋䁢瀲惵㡠ㄝ攎გѤ䘠爻┨Ʀ�ᠱ㝱׊䕢汩ᄛ㠰㨜倹ᒍߨ⏅䘻╉掏ጡ氉䃭祥䋢ᒥヽ碵䶢ش⃧珸㇣尻ܰࡘ㲌毢摿፸⍣猎妟ؤ⧣ဏ僨ט㉰愵券碱乂昇}∵ࡂ∲ࣕ⪿ᕃ㬋儝祃䋌㷍䣮DŽ㸢ᵌ⣢冃䴴ᒢ⑖Ç卂਽⣺䠀❜㈼⃆䗴⅃笁椑奢ʰ᪯⤚Ѥ係̵侎㠿夽Ⓜᢳߨ媃㓀璉㫰⬢䀶唥䓔⊃Բ䝕䖔㖂ⲣ⒙䘌㜡ᐨᢵ䑤䆂䜾墢䘓䬡朼㢽䖼㄃䜰㣊␘Ԃ涏ᄥ䛜Ⲃ戎悾檜⚃䙏碴܋ᵃ>礃ଛ䐲ᄺ愉٬㢢ٯ㢮䩢㲌碭ⱗ䖏䞴㰇䤑䕼☝ᦪ䒽禘㔝ᢾᮍ炲ᬽ塊Ӛڼ⏄撱⒤Μ⧝⸹⭚♲ⳃ牊撤˲刡ʠ擅䛸㱬㲶䱫䟋僢堤ᒦ⟒㣤ኾᬩ◼㾳䞅୙⒪㊝ᖌ哤⟨女昳界₊ء微䓛Ԋ⽲ڸ撷ݤ㋍㫋唝␢ㄠ嚲㓃㠸ẑڵ❇◃嬲㼼撾横᧲᪱ӗ➭䵰墧焷⒭䡒↶㓸⚌㒵憱䉻⛦⋑掃噭ႇ呒⒌䳈ˆ㉒儶棧炆⭒劻焢⪆₃䨳}▊ᨠဧ羕ㅲ㦃悸䀡⁶⫒㖿ई╨❒炸繆枊ג榦泂⟌䟓ᖸ癶枭䧓怍䊘䑊㛜⎁᳭ㅮ╳㼲䞙旆ᆒ纸洒普㵸斵䐥䒇䮠榴ᴒ栎⧰冭䳶䖖⣢➷墣枾ヒ䶺㳣朎㽓⌳ᴁ笾㡓䖰ⲯ╒⋲㷄泷曺〫徺ⲵ祖ㆣᦹ㼠ݲ⇒ၼ瑈ᕎ⯲⮾⳨ᒲଉε僴ᑁ㴪愄手ߞ㍢ᅅ�ᕁ䀒⤂⋵拺㊫㸻┪Ⅾ᎘疰ᒱ寱▱౾泝پ㩓ᬊ挖ᚁ≅㱴䲴掾オറ榞䞍̒ᬽ㣬恩㼓籾ጁ᜔㊉ᔭ⃲祑ㅳ抄ぱ⋉⦣橱挜䚪♂堭勽ᖐ㔄梊㋕ឭ失犨呷₉㚒⒋㊥∍੫㢶ᓬ惙㻫ұ㋈宙⾉㓁恟稤㑪䌱榀啚ⷓ㾾㓼曤㫒养㓨圙ᴜ檨咅㦥⚳牎⑷ᜄ㏵丵ಹᛏ坋匈Ⲽ埅㾃恾ⴅ瀲ର氨癜扙␒塵䐺呠໊൹ᒸ嘵⼳粭⪵炕㑴᮴泖嘭⽐㸀ᬚ唭㍊ය᫉噕⃪㢴㋪姭㏋㚺嫱⧱㷊Ⲯ⑁ߝ䍃慿ᅖ憂ފⶦ⋘喀ᤋ❷¥ᔽ㮋㭶ݖᖯ䧊䑱椦᝝ㆋẾ⋲⯝㚝呴竟喍⦜䞶唯垕㏓屷䳟咎ⲝ㓆摕据☫疶䎘㛶㐊羱㫬拃ₒ繾ᎌ㞭䆼咠ゕᓭⴭӼ✓啾✃ڤ✝᛽〲㓱✅Ѳத⽶ጙ୶ᖻ棻૊㚆Ꮋ䁲朑嬗䐺ᅌ᜗ᝍ⟔拸ⴁ㕰⣡㡶曣圸䴫砏䫨䖑⣋䫻㓭㛲䍱⑰囌圸坺呾ᛵ┴⽻ִ㛺ᓏ忂⎲ᛥ᛻⓻䮺┻㝠ᛲ⻵劎⟀Ꮓ⓴哏㙳㈻ኦ_㒎⡚画┠Ÿ┱ㅨ溂䤺⏎Å⼦竖竞᷅⿆戢取⤹⦮暴䛬�⺃ౄ⇈嘙歮湕珗㠩畼ᬵ员ↀ䭣㬓⯝㱚൶冗Ꮣ敀Ҏ䎤毖楽潠ྗ㥅䢢䆠ۂ㍌�⺇ⰵ僬c橕⤔䤼㸞楎洔䟌㵗⽎䤸柘㸓汾浈ᠻ⬚梌缕㵱淨ⵅ㈕䯂⩄マ磺朴砰§ຕ᳝㊗椄㯆寃娍湒桨嬭緖䶞䐖敃ẉ䚢窤ເ涨̠〯圴緿⳷ᐬ歃Ի潹Ȭ䂌帰Ɂୁ∴ᶖ澱Ꮒ゛ϡ漆佴㯟ͳ䑁杤ⷃЄ᧡噛㼺ᶀ῎䅛梉㷝⿴昔䭭乌᷅ᢁ伷Ϧᘁ簖௓緲⸊悯翏䏔啄ᬣ㷉緭⸸浦⢉᷂ᤎ璮⢝ᶊἻ 㖐౬ᾏম䞩䱣挍疁䞍ᚃ婰劔,ר縼‵䜤ᮃ堼捨<㎃孫㤍䙃勸绫夘㪜㚭攸禗穠ဃ̥磦狢㰃⤻壤䉟姥ᔹԚ竏廒⾗ţ塡ῃ㧨攋ٛ儝䵂䊚㰒㻨ゔ擼䝾彂ኹ⯅匪㲣㕱ᓼᯧ圸嬏浳ܑ哳敡㞐䙠ॹᠥᐮ碾峀ǣ䀨₄㒡梯渻ᅯ倊廧牂㍊潘団侽♂⣓暹≣笭䫭ⲽ徸Ö㼮เざ䃸ذ渃羾槺䰜掽ᴟ⍻ξ䎵ᐪℵ䩪㠏泦獾㧠⸵勚䅖㨓㬹糾朞㞎䎾峹暑䧘澵̍會ྒྷ䳣у枾㧎{㴁㎱㠓禭紖柪㻭䁬拡昼ᣠ⡿ᴜ様䤫Ꮋˬរ愓➼喥㴡㗭甋匞曑枫䐋↬Ź㇥ၿጔᙩ㿲≻峵ᜁカ䫐猝ឍᙋ晹⿆ץ㛫⣑䫪បᷫᮾጜㅩ㞨ż匇䷉㢫䠀⫰ᜫΉ⾹⿎䅹㏓疵ᬌ囙に⎹猊圕䖓㭼ଖ垥㍫Ỵ嫪៳刋瑹⿒䃭㶫䖌‿囍㓋᭼櫿ᝬ渻੥䌄摥㏺惼竪晚₻ὼ墠õ绘應略䍖⇟ਅⱲ扗໒嘇Ⲗ䝷ᖋ䷤泄浵ᗚ䶩䪆滛姞፮⺦痈凕䩨浚歶旚痽ⴸ⫶䕞ᗉౖ痆䷒ᬢ∆篆כ昘揿ಶ◝淣⮶柔Ꮥⷮಱ喖痓愨䂮犛䣵ଽ湮砍叟㗗琒毗䪣ธⷚ攽ߖ巾᧊伖寞l曻島櫌恷㦬⃡ᑆ䨴䌳㘷⋥᧘ì欠尯㳾倔珑㯡⑁䷎ᒆ䟧罾憥寱ᒩ沁Ś㆐ʧ橓柾㜮⤭㮀R൳⿜䨕泀璮⢷㊨ɳ๶㰽⏺ṍ⠖倧綠ᴪ栮倭᧜⫬簯ᢩΡ丏ฮ⍖ᧄ‚ĥ⢖簬᳒ମ◫䏭⎡悯ࡤ⎯ნ憯ኾ仅碒犸਍:䞇⭗篞᎕猉瓃墼揶ᶊုፙ掰ᾑ氯঴撞ὡ炇䍐䐑佁挢ኞ䏬ᱷ噯㲜䔥ḱ碮㷌㎶Ẵ㵛↗只噸價⏧ㇸ巤篇䖣㏰ḓ⇮㵐ᑈ᳡桮溚Ꮥ厩擃ና琌―`竨௅ἥ攼ছ㒺徒⇰ج೘ɑ㸖ᅀ䯆忑㝣䦕掿㯹戯ᦐᏸộ摮庂䏢徙穯㺓䏒态桎⪟Ʀ岕盏க屭爏☡ۮᅛ౐Ώ֕欘侕盯㶖䰞帔炎㦒ᮯở௮劓ᐉ必皏ᖟᯧ焍玎宫㓷帍掇࿰㏸璟倦眈㯴巬缒䘣攣řీᒪ勤摥᫓碥ࡊ⊆ゐ㱁⽕ぶᵹ㡈玡彙灯䎘䏱庙粏㞕᯲屝拏㲬厮У泋S囪ஞྲǑƪॠᆿ焄ߛᲽ昙ᣁ޸ţ显冧߳瀸ᄿ䤜㒏⃈⸠ᤕ剌㲅洏㤔ᰘṽ汯⍣㰂帙精ᖨ只㵵璵ⴞ枭搻殲Ⰶ␺ᵓ砏㧲⍓㹑每䂜ߒ嶣秱ᄝ߾Ἣ愾䤗ℤ扫紿火៛ㅙ筏礞珵㹪ᢾᬟ㯜ᱳ械笙圻㿉楗牏࿻瓒ঠ඗ㆨ懇湏ğ㟎㲣枿愒矡㺶ḿ⌙瞴㴛穾缑瀠紃桟䬐⟋尵洮┒⯙ᰥ签玙⭬糵排㸞侾窯៓ȷ㈞瘉㫦ᴛ倃怇笾ଟ、ṗ瑞㜲澨綳機Ḕ箵唯撒撐緱㞏択⠺䈭犉៟ⶔ䔍琘㶙⠞侼糅潞斘ྷ᱗摟禖堐繭淞㎝င˧秽᠒㾴Ý稶Ⰾ㈜汱忮᜾ව͟妾۩䌭�縼⪓浟⏝㴒៭漿ㅫ猷䯾咙☃ឭ㻓禅洟̝〓෥㽯絕睿厠ᶘ搌箬瀨އ桹㰢䀨࿥㹦Ҁ೗娚ثᴬ}弗磀ặᏜ紐௣Ă僐ཏ䉾㒙Ⰹ䟍㺓笰᮷⅝垐翮睕縄烿坾㨦忣悂ĺ㮈ᤠ䬘㪧⨮䜱夬౫堌搤礎䮳纘磟枷ᤢ䖐偒ὕψଏ䟔匦济灶Ᲊ䆴槠粬䢶硒㾞͌൛䢡ᬤ䠷ぱἄӈỿ㥽樭偔⬠䉗ᘄ坸ἐ笢氶ᛞѴ沂ᬀ楧⑐Ⴞ嶢ః仞礤嘆羸㹱ڳ挰揼ᨩ⵭ბ⇶又㣶䬰怡慈硺䍈तѭ栗䢥傠䖩儈㧰ࢹဵ῁↤޽氿Ѣ䨨呋罍㱼೿寲嚧稹桺ᬉ欔ᛰ䃣慑湥㸴⢽ᓁ໦ᶤ䁭ડ湃ؕ摰岢愨⡉得緆ೀ㧡ᨦ耉傆〧،ᒏ⪁ܭ䩧縿崻㑓佚侧爴㯈戒窤ᓏ㡣ਮ㟡愈䏟玨∁㕩縲຿懔冈櫀 ૗箔ᲂቃ⢬く䂢䍮ସㅾ௚᠆⢒縰䙴ᔨ峢㔩皳ࢽ̳烤┱嘦Ⱡ恘傈䛠ᚦፃ㰮᱈ნ⊡༸㛡で⸺⑬慴߼ᕯྉ沩剚嬨䧥࿰㧁㦊ƍ俚ᆨȪ݂ٝ䦑ᱛ侜␇瓘⦞䳣ᐶ⒌慂䘟濮᳃䀭ⱄ梦≆⌬ᶘว㸷箺呶䛊Ẁ竂㐑牀䢩䐙཈ぱ室㰁⒜⅝做ᅈ礽皮婂梾ࣧ狤⊚妑䞂Ὀ砱䠜ᄏᖣ䔨屔儛Ɇ璤⃱圤凮ಀ㆛碔䶸䳂ፃ࿦棱沞ব⃠䝥峡゗ᇶҢ᷈煃㪩屉悿⌭ಘ⦄刂䴻⒂e䚦Ᏻ⽰熮ᡄ䙳Лุ⮱൦崵呪ㆱ֚ᓸ汣㺩䉍惞抓໻τ⇤笳䢂傂䐖ᣈ笃椮็ࢠ⏋੬㛑䧥☽ᲊ䇭䚆ᵞ⍣䎯❧㣭抛໧஑噥⋨粂ț䑆ሰ潃₪屓棔搕ิ㌑䶒弸悚㫠◄概㙙夆ᙏ㭛≂⒢⋑⹱⬶ᱭㆤ䚰ᕘ怂䊫屐ӧ爀䩼⴬屄ଳ慄९䚄Ꭻ㶬息䙁罤揮๜⢱哦對璌煍䙵䱤帲⾨兇䍴籨䷔⫾᠉㢶粇ᇘ䝁ᒘ樳ጯɃӦᏊఔ┼䴘漹沌䥝䖦Ӡڝ䩫忨Ⓑ≰侔⠑ቤ⒳ᱴ䨓䓩᫄匣䩫ᙦg⇀䪬㓑揩䲱吢৅䍚᤟ࢲ婩橝⽧ϯં㬩毨沱沄准ࡊຄ侂᱀狣ḫ቗昂↢∈る㉠䦊䚮ᇄ厲粮楁壓拊ਟ呱␒⊲੻ड़અᴴ愲嬃䩘㽨拢䬀Ⅲ䋄砉≠䆿䗚ᢴ䮲窬慂礙䉱晴↚⋄▎⪁繋猶ॢㆀ窥Ն憐剂✊⨠廇倧㉤⠮❱ᰨ梲ẩ楁䓝ዲ䩔⬠懆䚳牰ㅣ☼᫔侃涒㉞ᝥ嶖䭲ℑ慄梳ᩲ⧎⟆ဤ即Ⓛ流䭮抎䶴冎擘焮ⱁဣ䓀椔孁佨垲哠⍔䷊㻑珇缵䉵椫㪯ݵ⟲⽮ⷬೇ十俋䰹搰‮ⱑ⤣⚵ᇲ㭼࣪⍇瓣扮互‹竆Ⓒ媋㈈昿ࢬ憨僬㗣೒㌁䣆㹰檩皿ڍᥴ䆂⡄凳煩损甚፷番㨱瓇⺸宺炪䅓Ṭ歵೫஥㹡⇀Ɖ䘩䇇簹ᙶ᧧❭ᮬ杒湮獎㣾㎨၄ᘠ盅斳囈硊కᰱ₌⦠ሬᢑ劝䒺㫉৥梾䊜樎⠉Ọ搑䛯歛ᓮ礕䵖㮉ⵣ䈇纻椿媛ᴈ㟒⎯⥑攖㏟ொ㇑㮆শ咿娗槃亽ᠡ凫罫่೗V㰦ۨ㜎ᄹ姥⁻ᚐ拒ᳩ孋䴒⎸伔奙㠡嚻䱯⇅旵拞҃໡嘪Ⳬᎀ䤉ᛙ篁㪄瑼⧡昇ᨼ幓懭⭘岴㡻俎㛲䈇ガ彅䐦䅃枅Ụ൳壢㲣∜䩧卤禅妵湽㇪摽ᰬ敂ᑰ❾㳓ጷ䷉埩䪸瞵ẞ祉礯惯ל㱭⍞∨懯䮇徎壅ε᩷熋搷ዌ冓Ṭㄯ儃㸟圞⌙⩛⬪乻♃〲▼刲⯩㽄礑ᎍ䰎㐙籪ㅎ⺒燹⡀司愩玡㉔䓠泰⬡❙䵤䨽㚉燚⑧Ꮼ勳ᦦ情沲᧨⿪㈠∰᮲⩿䆺䭰曼斃㡏๟˔ጨ⦡␙ႆᾣⅶ奁楐噾㴁ᆠ⩙磚禤⦪㷙⠆ⶾ慸䤢䔰嬢伫ኡ☦㴪௶ⅱ⑥灄♪ゔ祫攛ᄲຫ⟬ᵃ磼獀⡁㨥䌄㌴其¦ᓯᇙⶪ䯪❁栿ˏ䢁∲壙ⅎ籵॒ᝆẂ粪届壋㴒㡜⢵䑅禨祦帾̚ᒔ伤⬑灣ᡅ䊮玿䧊㯙瘅Ƹ橰►狤夲漜䡈㍮ዪѷ敜ੀᠢ⭈౔◓ंɲ奪࿪䣕䳮独⤁⋥砆ɽቴ扵ᚴ徳ⷅ䕌瓐ᢊ㐉惨㗥Ⲧ₀殠旫摔劲氓᱌壒瓬䮘ⴹ⃶㤄ᙴ桤搩㭂ᕘᬡ⪤瘾䲣Ƕ⦄ᎅባ㙼㆗䗆ᙬ唢羪㍌潍勰㎖⣹⮅犅癰㦖旴攬昔珀ᠠἱ⢔Ƭиޅ垴庶䱚¿ᐮВ眡捎Ⓤ泆䩎⦉㚅殷智ṟ攵爢尪矫㽉ݡ坤⯾⨥㚹呵䅽♡ኔᓃᜂ䣫⏠ዜિஈ䪥㠑¶慰㉿ᧄ嚂ⳓ∓劰㗬䫘㔹熀㑥䰴₃簤ĩᙁ᫢忳⥋㽃㲬䬁Ⲵ឵乶牲䚧ᗵ枯Ꭺ倫冯Ⲿ㲡悐⩩⊵叅䎲䪗֓ᙪˊ売橏員⪾戳䢞䬰⾪ᔺ㕸Ć垲媒摊牎勒狑⬉⳷૵᭷汵癹嗏௬⊄⤐ᛋࣄ㙮Ɲ⡐ం䄇橱֌䗓❅Ⴢ介拉屸᫰欹ね⣼㑚ᕵ㊙ˉ器墲璪盌䛌甜㈶䥁㗑瓊㬨䆛ᚹ堅ሣ㦂ᡊೌ䓊櫵⧭⼥張⥷ᩳ唾❸妸㶋ێ౱䂊氒倏俵ച吀䯈㕾ᕵᮺ玊ໍ㛆ો䩽Ⲟ�ჶ羵係痼䧼墒敠ध䗭㫮恗ⷕ⧕䩵❽൭ᗓ呛ᠽ㜋㯉ݼ竭櫄㓄ᦱ⹶歸ථ炗堒径竊ᏈỊ᫠㈺侍㝵ፊ潶⵴Ɐ嗪嫒奒ᕉ㋅窩勿⿽㍵ἇ㕺楼疡檡塹⇐婉炪䢇悋⥌⧙礳僰涘㔺啋ቊ穪㿋䛓᡼ᯛ⤉Ჭ糅⣰〰ᚪ䓱傋ᤋ㽨╘⬉䪇⺕㔕Ⱐ᣻㪓ᖨΑ幖㨺㽓抪栱ᐣ⥃ၭ校⤢፾疌᙮娚䆋䑋⭔䊰D渳㻘孪哵᎚䷾煲ʸᔨ槎懘抔ᬔ檵♭ⅵ♼榈啄㑁嗦溺沥ᧃ㦃ᰌ渣ⴭᾐ祦㉥ဦ㓫Ꭶ宺ʦ⨯ڳீ汃ⶭ⭗涼厚ฐș娆䔺㺌䗃暷ᩴ櫄݁絢瑲煶෾㔹咶懀⦊ᣌ᫠宄椝㽕弆捳㍹൹㑘╘⹻槷⇙ᛪ媇䳑对䕧㇠๳෸曏Ẓ揋沎姓䛬憺槇吩䔄埥ʆෲ板ᲂ・墩㍟ᜓᩚ溽㑍䤄筡ᮔ問䑅兩ڙ◉ෑ岬尌ㆱͰූ⛸纞ฏ員嚲砊憍㙍㛝娠漳ግ緖僿摈Ԉ៾庶壻ප㷀ᚳ䪢濮⑍扗仹⭂ᦎ䣥岂Z侏巜彌⇀ώ㚮穗ሁݵԗ↹勦䖻像䷈嫪姡沧ℽ䝖懹䝬⡡⨰䗨㘬亢䐶㡏᭾殀½⊔•❢穹吪唦䅺➊ᇌ皥婱惇㮰⪔槽㭨洌瘳嘠ㅛ┉癗今㬌㘷㾽埅狹箃ᷡ㙹尖歛Ⓝ௉桄啉漷⿢ᖗৼ㛂冪睳岍ⓛ揊緕䛹㩹歧⟔涕∫垚㪆畱⾮䝛挊䐳ɤ㗙⢌䳽ޖᇲຒᶽ㛃哆殂⼍㭣㥿㩝匊㊽嘉怦⺆渔ᜬ屎䢚戈᷎匉媱涻⤕㛵绺㞐㷃檧差扤樈ᨦἛ宥槤}媗Ỻᮑᘙ瘷刖绛匎緈溢㉭殇㊽̗⧸ᝨঽ䖷哾冚稈㟉⻐ᫌ䌏≽囔ᖸ榁畿囷帎數渎⯃仦竵檿⍽弨篶澙帓瘋峦篛ਉ࿐嫑筳涿❽昖ⷷ潲絣℧叞線缊毀绷㮮ⳏ⚍㼶㷷᝽㴪瑿堎憅఍㯆滢㯫晐ឲ䞔άǐ嶿瞟圎筻㠋䷞绍簋椇‣↧矹ė䒠࿟唰㉻⌌叉Nj筷渠旕┕㫲佤Τ盀㌞䨧妈৘Ṗ㳩湅≍ژ⯾䃰縒㜵弦佻঍箴䇀㬘楀簐Ӕ柊㝁ᖦ摠槡瀸栾版℔΁瓠⑾氤Ⰵ႞ƒ磿妡䜛એ睚璶⃘᷋䥣恓ᑆష湝瓈⧁䬛Ȼ 佷㱤ᬰⱣध㸉ᄕ㻲ే刡嘦弈⢓⺍ۖ瘺䍣ⷛ俥⵽䙘䇘ぁ夂䈸ᢘ得㳫眷䳣㰤ⱛၦϣ瑉壂瀋碴碌啗ࠆᜱᮣ㔅䧀䣬䵞ನᒁ灴ἔҗÿ㲄ࡗ⏽倯෾ĉᒛ㥒廔䱪⤺䣷嫸䷊ᬐ旱㒮౔ៈ䍹ഀ᥿ᒧℹ傈囘ᮉ⢀晃഻⩞খओ癊ἤყะ࿞初߲᪈磣ᚬ⑜ࣾ⍵瘻劮堦瘼㼴㇂ٗჸ櫺䬲䤫⎅祏㜲埑䌰甽⁐彿ݤ೨恃嚯䱘壬䐁෰㏱犻䜸⟷䚷䟧ႀ൰㬹濥礉探լ㣱䦜☾撍冰䠒὿≃ዔᡓ磹⌵朣娑夓⭌䘴⡊‼呴㕥ᑬ᳋儗䌠丘㳱痧猽撟澐⟌᮰牃剗䀬䔊Ꮮ⬑冩畇㊶⊒*㒛棤榳絈♖㤓帷಄㹀䡇㜾኉ㆢ䚌ᵸ渥䩮㺆擪䐂佚ߡଘ偐ᲄ弁䬅ᵨ眳䮮祓㣢挢俼㭡睦⟎⧉⦰瑩ŗ幵〨篰㐩司乬㺑瓦䂻䲒₭☨ఴ戳䞮畚汹叫㞩䜉凘৲座弘ÉȔ拳乯иԟ䐂෺㑩䏆媺璆ᬚ޴气恓喧㵘൒䉴ᄗ◁檇䷶⪊榰树ᬬ桃࣮ⱖ徉Ꮀ仦㫸摚榸㹣᧤⚘↠ᑐ࣡䅻瓽㎱䍐彮掊⊡⪇䨀⟵ᡌ揃㎷ଡ଼瓧එ䵖ヹ䠣䎾嚕掌㥔᪋㊓䜮͟礖㎘们ど碇刬檊懹٫᪘挍᧯弁峄ॿ㩸涮⭀啖亘积૆檷⇃䗭⹗䳮⏋书㻙䏦㪼ປ㧓晜㉜琉んㄉ刢‼䍣噆狋徺䀷稓㳓ᬄ竳僮䱗㴛⍄䲎す睻䪌㬻纰᜸睮䤫绨僔㓤擄䈻ޠ执䁈滶仜ᛠ帬笓㕮य़㴁㎁ྊ㌹圇ᖁ憒⇸✒⤃ࢫ璛䝒〣۟瑖⇥䤷䈹䲆秈ᝡᯘ爓ᩏི紅勦�朩巅ቸড়⼾穄ఘ琾໯磞⋪獐⹚㿹理ࡽ㙑◢摄ം㐦⹍僩俏௼仉㗹䔶᩺䚋⫺ᙽἏ啞◵䯢⢷憧༬幾̔晸䆗᧡᠙ᢜ棓㡏㓓䄞幎⻺∅巁㋳炓娾篸൰穋㧯ᓐ崊厶⿉㘩暷Ż妜▾概幰縆ḥ拞ᴃ˅࿘㴈ㅶ䩸៼ּ暷ᷜ桫㗬˔紆⭚⽳武䩦祹㖇䐡ᬀǺ䩀ᓣ㞬䙯̭䮁෵潷㜀▂嗲ឲ巔罓䩎筟㖈䯩矫姎ჶ啉ඝ槀磚奺柢ゔ㛓❥ၱИe6櫆⶗㘝埦ᣜ狝⯮⛜崔毶ⲩ㴹墶䵹皤痆ხ壳➋埌໙欗⬻㢱ރ৷㽾瘫旊嘤射绳⩎㩛㌃毡ⵍ㏕恗⼿ᒇۘ㚇刦篼᷎䤢㤝จ洩๵犰⩹媆瘈ᛲ姒瘭䛌懘縩欸汃㵅敖䉣⎛嗯☴姺熻㇍燔䬇㍳ⴳ㱅絷獾悑㖪㞹弹帋ڍן⛵▅䃮瀕件ዿ嫷ถ柹壒玻嫏糝⋣欫ⱟ嬭睶㋺䄱有㜫㌶㋤Ꮞ䟄Ậìի㱕唀ણᮎⷋ噙屆祻ࢍ筑䬔ᰜ湪ҍ旗⛾㿚嚽垭嫖痺ㆎၘ桷歬澕㞘棁䇽㎞ⷪ囨奪看抏滕ܚ寥຋㕲墖ᇾ箔᷀皯汖枋ܮ睕䜗⮙滴嶺出泾䞚疺圜岖溋㖍科因宥潘㯙纷㧺㞋ה᪖峲ઐ቉俴㫤⑇⶗㛨㗗ᇽ宑⸛㛋嶺潕䔍毜代㭵ᘯ㏽乕㲈ྕ᧥矞徾疛昤䧇漅ල溏㴠㭆᝼ɔ㶢㝋弦犛㥖毛ㄈ卋澗㗝烖᯻往縕盂ʩ囒̍⩶绱憧㠅劝搶惹皖֦噽忎添᷍㿐缋笡ᨧ厽睶厹澉ෘ྇ᤄ纓猍淖㼀ࠉ⼠璽嫦恚ℙ嶬益⡜斜Ꮝ䏞㜊㮭ܣ㌽勖ᏺė下癛⥳➋㈾痙伎∕Ч㖃ര㣸羊၎້嫁招彏俗⇵筂乐犕缮㣹㞛嗉ุ䔁眼ᄍ⩹ʀ䠈Ἠ禣䥗➍࿗ώ᪖奱疧放燠初Ხ༐礤䦯䷹ℑᗔ໧壡暋儿⟐懴⍬Ứ睮ວћ焍掷٨㮦楓㟸႔㎏䠞䶮΍繗翾皞揌ဈ㼱秧�粖嬘䵡ᵎ怽撧摟厯õྌ㽱片䴿᧽凭筛⻄炃穯椑㾌ᷗ嚴㰮綧兠⪒Ỹ❞Ⱐ玳䊗⓹Ė㷜่㻉盇༿䪕章㮈ᘵ暳置氃唁ⷳ矒㯚枻ㄽ੓凹൛⴬獩扗Ş疞㎷瞾ਟⷫ㉅ූ硫慃᳸癓据፝⮑掸义᫹暨瞧ખ姫笫嗄玓桯⍟Ԋ昘睆㹙窇ʿ㫗㧬䝵ᓼ瀽劵ᕛ紗㎩围㡙稇⎼媓䈛枻⿩⧸囮冠ރ∊悮⸁愷㟢㊟姤➧ṣ㸫䴖㍙㤛玪祱㹉攷枴粝櫣䖉㑊㧓价擛⌑珴埙嬥歧世熒㫭៥ᳲ瀽囁灚㯍ٶ⺔᫑粋㹏冔秣᝸嵒罁摎儢猖㦯࿅㾛䁛凢庻戂埔屔熫桎招攙䯩⹵㹉敷Č怦怴₾༐碋燏㔼̈⯚⼃崵槻氼熙ᗹ垝ೢ眭凎焽ጃ勥䏗娅橌�㶚嘕Ⰳᲊ瞋瑮潘䤎ฟ⾪㭸⦺ཿ䶐恟⭩༚纭䗎˛ឈௌ乡㷕曛垿犞ท⯮彏㲻粎敚枊ဲ刀䑚柷煒䢚⸙㜸&稭竎姚供ே཮㺁盗嵠⮙Ǻ㰈ƶ痻綎Ǽ晬ᠨ愹昁碗凼ᮖ勭垕⹒痋䓎秚哂㯌♜㹽惻রǛᆵ㠋ⴝ㓃ሖ稸㴍⮱⾇㳵栍ヾ抚瘄ަ嶴绸碚䓎೔䏻澃楎砛窾Ι䷩睁嵬箻䘏⇺㼁ᐕ䤿㰍㮋ⶌഥʒᎉ῵⭮ن叝䞋䷯濓㶍攇動熖ⷸཐ㼴甧砿俐΍ᡷᝉ㰭圯㌆愓⇨䝱ᾞ緋挎╋戊箺ḣ岋⁇㹔盒殞睘举缛厎࢙㜜Ⱂ♰祚恙༾ۻȗ枴䌧㲫梿杹羒秗漻㹝敻叼毹␏睂㱲ຽ䯎὘䨅綾ᝊ㻳狷獏֟◷ྷ洆瓇箎೽䦘厾ᚧ㨢浇瑎ʊ搅厛ὺ缧精忙ᨁ㰅Ểϓ榛䖽ᤐ曭伡浥㔮糆宍㷄痀廑毳篫๝攝⼗ဓ弑烡硾煾ؒΨ弑涭橋㒽㌟㧳佧帹笇戾㲚䊜ᚽ嚒笙符㣌忙癱䬻ḱ絫䰬写Κ㮷ἂ繓椯珽䴕⥭⾰ᴕ簓目倧眃ཪ澬婭碋ǝܝ渎〉尹獛慿熛ἇ篎庚墻滗伫唙嬙枴ቭ硛沏图⌙维滃妻积ތ⿘⮛侩㺵爓埖ᮙᏟ淸濟܅璏櫽暟旣佡䵺羷峾涘布埅弘箛晷㯝Ἕ爐伶ᾙ̴╮箕☚㟏庂硋砏⚖᜚㐀‘ṣ窥巾ㄘ⏗琟琞㯧槏樿䟖␎❈粙糗倓᝟罐᠉⟒緇渿絞伛∙ྷ㲵篅奿甘嘂⧠廉᭤熯擞㺏ⓣ῱㻩碯秿䤜⨜俔㻊⯄斗㯞昞巧㯛岴絏ᩮ曚ᔐ俁๟㾻総拞䭞䞋坊罢硻狟⥘އ叞滶筩拿ᷞ┗ྔ倌㺫琗磞㌉ⲓ堉㻊㣼⛇ώ渓渃ↇ⼛纏窰⏚基瀀羝煃碿ി᪗埽௯⽐縿梟䕞糜ᠨ縣奞ࢤ猐䌑ཱུ៽ⲇ秧১ᬞ̓䞽㼞綯绫礝琟棆㾥粘羿嚟ຶ㨥㟞圌ザ㑾嗎␗㈆ណ䀝窯䌦渞㠔㗓⊻礏毡✜墘呠罌ᴷ熻䦞䤝㰎缗䀛硄ᑾ樟ࠚ怅ރ纫欕使㺹〔痽纇綻痏ស⯶矠Ύ絗珟捿氘”㡍置嬳熯Ȟ㻗㟫眮縅炯珞๝砊⿫翗糄׳发ఞ䀣㵛䖷瀉Ү搭❆Ⴭ籀߉ʠᯕ叟ႎ曽㬘ጓ㐀䡩忄ċ₨ʲৠ৤ ☠䐞憹屛樳瀄濸䁾捎㑧㴟宝煟搟峟ᙶ曅簘⠫摋䁜䁮Ⅺƭ絥琈璿濟彧ሞ⚜┘搓‿埻椿åเפ֐෺毟垠嘞䩡ࠛ⠩䨂毬矝±Ƒ粸ߨࣄ࢟土ጰ㻝急〖໇㷠㗛᚝线Ჴٛ煰ᳯ咿ⓞ⯝䗉䰪ᠲ潷䚫罧ȗ㐧箋㎒䝀㑾ޡⱬᘦ䀒㰇⁅俏罛ĸϜࠋ㛶☰㉻О习䋩䠭௣࡙䲴佫囪̀竈ਨრ⨋⚡碢┲戬䠴濡႔䃕仞紂Ӎ狻桗䫿マ曝⤧Ⱞ࠶⟤ၸ䂱绋㰧㯍皐῟䣀嗞ࠜ堦⚠唅灄勜Čı洜ҽ痀ᚰ⛠稞㼜熹瀨‶叵傆Ğ䇽ˠ۪኏溃娏ᵾ࠸И嘮℁篵ϐ惏纡˦ُ烟楐㦀垮Ƚ䀧䐨䐈⡀㟌æ䆅ʰދ瞿暟儀䓡笣㜦瘱稍ዠ㾵朧绂䁇筟矿氐㊧╡⊜帛Βᘎ偂徶⃈䂠䏊㡤຤ᙣ叀糡᪽㈧縫䰿䁛�䄍䇶ᶖФസ᭰㛠稡ڣ⌑㨮∳㿼灺ႤȚʶܲ੤ᔟ宗˘⦣嚢ت戸ᗱ侨悺䅏ᶢزતቨ⚀澾ȝ㲧㏐䲠ᑈ殪゘㑶䃳Ё㉵⹡Ƞ棁¨倣ᬣ㘩ᑞ灼罳绫඾؟癘ᱨ⹰磁╢柡堮樲寷⢛斑晳縝礛烈ᯰ⛿աģ沥Ь爱䡜䷑冑缆䍍答தᶈ㷰条䣽㴧⎔ᾄ䡘綪⃲ự簽ѢಀṮȠ撎㲣䒧綐䀋淦灦羊们䈣о砐ᖀ㻰崎㪣岤〈㨴䱅傟ᄝ缑䈿祀☮䯰ⓐ弎ᓢ沙匮吱䱁⟘惭⇏ͥ玶த᳸㏀圎ៜ洂攩⨻௭⡰卒⛹䉕䪀ཱ乨㭰璡㤽娛澓ᅁ塇狗ݢ繣Ё笂ऄᦸ₰梡⡣接愯⸰翳䤢ト䃻䎡֋畴ᛀ⭐欁᳣⌑眮䘻屆兝኉Ķ粗۾࿼᱿䟐刁ᗢᨦ伬簎䡨�惤慾糾嬶࣌ÝḠ༁⬘g௕㚊⻸瞢焔慁䎷߶࿈ᔨ㠨堠䁂ڥ∠ℸɑ࢚ჩ偛䉩ޖଷ洘㘨䄁枑ದギℽ䉎ᢇ㞁店䏨䕭痔័⼰梁揣⾦ܮ績䡢梛億ᇝ崣砸ࠠᙛ唰眱᱃怛别ع䡍硬Ąᆤ˘䘔ࣅ樷墵ÁѨ㑦ᜭ嘳濱梋孌Ò∯䠶୤ᵀ㸻ᘱᒍ⁦彳㚃⁖䑲烚愺䌀䗞໲ቤ㝨璡♀璤㬨㈵偙ᢝ径䆶ʋݡ॒ᡱ䤀掁巌粦㸫ᠹ口୊䉛ಈ硻ᰉ༢ᢄⅨ宱╂䉥ᴩ屬カㆹ䉂䪾攑ϻ剰扗䶀䎄抈䅠劫傠籖㾳烡ᄬ⍁լ≪ᜠᭈ纁楍ᥧኮ縪䩗儩⤓⹦Եੵൊ᥈∭㧒ڕ慥₪㔏≅硱⣭㡭␊䐡獵࿴◈浱ⳃ封丅৏⑕ጽ⤑儼䄐烒୭椤㗨坱ᡃ♤ࢬ䨯橖㒁爭撻⍉mഺᲴ❀囀Ӽѻ⚪攴㩕咖㦖兡䋃磍ྒ᱉䦟㏦㫂ᝧ㩶㴶䔸瑡梩慆̠梵ဂῐ㼰縱Ꮲ給纩活穊⌽⤌၇⏅ܬ₦ᔲ幨東漝悦યؼًᒄ᣷冈挪⬌ウᤌႅ㩱䭈㣤•倰婂ѻჃᆪ⊱䔕०ᤜῈ挒ṕ㺚榭挹穑ǔD⺬㸚䝏ߒࠔ⺨櫱ག⼧棓唹晈狁㈮㇌掹䖗䋬䣴⻈䓑冩烧ᚬ⌰寪䲐䣴㇩⊅䒃൶ᰇᅰᠴ沃来ᱤ㬢殽䱻棴च揙䜹પᲬ㥸䵑⎂ᠠ䶭̻噘汤U岩⋒䜸Ȯ伒噆ᵱ垂㕱璬䇀㉆璈Ⴔƅ緂䓉഍⨌ⷸ烄㮃䥥㶯㬾ًᒘᰪ磇恝䗧ଯ⼯ᓸ䕑䖃æᢪ嬼乗ׂ㣨燅␃䛇ථᲴ㊙ṑɜၒᦫ䀬♒境似ℨ拡҇୺ᐬ㭘䦑͡瓤⪩挵⹙䱵兄燩⊛䜅๟揬㼈羁朂᭥檯眲ᙜ㱳墽㇩⊟㇐®ᕌ⭈崑ं狧̫崾㙉ⱬ⣰煫掬ϯໆ泥墈漑慩䗦䪪ろ簻㹛筣ㅹ⋯䑿༞攄ぐ䮱㘂૦倨嬵幄⠽⢻爂ၞпञჯ᜘徤Ⱔᆱ㗴·ಠ㲀䃨冴捓䜕ಞΙ䉒చဳ獑㪳⦀役ʊ磻凯抣䛟मႯ忽᪶⃈堫垤㬯䏺⒄㴢।ዳ䑠䲎៬⇐礚㈳綊寳傱૥㸣T㳻㥸■䯔ᥢ☘朑氲ⱄ呀緪慏㴩≉ᅙ紣バ䭄Ţ㶘搩✂姦⺦ࢰᅂ⊍ᑱℌጵୈ倁ᇢ㲸圩䰲㱆䂒怦党ṁ㊝ਃㆴ⑨䨏⊂㴓එ俜擤⊪䢵⅁璇䣪夆ᎍᅘ䫧ڙᓈ廼䜉栣ূ䐬㑒㑽䤝㢎ቁ窘休ᰂ㉤䘩জ假⦯玨ृ扠瀰䤪䏄楄ᆩṂᡄ囀ἲे㓷ୈड़寕དྷ牲䏳⡈⛩ᗻ坄戱ゲ෧㡬䒹㙚ቷr兙᎙ኴ䩩፲㊏३卣ŇӃ㈦ឱ塁区ᄞ哆䞰⎉ቂ傏⌒曡榢䝱ጱ橞ⲙ┍঵ዿ䒯⊉Ỳ⢄提ᆲ㵄▀ರ琱㉷⓱䥦焢♊Ȅ԰ΰ㺰淃ᐘ癮爪⩀犈ᕒ䦡扂ⓨ亡ᵲ㸨४厳筇⬠岸楞犎擓䧯Ꮏᆄ侹ቂ宏㎀ᄔ௧–Ⲹ㡱ƺ傔穋搇ݸ俎ᖒ↟㔩㍃䐳ū粶Հ株磵䊨匦簜伥ỽ䭼ぉ䇜Ⱖ䠮Ჳ祝㊙崮nj˰␧੓浒✄呩啃㣄䥯☦╍ੱᒮ䨘剶⣶㉉ᅸ೗Ŭ瓡៥穬ᒴ楇ቱ碖⁜匏䟟皒ᵸ⨘哩殲烇嚭劰ᕘ剰哣⡋֠Ғ䴀ת㡴曐ᠽ䊦ɪ瀯๺仙擃䥠劺✊䳌䔒㄄糱䬲㬥ᚬ䪳Չ灬哱熒后Ⓔ俵ᨒ㣿㽁ᵳᰡ畫᪱㥕抜哮⧣Ꮪ╣ࡉᒩᕴ杩斳ᝧ䁲墲៺અᔉ⨖ᐙ䞚┭်⑇ࠢ⓲䭆ͮ沴楝牫ᣠ⦜剣▆䲙Ḍ㌄沉塳燄桬⚰ⵏ㉱㓷䧇挫ⓧ༙ᾒ❄愨撘檠䧵㠊൙婠灶椦ፁ❦䲹ᮊ㵰緉夳ໆ橮ᒹ浟牻㒺槭Ꮷ➖䳭ᾒ↠㇎㉠彦᎒厨ु㪉ဥ哝勊Ӻ䥍ដⳔ籉析毆ᝨⵤ敞㪑甌⦓ᐎ☍慲ชヴ庉ấ䥅㜡庰㕂檝磴憕搛✎䰽Ὶ㙴暀䯳湇䑦㺺畕㉳┋榆䆏◢炍ᩴ㧴滶吱淇൬窺㕉䐼ಭॖᏢ⚶䤾ᱚ〔䟉⽳䢇殒亳͏ٰ儖⧬匶▗ด杪㓘熉匜燆ロ岲ᵅ㟑ᓊᥳ制▫挎ᰊ㼄筩淝䧇粗庱ҽ੸㒬槈㊃⓱䣣᧙庬瘹晳岇卩⚺㵔呷ಭ䨁匇␡䵻䜲ⵄ疉䉲埄剫⦳䵇汻⣟ㆯ揰╪䬳ἥ嚄搉曘㪇⭭⚺͛♷䔕ᨕ厺৲俉ጠោ義纳⒄婫ಹ㕛࢕哃ᤣ匛ީ䧅᥆㎬惩佒₄䋮ኼ獛檴೦᤽ኇⓠҽᧆ㹬桹磓Ꮗ䥮‵絀ᚉ䴌ਟ厂昭畫ႂ⹬幹箔䑁㭨▿༦ᚖ㓂ᨐ㋾♜介᱆㐔梹㷲璅˩抹ⵔ咝ⴋ᧕㌖❵䤃Ჶ⇰㒹䶲㑠碫熴呠♯ಣ©˿╶झᏚ⧌砉ᛒ啄ᣨ⦸፝ᠢ杯䈃㊄札乳ᐲ❬䰉᫒⪄Ⳬ妱͚䚃悥妡㊶朥䱛᪲┌唉墳䞇盫疽ᵔ噤瓗摦医▮䦛᫺㙸圉ၢᦇ曪斴૧ᙧ㓏天㎅䔵䪍ᨮ⟋໹Ჳ箄⣫窶啎ບⲧ䇝䊽ᤣ䷱ᖖ㧄剙࢓䕆ứ䖺捕ᙻ泱姙㈩散䨛Ṓ㿸翹㏓ą䧖α獐亘ⴞ妑㋩擣义ᦪ┴猉參溄㻬犾束࠾䳋儦㉅☙䳫ᚮ㚼䙙㛒㴅啫玺䕅⩢ᳰ⤠剏Ⓖ䫍Ც㾼䇹޲⬆ᗭᶺ䝋◘峖丬㏓⓫俾ừ᥼楱⎓ⴆ㥯喴䭙劇⳿大䐒䐼਽ᅆ㉼椉䮓ᒠ僪疺睍⪏Ⲹ妰牻⑅䭪Ṽ㵙࡙羓࠻㗫愽╒癫崇姁珪䝑㗫᠎Ⳍ墙⟒⮆ᕩા坕ẗᓭ⨁爪䔈俷᦮㍜䛉栬猄⋩ʶ佛Ṫ㲴奰猣撰䪼ᝪ㕌尞ぃ⿚೨劰݌⺋❼⹄狋曧䲇ᱶ⇜仹׳廤㝬玽ٟ᩹瓁祫劓晛䨝ᄊ㌼愙瞵䐆篯侶䰱㹳洌槌叵柏䵅᩠㤼戁崒㍅槮疺⩃㹴瓍礬剘㣥俛Ḃ├痙Ⱂ楄俭澰着಄㳓ᥖ㍴朽䢟ᑶ⼜絉ሢ泇⏭瓊⩔ኜ᳗䥕ᗲ♊໺ᤞ㜨缙᠓ࠆ侭tÓ溕▜䲀௄楝伟Ẏ㠢痹䭓⬄Ⅸ厲潊乮崇㘰崸㬅你厡㣼䅘獒㞇䷪㶳䥈ƕ峚Թቀᗻ䲜ᔡ㪜拹堒匄偏⧅ᵑ䆘˨᦮㊺⓴瑿ᦡ㨰稉⨓倅ᷭ㖻䭘ↄ糉槒௦吃䴫ὡ㸌卙䇜࠴塋收惒Ⅼ糌᧱獸摀⩋ႁ⦢䂥浳涇㡋庶獟䩱粫׏勥⑟ื᫾㪼箙戫乚狮暸ツ庍㓝䧁ፋ搭䣥᯴�㫮ℒ✅ⓨѻ房£ⳙ姮க撗䴴旾㿢䋙಍嘐壭精ࣙᅶ慡պ㏿枘䢿ᣵ᜜涹岪అ摌䁰ቝ䅥泮ոம昄⣀嫚⸜凹⊪Ⰶ⟪㶳͆纊䋈䃍ௗ杷ົ᭼㟬厥䈫盙宑∋䭓写紖爑犐暺䣿᠁⏄玹ഓↅ晊䑲ᝍ庌⋷Դ䰲᛬⯣擥呂榙䇜猴婌↽❣ƕ岸ᤸ୪᠝༊႞≼䣥䎪ଅㅭ瞺㣜䅥崉㨎捤ᔄ䫓ᧁ゘姑椲刵⏨➶杕熂̗䔮㋬ᖾ䡔Ǫ䤨痙׳悴翠ஹൊ橴ᓦ契નᑚ煀咚☲娠☒庙怠䉴坞⹤沱奶૧斛䵻ᷖ⦂罥ओ㼶⩎㒰ⓗ幮⓺▋猋╔⿨廱ー煥䷲砶᱈ၹⓗ↓崗լ䰑´⩋ᛩ㦲幅箲㕘瘴刬〤ɞⓣ᪃㊤ᚴৼ൉Ⱍҥ䮪〷⹌ұᓕᠴ効◝狕ថ矲௉⚂盾䖫圄囬Ȿ㣈㱦磋䘙琔ᗄ⦉᯾㳲囥ᷓⲇ繨摼ࣖ庀㘭䘉ઢᛊ⸆ᯩ㩢嵉㝫㺶剎ኼ೟Ñ匕Նఆᙄ⣰姩㚌狥摫̷ᄗ砀ፓ憓䃔旱䪾擴燈廎❒筅㡫ⱈ♮䑰ᣔᮣ䒪樂䮔撨Ⱡ徹㑲仹げኡ湈玾坁她峇䘄䯙ᝠ⫄嬡∿ฉ㎪怆ïƳ⃉ↂ⊢契䩡▮⤌劮➲䜥Ừ⮆❌ⁿ᳊๥Ⳍ䗰㎎ᜆⴰ媑⃒必戂ᔴ筊湷Ⳁ䚚猍斵爭ᝊ⡫ᛱ㢼䃩㏪㊴翬瀵᳏㺙⌌夺䪞⓾⬟➙ㆴ垥䕪㪷彎䱻睘剸〣⃷硝ᚨ佸ᨺ〪獼筝庆夫皲Ⳇ㥾犷敼ੀ圡⯄倥⠪晥偪瀷၌年Ⓛ究㓰ԯ獞ហ䷑ᅲ㵲淅眪ѵ㩍瞰Ã祥糵日㎮។ⶔ廹㋲知㬳㎶჋⡴泍⺈㊮䧣䰈啎⴯ᑮ㜪缹オ▅Ӊ湽㓌䖇㲡᤬玘垍炇ᚡを掅᱋磦⡏味㵐䖜㋞䖽䪿ៃ佂庆㍪唵㯓䩷࿪兹ೊ⯅ቓ☖䫕ǒ≂姢⒪啉滫ᱶ拮渋㋖养ᰡᨎⰋᘴ⭩ᖎ㷂砙宓婶ᅋ䅵泀᥿拊՚㍚搮⧨堅㷼滾ŋↇ㳍ࡺ捙ᖋଔ燄⮼吹⤓ᚵ⣢創氰氆䁌䩸㓅⦈䊺ᗥ⯯ᙩ⨘帵㪲祵浪╷㙏⥲Ùť⫃╃䩇᝷似僅㏊䐅⠒檵㋉䥶ዟ府䬜妽⬹ᘌ䶊婵㫼皉䧊Ⅶ綫Թ❚㥸⪮ᗹ⪌᛭⻂夒㶊䳥䇜焇Ⳏኴ䝞斆䓧ᗔ㈰囍⬂嶮Ⱂ欹㲓瑴ཉྼ൏ճ唃旘ீ噍प墹㓒䔾狳䵪♊ᱸӈ嚍檽奕ᴴႯ攰吭⹢⽵洫絴櫉癶ۄ൭㊲䩪ॊ暠〒喙㼪爥⃊⽶䦭䅾竞֓狓啨଻ᝥ⬜卥⟼紵瞳ᰆ乪啾拔疀櫃礻⪙Ú⴫Ṿ⯁ጵ⚊娅شᵶ䍘暓Ⲻ㘑ଉ❓⹵ᆹ⏬䃕⵲⒆癉㒸Ⓧ╽⌑㗮㋆柸⾝Ꮕ⦊庵㶓㓵㣍䭸瓁ㅶ拥㼟猾✊皺寍㌴ᕕ䳋僴峎暻嗱Ź嫣㗹䮀栁仗ᴠ㹊掙僃丅㥊⭳僅㖊嫑դ檥噶ⵆ妥Ɫ挵咋ᖵ乌獲ፉ᥹㊤槿⨵᠖⬜厹⨂䇥⽳歶㝍屸仝ᕶ䒳喘橝員䥮怕㥚絵䫋㐷੬❰惐嵾㫽┰櫪ᗛ⸆嚩㹼皕⿪㥅㛌徺㋛祣⪶敭橳咧⩤刕㖿ⴙ椓⶷ᯌ啲㋉窘ದ疩⬲ᕥ䬊埑⮂垹Ẫ凇㝩捼嫊嵻䊡ᨃ橦喥䣒凙⾊䡉෫⧷້ᦿ勃浪洍疙⬲ᜆ⣒峦㎚璹牒㯷僩獱仏䵸䬆ᦫ䰍ᕱ䪛ლ㜂㫙㠋༱්㥲㛟ඇ竊‷ࣇ⠟⣘䬝㮪溉ᅋ犷䟩ㅱ滔ᖒ嫘䗵櫀㖋䨡嘣Ⱳ圵⌋⳷९㝼૛൥እ疗樰㗀济婵⨚昭∻ⵅᩯ⴪გ䎕笎㘇㐐㕏⣁峌ઔ竰殊ᢶ⅏㑳⧭䎁㌋刘୽啣⾖徝㋒圭㵫墶煌㍸䣂㚋䳉㖾⨿喍䱽⹽⌂翅ĺі峌⦸൑᫅欇疒ᯂ暯Ⰲ巙╊桹渊し柋䃶壘ㅰ㌝ൄᬔ㗶⻺密㲒䙉䁫䙖炍᣺䓁䎘嫋᧧毌㛀檨Ú㴦悕勃㹕䢎罾仟㶀䚠丝櫫噀Ⱙ圙㲦榙淝㭴らʰ㫛ͼ笇ඵ氈㟌⠳ᆕ㯺卙碻䂄௏窽凝⺝ዂ䴪ᫍ᝵⹱圃⒲播呋Օ۩⻏糐厙ം畭ᯚ៫⦻ᣍ㈒穭傺⩔䪊彳䝕厘䚰⨊樬㖯⫶尳⾚䫕セ⩔◈歶᧏ኖ媭䗻㱱呠橹塗䌺䴕Ѫ㡖瓎瓵ᧅ⍪泏㘎勤圛⬶嗥▆璭֐瓄㚏㓻棍畺✞ණ歒㒙䱙凖㨆䏕↺橕囯壺ⓒ㙤曻畝᫊㜵䷄寥㐆盹瘋⼴⿈㣼竓㍯䳛䵛ᨾ㒄潑噅⏦暭ᐊ₶于㒾೅ᅫ✉㦡ୂᓰ瀓ጁ㗦叭⸪壖׊ᳺ●க㹻ള㏞㛲歉囥㣺敭ቺ屷榊壺׍悄⬃妞᭶㖒漑ᖣ㌺熅ጻ㭗悌˽罖嵮⛽姼媢㘵⬉♵⛅῭㨺Ô妈፱狒獺᫞䪭᫵❅⧥妅㮦僙ӫ睕ᒌ㳴䗋䆎⫚痥Ꮬ啉⨾干䃂䷍絺୶碊瓰䗙⮉団姴᪂堂ٶƅ㕪䡥⛋㥕煮ᥰ◔⺊挂ⶎ媆㚟䵥刪〒紵⎓㞇ⷫ䛼䧐⮂欇ⷦ嬱㛆⪉ᢻ㠬唉⳻曇ṍ其⹓楸ଙ㥺⮳㕚氊嚻㗶䚍⸫ᇖ▉撳ා浭➗痀氉憟⢅况⠚獍烺䷕宏䍾绚歷团㘏᭤ᘗ⻙哾␟⇍硻ᗕ皋૴滅獤抭ᘀ㉮㔋⨋ᄍ⏂懕㋊疅垏᭴燊㮎猔涑䵭擻Ⰽ溍㡲圍੡⡃垉犨ێ捫㚯䕉ᬞ昐溽婋╶涅㕺Ņ⏏⋽ཁ㪙曟ⷲ毢㖮檖兛㏆䖍緺嗖ྊ㒳緘㭴✃浛㊈吧⸅凋ⷒ刭惺⬴兊౽ⷋփ㌈疲尀痧⾊峓㴪䠵䧢庴Ӯⅵˆ୬૴䶛嫄吭⺹傓⢮峭ၳ撖䗎绻㷊঍直ᶁ歞吾䯙ḳ┶操易幕掍竴ⷘẆ㜒ԥ嬵㓳䦝帻⑮傍⋓犕䙉涼畝⺊伖涉歆㛩泣凱㄂䏥㵚Օ啩⽻嗅㵷໎畼䊛堜ⴅ᪇₆冽⨊ὔ䧴ㇺᧃ剫༉ᵤ婐瑡漶嬇␶掽䡋ⲕⴉ㱸㳗⭱䚧渖獁坞歑叇㠲戅´沊⍼䃁᎟䛵⷗㋬眃⼣屺䞄栥沺ᓕㄈ粷䷂敯ᚫ䴿嬂㘭瀵奧㘊盭⟺悔枉⫲孂⮎⺹䵃欝員䥰岷㗎璅൛㯷纍嗾ස垟̝ᵾ厜ᙗⶪ嫽㒎坽ᰊ䫖笉槷㽗庌滰෠檣◪ⷫლㆎ宽僺ẖ㌌䇰䛎൱⳵嶨氈嗴伹圑㣄䣭㓚硔㌍૪ൌ瞍仹䵯㏳╭⾈儗⺊纹䝺⻶厉嗽叓条㣎䧤᪪杝沚䋟丠Ѡ廴婒枳歆䰤ྜ㝐㴳㮈㓩沫墥䈾灝傛罱Ȋ䏰〬ྖ刮ࢬ碲̓憧壈䃰㙝㠡㤔ܡ䏾㯅掆滫ⓙ䆙⢳潠ٯ⴫㕝Ლ礕䇤㏼⟙ཊ䁹狌箉璓涧填⎎䪅䑌崗娎兤ៀ㠧Ọ㵔簄堳洷复㺊珕䧻喖植罻䗰侄庼冥䥵畓毁ௌ帺㇎㬅㊷㛳ਰ呏⾕〷嶢狾瑋椛哏⯖䌦⎚緙థ᯶૾⢝弝㵢ᖕ睾爏➏Ⓟց૚壷⤌⯱⧄殍弇㷾窽矛欮䷐䑞叀䄩㓩兄篵࿚捌㻙㘃寥♻洣嶏⡞犺⾛刖┩ሧ࿂洢㺸綪䃱ᄋ湗傘၈඙偊න㸏៿䍜佨嚤㷍䒋矁⏏庽᧞䖝㞚昖䋗䟻埍㱇䭾㵁寰琫檏刿⿞沒令㘖䋕៷淶皣ཱ奾箇瓳旽倿㪺䈍ማ㬖᠏࿻捡㾎浮恢㱆↛淇̒ㅱ∝⬸瘴合㡶俜ជ滦綵ㅯ瓜䡏寏⤞埩䬰引栈䃶翉㾈⻶Ե橽㝭櫯刿ԝ䀦甒␍毺具巜纰細ݥ⑿桶圫▞卍䴛気ฉ䁖࿕Ą〧廏笠඼朕戟✡䷔痚䐖ẩ⁗淹瓁Ƿ䋚篨ཇ䚿嘇䯄斥拚夰䐏⚼惛罶䋿紱㫣㜧混勠淴璶⾛㰯䝀廴䟛燐䇀㵤޳ᒰ‛♀瀊枂櫡ⲣ䐾㍠傎㐾欪࡞䡤⒱梡佀戾岀Ọ怉ᵀ墻矈⭱嚻絼޴殈᥿毀浡䆣Ɖ䨮嬣桞傈⃽䇽Ͼ㵤མṴݠ瀣ĝ㑛ሯ䭉⹣႞愋䈁吡ټథ眢䈰握簝䘦ᅀⰹ⡔祈⌱䆴渉笣痏溰㼀澋ဣ幕ㄯ氿濳愻ᄎ䆥䓄䄖栻涛⾰握慣痔朗慍䋵⯊潪⇫崠⡂ญト㱰盡亣犦笱਼瘮᳢ᠢ傿硣唚တ埏堟Ⰾ殂度ࣲ᫏মᢟ僮䶗䘪ⲩ僖μᛠ氂䞍Ⴛ耖瓐ⱟ壣⛆戙๋瀼ʻ洐ᣧ征湢弣䬯࣌䷿ߌ愋ㆃ䍞⦍ჼᰪ䟐榠㖀㻽䉄嬡ᑜ╸烫戙焑⶷痴ᵿ僰攼⟣ጽ㭲☹ඤҕ焇㑺⡠䠟◸暤㜂≡碕⿋Ⓛ愹咷㢉烣䈲䬐䟝惨䀶〕䜱绁憧ᰮ⨎㶏䒔घ䵲␃ㄨ⑟ⅇ⡻⫞䎔∲㒬ᄹ燻絓崣ᇐ愃ఉིᾄ㳬⳩।䬛ᨬ㊨缹ఽ⾏戄䐟߶ఫໞ᱈湜䅑⥦粯ᦪ樬ዚყ⒞冪䚹ྗ⯰嫈簼枂ⵧ䳦ᠥἦ啕㝏㣲刚䟅煤ɔ㸀箮䛃枓給䴼ᩜ殽Ⱪ冦&䟭ౚᥞᗪ⃸棹绂䟢㬃᱐狂焛企網䞲䔚Ე㈈籸汪䦊翗䞆䬹ಝ⣥仭⏑䙩ᐇਊ朸緱玔焉䚭∠晟ಙ⑤崞兙䙳ആᾔ㚙ॱ璃෹勥㠧Ꮆⷝ睸凄ωٷ㉶ᴀ෈渃ᎃ涃塹檭‥䲋夅刓ᶙ䞍᠕਌㥜⭈垃睦棁ᦩ矏橜㣱᣼握搓෵ຼ㇨栈噱䗦㲮〼晣搯宴䜒掇⎲䜒Ạ઒⮑洃ⰳ玭攸ṙ岟㖸㈝挻䙐ɾᾔ㞈歑䐃廧榔┼㙕䩉礐爄儯䠏ೂ䕚䃴⬘堃忦㥰⍪ᙴ䢚罦㺦捈熍ഡḊظ椢㋀㿧瞋窫㠄嗠ԉ碵缝甝ഽ⠬㿯⩡尃㷦ᡭ⼼ᅞ璊ხ燁兓⋟瓶᫟几瓡煃⡆ᑭ㠈㌰抙䱡灦㳤梨↪Ũ䕨Ј攃㫃Ɐ無樨Ⴔ⠷াᎤ䞈䴦ῢ㩚ⶩ悳乇潦ک䌵䩟䔛ুፂ⚰䷵ྡྷ㫨ᠩ皃ᵡ恗ᔽ䱮劆Ԁ傍ፍ䀽㟫椣帤绁氃穇澮ಽ௮伶⺋ㆻጨ⛔俹ụῴ㸡㬭⽧揤ԥᥜρÿ戚挠䞪䖅ऒ㼛㲩䡳὆ⱬ籁啨㢋攂䨈半ޯง䷥済慉他俧㕅劸㱓Ṕ呲ⵧℏަ⫳ဎ䟉ॉ䷅ᓆყ઻ቛ岗ᔅ⨆ㆰ)㌱漚ᗅᏑ珣ਗ਼㝖柌㻰ઓ宒Ȁ揅␊䱃⌬㿴挪伨摇殮༺晝㲜㔓熫嵶➢与ᬺ㧘欑䋳ӊ维棉ᭋॸ恆糰؋⚙⊍Ẻㅯ≩撕曋ප皼⍍⋛㔖䍽吙媦乕᥽ፃ⮢䷳勇剷⚉撸窗䆑ⓧ叒嬻ᚦ᾵岡⠉墳ࡆ䅬ᅪ⇾ಔ纈˰挶⬍໚ᴔ㢧㓎䨱杦暬ⴸ͙㊔ヵ滑ᕰ暱亘滻憬深䄽䇜檯ᴋ㥽ⲑᄙ㚫ᐂ䝱䱶⠭啋䗑捽ᗒ檮എ惤璯找䧱ᔯ⚹䵝ᯃ寳␉筓矇᳇䟆洠暒⎑坫厇♮痴漭 ᡹䚦⯇筬ᰊ屖䚋䅰姳厛➂瞫ά啌掉尽⋊喭㚹㕳嚖⳨懻綴晲皶὚㟌科纍ᑇ䕖伌ᅐ㚈䤁樒㣷㮍介ᯓ勜ࢆ盾斆Ᏼ㖹䭜䚜䳱姃却杝仏ⴖ㡷や厖繦䵯溺卐奜᳧ᨅ㸔㰍ᓧ᱋䍈翶卽ㄇ䧬ᴊ孜珒㵻姛㐂✐䰧ṋᖼ綶甾㞇ხ沺筑劑Ӽ㦻㷿㪆㕷Ḣ㓧㬹䖓ڇ⛭䖻⪶溗洀⧹叠曘ᚗᷛ媌灹岭澇⋮疈䶲ẅⴈ凒㏽晉丷᥉彳⊙浭㕳揬䎸◸泋ῃḢ⸱朎俊湚㽆㸨✓枦㗬窾᭞⫀純幃玀智垿᫾ㄇ⸉朕䇜潭㮾留ʑ泧䳇玾ᬿ仕–偆㼙扭淜俭➹兘ڇ崁瓑ᔿ曃㐠弞ㄇ⥩䲳慆牯㺍䃑択̗র፜ᮋ཯ᦞ㐬氥磕␶⩬ၹ秷䆖┊֧ᶥ䘿來ᦠস潙䠫娆濯䗌ᙒ⺘壺稔Ꮩ柆嚠⹎㐢煦纓㼦瑍猍ᝐ␬洃㋋㎇殊丳ᨹᩂ稙嫣娷㷭⦻敒⪕㵼䗸䶤᪂㙏Ữㄳ㸒傓䤶媗綽烜⭖㖊䖲琚᝷丽湉ᔘ睶䠃丷敕綿䭜㚇ቧ燻巿䟺垴࢔㛂耉斫䙺塎䁻燼⭟甇稐挣媏▇ᯕ塛▥䂫樶⣬瑹䣛泜ڑ㧯ⶡឨ佐寷宸༰㍓㉇嘵硻ϯ䁕⿘☋ஔ➔ⷍ᱇劲灥獱䊷⬚沊ݞ↓⌛䗵䏺ᚌ⸷ᶃᧂ濥熫㾋ⲅᎼ毈䧌垚㧽㫵᝔甕溱㎢炦竩夆㺕婹沇盞嵷☁䜍੆⴬壮㎲暙摫Ʒ䵆䙹❟緙㌄昂ᦖ䫦㛐怞㎼汅嚫㺷୏㱺㩻亊捩劤䭆᝙▰庹㱲↥佫滚厗穾磓䥁䌍滆௚ᯖ秗Ქ叵役䇫䞶䝏᛬❛禋೹⺽㌶⪨Ⳁ娂㸒戵檳搇⿭≽➲␺┒׸⯋檁ⱀ墆ぬ睶䅓㾷ᜭ牺䓓䥇଍漚㎩ᙕ÷猱ćඥ䭵牷旙慾惝熜啭ᗎ滥ᚚ奒屡ᦒ浴乓ᢆⳮ₉ት斎䫷䖦ᦖᘱ俺ᰂ䆋㎴罋嬻፮ᚻ⣝ᖎ徝於Ꮴژⱂ塸峔疅咓⌆櫌ᴋᣑ榞ೡ冡⭯ᜡ⼲俑㔻わ⎫ྶ曌䕼坕㖞㌇䗣⬥琍ᒺ岵勖㳵磫抲ᕌ湼犵⦋ӷ᫞㵪噃圈姩ᣲ籵嫉暶ᣔ囯獚䦌❮拊㎱嘭Ⱒ墕㢱⹕欕㣷֗⬤悥皉栥ာ毖囄ⱆ嫹㈪⭕事㎷⃏㍼ሣ◛⎊䘒୪晥乯ᨕ㨽⿑崃粋Ⲅ歾䭚ᚄ崋㗭㌶⬅⾏ᬇẲ暆例磶畎瑿᩵喕㶀痓疵噝⽅楻᧺柹䋋㢛Ƭஹ໕凞厄娀毮坷Ⱬ᱾㫼絕樳擛痵睺ໟ䖉㌁痒歫暞⾾巑岺粥犋屶䯏ᕺⳚ捎竿䗴歮᜕⹃ᦑ㹢羵溋媶⟏๽ֳ綄崄嘗欭枀䷈嬣㒀引渳䟶�൸坓珒܇᜙㥨㟍䱪塣㴦翵剃ɷ♌ヸ㣒溋⮟㞄Ⱈᙨ⿗ᩃい攵䄫䱗㸬͹懙敝ଉභ㐄㞴估多ᥚ憙甋墇㉏޾竕⊜攐֨䯣噵ⱨ樃㭺槙䝍᷶磮䆾䋒熚䜂ᇾᵦ囫曩夥䀂縕埫嵷ᷬ᝻竓⎛۳痰娝杭ⴜ壖レ栉滍㜷痎㯉㹟㖚Ẁ唅ᭁ坴沒屧䩂沙䒫ⵗД瓸⧙䝞䥤䗻嶪ᘼ疂巵㎪淭侣祖ⲯ㵎協揟ഛ㈐毁㌜淈宫㝆禱施䩒㺎೻秛㇈嬞痎ᮚᚯ⼞屙㑆潭昭峗ٍླྀ囑掌✜ⷱᮍ國⸑怒㝸滵纋烖⯬⫸盕⮋嬁෡殄㝚湅廔㠹㹼睻寚Ꮞࣺᣑ⮗⭨渊寧嘽䷱夎㙣⃥䄓姖懌୾渍㦆㬝勛䬶㞀㗫”㣆禍攫煖ᑎ㌾箬ẁ㊟殃宣ፆ潎婺暖綄䚺毖⥰䢓む䮣关ぽᵱ圉༚璛㩒䂨⯻ௗゎ泳ἴ箛盹⺊媿㝧䍝奝廪搭⤐௵梸ᬀ廃殁ᤓ岤崐皶⭣廝⋞ḡΤ㈭䍊ㇸᫌ緮ç⛚宸ᜓⰵ忀▮斣⹛ӕ䰨䝰柠恾⍢Ḟ揘巉汕惱實妽愊Ḹ缃▾揖≬ረ瞘ၴ฀໴Ή㉮箍啨纗㨋翂珐ជ墭⵻㈔㒲櫻ಮ悔猍䕖䖗໧㘿模垃଱䦾㮡壆玀揇␧㬝᛻⧗欻㄄ᯔ灗枡嶤婠㓞浖֩倚廽泝埛爊ලᏗ絥䵀ᶧ㭛⊽涣塂Ĕ幀俛墖䈌巿᯶瞞洊巤᫁瞶烧嬟࠙哈愩ፆ癓搆晙䲺஛⦨樫ᙝ溆կ㒾懩澾㴗樏ㅭ⟔琼㵅ћ喒䭫江⚃䰄擽篛㆗池ᏹ糞⾀桜㊆箅瞋洫⇤寉۝䖛刘㸎㯿矗ᛥ⻿淬悋䇟̗嶏㘴瑺ℛ㼖渎刴俟好塯ᖩ筇⢄ㄠ㜁㭦爘ᬛ昖ഩ៸濛┠%໦ਛ濹㿐性绩㎽䝅ⱓ箥䡯氼⒌д▰ᐛ㮐⓹穧ߕ枻A⑙㱅౿濊奃Ĉਝ搛࢖澌Ի፯羇盻縆丿皰䮟壨ఞ歅␧悗ᶩ]�瓠恚硾毃犚ంˠ缮ḝ䙠歘䉫恝ᠨ䄙渾Πࠚ煈ᲀ㫤༠᛺琞籠琾䏳ߘℑ假縃峄ༀΰ䀇ӡ纣唧爨簼塙⟮䀶䤘ψ報䅤ᰰ㦠瑡掣穰‖๹⑛短㸯繳楔⩺畞䧂儂䛡曨ᰧԯ✊㑙ຉ㝰战猢ࢸᡨ₤瑴⚁碤ጌ栯Ღ恟⩅愇䇷⢌氆ྌḶ⛐糈᥇ợ㲱ギ籞˯梻戺瀥泪䄜ᤵ⇤儡㵚ѧ匪㱂₧汌琳㻭؜殑ອ灄㫧ࣽཪ⮞ಯ䰲夒㢚ᖻᇽ᪀ĥ๹瞹攇婱紝䬼䰖沐嶆ม吭䁟ࡥ灝偱✞愷婱枦♈㚃⎄⃈䀬ᙗℽ␞ᄏ戝࢔䀞䱑溪ⵦ䕤宣ஓ宯椖䡅Ⱪ䠒⟤倬ㅿਠߝ૧盩ᖁ噟❪+แ慜熳綖ᰫ䳄ਞ塃绖ク㈾༃Щణ㰧搷Â堮ᱪ柘筪ޤྚ枮ᱱб㤬水簬Gცą卣ޒϺᘃ窔Ḱ伿Ṝ⩍䀵爎䊗䜮ࡓ揪Ș砑羨GᒐႾ流⊛┠)໦♇㮑傾㹛䊓7爋皞ၥ⧑Ḷⓤ筪 ½䙊❘侙炜㶤縑悳䉇庈†楜ᙥ┋縪緔䬽ᆺ፴戍௩烒㍤乯匒㲸䃻⢤⧾䳪夂乼Ϧ≞͉活ዽ淕棥祙⎬唅川洲䒠⯍ĥॄ׉碨竧㾩㪾ᶧ檘斨樖名⒋㓻溺㉟呢ታ卧᭮嚼㘈㪝䕄ᑂ儰值⣓⺈Π�᝘偰Ꮐ䕳嵟❯父䩈ⱱ姑㈂㊚㼔犼㔘ጌĈ堢ᣧ❯挲扚౛౉乵Ẳ䍬硹Փ榲㪄娺峅搵Ԓ⛞ာ油䥎䳒㳏ஹ戒㺇涊殠⯦क़爺姠線朲ᄻ᷻䃄䩜ภ㊠箮䦃ᒢᚐ〤姾㼉㍌例ᴳঌ硌嶌猶ᇯ疽Ყພᬰ⁋另ἓ乕⌈☗Čړ畤壮‎⍙窐乏槦〠枡佛ॎ㼻ీቬ⋂可焀怦᧦+娅҉䰮ࢗ㈂䏠䏹糎Հ⽮㮿戄溛檢秦爫杒儤憾㲃檙祬ଇ垃ᩣ坚㍅紝䇵玧瓗乲灞㰌続Nᰇ⣯㺽⃙Ӭ̖楆௺⠠è㡽沃憟ܢ帷၎ࡏ係ᵪؔ ᵳ泜あ咤⹗ሱ㷢灥梫䐠቎䡿栣撡⌆U௮㢑体Ё㢂繖 ྰ䯛ూ⹸巑㭂秥檫䴷ᮯ瀢⫧঑岼☍ᑱ᝝畴岑♂穥搝礷᥏㱽ᅝኮ匝ᵈ䮵ហ⽦攩㤢爝ū犸⍎檀埢斨ጠ癈洛ᝣㅄት䚒箉ᷫ側炢ఋ㳘᪖杷昅嶐䇔傈ːѴ∵洌╸烎᮳䋜壭ᓗ┗ᐙऍ乓涒䉪璗֔┷ᛠ媠㹘䌢扮ᗬ綮䣉⺭拀⏸樢ዝ盺ረ╿ዞਪ䬕儦Ⰲ㓹⹇䊪晊狸ᓋ䓌曎㿓ྨ揘⬇庸ゎ圼⢊尿䏊疵曶܀漘絿叅疗䬏慈⩦ứ㡂尸㼞ᚦ຋盄ॠिⵝ⶚橊佦殱㷻⸳憷͊笖嵜ዣ愹ᖁໟ斟ᄬ痰娶⃝睉⹑砎䎕紞烀ᏹ惑ᤦ漪䬄ል௾唗⺂૾ᛚ睇ᚴᙀ疵弭ᅸᶜ╰ฆ㉽呀瀑㇖惝伸ᢐ᯷㳎὿壟佉ఱ伫䠰䃎ຌἉų℈ḡᱎự惿ǜᯨⲰ丄ᰖ㰠濍䊉Ȁ壈䬰╗ᙙⰭ➃۫܈吢ᮮ杨湿᳃㴀ڭ抰ٗ曲帿㇚别䜙礡ᯚ㝜੩庫㦟兒Т჉ᐁ⃿ٶ䮜㸿儠島㞉䇹岟幍俍䙖㌠⽁ᵚ❃坄ᨿ䨆咹㝪瀃ᄻ㱶碼⟜NJㄯᇬ䟢実ܥⷼU㟒྾屼掽䇋ᘻ䲌㫉寡箂怤氾筄珛㠑ฟອ䥈䔦痫懇⡗⚿唡歯塾㗪᰺㐜ِὝⒿ澨఺҇櫡澿⍛溗ጆ摆奨ㄣ仫ẻͤ஄߃尠Ᾱ⊡喧㆑搴⠠)Р䚙模夢ᵄ⪭ħ橤暳㌡厫៤ϏÉ唁漏僰㵘枚䌗㨌㐝䡂䄛᰷㨼瑽枠গ满旾⯙㺝⼎巣㯆矉㡻怗㸦䒰䎛娐᪐أ㬦宓庚䇾篋疝ວ岞㦬範ಛ店拮ޮ௛ྑ搮㷱ᢥ眿皷忷㭎竝殾㬗搎䮭ⷦ羑䄟㸉刴矿潭ሯ㥢纝筛甗崎᏾濚侟㼔帜箢䣒ཿ峏㡔۝润㹀>ዐ゚地㒷㸁晶红䩦彬㭞疽璛柨氏綼悝ᔧȑ緥㯤ဌྰ㿟㵡稝紧伀纀寽墟怅漓䏣`ྫྷຘ㲠絞瘣璧昗爿偞䭝䄙礡緹㯇研Ẍ䉐粎糣礎᠗䎸 寝⤑䄐ネ槞歨䢇䎤斠㱈ᮓ䢯Ꮐ埿䒜ຝ∊␜߹ཱུ溩䝏㪁糽疧嚯ⰾⰙధඬ含ࡃS呝痼㺘糚Ꮑ憆Հ༿Ἰᙟ䢣爘Ᏹ山℅䣢㶘粿椳攊弿刿汛ョਚᏨ➨ⓉḲ㾤缄䤠戦儃崩繜筢๗๫Ėା掭␒㿤摉甤磇仃凧择儅㠈樎懸᜶短Ṡ੔秝⋭ৈ換溾⃧㑙䢚冶窯⟿㮝´䏚ᵀ䯤笘屑ʿ͝ኀ缷ك⌢栛媀㲄›Ȏ礠ྃ挾喿㚼㚝✲樋ற⨽個ᾇ抌罚粂ᤇ尠㶾᛼埣₝㨎ⷹज़俇‖㰬繩燽ਇ匘㎿㚰㺟䨥稙⅘⚊摺䈎㾜〥緈ᠷ䇯Ἔ䕲ش̞؁祈ៀ⿯Ẏ㹸䀴ห煱੏䑾̇⪝ኮ䘓珫柂䲷癑㰳⍔祔ᗊ⣀ࠀ㪽畝ਪ☜䯤៤ṥ⥕Ἲ㫅穁暷憄ٿ嚣⦜㣊㞭ᐡဪ恸䅖㺖ݗ䯽灖╀অ㳟禜ଔ䨕吏⨱⽜彘Ȓ绌䁋璙⧗兾狟䖚⬕缻䰟乥≒庆煴箹畉獷穼甈㫞⇹炢㘙㴆⮰硝痭㹃擕珺⽷寯Ⴘ㛝⓶፥㘐⨁垫⿎幷ᕫ㤕箋皭㪩浿㻜嶟ズ稊⯧㪇⾫ߴ⟚祵砋灤坏᣾矱䉣淅॰ᯢ㞶恩忛Ș翵碍浗䆠೿୞㬱嬘丘恒㠛婖彈↠㧖簡៷䖏䥿ݟ▙圕/䄓ஒ潭弣ᄦ禩磧䉗嚏䝾ۜ掙㬜嘖⯿堖潑怕ᅦậ㔶۷夏㫿ნᮝ༝簢㧺౉漫幧㴮綺ॻ焛嫈᭿毜枛北ḍ㯬ゆ潫徝㴎磵猻戲汳ㅯ㻜⾝ᱝ榫௼㺋潟烼卦稽玛筺璑㓡塐ᖘ䬓潣篿⨏潪徉㳖牊䠛気建῿ֲ䄛⬓弜՜ឰ⼤䂒᷾续狙ฯ烴㡟㓃㞥䂫縂筰橰瀕幛劁緣纽Ⴏ报䬰浲䠅᳛ᨗ射婳䯗䓫䳏䚌Ԡᝲ⽜޿ǒᤞ㈞޳ఒဉ硤ၘ绨ḃ⻧絝᠍䙞㵸夝࿤ℴ⠇࿽濠㻞屩稳灾穫ࢿ祟壄䌧᙭吣䉖Л嗦ᅴ籶⃳絇総ᅴᵟ檟⾥婤㐋⠾侬ἴ䇦燸曾ඇ栯䆿廉㚟媞ሕ㐓号⥣恸䅕监簟∇毯线㿜䕲憤稚柉ᕏ侰彡⣢綁竷⤷眯唿ヾ⅑̞儤␕庬⿲ἳႢ糈偞珃繤ٿ秠浕㥧弓Ń栆⿰怐↕ህ簐䈇滯瑿㋞皝焝休溨៽⿫㩵㻼繸䈫秓ᎃൿ㠠ᄉ的沏Ⰿ㰃⾯᾽㼗棅筋牗玅亿焉幾ᔲ丛猎᠞ྰ䲓㽅墎♻羋ਃ䌇凓堣嵝繯┋爛ப枰⿳˺ܒࢵᕌۈ椾࡜奞渞㔳墭瀑壻㽖籠沛糙繆⻈㷞柠彜ḑㄆ䐩濧ょ㻒Ϛ㳛綃澫丠揮᮰弘㸟㰅爔—㐿䀓␁ی碊ဏ叐㽀ឝⲛ儝㰖တᐛ忀信羢㲧磩ḿ䇿⒟䞜ᶥ␚䬨࿦ 矝⡁ᾣ籌䝯硓痔娐侜祿瞣對矯咂㽿㽩缝罇瀯檿洯᪞ᷳ娝帛捴⿲㈶㿌縲弸䞇燯篆㯿ᡯ箜稟ຜ䠟倏䡪䀈纥編箸畏汿澾㦞㛀ᤛሡ᠇廂粙ℒ羞手篤炯濊⫟㊟➜㘚㼩䐸ဆ῰䀆纀Ⱦ㠳犏斿凟㉞㼝៧搗㬀ῥ快㾛烙絋紛爞簏嫟䞟代樝㰜᠄ጧ怚㿗䑣纛窇粫罧滇勏἞散⌝倌ቄ僐罅㇙罧縇炀Կ䃟⶞㉝帚䌘〗ῷ忿Ṻẓ缷簗罻ǟ熟榞Ꮯᮄ砚ပ矢徨罖繩翻簇眿濨⃟嬞䨟绳砑借〔䬶罥耛羮⟱緿縍澟⌠☟ⓣ᠛ᄆΰ怟彮罇絽紧痃槟䌟嘟渝爽〖怜⇦翈Ĕ羖繧緗矟沟䈟礞䠜䈟堙怌耓୳羹縯皋ࣿ祶禄∠Я祻礯硒㢯碎㰏硳筛箻ͳ礋礴⊠֥㍀ԋ∠Ԡڎ硤䆗䁟窓穖ď篐㣟穷篋篟磷笿礵⎀ԟ私䁰ٿ箚Ă⢪㢀ޅ硓⊏ᨇ穗䐀ӹȰշ稿窰ڟ笕⃿ᣐ֌ㇰސП竃戨ׯ礥નԀد稀՟祠Խ竟章ч础Ӓ㨐ۇ竀㡨ܨҕơ̑箣榈ا禠ާ筨ܯ磋筠ߨݷ磛祈ڣ笝∈ࠝ⌈ѻ磰ոݏ窺〣∧福筍䇐ك窯礰ޯ窋箸ދ磒㡘֨Ҏ․ܾ㬋ነʻ碿橦ʻ秣磨ܸר֘ן秃笘կ穀ߧ㩤ވۜᆤވڤػ簌ᇄӘࠈڷ磤޷窘ڐҰՄְܕ〈℄҄Ԅڑከ㡐Ԁ㠨惈㫘޽䏘׻碸ߤшސ׷禨捔߯筑㉨㪪�جԧ禔㭔Ӕ؝䇔Ґܰѯ箔ݯ簚Ꭼࠔҹ㉌ӹ⊃㰓㣱T։穀ʘ㤝砸lݻ穠ۤ܌ڴلߠؘڣ礌غ䉰࠙⇌܌҈ټ߆ʬѠ桜ҌࠌѠ݋笴ҔҼԘּ݄Ӓ㣜،ݼީ䀢Ҥ֕Ⴘ㪌ת⧈㤨дޏ礴܏硷箜נۯ㨜ڣ祢ࠐӟ厢Ӱׂ՜Ԓ宂לظؼڜפقو޼إ箢Ԣԓ偲Ӱ߂㡢ލ勲ӢטӤ֯㭬ޘՂه磄ڲ䁒ۺ⎒҂㤂ӫ穀˲ࠂ߀Γ磒тӬԜ݂ѴҗKՌե䋪ޭ䁲㧲۝兊ْ۔ݒڜ䋒ф޽箴Ԑҗ⋊ۺ›ٲ㰒ԗ碭䅊ܪڪڊުגڲӂԵ⎺תީ䁚ߴ䇫提䊐䎐䆆ű䏯䁢惝揠䊭ɜ䃊䁮̌䄁̀䁸䇫惿᪭㥒ɏᏧጪ´值㡷憗ˇŵχ˫˃·Ô ɾग炅ȯʯdž抉Ĵ᪝磨ͰɍĴƚ�傠惙Lj㤃b㠰̲ñ憀̦ضqȀ䎀Ͱ϶ࠑČ䅰秠̨͌䇷͖ڭ㪬Ѐ�ݍᐋ㏙ᆛ懛㬥�䍊ʜ抈Τ䁿Ɲ禟媟ɺ䌮˟HȬ㭎ٴ䉱ǎԠ䅒ǒǂ䁎Ԑ䉪䂓⁷磷折ň®چƟ剪↛揲ʘȘɾ֖ߜ䉧ɀ䋖ܴɞԘࡲήޟĖ䐟îڪǮۨ䁎ݧ祎߾䄝ĎҟϾ䋓aܠ䊆↉偫挾ބႳኃኦ֚�΁Ŷڈ㣶ހȤ˶ܮՄ䌖¨䋖ߖбՀư̎Ծұ䂥˸䌖ȴͤ䊘Ͱȁӱޮ˖ؤ͑ןϱݨňb㢱Ӊ̖ɏƦݨ̴b㡾ڱـ̰DZ߾ࠁؑՀiۖީ䊛ϑ٩֦׻φɭ͂ᅵ熾愔Ö�݈うƥ䊎ș≩Ւͯ(姯Ώ䂫̱愠  "}
      

    The complete round-trip took 44.6 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.

  • 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
    	
    
    Loading

    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 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:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.15",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. 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 of x to slice the file in the next request.

      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1"
      }
    3. 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":6}},"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-8139-Yp4dS2dwUsRT-.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-8139-Yp4dS2dwUsRT-.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-8139-Yp4dS2dwUsRT-.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-8139-Yp4dS2dwUsRT-.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-8139-Yp4dS2dwUsRT-.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-8139-Yp4dS2dwUsRT-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8139-Yp4dS2dwUsRT-.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-8139-Yp4dS2dwUsRT-.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}}}}
      
    4. 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"
        ]
      }
    5. 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 in result).
      • 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": 0
            }
          }
        }
      }

    The complete round-trip took 13.3 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.

     

    Magic Comments

    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
    	
    
    Loading

    [!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 the ansi field to true if you are interested in output formatted using ANSI escape codes. We strongly recommend you to make use of the id 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 the end-repl-execution message.

    The semantics of the error message are similar to that of the other messages.

    Example of the request-slice 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:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.15",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-repl-execution (request)
      Show Details
      {
        "type": "request-repl-execution",
        "id": "1",
        "expression": ":help"
      }
    3. response-repl-execution (response)
      Show Details

      The stream field (either stdout or stderr) 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"
      }
    4. end-repl-execution (response)
      Show Details
      {
        "type": "end-repl-execution",
        "id": "1"
      }

    The complete round-trip took 1.3 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
    	
    
    Loading

    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 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:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.15",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. 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 of x 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))"
      }
    3. 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":4}},"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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-8139-g6qxDmdgVqII-.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-8139-g6qxDmdgVqII-.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":8}}}}
      
    4. 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"
              }
            ]
          }
        ]
      }
    5. response-query (response)
      Show Details
      {
        "type": "response-query",
        "id": "2",
        "results": {
          "call-context": {
            ".meta": {
              "timing": 1
            },
            "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 29.6 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 to visualize). 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 to plot). 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 of f 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 nodes file attribute is undefined, should we include it in the results? Defaults to true.
              • 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 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'
            • . 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.
              • 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.
              • 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.
              • 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 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', 'absolute-file-paths', 'unused-definitions'
                • . object
                  • name string [required] Allows only the values: 'deprecated-functions', 'file-path-validity', 'absolute-file-paths', 'unused-definitions'
                  • config object
          • . 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
    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
    	
    
    Loading

    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 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:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.15",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1"
      }
    3. 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":2}},"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-8139-EuA6SrF48gDQ-.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-8139-EuA6SrF48gDQ-.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-8139-EuA6SrF48gDQ-.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-8139-EuA6SrF48gDQ-.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-8139-EuA6SrF48gDQ-.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-8139-EuA6SrF48gDQ-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8139-EuA6SrF48gDQ-.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-8139-EuA6SrF48gDQ-.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":0}}}}
      
    4. request-lineage (request)
      Show Details
      {
        "type": "request-lineage",
        "id": "2",
        "filetoken": "x",
        "criterion": "2@x"
      }
    5. 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 6.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

📡 Ways of Connecting

If you are interested in clients that communicate with flowR, please check out the R adapter as well as the Visual Studio Code extension.

  1. 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"}
  2. 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)

💻 Using the REPL

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, :?)

Example: Retrieving the Dataflow Graph

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.15, 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;
Loading
R Code of the Dataflow Graph

The analysis required 1.7 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.

Example: Interfacing with the File System

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.15, 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.

⚙️ Configuring FlowR

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 to true, 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 support semantics/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, initially true): If set to true, the default built-in definitions are loaded before applying the custom definitions. Setting this flag to false 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 a type which is one of the below. Furthermore, they may define a string array of names which specifies the identifiers to bind the definitions to. You may use assumePrimitive 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 $<- or names<-. 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
    • 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.
    • 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.

⚒️ Writing Code

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.

The Pipeline Executor

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...

  1. Provides structures to investigate the results of all intermediate steps
  2. Can be executed step-by-step
  3. Can repeat steps (e.g., to calculate multiple slices on the same input)

See the in-code documentation for more information.

Generate Statistics

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).

  1. Create a new file in src/statistics/features/supported
    Create the file example.ts, and add its export to the index.ts file in the same directory (if not done automatically).

  2. 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 resulting ExampleInfo 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, with Info referring to a FeatureInfo (like ExampleInfo in this example). Next to a name and a description, 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).
  3. Add it to the feature-mapping
    Now, in the feature.ts file in src/statistics/features, add your feature to the ALL_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).

Clone this wiki locally