{
  "contractName": "RBAC",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": false,
          "name": "role",
          "type": "string"
        }
      ],
      "name": "RoleAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": false,
          "name": "role",
          "type": "string"
        }
      ],
      "name": "RoleRemoved",
      "type": "event"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "_operator",
          "type": "address"
        },
        {
          "name": "_role",
          "type": "string"
        }
      ],
      "name": "checkRole",
      "outputs": [],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "_operator",
          "type": "address"
        },
        {
          "name": "_role",
          "type": "string"
        }
      ],
      "name": "hasRole",
      "outputs": [
        {
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x608060405234801561001057600080fd5b5061029c806100206000396000f30060806040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630988ca8c8114610050578063217fe6c6146100c6575b600080fd5b34801561005c57600080fd5b5060408051602060046024803582810135601f81018590048502860185019096528585526100c495833573ffffffffffffffffffffffffffffffffffffffff1695369560449491939091019190819084018382808284375094975061014e9650505050505050565b005b3480156100d257600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261013a95833573ffffffffffffffffffffffffffffffffffffffff169536956044949193909101919081908401838280828437509497506101bc9650505050505050565b604080519115158252519081900360200190f35b6101b8826000836040518082805190602001908083835b602083106101845780518252601f199092019160209182019101610165565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092209291505061022f565b5050565b6000610228836000846040518082805190602001908083835b602083106101f45780518252601f1990920191602091820191016101d5565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922092915050610244565b9392505050565b6102398282610244565b15156101b857600080fd5b73ffffffffffffffffffffffffffffffffffffffff166000908152602091909152604090205460ff16905600a165627a7a723058209fe3ba5cfeb5ae3c338fb459dabdff8840e37062612f9f1613e81699f7b6d14c0029",
  "deployedBytecode": "0x60806040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630988ca8c8114610050578063217fe6c6146100c6575b600080fd5b34801561005c57600080fd5b5060408051602060046024803582810135601f81018590048502860185019096528585526100c495833573ffffffffffffffffffffffffffffffffffffffff1695369560449491939091019190819084018382808284375094975061014e9650505050505050565b005b3480156100d257600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261013a95833573ffffffffffffffffffffffffffffffffffffffff169536956044949193909101919081908401838280828437509497506101bc9650505050505050565b604080519115158252519081900360200190f35b6101b8826000836040518082805190602001908083835b602083106101845780518252601f199092019160209182019101610165565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092209291505061022f565b5050565b6000610228836000846040518082805190602001908083835b602083106101f45780518252601f1990920191602091820191016101d5565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922092915050610244565b9392505050565b6102398282610244565b15156101b857600080fd5b73ffffffffffffffffffffffffffffffffffffffff166000908152602091909152604090205460ff16905600a165627a7a723058209fe3ba5cfeb5ae3c338fb459dabdff8840e37062612f9f1613e81699f7b6d14c0029",
  "sourceMap": "478:2158:15:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;478:2158:15;;;;;;;",
  "deployedSourceMap": "478:2158:15:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;837:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;837:114:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;837:114:15;;-1:-1:-1;837:114:15;;-1:-1:-1;;;;;;;837:114:15;;;1091:136;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1091:136:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1091:136:15;;-1:-1:-1;1091:136:15;;-1:-1:-1;;;;;;;1091:136:15;;;;;;;;;;;;;;;;;;;837:114;917:29;936:9;917:5;923;917:12;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;917:12:15;;;;;-1:-1:-1;917:12:15;;;;;;;;;;;;-1:-1:-1;;917:18:15;:29::i;:::-;837:114;;:::o;1091:136::-;1174:4;1195:27;1212:9;1195:5;1201;1195:12;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1195:12:15;;;;;-1:-1:-1;1195:12:15;;;;;;;;;;;;-1:-1:-1;;1195:16:15;:27::i;:::-;1188:34;1091:136;-1:-1:-1;;;1091:136:15:o;666:111:16:-;754:17;758:5;765;754:3;:17::i;:::-;746:26;;;;;;;855:128;959:19;;938:4;959:19;;;;;;;;;;;;;;;855:128::o",
  "source": "pragma solidity ^0.4.24;\n\nimport \"./Roles.sol\";\n\n\n/**\n * @title RBAC (Role-Based Access Control)\n * @author Matt Condon (@Shrugs)\n * @dev Stores and provides setters and getters for roles and addresses.\n * Supports unlimited numbers of roles and addresses.\n * See //contracts/mocks/RBACMock.sol for an example of usage.\n * This RBAC method uses strings to key roles. It may be beneficial\n * for you to write your own implementation of this interface using Enums or similar.\n */\ncontract RBAC {\n  using Roles for Roles.Role;\n\n  mapping (string => Roles.Role) private roles;\n\n  event RoleAdded(address indexed operator, string role);\n  event RoleRemoved(address indexed operator, string role);\n\n  /**\n   * @dev reverts if addr does not have role\n   * @param _operator address\n   * @param _role the name of the role\n   * // reverts\n   */\n  function checkRole(address _operator, string _role)\n    public\n    view\n  {\n    roles[_role].check(_operator);\n  }\n\n  /**\n   * @dev determine if addr has role\n   * @param _operator address\n   * @param _role the name of the role\n   * @return bool\n   */\n  function hasRole(address _operator, string _role)\n    public\n    view\n    returns (bool)\n  {\n    return roles[_role].has(_operator);\n  }\n\n  /**\n   * @dev add a role to an address\n   * @param _operator address\n   * @param _role the name of the role\n   */\n  function addRole(address _operator, string _role)\n    internal\n  {\n    roles[_role].add(_operator);\n    emit RoleAdded(_operator, _role);\n  }\n\n  /**\n   * @dev remove a role from an address\n   * @param _operator address\n   * @param _role the name of the role\n   */\n  function removeRole(address _operator, string _role)\n    internal\n  {\n    roles[_role].remove(_operator);\n    emit RoleRemoved(_operator, _role);\n  }\n\n  /**\n   * @dev modifier to scope access to a single role (uses msg.sender as addr)\n   * @param _role the name of the role\n   * // reverts\n   */\n  modifier onlyRole(string _role)\n  {\n    checkRole(msg.sender, _role);\n    _;\n  }\n\n  /**\n   * @dev modifier to scope access to a set of roles (uses msg.sender as addr)\n   * @param _roles the names of the roles to scope access to\n   * // reverts\n   *\n   * @TODO - when solidity supports dynamic arrays as arguments to modifiers, provide this\n   *  see: https://github.com/ethereum/solidity/issues/2467\n   */\n  // modifier onlyRoles(string[] _roles) {\n  //     bool hasAnyRole = false;\n  //     for (uint8 i = 0; i < _roles.length; i++) {\n  //         if (hasRole(msg.sender, _roles[i])) {\n  //             hasAnyRole = true;\n  //             break;\n  //         }\n  //     }\n\n  //     require(hasAnyRole);\n\n  //     _;\n  // }\n}\n",
  "sourcePath": "zeppelin-solidity/contracts/access/rbac/RBAC.sol",
  "ast": {
    "absolutePath": "zeppelin-solidity/contracts/access/rbac/RBAC.sol",
    "exportedSymbols": {
      "RBAC": [
        3751
      ]
    },
    "id": 3752,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 3646,
        "literals": [
          "solidity",
          "^",
          "0.4",
          ".24"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:24:15"
      },
      {
        "absolutePath": "zeppelin-solidity/contracts/access/rbac/Roles.sol",
        "file": "./Roles.sol",
        "id": 3647,
        "nodeType": "ImportDirective",
        "scope": 3752,
        "sourceUnit": 3822,
        "src": "26:21:15",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": "@title RBAC (Role-Based Access Control)\n@author Matt Condon (@Shrugs)\n@dev Stores and provides setters and getters for roles and addresses.\nSupports unlimited numbers of roles and addresses.\nSee //contracts/mocks/RBACMock.sol for an example of usage.\nThis RBAC method uses strings to key roles. It may be beneficial\nfor you to write your own implementation of this interface using Enums or similar.",
        "fullyImplemented": true,
        "id": 3751,
        "linearizedBaseContracts": [
          3751
        ],
        "name": "RBAC",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 3650,
            "libraryName": {
              "contractScope": null,
              "id": 3648,
              "name": "Roles",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 3821,
              "src": "502:5:15",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Roles_$3821",
                "typeString": "library Roles"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "496:27:15",
            "typeName": {
              "contractScope": null,
              "id": 3649,
              "name": "Roles.Role",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 3758,
              "src": "512:10:15",
              "typeDescriptions": {
                "typeIdentifier": "t_struct$_Role_$3758_storage_ptr",
                "typeString": "struct Roles.Role"
              }
            }
          },
          {
            "constant": false,
            "id": 3654,
            "name": "roles",
            "nodeType": "VariableDeclaration",
            "scope": 3751,
            "src": "527:44:15",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_Role_$3758_storage_$",
              "typeString": "mapping(string => struct Roles.Role)"
            },
            "typeName": {
              "id": 3653,
              "keyType": {
                "id": 3651,
                "name": "string",
                "nodeType": "ElementaryTypeName",
                "src": "536:6:15",
                "typeDescriptions": {
                  "typeIdentifier": "t_string_storage_ptr",
                  "typeString": "string"
                }
              },
              "nodeType": "Mapping",
              "src": "527:30:15",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_Role_$3758_storage_$",
                "typeString": "mapping(string => struct Roles.Role)"
              },
              "valueType": {
                "contractScope": null,
                "id": 3652,
                "name": "Roles.Role",
                "nodeType": "UserDefinedTypeName",
                "referencedDeclaration": 3758,
                "src": "546:10:15",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_Role_$3758_storage_ptr",
                  "typeString": "struct Roles.Role"
                }
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 3660,
            "name": "RoleAdded",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 3659,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3656,
                  "indexed": true,
                  "name": "operator",
                  "nodeType": "VariableDeclaration",
                  "scope": 3660,
                  "src": "592:24:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3655,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "592:7:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3658,
                  "indexed": false,
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "scope": 3660,
                  "src": "618:11:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 3657,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "618:6:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "591:39:15"
            },
            "src": "576:55:15"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 3666,
            "name": "RoleRemoved",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 3665,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3662,
                  "indexed": true,
                  "name": "operator",
                  "nodeType": "VariableDeclaration",
                  "scope": 3666,
                  "src": "652:24:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3661,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "652:7:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3664,
                  "indexed": false,
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "scope": 3666,
                  "src": "678:11:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 3663,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "678:6:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "651:39:15"
            },
            "src": "634:57:15"
          },
          {
            "body": {
              "id": 3680,
              "nodeType": "Block",
              "src": "911:40:15",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3677,
                        "name": "_operator",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3668,
                        "src": "936:9:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 3673,
                          "name": "roles",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3654,
                          "src": "917:5:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_Role_$3758_storage_$",
                            "typeString": "mapping(string memory => struct Roles.Role storage ref)"
                          }
                        },
                        "id": 3675,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3674,
                          "name": "_role",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3670,
                          "src": "923:5:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "917:12:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$3758_storage",
                          "typeString": "struct Roles.Role storage ref"
                        }
                      },
                      "id": 3676,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "check",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3805,
                      "src": "917:18:15",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_Role_$3758_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Role_$3758_storage_ptr_$",
                        "typeString": "function (struct Roles.Role storage pointer,address) view"
                      }
                    },
                    "id": 3678,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "917:29:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3679,
                  "nodeType": "ExpressionStatement",
                  "src": "917:29:15"
                }
              ]
            },
            "documentation": "@dev reverts if addr does not have role\n@param _operator address\n@param _role the name of the role\n// reverts",
            "id": 3681,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "checkRole",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3671,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3668,
                  "name": "_operator",
                  "nodeType": "VariableDeclaration",
                  "scope": 3681,
                  "src": "856:17:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3667,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "856:7:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3670,
                  "name": "_role",
                  "nodeType": "VariableDeclaration",
                  "scope": 3681,
                  "src": "875:12:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 3669,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "875:6:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "855:33:15"
            },
            "payable": false,
            "returnParameters": {
              "id": 3672,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "911:0:15"
            },
            "scope": 3751,
            "src": "837:114:15",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3697,
              "nodeType": "Block",
              "src": "1182:45:15",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3694,
                        "name": "_operator",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3683,
                        "src": "1212:9:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 3690,
                          "name": "roles",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3654,
                          "src": "1195:5:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_Role_$3758_storage_$",
                            "typeString": "mapping(string memory => struct Roles.Role storage ref)"
                          }
                        },
                        "id": 3692,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3691,
                          "name": "_role",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3685,
                          "src": "1201:5:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "1195:12:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$3758_storage",
                          "typeString": "struct Roles.Role storage ref"
                        }
                      },
                      "id": 3693,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "has",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3820,
                      "src": "1195:16:15",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_Role_$3758_storage_ptr_$_t_address_$returns$_t_bool_$bound_to$_t_struct$_Role_$3758_storage_ptr_$",
                        "typeString": "function (struct Roles.Role storage pointer,address) view returns (bool)"
                      }
                    },
                    "id": 3695,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1195:27:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 3689,
                  "id": 3696,
                  "nodeType": "Return",
                  "src": "1188:34:15"
                }
              ]
            },
            "documentation": "@dev determine if addr has role\n@param _operator address\n@param _role the name of the role\n@return bool",
            "id": 3698,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "hasRole",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3686,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3683,
                  "name": "_operator",
                  "nodeType": "VariableDeclaration",
                  "scope": 3698,
                  "src": "1108:17:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3682,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1108:7:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3685,
                  "name": "_role",
                  "nodeType": "VariableDeclaration",
                  "scope": 3698,
                  "src": "1127:12:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 3684,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1127:6:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1107:33:15"
            },
            "payable": false,
            "returnParameters": {
              "id": 3689,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3688,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3698,
                  "src": "1174:4:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 3687,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1174:4:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1173:6:15"
            },
            "scope": 3751,
            "src": "1091:136:15",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3717,
              "nodeType": "Block",
              "src": "1412:76:15",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3709,
                        "name": "_operator",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3700,
                        "src": "1435:9:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 3705,
                          "name": "roles",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3654,
                          "src": "1418:5:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_Role_$3758_storage_$",
                            "typeString": "mapping(string memory => struct Roles.Role storage ref)"
                          }
                        },
                        "id": 3707,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3706,
                          "name": "_role",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3702,
                          "src": "1424:5:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "1418:12:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$3758_storage",
                          "typeString": "struct Roles.Role storage ref"
                        }
                      },
                      "id": 3708,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "add",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3774,
                      "src": "1418:16:15",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Role_$3758_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Role_$3758_storage_ptr_$",
                        "typeString": "function (struct Roles.Role storage pointer,address)"
                      }
                    },
                    "id": 3710,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1418:27:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3711,
                  "nodeType": "ExpressionStatement",
                  "src": "1418:27:15"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3713,
                        "name": "_operator",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3700,
                        "src": "1466:9:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3714,
                        "name": "_role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3702,
                        "src": "1477:5:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 3712,
                      "name": "RoleAdded",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3660,
                      "src": "1456:9:15",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (address,string memory)"
                      }
                    },
                    "id": 3715,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1456:27:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3716,
                  "nodeType": "EmitStatement",
                  "src": "1451:32:15"
                }
              ]
            },
            "documentation": "@dev add a role to an address\n@param _operator address\n@param _role the name of the role",
            "id": 3718,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "addRole",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3703,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3700,
                  "name": "_operator",
                  "nodeType": "VariableDeclaration",
                  "scope": 3718,
                  "src": "1364:17:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3699,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1364:7:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3702,
                  "name": "_role",
                  "nodeType": "VariableDeclaration",
                  "scope": 3718,
                  "src": "1383:12:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 3701,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1383:6:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1363:33:15"
            },
            "payable": false,
            "returnParameters": {
              "id": 3704,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1412:0:15"
            },
            "scope": 3751,
            "src": "1347:141:15",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 3737,
              "nodeType": "Block",
              "src": "1681:81:15",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3729,
                        "name": "_operator",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3720,
                        "src": "1707:9:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 3725,
                          "name": "roles",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3654,
                          "src": "1687:5:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_Role_$3758_storage_$",
                            "typeString": "mapping(string memory => struct Roles.Role storage ref)"
                          }
                        },
                        "id": 3727,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3726,
                          "name": "_role",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3722,
                          "src": "1693:5:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "1687:12:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$3758_storage",
                          "typeString": "struct Roles.Role storage ref"
                        }
                      },
                      "id": 3728,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "remove",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3790,
                      "src": "1687:19:15",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Role_$3758_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Role_$3758_storage_ptr_$",
                        "typeString": "function (struct Roles.Role storage pointer,address)"
                      }
                    },
                    "id": 3730,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1687:30:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3731,
                  "nodeType": "ExpressionStatement",
                  "src": "1687:30:15"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3733,
                        "name": "_operator",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3720,
                        "src": "1740:9:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3734,
                        "name": "_role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3722,
                        "src": "1751:5:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 3732,
                      "name": "RoleRemoved",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3666,
                      "src": "1728:11:15",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (address,string memory)"
                      }
                    },
                    "id": 3735,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1728:29:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3736,
                  "nodeType": "EmitStatement",
                  "src": "1723:34:15"
                }
              ]
            },
            "documentation": "@dev remove a role from an address\n@param _operator address\n@param _role the name of the role",
            "id": 3738,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "removeRole",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3723,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3720,
                  "name": "_operator",
                  "nodeType": "VariableDeclaration",
                  "scope": 3738,
                  "src": "1633:17:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3719,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1633:7:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3722,
                  "name": "_role",
                  "nodeType": "VariableDeclaration",
                  "scope": 3738,
                  "src": "1652:12:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 3721,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1652:6:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1632:33:15"
            },
            "payable": false,
            "returnParameters": {
              "id": 3724,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1681:0:15"
            },
            "scope": 3751,
            "src": "1613:149:15",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 3749,
              "nodeType": "Block",
              "src": "1945:46:15",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 3743,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4916,
                          "src": "1961:3:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 3744,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "1961:10:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3745,
                        "name": "_role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3740,
                        "src": "1973:5:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 3742,
                      "name": "checkRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3681,
                      "src": "1951:9:15",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (address,string memory) view"
                      }
                    },
                    "id": 3746,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1951:28:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3747,
                  "nodeType": "ExpressionStatement",
                  "src": "1951:28:15"
                },
                {
                  "id": 3748,
                  "nodeType": "PlaceholderStatement",
                  "src": "1985:1:15"
                }
              ]
            },
            "documentation": "@dev modifier to scope access to a single role (uses msg.sender as addr)\n@param _role the name of the role\n// reverts",
            "id": 3750,
            "name": "onlyRole",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 3741,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3740,
                  "name": "_role",
                  "nodeType": "VariableDeclaration",
                  "scope": 3750,
                  "src": "1929:12:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 3739,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1929:6:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1928:14:15"
            },
            "src": "1911:80:15",
            "visibility": "internal"
          }
        ],
        "scope": 3752,
        "src": "478:2158:15"
      }
    ],
    "src": "0:2637:15"
  },
  "legacyAST": {
    "absolutePath": "zeppelin-solidity/contracts/access/rbac/RBAC.sol",
    "exportedSymbols": {
      "RBAC": [
        3751
      ]
    },
    "id": 3752,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 3646,
        "literals": [
          "solidity",
          "^",
          "0.4",
          ".24"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:24:15"
      },
      {
        "absolutePath": "zeppelin-solidity/contracts/access/rbac/Roles.sol",
        "file": "./Roles.sol",
        "id": 3647,
        "nodeType": "ImportDirective",
        "scope": 3752,
        "sourceUnit": 3822,
        "src": "26:21:15",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": "@title RBAC (Role-Based Access Control)\n@author Matt Condon (@Shrugs)\n@dev Stores and provides setters and getters for roles and addresses.\nSupports unlimited numbers of roles and addresses.\nSee //contracts/mocks/RBACMock.sol for an example of usage.\nThis RBAC method uses strings to key roles. It may be beneficial\nfor you to write your own implementation of this interface using Enums or similar.",
        "fullyImplemented": true,
        "id": 3751,
        "linearizedBaseContracts": [
          3751
        ],
        "name": "RBAC",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 3650,
            "libraryName": {
              "contractScope": null,
              "id": 3648,
              "name": "Roles",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 3821,
              "src": "502:5:15",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Roles_$3821",
                "typeString": "library Roles"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "496:27:15",
            "typeName": {
              "contractScope": null,
              "id": 3649,
              "name": "Roles.Role",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 3758,
              "src": "512:10:15",
              "typeDescriptions": {
                "typeIdentifier": "t_struct$_Role_$3758_storage_ptr",
                "typeString": "struct Roles.Role"
              }
            }
          },
          {
            "constant": false,
            "id": 3654,
            "name": "roles",
            "nodeType": "VariableDeclaration",
            "scope": 3751,
            "src": "527:44:15",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_Role_$3758_storage_$",
              "typeString": "mapping(string => struct Roles.Role)"
            },
            "typeName": {
              "id": 3653,
              "keyType": {
                "id": 3651,
                "name": "string",
                "nodeType": "ElementaryTypeName",
                "src": "536:6:15",
                "typeDescriptions": {
                  "typeIdentifier": "t_string_storage_ptr",
                  "typeString": "string"
                }
              },
              "nodeType": "Mapping",
              "src": "527:30:15",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_Role_$3758_storage_$",
                "typeString": "mapping(string => struct Roles.Role)"
              },
              "valueType": {
                "contractScope": null,
                "id": 3652,
                "name": "Roles.Role",
                "nodeType": "UserDefinedTypeName",
                "referencedDeclaration": 3758,
                "src": "546:10:15",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_Role_$3758_storage_ptr",
                  "typeString": "struct Roles.Role"
                }
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 3660,
            "name": "RoleAdded",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 3659,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3656,
                  "indexed": true,
                  "name": "operator",
                  "nodeType": "VariableDeclaration",
                  "scope": 3660,
                  "src": "592:24:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3655,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "592:7:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3658,
                  "indexed": false,
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "scope": 3660,
                  "src": "618:11:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 3657,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "618:6:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "591:39:15"
            },
            "src": "576:55:15"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 3666,
            "name": "RoleRemoved",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 3665,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3662,
                  "indexed": true,
                  "name": "operator",
                  "nodeType": "VariableDeclaration",
                  "scope": 3666,
                  "src": "652:24:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3661,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "652:7:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3664,
                  "indexed": false,
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "scope": 3666,
                  "src": "678:11:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 3663,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "678:6:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "651:39:15"
            },
            "src": "634:57:15"
          },
          {
            "body": {
              "id": 3680,
              "nodeType": "Block",
              "src": "911:40:15",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3677,
                        "name": "_operator",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3668,
                        "src": "936:9:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 3673,
                          "name": "roles",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3654,
                          "src": "917:5:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_Role_$3758_storage_$",
                            "typeString": "mapping(string memory => struct Roles.Role storage ref)"
                          }
                        },
                        "id": 3675,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3674,
                          "name": "_role",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3670,
                          "src": "923:5:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "917:12:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$3758_storage",
                          "typeString": "struct Roles.Role storage ref"
                        }
                      },
                      "id": 3676,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "check",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3805,
                      "src": "917:18:15",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_Role_$3758_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Role_$3758_storage_ptr_$",
                        "typeString": "function (struct Roles.Role storage pointer,address) view"
                      }
                    },
                    "id": 3678,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "917:29:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3679,
                  "nodeType": "ExpressionStatement",
                  "src": "917:29:15"
                }
              ]
            },
            "documentation": "@dev reverts if addr does not have role\n@param _operator address\n@param _role the name of the role\n// reverts",
            "id": 3681,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "checkRole",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3671,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3668,
                  "name": "_operator",
                  "nodeType": "VariableDeclaration",
                  "scope": 3681,
                  "src": "856:17:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3667,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "856:7:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3670,
                  "name": "_role",
                  "nodeType": "VariableDeclaration",
                  "scope": 3681,
                  "src": "875:12:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 3669,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "875:6:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "855:33:15"
            },
            "payable": false,
            "returnParameters": {
              "id": 3672,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "911:0:15"
            },
            "scope": 3751,
            "src": "837:114:15",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3697,
              "nodeType": "Block",
              "src": "1182:45:15",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3694,
                        "name": "_operator",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3683,
                        "src": "1212:9:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 3690,
                          "name": "roles",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3654,
                          "src": "1195:5:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_Role_$3758_storage_$",
                            "typeString": "mapping(string memory => struct Roles.Role storage ref)"
                          }
                        },
                        "id": 3692,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3691,
                          "name": "_role",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3685,
                          "src": "1201:5:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "1195:12:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$3758_storage",
                          "typeString": "struct Roles.Role storage ref"
                        }
                      },
                      "id": 3693,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "has",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3820,
                      "src": "1195:16:15",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_Role_$3758_storage_ptr_$_t_address_$returns$_t_bool_$bound_to$_t_struct$_Role_$3758_storage_ptr_$",
                        "typeString": "function (struct Roles.Role storage pointer,address) view returns (bool)"
                      }
                    },
                    "id": 3695,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1195:27:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 3689,
                  "id": 3696,
                  "nodeType": "Return",
                  "src": "1188:34:15"
                }
              ]
            },
            "documentation": "@dev determine if addr has role\n@param _operator address\n@param _role the name of the role\n@return bool",
            "id": 3698,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "hasRole",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3686,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3683,
                  "name": "_operator",
                  "nodeType": "VariableDeclaration",
                  "scope": 3698,
                  "src": "1108:17:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3682,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1108:7:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3685,
                  "name": "_role",
                  "nodeType": "VariableDeclaration",
                  "scope": 3698,
                  "src": "1127:12:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 3684,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1127:6:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1107:33:15"
            },
            "payable": false,
            "returnParameters": {
              "id": 3689,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3688,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3698,
                  "src": "1174:4:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 3687,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1174:4:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1173:6:15"
            },
            "scope": 3751,
            "src": "1091:136:15",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3717,
              "nodeType": "Block",
              "src": "1412:76:15",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3709,
                        "name": "_operator",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3700,
                        "src": "1435:9:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 3705,
                          "name": "roles",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3654,
                          "src": "1418:5:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_Role_$3758_storage_$",
                            "typeString": "mapping(string memory => struct Roles.Role storage ref)"
                          }
                        },
                        "id": 3707,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3706,
                          "name": "_role",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3702,
                          "src": "1424:5:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "1418:12:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$3758_storage",
                          "typeString": "struct Roles.Role storage ref"
                        }
                      },
                      "id": 3708,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "add",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3774,
                      "src": "1418:16:15",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Role_$3758_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Role_$3758_storage_ptr_$",
                        "typeString": "function (struct Roles.Role storage pointer,address)"
                      }
                    },
                    "id": 3710,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1418:27:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3711,
                  "nodeType": "ExpressionStatement",
                  "src": "1418:27:15"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3713,
                        "name": "_operator",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3700,
                        "src": "1466:9:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3714,
                        "name": "_role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3702,
                        "src": "1477:5:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 3712,
                      "name": "RoleAdded",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3660,
                      "src": "1456:9:15",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (address,string memory)"
                      }
                    },
                    "id": 3715,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1456:27:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3716,
                  "nodeType": "EmitStatement",
                  "src": "1451:32:15"
                }
              ]
            },
            "documentation": "@dev add a role to an address\n@param _operator address\n@param _role the name of the role",
            "id": 3718,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "addRole",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3703,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3700,
                  "name": "_operator",
                  "nodeType": "VariableDeclaration",
                  "scope": 3718,
                  "src": "1364:17:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3699,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1364:7:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3702,
                  "name": "_role",
                  "nodeType": "VariableDeclaration",
                  "scope": 3718,
                  "src": "1383:12:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 3701,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1383:6:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1363:33:15"
            },
            "payable": false,
            "returnParameters": {
              "id": 3704,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1412:0:15"
            },
            "scope": 3751,
            "src": "1347:141:15",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 3737,
              "nodeType": "Block",
              "src": "1681:81:15",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3729,
                        "name": "_operator",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3720,
                        "src": "1707:9:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 3725,
                          "name": "roles",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3654,
                          "src": "1687:5:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_Role_$3758_storage_$",
                            "typeString": "mapping(string memory => struct Roles.Role storage ref)"
                          }
                        },
                        "id": 3727,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 3726,
                          "name": "_role",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3722,
                          "src": "1693:5:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "1687:12:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Role_$3758_storage",
                          "typeString": "struct Roles.Role storage ref"
                        }
                      },
                      "id": 3728,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "remove",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3790,
                      "src": "1687:19:15",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Role_$3758_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Role_$3758_storage_ptr_$",
                        "typeString": "function (struct Roles.Role storage pointer,address)"
                      }
                    },
                    "id": 3730,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1687:30:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3731,
                  "nodeType": "ExpressionStatement",
                  "src": "1687:30:15"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 3733,
                        "name": "_operator",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3720,
                        "src": "1740:9:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3734,
                        "name": "_role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3722,
                        "src": "1751:5:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 3732,
                      "name": "RoleRemoved",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3666,
                      "src": "1728:11:15",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (address,string memory)"
                      }
                    },
                    "id": 3735,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1728:29:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3736,
                  "nodeType": "EmitStatement",
                  "src": "1723:34:15"
                }
              ]
            },
            "documentation": "@dev remove a role from an address\n@param _operator address\n@param _role the name of the role",
            "id": 3738,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "removeRole",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3723,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3720,
                  "name": "_operator",
                  "nodeType": "VariableDeclaration",
                  "scope": 3738,
                  "src": "1633:17:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3719,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1633:7:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3722,
                  "name": "_role",
                  "nodeType": "VariableDeclaration",
                  "scope": 3738,
                  "src": "1652:12:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 3721,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1652:6:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1632:33:15"
            },
            "payable": false,
            "returnParameters": {
              "id": 3724,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1681:0:15"
            },
            "scope": 3751,
            "src": "1613:149:15",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 3749,
              "nodeType": "Block",
              "src": "1945:46:15",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 3743,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4916,
                          "src": "1961:3:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 3744,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "1961:10:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 3745,
                        "name": "_role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3740,
                        "src": "1973:5:15",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 3742,
                      "name": "checkRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 3681,
                      "src": "1951:9:15",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (address,string memory) view"
                      }
                    },
                    "id": 3746,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1951:28:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 3747,
                  "nodeType": "ExpressionStatement",
                  "src": "1951:28:15"
                },
                {
                  "id": 3748,
                  "nodeType": "PlaceholderStatement",
                  "src": "1985:1:15"
                }
              ]
            },
            "documentation": "@dev modifier to scope access to a single role (uses msg.sender as addr)\n@param _role the name of the role\n// reverts",
            "id": 3750,
            "name": "onlyRole",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 3741,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3740,
                  "name": "_role",
                  "nodeType": "VariableDeclaration",
                  "scope": 3750,
                  "src": "1929:12:15",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 3739,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1929:6:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1928:14:15"
            },
            "src": "1911:80:15",
            "visibility": "internal"
          }
        ],
        "scope": 3752,
        "src": "478:2158:15"
      }
    ],
    "src": "0:2637:15"
  },
  "compiler": {
    "name": "solc",
    "version": "0.4.24+commit.e67f0147.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "2.0.1",
  "updatedAt": "2018-10-16T05:56:33.176Z"
}