[
  {
    "lines": [
      "> v3.0.0", 
      "", 
      "Welcome to the SignPuddle 3 API.", 
      "The API is defined with two types of source, two types of documentation, and a live page of HTML and JavaScript.", 
      "", 
      "+ Source: [ApiTxt format](../src/index.txt) and [JSON objects](../src/index.json)", 
      "+ Documents: [API Blueprint](../doc/index.md) and [Stand Alone HTML](../doc/index.htm)", 
      "+ Live Page: [API Interface](../api/index.html) and [JavaScript](../api/index.js)", 
      "", 
      "The API is divided into several sections.", 
      "This main document includes all of the sections.", 
      "Each section is available separately as well.", 
      "", 
      "## HTTP Request Methods", 
      "", 
      "The SignPuddle 3 server accepts HTTP request methods of GET, POST, PUT, and DELETE.", 
      "+ GET - retrieve information without altering the server", 
      "+ POST - add information to the server with each request", 
      "+ PUT - update information on the server", 
      "+ DELETE - remove information on the server.", 
      "## HTTP Response Statuses", 
      "", 
      "The SignPuddle 3 server responds with status codes.", 
      "", 
      "### Success Codes", 
      "", 
      "+ 200 OK", 
      "+ 201 Created", 
      "+ 202 Accepted", 
      "+ 204 No Content", 
      "", 
      "### Redirect Codes", 
      "", 
      "+ 300 Multiple Choices", 
      "+ 304 No Modified", 
      "+ 307 Temporary Redirect", 
      "+ 308 Permanent Redirect", 
      "", 
      "### Client Error Codes", 
      "", 
      "+ 400 Bad Request", 
      "+ 403 Forbidden", 
      "+ 404 Not Found", 
      "+ 409 Conflict", 
      "+ 429 Too Many Requests", 
      "", 
      "### Server Error Codes", 
      "", 
      "+ 500 Internal Server Error", 
      "+ 501 Not Implemented", 
      "+ 503 Service Unavailable", 
      "", 
      "## HTTP Headers", 
      "", 
      "Headers pass additional information about the request or response.", 
      "", 
      "### Headers", 
      "", 
      "+ Content-Type - the MIME type of the response", 
      "+ ETag - an entity tag used to validate cached values", 
      "+ Expires - date after which response is stale", 
      "+ Location - used for redirect or for newly created resource", 
      "+ If-None-Match - request header compared to ETag value, response status 304 if matching", 
      "+ If-Modified-Since - request header, causes response status 304 if unmodified", 
      "+ Last-Modified - response header, used with If-Modified-Since request header", 
      ""
    ], 
    "host": "https://signpuddle.com/server", 
    "meta": "Generated from ApiTxt format (output/index.txt) using txt2json.py", 
    "root": "index", 
    "title": "SignPuddle 3 API"
  }, 
  {
    "lines": [
      "+ Source: [ApiTxt format](../src/user.txt) and [JSON objects](../src/user.json)", 
      "+ Documents: [API Blueprint](../doc/user.md) and [Stand Alone HTML](../doc/user.htm)", 
      "+ Live Page: [API Interface](../api/user.html) and [JavaScript](../api/user.js)"
    ], 
    "group": "user", 
    "description": "SignPuddle 3 collections are organized by country and language codes"
  }, 
  {
    "route": "/user/who", 
    "name": "Who uses SignWriting?", 
    "description": "List of countries with size and activity."
  }, 
  {
    "description": "The available countries where signs are available.", 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "user-who"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "BR", 
              "US"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Retrieve country list"
  }, 
  {
    "route": "/user/pass", 
    "name": "User pass", 
    "description": "A string for accounting and validation"
  }, 
  {
    "code": [
      "  echo json_pretty(userPass());"
    ], 
    "method": "POST", 
    "dialog": [
      {
        "request": {
          "name": "user pass"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "{\"pass\": \"90c19ce2076db097c75b3406e966a6b6\",\"ip\": \"192.168.254.2\"}"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "String for accounting and validation"
  }, 
  {
    "code": [
      "  $data = $app->request->getbody();", 
      "  $data = json_decode($data,true);", 
      "  verifyPass($data['username'],$data['pass']);", 
      "  $app->response->setStatus(204);", 
      "  return;"
    ], 
    "method": "PUT", 
    "dialog": [
      {
        "request": {
          "body": [
            "{\"username\":\"anonymous\",\"pass\":\"af77...\"}"
          ], 
          "lines": [
            "+ Attributes", 
            "    + username: anonymous (string) - name of the user", 
            "    + pass: af77... (string) - pass for session validation"
          ], 
          "name": "user pass verify"
        }, 
        "responses": [
          {
            "status": 204
          }
        ]
      }
    ], 
    "name": "Check pass against user"
  }, 
  {
    "route": "/user/login", 
    "name": "User login", 
    "description": "Validation of user with validated password"
  }, 
  {
    "code": [
      "  $data = $app->request->getbody();", 
      "  $data = json_decode($data,true);", 
      "  $results = userVerify($data['username'],$data['pass'],$data['validated']);", 
      "  echo json_pretty($results);"
    ], 
    "method": "PUT", 
    "dialog": [
      {
        "request": {
          "body": [
            "{\"username\":\"anonymous\",\"pass\":\"af77...\",\"validated\":\"2793f...\"}"
          ], 
          "lines": [
            "+ Attributes", 
            "    + username: anonymous (string) - name of the user", 
            "    + pass: af77... (string) - pass for session validation", 
            "    + validated: 2793f... (string) - validated pass mixed with password"
          ], 
          "type": "application/json", 
          "name": "verify user"
        }, 
        "responses": [
          {
            "status": 200, 
            "lines": [
              "response text here"
            ], 
            "body": [
              "{\"user-profile\":\"\"}"
            ], 
            "type": "application/json"
          }
        ]
      }
    ], 
    "name": "Process log in to server"
  }, 
  {
    "route": "/user/{name}", 
    "name": "User profile", 
    "parameters": [
      {
        "description": "The name of a user", 
        "type": "string", 
        "name": "name", 
        "example": "slevinski"
      }
    ], 
    "description": "User details"
  }, 
  {
    "description": "Updates the profile of the user", 
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "$user = userVerified($pass);", 
      "if ($user!=$name) haltForbidden($user . \" not \" . $name);", 
      "$data = $app->request->getbody();", 
      "$data = json_decode($data,true);", 
      "userProfileUpdate($name,$data);", 
      "$app->response->setStatus(204);", 
      "return;"
    ], 
    "method": "PUT", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "5ffab638bde372b4fa63bb6f8484595d"
          }, 
          "name": "user-update"
        }, 
        "responses": [
          {
            "status": 204
          }
        ]
      }
    ], 
    "name": "Update user profile"
  }, 
  {
    "description": "Creates and returns a new user", 
    "method": "POST", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "5ffab638bde372b4fa63bb6f8484595d"
          }, 
          "name": "user-add"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "profile created and returned"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Register new user"
  }, 
  {
    "route": "/user/{name}/password", 
    "name": "User password", 
    "parameters": [
      {
        "description": "The name of a user", 
        "type": "string", 
        "name": "name", 
        "example": "slevinski"
      }
    ], 
    "description": "User password resource"
  }, 
  {
    "description": "Updates the password of the user", 
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "$user = userVerified($pass,true);", 
      "if (!$user) haltForbidden();", 
      "$data = $app->request->getbody();", 
      "$data = json_decode($data,true);", 
      "$old = isset($data['old'])?$data['old']:'';", 
      "$new = isset($data['new'])?$data['new']:'';", 
      "if ($old && $new){", 
      "  userPasswordUpdate($name,$old,$new);", 
      "  $app->response->setStatus(204);", 
      "  return;", 
      "} else {", 
      "  haltBadRequest();", 
      "}"
    ], 
    "method": "POST", 
    "dialog": [
      {
        "request": {
          "body": [
            "{\"old\":\"149603e6c03516362a8da23f624db945\",\"new\":\"22af645d1859cb5ca6da0c484f1f37ea\"}"
          ], 
          "headers": {
            "Pass": "5ffab638bde372b4fa63bb6f8484595d"
          }, 
          "type": "plain/text", 
          "name": "user-update-password"
        }, 
        "responses": [
          {
            "status": 204
          }
        ]
      }
    ], 
    "name": "Update user password"
  }, 
  {
    "description": "Creates a temporary password for the user", 
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "$user = userVerified($pass,true);", 
      "if (!$user) haltForbidden();", 
      "$data = $app->request->getbody();", 
      "$data = json_decode($data,true);", 
      "$user = isset($data['user'])?$data['user']:'';", 
      "if ($user){", 
      "  userPasswordReset($user);", 
      "  $app->response->setStatus(204);", 
      "  return;", 
      "} else {", 
      "  haltBadRequest();", 
      "}"
    ], 
    "method": "PUT", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "5ffab638bde372b4fa63bb6f8484595d"
          }, 
          "type": "plain/text", 
          "name": "user-password-reset"
        }, 
        "responses": [
          {
            "status": 204
          }
        ]
      }
    ], 
    "name": "Reset user password"
  }, 
  {
    "route": "/user/email", 
    "name": "User email requests", 
    "description": "Requests for email of username or password reset"
  }, 
  {
    "description": "User email requests for username or passwords", 
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "rightscheck(\"\",$pass,SP_ADMIN);", 
      "$users = userEmailRequests();", 
      "echo json_pretty($users);", 
      "return;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "5ffab638bde372b4fa63bb6f8484595d"
          }, 
          "name": "user-email-request"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "[{\"name\":\"slevinski\",\"email\":\"slevinski@signwriting.org\",\"temp\":\"username\"}]"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "List of user email requests"
  }, 
  {
    "route": "/user/email/{email}", 
    "name": "Username lookup", 
    "parameters": [
      {
        "description": "The email for a user", 
        "type": "string", 
        "name": "email", 
        "example": "slevinski@signwriting.org"
      }
    ], 
    "description": "Forgot username email lookup"
  }, 
  {
    "description": "Creates a request for email of username", 
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "$user = userVerified($pass,true);", 
      "if (!$user) haltForbidden();", 
      "userNameLookup($email);", 
      "$app->response->setStatus(204);", 
      "return;"
    ], 
    "method": "PUT", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "5ffab638bde372b4fa63bb6f8484595d"
          }, 
          "name": "user-name-lookup"
        }, 
        "responses": [
          {
            "status": 204
          }
        ]
      }
    ], 
    "name": "Lookup username"
  }, 
  {
    "lines": [
      "+ Source: [ApiTxt format](../src/collection.txt) and [JSON objects](../src/collection.json)", 
      "+ Documents: [API Blueprint](../doc/collection.md) and [Stand Alone HTML](../doc/collection.htm)", 
      "+ Live Page: [API Interface](../api/collection.html) and [JavaScript](../api/collection.js)"
    ], 
    "group": "collection", 
    "description": "Resources related to collections in general"
  }, 
  {
    "route": "/collection{?name}", 
    "name": "Collections available", 
    "parameters": [
      {
        "description": "partial collection name", 
        "type": "string", 
        "name": "name", 
        "example": "sp3"
      }
    ]
  }, 
  {
    "code": [
      "$collections = collectionListing($name);", 
      "if (count($collections)){", 
      "  echo json_pretty($collections);", 
      "} else {", 
      "  $app->response->setStatus(204);", 
      "}", 
      "return;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "responses": [
          {
            "status": 200, 
            "body": [
              "[\"en-US-interface-sp3\"]"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Get available collections"
  }, 
  {
    "route": "/collection/{name}", 
    "name": "Collection resource", 
    "parameters": [
      {
        "description": "The name of a collection", 
        "type": "string", 
        "name": "name", 
        "example": "`en-US-interface-sp3`"
      }
    ], 
    "description": "Specific collection"
  }, 
  {
    "code": [
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "collectionDelete($name,$pass);", 
      "collectionSecurityDelete($name,$pass);", 
      "collectionManageDelete($name,$pass);", 
      "$app->response->setStatus(204);"
    ], 
    "method": "DELETE", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "5ffab638bde372b4fa63bb6f8484595d"
          }, 
          "name": "the removal of a collection"
        }, 
        "responses": [
          {
            "status": 204
          }
        ]
      }
    ], 
    "name": "delete collection"
  }, 
  {
    "route": "/collection/{name}/entry/{ik}/image/{num}", 
    "name": "Collection entry image resource", 
    "parameters": [
      {
        "description": "The name of an dictionary", 
        "type": "string", 
        "name": "name", 
        "example": "`ase-US-dictionary-public`"
      }, 
      {
        "description": "An id number or key string", 
        "type": "string", 
        "name": "ik", 
        "example": "11244"
      }, 
      {
        "description": "The image number of 1 thru 4", 
        "type": "string", 
        "name": "num", 
        "example": "1"
      }
    ], 
    "description": "Specific image for collection entry"
  }, 
  {
    "code": [
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "$data = $app->request->getbody();", 
      "$data = json_decode($data,true);", 
      "collectionImageUpdate($name,$ik,$num,$data,$pass);", 
      "$app->response->setStatus(204);", 
      "return;"
    ], 
    "method": "PUT", 
    "dialog": [
      {
        "request": {
          "body": [
            "{", 
            "  \"file\": \"name.png\",", 
            "  \"data\": \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD...\"", 
            "}"
          ], 
          "headers": {
            "Pass": "724fd4b4438fba9d0c5ab89d0833e5c9"
          }, 
          "type": "application/json", 
          "name": "an update for an existing dictionary entry"
        }, 
        "responses": [
          {
            "status": 204
          }
        ]
      }
    ], 
    "name": "update image for collection entry"
  }, 
  {
    "code": [
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "collectionImageDelete($name,$ik,$num,$pass);", 
      "$app->response->setStatus(204);"
    ], 
    "method": "DELETE", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "724fd4b4438fba9d0c5ab89d0833e5c9"
          }, 
          "name": "the removal of a collection entry image"
        }, 
        "responses": [
          {
            "status": 204
          }
        ]
      }
    ], 
    "name": "remove dictionary entry"
  }, 
  {
    "route": "/collection/{name}/stats", 
    "name": "Collection statistics", 
    "parameters": [
      {
        "description": "The name of a dictionary", 
        "type": "required,string", 
        "name": "name", 
        "example": "`ase-US-dictionary-public`"
      }
    ], 
    "description": "Statistics about the collection"
  }, 
  {
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "rightsCheck($name,$pass,SP_VIEW);", 
      "$check = isset($headers['If-Modified-Since'])?$headers['If-Modified-Since']:'';", 
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$lastModified = lastModified($name);", 
      "if ($lastModified <= $check){", 
      "  haltNotModified();", 
      "}", 
      "header('Last-Modified: ' . $lastModified);", 
      "$output = json_pretty(collectionStats($name));", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $output;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "headers": {
            "If-Modified-Since": "2019-01-16T16:56:19.175Z"
          }, 
          "name": "collections statistics"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "[{\"name\": \"en-US-interface-sp3\",\"code\": \"ui1\",\"title\": \"English Interface for SignPuddle 3\",\"user\": \"slevinski\",\"created_at\": \"\",\"view_pass\": 0,\"add_pass\": 1,\"edit_pass\": 1,\"register_level\": 0,\"upload_level\": 4}]"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Get collection statistics"
  }, 
  {
    "route": "/collection/security", 
    "name": "Collections security", 
    "description": "Security settings for all collections"
  }, 
  {
    "code": [
      "$headers = getHeaders();", 
      "$check = isset($headers['If-Modified-Since'])?$headers['If-Modified-Since']:'';", 
      "$lastModified = lastModifiedCollection();", 
      "if ($lastModified <= $check){", 
      "  haltNotModified();", 
      "}", 
      "header('Last-Modified: ' . $lastModified);", 
      "echo json_pretty(collectionsSecurity());"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "headers": {
            "If-Modified-Since": "2019-01-16T16:56:19.175Z"
          }, 
          "name": "collections security"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "[{\"name\": \"en-US-interface-sp3\",\"code\": \"ui1\",\"title\": \"English Interface for SignPuddle 3\",\"user\": \"slevinski\",\"created_at\": \"\",\"view_pass\": 0,\"add_pass\": 1,\"edit_pass\": 1,\"register_level\": 0,\"upload_level\": 4}]"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Get collections security"
  }, 
  {
    "route": "/collection/{name}/security", 
    "name": "Collection security", 
    "parameters": [
      {
        "description": "The name of the collection", 
        "type": "required,string", 
        "name": "name", 
        "example": "`en-US-interface-sp3`"
      }
    ], 
    "description": "Details about the collection security"
  }, 
  {
    "code": [
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "echo json_pretty(collectionSecurity($name));"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "interface security"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "{\"name\": \"en-US-interface-sp3\",\"code\": \"ui1\",\"title\": \"English Interface for SignPuddle 3\",\"user\": \"slevinski\",\"created_at\": \"\",\"view_pass\": 0,\"add_pass\": 1,\"edit_pass\": 1,\"register_level\": 0,\"upload_level\": 4}"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "retrieve collection security"
  }, 
  {
    "code": [
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "$data = $app->request->getbody();", 
      "$data = json_decode($data,true);", 
      "collectionSecurityUpdate($name,$data,$pass);", 
      "$app->response->setStatus(204);", 
      "return;"
    ], 
    "method": "PUT", 
    "dialog": [
      {
        "request": {
          "body": [
            "{\"name\": \"en-US-interface-sp3\",\"code\": \"ui1\",\"title\": \"English Interface for SignPuddle 3\",\"user\": \"slevinski\",\"created_at\": \"\",\"view_pass\": 0,\"add_pass\": 1,\"edit_pass\": 1,\"register_level\": 0,\"upload_level\": 4}"
          ], 
          "headers": {
            "Pass": "5ffab638bde372b4fa63bb6f8484595d"
          }, 
          "type": "text/plain", 
          "name": "an update for an existing entry"
        }, 
        "responses": [
          {
            "status": 204
          }
        ]
      }
    ], 
    "name": "Update collection security"
  }, 
  {
    "code": [
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "collectionSecurityDelete($name,$pass);", 
      "$app->response->setStatus(204);"
    ], 
    "method": "DELETE", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "5ffab638bde372b4fa63bb6f8484595d"
          }, 
          "name": "the deletion of collection security"
        }, 
        "responses": [
          {
            "status": 204
          }
        ]
      }
    ], 
    "name": "Remove security for collection"
  }, 
  {
    "route": "/collection/{name}/users", 
    "name": "Collection users", 
    "parameters": [
      {
        "description": "collection name", 
        "type": "string", 
        "name": "name", 
        "example": "`ase-US-dictionary-public`"
      }
    ]
  }, 
  {
    "code": [
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "echo json_pretty(collectionUsers($name));"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "responses": [
          {
            "status": 200, 
            "body": [
              "[{\"user\": \"test_user\",\"security\": 3}]"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Get collection users"
  }, 
  {
    "route": "/collection/manage/unknown", 
    "name": "Management for unknown collections"
  }, 
  {
    "code": [
      "echo json_pretty(collectionManageUnknown());"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "responses": [
          {
            "status": 200, 
            "body": [
              "[\"es-US-interface-sp3\"]"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Get list of unknown collections with user management"
  }, 
  {
    "route": "/collection/{name}/manage", 
    "name": "Collection users management", 
    "parameters": [
      {
        "description": "collection name", 
        "type": "string", 
        "name": "name", 
        "example": "`ase-US-dictionary-public`"
      }
    ]
  }, 
  {
    "code": [
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "echo json_pretty(collectionUsersDetail($name,$pass));"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "5ffab638bde372b4fa63bb6f8484595d"
          }, 
          "name": "collection management"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "[{\"name\": \"test_user\",\"display\": \"Test Editor\",\"email\": \"testing@gmail.com\",\"security\": 3}]"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Get collection management"
  }, 
  {
    "code": [
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "$data = $app->request->getbody();", 
      "$data = json_decode($data,true);", 
      "collectionManageUpdate($name,$data,$pass);", 
      "$app->response->setStatus(204);", 
      "return;"
    ], 
    "method": "PUT", 
    "dialog": [
      {
        "request": {
          "body": [
            "{\"user\":\"slevinski\",\"security\":4}"
          ], 
          "headers": {
            "Pass": "5ffab638bde372b4fa63bb6f8484595d"
          }, 
          "name": "an update for collection management"
        }, 
        "responses": [
          {
            "status": 204
          }
        ]
      }
    ], 
    "name": "Update collection management"
  }, 
  {
    "code": [
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "collectionManageDelete($name,$pass);", 
      "$app->response->setStatus(204);"
    ], 
    "method": "DELETE", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "5ffab638bde372b4fa63bb6f8484595d"
          }, 
          "name": "the removal of user management for a collection"
        }, 
        "responses": [
          {
            "status": 204
          }
        ]
      }
    ], 
    "name": "Remove user management for collection"
  }, 
  {
    "route": "/collection/{name}/manage/{user}", 
    "name": "Collection user", 
    "parameters": [
      {
        "description": "collection name", 
        "type": "string", 
        "name": "name", 
        "example": "`ase-US-dictionary-public`"
      }, 
      {
        "description": "user name", 
        "type": "string", 
        "name": "user", 
        "example": "`slevinski`"
      }
    ]
  }, 
  {
    "code": [
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "collectionManageRemove($name,$user,$pass);", 
      "$app->response->setStatus(204);"
    ], 
    "method": "DELETE", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "5ffab638bde372b4fa63bb6f8484595d"
          }, 
          "name": "the removal of a user from collection management"
        }, 
        "responses": [
          {
            "status": 204
          }
        ]
      }
    ], 
    "name": "Remove user from collection management"
  }, 
  {
    "route": "/collection/{name}/request/{source}", 
    "name": "Collection Request Copy", 
    "parameters": [
      {
        "description": "The name of the new collection", 
        "type": "required,string", 
        "name": "name", 
        "example": "`es-US-interface-sp3`"
      }, 
      {
        "description": "The name of the source collection", 
        "type": "required,string", 
        "name": "source", 
        "example": "`en-US-interface-sp3`"
      }
    ]
  }, 
  {
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "$user = userVerified($pass);", 
      "if (!$user) haltForbidden();", 
      "rightsCheck($source,$pass,SP_VIEW);", 
      "$err = invalidName($source);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$parts = explode(\"-\",$source);", 
      "$err = invalidName($name,$parts[2]);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$dir = 'data/db/';", 
      "$infile = $dir . $source . \".db\";", 
      "$outfile = $dir . $name . \".db\";", 
      "if (!file_exists($infile)) haltBadRequest('Source collection does not exist: ' . $source);", 
      "if (file_exists($outfile)) haltBadRequest('Collection already exists: ' . $name);", 
      "if (copy($infile,$outfile)){", 
      "  $data = array();", 
      "  $data[\"user\"] = $user;", 
      "  $data[\"security\"] = SP_EDIT;", 
      "  collectionManageUpdate($name,$data,$pass,true);", 
      "", 
      "  $data = $app->request->getbody();", 
      "  $data = json_decode($data,true);", 
      "  $title = isset($data['title'])?$data['title']:'New Collection';", 
      "  $data = array();", 
      "  $data[\"title\"] = $title;", 
      "  $data[\"user\"] = \"admin\";", 
      "  $data[\"view_pass\"] = 0;", 
      "  $data[\"add_pass\"] = 1;", 
      "  $data[\"edit_pass\"] = 1;", 
      "  $data[\"register_level\"] = 0;", 
      "  $data[\"upload_level\"] = 4;", 
      "  collectionSecurityUpdate($name,$data,$pass,true);", 
      "  $app->response->setStatus(204);", 
      "  return;", 
      "} else {", 
      "  haltForbidden();", 
      "}"
    ], 
    "method": "POST", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "5ffab638bde372b4fa63bb6f8484595d"
          }, 
          "name": "new collection from source"
        }, 
        "responses": [
          {
            "status": 204
          }
        ]
      }
    ], 
    "name": "request the creation of a new collection"
  }, 
  {
    "lines": [
      "+ Source: [ApiTxt format](../src/interface.txt) and [JSON objects](../src/interface.json)", 
      "+ Documents: [API Blueprint](../doc/interface.md) and [Stand Alone HTML](../doc/interface.htm)", 
      "+ Live Page: [API Interface](../api/interface.html) and [JavaScript](../api/interface.js)"
    ], 
    "group": "interface", 
    "description": "Resources related to interface collections"
  }, 
  {
    "route": "/interface{?name}", 
    "name": "Interfaces available", 
    "parameters": [
      {
        "description": "partial interface name", 
        "type": "string", 
        "name": "name", 
        "example": "sp3"
      }
    ]
  }, 
  {
    "code": [
      "$dir = 'data/db/';", 
      "$ext = '.db';", 
      "$out = [];", 
      "if ($name){", 
      "  if (strpos($name,\"interface\")!==false){", 
      "    $interfaces = $dir . '*' . $name . '*' . $ext;", 
      "    $files = glob($interfaces);", 
      "  } else {", 
      "    $interfaces = $dir . '*interface*' . $name . '*' . $ext;", 
      "    $files = glob($interfaces);", 
      "    if (count($files)==0) {", 
      "      $interfaces = $dir . '*' . $name . '*interface*' . $ext;", 
      "      $files = glob($interfaces);", 
      "    }", 
      "  }", 
      "} else {", 
      "  $interfaces = $dir . '*interface*' . $ext;", 
      "  $files = glob($interfaces);", 
      "}", 
      "foreach ($files as $filename) {", 
      "  $out[] = str_replace($ext,'',str_replace($dir,'',$filename));", 
      "}", 
      "if (count($out)){", 
      "  echo json_pretty($out);", 
      "} else {", 
      "  $app->response->setStatus(204);", 
      "}", 
      "return;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "responses": [
          {
            "status": 200, 
            "body": [
              "[\"en-US-interface-sp3\"]"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Get available interfaces"
  }, 
  {
    "route": "/interface/{name}{?update}", 
    "name": "Interface resource", 
    "parameters": [
      {
        "description": "The name of an interface", 
        "type": "required,string", 
        "name": "name", 
        "example": "`en-US-interface-sp3`"
      }, 
      {
        "description": "Forces a rewrite of the interface for json and txt formats", 
        "type": "optional,number", 
        "name": "update", 
        "example": "1"
      }
    ], 
    "description": "Access to available interfaces"
  }, 
  {
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "rightsCheck($name,$pass,SP_VIEW);", 
      "$check = isset($headers['If-Modified-Since'])?$headers['If-Modified-Since']:'';", 
      "if (strpos($name,'.')){", 
      "  $parts = explode('.',$name);", 
      "  $name = $parts[0];", 
      "  $format = $parts[1];", 
      "  if (!in_array($format,['db','txt','json'])){", 
      "    haltNotFound();", 
      "  }", 
      "} else {", 
      "  $format = 'json';", 
      "}", 
      "$dir = 'data/' . $format . '/';", 
      "$ext = '.' . $format;", 
      "$file = $dir . $name . $ext;", 
      "$err = invalidName($name);", 
      "if ($err){", 
      "  $files = glob('data/db/' . $name . '*interface-sp3.db');", 
      "  if (count($files)==0){", 
      "    haltBadRequest($err);", 
      "  } else {", 
      "\t$name = str_replace(\".db\",'',str_replace('data/db/','',$files[0]));", 
      "  }", 
      "}", 
      "$lastModified = lastModified($name);", 
      "if ($lastModified <= $check  && !$update){", 
      "  haltNotModified();", 
      "}", 
      "if ($format=='json' && (!file_exists($file) || $update)) {", 
      "  $json = interface2json($name);", 
      "  file_put_contents($file,$json);", 
      "} else if ($format=='txt' && (!file_exists($file) || $update)) {", 
      "  $txt = interface2txt($name);", 
      "  file_put_contents($file,$txt);", 
      "}", 
      "if(file_exists($file)) {", 
      "  header('Last-Modified: ' . $lastModified);", 
      "  $searchTime = searchtime($timein);", 
      "  header(\"Search-Time: \" . $searchTime);", 
      "  getFile($file);", 
      "} else {", 
      "  haltNotFound();", 
      "}"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "headers": {
            "If-Modified-Since": "2019-01-16T16:56:19.175Z"
          }, 
          "name": "interface text"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "print.buttons.main\tmessage\tdescription\ticon"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "retrieve interface"
  }, 
  {
    "route": "/interface/{name}/key", 
    "name": "Interface keys", 
    "parameters": [
      {
        "description": "The name of an interface", 
        "type": "required,string", 
        "name": "name", 
        "example": "`en-US-interface-sp3`"
      }
    ], 
    "description": "Access to interface keys"
  }, 
  {
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "$check = isset($headers['If-Modified-Since'])?$headers['If-Modified-Since']:'';", 
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$lastModified = lastModified($name);", 
      "if ($lastModified <= $check){", 
      "  haltNotModified();", 
      "}", 
      "header('Last-Modified: ' . $lastModified);", 
      "echo json_pretty(interfaceKeys($name,$pass));"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "724fd4b4438fba9d0c5ab89d0833e5c9", 
            "If-Modified-Since": "2019-01-16T16:56:19.175Z"
          }, 
          "name": "interface keys"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "[\"print.buttons.main\"]"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "retrieve interface keys"
  }, 
  {
    "route": "/interface/{name}/search/{text}", 
    "name": "Interface entries search", 
    "parameters": [
      {
        "description": "The name of an interface", 
        "type": "required,string", 
        "name": "name", 
        "example": "`en-US-interface-sp3`"
      }, 
      {
        "description": "The text for searching", 
        "type": "required,string", 
        "name": "text", 
        "example": "`SignPuddle`"
      }
    ], 
    "description": "Search interface for text"
  }, 
  {
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "echo json_pretty(interfaceSearch($name,$text,$pass));"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "724fd4b4438fba9d0c5ab89d0833e5c9"
          }, 
          "name": "matching interface entries"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "[", 
              "  {", 
              "    \"key\": \"print.buttons.main\",", 
              "    \"message\": \"Print it!\"", 
              "  }", 
              "]"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "retrieve matching entries"
  }, 
  {
    "route": "/interface/{name}/entry", 
    "name": "Interface entry resource", 
    "parameters": [
      {
        "description": "The name of an interface", 
        "type": "string", 
        "name": "name", 
        "example": "`en-US-interface-sp3`"
      }
    ], 
    "description": "Entries for interface"
  }, 
  {
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "if (!$pass){", 
      "  haltForbidden();", 
      "}", 
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$data = $app->request->getbody();", 
      "$data = json_decode($data,true);", 
      "interfaceEntryNew($name,$data,$pass);", 
      "$app->response->setStatus(201);", 
      "return;"
    ], 
    "method": "POST", 
    "dialog": [
      {
        "request": {
          "body": [
            "{\"key\":\"new.key.one\", \"message\":\"UI text\",\"description\":\"about the text\",\"icon\":\"search\"}"
          ], 
          "headers": {
            "Pass": "724fd4b4438fba9d0c5ab89d0833e5c9"
          }, 
          "type": "application/json", 
          "name": "add new interface entry"
        }, 
        "responses": [
          {
            "status": 201, 
            "body": [
              "..."
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "add interface entry"
  }, 
  {
    "route": "/interface/{name}/entry/{key}", 
    "name": "Interface entry resource for key", 
    "parameters": [
      {
        "description": "The name of an interface", 
        "type": "string", 
        "name": "name", 
        "example": "`en-US-interface-sp3`"
      }, 
      {
        "description": "The name of an interface key", 
        "type": "string", 
        "name": "key", 
        "example": "system.button.open"
      }
    ], 
    "description": "Specific entries for interface"
  }, 
  {
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "$check = isset($headers['If-Modified-Since'])?$headers['If-Modified-Since']:'';", 
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$entries = interfaceKeySearch($name,$key,$pass);", 
      "if (!$entries){", 
      "  haltNoContent();", 
      "}", 
      "$lastModified = max(array_map(function($o) {return $o->updated_at;},$entries));", 
      "if ($lastModified <= $check){", 
      "  haltNotModified();", 
      "}", 
      "header('Last-Modified: ' . $lastModified);", 
      "echo json_pretty($entries);"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "724fd4b4438fba9d0c5ab89d0833e5c9", 
            "If-Modified-Since": "2019-01-16T16:56:19.175Z"
          }, 
          "name": "an interface entry"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "..."
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "retrieve interface entry"
  }, 
  {
    "code": [
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "$data = $app->request->getbody();", 
      "$data = json_decode($data,true);", 
      "interfaceEntryUpdate($name,$key,$data,$pass);", 
      "$app->response->setStatus(204);", 
      "return;"
    ], 
    "method": "PUT", 
    "dialog": [
      {
        "request": {
          "body": [
            "{\"key\":\"new.key.one\", \"message\":\"UI text\",\"description\":\"about the text\",\"icon\":\"search\"}"
          ], 
          "headers": {
            "Pass": "724fd4b4438fba9d0c5ab89d0833e5c9"
          }, 
          "name": "an update for an existing entry"
        }, 
        "responses": [
          {
            "status": 204
          }
        ]
      }
    ], 
    "name": "update interface entry"
  }, 
  {
    "code": [
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "interfaceEntryDelete($name,$key,$pass);", 
      "$app->response->setStatus(204);"
    ], 
    "method": "DELETE", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "724fd4b4438fba9d0c5ab89d0833e5c9"
          }, 
          "name": "the removal of an interface entry"
        }, 
        "responses": [
          {
            "status": 204
          }
        ]
      }
    ], 
    "name": "remove interface entry"
  }, 
  {
    "lines": [
      "+ Source: [ApiTxt format](../src/dictionary.txt) and [JSON objects](../src/dictionary.json)", 
      "+ Documents: [API Blueprint](../doc/dictionary.md) and [Stand Alone HTML](../doc/dictionary.htm)", 
      "+ Live Page: [API Dictionary](../api/dictionary.html) and [JavaScript](../api/dictionary.js)"
    ], 
    "group": "dictionary", 
    "description": "Resources related to dictionary collections"
  }, 
  {
    "route": "/dictionary{?name}", 
    "name": "Dictionaries available", 
    "parameters": [
      {
        "description": "partial dictionary name", 
        "type": "string", 
        "name": "name", 
        "example": "public"
      }
    ]
  }, 
  {
    "code": [
      "$dir = 'data/db/';", 
      "$ext = '.db';", 
      "$out = [];", 
      "if ($name){", 
      "  if (strpos($name,\"dictionary\")!==false){", 
      "    $dictionaries = $dir . '*' . $name . '*' . $ext;", 
      "    $files = glob($dictionaries);", 
      "  } else {", 
      "    $dictionaries = $dir . '*dictionary*' . $name . '*' . $ext;", 
      "    $files = glob($dictionaries);", 
      "    if (count($files)==0) {", 
      "      $dictionaries = $dir . '*' . $name . '*dictionary*' . $ext;", 
      "      $files = glob($dictionaries);", 
      "    }", 
      "  }", 
      "} else {", 
      "  $dictionaries = $dir . '*dictionary*' . $ext;", 
      "  $files = glob($dictionaries);", 
      "}", 
      "foreach ($files as $filename) {", 
      "  $out[] = str_replace($ext,'',str_replace($dir,'',$filename));", 
      "}", 
      "if (count($out)){", 
      "  echo json_pretty($out);", 
      "} else {", 
      "  $app->response->setStatus(204);", 
      "}", 
      "return;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "responses": [
          {
            "status": 200, 
            "body": [
              "[\"ase-US-dictionary-public\"]"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Get available dictionaries"
  }, 
  {
    "route": "/dictionary/{name}{?update}", 
    "name": "Dictionary resource", 
    "parameters": [
      {
        "description": "The name of an dictionary", 
        "type": "required,string", 
        "name": "name", 
        "example": "`ase-US-dictionary-public`"
      }, 
      {
        "description": "Forces a rewrite of the dictionary for json and txt formats", 
        "type": "optional,number", 
        "name": "update", 
        "example": "1"
      }
    ], 
    "description": "Access to available dictionaries"
  }, 
  {
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "rightsCheck($name,$pass,SP_VIEW);", 
      "$check = isset($headers['If-Modified-Since'])?$headers['If-Modified-Since']:'';", 
      "if (strpos($name,'.')){", 
      "  $parts = explode('.',$name);", 
      "  $name = $parts[0];", 
      "  $format = $parts[1];", 
      "  if (!in_array($format,['db','txt','json'])){", 
      "    haltNotFound();", 
      "  }", 
      "} else {", 
      "  $format = 'json';", 
      "}", 
      "$dir = 'data/' . $format . '/';", 
      "$ext = '.' . $format;", 
      "$file = $dir . $name . $ext;", 
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$lastModified = lastModified($name);", 
      "if ($lastModified <= $check  && !$update){", 
      "  haltNotModified();", 
      "}", 
      "if ($format=='json' && (!file_exists($file) || $update)) {", 
      "  $json = dictionary2json($name);", 
      "  file_put_contents($file,$json);", 
      "} else if ($format=='txt' && (!file_exists($file) || $update)) {", 
      "  $txt = dictionary2txt($name);", 
      "  file_put_contents($file,$txt);", 
      "}", 
      "if(file_exists($file)) {", 
      "  header('Last-Modified: ' . $lastModified);", 
      "  $searchTime = searchtime($timein);", 
      "  header(\"Search-Time: \" . $searchTime);", 
      "  getFile($file);", 
      "} else {", 
      "  haltNotFound();", 
      "}"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "headers": {
            "If-Modified-Since": "2019-01-16T16:56:19.175Z"
          }, 
          "name": "dictionary text"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "1\t\ud836\udc00\ud8cb\udc61\ud8c8\uddd9\ud8db\udfc3\ud836\udc03\ud836\udd1d\ud836\udd14\ud8c8\uddd9\ud836\udcf0\ud836\udcf9\ud8db\udfc3\ud836\udd0e\ud836\udd01\ud8cb\udc61\ud836\udcfd\ud836\udd00\ttest zero\ttest zero\twe are testing SignPuddle 1.6\tVal ;-)\t{\"video\":\"<iframe width=\\\"425\\\" height=\\\"349\\\" src=\\\"http:\\/\\/www.youtube.com\\/embed\\/RTniYA1lTDM\\\" frameborder=\\\"0\\\" allowfullscreen><\\/iframe>\"}\tVal\t2011-07-20T17:39:02Z\t2011-07-20T17:42:09Z"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "retrieve dictionary"
  }, 
  {
    "route": "/dictionary/{name}/signs", 
    "name": "List of dictionary signs", 
    "parameters": [
      {
        "description": "The name of an dictionary", 
        "type": "string", 
        "name": "name", 
        "example": "`ase-US-dictionary-public`"
      }
    ], 
    "description": "The signs in the dictionary"
  }, 
  {
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "rightsCheck($name,$pass,SP_VIEW);", 
      "$check = isset($headers['If-Modified-Since'])?$headers['If-Modified-Since']:'';", 
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$lastModified = lastModified($name);", 
      "if ($lastModified <= $check){", 
      "  haltNotModified();", 
      "}", 
      "header('Last-Modified: ' . $lastModified);", 
      "$output = dictionarySigns($name);", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $output;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "headers": {
            "If-Modified-Since": "2019-01-16T16:56:19.175Z"
          }, 
          "name": "dictionary text"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "\ud836\udc00\ud8cb\udc61\ud8c8\uddd9\ud8db\udfc3\ud836\udc03\ud836\udd1d\ud836\udd14\ud8c8\uddd9\ud836\udcf0\ud836\udcf9\ud8db\udfc3\ud836\udd0e\ud836\udd01\ud8cb\udc61\ud836\udcfd\ud836\udd00"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "retrieve dictionary signs"
  }, 
  {
    "route": "/dictionary/{name}/signtexts", 
    "name": "List of dictionary signtexts", 
    "parameters": [
      {
        "description": "The name of an dictionary", 
        "type": "string", 
        "name": "name", 
        "example": "`ase-US-dictionary-public`"
      }
    ], 
    "description": "The signtexts in the dictionary"
  }, 
  {
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "rightsCheck($name,$pass,SP_VIEW);", 
      "$check = isset($headers['If-Modified-Since'])?$headers['If-Modified-Since']:'';", 
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$lastModified = lastModified($name);", 
      "if ($lastModified <= $check){", 
      "  haltNotModified();", 
      "}", 
      "header('Last-Modified: ' . $lastModified);", 
      "$output = dictionarySigntexts($name);", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $output;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "headers": {
            "If-Modified-Since": "2019-01-16T16:56:19.175Z"
          }, 
          "name": "dictionary text"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "\ud836\udc00\ud8cb\udc61\ud8c8\uddd9\ud8db\udfc3\ud836\udc03\ud836\udd1d\ud836\udd14\ud8c8\uddd9\ud836\udcf0\ud836\udcf9\ud8db\udfc3\ud836\udd0e\ud836\udd01\ud8cb\udc61\ud836\udcfd\ud836\udd00"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "retrieve dictionary signtexts"
  }, 
  {
    "route": "/dictionary/{name}/entry", 
    "name": "Dictionary entry resource", 
    "parameters": [
      {
        "description": "The name of an dictionary", 
        "type": "string", 
        "name": "name", 
        "example": "`ase-US-dictionary-public`"
      }
    ], 
    "description": "Entries for dictionary"
  }, 
  {
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$data = $app->request->getbody();", 
      "$data = json_decode($data,true);", 
      "echo dictionaryEntryNew($name,$data,$pass);", 
      "$app->response->setStatus(201);", 
      "return;"
    ], 
    "method": "POST", 
    "dialog": [
      {
        "request": {
          "body": [
            "{", 
            "  \"sign\": \"\\ud836\\udc03\\ud836\\udd44\\ud836\\udd19\\ud8ef\\udfa1\\ud836\\udcf4\\ud836\\udcf4\\ud8dd\\udc54\\ud836\\udcc8\\ud836\\udcfc\\ud8dd\\udc42\\ud836\\udd26\\ud836\\udcfa\\ud8c8\\uddd2\\ud836\\udd15\\ud836\\udcee\\ud8c8\\uddda\\ud836\\udce0\\ud836\\udcef\",", 
            "  \"terms\": [", 
            "    \"Malaysia\"", 
            "  ],", 
            "  \"signtext\": \"\",", 
            "  \"text\": \"\",", 
            "  \"source\": \"Conference Maastricht\",", 
            "  \"detail\": {}", 
            "}  "
          ], 
          "headers": {
            "Pass": "724fd4b4438fba9d0c5ab89d0833e5c9"
          }, 
          "type": "application/json", 
          "name": "add new dictionary entry"
        }, 
        "responses": [
          {
            "status": 201, 
            "body": [
              "777"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "add dictionary entry"
  }, 
  {
    "route": "/dictionary/{name}/entry/{id}", 
    "name": "Dictionary entry resource for id", 
    "parameters": [
      {
        "description": "The name of an dictionary", 
        "type": "string", 
        "name": "name", 
        "example": "`ase-US-dictionary-public`"
      }, 
      {
        "description": "An id numbers", 
        "type": "string", 
        "name": "id", 
        "example": "11244"
      }
    ], 
    "description": "Specific entries for dictionary"
  }, 
  {
    "code": [
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "$data = $app->request->getbody();", 
      "$data = json_decode($data,true);", 
      "dictionaryEntryUpdate($name,$id,$data,$pass);", 
      "$app->response->setStatus(204);", 
      "return;"
    ], 
    "method": "PUT", 
    "dialog": [
      {
        "request": {
          "body": [
            "{", 
            "  \"sign\": \"\\ud836\\udc03\\ud836\\udd44\\ud836\\udd19\\ud8ef\\udfa1\\ud836\\udcf4\\ud836\\udcf4\\ud8dd\\udc54\\ud836\\udcc8\\ud836\\udcfc\\ud8dd\\udc42\\ud836\\udd26\\ud836\\udcfa\\ud8c8\\uddd2\\ud836\\udd15\\ud836\\udcee\\ud8c8\\uddda\\ud836\\udce0\\ud836\\udcef\",", 
            "  \"terms\": [", 
            "    \"Malaysia\"", 
            "  ],", 
            "  \"signtext\": \"\",", 
            "  \"text\": \"\",", 
            "  \"source\": \"Conference Maastricht\",", 
            "  \"detail\": {}", 
            "}  "
          ], 
          "headers": {
            "Pass": "724fd4b4438fba9d0c5ab89d0833e5c9"
          }, 
          "type": "application/json", 
          "name": "an update for an existing dictionary entry"
        }, 
        "responses": [
          {
            "status": 204
          }
        ]
      }
    ], 
    "name": "update dictionary entry"
  }, 
  {
    "code": [
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "dictionaryEntryDelete($name,$id,$pass);", 
      "$app->response->setStatus(204);"
    ], 
    "method": "DELETE", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "724fd4b4438fba9d0c5ab89d0833e5c9"
          }, 
          "name": "the removal of an dictionary entry"
        }, 
        "responses": [
          {
            "status": 204
          }
        ]
      }
    ], 
    "name": "remove dictionary entry"
  }, 
  {
    "route": "/dictionary/{name}/search{?offset,limit,filter,sort,results}", 
    "name": "Search dictionary", 
    "parameters": [
      {
        "description": "The name of a dictionary", 
        "type": "required,string", 
        "name": "name", 
        "example": "`ase-US-dictionary-public`"
      }, 
      {
        "description": "Start of search results", 
        "type": "number", 
        "name": "offset", 
        "example": "0"
      }, 
      {
        "description": "Number of search results", 
        "type": "number", 
        "name": "limit", 
        "example": "10"
      }, 
      {
        "description": "restrict search results", 
        "type": "string", 
        "name": "filter", 
        "example": "user=Val"
      }, 
      {
        "description": "Field for sorting results", 
        "type": "string", 
        "name": "sort", 
        "example": "created_at"
      }, 
      {
        "description": "Type of results: entries, sign, term, terms", 
        "type": "string", 
        "name": "results", 
        "example": "sign"
      }
    ], 
    "description": "Searching dictionary signs"
  }, 
  {
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "rightsCheck($name,$pass,SP_VIEW);", 
      "$check = isset($headers['If-Modified-Since'])?$headers['If-Modified-Since']:'';", 
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$lastModified = lastModified($name);", 
      "if ($lastModified <= $check){", 
      "  haltNotModified();", 
      "}", 
      "$output = json_pretty(dictionarySearch($name,$offset,$limit,$filter,$sort,$results));", 
      "header('Last-Modified: ' . $lastModified);", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $output;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "724fd4b4438fba9d0c5ab89d0833e5c9", 
            "If-Modified-Since": "2019-01-16T16:56:19.175Z"
          }, 
          "name": "dictionary query results"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "{", 
              "  \"total\": 1,", 
              "  \"data\": [", 
              "    [", 
              "      \"1\",", 
              "      \"\\ud836\\udc00\\ud8cb\\udc61\\ud8c8\\uddd9\\ud8db\\udfc3\\ud836\\udc03\\ud836\\udd1d\\ud836\\udd14\\ud8c8\\uddd9\\ud836\\udcf0\\ud836\\udcf9\\ud8db\\udfc3\\ud836\\udd0e\\ud836\\udd01\\ud8cb\\udc61\\ud836\\udcfd\\ud836\\udd00\"", 
              "    ]", 
              "  ]", 
              "}"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "retrieve dictionary results of searching"
  }, 
  {
    "route": "/dictionary/{name}/search/id/{id}{?offset,limit,filter,sort,results}", 
    "name": "Search dictionary with ids", 
    "parameters": [
      {
        "description": "The name of an dictionary", 
        "type": "string", 
        "name": "name", 
        "example": "`ase-US-dictionary-public`"
      }, 
      {
        "description": "A list of one or more id numbers", 
        "type": "string", 
        "name": "id", 
        "example": "1-4,5"
      }, 
      {
        "description": "Start of search results", 
        "type": "number", 
        "name": "offset", 
        "example": "0"
      }, 
      {
        "description": "Number of search results", 
        "type": "number", 
        "name": "limit", 
        "example": "10"
      }, 
      {
        "description": "restrict search results", 
        "type": "string", 
        "name": "filter", 
        "example": "user=Val"
      }, 
      {
        "description": "Field for sorting results", 
        "type": "string", 
        "name": "sort", 
        "example": "created_at"
      }, 
      {
        "description": "Type of results: entries, sign, term, terms", 
        "type": "string", 
        "name": "results", 
        "example": "sign"
      }
    ], 
    "description": "Specific entries for dictionary"
  }, 
  {
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "rightsCheck($name,$pass,SP_VIEW);", 
      "$check = isset($headers['If-Modified-Since'])?$headers['If-Modified-Since']:'';", 
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$lastModified = lastModified($name);", 
      "if ($lastModified <= $check){", 
      "  haltNotModified();", 
      "}", 
      "$output = json_pretty(dictionarySearchId($name,$id,$offset,$limit,$filter,$sort,$results));", 
      "header('Last-Modified: ' . $lastModified);", 
      "echo $output;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "724fd4b4438fba9d0c5ab89d0833e5c9", 
            "If-Modified-Since": "2019-01-16T16:56:19.175Z"
          }, 
          "name": "an dictionary entry"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "[", 
              "  {", 
              "    \"id\": \"1\",", 
              "    \"sign\": \"\\ud836\\udc00\\ud8cb\\udc61\\ud8c8\\uddd9\\ud8db\\udfc3\\ud836\\udc03\\ud836\\udd1d\\ud836\\udd14\\ud8c8\\uddd9\\ud836\\udcf0\\ud836\\udcf9\\ud8db\\udfc3\\ud836\\udd0e\\ud836\\udd01\\ud8cb\\udc61\\ud836\\udcfd\\ud836\\udd00\",", 
              "    \"terms\": [", 
              "      \"test zero\"", 
              "    ],", 
              "    \"lower\": [", 
              "      \"test zero\"", 
              "    ],", 
              "    \"signtext\": \"\",", 
              "    \"text\": \"we are testing SignPuddle 1.6\",", 
              "    \"source\": \"Val ;-)\",", 
              "    \"detail\": {", 
              "      \"video\": \"<iframe width=\\\"425\\\" height=\\\"349\\\" src=\\\"http:\\/\\/www.youtube.com\\/embed\\/RTniYA1lTDM\\\" frameborder=\\\"0\\\" allowfullscreen><\\/iframe>\"", 
              "    },", 
              "    \"user\": \"Val\",", 
              "    \"created_at\": \"2011-07-20T17:39:02Z\",", 
              "    \"updated_at\": \"2011-07-20T17:42:09Z\"", 
              "  }", 
              "]"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "retrieve dictionary entry"
  }, 
  {
    "route": "/dictionary/{name}/search/sign/{query}{?offset,limit,filter,sort,results}", 
    "name": "Search signs with query string", 
    "parameters": [
      {
        "description": "The name of a dictionary", 
        "type": "required,string", 
        "name": "name", 
        "example": "`ase-US-dictionary-public`"
      }, 
      {
        "description": "A query string", 
        "type": "required,string", 
        "name": "query", 
        "example": "Q"
      }, 
      {
        "description": "Start of search results", 
        "type": "number", 
        "name": "offset", 
        "example": "0"
      }, 
      {
        "description": "Number of search results", 
        "type": "number", 
        "name": "limit", 
        "example": "10"
      }, 
      {
        "description": "restrict search results", 
        "type": "string", 
        "name": "filter", 
        "example": "user=Val"
      }, 
      {
        "description": "Field for sorting results", 
        "type": "string", 
        "name": "sort", 
        "example": "created_at"
      }, 
      {
        "description": "Type of results: entries, sign, term, terms", 
        "type": "string", 
        "name": "results", 
        "example": "sign"
      }
    ], 
    "description": "Query string access to dictionary signs"
  }, 
  {
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "rightsCheck($name,$pass,SP_VIEW);", 
      "$check = isset($headers['If-Modified-Since'])?$headers['If-Modified-Since']:'';", 
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$lastModified = lastModified($name);", 
      "if ($lastModified <= $check){", 
      "  haltNotModified();", 
      "}", 
      "header('Last-Modified: ' . $lastModified);", 
      "$output = json_pretty(dictionarySearchSign($name,$query,$offset,$limit,$filter,$sort,$results));", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $output;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "724fd4b4438fba9d0c5ab89d0833e5c9", 
            "If-Modified-Since": "2019-01-16T16:56:19.175Z"
          }, 
          "name": "dictionary query results"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "{", 
              "  \"total\": 1,", 
              "  \"data\": [", 
              "    [", 
              "      \"1\",", 
              "      \"\\ud836\\udc00\\ud8cb\\udc61\\ud8c8\\uddd9\\ud8db\\udfc3\\ud836\\udc03\\ud836\\udd1d\\ud836\\udd14\\ud8c8\\uddd9\\ud836\\udcf0\\ud836\\udcf9\\ud8db\\udfc3\\ud836\\udd0e\\ud836\\udd01\\ud8cb\\udc61\\ud836\\udcfd\\ud836\\udd00\"", 
              "    ]", 
              "  ]", 
              "}"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "retrieve dictionary results of searching signs with query string"
  }, 
  {
    "route": "/dictionary/{name}/search/signtext/{query}{?offset,limit,filter,sort,results}", 
    "name": "Search signtexts with query string", 
    "parameters": [
      {
        "description": "The name of a dictionary", 
        "type": "required,string", 
        "name": "name", 
        "example": "`ase-US-dictionary-public`"
      }, 
      {
        "description": "A query string", 
        "type": "required,string", 
        "name": "query", 
        "example": "Q"
      }, 
      {
        "description": "Start of search results", 
        "type": "number", 
        "name": "offset", 
        "example": "0"
      }, 
      {
        "description": "Number of search results", 
        "type": "number", 
        "name": "limit", 
        "example": "10"
      }, 
      {
        "description": "restrict search results", 
        "type": "string", 
        "name": "filter", 
        "example": "user=Val"
      }, 
      {
        "description": "Field for sorting results", 
        "type": "string", 
        "name": "sort", 
        "example": "created_at"
      }, 
      {
        "description": "Type of results: entries, signtext, term, terms", 
        "type": "string", 
        "name": "results", 
        "example": "sign"
      }
    ], 
    "description": "Query string access to dictionary signtexts"
  }, 
  {
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "rightsCheck($name,$pass,SP_VIEW);", 
      "$check = isset($headers['If-Modified-Since'])?$headers['If-Modified-Since']:'';", 
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$lastModified = lastModified($name);", 
      "if ($lastModified <= $check){", 
      "  haltNotModified();", 
      "}", 
      "header('Last-Modified: ' . $lastModified);", 
      "$output = json_pretty(dictionarySearchSigntext($name,$query,$offset,$limit,$filter,$sort,$results));", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $output;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "724fd4b4438fba9d0c5ab89d0833e5c9", 
            "If-Modified-Since": "2019-01-16T16:56:19.175Z"
          }, 
          "name": "dictionary query results"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "{", 
              "  \"total\": 1,", 
              "  \"data\": [", 
              "    [", 
              "      \"1\",", 
              "      \"\\ud836\\udc00\\ud8cb\\udc61\\ud8c8\\uddd9\\ud8db\\udfc3\\ud836\\udc03\\ud836\\udd1d\\ud836\\udd14\\ud8c8\\uddd9\\ud836\\udcf0\\ud836\\udcf9\\ud8db\\udfc3\\ud836\\udd0e\\ud836\\udd01\\ud8cb\\udc61\\ud836\\udcfd\\ud836\\udd00\"", 
              "    ]", 
              "  ]", 
              "}"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "retrieve dictionary results of searching signtexts with query string"
  }, 
  {
    "route": "/dictionary/{name}/search/terms/{text}{?type,case,offset,limit,filter,sort,results}", 
    "name": "Dictionary terms search", 
    "parameters": [
      {
        "description": "The name of an dictionary", 
        "type": "required,string", 
        "name": "name", 
        "example": "`ase-US-dictionary-public`"
      }, 
      {
        "description": "The text for searching", 
        "type": "required,string", 
        "name": "text", 
        "example": "`SignPuddle`"
      }, 
      {
        "description": "Type of search of start, end, or exact", 
        "type": "string", 
        "name": "type", 
        "example": "exact"
      }, 
      {
        "description": "Case sensitive search", 
        "type": "number", 
        "name": "case", 
        "example": "0"
      }, 
      {
        "description": "Start of search results", 
        "type": "number", 
        "name": "offset", 
        "example": "0"
      }, 
      {
        "description": "Number of search results", 
        "type": "number", 
        "name": "limit", 
        "example": "10"
      }, 
      {
        "description": "restrict search results", 
        "type": "string", 
        "name": "filter", 
        "example": "user=Val"
      }, 
      {
        "description": "Field for sorting results", 
        "type": "string", 
        "name": "sort", 
        "example": "created_at"
      }, 
      {
        "description": "Type of results: entries, sign, term, terms", 
        "type": "string", 
        "name": "results", 
        "example": "sign"
      }
    ], 
    "description": "Search dictionary terms for text"
  }, 
  {
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "rightsCheck($name,$pass,SP_VIEW);", 
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$output = json_pretty(dictionarySearchTerms($name,$text,$type,$case, $offset, $limit, $filter, $sort,$results));", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $output;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "724fd4b4438fba9d0c5ab89d0833e5c9"
          }, 
          "name": "matching dictionary entries"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "{", 
              "  \"total\": 1,", 
              "  \"data\": [", 
              "    [", 
              "      \"1\",", 
              "      \"\\ud836\\udc00\\ud8cb\\udc61\\ud8c8\\uddd9\\ud8db\\udfc3\\ud836\\udc03\\ud836\\udd1d\\ud836\\udd14\\ud8c8\\uddd9\\ud836\\udcf0\\ud836\\udcf9\\ud8db\\udfc3\\ud836\\udd0e\\ud836\\udd01\\ud8cb\\udc61\\ud836\\udcfd\\ud836\\udd00\"", 
              "    ]", 
              "  ]", 
              "}"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "retrieve matching entries"
  }, 
  {
    "route": "/dictionary/{name}/alphabet{?update}", 
    "name": "Dictionary symbol subset", 
    "parameters": [
      {
        "description": "The name of an dictionary", 
        "type": "required,string", 
        "name": "name", 
        "example": "`ase-US-dictionary-public`"
      }, 
      {
        "description": "Forces a rewrite of the alphabet", 
        "type": "optional,number", 
        "name": "update", 
        "example": "1"
      }
    ], 
    "description": "Create alphabet from dictionary signs"
  }, 
  {
    "code": [
      "$headers = getHeaders();", 
      "$pass = isset($headers['Pass'])?$headers['Pass']:'';", 
      "rightsCheck($name,$pass,SP_VIEW);", 
      "$check = isset($headers['If-Modified-Since'])?$headers['If-Modified-Since']:'';", 
      "if ($name==\"iswa-2010\"){", 
      "  echo json_pretty(dictionaryISWA());", 
      "  return;", 
      "}", 
      "$err = invalidName($name);", 
      "if ($err){", 
      "  haltBadRequest($err);", 
      "}", 
      "$lastModified = lastModified($name);", 
      "if ($lastModified <= $check  && !$update){", 
      "  haltNotModified();", 
      "}", 
      "", 
      "$alphabet = str_replace('-dictionary-','-alphabet-',$name);", 
      "$file = 'data/json/' . $alphabet . '.json';", 
      "if (!$update){", 
      "  if (!file_exists($file)) {", 
      "    $update = 1;", 
      "  } else {", 
      "    $check = date (\"Y-m-d\\TH:i:s\", filemtime($file));", 
      "    $check =  new DateTime($check);", 
      "    $check->setTimezone(new DateTimeZone('UTC'));", 
      "    $check = $check->format('Y-m-d\\TH:i:s\\Z');", 
      "    if ($lastModified>$check){", 
      "      $update = 1;", 
      "    }", 
      "  }", 
      "}", 
      "if ($update) {", 
      "  $json = json_pretty(dictionaryAlphabet($name,$lastModified));", 
      "  file_put_contents($file,$json);", 
      "}", 
      "if(file_exists($file)) {", 
      "  header('Last-Modified: ' . $lastModified);", 
      "  $searchTime = searchtime($timein);", 
      "  header(\"Search-Time: \" . $searchTime);", 
      "  getFile($file);", 
      "} else {", 
      "  haltNotFound();", 
      "}"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "headers": {
            "Pass": "724fd4b4438fba9d0c5ab89d0833e5c9", 
            "If-Modified-Since": "2019-01-16T16:56:19.175Z"
          }, 
          "name": "dictionary query results"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "{\"name\": \"ase-US-alphabet-public\",\"data\": []}"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "generate alphabet from dictionary contents"
  }, 
  {
    "lines": [
      "+ Source: [ApiTxt format](../src/tools.txt) and [JSON objects](../src/tools.json)", 
      "+ Documents: [API Blueprint](../doc/tools.md) and [Stand Alone HTML](../doc/tools.htm)", 
      "+ Live Page: [API Interface](../api/tools.html) and [JavaScript](../api/tools.js)"
    ], 
    "group": "tools", 
    "description": "Resources related to tools"
  }, 
  {
    "route": "/tools/", 
    "name": "tools index"
  }, 
  {
    "method": "GET", 
    "dialog": [
      {
        "responses": [
          {
            "status": 200, 
            "body": [
              "Available routes:", 
              "", 
              "/tools/", 
              "/tools/test{?text}", 
              "/tools/define", 
              "/tools/define/{section}", 
              "/tools/define/{section}/{part}", 
              "/tools/parse{?text,utf}", 
              "/tools/encode{?text,slash}", 
              "/tools/decode{?text}", 
              "/tools/utf8{?text}"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Get the tools index"
  }, 
  {
    "route": "/tools/define", 
    "lines": [
      "The definition tree for character mapping"
    ], 
    "name": "Character definition tree"
  }, 
  {
    "code": [
      "$define = SignWriting\\define();", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo json_pretty($define);"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "responses": [
          {
            "status": 200, 
            "body": [
              "{", 
              "  \"utf-8\": {},", 
              "  \"utf-16\": {},", 
              "  \"utf-32\": {},", 
              "  \"fsw\": {},", 
              "  \"swu\": {},", 
              "  \"style\": {}", 
              "}"
            ], 
            "type": "text/plain;charset=utf-8"
          }
        ]
      }
    ], 
    "name": "Get main define"
  }, 
  {
    "route": "/tools/define/{section}", 
    "lines": [
      "A section of the definition tree"
    ], 
    "name": "Section definition", 
    "parameters": [
      {
        "description": "The name of section", 
        "type": "string", 
        "name": "section", 
        "example": "fsw"
      }
    ]
  }, 
  {
    "code": [
      "global $regex_define;", 
      "if ($section == \"regex\"){", 
      "  return $regex_define();", 
      "}", 
      "global $sample_define;", 
      "if ($section == \"sample\"){", 
      "  return $sample_define();", 
      "}", 
      "$define = SignWriting\\define($section);", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo json_pretty($define);"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "responses": [
          {
            "status": 200, 
            "body": [
              "{", 
              "  \"sign\": [],", 
              "  \"spatial\": [],", 
              "  \"symbol\": [],", 
              "  \"coord\": [],", 
              "  \"prefix\": [],", 
              "  \"box\": [],", 
              "  \"query\": []", 
              "}"
            ], 
            "type": "text/plain;charset=utf-8"
          }
        ]
      }
    ], 
    "name": "Get section define"
  }, 
  {
    "route": "/tools/define/{section}/{part}", 
    "lines": [
      "A part of the section definition"
    ], 
    "name": "Part definition", 
    "parameters": [
      {
        "description": "The name of section", 
        "type": "string", 
        "name": "section", 
        "example": "swu"
      }, 
      {
        "description": "The part of the definition", 
        "type": "string", 
        "name": "part", 
        "example": "symbol"
      }
    ]
  }, 
  {
    "code": [
      "$define = SignWriting\\define($section,$part);", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo json_pretty($define);"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "responses": [
          {
            "status": 200, 
            "body": [
              "[", 
              "  \"individual symbol\",", 
              "  \"S10000\",", 
              "  \"[\\\\x{40000}-\\\\x{4F428}]\"", 
              "]"
            ], 
            "type": "text/plain;charset=utf-8"
          }
        ]
      }
    ], 
    "name": "Get part define"
  }, 
  {
    "route": "/tools/parse{?text,utf}", 
    "lines": [
      "A function to analyze text and parse it into individual components"
    ], 
    "name": "Parse text", 
    "parameters": [
      {
        "description": "The text to parse", 
        "type": "string", 
        "name": "text", 
        "example": "S10000"
      }, 
      {
        "description": "The UTF number of 8, 16, 32 or 'x'", 
        "type": "string", 
        "name": "utf", 
        "example": "32"
      }
    ]
  }, 
  {
    "code": [
      "if (!in_array($utf,[8,16,32,'x'])){", 
      "  $utf = 16;", 
      "}", 
      "$parse = SignWriting\\parse($text);", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "$json = json_pretty($parse);", 
      "echo SignWriting\\cast($json,$utf);"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "responses": [
          {
            "status": 200, 
            "body": [
              "{", 
              "  \"fsw\": {", 
              "    \"symbol\": [", 
              "      \"S10000\"", 
              "    ]", 
              "  },", 
              "  \"query\": {", 
              "    \"base\": [", 
              "      100", 
              "    ],", 
              "    \"symbol\": [", 
              "      \"S10000\"", 
              "    ]", 
              "  }", 
              "}"
            ], 
            "type": "text/plain;charset=utf-8"
          }
        ]
      }
    ], 
    "name": "Get parse results"
  }, 
  {
    "route": "/tools/encode{?text,slash}", 
    "lines": [
      "A function to encode SignWriting in Unicode (SWU) as UTF-16"
    ], 
    "name": "Encode text", 
    "parameters": [
      {
        "description": "The text to encode", 
        "type": "string", 
        "name": "text", 
        "example": "\ud836\udc00\ud8d8\udd31\ud8e2\udc23\ud8f4\ude61\ud836\udc03\ud836\udd1b\ud836\udd35\ud8f4\ude61\ud836\udcf4\ud836\udcf5\ud8d8\udd31\ud836\udd0c\ud836\udd06\ud8e2\udc23\ud836\udd09\ud836\udd1a"
      }, 
      {
        "description": "The number of slashes for escaping", 
        "type": "number", 
        "name": "slash", 
        "example": "1"
      }
    ]
  }, 
  {
    "code": [
      "$encode = SignWriting\\encode($text,$slash);", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $encode;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "responses": [
          {
            "status": 200, 
            "body": [
              "\\uD836\\uDC00\\uD8D8\\uDD31\\uD8E2\\uDC23\\uD8F4\\uDE61\\uD836\\uDC03\\uD836\\uDD1B\\uD836\\uDD35\\uD8F4\\uDE61\\uD836\\uDCF4\\uD836\\uDCF5\\uD8D8\\uDD31\\uD836\\uDD0C\\uD836\\uDD06\\uD8E2\\uDC23\\uD836\\uDD09\\uD836\\uDD1A"
            ], 
            "type": "text/plain;charset=utf-8"
          }
        ]
      }
    ], 
    "name": "Get encoded query string"
  }, 
  {
    "route": "/tools/decode{?text}", 
    "lines": [
      "A function to decode SignWriting in Unicode (SWU) from UTF-16"
    ], 
    "name": "Decode text", 
    "parameters": [
      {
        "description": "The text to decode", 
        "type": "string", 
        "name": "text", 
        "example": "\\\\uD836\\\\uDC00"
      }
    ]
  }, 
  {
    "code": [
      "$decode = SignWriting\\decode($text);", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $decode;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "responses": [
          {
            "status": 200, 
            "body": [
              "\ud836\udc00"
            ], 
            "type": "text/plain;charset=utf-8"
          }
        ]
      }
    ], 
    "name": "Get decoded query string"
  }, 
  {
    "route": "/tools/utf8{?text}", 
    "name": "UTF-8 encode text", 
    "parameters": [
      {
        "description": "The text to encode", 
        "type": "string", 
        "name": "text", 
        "example": "\ud836\udc00\ud8d8\udd31\ud8e2\udc23\ud8f4\ude61\ud836\udc03\ud836\udd1b\ud836\udd35\ud8f4\ude61\ud836\udcf4\ud836\udcf5\ud8d8\udd31\ud836\udd0c\ud836\udd06\ud8e2\udc23\ud836\udd09\ud836\udd1a"
      }
    ]
  }, 
  {
    "code": [
      "$encode = SignWriting\\utf8($text);", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $encode;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "responses": [
          {
            "status": 200, 
            "body": [
              "%F0%9D%A0%80%F1%86%84%B1%F1%88%A0%A3%F1%8D%89%A1%F0%9D%A0%83%F0%9D%A4%9B%F0%9D%A4%B5%F1%8D%89%A1%F0%9D%A3%B4%F0%9D%A3%B5%F1%86%84%B1%F0%9D%A4%8C%F0%9D%A4%86%F1%88%A0%A3%F0%9D%A4%89%F0%9D%A4%9A"
            ], 
            "type": "text/plain;charset=utf-8"
          }
        ]
      }
    ], 
    "name": "Get utf-8 encoded query string"
  }, 
  {
    "route": "/tools/test{?text,opt1,opt2}", 
    "lines": [
      "A general purpose function for testing"
    ], 
    "name": "Test with input", 
    "parameters": [
      {
        "description": "Input for testing", 
        "type": "string", 
        "name": "text", 
        "example": "S10000"
      }, 
      {
        "description": "Option one for testing", 
        "type": "string", 
        "name": "opt1", 
        "example": "AS"
      }, 
      {
        "description": "Option two for testing", 
        "type": "string", 
        "name": "opt2", 
        "example": "AS"
      }
    ]
  }, 
  {
    "code": [
      "$test = SignWriting\\test($text,$opt1,$opt2);", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $test;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "responses": [
          {
            "status": 200, 
            "body": [
              "test output"
            ], 
            "type": "text/plain;charset=utf-8"
          }
        ]
      }
    ], 
    "name": "Get test results"
  }, 
  {
    "lines": [
      "+ Source: [ApiTxt format](../src/fsw.txt) and [JSON objects](../src/fsw.json)", 
      "+ Documents: [API Blueprint](../doc/fsw.md) and [Stand Alone HTML](../doc/fsw.htm)", 
      "+ Live Page: [API Interface](../api/fsw.html) and [JavaScript](../api/fsw.js)"
    ], 
    "group": "FSW", 
    "description": "Resources related to Formal SignWriting in ASCII (FSW)"
  }, 
  {
    "route": "/fsw{?text,style}", 
    "name": "FSW Word", 
    "parameters": [
      {
        "description": "The name of sign", 
        "type": "string", 
        "name": "text", 
        "example": "AS20310S26b02S33100M521x547S33100482x483S20310506x500S26b02503x520"
      }, 
      {
        "description": "Flag to include styling string", 
        "type": "boolean,optional", 
        "name": "style", 
        "example": "true"
      }
    ]
  }, 
  {
    "code": [
      "$fsw = SignWriting\\fsw($text,$style);", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $fsw;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "one Formal SignWriting in ASCII string"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "AS20310S26b02S33100M521x547S33100482x483S20310506x500S26b02503x520"
            ], 
            "type": "text/plain;charset=utf-8"
          }
        ]
      }
    ], 
    "name": "First FSW string"
  }, 
  {
    "route": "/fsw/all{?text,style}", 
    "name": "FSW Text", 
    "parameters": [
      {
        "description": "The name of sign", 
        "type": "string", 
        "name": "text", 
        "example": "AS20310S26b02S33100M521x547S33100482x483S20310506x500S26b02503x520"
      }, 
      {
        "description": "Flag to include styling string", 
        "type": "number", 
        "name": "style", 
        "example": "1"
      }
    ]
  }, 
  {
    "code": [
      "$fsw = SignWriting\\fswAll($text,$style);", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $fsw;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "many Formal SignWriting in ASCII string"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "AS20310S26b02S33100M521x547S33100482x483S20310506x500S26b02503x520"
            ], 
            "type": "text/plain;charset=utf-8"
          }
        ]
      }
    ], 
    "name": "All FSW strings"
  }, 
  {
    "route": "/fsw/swu{?text}", 
    "name": "FSW to SWU", 
    "parameters": [
      {
        "description": "The name of sign", 
        "type": "string", 
        "name": "text", 
        "example": "AS20310S26b02S33100M521x547S33100482x483S20310506x500S26b02503x520"
      }
    ]
  }, 
  {
    "code": [
      "$swu = SignWriting\\fsw2swu($text);", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $swu;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "lines": [
            "transformation from ASCII to Unicode characters."
          ], 
          "name": "SWU conversion of FSW string"
        }, 
        "responses": [
          {
            "status": 200, 
            "lines": [
              "requires font SuttonSignWritingOneD"
            ], 
            "body": [
              "\ud836\udc00\ud8d8\udd31\ud8e2\udc23\ud8f4\ude61\ud836\udc03\ud836\udd1b\ud836\udd35\ud8f4\ude61\ud836\udcf4\ud836\udcf5\ud8d8\udd31\ud836\udd0c\ud836\udd06\ud8e2\udc23\ud836\udd09\ud836\udd1a"
            ], 
            "type": "text/plain;charset=utf-8"
          }
        ]
      }
    ], 
    "name": "Text with FSW strings"
  }, 
  {
    "route": "/fsw/svg/{text}", 
    "lines": [
      "Create a stand-alone SVG image using Formal SignWriting in ASCII (FSW)"
    ], 
    "name": "SVG image", 
    "parameters": [
      {
        "description": "The name of sign", 
        "type": "string", 
        "name": "text", 
        "example": "AS20310S26b02S33100M521x547S33100482x483S20310506x500S26b02503x520"
      }
    ]
  }, 
  {
    "code": [
      "$req = $app->request();", 
      "if ($req->get('throwStatus')=='500') {haltNoDatabase();}", 
      "$svg = SignWriting\\svg($text);", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $svg;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "collection text"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"39\" height=\"64\" viewBox=\"482 483 39 64\">", 
              "  <text style=\"font-size:0%;\">AS20310S26b02S33100M521x547S33100482x483S20310506x500S26b02503x520</text>", 
              "  <svg x='482' y='483'><g transform=\"translate(0.149874875465,34.7500790925) scale(0.00988906872676,-0.00988956850125)\"><path class=\"sym-line\" fill=\"black\" d=\"M1528 3484 c-592 -92 -1088 -447 -1348 -963 -125 -249 -180 -485 -180 -771 0 -480 183 -911 529 -1242 350 -336 780 -508 1271 -508 451 0 864 150 1193 434 326 281 517 620 591 1051 21 121 21 409 0 530 -43 252 -114 444 -237 639 -282 453 -741 750 -1284 831 -127 19 -413 18 -535 -1z m607 -173 c583 -126 1038 -523 1224 -1069 59 -173 75 -277 75 -492 0 -165 -3 -211 -22 -300 -71 -327 -228 -611 -458 -829 -186 -177 -381 -295 -614 -374 -176 -60 -282 -78 -490 -84 -247 -7 -416 19 -628 97 -549 201 -944 674 -1043 1250 -17 97 -17 383 0 480 99 576 495 1050 1043 1250 105 38 177 58 303 81 143 26 467 21 610 -10z M1720 1800 l0 -600 80 0 80 0 0 600 0 600 -80 0 -80 0 0 -600z\"/></g></svg>", 
              "  <svg x='506' y='500'><g transform=\"translate(0.0,15.0) scale(0.01,-0.01)\"><path class=\"sym-fill\" fill=\"white\" d=\"M200 750 l0 -550 300 0 300 0 0 550 0 550 -300 0 -300 0 0 -550z\"/><path class=\"sym-line\" fill=\"black\" d=\"M0 750 l0 -750 750 0 750 0 0 750 0 750 -750 0 -750 0 0 -750z m800 0 l0 -550 -300 0 -300 0 0 550 0 550 300 0 300 0 0 -550z\"/></g></svg>", 
              "  <svg x='503' y='520'><g transform=\"translate(0.196840829729,26.6999810561) scale(0.00975214136907,-0.00983390502079)\"><path class=\"sym-line\" fill=\"black\" d=\"M345 2350 l-350 -350 325 -325 325 -325 -325 -325 -325 -325 353 -353 352 -352 0 303 0 302 350 0 350 0 0 100 0 100 -350 0 -350 0 0 550 0 550 350 0 350 0 0 100 0 100 -350 0 -350 0 -2 300 -3 300 -350 -350z M1600 1350 l0 -1350 100 0 100 0 0 1350 0 1350 -100 0 -100 0 0 -1350z\"/></g></svg>", 
              "</svg>"
            ], 
            "type": "image/svg+xml;charset=utf-8"
          }
        ]
      }
    ], 
    "name": "Retrieve stand alone SVG image"
  }, 
  {
    "route": "/fsw/svg/font/{text}", 
    "lines": [
      "Create an SVG with font using Formal SignWriting in ASCII (FSW)"
    ], 
    "name": "SVG with font", 
    "parameters": [
      {
        "description": "The name of sign", 
        "type": "string", 
        "name": "text", 
        "example": "AS20310S26b02S33100M521x547S33100482x483S20310506x500S26b02503x520"
      }
    ]
  }, 
  {
    "code": [
      "$req = $app->request();", 
      "if ($req->get('throwStatus')=='500') {haltNoDatabase();}", 
      "$svg = SignWriting\\svg($text,true);", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $svg;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "collection text"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"49\" height=\"69\" viewBox=\"476 466 49 69\">", 
              "  <text font-size=\"0\">AS10011S10019S2e704S2e748M525x535S2e748483x510S10011501x466S2e704510x500S10019476x475</text>", 
              "  <g transform=\"translate(483,510)\"><text class=\"sym-fill\" style=\"pointer-events:none;font-family:'SuttonSignWritingFill';font-size:30px;fill:white;\">\udbed\udee9</text><text class=\"sym-line\" style=\"pointer-events:none;font-family:'SuttonSignWritingLine';font-size:30px;fill:black;\">\udbad\udee9</text></g>", 
              "  <g transform=\"translate(501,466)\"><text class=\"sym-fill\" style=\"pointer-events:none;font-family:'SuttonSignWritingFill';font-size:30px;fill:white;\">\udbc0\udc12</text><text class=\"sym-line\" style=\"pointer-events:none;font-family:'SuttonSignWritingLine';font-size:30px;fill:black;\">\udb80\udc12</text></g>", 
              "  <g transform=\"translate(510,500)\"><text class=\"sym-fill\" style=\"pointer-events:none;font-family:'SuttonSignWritingFill';font-size:30px;fill:white;\">\udbed\udea5</text><text class=\"sym-line\" style=\"pointer-events:none;font-family:'SuttonSignWritingLine';font-size:30px;fill:black;\">\udbad\udea5</text></g>", 
              "  <g transform=\"translate(476,475)\"><text class=\"sym-fill\" style=\"pointer-events:none;font-family:'SuttonSignWritingFill';font-size:30px;fill:white;\">\udbc0\udc1a</text><text class=\"sym-line\" style=\"pointer-events:none;font-family:'SuttonSignWritingLine';font-size:30px;fill:black;\">\udb80\udc1a</text></g>", 
              "</svg>"
            ], 
            "type": "image/svg+xml;charset=utf-8"
          }
        ]
      }
    ], 
    "name": "Retrieve SVG with font"
  }, 
  {
    "lines": [
      "+ Source: [ApiTxt format](../src/swu.txt) and [JSON objects](../src/swu.json)", 
      "+ Documents: [API Blueprint](../doc/swu.md) and [Stand Alone HTML](../doc/swu.htm)", 
      "+ Live Page: [API Interface](../api/swu.html) and [JavaScript](../api/swu.js)"
    ], 
    "group": "swu", 
    "description": "Resources related to Formal SignWriting in ASCII (SWU)"
  }, 
  {
    "route": "/swu{?text,style}", 
    "name": "SWU Word", 
    "parameters": [
      {
        "description": "The name of sign", 
        "type": "string", 
        "name": "text", 
        "example": "\ud836\udc00\ud8d8\udd31\ud8e2\udc23\ud8f4\ude61\ud836\udc03\ud836\udd1b\ud836\udd35\ud8f4\ude61\ud836\udcf4\ud836\udcf5\ud8d8\udd31\ud836\udd0c\ud836\udd06\ud8e2\udc23\ud836\udd09\ud836\udd1a"
      }, 
      {
        "description": "Flag to include styling string", 
        "type": "number", 
        "name": "style", 
        "example": "1"
      }
    ]
  }, 
  {
    "code": [
      "$timein = microtime(true);", 
      "$swu = SignWriting\\swu($text,$style);", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $swu;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "one Formal SignWriting in ASCII string"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "\ud836\udc00\ud8d8\udd31\ud8e2\udc23\ud8f4\ude61\ud836\udc03\ud836\udd1b\ud836\udd35\ud8f4\ude61\ud836\udcf4\ud836\udcf5\ud8d8\udd31\ud836\udd0c\ud836\udd06\ud8e2\udc23\ud836\udd09\ud836\udd1a"
            ], 
            "type": "text/plain;charset=utf-8"
          }
        ]
      }
    ], 
    "name": "first SWU string"
  }, 
  {
    "route": "/swu/all{?text,style}", 
    "name": "SWU Text", 
    "parameters": [
      {
        "description": "The name of sign", 
        "type": "string", 
        "name": "text", 
        "example": "\ud836\udc00\ud8d8\udd31\ud8e2\udc23\ud8f4\ude61\ud836\udc03\ud836\udd1b\ud836\udd35\ud8f4\ude61\ud836\udcf4\ud836\udcf5\ud8d8\udd31\ud836\udd0c\ud836\udd06\ud8e2\udc23\ud836\udd09\ud836\udd1a"
      }, 
      {
        "description": "Flag to include styling string", 
        "type": "number", 
        "name": "style", 
        "example": "1"
      }
    ]
  }, 
  {
    "code": [
      "$timein = microtime(true);", 
      "$swu = SignWriting\\swuAll($text,$style);", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $swu;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "many Formal SignWriting in ASCII string"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "\ud836\udc00\ud8d8\udd31\ud8e2\udc23\ud8f4\ude61\ud836\udc03\ud836\udd1b\ud836\udd35\ud8f4\ude61\ud836\udcf4\ud836\udcf5\ud8d8\udd31\ud836\udd0c\ud836\udd06\ud8e2\udc23\ud836\udd09\ud836\udd1a"
            ], 
            "type": "text/plain;charset=utf-8"
          }
        ]
      }
    ], 
    "name": "all SWU strings"
  }, 
  {
    "route": "/swu/fsw{?text}", 
    "name": "SWU to FSW", 
    "parameters": [
      {
        "description": "The name of sign", 
        "type": "string", 
        "name": "text", 
        "example": "\ud836\udc00\ud8d8\udd31\ud8e2\udc23\ud8f4\ude61\ud836\udc03\ud836\udd1b\ud836\udd35\ud8f4\ude61\ud836\udcf4\ud836\udcf5\ud8d8\udd31\ud836\udd0c\ud836\udd06\ud8e2\udc23\ud836\udd09\ud836\udd1a"
      }
    ]
  }, 
  {
    "code": [
      "$timein = microtime(true);", 
      "$fsw = SignWriting\\swu2fsw($text);", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $fsw;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "original text with Formal SignWriting in ASCII inside"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "\ud836\udc00\ud8d8\udd31\ud8e2\udc23\ud8f4\ude61\ud836\udc03\ud836\udd1b\ud836\udd35\ud8f4\ude61\ud836\udcf4\ud836\udcf5\ud8d8\udd31\ud836\udd0c\ud836\udd06\ud8e2\udc23\ud836\udd09\ud836\udd1a"
            ], 
            "type": "text/plain;charset=utf-8"
          }
        ]
      }
    ], 
    "name": "text with SWU strings"
  }, 
  {
    "route": "/swu/svg/{text}", 
    "lines": [
      "Create a stand-alone SVG image using Formal SignWriting in ASCII (SWU)"
    ], 
    "name": "SVG image", 
    "parameters": [
      {
        "description": "The name of sign", 
        "type": "string", 
        "name": "text", 
        "example": "\ud836\udc00\ud8d8\udd31\ud8e2\udc23\ud8f4\ude61\ud836\udc03\ud836\udd1b\ud836\udd35\ud8f4\ude61\ud836\udcf4\ud836\udcf5\ud8d8\udd31\ud836\udd0c\ud836\udd06\ud8e2\udc23\ud836\udd09\ud836\udd1a"
      }
    ]
  }, 
  {
    "code": [
      "$timein = microtime(true);", 
      "$req = $app->request();", 
      "if ($req->get('throwStatus')=='500') {haltNoDatabase();}", 
      "$svg = SignWriting\\svg($text);", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $svg;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "collection text"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"39\" height=\"64\" viewBox=\"482 483 39 64\">", 
              "  <text style=\"font-size:0%;\">\ud836\udc00\ud8d8\udd31\ud8e2\udc23\ud8f4\ude61\ud836\udc03\ud836\udd1b\ud836\udd35\ud8f4\ude61\ud836\udcf4\ud836\udcf5\ud8d8\udd31\ud836\udd0c\ud836\udd06\ud8e2\udc23\ud836\udd09\ud836\udd1a</text>", 
              "  <svg x='482' y='483'><g transform=\"translate(0.149874875465,34.7500790925) scale(0.00988906872676,-0.00988956850125)\"><path class=\"sym-line\" fill=\"black\" d=\"M1528 3484 c-592 -92 -1088 -447 -1348 -963 -125 -249 -180 -485 -180 -771 0 -480 183 -911 529 -1242 350 -336 780 -508 1271 -508 451 0 864 150 1193 434 326 281 517 620 591 1051 21 121 21 409 0 530 -43 252 -114 444 -237 639 -282 453 -741 750 -1284 831 -127 19 -413 18 -535 -1z m607 -173 c583 -126 1038 -523 1224 -1069 59 -173 75 -277 75 -492 0 -165 -3 -211 -22 -300 -71 -327 -228 -611 -458 -829 -186 -177 -381 -295 -614 -374 -176 -60 -282 -78 -490 -84 -247 -7 -416 19 -628 97 -549 201 -944 674 -1043 1250 -17 97 -17 383 0 480 99 576 495 1050 1043 1250 105 38 177 58 303 81 143 26 467 21 610 -10z M1720 1800 l0 -600 80 0 80 0 0 600 0 600 -80 0 -80 0 0 -600z\"/></g></svg>", 
              "  <svg x='506' y='500'><g transform=\"translate(0.0,15.0) scale(0.01,-0.01)\"><path class=\"sym-fill\" fill=\"white\" d=\"M200 750 l0 -550 300 0 300 0 0 550 0 550 -300 0 -300 0 0 -550z\"/><path class=\"sym-line\" fill=\"black\" d=\"M0 750 l0 -750 750 0 750 0 0 750 0 750 -750 0 -750 0 0 -750z m800 0 l0 -550 -300 0 -300 0 0 550 0 550 300 0 300 0 0 -550z\"/></g></svg>", 
              "  <svg x='503' y='520'><g transform=\"translate(0.196840829729,26.6999810561) scale(0.00975214136907,-0.00983390502079)\"><path class=\"sym-line\" fill=\"black\" d=\"M345 2350 l-350 -350 325 -325 325 -325 -325 -325 -325 -325 353 -353 352 -352 0 303 0 302 350 0 350 0 0 100 0 100 -350 0 -350 0 0 550 0 550 350 0 350 0 0 100 0 100 -350 0 -350 0 -2 300 -3 300 -350 -350z M1600 1350 l0 -1350 100 0 100 0 0 1350 0 1350 -100 0 -100 0 0 -1350z\"/></g></svg>", 
              "</svg>"
            ], 
            "type": "image/svg+xml;charset=utf-8"
          }
        ]
      }
    ], 
    "name": "retrieve stand-alone SVG image"
  }, 
  {
    "route": "/swu/svg/font/{text}", 
    "lines": [
      "Create an SVG with font using Formal SignWriting in ASCII (SWU)"
    ], 
    "name": "SVG with font", 
    "parameters": [
      {
        "description": "The name of sign", 
        "type": "string", 
        "name": "text", 
        "example": "\ud836\udc00\ud8d8\udd31\ud8e2\udc23\ud8f4\ude61\ud836\udc03\ud836\udd1b\ud836\udd35\ud8f4\ude61\ud836\udcf4\ud836\udcf5\ud8d8\udd31\ud836\udd0c\ud836\udd06\ud8e2\udc23\ud836\udd09\ud836\udd1a"
      }
    ]
  }, 
  {
    "code": [
      "$timein = microtime(true);", 
      "$req = $app->request();", 
      "if ($req->get('throwStatus')=='500') {haltNoDatabase();}", 
      "$svg = SignWriting\\svg($text,true);", 
      "$searchTime = searchtime($timein);", 
      "header(\"Search-Time: \" . $searchTime);", 
      "echo $svg;"
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "collection text"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"49\" height=\"69\" viewBox=\"476 466 49 69\">", 
              "  <text font-size=\"0\">\ud836\udc00\ud8d8\udd31\ud8e2\udc23\ud8f4\ude61\ud836\udc03\ud836\udd1b\ud836\udd35\ud8f4\ude61\ud836\udcf4\ud836\udcf5\ud8d8\udd31\ud836\udd0c\ud836\udd06\ud8e2\udc23\ud836\udd09\ud836\udd1a</text>", 
              "  <g transform=\"translate(483,510)\"><text class=\"sym-fill\" style=\"pointer-events:none;font-family:'SuttonSignWritingFill';font-size:30px;fill:white;\">\udbed\udee9</text><text class=\"sym-line\" style=\"pointer-events:none;font-family:'SuttonSignWritingLine';font-size:30px;fill:black;\">\udbad\udee9</text></g>", 
              "  <g transform=\"translate(501,466)\"><text class=\"sym-fill\" style=\"pointer-events:none;font-family:'SuttonSignWritingFill';font-size:30px;fill:white;\">\udbc0\udc12</text><text class=\"sym-line\" style=\"pointer-events:none;font-family:'SuttonSignWritingLine';font-size:30px;fill:black;\">\udb80\udc12</text></g>", 
              "  <g transform=\"translate(510,500)\"><text class=\"sym-fill\" style=\"pointer-events:none;font-family:'SuttonSignWritingFill';font-size:30px;fill:white;\">\udbed\udea5</text><text class=\"sym-line\" style=\"pointer-events:none;font-family:'SuttonSignWritingLine';font-size:30px;fill:black;\">\udbad\udea5</text></g>", 
              "  <g transform=\"translate(476,475)\"><text class=\"sym-fill\" style=\"pointer-events:none;font-family:'SuttonSignWritingFill';font-size:30px;fill:white;\">\udbc0\udc1a</text><text class=\"sym-line\" style=\"pointer-events:none;font-family:'SuttonSignWritingLine';font-size:30px;fill:black;\">\udb80\udc1a</text></g>", 
              "</svg>"
            ], 
            "type": "image/svg+xml;charset=utf-8"
          }
        ]
      }
    ], 
    "name": "retrieve SVG with font"
  }, 
  {
    "lines": [
      "root, group, route, parameter, method, request, response, header, line, code, and body.", 
      "", 
      "+ Source: [ApiTxt format](../src/apitxt.txt) and [JSON objects](../src/apitxt.json)", 
      "+ Documents: [API Blueprint](../doc/apitxt.md) and [Stand Alone HTML](../doc/apitxt.htm)", 
      "+ Live Page: [API Interface](../api/apitxt.html) and [JavaScript](../api/apitxt.js)"
    ], 
    "group": "apitxt", 
    "description": "ApiTxt uses eleven types of element to define an API."
  }, 
  {
    "route": "/apitxt/root", 
    "lines": [
      "Every document should start with a root element.", 
      "After the root, the other elements are used to quickly create complex website APIs.", 
      "The order of the lines matters and will effect the structure of the JSON objects.", 
      "", 
      "There are two groups of elements, the frame elements and the detail elements.", 
      "The frame elements structure a website api and the detail elements attach to a previous frame element.", 
      "", 
      "### Frame elements", 
      "There are six frame elements: root, group, route, method, request, and response.", 
      "The lines are written in a specific order to create an array of JSON objects.", 
      "", 
      "**route organization**", 
      "", 
      "An ApiTxt document starts with a root, or an assumed root.", 
      "Any route that occur before a group element, will be associated with the root.", 
      "Groups are always associated with the root.", 
      "Group elements can contain routes.", 
      "", 
      "```", 
      "    root", 
      "      | - routes", 
      "      | - groups", 
      "            | - routes", 
      "```", 
      "", 
      "**route structure**", 
      "", 
      "A route can be associated with a variety of HTTP methods.", 
      "Each method can have several requests and responses.", 
      "Any response before a request will assume a generic request.", 
      "Any response after a request will be associated with that request.", 
      "", 
      "```", 
      "    route", 
      "      | - methods", 
      "        | - responses", 
      "        | - requests", 
      "              | - responses", 
      "```", 
      "", 
      "## Detail elements", 
      "There are five detail elements: line, parameter, code, header, and body.  The detail lines attach to a previous frame element if correctly structured.", 
      "", 
      "**single line elements**", 
      "", 
      "+ lines for all frame elements", 
      "+ parameters for route", 
      "+ code for method", 
      "+ body for request and response", 
      "+ headers for request and response", 
      ""
    ], 
    "name": "root"
  }, 
  {
    "lines": [
      "Every document should start with a root element.", 
      "", 
      "**root line**", 
      "", 
      "root &lt;TAB> name &lt;TAB> title &lt;TAB> host", 
      "", 
      "+ field 1 - name - uniquely identifies a document", 
      "+ field 2 - title - name of the document", 
      "+ field 3 - host - website URL", 
      "", 
      "**root example**", 
      "", 
      "root &lt;TAB> apitxt &lt;TAB> ApiTxt &lt;TAB> https://signpuddle.com/apitxt", 
      "", 
      "", 
      "**root line relationships**", 
      "", 
      "```", 
      "    root", 
      "     | - lines", 
      "     | - routes", 
      "     | - groups", 
      "```", 
      "", 
      "**root object**", 
      "", 
      "```json", 
      "{", 
      "  \"root\" : field[1],", 
      "  \"title\" : field[2],", 
      "  \"host\" : field[3],", 
      "  \"lines\" : []", 
      "}", 
      "```", 
      ""
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "the root definition"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "Every document should start with a root element.", 
              "", 
              "**root line**", 
              "", 
              "root\tname\ttitle\thost", 
              "", 
              "+ field 1 - name - uniquely identifies a document", 
              "+ field 2 - title - name of the document", 
              "+ field 3 - host - website URL", 
              "", 
              "**example**", 
              "", 
              "root\tapitxt\tApiTxt\thttps://signpuddle.com/apitxt", 
              "", 
              "", 
              "**root line relationships**", 
              "", 
              "```", 
              "    root", 
              "     | - lines", 
              "     | - routes", 
              "     | - groups", 
              "```", 
              "", 
              "**root object**", 
              "", 
              "```json", 
              "{", 
              "  \"root\" : field[1],", 
              "  \"title\" : field[2],", 
              "  \"host\" : field[3],", 
              "  \"lines\" : []", 
              "}", 
              "```"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Get root definition"
  }, 
  {
    "route": "/apitxt/group", 
    "name": "group"
  }, 
  {
    "lines": [
      "The group organizes resources into sections", 
      "", 
      "**group line**", 
      "", 
      "group &lt;TAB> name &lt;TAB> description", 
      "", 
      "+ field 1 - name - the short name used for sections", 
      "+ field 2 - description - information about the group", 
      "", 
      "**group example**", 
      "", 
      "group &lt;TAB> Section name &lt;TAB> an example section", 
      "", 
      "**group line relationships**", 
      "", 
      "```", 
      "    group", 
      "     | - lines", 
      "     | - routes", 
      "```", 
      "", 
      "**group object**", 
      "", 
      "```json", 
      "{", 
      "  \"group\" : field[1],", 
      "  \"description\" : field[2],", 
      "  \"lines\": []", 
      "}", 
      "```", 
      ""
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "the group definition"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "The group organizes resources into sections", 
              "", 
              "**group line**", 
              "", 
              "group\tname\tdescription", 
              "", 
              "+ field 1 - name - the short name used for sections", 
              "+ field 2 - description - information about the group", 
              "", 
              "**group example**", 
              "", 
              "group\tSection name\tan example section", 
              "", 
              "**group line relationships**", 
              "", 
              "```", 
              "    group", 
              "     | - lines", 
              "     | - routes", 
              "```", 
              "", 
              "**group object**", 
              "", 
              "```json", 
              "{", 
              "  \"group\" : field[1],", 
              "  \"description\" : field[2],", 
              "  \"lines\": []", 
              "}", 
              "```"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Get group definition"
  }, 
  {
    "route": "/apitxt/route", 
    "name": "route"
  }, 
  {
    "lines": [
      "The route element allows access to a resource", 
      "", 
      "**route line**", 
      "", 
      "route &lt;TAB> URI template &lt;TAB> name &lt;TAB> description", 
      "", 
      "+ field 1 - URI template - a resource pattern with parameters", 
      "+ field 2 - name - the route name must be unique", 
      "+ field 3 - description - information about the resource", 
      "", 
      "**route example**", 
      "", 
      "route &lt;TAB> /example &lt;TAB> an example route &lt;TAB> a description of the route", 
      "", 
      "**route line relationships**", 
      "", 
      "```", 
      "    route", 
      "     | - lines", 
      "     | - parameters", 
      "     | - methods", 
      "```", 
      "", 
      "**route object**", 
      "", 
      "```json", 
      "{", 
      "  \"route\" : field[1],", 
      "  \"name\" : field[2],", 
      "  \"description\" : field[3],", 
      "  \"lines\": [],", 
      "  \"parameters\": []", 
      "}", 
      "```", 
      ""
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "the route definition"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "The route element allows access to a resource", 
              "", 
              "**route line**", 
              "", 
              "route\tURI template\tname\tdescription", 
              "", 
              "+ field 1 - URI template - a resource pattern with parameters", 
              "+ field 2 - name - the route name must be unique", 
              "+ field 3 - description - information about the resource", 
              "", 
              "**route example**", 
              "", 
              "route\t/example\tan example route\ta description of the route", 
              "", 
              "**route line relationships**", 
              "", 
              "```", 
              "    route", 
              "     | - lines", 
              "     | - parameters", 
              "     | - methods", 
              "```", 
              "", 
              "**route object**", 
              "", 
              "```json", 
              "{", 
              "  \"route\" : field[1],", 
              "  \"name\" : field[2],", 
              "  \"description\" : field[3],", 
              "  \"lines\": [],", 
              "  \"parameters\": []", 
              "}", 
              "```"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Get route definition"
  }, 
  {
    "route": "/apitxt/parameter", 
    "name": "parameter"
  }, 
  {
    "lines": [
      "The parameter element is applied to the previous route", 
      "", 
      "**parameter line**", 
      "", 
      "parameter &lt;TAB> name &lt;TAB> example &lt;TAB> type &lt;TAB> description", 
      "", 
      "+ field 1 - name - the name of a parameter for a route", 
      "+ field 2 - example - an example value for the parameter", 
      "+ field 3 - type - the parameter type, such as \"string\", \"number\", \"boolean\", \"string, optional\", \"string, required\"", 
      "+ field 4 - description - information about the parameter", 
      "", 
      "**parameter example**", 
      "", 
      "parameter &lt;TAB> country_code &lt;TAB> US &lt;TAB> string &lt;TAB> the country code of interest", 
      "", 
      "**parameter line relationships**", 
      "", 
      "parameter lines are added to a parameters array", 
      "", 
      "**parameters array**", 
      "", 
      "```json", 
      "{\"parameters\":", 
      "  [", 
      "    {", 
      "      \"name\" : \" field[1],", 
      "      \"example\" : field[2],", 
      "      \"type\" : field[3],", 
      "      \"description\" : field[4]", 
      "    }", 
      "  ]", 
      "}", 
      "```", 
      ""
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "the parameter definition"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "The parameter element is applied to the previous route", 
              "", 
              "**parameter line**", 
              "", 
              "parameter\tname\texample\ttype\tdescription", 
              "", 
              "+ field 1 - name - the name of a parameter for a route", 
              "+ field 2 - example - an example value for the parameter", 
              "+ field 3 - type - the parameter type, such as \"string\", \"number\", \"boolean\", \"string, optional\", \"string, required\"", 
              "+ field 4 - description - information about the parameter", 
              "", 
              "**parameter example**", 
              "", 
              "parameter\tcountry_code\tUS\tstring\tthe country code of interest", 
              "", 
              "**parameter line relationships**", 
              "", 
              "parameter lines are added to a parameters array", 
              "", 
              "**parameters array**", 
              "", 
              "```json", 
              "{\"parameters\":", 
              "  [", 
              "    {", 
              "      \"name\" : \" field[1],", 
              "      \"example\" : field[2],", 
              "      \"type\" : field[3],", 
              "      \"description\" : field[4]", 
              "    }", 
              "  ]", 
              "}", 
              "```"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Get parameter definition"
  }, 
  {
    "route": "/apitxt/method", 
    "name": "method"
  }, 
  {
    "lines": [
      "The method element represents an action that can be performed on a route", 
      "", 
      "**method line**", 
      "", 
      "method &lt;TAB> HTTP method &lt;TAB> name &lt;TAB> description", 
      "", 
      "+ field 1 - HTTP method - the type of action to perform: GET, POST, PUT, DELETE", 
      "+ field 2 - name - the name of the action", 
      "+ field 3 - description - information about the method", 
      "", 
      "**method example**", 
      "", 
      "method &lt;TAB> GET &lt;TAB> Get an example &lt;TAB> This method retrieves an example document", 
      "", 
      "**method line relationships**", 
      "", 
      "```", 
      "    method", 
      "     | - lines", 
      "     | - code", 
      "     | - requests", 
      "     | - responses", 
      "```", 
      "", 
      "**method object**", 
      "", 
      "```json", 
      "{", 
      "  \"method\" : field[1],", 
      "  \"name\" : field[2],", 
      "  \"description\" : field[3],", 
      "  \"lines\" : [],", 
      "  \"code\" : [],", 
      "  \"dialog\" : [", 
      "    {", 
      "      \"request\" : {},", 
      "      \"responses\" : []", 
      "    }", 
      "  ]", 
      "}", 
      "```", 
      ""
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "the method definition"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "The method element represents an action that can be performed on a route", 
              "", 
              "**method line**", 
              "", 
              "method\tHTTP method\tname\tdescription", 
              "", 
              "+ field 1 - HTTP method - the type of action to perform: GET, POST, PUT, DELETE", 
              "+ field 2 - name - the name of the action", 
              "+ field 3 - description - information about the method", 
              "", 
              "**method example**", 
              "", 
              "method\tGET\tGet an example\tThis method retrieves an example document", 
              "", 
              "**method line relationships**", 
              "", 
              "```", 
              "    method", 
              "     | - lines", 
              "     | - code", 
              "     | - requests", 
              "     | - responses", 
              "```", 
              "", 
              "**method object**", 
              "", 
              "```json", 
              "{", 
              "  \"method\" : field[1],", 
              "  \"name\" : field[2],", 
              "  \"description\" : field[3],", 
              "  \"lines\" : [],", 
              "  \"code\" : [],", 
              "  \"dialog\" : [", 
              "    {", 
              "      \"request\" : {},", 
              "      \"responses\" : []", 
              "    }", 
              "  ]", 
              "}", 
              "```"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Get method definition"
  }, 
  {
    "route": "/apitxt/request", 
    "name": "request"
  }, 
  {
    "lines": [
      "The request element is associated with a specific method and can be paired with multiple responses.", 
      "", 
      "**request line**", 
      "", 
      "request &lt;TAB> name &lt;TAB> type", 
      "", 
      "+ field 1 - name - uniquely identifies a request", 
      "+ field 2 - type - the content type of the request body", 
      "", 
      "**request example**", 
      "", 
      "request &lt;TAB> matching text within request body &lt;TAB> plain/text", 
      "", 
      "**request line relationships**", 
      "", 
      "```", 
      "    request", 
      "     | - lines", 
      "     | - headers", 
      "     | - body", 
      "```", 
      "", 
      "**request object**", 
      "", 
      "```json", 
      "{", 
      "  \"name\" : field[1],", 
      "  \"type\" : field[2],", 
      "  \"lines\" : [],", 
      "  \"headers\" : {},", 
      "  \"body\" : []", 
      "}", 
      "```", 
      ""
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "the request definition"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "The request element is associated with a specific method and can be paired with multiple responses.", 
              "", 
              "**request line**", 
              "", 
              "request\tname\ttype", 
              "", 
              "+ field 1 - name - uniquely identifies a request", 
              "+ field 2 - type - the content type of the request body", 
              "", 
              "**request example**", 
              "", 
              "request\tmatching text within request body\tplain/text", 
              "", 
              "**request line relationships**", 
              "", 
              "```", 
              "    request", 
              "     | - lines", 
              "     | - headers", 
              "     | - body", 
              "```", 
              "", 
              "**request object**", 
              "", 
              "```json", 
              "{", 
              "  \"name\" : field[1],", 
              "  \"type\" : field[2],", 
              "  \"lines\" : [],", 
              "  \"headers\" : {},", 
              "  \"body\" : []", 
              "}", 
              "```"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Get request definition"
  }, 
  {
    "route": "/apitxt/response", 
    "name": "response"
  }, 
  {
    "lines": [
      "The response element is associated with a specific request, or associated with a specific method with an assumed generic request.", 
      "", 
      "**response line**", 
      "", 
      "response &lt;TAB> status &lt;TAB> type", 
      "", 
      "+ field 1 - status - an HTTP response code indicating the status of the request", 
      "+ field 2 - type - the content type of the response body", 
      "", 
      "**response example**", 
      "", 
      "response &lt;TAB> 200 &lt;TAB> plain/text", 
      "", 
      "**response line relationships**", 
      "", 
      "```", 
      "    response", 
      "     | - lines", 
      "     | - headers", 
      "     | - body", 
      "```", 
      "", 
      "**response object**", 
      "", 
      "```json", 
      "{", 
      "  \"status\" : field[1],", 
      "  \"type\" : field[2],", 
      "  \"lines\" : [],", 
      "  \"headers\" : {},", 
      "  \"body\" : []", 
      "}", 
      "```", 
      ""
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "the response definition"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "The response element is associated with a specific request, or associated with a specific method with an assumed generic request.", 
              "", 
              "**response line**", 
              "", 
              "response\tstatus\ttype", 
              "", 
              "+ field 1 - status - an HTTP response code indicating the status of the request", 
              "+ field 2 - type - the content type of the response body", 
              "", 
              "**response example**", 
              "", 
              "response\t200\tplain/text", 
              "", 
              "**response line relationships**", 
              "", 
              "```", 
              "    response", 
              "     | - lines", 
              "     | - headers", 
              "     | - body", 
              "```", 
              "", 
              "**response object**", 
              "", 
              "```json", 
              "{", 
              "  \"status\" : field[1],", 
              "  \"type\" : field[2],", 
              "  \"lines\" : [],", 
              "  \"headers\" : {},", 
              "  \"body\" : []", 
              "}", 
              "```"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Get response definition"
  }, 
  {
    "route": "/apitxt/header", 
    "name": "header"
  }, 
  {
    "lines": [
      "The header element is applied to a preceding route", 
      "", 
      "**header line**", 
      "", 
      "header &lt;TAB> name &lt;TAB> value", 
      "", 
      "+ field 1 - name - the header variable name", 
      "+ field 2 - value - the header variable value", 
      "", 
      "**header example**", 
      "", 
      "header &lt;TAB> X-Powered-By &lt;TAB> ApiTxt", 
      "", 
      "**header object**", 
      "", 
      "```json", 
      "{ field[1] : field[2] }", 
      "```", 
      ""
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "the header definition"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "The header element is applied to a preceding request or response", 
              "", 
              "**header line**", 
              "", 
              "header\tname\tvalue", 
              "", 
              "+ field 1 - name - the header variable name", 
              "+ field 2 - value - the header variable value", 
              "", 
              "**header example**", 
              "", 
              "header\tX-Powered-By\tApiTxt", 
              "", 
              "**header object**", 
              "", 
              "```json", 
              "{ field[1] : field[2] }", 
              "```"
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Get header definition"
  }, 
  {
    "route": "/apitxt/body", 
    "name": "body"
  }, 
  {
    "lines": [
      "The body element adds contents to a preceding request or response.", 
      "", 
      "The text of the body is everything after the string \"body &lt;TAB>\"."
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "the body definition"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "The body element adds contents to a preceding request or response.", 
              "", 
              "The text of the body is everything after the string \"body <TAB>\""
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Get body definition"
  }, 
  {
    "route": "/apitxt/line", 
    "name": "line"
  }, 
  {
    "lines": [
      "The line element adds additional text to frame elements.", 
      "", 
      "For the root, group, route, method, request, and response, the lines add details to an element.", 
      "", 
      "The text of the line is everything after the string \"line &lt;TAB>\"."
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "the line definition"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "The line element adds additional text to frame elements.", 
              "", 
              "For the root, group, route, method, request, and response, the lines add details to an element.", 
              "", 
              "The text of the line is everything after the string \"line <TAB>\"."
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Get line definition"
  }, 
  {
    "route": "/apitxt/code", 
    "name": "code"
  }, 
  {
    "lines": [
      "The code element adds functionality to the method element.", 
      "", 
      "The code element contains programming text.  ApiTxt comes integrated with the PHP project the Slim Framework v2.  The conversion to working PHP adds boilerplate details for routes and method, with named parameters and query parameters available as functional variables.", 
      "", 
      "The text of the code is everything after the string \"code &lt;TAB>\"."
    ], 
    "method": "GET", 
    "dialog": [
      {
        "request": {
          "name": "the code definition"
        }, 
        "responses": [
          {
            "status": 200, 
            "body": [
              "The code element adds functionality to the method element.", 
              "", 
              "The code element contains programming text.  ApiTxt comes integrated with the PHP project the Slim Framework v2.  The conversion to working PHP adds boilerplate details for routes and method, with named parameters and query parameters available as functional variables.", 
              "", 
              "The text of the code is everything after the string \"code <TAB>\"."
            ], 
            "type": "text/plain"
          }
        ]
      }
    ], 
    "name": "Get code definition"
  }
]
