Skip to content

Interface

github-actions[bot] edited this page Aug 18, 2025 · 1 revision

This document was generated from 'src/documentation/print-interface-wiki.ts' on 2025-08-18, 11:58:55 UTC presenting an overview of flowR's interfaces (v2.4.0, 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.4.0",
        "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.4.0",
          "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-11139-1Gqf5fjNN8nE-.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-11139-1Gqf5fjNN8nE-.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-11139-1Gqf5fjNN8nE-.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-11139-1Gqf5fjNN8nE-.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-11139-1Gqf5fjNN8nE-.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-11139-1Gqf5fjNN8nE-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-11139-1Gqf5fjNN8nE-.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-11139-1Gqf5fjNN8nE-.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":5}}}}
      

    The complete round-trip took 18.8 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.4.0",
          "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-11139-8v8UK9EkpgB9-.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.4.0%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%2D11139%2D8v8UK9EkpgB9%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%3A200%3A25%29%0A%20%20%20%20at%20async%20PipelineExecutor.allRemainingSteps%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A259%3A4%29%0A%20%20%20%20at%20async%20FlowRServerConnection.handleFileAnalysisRequest%20%28%3C%3E%2Fsrc%2Fcli%2Frepl%2Fserver%2Fconnection.ts%3A152%3A3%29%0A%60%60%60%0A%0A%2D%2D%2D%0A%09"
      }

    The complete round-trip took 8.2 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.4.0",
          "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-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-exit",24,23,"24-exit",26,29,"29-exit",28,27,"28-exit","30-exit","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["2-exit"],"end":["15-exit"]}],["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":[16]}],[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":[22],"end":["25-exit"]}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":[24],"end":["24-exit"]}],[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":[26],"end":["29-exit"]}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["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}]]],[8,[["2-exit",{"label":1,"when":"TRUE","caused":15}]]],[14,[["2-exit",{"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}]]],[23,[[24,{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[[22,{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],[30,[[16,{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[[16,{"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":2}},"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-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-11139-bHi6X3ZbWZyh-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-11139-bHi6X3ZbWZyh-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-11139-bHi6X3ZbWZyh-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-11139-bHi6X3ZbWZyh-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-11139-bHi6X3ZbWZyh-.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-11139-bHi6X3ZbWZyh-.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":3}}}}
      

    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.4.0",
          "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 9.0 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.4.0",
          "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䖹揻༇⥴㙀㊋௱坊٣⡸䈑盦ว䖀౬㊶惓䋖ᣩ抐动᪻晆牏∮䏀Ⓑ⊵恤Ⲡ᫰气፾䥓ѣ⤀㐽ᩢɀᐲᲵ䎴䭌ذ綞卒佢ᡨ㄂侶䧴䜉䮂疲䀾䂁拠ᏹ籅懏Ԡ৬ᆊK-•䫞㸠Ѡ˱䂜寠Ćࡸ䩱,䦲䃞塰㩮嗓㨽Ң窼ݓ暹圤ᘴ壕ᜅ勖噴囗撨⦴㛭嗗㙽䟖ᬝ傐၃䃰刹䊒仨⬥仌䆔䇫䐥⼋儥养側剔䢗溧䬠弇唐⻷圣帯䘗㹿堗繠␫Ŭ䁗ᩉᣧڐਤ櫉䲓爴䝭剬䕓Ứ↦槚㽬⁗ೡ<䨦眈ف䀩ƪ‮㰩ē佮㪌䬡ࣹ䆥暲䑉⺸ⓓ犅䋒噕帯䣤ǒ㙍乗ᇽ䊵相᪯๬唢ᧄᦶ湢⾑'䖬昲≪幗弒㺏䐑纟倮ǀ⩋⸥䑬仳䬦⊫䵰ᣢ᭵檸ᰭ᪡卐婶䨡媖䦱䇑嗰⚯΀⡨⨫犺⡑܁剖䛐⹖ᬋಆ⚦⯬春冉↲嬎燱㬯䖘㛕ᶤᕍᄹ㎠癹❋斨ॣ兦㣅畵␣㈓冒䆽㞬滅㞑疵㤒䧕♫䦭ㅩ㕊㷋Ƭ劒淀ঋ䇋㏃䉨㜊愈⩊懑✨☘┍ጳЏ◪卌冝䖔ພ࠼嵀禩亓䎮䌯⯋᥅と⏣䤿ै橫嗒⇈⧭㥫㖊⼹淳⛫ښ⃨ㅦ㐡ᥘ屸妀૮毚绨ⱬ姭㨎㏨晞⼿祰။奀অ؁⬤篴晍�㜬╄粄瑌沮紴㭊兼椡Υ㌎ᔢ➖৲汮喒猓⍪槊⧍㕨痂瞭儢翍璣ぱ൚併搝刋牄㖻㚱砉䟼を⠐畝ঀ曏䯹繭杸浼ៅ獒乌䡱䏽㊥秘弴ዻⲳᖜ㟯⃮䈣〮䀧㬪挢䪖噻㱲⥮ǐ㵐梊祭干捰泒㗡ሮ৭嫁Ⲹ⊂䶟扒簑縮႕絅៸䔹厮ᵂ稶♐ೢ㓬䄜瀩緪倧獇窠戡獕恜ⷦ犬ⓨ-旡☭桄ᰥ᥁匀䥂个⏤䯊:䲀倾䑓ᐠݍጀ0ᕱ懁眎⪘䎨沴⦭ᬠ䀹⌈⺧琸೶戮䆇楨ᠦၓ᰻౎匭╄‱଱㰰⇜䊄ᖩ䢰㍓咆ዒ―ㅅഀᔱ⒊ᩱ≌фᏣѬ⎨擵牉઄఻ᇸ᪃䩘ⅴ╂ᲆ䚐ℬ‽ഀ㴱�栂䙎Ȱ㍑䌹䑸媬㤐࿑ࢥᓅȰ乄ˆ嗤䁛䖀粪礓਑䬺䨉ᦩ硐᎙ਲ᳞䒠⥨擝ຩ䇨凾᫃畖扲㍆⒔䚀岨⣘䶉ኾ⥺ᒡ啌ዿ䉁≩䛤籮ᓤҹ撽၀ذㄷ↴DŽ⒊Ԅ幫瓢䡩ᖶ夭ሠᕈሼ岆┡柌哯䄆䠹⊺冷ᆳୈ⋢௅㙯⒘䅩䳡䱠垰েᶍ䲼቎㬄扫⟼断㴇䤠'玙⧍夌᮲㉟ᐚ㚆呼ឹ㋀ẁᔠͨ汑ŸㄪÉݫ协㍴幕哬ⶡ榾ԩᜫ僗浖ℷ簲ᔌ枮粨Ⱡ怲䲸≩㣒㤀µ३ᖲ䌰劬䋅恳盀宓棒捝娴㿔䍘浃㋗॥嶵攩ዊ 䪑㡳煻䪪楎傣ҵ匭ᖏ柋䙆猖⺄㿔ᐠᕜᜒ≌櫾䴅穷᧎喫糐⮭ザ㡑ᖺ祍೉⽙Ⱗ痔徊㫗橚⦅༻埊筊欏⯙Ҽ丞墊粨᭭㱴ⵤ㕺咎啙⢕唼䷰倠穉埤᫙૝Ⰴ綊䛶予ૃ⸵፲ං庋ᛎǍ㉱完㖢暋䳺溥(⏍ླྀ涿ᚪ㽚㯻さ㮐㚦憏盡櫠◲Ḓ壛ৈ∠ᾦ㨻⎷᭸盈爎⻮椵Ỷല屺ϔ婠ଖ睥㙸爉㫟⦅睺㸉庚૑ƽ♔൧㘆欈ᛞ沝ⷹ䳠㹻燕⌀稴O᤬佺㕖䌎狴᯶峷䔰㞚ᯚ޿✮᩽ᑾ斩應正啵䧟冧珝笰ኔ椞垂堿懻潽⡘䂴崚Ⲟٻ㋤Ԕᐠ὚ບ挸⇫༳毾ͼ㯻懗䝃⠵忌䷞璼ₑấ䄡᎓媪䲗✄环㮗൉弽⦨吳੘䃚㙆㒇筳㉬ആ亩欽Ƶ桳篴ⷪ㉻ᚋü竮Āⴉ䎻⬚梃᝔Ꮦ㼇沓杬煬ᾏ䵞羼晡փ㭺ᶠ㺶߄ ᒯ᜔洕モ␵游燁⬓≜䭐㾷֌䜃㩍䬔ᘅ切嗧᢫杝啭㛷斞ᛷㅌ糥仴歿喭ᨋ䋒毮廷憖㮪榭猔渕丈☏᳽柸它㦶篛䭖睍猅ჭ崺㨝Ἃ᭐㬴䙖ẅ㘦涏ऊ々懺ֿ䣛䧗ㅫᦹ㒓ⴆ耔䫼暝嬸ڻ岣獒叕ု安䝓ᨴഢ梕俼懆ᶧ旟Ꮛ㵷䎆⯧丠ᛘ泹牞䌘 䝂帛♔❈犇㞝໡猼䁙᱕噹紒㡇㠨❱ತ䚫睰ℽ└ⴳ筜ᨪ㳋㒓挸眝紃侾箴☀峓孚炅⇄⺚斱㚗�丵瞓ഐ嵳棙向㶇⢩坪箯欐澭睍৶ቲᔗ䏟汧䵕㝖瑏秐䜕濮橳嶙͙涤䬗Ⅽմ䌡䘬ᡩ懿⋰㲧䯘ᇓᩫ㆙ᒱ稾㼉䜳睏㞮厊ᢝ玻Ὧቩ俺笏㈈㠕牲琞㺻俫៍◫൩怢䳘眕⹓〮氝㽧啿㮴巉圐呲炲㸏槁㧐煀ї泿尌簣戚‍牏℃澉窟ŷ੣暺⿜␿矔ሄ䧯ซ垻栄砌缋級矺㩟攙卧紪Ჺ甗甌ဗ᛿爙Ϙ祏Ⱜ羷紷倚ઍ潫怦再湞✐Ư攟暠䀩㾻嵯歶瀨t硋淪㠫䁄ȩ戾砢�浚愞倮䯚Бԡ⌗ⶣ涣昸ఫ瞼敨ṡᰖ㩞㸏潖Ⱅ傕㰫挾䇖ႍ⑙�猕⿗粸ᦎ䊒䁆Ϟ慞⣑妬$Ⴁ毕⎩糿惞熐䡥ʹ⹁䄭斤èᖾ儬ƺ䋘䕁䪕㿑㴄᥈洬⢅䖬ጮ䠰剆Ƶ潦縕恢Ⓡ࿜⬬ξಕ濁瘭厣䍌ኁ䐤碘棗慴ݢՕ䉮惡棒漫Ⴂᴁ૔ុЎ歲炬䑯ʌ悱絆䊵禕ٴ悮悈⊌溱两摴␚朁㢭厾∪ᒱᜓ䀦⎗nŰ利ჸǁ㖒㎽∺ᡡ墩嗓电ը窬㑷糤᫱䚮䊴၉Lj⚬㾢⑦ᙑᘨ瞬ο║漨Ⲕᐽӎ稭Ꮖ䱶ự㯔瑣浖῱䁔沒批ը尤偘挌ᝒᖭᱶ揉梁Ⱒ屹搖ᐒޭ斪搜ຑ㿕⢻抎᧾嫖米揙⸑㐮ᬶ⊙槁⚕᤬指歁㐗௄ጰ᠎十忐喗氡嬬粅䔑൸ᾫ䱣泑᧮ѫ䳞᎒濜ቤᏁաቁ暮狉ᏩႠ⡩䡡䎁᥈婨劁፴⫩Ц䋄ĥཀྵ㖯ޭ䲙ᚸᱩ䊍ⲥὩ癬壘厒湉䞯犄粞⭉ᅪ㉸別ڸ䞬䪂µጮ⻲戦傀஢ྪ⏎吕ᢉٮᑮ掊Ⲋ㵨᪗䏍᪉峓⨶ၢ⒉䵒㩫叭ᴡ兮㻛劐丁彨噎ⲭ䟄㴕㪔ⶣᔠ僬穱ɪ᜜࣪䚆吃ᙑ桰ਾ動ഠࠤ�奉ሡ౬⁊㏕ƹ⳯楔㉚ἾⰠᚚ㍽䱹漬噱㋳઱缭♿縐䉹祯ʗᖻῌ囮⪛䋿䗹㓡癠ሲ⁙㠡癪㊀֨ᖫ枷ãᎆ哮乳僃੹涯ᚆ〷Ბ᧮⺆剗ᕨⷭ⢄犳᝙⴬ṹᕃᵑ䊮η創ᴚ哪Ẑ猆➙㏭٤玑ഈ䣫徺ነឹ哬灧玛ᬹ⌬乿物ྔ઩糏珿ᨥ峒䀻࣌ỹ橯塼ਠ妉༮Ⅳ獴⬥嗢ٴ熗䎹瑪ㆥᆐ劥㗮㉑੐如≉㉎私⩑χ憗猨劸淭梋䏏៹䥣冖珠巪⹍斱䅥॰㸨ㅮ⌠恅⅊炓͏ᵁ୭ᆘ䮤姉祌䦎ⶱ཈䕥㨨䯶ᴶ啈⩑桷ᮑ晫ᝓô埅䵩榚䪭പฤp∰兑㦶奡䅂᫥᢭⺛絓अ䒪㒳൜壹笷቎䫕枅஭⢠⬵׎楋梛ଠ刞㕧թ岘傲ニᕋ珷䁨Ᵽか夓৅ũṶჲ儠ೊ敤剼嫡㝋岚獇ၵ⋉䪥ఓᕵก啾ェ棵䳍喐⬓ᵵ㛎斄⫸匹呋㼷⮪币⇉䫍ପ勨牢ࢗ᳉ᾅ唳㘶ᅆ勸቏㥰ᔶ啕漨⵲樣瀁屉侮⨵ᷪ㷎⾪橊寴搁ᵽ⮮凞⃬嵧⬨妕廍㥡䮊濕䓩ᶔᓹۘ㛪纈䪞☕泪㵹⩾崚�ᚆ勡嬑䍢刡䆸ᾕථ䎌᭮墅䳠玬᫄墵䮬⎕㱳ᅨİᵧ㉧ឭ撍嗕㈑叙把ྐྵᆯᐒ我᎓甉坵㪉偱䇀偭䑊ቴఎ䩵妮穾ዙ币၈ᘺ⏰弭棐橚ડ寭ᯨ㶤寐坵㦊碍ଫᐕⰫɧᰆ勍窈㷈拋᧕ⶎ犚Ěᙍ䅪ᮖ宊☠㎋喅媦 䟠䩊掞嗅᭗學班孮垈▗䭔樍ᥪճ宒壉ࣉ玔ኅ再࣌掊䓠ͱ缮潊燈噞㖍䵨⭌✽䬨➛嫿䚽琠杽⯓冽湩㉀傀Lj䣫T橵恥䵓1㩍⩽ቧឆ㭅ͽ挏垃㯍孽ጋᝮ氌⃠䍷㍼歌⟽໷榏掿ⱝ⾏ᇀే家姥Ḥā怽䏈Ⓖ穙ήᄌ㉧୸䋸㘎碊稷卉㴓♇犳容♓1篷੝屨宅章帍棐彶㎥态❠傫Ⴢ΍᪎犻竇ਝ⮊䮈㫗妸怈罷稵儠砏羍尌₉䞍ή㬙殢᎐澌䭶圣漨愔ᓣژ瀉⾎ߏ埭媱惮ᵃ如ሿ煣⎭哝䊋䳉ჸ߱䀼潬⭓ལ䘻ᄏೈ㮶 歾༦獋懊ㅐ洦杸ሏ֨稵撽#ƒᾧ⩅ᇡۨ炦懻✥೨篢橛ለ⩞אභᇫई惠穜刀ಠყ䙙唓་ᢃ穛捆疀Ģ᱓滅䡏⽨₲㛍Ѫᶱ癞峏ಢ➒繓̗೰捻ᙍ爃᫵屇᪽燯垷⹑ৼდ皉庑ⶣ僘嬪ᵒ〪⠣焿ʱ䨠᱘¤Ʀ⠴攝懒ଙ⇋沞∦㛌⥟ਏ״祱ᰏ犥疻ἺṘ㽶亐᲻ⱳ戦Έච愯幠ܽ߉@ᧁ京㗐䘅䁐䊴Ձ橯曐ǔ灺嵐ᆈ⯈ඇ㙙娅侔桼絑ᨁ伳᎑䃈㧉䷦ڇᦧᦥ仵䞆⭗⫛丌禂子Ẵ癀ໝ㭓樔丒ć͔㧱們ᔆ罞㨅≼禅獘姺䢜缇ׇ᪽倘☠⽑樉㣜矋㽙ᦱ䳍ံ碦㧬Ⱳష坙׺㩂琇ᡕ娈Ⰰ咷⽗䳪Ⳣ矇ᘸ恼⼳ᬶ瀤斫中嚆მ⭺⸌滊㳞娟܈श⅘ỤĪ檶棐昞伢漷拮ᦹ⽬掶坕昇殪昶᱖嘘⿸奡䋐䇦ᚉ䝶ዟ◎凒欷杊㘜ⵊ簶㝜絣⿊戚㚇㗍ⵌ娑㫘䧤೹嗶䛝稆४拶狔֬⹊篭᳓㖧妚绶右礨潚桤滓᫄佥唷䛘斥⺬昙ǟ称⵺炷⓱ᖮྲ翢ҥ☄⹬㥖㻔⺉⴦絗曖丌沦祶懛⦂湦燌㚂淸淴幗ᗿ嘈塤᳖䄃租ⷶ繐᧓䖱氲敶ྏ渜汚瀬㏒娎♦㯽◗ᦆ͛䖢د↌僄ᘻ᝝ᚒ䷠዆ᖸೆ⊄筇߭⋜䰴棇柨þ接寱ᒩ沁ř㆐檲ᩎÑⰖ⤩䞀R౳䯘燙湊⠯㦁彤ⱓ᪶䲁Ψš栺寕=渎楶ߕ*䲲䫆忙䒓洄欗祖屻沴或場綣狞斱濙⹅枞拑㿚䊟漙΢橷Ω⒐瘮೭֍獠ể绷嗟垒宮䢐⣲噁礮媯巒俁椗ᢒ㸍朁猗䟠⏢伴缗纪䅒᳞渖瘍␌Ᾱࠖ翐Ї椩瞯᏶淠ᢹ敋縶㙩狸曯ሱ⸂捩礗殺㶰I睇䪔⏕ᾍͯ社␍Პ暯᪠㎦ᴹ戍皝烨徒⇰ج瓘ȁ㖖击ఘ币㟊云䏀秩朮ʡ㷯᳾畮㺈縟ᶉ犮㪜᪀怉溯ڔ揺㯹畎冒䯍惱㿢ణS㋨囦涑母愫䍎㊕䯷Ῡ睎碔厢巾棏⒒⮪ᵱ拎窟啰弒ᆯ㖍氟᷑搯峊寮峰㆛粜盠ᬏ㭽綒琊侎⣡䋀゗ᆤʰ䉸೸劆㼰儥⑨昮ࡤ瘃嘪挋ᢤ柒ᯥ὾炯֒⏭㊉暏料緗ᳱ纮䮞மп⻋㯶䤚଀侲⋖秚ॠ᤾綘㶳忭紏亥㮻征缎埠ぇ峝磱度僘ʝ罩從珿怅怾᎔ߟ὞琾䆟ᯨ㳵盍椙䞥㕃殳縶⑶Ỹ硿炚挃廩梏`䕫峠ᬏ㞕ಂ㹝税ⱀ䱪㲝礩㔗䘯 粏䒞叉傣灏㪑ߥ崲ؿ㔆᠕嵦椢Ჩ搟Ѧড㆛㇇㹥椏夕៳峫挎Ԙ埲恝璿⬚箭㽳歾ḣ垦㸋榾ܛ珃㽭擾玖㠊嶥盎濦瞷㷵⍟㚔Ὡ烋⋚㘻涻ᤇ㉫剕䠇ᶛ纏㬖᮸紙磎洘倐㻱玠儑㟔繪ӟ稒᫜絶㧦䉌ཬᄏཀྵ演䯫࠯籃寬Ῥ翅珿Ν瞿嶄璏羒吆㸻牰ਖ⮮㽇旟崕椝灯檟㚗⬑累模冘砈¯甾禶౫罯承㐕䏗ḃ湾ଔ➠爧沾欖篊㳳扞గ䯔㹋竧潿}ᰕ᯹彶綰ӗ嵞㰙ဉ响纇磛拭ᘜ箔ݩ纇⇽熿䋞㨚爋ឿ式硵ਟ゜ᔗ㷬὏嵃瑿倎⽚Ȇ忝戭箠ᒿ␣㰗獠恌ϸ瓠㤡缨甮呔຺ㄐᄇℌǤ㿻ᜠʷ燀㖞㤛堀悌湭碥抿㑝渒怠ℏѴࡇ൐悹值廅Ⱥ޷榷ᐝ䎒偑侀̋犻䙡゚⬀客䆍竵䯩㾬᱓塗ᙕ懒䆌᷆氙ᣬ炂傂䈈ၗƢ㦒ᡈďᵆ瘧䎞夦ⰵ柊㻕㊘ᬀ䣴㶡䑀乞े䋴ᥠ塃ಊῂPɄᬭ੣亠壡缼̜ର㪡続䰲࢙䅻筐ᤰ坤央⑕რ㐼ৈ❁⌻Ⲋ绊グዋ⼋ᆜ⸃㑞䈿ʑ玓嫞昙Ȳ柜㼅Ѡὀ伜唭䭧儐㑘㐅৪座㥏罎溽Щ悲ឭ涓瑒弡䋃燏䓡悦娆x↼箻洠劣ᦠ汔䌭巶๸➦唠 哯嵁游ḿ㿃乂ݫ摰熣䌫偕൑䊸ࢸ⨡旛ὢ碃成Ґ樨圣㷷਩焗͔悀ر砧爿傈䈔砤័俢刯偈炫ɮ໐ⴁᗚᄼύ帩၂ẟⰭ⳵注羔䌥͎䬡摦簺䒀愲Ҡ 乂ᔬɅ䃯㥉ྀ㬁ᴥ椵Ѳ撁䎏ઠ櫣箑粸⤚⏾ࡈ⦱嶥ػ⁶ᆟߒṐ啽ጬ⡖噩⏇焁危ᴛ籂⾸ᄥ碤⹈睉窫㱈₪偞྿䴱䀤㄰咈Dž㬼ᷟ၂〨矲㰣⏛灐ᷱ崙堻Ѷ䇔᫈䉿ᓃ暬䯷½䏱ྴ㉡筧娂呵䆊䓸ჭ┑㲩቎㉠挥਱a睥砽ଦㆆ䓘∸慣嚯ࡄ傣䍦๴‱啧ᴾ㢛乣⊆ᧉ຃㪯墺ბ⅓ཨ⧑兢欰撟↦Ӻᄸ歂攫ᙎ₪拙౿แ曥㔷摠㇃䟖ᚸ䠡ԁ㙎ई备෬⋌糦放౫ᇅؼᄈ湂亮ํ籅握ࢼ㋤ϥ簋ᲁ᳂䑆戋‹ԇṙ㣡⥷ഘパ抦氂Ⲕ䄣䞤᪐灂ཱྀ幉ᤓᲞ∜⚑ᯧ朷璈⚨ġម榁ᚪ埮⢭捿໤㮑๥ܵᢍ─☾Ჸ粬➭佥䠦Ơ䬴㴡ᘋケ沔先䙞᳨熂⌫㹁Ҹ扂ུ㨔➚欽咁॓䖦Ӡ⯝ⱨ篦⣲ኀ佂㠁掚ᠸ᲌ㆵ䒊Ụ䈣ⱨ书g⁏਍䶁䟨ᔩቤ৑Ⅱᘸ侃と兞Ԉ揫ల⾑⁈⒱呏熬犖❄庲㎫炱ଡ଼磄䱏䙩僉௉Ǒ䥨䜱ᣨ圳殩煑⣞ጽೈ㚩㱨沾㊘爈⚂⸄嶳➭剁嵎糓ର励僇〲≵冄ⓞᛄ勂呬楆䔘扨Ⴊ㟞䰹劶⾵䬍ܶ߈ֲ䚯慁攼千ݠࡑ㳥ᒽ汱㆑✑ᨰ伂ṩ╞ᆂ匒丒】湳ଯⅎ⧅⓮ίɂ皑◷咮Ꮒ亢㧩櫆岻⪂ॺ❁᝷㽳擰烧咡⸌⟋䧮ᱣ䬨␸⦠ㅍᛨ૲瘂汔ᣪ县࿸㹉㝅檹摴榏抍Ứ⫳ඔ伣ᕍ勎䦫䜉ర‮ⱁ凹଺Ố䩼佩㵗㒢掂䱚⛉群Ҽ䩡ᇯ叵昔禩坫䗼ೳ拡侴ໂ㻆ặٯ≟◎ዄ䮲冬㟣礜⋟ࣖ吉⒄े᩾᧽੹₫Ł〥声⢈ò㘬⋉缥冺ᩦ᨜▃᜸䡓⥪千ᔖ㋲ᒾൢ糅庸⪊䑉䀲ظᥲ⮭卋烠䌍஄ㅉ₆㼲瑶¢攓ዴ䆳縆獘ⴎ動Û儎璥䀡嚓傧㥥ᤄ䱳屨㍊ⲭኅ仦⹹஦疿ẵ憞▊ⶌ䉜࣐彫㡾㏵唵巎夰䖿㱸奯䞜᥌羃勮㍈Ⓨ䖽仧ॹ徒⡊ນᅫ်ᬌ඀॔幋傿䦃䦚᪹狆㢴㙨樟▭ᠬ傓婪急ᴘ珜ᑎ㼨暹ᙠ㑓溊⬼▵ⶬᗨᨮ┇巢Ⅶ⧩窇㎸暛䧇⚙ᖉᤅ痨䥑崛ʯਐ䟙⬇箵䉾㸢竛愱ᜤᏬ൐洁卻䳤㷙ᏅႵ溍ᰱ䎯ᆯෝ⵨ᅃ㳬㶱ᛌᗹ攉獏䒷妰⒇὜啲淭᭓೜≹䧦㴜ᑫ璱ຈ⪯擮Ṣ㴁㺫慛⃵৿䵞ㅩ琇ᒹ㺂秷敓ᮜ炒྅罜᳆᥀⢌⦄䠠⡠五䨏◎椣㥓㏪癎䳀ఝ䫼⳹㴅亼滊Ջ爯ἢ祒峩坳糤狌䳑Ր爷河♠؛☛ᤸ䠪ᷩ⽁哲䘇Ҭഩ清晣ⅷׇ䐨ᵼ厓歩粰⋱珰⻸ㆥইᡰຎր᠇ᦸᢪ㗫啩⋆爩懓卡〇紶ᾦ䗭暇ნ瘫▬ݞ⌜ૐދ䇰ȅ涾ㆄ橰檏ತ⯲滫㳹ћਨႱ⾉䰴ຼƌ䕗朎᪂橕䋂漵拸Ⱒ⿑㾪ᱡ∣Z㊡䂨巪⨀ᅊ䓄唧ቐ⼶㛱ᤴ灳熝⧌杖渲摫⹔Ⱨኤ䪅ᖫ嶼㜤䂺ᗝ久ᘈ农枫ٌ兎⋿୷佚㣅幺㕁⦇㜖㯼ᕘᬡ⪤瘡೯⋚⨉⫅䀴橶䥱䘕ᚄ徜卪溨ೄ䡾䯍喫叅ᙣ㩻ᥱ△搄淔珀ᠥἱ⢔Ƭи࿅疶嚶䱚ûᐮߒ眠䍊䣕ዞ揲ⴡ⇅瘵♰ぁ斕猼媒滫筏䳍㋒₮⫹⸹瞴⹰窉灈䩀妄爫䦔伿॔獥䢁⏥☴湶ᥦ▽摜峽ⱽ჌䍍૯喱牠㪱פ波搶ᖟ木ጪ䩫㶬湁૛䩆Ⳗ⿨ɵ⁼䦭ᗐᔨ佼䄁߬⛯๟䬩⣔㢵徇⑿ս▨嗐喲䞥泍勚ᙆ⫚䢅㷮䶄ៅ䑛扑ᑄ䄌瓋㋈᭙ጎ⯎⭅⾵ੵᅸᕻ砪喠͊檢勋櫝熅䕌䒾ᙵ璦㠪㕡䁪嚖᥂汊㳏⫝┞⭆䲉㶞⭵ᕱ懅嘖㬺傫㐌Ⳋ幅儣灙⢜㽥ⰶ䙱喋Վ坂嚂忊⋈౨᪹掯刔✵㊵庄䶐㕞昝ᘂ淫ᇎ͒㋩⇳⮭ⱪ䘣፺㲖㻶噯ᴏ᧋ᝏ嫍⫘ሲ伹⭵糶墭䊗喛櫖嬷࿋୩䳓塪䀲ϓ䟕㻴歲▊䤠柞ኂ毊堦〩㊾䪧⻖傕绷ى␱ᇖᤎ˚宫㽮ᭊ紏୕⠵㧕嘻᝴繳ಋ坧ᑂ᧐๊὜紨㉗ⵦⱕ幵ᵻ嵴㗺哂屨伫䦕Ṋ䡊∝⩮㮴俴㍵敶㗕ᑞ宺泒喫终媿䧠梵⨭̢禎䡬്᛺异䤋棩ベ㳇気⤠ĭ姆޽䎎ⲿ嚌扪ᗁ䮷䇊䡢ᬗᚎᢕ啶䥿ⶑ椳☆啪䄻倠凖㥚咸橃㊭䄑⤢䰣ӿ啰墠⠊㲎拐℔犦丹⸵䝴᭼畣඀㞑囨セ帴৞⛳櫐樯ᡴॄ⤧捸ᖶኞ张Á䪧绌⛋䪈橚㲉橆䃻⭎上㐹儦瀊檏槓⚹损⺐㽰ℶ㑹↖䴢㕲̆唁扎⫎檴ᩭ䧽␭ஆ擳獻䶪㞙墈⮻⏬䣫⳼⯏࿶⤭䷵㎽䶙ᕁ㗿ᕪ慙竨烻ᚣ畄㋳㾹揦೷ẘ䴮囱嚆割ᚎ㺶礎வ䮹ᛍ叧䥇佇ゥ㞟Ი动᪥㗁Ⓜ⪬淍⓭ㇷ౿㦓畸͕嗶刋᪃ෛ嚩⮾䪒䷍洷獅ħ禔ᚩ婶熻⏉杜㬁子涻㦍執櫺兎浊㜧斨㐠燪䇾ڷ嵮梁؈⩖þඐจ㓩妆嗺枍巍䛷媎汪૪爱㤩纳偱ˮབ栲氥緟皨ġ梎䟍乵竸஖留啝嵶䏹ℎ爼໨㩆欨䰽〠Ǵݬ煈瘝嶮嫳椯揜໛嫗⭫≕䒖䋻⬩ᶤ瞘⭮叁㦀㏂༙㖩櫧‽禋糼䎕഻㕏ὦ剛焷㏅仏Ԋ嚇⩀汈绺䞁ᵱЀ䇰䞺䖏夨⺹㯀͇㕍⁕⓸經淯冫孎絚䬍毒⻟嫛厠ౙᓵ㑲ݸᷦ皻剆瑋ㄉ珕܀嫉泫⫑ንⷱ䞒⊶皷⊎䪺┉戧່㫭澷㷍䖖凷睤ᷘ瓍宎嫻綍珍ܞ㯉滷ⰽㄗ击㍢ⓞ砛后力ഋ䫁敌競䬇╍̴ự坦⸀ᘫ娾皛᪷⟐䡣㫂ٯ㖽Ӕ繭⾘嵂琷定䣫矉៉滒箉暏㎽ู篴囟䋭看厾檨␉⯆窶猏ⲳ⺭獔ᏼ䝾㷪盬ᡜ䔚繲Ⲥ仺禬؄乽␴ᗹ往⑛盋呾枚琊嗁㼒笞櫿⤝冕䇽㽾䛕瓙它ग़倊俔᪮箇泋㳹枔槶ދ絵瘟崶縻ሀ揸໱ⶔ橧䓍ᕷ滺㽷綘᙮妸Ч‽⟎㉄ސⅳ⛚ᮐ䅰⪐㶸౞䜞帣㼗䯰佛屟煇䰞ᄙ䠷羽Ṑຟ宼䔋凈居䡌ۂ皀戔ᓩ䌦寍䚊ঐち琝砮႟澅㲣睇嵾⨯䐃ℙḊ疿帞供綴炓坚咘ỻ忢ᱡ፻ㆺ䍅啱匟ģ␺ၜ䆲ˤḟ䉣䨤俷⃶涴啶ᧁ䌡箎㽓ক޶ᖱᬣ㺇϶宴ᗾ斒叁悧Ю奥⽱ڟ瓷䊡㢔⧸箜㵟睞䜁瞥ᄾ౫⇑筌❰澣㏘і羾䏞ನ㸟⢝吽ᢆ㺪專ỻ⪵Үᓅ儒抃䤠㜱篭┽㟙ᛴ⋜ᥨ楾㈭籑䤘䍡࿻吶䉚愻䢝㽪䚼ᔕ㯃䨺惲䟊㖙䪲Q皧䤹႞初ܺ᳀磣ᚮ桛䣥䍭吴㋸ର畱ಅ䐴搸ʹᮣ⶯屖㹽巕౬〿Ƨ縼撄戀䟄ᮠ憣ᇗ坋复㊗ืⷳᕀ᩶歒ᡱ↾ᡄ嫃䟦๔უ␉೬㠱盜᜾ំ∘ܸἠฃྮ塔礋傯ྪഈ᱕ฎ犼䌘⚱周柾粛㱚䤑LJཔ㐩歧焏◛庥ੁἉ删㑮婶礙ፘ歹扨⃧朏ᓎ䧑䚨ᯈ礃榮䠻ᤞᐓູ垱斦抲㊚浆⚕ᒠ峃͠䕖澗搃༜㕑翦᲼ʟ缢♢ᬏ⏃ቭ䕛ㄑ勈ࡂ晙ᐹ政䀪䠽♅᫔⠃Ἤ煔椇ጪ侒㡖掊篊勏⦣☼໴籔ᓨᡫ仚ↇ㜇⢉愧ᢽ㊘↪܅ὀ⮳⤬䅕㤞⍵䟚㷜ᄪ盯ڌ崞絣¬̅嵭捙ా搟搼㕉䧆✻᪞⧩۵測瞳▭⬳2㌩亊⑹绰Ï硦磾߲ૌ煣佯硒擱揞丸〱䂆ᚺږȜ暍ᫌ㛓廙櫋洀弖ჾ᫨㡬㖼Ꭴ㨟ೞᩔ絓汮㍐ӻ㍙䶸パ僺粹嗜㧍剔㝼晆巉啇刢№篲㐾䋻⻡濟㦱㷱ᣲړ䦭剗瓱䏹侄㈞猇嚸懊䪳昻፜縮ู彗峡玴ᦻట㎧๎ಊຠឹἔ槓㾮潚泶⏠亖㣑瞇㖅ሿ禯嵃ᮝ㹃၌僓ˑ䄐ᡒ㜓ঠ⡒Ⓚᚱ⃏ᮄ癳㯬ᝐ糤䵯佩偎䞥塻婾䗠秩睈撡௯ࣘ洔南䳖㚑峦ᶿᢅ㦢晾榁Ѝᘳろ䊅㖀⻟愥䳆偹熐᧼最堲愫㩇䓕俘䮉ఄ⋐切垡嵩បỜ瓳秬惘唅捽䳞㕸溷㛫↑K០瓠ⶣ⋳䩙悾ͮ⿶㒱䜶ᦿ㊜䖳ᝍ᳻⥫୎櫢猃䯈ⰽ妩ζⰹ㍲ሇួڪ緫౭ⓙ拱䰞伙㟥男ᬍ再籮Ԃ夀㘭✯烷D橱Æ࿜؋Ⳍƿт噪弗ṋ䯮㳛ᴗ䯰⾼㪅庇灼֙穪埢⻊絳䵒㫜⫥䈿嘵㸲嬰儧砾Մ☲␊撋㇏瓕䔁䮓䳅㳵徶紏俜ᆧ壆峄ᒋẮ烴ᬄᴴ䆍ふ具涐儶捞垮弌ᚋὮ⃝拾ᐍ䱉㿥理嬏⶗㘓囗䬪恭៌毁㬀㳛⺲૑簻㽻भ䘃☺孂構幏滞䬉㵄丕㠕寶瘸綈嗘㜮弩⵳収盖䜐᭄⽖㮩秇ஹ撇䧖嚾巉࿋䲎㕊⛩♈浤ٸࡍ⢲ಅṽ嚉嶵䬻竏曘櫼䮗ⵎ㡭䁷䓽厯嗆㜀䎃ㆻ⳸䦿ㄿ⯅椷⌠∣棺喊㠥⇅妆簫Ⓦᛓ狲殉⾓㤕晶ਅ涂⸙㝇潆杻㦍◒坯步ⷖፕ䬷㭿ᮉ慉曝ᱪ毫れ㧟䜃猺泱㆞彖固乂涣㛭嬖濢ㆎ盜僿㌠洵㐽扫瑋⚕䷲ង巚移⩎巑䬛宏戕㘽抻Ǹ⢗坳㟢⯲ઐ塊⟲༖㭎万㸭ⷖය⮁涸眑峂糍ԏ⇗煶ෛⴇ㛨˖㻼ភḉ㛓媨৛挎ᅟ✏⮭洷㢠咵◸禜巰㝋応瘫ߍ巖嫩ᬣ濗㴠ٔ㭺ᖛ巁盉嫑垝側ᗷ櫦箷⽩㗥湗ᏹ㖑◭㚳延棋帍ב㼎䙍Ч㑵疆፽ₗ㗾ފ徂沛㚎ᷛ༕㮕囷㱩綖絹㾃䌠๴ᯞ籅㛤旖Ǵ熛潋㻭堖叺䎏綤ػ帖旡漥⿙Ȋܫ╌䟵咬ౢ΀巈䆐㹦煻箏䟓㫵㰐἟㋉耗㭺ᄈ෶眨㯹⼧ද籃䈑Ჶ洵㎘琮ᗿᄈ縅圃浺珃Ⱑ墖伇ߤ犗㎘筙ਸᄒ⎷癧塪惫椎碑⌅ݶ䳯㑃戧㑛㎰Ѕ矢ⶱ搧氼廘瓪皯滈䚕熮㜈碒ḗ皴㱞敧搏⟘伌笾洽ㆃ梮㥋㤓巊ـ㾇᠞渽䢗㈊⮰浰硃䱗俻礝Ͽ๞狆淑ό㢑䇷䇂䇤笝䡖Ὸ侞搞༽滁椧㻎抝盰޾満炕林濯秧揲侏䅁照᲍㍑䨚宊ᵘ燃爯慈唀䳽຅橴ೇ伏显桯䝝ἔᕳ峷㙝唈Ꮞ㘺㯎杇ᶌ显爟⬬⌔秽禊㹜ⴐ㏋嚄幱璇ʏ䚘䈘፳Ⲗ坶䉗㭚囐㗊堈偁禪缽办姺寡ᶌ綳仮卞煽吓丶㯏Ę▾店ᥪ⟸潽㠳痮损禔縇ླ巺玣櫢㺐⧱⯀巜秽檫溋濘Ở垁㣙碇捍纙姠᠊ᶤ瑵剏ᅚ⌆஧眛墯ឋⵡ撘⌗᷉᳂磕䑗罙⶜绀⿯弩Ⓑ㫬↘旷ν溮Ѯ榮㪌ޟ઄⺊㵥窷瑾榛ჶ᠁ᒒ獓磏᷹䀭䁈䀲ᡁ穷奾払秴㰜嵲罅䵎ɛ匉叓嚅㱈斷ࢶ疜⤋ݏ⳴ᐃ晢叮ྌ䮢扉㵵畻䅼巛㨈❔ᴽ㪋摯曚⑊䷙⻙㱦籅䊯撗⫭䟖徣㻋像᫙ଙ毿⺵㿵懣捼傘䧸毴漊ತ㣷ә妷Ꮯ㜳㴛䛻⭼橝秺柟Ὼ缽揎嫝ଊႋ㝓㹭暇狾⪩⸇㮱䦦ĸᵗ㡻晴䶲※㣲奷䃼纒᧺ᜮ岂磳榏痜㜆㏁澁ᶭ杅樺厑⫫殬ᰚ眝椯᝘ᜄᯞ澥㬤會暼ඓᨔ坑Ṇᅢ籎஍攗㯨竌㺯⁗׾⦗㘒睥怖煓緮曺ἇ嗂』㵍⪻䳊姢䓯䞏徾ᜑ彏巘ଊ箺瞫㼭犇⋍㾑縄➀㴞畋媀婿演ӓ嚀縝罗Ỿ஘ϭ矻῎炧癘寜∓帘嫇㲣㞋ⓔ玙ᓪ垟巊秭梎奚㬄ࠐ䪒澉燹倽监㛡ތ⎛㝛䷏撜弒䞵滣㭽猭෌⤯䨛➌䀛㢃具硹礒➵倗幪箯㤍儚帕挢㲃㽥摯ኛ圗㧭皐ᡝ挻ⵝᄐ㻪༠㴟㐧缿ಋ樆约࿟὿⡤㻎峞㮁玐㾠㯕綿澌眜節溽弞悍瑝溙䏫侮ⱙ獓殿徏༓絧᚜㶒惯㥟Γ搕睪㺦㦆䁾ᯐㄊី⻏偁捹溈䤝᳹࿨䀞眷抾粞⨜栌⻏傁歏⪏窕%㜸Ȕ獐浿姘䞔簙濊㬃癏՜䴛班ྗ嶕ヷ䶎疜䔚埦廉塶疯綌㤗丁伥㺕琇䉿⮾㶒ఝ㠕㤎汏尰জ淣᭥⿍睹擾禞丂䟹徃滃擗ࣼ旳函妝ⴍ禽塾殒؞Ꮙ໗ߛ緯㛟猘㰗俧㿔㏷羿矽䢹砝⼎緛㯇ᨅ亓ṫ潣ẙ眣䎮࡛稅⟊囡翵瞾䇯䔞কᎱ㱂㴷䫖ᶘ縁滏彮緃琚ಞ⊖䠇㭈䵢ㄗ奞ᷛ渋寗怄秧淃≮戚Ⰺᾰ䲖翋敟⋹␀毈俉獕晷漼攓ȇ笴ὣ爳繟㶞琀⾦ี㼑珛㲿倢ᯣ瀒繋縯櫮ޛ吕␎忥稛慇圥㛒堞埪簭癇涾囹椡寐粜㷹㱐䶚㈛Ǩ徹ḃ簧䓟團對杣㿭緗珛䰀⡫⽃佻求磽棥㼝ⲕ⿹ố笓獿秞ӑ櫰㼺䂧缭囿姾้ࠝܶດΉ勌⦰⑉ỽⷻ籏弯畚氙瀕潉䷯悋ງ䰕倚䄹羠築亞旚䄐⾾ື㱋每椟ᓖ暉ẕ纶ヿ砮㘝Ꮴ㗪怋磯梟狟⨑琛⾱纫窇䥿ָ㠌䀛瓌⡿王䫜ࠗ嫼❔䓏翕笾㦛宕砕㿑窯磏䓝㩍怒✮޿獕笟䈁戹摄仸䛯损尟瀗嬞䀉᲌篧䧾☜懌徨䪔䖟椟夞Ξ᠝嚡怗 ⦯κݍ縹絀Ҭ㌙䳷䕵✾媜䠘栖᠆㏾㿌ć̐͋箫因ἰ咹ڞ⸼␚䨆ံ࿨⾧罾漑㱯硍眄①㶧⾞稣ᜃ㠖ဃP㿅ႁ缄ɻ礹玏杗䚠䲞⼜筺㠬怊ΰ䂚炕绫᳸أ叹榃徃୾搣ࠛ⠔㰈査矏缥繒ΐٌ睿恍佪ᒡᴢ唙砓ញῥr䃂總緺娨࿰ᛳ妟ڞ⬣䰤㐔爬䙤䁱岜䑮˘Ф爀ᒗ圿ડ涜樤ᰭ㠽う斿罧Ƽ縛灗瘻沏䨟㦞㦽瑀嘐倀㿦៉䂻伈̇竸ᜨῷ䥗⃾䘣儤ᘱ嘉ࡆ羠ÐŌ㷝㨟甠᝔᥇㱡࢜吙∖⠹❩俆ò㲅ʲ㬩燐ᣰダ祡氝Ц䠮植ᇤ偣㾝ຝ䷼َ甐Ὧ傳ᵡ唣㚻稩琸ᡄₗ⃧廨糢҇盋攰㚇⹡砜坚儗㠏恓徽¼䇝ᶠՌູ滟呰ᶞ⤢✥ᰒఱ㷵�⃰䘳Ⱥդݘᦣ圠握䒽瘥娫怆U䁿ℇ缍ʲ㪐ೈᛏ兀䵡㌣嬤Ⱝ氿翣炙℁ƣ敪ܜન۟䯀䑁簝䔤ख䮢W炎罤ŤⰴԢࢗ戨㰟ء㒢㼦ℭਢ案ႚႲ↽ϳ穔঵抸ఊᗀ㓡z⽴㮢V䡤≈í䃻ɒླྀ᫿䯠䍞熣㸦☮䀆摞䡷ᄋ瀧ʉࠕ㔴᧒䙓ᵘ㼜厫瘔䐼灈濆⃆廋㒰խ痤᡿奀禡庍挃攪ᔀ䷩⢖⃦约䈵簄౤Ἃ䴳ᒡ⭣ᛙㄯጉ呂ῐႽ⇀䌕٪Ոᬋ䓰淁㞣⚧掑✉寥䢍㽟㙜䉦ܿ灄᪰ⴟႁ䰼撧廓耍㛧桪ɋ㑲̳ۮ瑐ᩝ壠抡杢᫛䌭 ၅ᢎĜ慗絇㠦ఇ૨⑐䳾冢䪺䅐䘸ၛ㮤僭漋紈㰝㜘᩠⦧ㄮ䮣ᄙ焩㨳䱖䂑᚞䆍䐈㫬ಁ浸᤻㬞乨⬧䜮㠁灂塸デ㺤䍃ڳ撼ኈ㲐笞禜⬥圪丼ᡆ㡺ýⅺ泬⠺౩憟䘰䈁㶜咥ᙣ耆ྡ嵜5䆷䋠;೼ᖐ⥀皁㧢㖧䄭帿㱄梛炥䆒䎩߿煸ᓰ㳐篾姢㸤耒ਾ硏碝゠ᇋ䉓㥊રᵻ啰怱ග㮦崫渹䰮ᡬࢤሕ䐀䖆爔ᐠ⩠倡໣唥㬮㸲ɞ㢀䂢ᅣ䌿破஥怿䆍ⱁ䧬榤ᒒ吲かᡵ༷懙䏡ۿ痠ᗤ✟៶羜㪚䂵ᐷ扑ҕ愜∌⎛ࠊຟ汄㈨炱णᒠ儩ᘾੴ⁰何ⅱ瑕ࠍ狴ᝳ寐碱ģ悦䔔栿ቄ澦幆∅ⶾጸₜ᧸㭰䤱ţ⁥⬷㷪ૡෝ䤞ᐺ攑ë嚀瀈㭫⣌墉慡岮ঈ≅䒑ࣖᇄ⍿۳䜒ᬄ㜤㮱䖨⹥急礴㉌ᑬ⣦ↅⰣ⫤嚪ᣋ垡㾱䳣ť䀑椳塔ᒊ⣤共⊜䐵ุ䪴➜ボቕ廛披埉␼周䣇慡⊌䖱ຍ䩴⛈䝀䞼盩⪫ᔶ橙摯䣷ź䂲䔞咸䪴⿈没哭爦ᴯ尅㉁咍惡ⅵ䓊䒭ొᬄↈ䥱澁攻披唺扛ᒐ⢮ᆙ⍶䙉⚪Ᏼ㗨縰ǃ粉⪮ᴱ婋ᒕ¾懚⎖䔽਩┃ᕈ秱ᗂ䝦嶥ᓈ剌╃棷儷⋆䖍ಊሴ⸘᧱⿂欺㺨䀥䇨∵⤕灎ⅷ⫅ದᨓ䀰碞䧂婧ⲩ䴻㉑֬ᤈĀ崧䡣ࣦᢔ♈䄘⣩椩⪯挱㲾౥­䇦㴘ݽ෪ာ㕈煑䗂磤甄⨬䲨子梯࣎愲牵ආᖢᶸ矱⒃卧ᕓ尶䙗呻ᢨ�㠾䜫༆ᩌ㜸呠挡ᛲ㙶䌳牖ⱺ⪐眊䏑ѭࡏ柬㠈䩑⛃㝤抪⬿ᙘಂ壙㇢䦾䓥ටݾଘˑ坃曤ἅ猹翪瑮⣐⇚拂ûೖᢌ㫸墒它⛥䨃䀦穓摺㕯凞挍䕰ੋ敬⧸䵑ὃᗨ烰甸์౨側凢䓍䓥౮ᆄ⢨俱ރ孤⒨ᛀ乌ⱶᢼ燲拗㇐ش䛔㽈熠⌂⫥咫⬱剉梅棰熮拽ј敎Ṽ㺸泎㌂⛤妩礼༣༮粌撤捲䖗෡ϼⓛ⌱㏼त殯✷⹓ᱭ梨燎∧䔯঎᝜』ፚ倘ẳৱ⼷璵ᱠ⢩煻ˣ䑗ऒ仜㷿⬚Ђ冡Ⳇ▎⣠矆磬击捉䟷ൢ᜗命㉶吃搻㞥㬫϶䑨ᵯ籏持炅ೲᾌ㊘忱᷂濠潒缽㋽痐ӷ燙〸ϝ挋䴢㌘瀑ᄂ㯦澫ᾏ䰶ʆ剈ঊी⠄⇂၄㑶ᐩ檈灇䞬欱乀ɶ㢴ਘደ▀䷫ੈᘤ穢樲ᡄ࡬⌷繑ɴ礊ㆲ䄈╇䓴仢⪤攩犭呇䡭ጽ恛㡭悡㇓⎊成䳑⎅層旘◨ㅥ圃䝮䀶ഴ₉ℵ⍱؛䆱ὐ㹤抩攳䇦㘩弲慜Მ儕঒ሧƈ䤄ᱦ匦ᆩ失ᩅ㔢⢶ㅓ䚢ᚕॕ层⣡煒Ჴⵤ圠ᣂ乆祃帳兂䲇澝ছ按托䩭洂㬼α㊑䅄⬥ҳ煀乚䔆ᒌ䃩牖τ惤ᳵॡ㢲屈欔㝌氽ᠭ唱燍㶸䕿ੁ“㭸翱䌲ṇ竐㨩䥕汖⒴䤶Ꮺ⟤䫉ᒲ❄璩犳ઠ礣埍ⰼ犥ᦕ঍ኂ䒒Œ૦䠘愩☲穄䡮伶⥙Ф▎₝ፚ☬䢐⏲㪄䝩Ʋ⟤ᱯ咵慶႓ゃ㫥抉௄䢔ǒ⵰៚挂䍆ᡨ₺᥄劀ҩ䦘揶⓵瓹ᢒㅟ⏘嶳洩䮐Ჰ㐽岌٧䥕㴀Ӥᗴ戒⼠窀澳䝄㖩ಿ煌㊋ӓ૟ዞ◀界愪㼠瞢墳故ᱯἮ搽ᡏ㣔䤨剢╂何࠭d甁⁃䡦瞫弲⺽ੴ⓬⥈剷楸咩᧠᪻ᮬ㉲ⵆ♪瀣噢ໟⓎ䥟Ꮺ⑒佬䓒▴恉䨣㩄䅯Ჺ⅍Қ䔖⥬历⟕ਨᑊ㎠⍉乳㎳慬䲴煋ኒ⒳冾㒩◪䤩჊Ⲑ̩⁳❅祩ࢺ䙋充ᓤ䥕ጿ㦨⁕Ị⯨ⳉᣃ㵅䮐ᬳ奕劂攅㇞᎘Ԋ仌ᆒ㰴巉皲໇ကⲱ畞ⱥ咪渽᱾燊Чⷲ㢴啉爱DŽ怦ڹ啇䩿䔏ǀ刬◚䵵ᔲ㱔䄀⃲᱇晭ڰൕ᪄㓰碞券˪獄࿤◣ᴱ申秆䤡畣䕋㡾ᔁॎ別┤佉ᙺピ嵩䦳෇᫅ⲹ᥍㝆䢉⥊᏾䕓䓑ᗘ௔獉䆳ᗆἬ洼⅟䪘擤槒ᎄ∮䴵ᳺ㪔䄉㍡巅楩䔼ᕏ㖶а樔卅⒒䮂ǚ㩔祑❲燄❫ʸᕍ䪖甐窴䄗❢䭝ᕊ㞔嵾㽲ൄ綫笴班猪哋䦵኿♚䰄ᙐ㤔䊉右ፆὪ䜿ᵂ剢Ⓚ᤯収☺䱵᧚㸔叩㍳⍦竷ഽ⹄犏ᓃ槚劕䞫䒙ᬰ⸬瀹碲墇⩪䆷畘扢䒻া厍⒖䫑ኂ⒬䇑湲߇㽪嘲೮婻璭঴㏍┼䣭Ṧ㧎ହݳ悄㽮碳5ኊ䓪ӟጘ朄俔ᶋ嵸䲉䏳粦罬Ҵ捑穨䲼᤹Ꮒ⠑䥽ሦ⛏ઉ䶲凅䣩䆾卂䉖㓈楔㎙ٶ୒摭傴濩൒槆ᓨ纱㍇᪊䳋⦗剜䓞䯬䓦㻬昉Ⲣ⏆Ⲫᒼ慞᪌䴏⧩拼枍ヅἊ㿬䕀ෲ㲆惯憾䰩察备ᦸ㌺┺䴘枲✰烩浳⢆歬亿絆پೆ䤬™ۦ஫ᤦ⩌檹≓੅ݩ皳ୂኙ⒲奖ዪ斞乓᫵䞻ᦹ⫒ᒇ࣮⺵留嚇೶姕㌝╘䧓ᱵ娬翉㻒ⓥየ䦻⍞噩筬⼕沸朕䯳ᧆ⌒㬹伲ⅅۭ⦴煖嚋ᓄ楴勶昹䴬ᾪ⤤絎⧳绅㛨ⶸ㭎㪘⳽ᤱ吚柍䧳ᖺ⺌嵹恂㺅᫨ƴ卙㚛ⳇ姶㎆攦了ἒ㍔淩垲䗅Ô喱孙牶撪煇巴䓳瑉ᰪⵌ䌹೓病ǭ綿䐾牿ᰣ⤨狾➾ఓᰮ⼄䃹⭳⤆䇫䠾݃ᢜҴ᧲㋰暴䡛Ꭾ☄扙恒ᔄ䇩ⶲु晠泇ब琗┹俛ፆ㈌拹⢳䴇⽪ΰ杇噲沯妱匼柟ྖ₊⿌檱を嗤⇪Ꮋൄ亚ⲳ榐獙斦䰷ᙻ堬䳹௒䙥擨䆺╟ⱖ侂榢∪攋䯨≖⤬囉抒㿆䧭㪹䭄ڌ⃃㨕ҁػ䧅ᯎ㕬搉熒Ά巩⮱᝟๴峢㥉㏭柱佒氆ⶄ篹ඒ嚄ቫ㮷䵕䚞၆楷㋂І乶Ṻ⼼壱ʒ揧ჭ䮱㝞⹿瓥㦑狃晇丣Ἶ㎅ẙ㽲囆Ⅾ㺲᝕穦ᳲ禗㎖搤䤇ᕒ㷄喙埓ᛆᙪ垸⍅嚂䓦秺㎸曕䲏ᷖ⡤墱嬓䡇ⷮ喷祊�㤑⤽㈲烑䶏Ỻ㋴䉪嬳Ღ売瞻䥢⠢紓ौ犖擶䦧჎◬紙洲万扵㣦彞抗沮ᥳ獺會䠻቞㌜䜙缓婦߯涼Ὕ幩೪㦌㈽景仑᦮「嵙⢳簅㯪㢿彏底㒡礯㊧枇䠠垂⺄簙ₓ婅絪┇佖ẜʸ祠ર䖏䰯᝾⤢佴揓ᠷ㼪殱絏繺ᓗ天ጠᒙ䭮ᘆⴄ旙䙓㽆Nᶸ絖ƌ級祑∨ᘩ䩰䆮⒢䧙榒缇叨޺㍌ū䳥䥔ீ᝗侉ὡ㔜噹᮲䍢㈫殰݁犐㳇䦻ጞ宧旟ᰡ㼜栥䠓娆烨䡸ሯ缡糭נ猴᛿㝧ሞ⮬憙ᤒ帇⿭ᡱⵃ䆏峔祲㉓枏䫯ᓦ⋢媀Ъ㴄ᝯᾸ允ṳ㓟⦋卛昰⵽ẚ㒜両攫⠴䁏㎷惂⩴哾秧㎜ᛢ䮮ឡ⅄弹瞒䪅቉Ѻቕ↘⌕ԩઊ竄⮐囆㥬檹㗲㠅㯪ᑺ罉Ṣ಴礥ኅ旸⨀壶≂三๲㠅牍ᑻ❟乴⓲᨞ఝ⚚䥠庱㤸攥墓厄䉮瑼㭉抗ದؙ刭Ƃ埜ᗾ⊂尠⦫攴懴↹惖慽ಳᦕ૒ᚶ䦖ᝑ䀜቙፲ළ㙏䱳罊䩼ഈ奮㌡敋䱋᮶㫜娥帪ᬶ㍩ᱶ坍⪄ⳋ䗥琍♸〛᳨㤼灹崓䠶䡊漾⃙橣䋀禳ኑ柜⻇ᜑ◢瞥ت䥛昴刬〲ɋ䓡兢㏪ⓢ⵬ܩℲ痥カ紴矯⢺䓏Ω䠬┧猑ᔎޤ州䗼䐹咪帅瑍摷磒ຊⳙ㥠䬋杲⦑ᘾ㙀剥㏓稵⑎⑱絁ⅷዔ䘕⋕䞂Ⲑ尒㞲亥㲫࿆䕏߮ୖ႓˾槲瀪某⬳ᮻ哼撹喪ආƒ㔀䣆⦄ˑ⨙㌄ដⱿዒⱢ䏡ᾫ奱㯪┅烊慲勲ừ૭析⭸凉⒳ጹ୪悵्᩻䃟媞၅槥୚ᚖ伔噱㌲䙥Ⅻ䂷届皴棘癿勵禷珅ួ俳ᒾલ䐹㻒᱆楎呶哂㙠睉夥㊳ᛒⶬ姆㝔䌥⊫⺴䩌ѹ㓁ㅨ㖝繵૘ᓴ⢔奖⤧ጹ䋫Ⴕおࡲ灊⪉㌒☘䭩ᙦ䰐勡Ⲟ㩩໪ࢵɈʲ䳊奺㋧໗嵫稖⥄偙㩂玅塪ҷ㟴๷Ձ䅳Უ₳秄᚜⯸寮㖒癉欫⨅济噾哖妘፡䕼珗ឲ䢿ᗙⅎ↥缘㵇柮癷ᓝ扨ዛ斑ଣᘔ⳯ሹㄜ欙᧪䆅Ὂᾳ὘楤加旑猠図倄噚㣄炅♪䪇䍍乽ˀᥬ㊻妿㏙ᕜ䦛Ᏹ⁲礉䡋电ࡍ䐺䋖䆂㊵㥿㊬ᖿ䬍ᾙ⋌沥扊䯆篮๲壜㙸犬ở絝ᒱ⦜傞㉒䱱翪䑷䑏䈱⒡᥾撺幺䃹፱⿼婙☿⃑絳窵磋㉧䋗䕷ય◦୺杓佐崞㶔箹巫ᖴ棋㎹䋎煹糯秼牃ᕉⰇს㈔缵ྫ♧敋䡱ዌ奯妄娊⪋旈⳴尒㣪墙୊皇柫乹泛຋䫔☓䩳ᡴ⨗៙㕲洵ᅋ≅䓍繺彍斁ዜ䕋狎⠖⭄傥ⷼ瀵籋∅䃍圽獓ᆝ䬑ᖨ⪥攆⳪嫎㘂筩烊撶揪媰⫇斂拪䖠䉧ᘥ⬷柊⒢ٙዋ悷狊祾狃䥺沾ᔩዖ昩⠪凅㸒吵࿲䞆惋畺㭀奩㊻⦽਻ᙹⴐ橖㖼涵㓊亶≌㑽⍆ᅨ櫔㥗䩱ᑤ偰䢡㶊䪤擋埦ŏ⁵䋆ᑲ➅Ӧ叵挂⫺吴園则Ջᴵ⋎⥵睙ṿ䫕ᕢ⫊囯狗ᶾ㜊溵曪ὴ˫妽ᥛ๿檽唠䯁栍⫲屁㞂槵惓撴㽫宾峔斃猋奐歿᠓ਊ傕㽂払崪䪆ᇈ牷捔熙㳸娆⮴晅仔宷囲坵᧋᩷勊ၳ䣅找Ⲥ㛹଩圝⾉ṋ䣊择暊桷䃍╱⛎㖗拖㗧㋍♪皤垕₌䐞Ήõ⇨㉲ے䶁櫁㖎䨬场⣔吥㳲堙⪒拷楏塹ᛛ䶄撥㗀⬒ឋ⫧ᐁあ絵夒毅ා㍲䫂䅪᫰㕍䩙⚻⩺啊㻊孥⩲䛷翩Һ㛓啸洎喬䭱啘䷖峹⟺卵౪渆ᝫհ໐喂䬀痱⫇ᘵ⭖寕㠺淥⦋猥㭭筳糔ᥲ璧㖦⩉ᓘ䠳ᄙ㤲瘵檊慆䓭⬰瑅⥧嬒㖶樳坒⡎嶵Ⅼ䈵㛪ॷⓋ坳່൤嬘疺歘噗⪲彁ⰲ䈵⁓痴⋪ܺ囟湭㊬斕䨪朗⼴儦Ⱜ磥皑䜳⹅䞿䵅煀笛▧䩧圾⳸壝⽂䌕娊朲⏩穳泃჆拆䘎毆哼⽸傽㹜倵下䫴囈桴卙涇⋧榎歴呵⧒媝ㇲ暅ʋ䧴⽎嶾付楮桸稟檻垫⽶嫽␚擩䀻䞄皣䁰㣇㆐媸ඈ±嘪⽎国⓲擥堺溵傈⃳滙煥㕞痹㊭☷Ⳏᱽ㒺榕㠊䞴❈敷̓檠檨奙㉋⢒⯎囵✄毅›櫶橏㽺Ề䵧㪺෬ᬻᛩ⫆唾㤪漭ো噘汎㵹盃⵸܋姣ઘ㘨沯ᾝ㾚匹糲俷ৈ噲络⍹㫏㕶殴㚧⼩ṥ♈亭ᣋ㊥㕉嘊櫁絤ಮ嗯樱䒈歁嫝⊦底㛒᏷Ⓨ疼峉煽܌疄⫞ᔣ䫁墣〉爭⤻组粈᾿ᕇͷ㔮ᖡᨭƷ䧡ᅾ㼂摭强ၷ粌烽燎᎐⛇䕡戰唃⹢囩⚺籭事ॕ埈敹䧃ඔ䫬䴨⯎噈桋ᷮ㤚朙Ⱬ祗沌煹竅ᵭ岺庒毢㙞佉厽㖢䅕⪺噕䦩ύ⧋⍥㫅᦭ᯟ堄ⶉ嫕⁦䏥㼋熆ᕪ፴⻜♩㬞䵡䬊㑑⡆啓⧦根᰻Ω濈㝺᫂卦⬎䗵ᬏ旞ⰹ劣⽢䲭⚻杖絭㣾棒Ⅾ䊷㗗ᯔᕈⶁ呝▚礅喻焅溎㳲ᣈㅷ朋敛᭖㗰樱妑㸬奵䟋橕䧍壾秖槏攌᧥ᬡ㔺之ᓅⅦ杭廪牶ᑩ⣿᧙⥩ۅ䵇᭄㕄澐娞Ⱊ廅浊Ⲇ翏ӵૃ敾╅甧䯳ᝢ汌榕㩅⑵䊵໴擌㎲॑敭ᜁᗵ⯰晼倕᧫⽂厩䝊䇵㵎䓎໔⭨䛅䖂ᭁ㐬濥偳⊪卍㵊ᇵ⇊㲺⋌熞䜆䶫䨰ւ槔嵋㒦泍债Ӗ㖎繺᧏↛઩䵑⎑旕䬏ᖋ㋦檭⌣繷疎⳺㧀ᎍ囙椧狽㝌䩘嗋㶶呩⩋㵖ѩ⡷䗐殜嚫䕆婩㖦榜崣㆚動ช䝕Ύ⍲痈歲✭痸ઇ咼⇾僡㖪䳕煺巄窏嫾䱑殎ᛤ涒尊㙇⩽ቓ≖禍嘓捗廌Ⲱ獈湏᜶㘍ሻ㗓⾭娱㧶榍ྺ惵滌㛼ᔡ啨Ⳍ࢝媋樫⤈忓⭺悭⹺⽴别㵼瓒㮎嫙ෳ橚㚘泼傃♺䯭昊瓗棉䋿壒孽᫭䗕宗政䯾媫ℚ歩稒䟴΍抱淘᭹窴෗⪀啔條弥⍚璵ム枵㊉㓱緊㭤䚰涅嬔៞櫜庙⫖䀽࿻㯵皍Ỵ凞㮛㛾䕅嬟㞖槯ᆓ㒆䆙ᰊ䲅ⶋ⫷䛜熕竖ᗬ⩗㛲毂彰㛡㪩瑛㢗໩ᇿ祉㦑匁⤣㏈甞泱嗻➖圉䙳䂇⤍㋰卖ṷ䓌痙ᩍ商洭怊㶮惍Ⴒ㗶很Ⓒύ㦐ᛑᵛ䨫㕑ࢥ唋㜖䜭㹛浗㾈泵緈ޗ囦ල୦ᓐ榣庥ⅆ漽㋺媕碌㱾棛嵣˻喆ᯧ㗯䩟ឋ❶䥕㵻䗕ႏ槰䏜枛圆ⷶ㪦吡⢣ካ▖䑕ܻᣕ࢈ⳳ䗆厇㜘ᶬ㭘圲濽况㲶䗍殊ᄊ敉秷流兼⺽◼㬖嚥梅咷㤜吥⚺毆䑏ӽ⭊纓糴嶑欏㐤桋勥⣎撙揊·獮嗷⏊஖皬嵍叮堇䦋囧❆䜽⅚ᶕ焎狺竊䆆㓂䶢㫂⚴梀徦ⱚ来㇛╷䭈㫴竆⭨⻲嵦孆眡䩻庁ݟᰠࢠ○㢅坍晭ᠦ溻ٻ㰊琺桻帩䪐᫽㷚ؠ༎䓣寝㞆溸ᓙ䈑⧠ɨ̗Ď穢͠籃ሂ㷰ᰲ睮亮㕜㨸當᎛儗㐎稠䯚徻漈緼篎瞛滧嵏㥴˷ᜧ匯ₐᱝ䏛玔ᔏ⼈߂ིớ␨管痣槴䴯㠾籝ʛ䱸笎任屌ŦỤ㶡㊌婳汇嗬䰊Ⳏ㤅ࢷ磳刱摑侕ぉ嵶⫆圥澳幣㌭⭝֜䘠㨎硠៝侔㢚㶌笋߄ᔷ坸㒾瀍換毘昏ヨṩ⽭㲖K粽Ȩ⎦ⶩ᳃⣝䶛ತ䤡毷៞䞚⺾㴊箪孨曷孭⦬ờ䮛ણㅀ䯾㑔Հ澉㸆稯ƥߚ尅㢦綽ẚ炔ᘏ珶矙澕἗囂篽矾䶈⃯⮘Ặ嶚漖㓖ᗲ滟潵ᕰ綑稵勧毲椏ㆧ୺籝⟖䘊䷌⏺➈磹嶒㬝痃栯僯⽞砑㦥朔Ⰻ娡俕丫ᓷ㴬簋眮䫝啺✖䦝㺚䨗与㟻品෈庾綊稹瞇桫吝᳾纝孚橗ⲋ䷻柎捹㻖㸔㴍䪫沃擒ᑾ礪納廚堌䘡᯵很甓㖉㬳癹㝗囟㠮徝␚尔洓ㆤῘ㍏㬼綃篏矧椡傟⳾嘝嶈⌕瀍㿱俟ٲ粭縆竟瓑⇿娆㠦笭伛ࠔᨋ翶翌òⒹ⥭䥢杽漀欠涎䐝性㐕⥶嘪搱ò䌤Ϸᰌ⇀᧻圸ᣋ㜚❉塇痭૫䂇῞ǚࢢ䂌⣃榿彫㒺ᘣ因Э⠸䢾竬䄒條嚴ڨ່₀㾠端㰣琧氬嶯樃₃彪ǐ晜޵Ĩ᳓恻ɡ绶㸧㣰мぜ῝⭲㙹̽᏷倠ᭀ吠碚崣寨樬᠉妆悉℞ⴸΪࠐೌ╄׶妾枺⌧是ไ塙氳侄櫥䷞笼砝激㚀牡䖣ᛔ穖吼硟嫻惵䇌ሼ䐟扯ᄨ㚢壾䍽䉚⩻䈽硓㌢ᡌ∀܋౬嗘䵠挭փⓍ狊吗ఋ㡚㟃嗚⇱䚌㐪෇特Āξ溡潼攬尰ᠰ⿟ኌ产ᶞ᪼畲勈ㆅᯢୣ揁僁⨸Ⰵ䅅塕䆥㩽ۄ㥭⊐㩃⣖殣䚧港ὠ౓梍斧ى䏫悫⊔᪀൸ſᰉ嬸̮嘹࡛䢉羄懅䎶ࡂ⣨䮈㯐斁䇣䄐䩁圣瑐䗬焘僨䍧㭫癑勘㜰拋ϣ㔑⿦Dz䓲₍猨ӗ䍨ڔ๕淋ؐ汐㤙矌­措唱ቿᅐ崈䷣ป䙦Вᐗ⾞䥽㮦獤愸䉐幖ࣼ⣴兺䇆ሗ਒ᖨ栁寭㾧猲ㄿ䶷乗ँଐ㇉⌸ſ˅᳷क़垖ء咭∥剙墜ヾ↧塵⋉ཱི抄シט权ᩦ㲯㶯ἡ晟㵵⣁␘䛗㝤ᾄ㪴ⱱ篑伲ʬ㮭㤷矧⽮ᇥ⏮ᔆ㐥滥吏㤆梣崦劬粪⩝㟓☱ᣕ⏲扃ᩞτ㚈籱䄽兊窮岬婛ᒊ၅刏ㅫ䧑ຓ࿴㗠ᢌ浣歊㙖渹Tᙑ⣧冶煎䟅䛀τ㨸斱庽ধ㚬抯ٟ婇撈㈏ㄢ傡䓊ᮂ壼孶䛃嵻⌯㔺汔䒟椊㇀㆑䝼䕆ᴦᵌ㰱琠榲ଘ㲉⡞涥ङㆾ₵䛍ഥ⧊峴㏘稝૧⍹儻垩ಾ壧㈏㆜䜉ဖ᢬㞳⧁牃ὃήହ䔿沏壿ᑅ哜ѳ඗ㆼ〵ᐶ瓽䋺䘔ᨼ䙖撅夋䢴Ӫ䆇ಽ⨙Ǩ熑僰勦㨚㦑੟湔礃ㆾⶄ獸ま᣾Ü㌑矑攧ᢕഽᔽ繞ऌ㪤緙䚩ങࡐ㼕又䦣笱⊬䤦⏫ڢ䈸偊䑴䈚䗲ᡜਤ杰₤兡ၯ₺๗篓㤓壸ᐘ䈀䱡ᠵತ抑抎㡇恮Ⴙ慚㱰礎燅掮䚕Ό䮔㷘椑惀੆ⶢ㈿˽䢝㤐燈捻䝇໱ᵇ䮾ผ䲑㇧ᱯ梹彵⩖罔挊Ꮹ戥ɑ἗喸慖亃㽦㾮岮फ़ۀ磢㤑Ᏺ揺䩸➀㌤拢ᩴ午ᾯᯌ㿽粚ᤕ᭍ጺ☽෉Ỳ㙛䠩揱ᴉ窱椾秈琸ヴ囉ᐍ窄䶨ᯬ㔗᫩揣╇ᇤ㲹ٜ墕ઙ爘掞➧䖚ἇ嶸疱監䍇ဠᦁῼ㵵ᑴ⨏哅䛻࿶ᯄ㙸篑䪵჆⸭䊸湑ઝ䓤╄卹ϥ䛯࿪㧎ㆶ䉱ḭ䋃ఢ勺彈ⳓ䕪午⠗琹ᴗੴ癷㥳柅唇柩啑⪛殜⨟Ꮀ㨭┕Ḫㅟ⚎絣ㆧ奮᪾ዯ檈ᔑ今⤣♼唿䦴㳞㺜䳃ᮧ⤖撽啾㷞㓯ᆣ秗⫥ుⰄ㷨硱彳ೋ筯᤹ⵛₐ䤚榧േ⛖䲌涨ᶔ旎➽楊碭炋煹璈㔊熱卹❸䷁ᣣᆵ㨉淳埇嵭᳇ᖽⲗ来挒甔⣮䴊ᣚ㓴獔䑓弚墕ᱯ䍝痊䍫⧮ٽ❚畤䵦㧴淉絳䑦歮憾⓾燍഍⨉區尜³ᬊ㱾㗪悃⋊㓮㠣㵑䲎杳䧸ᵎ➕ำ᫓嘵㚹宽⺆೯㶋᠆㲈瓰Ს㍷䜚琬⡕ቌ畆烽䟦⊖戩捗⪍啼姶厕⛁䷓ᦦㅔ捊糓泊嫬჈㒱仲ࣧ戜㖞㩒⠋ᴶ㍛㿎燓䪳⛯憍䐷嚟朩⦢㖲暸㝘俜㞬民䅓ආɖ▹⧲皀䠪四厼❟㑎ᭂ㲘淹纳྇㽭⺼ݓ㚆垮燶䟝㜦᳦㔍㮹溳洦Ү┸獟畉ᳰ溴玜杹㗡䳆㮬戆燥᰺䗬喻❖懗焆㧯㌷ଫ䶋᪶㩼溦禓㧆慷Ⴆ⏪秠泬䋏඼昹䞌ⴎ㚌精嗕寊缘㮾ⱞ檈纈稊㴃晙᛭ẹ塯婉愓ᑃ⣶Ὣ体皖㓢૙玪暊秏᳎㬓≱䷃ⴆ稵垼睻ࡃ㳨仜䅀❐丱ᩢ㓊ⅽ㵕ె恬Ⴝ彔庀䩪秬㕷暿侁᪢㿘泪䂭䠆塭ࢹ罒嗆埝切㐖䝵侥Ἲ㤼笌䐫伋⁌性ᩝ⚈繳妻嘓珝丏᳽嶈硊旳弇㻯珳獾䆆ⴃ槸ᥞ♾俙ῒ㬜澌僭楊癬油䝑ↆ擧ኲ啍标䳐墎㤢沉䒓㹻࿶璍ビ皝䌒娏ⶣ䙫俲Ễ㕢戜䊕✳掬纊䒵ᲂ紕ᓣ千簁嗃⧚㦢缮厃幺ކὮⵟƑ⋲ᚨ瘘ᜪ瘸壡㧀耂窓І㡍㎾曽皉⭤囃௨៊䷝毤Ȭ昑侓俪१ᱽ理ນě᧺猾᜹眆Ƒㅜ槥偫府Ჴᮾ㭑憝⌏⼓㐂昩咐寱㏌慥巓ܕᚗ牍ⓕ⣬拽ጝ珸ុဘ币㖌绹厵㕓⛮妌擕溃㥸ᨌ獆枪ⴘ廎㢜翥翕⊷縉緍㭻⦂⻌娊㗎柗䴸忉ㆼ燅䰫䵻㙌梎擿㲕䭸׭ᵁቀⳤ孇峜櫺厩㠶浍≪㩕概潿ᨒ୙枆⿫溡㏢毮睓吆㖛̸ⅰƆ紑ী珇ឿ侼怉㦂罅僫㴫ᝏ㾽慘㦟ԕ秋䯠᝹㝝ᴱ䀔箅䧝᳆䵌㦉ቔ槈⮙ሗ嗎⨳磶狊㞬∵劎श癷澏˚俦≁磇涨圝穢嶅徔矶啉ⱶ㝍牺棝㝚⋣ᇎ⏇➄ⴂ幅㿨戉孭ᒫ䕯ƍ║Ⲏଌ檠丒㎉⿢槨孪掲䢫猺ῇ䜽糕࢐㋾斾⬴噪⿨奁㞔硵礫幷奎卋䳖纊浾䊹௃ឃ伪嶅夲檅呩梷勎⫉泝憀癳䓤䯫ᛉ❄嬵㏜砹傓撆磎㑹幐׌糹喦௨枕佶ߡм槰Հ杷ᛏ⼽仰⭕欛喠㌶竽Ⲯ楁㍓❄欫枇壭Ѹ竖ᚇॺ曰东᜔⾦彦㛴捆歋康瓏ኼ䛗চ᫣䛔欥⚵⸅ᬌリ符煓㕷楍瑈⛚⚃᫰禺௔ᨨ㗦寭㹺檹䷭ᔆǏㅿ竛疏䬏凷ፁ⩎ᔚ塁㢊淕悋橶ῄ⵾㭑㖓䌗樟䰗ᚴ斮寱ㄊ慥湋枇㣏䝽⅙ᶐ⫢Ⓟ殚ᛑ⺒庮㣚穙猋ۇ㫏ⷬ㺷ຏ㣨嗠玸嚗⿊姥㟚揕櫳⻷㡏絩Ố云崐㨘珧䝹㙜娡㲤瑥栋᠇ᗏ智䣑䕓紀ן毙松⶟ᬝ㆕㊦妓ዶ䋮㣏坑ඟ㬞ᨛ歧杇員屣㌒愭抋䫆❍㚽瓜媖笙榺獳埄圈寭㯔故浓枆孍㕽㽹涏择ඤ䥙朔⼼媍㿂祙笻⑗滬僸˒╆瓹ᘝଥ曨⺨寁㄄歁彭准Ꮞ登櫖啌䋸෱ᭀ᠁ۚᵍ㓆⠅活ὦ矌᣻⻘ڍ䫲䷥ᬪ㠇䰹嬃㸼枭挻䲲犏捹祜憉欀娅௙檟哹岅㗭㦵帕䝗㪎筿槞䎛ܐᛌᬵ垬漘彶㚆搶嶋䮺䪆糼㛜㓋扪㗋氙國࿅ᾚ㍇㦩撻ᗷ劎ॺ৺斌ۮ㖧㍠猤⾙夃㮶濭愻梇䒍福筴㇄ᜈ曒孱歃✺娽㔒㊅䪻楊㍏哾俼⮀⬖䖨ᥫᝢ浕屡㾦䳙䍩反綌㉪㧒姑䚰淪䦪㗦津̃⁜⋅रᜣ⹍ℹ➢ýǑ▙宼硺洄᪡㢚畭⳻㗖䶠᛼䗇宒㰱尣寸㤡⧮囶⬷ຕ㾻ڶ噏⚴伣㮐䳃淥樷祌ᆠ㎙䮟ḍ瑚ᗧঌ⓺絒䮇㛷渑⫟晷卌ᥳ⢠䷕㥦䢗᷈䛹๑呮Îڤʨ盢㔨䎩û夨߻ᰘ∃冺䂄抟眔䨍密㚇ă峧㊡啤㩛岖事㳱猲拦仴壖᜜堎潇㟇㮼㌏⭛垨檲㿃漆熆晙⺎㯧川枓劇㞒綞᝛瞔ܳ䗼⛈㵿㜅◘㖔ᢅ沽奂ಞ䷍獛˵଎䨆⯖壣⼉淃ሇ喕渕ᓷ㓸ս嫓ዖ友䱠ᯟᥨ滱䤋㲮䝃ᅱ῾宎昘䌳᎖䔍㓺怤瞞漂䧛㳌㤍泛帟�䋾禔稰⤭ᅍ⢫㞉桐㶣⃎盘⼳夗㠾牝戼澖ी⏸⽤侉悼拝⒉癣滸捼஢ଢ଼咛े؊嗽௕䀯ỡ㸔筬楓湇姯㑞፝勪拢皎✷某澆Ỵ䶽尅睻海妏ャᝌ ੻ణ睗㎎憠௛ɮ⨼嫐䐎㕀࿔㢱塍䘧ₓ矕戙㌹ثゎ㘠檰甑ↁ㈨徖ୖ緃ᄫ瘵稉惕⟞焍匛⌜Ⰼἷ⿑䠳㼍ᰣ篇瞗湖ћ㋮à㜐㦗⤭ᑇ截羈⹒綬䁲㡨䥿嵐Ξ惼ఛ愚瓶㿼殿䐫࡜7㵅̀ὠ㴗嚠⌝䟢.瀡_㨷Ą滈ϒ㠸࿣矸䂬ຠḁ瞓碦࿣匼ણ羑偊綼倻癕ࢰ㾍⁡榽ᛲྵ䔊ᡙᚊ押䈃䡫篴࿕棐㴒㛴䞣䪴㝷濱⡠檾䡬䈰䐓⣿矯漟峀粈ண䏸ㄯᑀ⑛啠儙⠤䏮䌵ჶಈ㻷२஝ᬀ櫹䪡ѕᅧᣛ᝭䮃ݦ䩷睚ב䬤ෝ恛㤖⁒ⱘ䃤੮ᵒ䩽⛮࿫憜ㅠ皡泥ᮧ☌噈籛巶Ꮎྀ␁筨㥧況悍䱘Ͱᬠ慁㑣㟲ợ1㊵硙ጎ慓⊁⟤ෛࢶᰐ垲᤽⻇⒔䎹䂜炌纥࿕懤㾒ࢱ櫙੧碰䨱更撞瑆刐â䠊؇T❠㑱挚ᬠ嚮┿怣ᒕᰩᇤ䥪䟪ᇊὔ㤈玿ടョ亯㸛䙘䫈ς<斔䉓༁䑶抨籄ᰘᴲ籱ᣥ涰Ⲕಶᇚ⅍恖ಥ捌㩠Àᘊᒎ䈄笾伵.⣲爄⩺壷๘㊠G໰䷸䵂➮଴瑜ҧ億ⷁ䐉ࠝ㣢ɦǾคƀⶢ垯ᡐ䅞䊤ᄼ冤᏾呏祜䍖ɨ缄ᥠ⭔Ҁ㹣ὢ䊑憨≘Ꭸ⠉אŢ㶂䌩狢ẘ祠ࢽᅞढ䔁瘮ᐏд俁†Ņ士┛⹞Ꮨ❤亀ɂ㹽䱄ᒪ㵇䵩㒿Ⅰ ᗑ䟩憳泜塯Ҽ怦ኖ攅䌨!➺䤙἟䒏㨬氢⪁℥〳ᘋ孆梶⨕ḱᎮ矯䃘Ç೉捳犛㦰ള畘ᖇ㺐῜ೄ廀皿媾៨伛㫰㴛㛽⻡暥檑࣡槽叚呖伽ᷧࡔ೶婝棆笚ᑃ䩌䓯甗樔⚀柿䍂䏄ᒪ௵ᗵ暠㠡⟣罒弡ᄀ㔤⡻⢣摢䃁䗑䬶ᳱಇ㣯Ủፚᤪ⊣ᙀ祔ᣰ儰ƥ䟾噹秳䏸䫮畲⭟ॏټ凝㰦柰侸氂֕䤹᳉䓇⛮渤அ楬䙮廽㱤ᎎℛἃ⩻㛞᪙儇睁䓩קቩḮR䀰⟩ご䋖㡐໹烾穓८殢ݛ䢢ᴖზ琁柳五恦㼕桀੓欴愐幑❛呤䴅㻮㐘朶揢䉽Ղ䪙畓巒៯㦃Х䦮䡳称尸ü㣠N㿁ųዢ㾌ተб᝘ⷡ␶᨝玧屗佶儞㯊䐙祴⢸⿯廚㽟⦮㴖Ȿ䡋杝ऀ屰㰜烝ါ玼၎⮾ὧ槥̗᧢㏧朹䅨叁㼐䝥稴 ㉦៖ᦸ崫䏏רdз㌮劢素.僶⼸ᒪᬷ㫈汽ᣝ㆞挂G௒᠔J⌑㦠E灼㊇ⰠⱾ䓝斠'滅盦⚷䥏剿㣛䦟挐☀ᎷÕゔ巵⇲紪୫祦⭏㵰㣚熒徇䘁䯅ង侊⃹㤁䗅狫樷縋橼ベ竪㌝♛䰍ᤞऒ抩䉛છ⑋嗸㽎ᮂ䋞硡ଉ亨宇稩⹂㎋剪畾䅋瑈ᨡⰣ刴斕ⴖ刮⯚呙⽄㏢⢗㪛㚓凩噈敼܀溧挅堶偸⟐憊扵㣱䱵眢稤ᆬ偂䏿燅₽嘙⮪沵⺨ჵ㶦併暘ⶢ㛎ⶠ㫜惦ᬋ㬭竐恭⿁淭㸊俵涢⃷㫎勐㜠橀嬛⢳Ⰼ勐毿湸䊓䮵矝឴㮄ݼ畀䨠焕瞖ᰫ岧⻒ᵽ㢐稹紋樂崑䶧矎㶘ഘ杕㠣⟊ჾ嵘ᆄ־甖⮂㿏愨⮇⋠䬇呞硪堚຤廍⇮倕愹嬘₏枏籂戩楾ヵ移ై潃ᅭ❦緁碖ᑗ狀ჼ嫟掑̞峄や㲾⁢Ȩ㱰璄ଭπ尘⟧ὤ掖䜏但剆㟸漗䭃㢖߄ክ㥦Ⱡ峽ᄁ㟾㑴ญᬢ㜴䅁嶣㥿㩭玠㥗੡ᓿ䍭⢓✊䠽᮹⦬瀙崓㶆盍稡綨瀨䣆⾤疙獧ⷥ硱䐫଩差㹆狞繶ᑗべ又┢ᔂ沮᳘栿ⓚ玕弻䀔䴍棻旑∐嵪࡚哛⚻淰屳㞉䇭彨㸶筋ᄠᤌ噸Ꮡⶀ敯帶凹㸟㝬樝幘㎼㸋彂㩱崨缲䎽䋮綕紵䎻垲䂡⳹㔥ㆡᾊൂ籠潲壃店䴚䘑䮾B䁷᷎㴌疌രᎰ妮瀢㚅ਣ嘦◧ၱ†Dဣሇ⠦搱擉ਲ瞯⠽ᠸƿഞ樾ף㩃碠柘Ოⰺؕ㯄枇ላ嶡㵼繸槛嬗๡嶠㯚瞑̇帟㯡矣湼犯㾾繝昰䘗ᯉ倏㬡箟ឃ绡䁛瞫湈峡㿬禔ඛ奒揃෼㝞㞗⼗㸛㯰ㄧ湷洿㠾绽甛哜琎俼ߍᚏ䐹縍篿ㆆ䣫彠紴ډᩓ北䩎྾埜ʥ缍姶篿睛滻怏㫉ു琧䨗͠柿傃䄘䈓͕ߴྶ燃旍㷴棣汸㛘⬎呿゙㞛䈓㷧㎢ྠ倠㼰缎稬㤛砯ਿၝ⢙渪或Є䠑ź䲄㱐ɡ笡繧娯䬎ᡝ忙垗缑摗޿睵ℨ㸏㨡牣抣夯儾⏼⒛瓦䈂㸙䞦ཙ粬sၾ҃ႉ䕸瘾塝ತ羐漟Ў䠞ཤḬ㴨簎瘣梛墯䇘偞爱䕘眾損䟯吴䃑ɐٺ乱奰㑯ⶭ⃗塝哥ਆᐅ叵ऑỲ㹻䔴ख़ፇ扯઄㥞ᛅ┟䨌缒⃱瞥ἒ㻤経慳磇狴湩気矍䙖愊⇹橸掓⑭夶本㡬⧇䖌撿猱媚挰䲗檻杽⛯奄ᶴ罡䙓礞ᣯ◴磳嚫ⴼ嵾㐏⩞倌䜶㰽໷㝓愈矑爨◦㮪ӌ樂㏹橐␗⍩໯ࡀ䏉߳尠ᨏဣṞ笍甉∡傋俖捪䀜畂侓恓可㞃↾⺜紝籀缏栙箛瘡㳜罥橥 猘ᮾ彾Ⱨ̑弲ఊ䉃ಹ䣕̢箔悫筰く斾ⵜ凇爪䘉௤᠇佛䢑㰢碼䲫篷À瑾ݞ庝ⵦ☏௷柾杤怜ႚ㻔ྵᑰⰐ筯㚽暦㌚昄௿㝐⿎乙㰰㬅綽綷检乾橉؆攠␢堶ျ侽䅸狯㴢⥨ኹᓏ᥾狟䚜化㪱Ⰴ埮ò当ዪ絎✍楷盏ᕿ竞翠䬔㾛毆垭将䑶㻴䓕犪曫᷏献䉂ᶚ㷫⬊ṙ⌷⾛䦁叚磥碓欷柏㝿槆ްܝ瘟ᦖ寓⽸晶ᯰ佨∻甤䕏偿⭲掟傹咩᯸㟅䡎弇凤䌋⬂䙗䒏⩳᧟ద朔䨓ఌɜ澰琬Ɔ缌ຳ狤ڏᛡᗟ亟ଘ㘆ⱴe宦暸惚翁ဟ㫷䦏➎䷞㮘ᬕ嘙寳垧偭廝㺫捍癛箷瘎剈⇜ޚ绪瘔碫垣Ⓝ任㷚⍍糛海䊏ൿ毞灤ᩝ଩㰎矧⒅庶䋖穀砦׷䨏䷾㳞᎞ἓాพ矻潫䢯㵖窸兰燽妏埾㔬屁嬕㞣簟米ᐼ᡽㺞绹忌ⵐ⅞⻕⫟䩕ȓಗⰄ࿿《廑㽡缣矋笁䜬⑟䛟⾡♣䘛䇖࿉澈㵨匄ᑥ筹ᬯ瑈縀䡁ℝֻ⪾߶矤ᾴ㺻ᗻፃ癕ཱཫ潼ձ⾞伓ܕ洆剖ὴ检Ȋ▷俍慽㎀㹞弋⣯䜝㸌畐倞ἷ㣁㹀ʳ穇朚炿拌ʞ珸催吆⠛လὐ滴籉綳瓇睯湸სᎳ㔣炦羌ἅ䑃ᾉ䥬纉笋橥ዯ䦿ࠁ帳洚樭㐔䟥ဲ峖ᨗ䂙篣箇疊ឿ⦿᪳紞䌌ὰ砶ၪ㷯畢羥稓琇咪ቐマग槴䘐䰊攲〒ῤ畲統缳燧洊᱿穀咜߰昖浞戼⾺ଗ漖忹ԫ穷曯䱿嗈▟朢ɐ䛮埸X熑㿜翅繢ՙO噿ⵞ㦞䌞稕⽯埬枰弽㽺ㆴ㞋眠ᔍ㋬㊭咜┚挗ఔ㠋㴢彃㻆累囵䡳爐ቷ璥᚜㜙஝ః㚽倕忉⹘㎍罪老ᬠ㈇縋枝畡ݬᔉᇬ䰎柢ุ䋺*ԅ᷸ᒇľ㹟ᓜ春㰒䨚㏓怏佁ᰣ簡䮗笘зߟ曃Ἕ㬪簘ᑛ瀏྽漬㶂罛甹紳簇䱮ឞ侉抖㴂孑吰䀝冨䂮㢧瘃෸ば㵰ᾟ战䪙䠕秭䭪㿙ㅑ翃窏㦂຿痿沞巂爟帐⠝ᡄ 㾉ㆁ耈罇瘗朠቟⪟潹᨝嵡弾倜叾ᓫ烑羺ᇧ灩漏塟ພ依ਞ䐖䬴俼 ࿋⥧捃筘絏槴㾤涞ጞ秼ƨ㠙倌忶䀒罡糏弧积敿偰ẟ欝稜氖㪴瀆檉㾟㼻ল۷狊ᗑ៟㶟㐁娜Ⱌ♰俫瀛䀏慑Ƴ纗疫綜㳀ᶞ盨搙䀡砉㈢㾠㿞繧換筗猁๿升㲟粡ᘘᠥ栕⿶⁾㾠’纱Ⅿ眿曫֟綞㠬Მ㜁欑`忲⾕缂≒ষ疿拿亟皟䈞渝ࠖ簑瀉㿈翄桻籗糏章撟実ᬞ⹐⠝䠔㠌㧲㘹義翻罤┏牉篟瘇弞儝䐚Йခတ翶㓍羇缫硦戳统実┞燐Მ倚币㿱䂅耑ㄣ罻翯硿箟䄟䄾̜䊛ဒ䀊翴翫羗翏綾硡ⅿ篿磍䉟筨㣻筋稗磣租窝砱笠ܿ祑䊟硿簊䉓ࠠܛ㤟⋀ڇ磏穖ƠѰ㡠з移簗硧碋稏筞䀯䆟磻檀ӷ䋀׀џ㭰僰րџ穻笇簀ӟ秝碷篟窱⎰Ѱډ䎐ܟ箚Зᩗ篯娨Ҡۃ䌀ٙːذҳ笰՛窰܌₨руₗᤨҴ㍈ۇ竇㢨ڨҹ䎨ࠃ礗穠֏篐Ӡַ竍⏗ᢊ㤣笔㇈݀ݽ⋧祗簏⭸Ԩբ℈؇稈аՠ׋磨د秨պⅾ搛祽℘ޫ簐߸߈׸࠘Կ砧筐ߏ笁㪏箓笷礸ԯ筞䄤Ԑڪ劤Տ簐ݑ⎛祸㩦�٘Ѥԧ碏簈ӤҐ۠ۍ⏄ܘڊ⊴Ф׋檐˛磧歴҇箤֗稄դдԷ礏碰Ѫ㡴֤ۇ槴ޫ筀ࠀ㪪˰޵簔ֈܫ䅘٨טާ磻ϔЫ第وݥ䋬ցူ㬤ھ欬Ҭއ秏祔ٝ竘иݠҘڐۍ⋌׬ܰ㥌݀ӈ㦌ج޹穀Ƽ޺䇌ۏ硋祟磘אݨլۨѪ㭼߆ńӹ䏜ёʼճ㡋㤜Ѽࠑ厜иģ磽笄ќࠄތشԴֽܸ⌢޸دᏢ݀ݍሬȢڙ僂ސ˼Ԁޢޠݟ票ߘӜژѪ㢂јշ儐㭂޲ׂࠏ割ِڠԂ؀؂ѬהۜЫ碲тҽ㣲܅䍲㥲ܧ厒۲֨܄׏㮬Ԍвۗ㣒Ғ㪜ء䈒֒݌ѓ穀Βւ߀ȧ礪ْҪۤ،ֽܴ⁊Լժۃ簘ℒ㤒э债ࠒވتآ䌪شפ֘۳䌺ޘ⋺ܒ㫪٫硄䀺ي݊޺ۊݢպѪ㣚ԊԜ䄚Ҕ䆚ʆ䁳㧚寽䌐䐐䈨䆆˱䋏䂼懟Ͻʋ�䃙䁮¼䀱̰䇸䇳抸Ջ拯Œɗᄋጪȅᤡ㧵珋戗Ƈϵȯʃˋ7Ô ëூ猅aů፞ȉɸ᪣磨ͰǍĴƚƂ匿⊙ÂܳĂ㠰̲ǡ憀͆ضñ°䎀ͰȮܩ̼䂘秠̨Ȅ䅗ʮߍ㪬ЀŮրŸࠩᇋ恧㭜ؙϙ窪ʈŴ㭣㨀ի惠䍦҉ˀ䁈ˌ㬟Ǧ䋱ʋɾҰ䈙ɦⁱ偳拄㪸␇硧折ňǎچǤ㥎УήؘΞӮٴ䈞ԘήܴġҎٸᇋ怠䋳䌠䍊Δ怾ج㤾ѨҾݾӤ䈣Ǿվ҉䄓Ɓўג*䋿ϋ拞ש禿͝ၣ዆֚�ЁĖِ㨖ހȤЖێױ䌖Ũ䎮ٮӑՀưΟȀ㮅䃊䍘䌖ȴ̈́䊘ͰőЩ֠䃎ީާ㬩ݨňĂ㢑ډ̖ϲdžݨ̴Ă㦞ڑـ̰ĩژȡډމޮݥ䌛ũԉ׆؃φǭϼၥ玧㪰䉄祹ӐうΥ䊎Λ℉Ւϯț᥏ď䋇!愠  "}
      

    The complete round-trip took 42.2 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.4.0",
          "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":7}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11139-IhUsRYFZ3zEQ-.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-11139-IhUsRYFZ3zEQ-.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-11139-IhUsRYFZ3zEQ-.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-11139-IhUsRYFZ3zEQ-.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-11139-IhUsRYFZ3zEQ-.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-11139-IhUsRYFZ3zEQ-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-11139-IhUsRYFZ3zEQ-.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-11139-IhUsRYFZ3zEQ-.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 15.8 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.4.0",
          "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.4.0",
          "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":5}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RFunctionCall","named":true,"location":[1,1,1,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[1,1,1,7],"content":"library","lexeme":"library","info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":0,"parent":3,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-11139-peZA5egRWdct-.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-11139-peZA5egRWdct-.R"],"_unknownSideEffects":[3,7,11,{"id":36,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":50,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":67,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":89,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[1,3,5,7,9,11,14,16,12,17,20,22,18,23,26,27,29,31,24,32,34,36,38,43,44,46,47,48,50,52,54,55,57,58,60,62,63,65,67,69,70,72,74,75,77,79,82,83,85,87,89],"vertexInformation":[[1,{"tag":"value","id":1}],[3,{"tag":"function-call","id":3,"name":"library","onlyBuiltin":true,"args":[{"nodeId":1,"type":32}],"origin":["builtin:library"]}],[5,{"tag":"value","id":5}],[7,{"tag":"function-call","id":7,"name":"library","onlyBuiltin":true,"args":[{"nodeId":5,"type":32}],"origin":["builtin:library"]}],[9,{"tag":"value","id":9}],[11,{"tag":"function-call","id":11,"name":"library","onlyBuiltin":true,"args":[{"nodeId":9,"type":32}],"origin":["builtin:library"]}],[14,{"tag":"value","id":14}],[16,{"tag":"function-call","id":16,"environment":{"current":{"id":147,"parent":"<BuiltInEnvironment>","memory":[]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":14,"type":32}],"origin":["function"]}],[12,{"tag":"variable-definition","id":12}],[17,{"tag":"function-call","id":17,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":12,"type":32},{"nodeId":16,"type":32}],"origin":["builtin:assignment"]}],[20,{"tag":"value","id":20}],[22,{"tag":"function-call","id":22,"environment":{"current":{"id":157,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]]]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":20,"type":32}],"origin":["function"]}],[18,{"tag":"variable-definition","id":18}],[23,{"tag":"function-call","id":23,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":18,"type":32},{"nodeId":22,"type":32}],"origin":["builtin:assignment"]}],[26,{"tag":"use","id":26}],[27,{"tag":"value","id":27}],[29,{"tag":"function-call","id":29,"name":"$","onlyBuiltin":true,"args":[{"nodeId":26,"type":32},{"nodeId":27,"type":32}],"origin":["builtin:access"]}],[31,{"tag":"function-call","id":31,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":29,"type":32}],"origin":["builtin:default"]}],[24,{"tag":"variable-definition","id":24}],[32,{"tag":"function-call","id":32,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":24,"type":32},{"nodeId":31,"type":32}],"origin":["builtin:assignment"]}],[34,{"tag":"use","id":34}],[36,{"tag":"function-call","id":36,"name":"print","onlyBuiltin":true,"args":[{"nodeId":34,"type":32}],"origin":["builtin:default"]}],[38,{"tag":"use","id":38}],[43,{"tag":"use","id":43}],[44,{"tag":"use","id":44}],[46,{"tag":"use","id":46}],[47,{"tag":"use","id":47}],[48,{"tag":"function-call","id":48,"environment":{"current":{"id":189,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"name":"aes","onlyBuiltin":false,"args":[{"nodeId":44,"name":"x","type":32},{"nodeId":47,"name":"y","type":32}],"origin":["function"]}],[50,{"tag":"function-call","id":50,"name":"ggplot","onlyBuiltin":true,"args":[{"nodeId":38,"type":2},{"nodeId":48,"type":32}],"origin":["builtin:default"]}],[52,{"tag":"function-call","id":52,"name":"%>%","onlyBuiltin":true,"args":[{"nodeId":38,"type":32},{"nodeId":50,"type":32}],"origin":["builtin:pipe"]}],[54,{"tag":"function-call","id":54,"name":"geom_point","onlyBuiltin":true,"args":[],"origin":["builtin:default"]}],[55,{"tag":"function-call","id":55,"name":"+","onlyBuiltin":true,"args":[{"nodeId":52,"type":32},{"nodeId":54,"type":32}],"origin":["builtin:default"]}],[57,{"tag":"use","id":57}],[58,{"tag":"value","id":58}],[60,{"tag":"function-call","id":60,"name":"$","onlyBuiltin":true,"args":[{"nodeId":57,"type":32},{"nodeId":58,"type":32}],"origin":["builtin:access"]}],[62,{"tag":"use","id":62}],[63,{"tag":"value","id":63}],[65,{"tag":"function-call","id":65,"name":"$","onlyBuiltin":true,"args":[{"nodeId":62,"type":32},{"nodeId":63,"type":32}],"origin":["builtin:access"]}],[67,{"tag":"function-call","id":67,"name":"plot","onlyBuiltin":true,"args":[{"nodeId":60,"type":32},{"nodeId":65,"type":32}],"origin":["builtin:default"]}],[69,{"tag":"use","id":69}],[70,{"tag":"value","id":70}],[72,{"tag":"function-call","id":72,"name":"$","onlyBuiltin":true,"args":[{"nodeId":69,"type":32},{"nodeId":70,"type":32}],"origin":["builtin:access"]}],[74,{"tag":"use","id":74}],[75,{"tag":"value","id":75}],[77,{"tag":"function-call","id":77,"name":"$","onlyBuiltin":true,"args":[{"nodeId":74,"type":32},{"nodeId":75,"type":32}],"origin":["builtin:access"]}],[79,{"tag":"function-call","id":79,"name":"points","onlyBuiltin":true,"args":[{"nodeId":72,"type":32},{"nodeId":77,"type":32}],"origin":["builtin:default"]}],[82,{"tag":"use","id":82}],[83,{"tag":"value","id":83}],[85,{"tag":"function-call","id":85,"name":"$","onlyBuiltin":true,"args":[{"nodeId":82,"type":32},{"nodeId":83,"type":32}],"origin":["builtin:access"]}],[87,{"tag":"function-call","id":87,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":85,"type":32}],"origin":["builtin:default"]}],[89,{"tag":"function-call","id":89,"name":"print","onlyBuiltin":true,"args":[{"nodeId":87,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[3,[[1,{"types":64}],["built-in:library",{"types":5}]]],[7,[[5,{"types":64}],["built-in:library",{"types":5}]]],[11,[[9,{"types":64}],["built-in:library",{"types":5}]]],[16,[[14,{"types":64}]]],[17,[[16,{"types":64}],[12,{"types":72}],["built-in:<-",{"types":5}]]],[12,[[16,{"types":2}],[17,{"types":2}]]],[22,[[20,{"types":64}]]],[23,[[22,{"types":64}],[18,{"types":72}],["built-in:<-",{"types":5}]]],[18,[[22,{"types":2}],[23,{"types":2}]]],[26,[[12,{"types":1}]]],[29,[[26,{"types":73}],[27,{"types":65}],["built-in:$",{"types":5}]]],[31,[[29,{"types":65}],["built-in:mean",{"types":5}]]],[32,[[31,{"types":64}],[24,{"types":72}],["built-in:<-",{"types":5}]]],[24,[[31,{"types":2}],[32,{"types":2}]]],[36,[[34,{"types":73}],["built-in:print",{"types":5}]]],[34,[[24,{"types":1}]]],[38,[[12,{"types":1}]]],[52,[[38,{"types":64}],[50,{"types":64}],["built-in:%>%",{"types":5}]]],[44,[[43,{"types":1}]]],[48,[[43,{"types":1}],[44,{"types":64}],[46,{"types":1}],[47,{"types":64}]]],[47,[[46,{"types":1}]]],[50,[[48,{"types":65}],["built-in:ggplot",{"types":5}],[38,{"types":65}]]],[55,[[52,{"types":65}],[54,{"types":65}],["built-in:+",{"types":5}]]],[54,[["built-in:geom_point",{"types":5}],[50,{"types":1}]]],[57,[[18,{"types":1}]]],[60,[[57,{"types":73}],[58,{"types":65}],["built-in:$",{"types":5}]]],[67,[[60,{"types":65}],[65,{"types":65}],["built-in:plot",{"types":5}]]],[62,[[18,{"types":1}]]],[65,[[62,{"types":73}],[63,{"types":65}],["built-in:$",{"types":5}]]],[69,[[18,{"types":1}]]],[72,[[69,{"types":73}],[70,{"types":65}],["built-in:$",{"types":5}]]],[79,[[72,{"types":65}],[77,{"types":65}],["built-in:points",{"types":5}],[67,{"types":1}]]],[74,[[18,{"types":1}]]],[77,[[74,{"types":73}],[75,{"types":65}],["built-in:$",{"types":5}]]],[82,[[18,{"types":1}]]],[85,[[82,{"types":73}],[83,{"types":65}],["built-in:$",{"types":5}]]],[87,[[85,{"types":65}],["built-in:mean",{"types":5}]]],[89,[[87,{"types":73}],["built-in:print",{"types":5}]]]]},"entryPoint":3,"exitPoints":[{"type":0,"nodeId":89}],".meta":{"timing":7}}}}
      
    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 27.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 df-shape query retrieves information on the shape of dataframes
              • type string [required] The type of the query. Allows only the values: 'df-shape'
              • criterion string [optional] The slicing criterion of the node to get the dataframe shape for.
            • . 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?
              • direction string [optional] The direction to slice in. Defaults to backward slicing if unset. Allows only the values: 'backward', 'forward'
            • . 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'
              • ids array [optional] Optional list of ids to filter the results by. Valid item types:
                • . string
            • . object The search query searches the normalized AST and dataflow graph for nodes that match the given search query.
              • type string [required] The type of the query. Allows only the values: 'search'
              • search object [required] The search query to execute.
            • . object Happens-Before tracks whether a always happens before b.
              • type string [required] The type of the query. Allows only the values: 'happens-before'
              • a string [required] The first slicing criterion.
              • b string [required] The second slicing criterion.
            • . object The resolve value query used to get definitions of an identifier
              • type string [required] The type of the query. Allows only the values: 'resolve-value'
              • criteria array [required] The slicing criteria to use. Valid item types:
                • . string
            • . object The project query provides information on the analyzed project.
              • type string [required] The type of the query. Allows only the values: 'project'
            • . object The resolve value query used to get definitions of an identifier
              • type string [required] The type of the query. Allows only the values: 'origin'
              • criterion string [required] The slicing criteria to use
            • . object The linter query lints for the given set of rules and returns the result.
              • type string [required] The type of the query. Allows only the values: 'linter'
              • rules array The rules to lint for. If unset, all rules will be included. Valid item types:
                • . string Allows only the values: 'deprecated-functions', 'file-path-validity', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention', 'dataframe-access-validation', 'dead-code'
                • . object
                  • name string [required] Allows only the values: 'deprecated-functions', 'file-path-validity', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention', 'dataframe-access-validation', 'dead-code'
                  • 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.4.0",
          "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":4}},"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-11139-dRbJI9GLQNvf-.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-11139-dRbJI9GLQNvf-.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-11139-dRbJI9GLQNvf-.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-11139-dRbJI9GLQNvf-.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-11139-dRbJI9GLQNvf-.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-11139-dRbJI9GLQNvf-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-11139-dRbJI9GLQNvf-.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-11139-dRbJI9GLQNvf-.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 7.6 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.4.0, 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.8 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.4.0, 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.
  • abstractInterpretation: allows to configure how flowR performs abstract interpretation, although we currently only support data frame shape inference through abstract interpretation.

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
    }
  },
  "abstractInterpretation": {
    "dataFrame": {
      "maxColNames": 20,
      "wideningThreshold": 4,
      "readLoadedData": {
        "readExternalFiles": true,
        "maxReadLines": 1000000
      }
    }
  }
}
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.
    • abstractInterpretation object The configuration options for abstract interpretation.
      • dataFrame object The configuration of the shape inference for data frames.
        • maxColNames number The maximum number of columns names to infer for data frames before over-approximating the column names to top.
        • wideningThreshold number The threshold for the number of visitations of a node at which widening should be performed to ensure the termination of the fixpoint iteration.
        • readLoadedData object Configuration options for reading data frame shapes from loaded external data files, such as CSV files.
          • readExternalFiles boolean Whether data frame shapes should be extracted from loaded external files, such as CSV files.
          • maxReadLines number The maximum number of lines to read when extracting data frame shapes from loaded files, such as CSV files.

⚒️ 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