{
  "contractName": "AccessControl",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleGranted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleRevoked",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DEFAULT_ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "hasRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "getRoleMemberCount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "index",
          "type": "uint256"
        }
      ],
      "name": "getRoleMember",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "getRoleMemberIndex",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "getRoleAdmin",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "grantRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "revokeRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "renounceRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getRoleMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMemberCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getRoleMemberIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Contract module that allows children to implement role-based access control mechanisms. Roles are referred to by their `bytes32` identifier. These should be exposed in the external API and be unique. The best way to achieve this is by using `public constant` hash digests: ``` bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\"); ``` Roles can be used to represent a set of permissions. To restrict access to a function call, use {hasRole}: ``` function foo() public {     require(hasRole(MY_ROLE, msg.sender));     ... } ``` Roles can be granted and revoked dynamically via the {grantRole} and {revokeRole} functions. Each role has an associated admin role, and only accounts that have a role's admin role can call {grantRole} and {revokeRole}. By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means that only accounts with this role will be able to grant or revoke other roles. More complex role relationships can be created by using {_setRoleAdmin}. WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to grant and revoke this role. Extra precautions should be taken to secure accounts that have been granted it.\",\"events\":{\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getRoleMember(bytes32,uint256)\":{\"details\":\"Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information.\"},\"getRoleMemberCount(bytes32)\":{\"details\":\"Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role.\"},\"getRoleMemberIndex(bytes32,address)\":{\"details\":\"Returns the index of the account that have `role`.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"project:/contracts/utils/AccessControl.sol\":\"AccessControl\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/GSN/Context.sol\":{\"keccak256\":\"0x9486045e189facd2e868ece35249872598ef03f1087fb6fa4d1161842daa2287\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77c3a04ef8453788b14b1ebbc24dd3f0a18ceb2615cd156aac949a611e552af8\",\"dweb:/ipfs/QmcmqWGguRM3iLuF57tcyrN3F6EA63kzeNkDfQuteBnurr\"]},\"@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0x28911e614500ae7c607a432a709d35da25f3bc5ddc8bd12b278b66358070c0ea\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://256c8c8af5eb072bc473226ab2b2187149b8fc04f5f4a4820db22527f5ce8e3c\",\"dweb:/ipfs/QmRvi5BhnL7Rxf85KrJhwM6RRhukm4tzoctRdgQEheNyiN\"]},\"@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ded47ec7c96750f9bd04bbbc84f659992d4ba901cb7b532a52cd468272cf378f\",\"dweb:/ipfs/QmfBrGtQP7rZEqEg6Wz6jh2N2Kukpj1z5v3CGWmAqrzm96\"]},\"@openzeppelin/contracts/utils/EnumerableSet.sol\":{\"keccak256\":\"0x1562cd9922fbf739edfb979f506809e2743789cbde3177515542161c3d04b164\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4580d57781513d98870d9738c7d39094336e0a70cdb90d68dad549c6ced466ec\",\"dweb:/ipfs/Qmf9YZzzRFuvMnav9dgmeRUpdYMMECiZX8w25sHWVbA18V\"]},\"project:/contracts/utils/AccessControl.sol\":{\"keccak256\":\"0x0188570bd646df63dd236b997edf12d2e5a566d9fd54b9405c67c6d7eeca353e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://eaa8a02b8fda3d9a50019cb96fec11cfb80b90250e37e91e0ec6cd945efa9810\",\"dweb:/ipfs/QmZ2nuod9fjYvsCjRr4Bhk6FTES4zsofxsQSDFS24JFaGq\"]}},\"version\":1}",
  "bytecode": "0x",
  "deployedBytecode": "0x",
  "immutableReferences": {},
  "sourceMap": "",
  "deployedSourceMap": "",
  "source": "// SPDX-License-Identifier: MIT\n\npragma solidity 0.6.12;\n\n// This is adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.0.0/contracts/access/AccessControl.sol\n// The only difference is added getRoleMemberIndex(bytes32 role, address account) function.\n\nimport \"@openzeppelin/contracts/utils/EnumerableSet.sol\";\nimport \"@openzeppelin/contracts/utils/Address.sol\";\nimport \"@openzeppelin/contracts/GSN/Context.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```\n * function foo() public {\n *     require(hasRole(MY_ROLE, msg.sender));\n *     ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it.\n */\nabstract contract AccessControl is Context {\n    using EnumerableSet for EnumerableSet.AddressSet;\n    using Address for address;\n\n    struct RoleData {\n        EnumerableSet.AddressSet members;\n        bytes32 adminRole;\n    }\n\n    mapping (bytes32 => RoleData) private _roles;\n\n    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n    /**\n     * @dev Emitted when `account` is granted `role`.\n     *\n     * `sender` is the account that originated the contract call, an admin role\n     * bearer except when using {_setupRole}.\n     */\n    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Emitted when `account` is revoked `role`.\n     *\n     * `sender` is the account that originated the contract call:\n     *   - if using `revokeRole`, it is the admin role bearer\n     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)\n     */\n    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) public view returns (bool) {\n        return _roles[role].members.contains(account);\n    }\n\n    /**\n     * @dev Returns the number of accounts that have `role`. Can be used\n     * together with {getRoleMember} to enumerate all bearers of a role.\n     */\n    function getRoleMemberCount(bytes32 role) public view returns (uint256) {\n        return _roles[role].members.length();\n    }\n\n    /**\n     * @dev Returns one of the accounts that have `role`. `index` must be a\n     * value between 0 and {getRoleMemberCount}, non-inclusive.\n     *\n     * Role bearers are not sorted in any particular way, and their ordering may\n     * change at any point.\n     *\n     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\n     * you perform all queries on the same block. See the following\n     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\n     * for more information.\n     */\n    function getRoleMember(bytes32 role, uint256 index) public view returns (address) {\n        return _roles[role].members.at(index);\n    }\n\n    /**\n     * @dev Returns the index of the account that have `role`.\n     */\n    function getRoleMemberIndex(bytes32 role, address account) public view returns (uint256) {\n        return _roles[role].members._inner._indexes[bytes32(uint256(account))];\n    }\n\n    /**\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\n     * {revokeRole}.\n     *\n     * To change a role's admin, use {_setRoleAdmin}.\n     */\n    function getRoleAdmin(bytes32 role) public view returns (bytes32) {\n        return _roles[role].adminRole;\n    }\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function grantRole(bytes32 role, address account) public virtual {\n        require(hasRole(_roles[role].adminRole, _msgSender()), \"AccessControl: sender must be an admin to grant\");\n\n        _grantRole(role, account);\n    }\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function revokeRole(bytes32 role, address account) public virtual {\n        require(hasRole(_roles[role].adminRole, _msgSender()), \"AccessControl: sender must be an admin to revoke\");\n\n        _revokeRole(role, account);\n    }\n\n    /**\n     * @dev Revokes `role` from the calling account.\n     *\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\n     * purpose is to provide a mechanism for accounts to lose their privileges\n     * if they are compromised (such as when a trusted device is misplaced).\n     *\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must be `account`.\n     */\n    function renounceRole(bytes32 role, address account) public virtual {\n        require(account == _msgSender(), \"AccessControl: can only renounce roles for self\");\n\n        _revokeRole(role, account);\n    }\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event. Note that unlike {grantRole}, this function doesn't perform any\n     * checks on the calling account.\n     *\n     * [WARNING]\n     * ====\n     * This function should only be called from the constructor when setting\n     * up the initial roles for the system.\n     *\n     * Using this function in any other way is effectively circumventing the admin\n     * system imposed by {AccessControl}.\n     * ====\n     */\n    function _setupRole(bytes32 role, address account) internal virtual {\n        _grantRole(role, account);\n    }\n\n    /**\n     * @dev Sets `adminRole` as ``role``'s admin role.\n     */\n    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n        _roles[role].adminRole = adminRole;\n    }\n\n    function _grantRole(bytes32 role, address account) private {\n        if (_roles[role].members.add(account)) {\n            emit RoleGranted(role, account, _msgSender());\n        }\n    }\n\n    function _revokeRole(bytes32 role, address account) private {\n        if (_roles[role].members.remove(account)) {\n            emit RoleRevoked(role, account, _msgSender());\n        }\n    }\n}\n",
  "sourcePath": "/home/sigo/w/deer/ethsub/packages/sol/contracts/utils/AccessControl.sol",
  "ast": {
    "absolutePath": "project:/contracts/utils/AccessControl.sol",
    "exportedSymbols": {
      "AccessControl": [
        10149
      ]
    },
    "id": 10150,
    "license": "MIT",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 9860,
        "literals": [
          "solidity",
          "0.6",
          ".12"
        ],
        "nodeType": "PragmaDirective",
        "src": "33:23:53"
      },
      {
        "absolutePath": "@openzeppelin/contracts/utils/EnumerableSet.sol",
        "file": "@openzeppelin/contracts/utils/EnumerableSet.sol",
        "id": 9861,
        "nodeType": "ImportDirective",
        "scope": 10150,
        "sourceUnit": 5944,
        "src": "277:57:53",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/utils/Address.sol",
        "file": "@openzeppelin/contracts/utils/Address.sol",
        "id": 9862,
        "nodeType": "ImportDirective",
        "scope": 10150,
        "sourceUnit": 4819,
        "src": "335:51:53",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/GSN/Context.sol",
        "file": "@openzeppelin/contracts/GSN/Context.sol",
        "id": 9863,
        "nodeType": "ImportDirective",
        "scope": 10150,
        "sourceUnit": 3,
        "src": "387:49:53",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": true,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 9865,
              "name": "Context",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 4841,
              "src": "1750:7:53",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Context_$4841",
                "typeString": "contract Context"
              }
            },
            "id": 9866,
            "nodeType": "InheritanceSpecifier",
            "src": "1750:7:53"
          }
        ],
        "contractDependencies": [
          4841
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 9864,
          "nodeType": "StructuredDocumentation",
          "src": "438:1276:53",
          "text": " @dev Contract module that allows children to implement role-based access\n control mechanisms.\n Roles are referred to by their `bytes32` identifier. These should be exposed\n in the external API and be unique. The best way to achieve this is by\n using `public constant` hash digests:\n ```\n bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n ```\n Roles can be used to represent a set of permissions. To restrict access to a\n function call, use {hasRole}:\n ```\n function foo() public {\n     require(hasRole(MY_ROLE, msg.sender));\n     ...\n }\n ```\n Roles can be granted and revoked dynamically via the {grantRole} and\n {revokeRole} functions. Each role has an associated admin role, and only\n accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n that only accounts with this role will be able to grant or revoke other\n roles. More complex role relationships can be created by using\n {_setRoleAdmin}.\n WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n grant and revoke this role. Extra precautions should be taken to secure\n accounts that have been granted it."
        },
        "fullyImplemented": true,
        "id": 10149,
        "linearizedBaseContracts": [
          10149,
          4841
        ],
        "name": "AccessControl",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 9869,
            "libraryName": {
              "contractScope": null,
              "id": 9867,
              "name": "EnumerableSet",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 5943,
              "src": "1770:13:53",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_EnumerableSet_$5943",
                "typeString": "library EnumerableSet"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "1764:49:53",
            "typeName": {
              "contractScope": null,
              "id": 9868,
              "name": "EnumerableSet.AddressSet",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 5727,
              "src": "1788:24:53",
              "typeDescriptions": {
                "typeIdentifier": "t_struct$_AddressSet_$5727_storage_ptr",
                "typeString": "struct EnumerableSet.AddressSet"
              }
            }
          },
          {
            "id": 9872,
            "libraryName": {
              "contractScope": null,
              "id": 9870,
              "name": "Address",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 4818,
              "src": "1824:7:53",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Address_$4818",
                "typeString": "library Address"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "1818:26:53",
            "typeName": {
              "id": 9871,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "1836:7:53",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            }
          },
          {
            "canonicalName": "AccessControl.RoleData",
            "id": 9877,
            "members": [
              {
                "constant": false,
                "id": 9874,
                "mutability": "mutable",
                "name": "members",
                "nodeType": "VariableDeclaration",
                "overrides": null,
                "scope": 9877,
                "src": "1876:32:53",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_AddressSet_$5727_storage_ptr",
                  "typeString": "struct EnumerableSet.AddressSet"
                },
                "typeName": {
                  "contractScope": null,
                  "id": 9873,
                  "name": "EnumerableSet.AddressSet",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 5727,
                  "src": "1876:24:53",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_AddressSet_$5727_storage_ptr",
                    "typeString": "struct EnumerableSet.AddressSet"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 9876,
                "mutability": "mutable",
                "name": "adminRole",
                "nodeType": "VariableDeclaration",
                "overrides": null,
                "scope": 9877,
                "src": "1918:17:53",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_bytes32",
                  "typeString": "bytes32"
                },
                "typeName": {
                  "id": 9875,
                  "name": "bytes32",
                  "nodeType": "ElementaryTypeName",
                  "src": "1918:7:53",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  }
                },
                "value": null,
                "visibility": "internal"
              }
            ],
            "name": "RoleData",
            "nodeType": "StructDefinition",
            "scope": 10149,
            "src": "1850:92:53",
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 9881,
            "mutability": "mutable",
            "name": "_roles",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 10149,
            "src": "1948:44:53",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$9877_storage_$",
              "typeString": "mapping(bytes32 => struct AccessControl.RoleData)"
            },
            "typeName": {
              "id": 9880,
              "keyType": {
                "id": 9878,
                "name": "bytes32",
                "nodeType": "ElementaryTypeName",
                "src": "1957:7:53",
                "typeDescriptions": {
                  "typeIdentifier": "t_bytes32",
                  "typeString": "bytes32"
                }
              },
              "nodeType": "Mapping",
              "src": "1948:29:53",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$9877_storage_$",
                "typeString": "mapping(bytes32 => struct AccessControl.RoleData)"
              },
              "valueType": {
                "contractScope": null,
                "id": 9879,
                "name": "RoleData",
                "nodeType": "UserDefinedTypeName",
                "referencedDeclaration": 9877,
                "src": "1968:8:53",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_RoleData_$9877_storage_ptr",
                  "typeString": "struct AccessControl.RoleData"
                }
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": true,
            "functionSelector": "a217fddf",
            "id": 9884,
            "mutability": "constant",
            "name": "DEFAULT_ADMIN_ROLE",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 10149,
            "src": "1999:49:53",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bytes32",
              "typeString": "bytes32"
            },
            "typeName": {
              "id": 9882,
              "name": "bytes32",
              "nodeType": "ElementaryTypeName",
              "src": "1999:7:53",
              "typeDescriptions": {
                "typeIdentifier": "t_bytes32",
                "typeString": "bytes32"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "30783030",
              "id": 9883,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "2044:4:53",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_0_by_1",
                "typeString": "int_const 0"
              },
              "value": "0x00"
            },
            "visibility": "public"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 9885,
              "nodeType": "StructuredDocumentation",
              "src": "2055:198:53",
              "text": " @dev Emitted when `account` is granted `role`.\n `sender` is the account that originated the contract call, an admin role\n bearer except when using {_setupRole}."
            },
            "id": 9893,
            "name": "RoleGranted",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 9892,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 9887,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9893,
                  "src": "2276:20:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 9886,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2276:7:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 9889,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9893,
                  "src": "2298:23:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 9888,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2298:7:53",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 9891,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "sender",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9893,
                  "src": "2323:22:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 9890,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2323:7:53",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2275:71:53"
            },
            "src": "2258:89:53"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 9894,
              "nodeType": "StructuredDocumentation",
              "src": "2353:275:53",
              "text": " @dev Emitted when `account` is revoked `role`.\n `sender` is the account that originated the contract call:\n   - if using `revokeRole`, it is the admin role bearer\n   - if using `renounceRole`, it is the role bearer (i.e. `account`)"
            },
            "id": 9902,
            "name": "RoleRevoked",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 9901,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 9896,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9902,
                  "src": "2651:20:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 9895,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2651:7:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 9898,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9902,
                  "src": "2673:23:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 9897,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2673:7:53",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 9900,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "sender",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9902,
                  "src": "2698:22:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 9899,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2698:7:53",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2650:71:53"
            },
            "src": "2633:89:53"
          },
          {
            "body": {
              "id": 9920,
              "nodeType": "Block",
              "src": "2884:62:53",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 9917,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 9907,
                        "src": "2931:7:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 9912,
                            "name": "_roles",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9881,
                            "src": "2901:6:53",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$9877_storage_$",
                              "typeString": "mapping(bytes32 => struct AccessControl.RoleData storage ref)"
                            }
                          },
                          "id": 9914,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 9913,
                            "name": "role",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9905,
                            "src": "2908:4:53",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2901:12:53",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_RoleData_$9877_storage",
                            "typeString": "struct AccessControl.RoleData storage ref"
                          }
                        },
                        "id": 9915,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "members",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 9874,
                        "src": "2901:20:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressSet_$5727_storage",
                          "typeString": "struct EnumerableSet.AddressSet storage ref"
                        }
                      },
                      "id": 9916,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "contains",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 5805,
                      "src": "2901:29:53",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_AddressSet_$5727_storage_ptr_$_t_address_$returns$_t_bool_$bound_to$_t_struct$_AddressSet_$5727_storage_ptr_$",
                        "typeString": "function (struct EnumerableSet.AddressSet storage pointer,address) view returns (bool)"
                      }
                    },
                    "id": 9918,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2901:38:53",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 9911,
                  "id": 9919,
                  "nodeType": "Return",
                  "src": "2894:45:53"
                }
              ]
            },
            "documentation": {
              "id": 9903,
              "nodeType": "StructuredDocumentation",
              "src": "2728:76:53",
              "text": " @dev Returns `true` if `account` has been granted `role`."
            },
            "functionSelector": "91d14854",
            "id": 9921,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "hasRole",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 9908,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 9905,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9921,
                  "src": "2826:12:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 9904,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2826:7:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 9907,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9921,
                  "src": "2840:15:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 9906,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2840:7:53",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2825:31:53"
            },
            "returnParameters": {
              "id": 9911,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 9910,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9921,
                  "src": "2878:4:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 9909,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2878:4:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2877:6:53"
            },
            "scope": 10149,
            "src": "2809:137:53",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 9936,
              "nodeType": "Block",
              "src": "3186:53:53",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 9929,
                            "name": "_roles",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9881,
                            "src": "3203:6:53",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$9877_storage_$",
                              "typeString": "mapping(bytes32 => struct AccessControl.RoleData storage ref)"
                            }
                          },
                          "id": 9931,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 9930,
                            "name": "role",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9924,
                            "src": "3210:4:53",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "3203:12:53",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_RoleData_$9877_storage",
                            "typeString": "struct AccessControl.RoleData storage ref"
                          }
                        },
                        "id": 9932,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "members",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 9874,
                        "src": "3203:20:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressSet_$5727_storage",
                          "typeString": "struct EnumerableSet.AddressSet storage ref"
                        }
                      },
                      "id": 9933,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 5819,
                      "src": "3203:27:53",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_AddressSet_$5727_storage_ptr_$returns$_t_uint256_$bound_to$_t_struct$_AddressSet_$5727_storage_ptr_$",
                        "typeString": "function (struct EnumerableSet.AddressSet storage pointer) view returns (uint256)"
                      }
                    },
                    "id": 9934,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3203:29:53",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 9928,
                  "id": 9935,
                  "nodeType": "Return",
                  "src": "3196:36:53"
                }
              ]
            },
            "documentation": {
              "id": 9922,
              "nodeType": "StructuredDocumentation",
              "src": "2952:157:53",
              "text": " @dev Returns the number of accounts that have `role`. Can be used\n together with {getRoleMember} to enumerate all bearers of a role."
            },
            "functionSelector": "ca15c873",
            "id": 9937,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getRoleMemberCount",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 9925,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 9924,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9937,
                  "src": "3142:12:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 9923,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "3142:7:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3141:14:53"
            },
            "returnParameters": {
              "id": 9928,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 9927,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9937,
                  "src": "3177:7:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 9926,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3177:7:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3176:9:53"
            },
            "scope": 10149,
            "src": "3114:125:53",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 9955,
              "nodeType": "Block",
              "src": "3906:54:53",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 9952,
                        "name": "index",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 9942,
                        "src": "3947:5:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 9947,
                            "name": "_roles",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9881,
                            "src": "3923:6:53",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$9877_storage_$",
                              "typeString": "mapping(bytes32 => struct AccessControl.RoleData storage ref)"
                            }
                          },
                          "id": 9949,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 9948,
                            "name": "role",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9940,
                            "src": "3930:4:53",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "3923:12:53",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_RoleData_$9877_storage",
                            "typeString": "struct AccessControl.RoleData storage ref"
                          }
                        },
                        "id": 9950,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "members",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 9874,
                        "src": "3923:20:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressSet_$5727_storage",
                          "typeString": "struct EnumerableSet.AddressSet storage ref"
                        }
                      },
                      "id": 9951,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "at",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 5845,
                      "src": "3923:23:53",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_AddressSet_$5727_storage_ptr_$_t_uint256_$returns$_t_address_$bound_to$_t_struct$_AddressSet_$5727_storage_ptr_$",
                        "typeString": "function (struct EnumerableSet.AddressSet storage pointer,uint256) view returns (address)"
                      }
                    },
                    "id": 9953,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3923:30:53",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 9946,
                  "id": 9954,
                  "nodeType": "Return",
                  "src": "3916:37:53"
                }
              ]
            },
            "documentation": {
              "id": 9938,
              "nodeType": "StructuredDocumentation",
              "src": "3245:574:53",
              "text": " @dev Returns one of the accounts that have `role`. `index` must be a\n value between 0 and {getRoleMemberCount}, non-inclusive.\n Role bearers are not sorted in any particular way, and their ordering may\n change at any point.\n WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\n you perform all queries on the same block. See the following\n https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\n for more information."
            },
            "functionSelector": "9010d07c",
            "id": 9956,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getRoleMember",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 9943,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 9940,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9956,
                  "src": "3847:12:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 9939,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "3847:7:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 9942,
                  "mutability": "mutable",
                  "name": "index",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9956,
                  "src": "3861:13:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 9941,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3861:7:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3846:29:53"
            },
            "returnParameters": {
              "id": 9946,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 9945,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9956,
                  "src": "3897:7:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 9944,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3897:7:53",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3896:9:53"
            },
            "scope": 10149,
            "src": "3824:136:53",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 9981,
              "nodeType": "Block",
              "src": "4134:87:53",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 9966,
                              "name": "_roles",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9881,
                              "src": "4151:6:53",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$9877_storage_$",
                                "typeString": "mapping(bytes32 => struct AccessControl.RoleData storage ref)"
                              }
                            },
                            "id": 9968,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 9967,
                              "name": "role",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9959,
                              "src": "4158:4:53",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "4151:12:53",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_RoleData_$9877_storage",
                              "typeString": "struct AccessControl.RoleData storage ref"
                            }
                          },
                          "id": 9969,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "members",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 9874,
                          "src": "4151:20:53",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_AddressSet_$5727_storage",
                            "typeString": "struct EnumerableSet.AddressSet storage ref"
                          }
                        },
                        "id": 9970,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_inner",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 5726,
                        "src": "4151:27:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Set_$5462_storage",
                          "typeString": "struct EnumerableSet.Set storage ref"
                        }
                      },
                      "id": 9971,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "_indexes",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 5461,
                      "src": "4151:36:53",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                        "typeString": "mapping(bytes32 => uint256)"
                      }
                    },
                    "id": 9979,
                    "indexExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 9976,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9961,
                              "src": "4204:7:53",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 9975,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "4196:7:53",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint256_$",
                              "typeString": "type(uint256)"
                            },
                            "typeName": {
                              "id": 9974,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "4196:7:53",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 9977,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4196:16:53",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "id": 9973,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "4188:7:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_bytes32_$",
                          "typeString": "type(bytes32)"
                        },
                        "typeName": {
                          "id": 9972,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "4188:7:53",
                          "typeDescriptions": {
                            "typeIdentifier": null,
                            "typeString": null
                          }
                        }
                      },
                      "id": 9978,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "4188:25:53",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "4151:63:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 9965,
                  "id": 9980,
                  "nodeType": "Return",
                  "src": "4144:70:53"
                }
              ]
            },
            "documentation": {
              "id": 9957,
              "nodeType": "StructuredDocumentation",
              "src": "3966:74:53",
              "text": " @dev Returns the index of the account that have `role`."
            },
            "functionSelector": "4e0df3f6",
            "id": 9982,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getRoleMemberIndex",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 9962,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 9959,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9982,
                  "src": "4073:12:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 9958,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4073:7:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 9961,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9982,
                  "src": "4087:15:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 9960,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4087:7:53",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4072:31:53"
            },
            "returnParameters": {
              "id": 9965,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 9964,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9982,
                  "src": "4125:7:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 9963,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4125:7:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4124:9:53"
            },
            "scope": 10149,
            "src": "4045:176:53",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 9995,
              "nodeType": "Block",
              "src": "4468:46:53",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 9990,
                        "name": "_roles",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 9881,
                        "src": "4485:6:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$9877_storage_$",
                          "typeString": "mapping(bytes32 => struct AccessControl.RoleData storage ref)"
                        }
                      },
                      "id": 9992,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 9991,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 9985,
                        "src": "4492:4:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "4485:12:53",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_RoleData_$9877_storage",
                        "typeString": "struct AccessControl.RoleData storage ref"
                      }
                    },
                    "id": 9993,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "adminRole",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 9876,
                    "src": "4485:22:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "functionReturnParameters": 9989,
                  "id": 9994,
                  "nodeType": "Return",
                  "src": "4478:29:53"
                }
              ]
            },
            "documentation": {
              "id": 9983,
              "nodeType": "StructuredDocumentation",
              "src": "4227:170:53",
              "text": " @dev Returns the admin role that controls `role`. See {grantRole} and\n {revokeRole}.\n To change a role's admin, use {_setRoleAdmin}."
            },
            "functionSelector": "248a9ca3",
            "id": 9996,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getRoleAdmin",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 9986,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 9985,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9996,
                  "src": "4424:12:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 9984,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4424:7:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4423:14:53"
            },
            "returnParameters": {
              "id": 9989,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 9988,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9996,
                  "src": "4459:7:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 9987,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4459:7:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4458:9:53"
            },
            "scope": 10149,
            "src": "4402:112:53",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 10021,
              "nodeType": "Block",
              "src": "4829:158:53",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 10006,
                                "name": "_roles",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 9881,
                                "src": "4855:6:53",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$9877_storage_$",
                                  "typeString": "mapping(bytes32 => struct AccessControl.RoleData storage ref)"
                                }
                              },
                              "id": 10008,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 10007,
                                "name": "role",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 9999,
                                "src": "4862:4:53",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "4855:12:53",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_RoleData_$9877_storage",
                                "typeString": "struct AccessControl.RoleData storage ref"
                              }
                            },
                            "id": 10009,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "adminRole",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 9876,
                            "src": "4855:22:53",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 10010,
                              "name": "_msgSender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4829,
                              "src": "4879:10:53",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                "typeString": "function () view returns (address payable)"
                              }
                            },
                            "id": 10011,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "4879:12:53",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "id": 10005,
                          "name": "hasRole",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 9921,
                          "src": "4847:7:53",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_address_$returns$_t_bool_$",
                            "typeString": "function (bytes32,address) view returns (bool)"
                          }
                        },
                        "id": 10012,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4847:45:53",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e74",
                        "id": 10013,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4894:49:53",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_0ba7116025f1ef6b158a2bd2238e617f30e17c9e456917d901086ca4f8ad2811",
                          "typeString": "literal_string \"AccessControl: sender must be an admin to grant\""
                        },
                        "value": "AccessControl: sender must be an admin to grant"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_0ba7116025f1ef6b158a2bd2238e617f30e17c9e456917d901086ca4f8ad2811",
                          "typeString": "literal_string \"AccessControl: sender must be an admin to grant\""
                        }
                      ],
                      "id": 10004,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "4839:7:53",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 10014,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4839:105:53",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10015,
                  "nodeType": "ExpressionStatement",
                  "src": "4839:105:53"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 10017,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 9999,
                        "src": "4966:4:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 10018,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10001,
                        "src": "4972:7:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 10016,
                      "name": "_grantRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10124,
                      "src": "4955:10:53",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address)"
                      }
                    },
                    "id": 10019,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4955:25:53",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10020,
                  "nodeType": "ExpressionStatement",
                  "src": "4955:25:53"
                }
              ]
            },
            "documentation": {
              "id": 9997,
              "nodeType": "StructuredDocumentation",
              "src": "4520:239:53",
              "text": " @dev Grants `role` to `account`.\n If `account` had not been already granted `role`, emits a {RoleGranted}\n event.\n Requirements:\n - the caller must have ``role``'s admin role."
            },
            "functionSelector": "2f2ff15d",
            "id": 10022,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "grantRole",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10002,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 9999,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10022,
                  "src": "4783:12:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 9998,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4783:7:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 10001,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10022,
                  "src": "4797:15:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 10000,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4797:7:53",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4782:31:53"
            },
            "returnParameters": {
              "id": 10003,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4829:0:53"
            },
            "scope": 10149,
            "src": "4764:223:53",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "public"
          },
          {
            "body": {
              "id": 10047,
              "nodeType": "Block",
              "src": "5287:160:53",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 10032,
                                "name": "_roles",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 9881,
                                "src": "5313:6:53",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$9877_storage_$",
                                  "typeString": "mapping(bytes32 => struct AccessControl.RoleData storage ref)"
                                }
                              },
                              "id": 10034,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 10033,
                                "name": "role",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10025,
                                "src": "5320:4:53",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "5313:12:53",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_RoleData_$9877_storage",
                                "typeString": "struct AccessControl.RoleData storage ref"
                              }
                            },
                            "id": 10035,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "adminRole",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 9876,
                            "src": "5313:22:53",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 10036,
                              "name": "_msgSender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4829,
                              "src": "5337:10:53",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                "typeString": "function () view returns (address payable)"
                              }
                            },
                            "id": 10037,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "5337:12:53",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "id": 10031,
                          "name": "hasRole",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 9921,
                          "src": "5305:7:53",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_address_$returns$_t_bool_$",
                            "typeString": "function (bytes32,address) view returns (bool)"
                          }
                        },
                        "id": 10038,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "5305:45:53",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b65",
                        "id": 10039,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "5352:50:53",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_64344570eab7406ca49d34d38bf2b2496dfda914405390c5057c8b0aabf798a3",
                          "typeString": "literal_string \"AccessControl: sender must be an admin to revoke\""
                        },
                        "value": "AccessControl: sender must be an admin to revoke"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_64344570eab7406ca49d34d38bf2b2496dfda914405390c5057c8b0aabf798a3",
                          "typeString": "literal_string \"AccessControl: sender must be an admin to revoke\""
                        }
                      ],
                      "id": 10030,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "5297:7:53",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 10040,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5297:106:53",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10041,
                  "nodeType": "ExpressionStatement",
                  "src": "5297:106:53"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 10043,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10025,
                        "src": "5426:4:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 10044,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10027,
                        "src": "5432:7:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 10042,
                      "name": "_revokeRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10148,
                      "src": "5414:11:53",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address)"
                      }
                    },
                    "id": 10045,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5414:26:53",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10046,
                  "nodeType": "ExpressionStatement",
                  "src": "5414:26:53"
                }
              ]
            },
            "documentation": {
              "id": 10023,
              "nodeType": "StructuredDocumentation",
              "src": "4993:223:53",
              "text": " @dev Revokes `role` from `account`.\n If `account` had been granted `role`, emits a {RoleRevoked} event.\n Requirements:\n - the caller must have ``role``'s admin role."
            },
            "functionSelector": "d547741f",
            "id": 10048,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "revokeRole",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10028,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10025,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10048,
                  "src": "5241:12:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 10024,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5241:7:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 10027,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10048,
                  "src": "5255:15:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 10026,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5255:7:53",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5240:31:53"
            },
            "returnParameters": {
              "id": 10029,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5287:0:53"
            },
            "scope": 10149,
            "src": "5221:226:53",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "public"
          },
          {
            "body": {
              "id": 10069,
              "nodeType": "Block",
              "src": "6006:137:53",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 10060,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 10057,
                          "name": "account",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10053,
                          "src": "6024:7:53",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 10058,
                            "name": "_msgSender",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4829,
                            "src": "6035:10:53",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                              "typeString": "function () view returns (address payable)"
                            }
                          },
                          "id": 10059,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6035:12:53",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "6024:23:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66",
                        "id": 10061,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "6049:49:53",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_fb06fa8ff2141e8ed74502f6792273793f25f0e9d3cf15344f3f5a0d4948fd4b",
                          "typeString": "literal_string \"AccessControl: can only renounce roles for self\""
                        },
                        "value": "AccessControl: can only renounce roles for self"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_fb06fa8ff2141e8ed74502f6792273793f25f0e9d3cf15344f3f5a0d4948fd4b",
                          "typeString": "literal_string \"AccessControl: can only renounce roles for self\""
                        }
                      ],
                      "id": 10056,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "6016:7:53",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 10062,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6016:83:53",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10063,
                  "nodeType": "ExpressionStatement",
                  "src": "6016:83:53"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 10065,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10051,
                        "src": "6122:4:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 10066,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10053,
                        "src": "6128:7:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 10064,
                      "name": "_revokeRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10148,
                      "src": "6110:11:53",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address)"
                      }
                    },
                    "id": 10067,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6110:26:53",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10068,
                  "nodeType": "ExpressionStatement",
                  "src": "6110:26:53"
                }
              ]
            },
            "documentation": {
              "id": 10049,
              "nodeType": "StructuredDocumentation",
              "src": "5453:480:53",
              "text": " @dev Revokes `role` from the calling account.\n Roles are often managed via {grantRole} and {revokeRole}: this function's\n purpose is to provide a mechanism for accounts to lose their privileges\n if they are compromised (such as when a trusted device is misplaced).\n If the calling account had been granted `role`, emits a {RoleRevoked}\n event.\n Requirements:\n - the caller must be `account`."
            },
            "functionSelector": "36568abe",
            "id": 10070,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "renounceRole",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10054,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10051,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10070,
                  "src": "5960:12:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 10050,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5960:7:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 10053,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10070,
                  "src": "5974:15:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 10052,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5974:7:53",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5959:31:53"
            },
            "returnParameters": {
              "id": 10055,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6006:0:53"
            },
            "scope": 10149,
            "src": "5938:205:53",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "public"
          },
          {
            "body": {
              "id": 10083,
              "nodeType": "Block",
              "src": "6776:42:53",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 10079,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10073,
                        "src": "6797:4:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 10080,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10075,
                        "src": "6803:7:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 10078,
                      "name": "_grantRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10124,
                      "src": "6786:10:53",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address)"
                      }
                    },
                    "id": 10081,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6786:25:53",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10082,
                  "nodeType": "ExpressionStatement",
                  "src": "6786:25:53"
                }
              ]
            },
            "documentation": {
              "id": 10071,
              "nodeType": "StructuredDocumentation",
              "src": "6149:554:53",
              "text": " @dev Grants `role` to `account`.\n If `account` had not been already granted `role`, emits a {RoleGranted}\n event. Note that unlike {grantRole}, this function doesn't perform any\n checks on the calling account.\n [WARNING]\n ====\n This function should only be called from the constructor when setting\n up the initial roles for the system.\n Using this function in any other way is effectively circumventing the admin\n system imposed by {AccessControl}.\n ===="
            },
            "id": 10084,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_setupRole",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10076,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10073,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10084,
                  "src": "6728:12:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 10072,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "6728:7:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 10075,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10084,
                  "src": "6742:15:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 10074,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6742:7:53",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6727:31:53"
            },
            "returnParameters": {
              "id": 10077,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6776:0:53"
            },
            "scope": 10149,
            "src": "6708:110:53",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 10099,
              "nodeType": "Block",
              "src": "6968:51:53",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 10097,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 10092,
                          "name": "_roles",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 9881,
                          "src": "6978:6:53",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$9877_storage_$",
                            "typeString": "mapping(bytes32 => struct AccessControl.RoleData storage ref)"
                          }
                        },
                        "id": 10094,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 10093,
                          "name": "role",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10087,
                          "src": "6985:4:53",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "6978:12:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_RoleData_$9877_storage",
                          "typeString": "struct AccessControl.RoleData storage ref"
                        }
                      },
                      "id": 10095,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "adminRole",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 9876,
                      "src": "6978:22:53",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 10096,
                      "name": "adminRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10089,
                      "src": "7003:9:53",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "src": "6978:34:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "id": 10098,
                  "nodeType": "ExpressionStatement",
                  "src": "6978:34:53"
                }
              ]
            },
            "documentation": {
              "id": 10085,
              "nodeType": "StructuredDocumentation",
              "src": "6824:66:53",
              "text": " @dev Sets `adminRole` as ``role``'s admin role."
            },
            "id": 10100,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_setRoleAdmin",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10090,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10087,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10100,
                  "src": "6918:12:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 10086,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "6918:7:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 10089,
                  "mutability": "mutable",
                  "name": "adminRole",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10100,
                  "src": "6932:17:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 10088,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "6932:7:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6917:33:53"
            },
            "returnParameters": {
              "id": 10091,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6968:0:53"
            },
            "scope": 10149,
            "src": "6895:124:53",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 10123,
              "nodeType": "Block",
              "src": "7084:125:53",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 10112,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10104,
                        "src": "7123:7:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 10107,
                            "name": "_roles",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9881,
                            "src": "7098:6:53",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$9877_storage_$",
                              "typeString": "mapping(bytes32 => struct AccessControl.RoleData storage ref)"
                            }
                          },
                          "id": 10109,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 10108,
                            "name": "role",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10102,
                            "src": "7105:4:53",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "7098:12:53",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_RoleData_$9877_storage",
                            "typeString": "struct AccessControl.RoleData storage ref"
                          }
                        },
                        "id": 10110,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "members",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 9874,
                        "src": "7098:20:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressSet_$5727_storage",
                          "typeString": "struct EnumerableSet.AddressSet storage ref"
                        }
                      },
                      "id": 10111,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "add",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 5753,
                      "src": "7098:24:53",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_AddressSet_$5727_storage_ptr_$_t_address_$returns$_t_bool_$bound_to$_t_struct$_AddressSet_$5727_storage_ptr_$",
                        "typeString": "function (struct EnumerableSet.AddressSet storage pointer,address) returns (bool)"
                      }
                    },
                    "id": 10113,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7098:33:53",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 10122,
                  "nodeType": "IfStatement",
                  "src": "7094:109:53",
                  "trueBody": {
                    "id": 10121,
                    "nodeType": "Block",
                    "src": "7133:70:53",
                    "statements": [
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10115,
                              "name": "role",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10102,
                              "src": "7164:4:53",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 10116,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10104,
                              "src": "7170:7:53",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 10117,
                                "name": "_msgSender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4829,
                                "src": "7179:10:53",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                  "typeString": "function () view returns (address payable)"
                                }
                              },
                              "id": 10118,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7179:12:53",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "id": 10114,
                            "name": "RoleGranted",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9893,
                            "src": "7152:11:53",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$returns$__$",
                              "typeString": "function (bytes32,address,address)"
                            }
                          },
                          "id": 10119,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7152:40:53",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10120,
                        "nodeType": "EmitStatement",
                        "src": "7147:45:53"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": null,
            "id": 10124,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_grantRole",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10105,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10102,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10124,
                  "src": "7045:12:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 10101,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "7045:7:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 10104,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10124,
                  "src": "7059:15:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 10103,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7059:7:53",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7044:31:53"
            },
            "returnParameters": {
              "id": 10106,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "7084:0:53"
            },
            "scope": 10149,
            "src": "7025:184:53",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "private"
          },
          {
            "body": {
              "id": 10147,
              "nodeType": "Block",
              "src": "7275:128:53",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 10136,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10128,
                        "src": "7317:7:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 10131,
                            "name": "_roles",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9881,
                            "src": "7289:6:53",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$9877_storage_$",
                              "typeString": "mapping(bytes32 => struct AccessControl.RoleData storage ref)"
                            }
                          },
                          "id": 10133,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 10132,
                            "name": "role",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10126,
                            "src": "7296:4:53",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "7289:12:53",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_RoleData_$9877_storage",
                            "typeString": "struct AccessControl.RoleData storage ref"
                          }
                        },
                        "id": 10134,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "members",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 9874,
                        "src": "7289:20:53",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressSet_$5727_storage",
                          "typeString": "struct EnumerableSet.AddressSet storage ref"
                        }
                      },
                      "id": 10135,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "remove",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 5779,
                      "src": "7289:27:53",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_AddressSet_$5727_storage_ptr_$_t_address_$returns$_t_bool_$bound_to$_t_struct$_AddressSet_$5727_storage_ptr_$",
                        "typeString": "function (struct EnumerableSet.AddressSet storage pointer,address) returns (bool)"
                      }
                    },
                    "id": 10137,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7289:36:53",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 10146,
                  "nodeType": "IfStatement",
                  "src": "7285:112:53",
                  "trueBody": {
                    "id": 10145,
                    "nodeType": "Block",
                    "src": "7327:70:53",
                    "statements": [
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10139,
                              "name": "role",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10126,
                              "src": "7358:4:53",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 10140,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10128,
                              "src": "7364:7:53",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 10141,
                                "name": "_msgSender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4829,
                                "src": "7373:10:53",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                  "typeString": "function () view returns (address payable)"
                                }
                              },
                              "id": 10142,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7373:12:53",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "id": 10138,
                            "name": "RoleRevoked",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9902,
                            "src": "7346:11:53",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$returns$__$",
                              "typeString": "function (bytes32,address,address)"
                            }
                          },
                          "id": 10143,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7346:40:53",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10144,
                        "nodeType": "EmitStatement",
                        "src": "7341:45:53"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": null,
            "id": 10148,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_revokeRole",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10129,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10126,
                  "mutability": "mutable",
                  "name": "role",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10148,
                  "src": "7236:12:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 10125,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "7236:7:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 10128,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10148,
                  "src": "7250:15:53",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 10127,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7250:7:53",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7235:31:53"
            },
            "returnParameters": {
              "id": 10130,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "7275:0:53"
            },
            "scope": 10149,
            "src": "7215:188:53",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "private"
          }
        ],
        "scope": 10150,
        "src": "1715:5690:53"
      }
    ],
    "src": "33:7373:53"
  },
  "legacyAST": {
    "attributes": {
      "absolutePath": "project:/contracts/utils/AccessControl.sol",
      "exportedSymbols": {
        "AccessControl": [
          10149
        ]
      },
      "license": "MIT"
    },
    "children": [
      {
        "attributes": {
          "literals": [
            "solidity",
            "0.6",
            ".12"
          ]
        },
        "id": 9860,
        "name": "PragmaDirective",
        "src": "33:23:53"
      },
      {
        "attributes": {
          "SourceUnit": 5944,
          "absolutePath": "@openzeppelin/contracts/utils/EnumerableSet.sol",
          "file": "@openzeppelin/contracts/utils/EnumerableSet.sol",
          "scope": 10150,
          "symbolAliases": [
            null
          ],
          "unitAlias": ""
        },
        "id": 9861,
        "name": "ImportDirective",
        "src": "277:57:53"
      },
      {
        "attributes": {
          "SourceUnit": 4819,
          "absolutePath": "@openzeppelin/contracts/utils/Address.sol",
          "file": "@openzeppelin/contracts/utils/Address.sol",
          "scope": 10150,
          "symbolAliases": [
            null
          ],
          "unitAlias": ""
        },
        "id": 9862,
        "name": "ImportDirective",
        "src": "335:51:53"
      },
      {
        "attributes": {
          "SourceUnit": 3,
          "absolutePath": "@openzeppelin/contracts/GSN/Context.sol",
          "file": "@openzeppelin/contracts/GSN/Context.sol",
          "scope": 10150,
          "symbolAliases": [
            null
          ],
          "unitAlias": ""
        },
        "id": 9863,
        "name": "ImportDirective",
        "src": "387:49:53"
      },
      {
        "attributes": {
          "abstract": true,
          "contractDependencies": [
            4841
          ],
          "contractKind": "contract",
          "fullyImplemented": true,
          "linearizedBaseContracts": [
            10149,
            4841
          ],
          "name": "AccessControl",
          "scope": 10150
        },
        "children": [
          {
            "attributes": {
              "text": " @dev Contract module that allows children to implement role-based access\n control mechanisms.\n Roles are referred to by their `bytes32` identifier. These should be exposed\n in the external API and be unique. The best way to achieve this is by\n using `public constant` hash digests:\n ```\n bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n ```\n Roles can be used to represent a set of permissions. To restrict access to a\n function call, use {hasRole}:\n ```\n function foo() public {\n     require(hasRole(MY_ROLE, msg.sender));\n     ...\n }\n ```\n Roles can be granted and revoked dynamically via the {grantRole} and\n {revokeRole} functions. Each role has an associated admin role, and only\n accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n that only accounts with this role will be able to grant or revoke other\n roles. More complex role relationships can be created by using\n {_setRoleAdmin}.\n WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n grant and revoke this role. Extra precautions should be taken to secure\n accounts that have been granted it."
            },
            "id": 9864,
            "name": "StructuredDocumentation",
            "src": "438:1276:53"
          },
          {
            "attributes": {
              "arguments": null
            },
            "children": [
              {
                "attributes": {
                  "contractScope": null,
                  "name": "Context",
                  "referencedDeclaration": 4841,
                  "type": "contract Context"
                },
                "id": 9865,
                "name": "UserDefinedTypeName",
                "src": "1750:7:53"
              }
            ],
            "id": 9866,
            "name": "InheritanceSpecifier",
            "src": "1750:7:53"
          },
          {
            "children": [
              {
                "attributes": {
                  "contractScope": null,
                  "name": "EnumerableSet",
                  "referencedDeclaration": 5943,
                  "type": "library EnumerableSet"
                },
                "id": 9867,
                "name": "UserDefinedTypeName",
                "src": "1770:13:53"
              },
              {
                "attributes": {
                  "contractScope": null,
                  "name": "EnumerableSet.AddressSet",
                  "referencedDeclaration": 5727,
                  "type": "struct EnumerableSet.AddressSet"
                },
                "id": 9868,
                "name": "UserDefinedTypeName",
                "src": "1788:24:53"
              }
            ],
            "id": 9869,
            "name": "UsingForDirective",
            "src": "1764:49:53"
          },
          {
            "children": [
              {
                "attributes": {
                  "contractScope": null,
                  "name": "Address",
                  "referencedDeclaration": 4818,
                  "type": "library Address"
                },
                "id": 9870,
                "name": "UserDefinedTypeName",
                "src": "1824:7:53"
              },
              {
                "attributes": {
                  "name": "address",
                  "stateMutability": "nonpayable",
                  "type": "address"
                },
                "id": 9871,
                "name": "ElementaryTypeName",
                "src": "1836:7:53"
              }
            ],
            "id": 9872,
            "name": "UsingForDirective",
            "src": "1818:26:53"
          },
          {
            "attributes": {
              "canonicalName": "AccessControl.RoleData",
              "name": "RoleData",
              "scope": 10149,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "constant": false,
                  "mutability": "mutable",
                  "name": "members",
                  "overrides": null,
                  "scope": 9877,
                  "stateVariable": false,
                  "storageLocation": "default",
                  "type": "struct EnumerableSet.AddressSet",
                  "value": null,
                  "visibility": "internal"
                },
                "children": [
                  {
                    "attributes": {
                      "contractScope": null,
                      "name": "EnumerableSet.AddressSet",
                      "referencedDeclaration": 5727,
                      "type": "struct EnumerableSet.AddressSet"
                    },
                    "id": 9873,
                    "name": "UserDefinedTypeName",
                    "src": "1876:24:53"
                  }
                ],
                "id": 9874,
                "name": "VariableDeclaration",
                "src": "1876:32:53"
              },
              {
                "attributes": {
                  "constant": false,
                  "mutability": "mutable",
                  "name": "adminRole",
                  "overrides": null,
                  "scope": 9877,
                  "stateVariable": false,
                  "storageLocation": "default",
                  "type": "bytes32",
                  "value": null,
                  "visibility": "internal"
                },
                "children": [
                  {
                    "attributes": {
                      "name": "bytes32",
                      "type": "bytes32"
                    },
                    "id": 9875,
                    "name": "ElementaryTypeName",
                    "src": "1918:7:53"
                  }
                ],
                "id": 9876,
                "name": "VariableDeclaration",
                "src": "1918:17:53"
              }
            ],
            "id": 9877,
            "name": "StructDefinition",
            "src": "1850:92:53"
          },
          {
            "attributes": {
              "constant": false,
              "mutability": "mutable",
              "name": "_roles",
              "overrides": null,
              "scope": 10149,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "mapping(bytes32 => struct AccessControl.RoleData)",
              "value": null,
              "visibility": "private"
            },
            "children": [
              {
                "attributes": {
                  "type": "mapping(bytes32 => struct AccessControl.RoleData)"
                },
                "children": [
                  {
                    "attributes": {
                      "name": "bytes32",
                      "type": "bytes32"
                    },
                    "id": 9878,
                    "name": "ElementaryTypeName",
                    "src": "1957:7:53"
                  },
                  {
                    "attributes": {
                      "contractScope": null,
                      "name": "RoleData",
                      "referencedDeclaration": 9877,
                      "type": "struct AccessControl.RoleData"
                    },
                    "id": 9879,
                    "name": "UserDefinedTypeName",
                    "src": "1968:8:53"
                  }
                ],
                "id": 9880,
                "name": "Mapping",
                "src": "1948:29:53"
              }
            ],
            "id": 9881,
            "name": "VariableDeclaration",
            "src": "1948:44:53"
          },
          {
            "attributes": {
              "constant": true,
              "functionSelector": "a217fddf",
              "mutability": "constant",
              "name": "DEFAULT_ADMIN_ROLE",
              "overrides": null,
              "scope": 10149,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "bytes32",
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "name": "bytes32",
                  "type": "bytes32"
                },
                "id": 9882,
                "name": "ElementaryTypeName",
                "src": "1999:7:53"
              },
              {
                "attributes": {
                  "argumentTypes": null,
                  "hexvalue": "30783030",
                  "isConstant": false,
                  "isLValue": false,
                  "isPure": true,
                  "lValueRequested": false,
                  "subdenomination": null,
                  "token": "number",
                  "type": "int_const 0",
                  "value": "0x00"
                },
                "id": 9883,
                "name": "Literal",
                "src": "2044:4:53"
              }
            ],
            "id": 9884,
            "name": "VariableDeclaration",
            "src": "1999:49:53"
          },
          {
            "attributes": {
              "anonymous": false,
              "name": "RoleGranted"
            },
            "children": [
              {
                "attributes": {
                  "text": " @dev Emitted when `account` is granted `role`.\n `sender` is the account that originated the contract call, an admin role\n bearer except when using {_setupRole}."
                },
                "id": 9885,
                "name": "StructuredDocumentation",
                "src": "2055:198:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": true,
                      "mutability": "mutable",
                      "name": "role",
                      "overrides": null,
                      "scope": 9893,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bytes32",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes32",
                          "type": "bytes32"
                        },
                        "id": 9886,
                        "name": "ElementaryTypeName",
                        "src": "2276:7:53"
                      }
                    ],
                    "id": 9887,
                    "name": "VariableDeclaration",
                    "src": "2276:20:53"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": true,
                      "mutability": "mutable",
                      "name": "account",
                      "overrides": null,
                      "scope": 9893,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 9888,
                        "name": "ElementaryTypeName",
                        "src": "2298:7:53"
                      }
                    ],
                    "id": 9889,
                    "name": "VariableDeclaration",
                    "src": "2298:23:53"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": true,
                      "mutability": "mutable",
                      "name": "sender",
                      "overrides": null,
                      "scope": 9893,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 9890,
                        "name": "ElementaryTypeName",
                        "src": "2323:7:53"
                      }
                    ],
                    "id": 9891,
                    "name": "VariableDeclaration",
                    "src": "2323:22:53"
                  }
                ],
                "id": 9892,
                "name": "ParameterList",
                "src": "2275:71:53"
              }
            ],
            "id": 9893,
            "name": "EventDefinition",
            "src": "2258:89:53"
          },
          {
            "attributes": {
              "anonymous": false,
              "name": "RoleRevoked"
            },
            "children": [
              {
                "attributes": {
                  "text": " @dev Emitted when `account` is revoked `role`.\n `sender` is the account that originated the contract call:\n   - if using `revokeRole`, it is the admin role bearer\n   - if using `renounceRole`, it is the role bearer (i.e. `account`)"
                },
                "id": 9894,
                "name": "StructuredDocumentation",
                "src": "2353:275:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": true,
                      "mutability": "mutable",
                      "name": "role",
                      "overrides": null,
                      "scope": 9902,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bytes32",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes32",
                          "type": "bytes32"
                        },
                        "id": 9895,
                        "name": "ElementaryTypeName",
                        "src": "2651:7:53"
                      }
                    ],
                    "id": 9896,
                    "name": "VariableDeclaration",
                    "src": "2651:20:53"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": true,
                      "mutability": "mutable",
                      "name": "account",
                      "overrides": null,
                      "scope": 9902,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 9897,
                        "name": "ElementaryTypeName",
                        "src": "2673:7:53"
                      }
                    ],
                    "id": 9898,
                    "name": "VariableDeclaration",
                    "src": "2673:23:53"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "indexed": true,
                      "mutability": "mutable",
                      "name": "sender",
                      "overrides": null,
                      "scope": 9902,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 9899,
                        "name": "ElementaryTypeName",
                        "src": "2698:7:53"
                      }
                    ],
                    "id": 9900,
                    "name": "VariableDeclaration",
                    "src": "2698:22:53"
                  }
                ],
                "id": 9901,
                "name": "ParameterList",
                "src": "2650:71:53"
              }
            ],
            "id": 9902,
            "name": "EventDefinition",
            "src": "2633:89:53"
          },
          {
            "attributes": {
              "functionSelector": "91d14854",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "hasRole",
              "overrides": null,
              "scope": 10149,
              "stateMutability": "view",
              "virtual": false,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "text": " @dev Returns `true` if `account` has been granted `role`."
                },
                "id": 9903,
                "name": "StructuredDocumentation",
                "src": "2728:76:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "role",
                      "overrides": null,
                      "scope": 9921,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bytes32",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes32",
                          "type": "bytes32"
                        },
                        "id": 9904,
                        "name": "ElementaryTypeName",
                        "src": "2826:7:53"
                      }
                    ],
                    "id": 9905,
                    "name": "VariableDeclaration",
                    "src": "2826:12:53"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "account",
                      "overrides": null,
                      "scope": 9921,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 9906,
                        "name": "ElementaryTypeName",
                        "src": "2840:7:53"
                      }
                    ],
                    "id": 9907,
                    "name": "VariableDeclaration",
                    "src": "2840:15:53"
                  }
                ],
                "id": 9908,
                "name": "ParameterList",
                "src": "2825:31:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "",
                      "overrides": null,
                      "scope": 9921,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bool",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bool",
                          "type": "bool"
                        },
                        "id": 9909,
                        "name": "ElementaryTypeName",
                        "src": "2878:4:53"
                      }
                    ],
                    "id": 9910,
                    "name": "VariableDeclaration",
                    "src": "2878:4:53"
                  }
                ],
                "id": 9911,
                "name": "ParameterList",
                "src": "2877:6:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "functionReturnParameters": 9911
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "tryCall": false,
                          "type": "bool",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "contains",
                              "referencedDeclaration": 5805,
                              "type": "function (struct EnumerableSet.AddressSet storage pointer,address) view returns (bool)"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "members",
                                  "referencedDeclaration": 9874,
                                  "type": "struct EnumerableSet.AddressSet storage ref"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "type": "struct AccessControl.RoleData storage ref"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 9881,
                                          "type": "mapping(bytes32 => struct AccessControl.RoleData storage ref)",
                                          "value": "_roles"
                                        },
                                        "id": 9912,
                                        "name": "Identifier",
                                        "src": "2901:6:53"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 9905,
                                          "type": "bytes32",
                                          "value": "role"
                                        },
                                        "id": 9913,
                                        "name": "Identifier",
                                        "src": "2908:4:53"
                                      }
                                    ],
                                    "id": 9914,
                                    "name": "IndexAccess",
                                    "src": "2901:12:53"
                                  }
                                ],
                                "id": 9915,
                                "name": "MemberAccess",
                                "src": "2901:20:53"
                              }
                            ],
                            "id": 9916,
                            "name": "MemberAccess",
                            "src": "2901:29:53"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 9907,
                              "type": "address",
                              "value": "account"
                            },
                            "id": 9917,
                            "name": "Identifier",
                            "src": "2931:7:53"
                          }
                        ],
                        "id": 9918,
                        "name": "FunctionCall",
                        "src": "2901:38:53"
                      }
                    ],
                    "id": 9919,
                    "name": "Return",
                    "src": "2894:45:53"
                  }
                ],
                "id": 9920,
                "name": "Block",
                "src": "2884:62:53"
              }
            ],
            "id": 9921,
            "name": "FunctionDefinition",
            "src": "2809:137:53"
          },
          {
            "attributes": {
              "functionSelector": "ca15c873",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "getRoleMemberCount",
              "overrides": null,
              "scope": 10149,
              "stateMutability": "view",
              "virtual": false,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "text": " @dev Returns the number of accounts that have `role`. Can be used\n together with {getRoleMember} to enumerate all bearers of a role."
                },
                "id": 9922,
                "name": "StructuredDocumentation",
                "src": "2952:157:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "role",
                      "overrides": null,
                      "scope": 9937,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bytes32",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes32",
                          "type": "bytes32"
                        },
                        "id": 9923,
                        "name": "ElementaryTypeName",
                        "src": "3142:7:53"
                      }
                    ],
                    "id": 9924,
                    "name": "VariableDeclaration",
                    "src": "3142:12:53"
                  }
                ],
                "id": 9925,
                "name": "ParameterList",
                "src": "3141:14:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "",
                      "overrides": null,
                      "scope": 9937,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 9926,
                        "name": "ElementaryTypeName",
                        "src": "3177:7:53"
                      }
                    ],
                    "id": 9927,
                    "name": "VariableDeclaration",
                    "src": "3177:7:53"
                  }
                ],
                "id": 9928,
                "name": "ParameterList",
                "src": "3176:9:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "functionReturnParameters": 9928
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "arguments": [
                            null
                          ],
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "tryCall": false,
                          "type": "uint256",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                null
                              ],
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "length",
                              "referencedDeclaration": 5819,
                              "type": "function (struct EnumerableSet.AddressSet storage pointer) view returns (uint256)"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "members",
                                  "referencedDeclaration": 9874,
                                  "type": "struct EnumerableSet.AddressSet storage ref"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "type": "struct AccessControl.RoleData storage ref"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 9881,
                                          "type": "mapping(bytes32 => struct AccessControl.RoleData storage ref)",
                                          "value": "_roles"
                                        },
                                        "id": 9929,
                                        "name": "Identifier",
                                        "src": "3203:6:53"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 9924,
                                          "type": "bytes32",
                                          "value": "role"
                                        },
                                        "id": 9930,
                                        "name": "Identifier",
                                        "src": "3210:4:53"
                                      }
                                    ],
                                    "id": 9931,
                                    "name": "IndexAccess",
                                    "src": "3203:12:53"
                                  }
                                ],
                                "id": 9932,
                                "name": "MemberAccess",
                                "src": "3203:20:53"
                              }
                            ],
                            "id": 9933,
                            "name": "MemberAccess",
                            "src": "3203:27:53"
                          }
                        ],
                        "id": 9934,
                        "name": "FunctionCall",
                        "src": "3203:29:53"
                      }
                    ],
                    "id": 9935,
                    "name": "Return",
                    "src": "3196:36:53"
                  }
                ],
                "id": 9936,
                "name": "Block",
                "src": "3186:53:53"
              }
            ],
            "id": 9937,
            "name": "FunctionDefinition",
            "src": "3114:125:53"
          },
          {
            "attributes": {
              "functionSelector": "9010d07c",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "getRoleMember",
              "overrides": null,
              "scope": 10149,
              "stateMutability": "view",
              "virtual": false,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "text": " @dev Returns one of the accounts that have `role`. `index` must be a\n value between 0 and {getRoleMemberCount}, non-inclusive.\n Role bearers are not sorted in any particular way, and their ordering may\n change at any point.\n WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\n you perform all queries on the same block. See the following\n https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\n for more information."
                },
                "id": 9938,
                "name": "StructuredDocumentation",
                "src": "3245:574:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "role",
                      "overrides": null,
                      "scope": 9956,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bytes32",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes32",
                          "type": "bytes32"
                        },
                        "id": 9939,
                        "name": "ElementaryTypeName",
                        "src": "3847:7:53"
                      }
                    ],
                    "id": 9940,
                    "name": "VariableDeclaration",
                    "src": "3847:12:53"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "index",
                      "overrides": null,
                      "scope": 9956,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 9941,
                        "name": "ElementaryTypeName",
                        "src": "3861:7:53"
                      }
                    ],
                    "id": 9942,
                    "name": "VariableDeclaration",
                    "src": "3861:13:53"
                  }
                ],
                "id": 9943,
                "name": "ParameterList",
                "src": "3846:29:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "",
                      "overrides": null,
                      "scope": 9956,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 9944,
                        "name": "ElementaryTypeName",
                        "src": "3897:7:53"
                      }
                    ],
                    "id": 9945,
                    "name": "VariableDeclaration",
                    "src": "3897:7:53"
                  }
                ],
                "id": 9946,
                "name": "ParameterList",
                "src": "3896:9:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "functionReturnParameters": 9946
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "tryCall": false,
                          "type": "address",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "at",
                              "referencedDeclaration": 5845,
                              "type": "function (struct EnumerableSet.AddressSet storage pointer,uint256) view returns (address)"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "members",
                                  "referencedDeclaration": 9874,
                                  "type": "struct EnumerableSet.AddressSet storage ref"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "type": "struct AccessControl.RoleData storage ref"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 9881,
                                          "type": "mapping(bytes32 => struct AccessControl.RoleData storage ref)",
                                          "value": "_roles"
                                        },
                                        "id": 9947,
                                        "name": "Identifier",
                                        "src": "3923:6:53"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 9940,
                                          "type": "bytes32",
                                          "value": "role"
                                        },
                                        "id": 9948,
                                        "name": "Identifier",
                                        "src": "3930:4:53"
                                      }
                                    ],
                                    "id": 9949,
                                    "name": "IndexAccess",
                                    "src": "3923:12:53"
                                  }
                                ],
                                "id": 9950,
                                "name": "MemberAccess",
                                "src": "3923:20:53"
                              }
                            ],
                            "id": 9951,
                            "name": "MemberAccess",
                            "src": "3923:23:53"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 9942,
                              "type": "uint256",
                              "value": "index"
                            },
                            "id": 9952,
                            "name": "Identifier",
                            "src": "3947:5:53"
                          }
                        ],
                        "id": 9953,
                        "name": "FunctionCall",
                        "src": "3923:30:53"
                      }
                    ],
                    "id": 9954,
                    "name": "Return",
                    "src": "3916:37:53"
                  }
                ],
                "id": 9955,
                "name": "Block",
                "src": "3906:54:53"
              }
            ],
            "id": 9956,
            "name": "FunctionDefinition",
            "src": "3824:136:53"
          },
          {
            "attributes": {
              "functionSelector": "4e0df3f6",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "getRoleMemberIndex",
              "overrides": null,
              "scope": 10149,
              "stateMutability": "view",
              "virtual": false,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "text": " @dev Returns the index of the account that have `role`."
                },
                "id": 9957,
                "name": "StructuredDocumentation",
                "src": "3966:74:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "role",
                      "overrides": null,
                      "scope": 9982,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bytes32",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes32",
                          "type": "bytes32"
                        },
                        "id": 9958,
                        "name": "ElementaryTypeName",
                        "src": "4073:7:53"
                      }
                    ],
                    "id": 9959,
                    "name": "VariableDeclaration",
                    "src": "4073:12:53"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "account",
                      "overrides": null,
                      "scope": 9982,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 9960,
                        "name": "ElementaryTypeName",
                        "src": "4087:7:53"
                      }
                    ],
                    "id": 9961,
                    "name": "VariableDeclaration",
                    "src": "4087:15:53"
                  }
                ],
                "id": 9962,
                "name": "ParameterList",
                "src": "4072:31:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "",
                      "overrides": null,
                      "scope": 9982,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 9963,
                        "name": "ElementaryTypeName",
                        "src": "4125:7:53"
                      }
                    ],
                    "id": 9964,
                    "name": "VariableDeclaration",
                    "src": "4125:7:53"
                  }
                ],
                "id": 9965,
                "name": "ParameterList",
                "src": "4124:9:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "functionReturnParameters": 9965
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "type": "uint256"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "_indexes",
                              "referencedDeclaration": 5461,
                              "type": "mapping(bytes32 => uint256)"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "_inner",
                                  "referencedDeclaration": 5726,
                                  "type": "struct EnumerableSet.Set storage ref"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "member_name": "members",
                                      "referencedDeclaration": 9874,
                                      "type": "struct EnumerableSet.AddressSet storage ref"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "type": "struct AccessControl.RoleData storage ref"
                                        },
                                        "children": [
                                          {
                                            "attributes": {
                                              "argumentTypes": null,
                                              "overloadedDeclarations": [
                                                null
                                              ],
                                              "referencedDeclaration": 9881,
                                              "type": "mapping(bytes32 => struct AccessControl.RoleData storage ref)",
                                              "value": "_roles"
                                            },
                                            "id": 9966,
                                            "name": "Identifier",
                                            "src": "4151:6:53"
                                          },
                                          {
                                            "attributes": {
                                              "argumentTypes": null,
                                              "overloadedDeclarations": [
                                                null
                                              ],
                                              "referencedDeclaration": 9959,
                                              "type": "bytes32",
                                              "value": "role"
                                            },
                                            "id": 9967,
                                            "name": "Identifier",
                                            "src": "4158:4:53"
                                          }
                                        ],
                                        "id": 9968,
                                        "name": "IndexAccess",
                                        "src": "4151:12:53"
                                      }
                                    ],
                                    "id": 9969,
                                    "name": "MemberAccess",
                                    "src": "4151:20:53"
                                  }
                                ],
                                "id": 9970,
                                "name": "MemberAccess",
                                "src": "4151:27:53"
                              }
                            ],
                            "id": 9971,
                            "name": "MemberAccess",
                            "src": "4151:36:53"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "tryCall": false,
                              "type": "bytes32",
                              "type_conversion": true
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "type": "type(bytes32)"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "name": "bytes32",
                                      "type": null
                                    },
                                    "id": 9972,
                                    "name": "ElementaryTypeName",
                                    "src": "4188:7:53"
                                  }
                                ],
                                "id": 9973,
                                "name": "ElementaryTypeNameExpression",
                                "src": "4188:7:53"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "tryCall": false,
                                  "type": "uint256",
                                  "type_conversion": true
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "type": "type(uint256)"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "name": "uint256",
                                          "type": null
                                        },
                                        "id": 9974,
                                        "name": "ElementaryTypeName",
                                        "src": "4196:7:53"
                                      }
                                    ],
                                    "id": 9975,
                                    "name": "ElementaryTypeNameExpression",
                                    "src": "4196:7:53"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 9961,
                                      "type": "address",
                                      "value": "account"
                                    },
                                    "id": 9976,
                                    "name": "Identifier",
                                    "src": "4204:7:53"
                                  }
                                ],
                                "id": 9977,
                                "name": "FunctionCall",
                                "src": "4196:16:53"
                              }
                            ],
                            "id": 9978,
                            "name": "FunctionCall",
                            "src": "4188:25:53"
                          }
                        ],
                        "id": 9979,
                        "name": "IndexAccess",
                        "src": "4151:63:53"
                      }
                    ],
                    "id": 9980,
                    "name": "Return",
                    "src": "4144:70:53"
                  }
                ],
                "id": 9981,
                "name": "Block",
                "src": "4134:87:53"
              }
            ],
            "id": 9982,
            "name": "FunctionDefinition",
            "src": "4045:176:53"
          },
          {
            "attributes": {
              "functionSelector": "248a9ca3",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "getRoleAdmin",
              "overrides": null,
              "scope": 10149,
              "stateMutability": "view",
              "virtual": false,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "text": " @dev Returns the admin role that controls `role`. See {grantRole} and\n {revokeRole}.\n To change a role's admin, use {_setRoleAdmin}."
                },
                "id": 9983,
                "name": "StructuredDocumentation",
                "src": "4227:170:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "role",
                      "overrides": null,
                      "scope": 9996,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bytes32",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes32",
                          "type": "bytes32"
                        },
                        "id": 9984,
                        "name": "ElementaryTypeName",
                        "src": "4424:7:53"
                      }
                    ],
                    "id": 9985,
                    "name": "VariableDeclaration",
                    "src": "4424:12:53"
                  }
                ],
                "id": 9986,
                "name": "ParameterList",
                "src": "4423:14:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "",
                      "overrides": null,
                      "scope": 9996,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bytes32",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes32",
                          "type": "bytes32"
                        },
                        "id": 9987,
                        "name": "ElementaryTypeName",
                        "src": "4459:7:53"
                      }
                    ],
                    "id": 9988,
                    "name": "VariableDeclaration",
                    "src": "4459:7:53"
                  }
                ],
                "id": 9989,
                "name": "ParameterList",
                "src": "4458:9:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "functionReturnParameters": 9989
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "member_name": "adminRole",
                          "referencedDeclaration": 9876,
                          "type": "bytes32"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "type": "struct AccessControl.RoleData storage ref"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 9881,
                                  "type": "mapping(bytes32 => struct AccessControl.RoleData storage ref)",
                                  "value": "_roles"
                                },
                                "id": 9990,
                                "name": "Identifier",
                                "src": "4485:6:53"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 9985,
                                  "type": "bytes32",
                                  "value": "role"
                                },
                                "id": 9991,
                                "name": "Identifier",
                                "src": "4492:4:53"
                              }
                            ],
                            "id": 9992,
                            "name": "IndexAccess",
                            "src": "4485:12:53"
                          }
                        ],
                        "id": 9993,
                        "name": "MemberAccess",
                        "src": "4485:22:53"
                      }
                    ],
                    "id": 9994,
                    "name": "Return",
                    "src": "4478:29:53"
                  }
                ],
                "id": 9995,
                "name": "Block",
                "src": "4468:46:53"
              }
            ],
            "id": 9996,
            "name": "FunctionDefinition",
            "src": "4402:112:53"
          },
          {
            "attributes": {
              "functionSelector": "2f2ff15d",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "grantRole",
              "overrides": null,
              "scope": 10149,
              "stateMutability": "nonpayable",
              "virtual": true,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "text": " @dev Grants `role` to `account`.\n If `account` had not been already granted `role`, emits a {RoleGranted}\n event.\n Requirements:\n - the caller must have ``role``'s admin role."
                },
                "id": 9997,
                "name": "StructuredDocumentation",
                "src": "4520:239:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "role",
                      "overrides": null,
                      "scope": 10022,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bytes32",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes32",
                          "type": "bytes32"
                        },
                        "id": 9998,
                        "name": "ElementaryTypeName",
                        "src": "4783:7:53"
                      }
                    ],
                    "id": 9999,
                    "name": "VariableDeclaration",
                    "src": "4783:12:53"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "account",
                      "overrides": null,
                      "scope": 10022,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 10000,
                        "name": "ElementaryTypeName",
                        "src": "4797:7:53"
                      }
                    ],
                    "id": 10001,
                    "name": "VariableDeclaration",
                    "src": "4797:15:53"
                  }
                ],
                "id": 10002,
                "name": "ParameterList",
                "src": "4782:31:53"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 10003,
                "name": "ParameterList",
                "src": "4829:0:53"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "tryCall": false,
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_0ba7116025f1ef6b158a2bd2238e617f30e17c9e456917d901086ca4f8ad2811",
                                  "typeString": "literal_string \"AccessControl: sender must be an admin to grant\""
                                }
                              ],
                              "overloadedDeclarations": [
                                -18,
                                -18
                              ],
                              "referencedDeclaration": -18,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 10004,
                            "name": "Identifier",
                            "src": "4839:7:53"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "tryCall": false,
                              "type": "bool",
                              "type_conversion": false
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    },
                                    {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  ],
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 9921,
                                  "type": "function (bytes32,address) view returns (bool)",
                                  "value": "hasRole"
                                },
                                "id": 10005,
                                "name": "Identifier",
                                "src": "4847:7:53"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "adminRole",
                                  "referencedDeclaration": 9876,
                                  "type": "bytes32"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "type": "struct AccessControl.RoleData storage ref"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 9881,
                                          "type": "mapping(bytes32 => struct AccessControl.RoleData storage ref)",
                                          "value": "_roles"
                                        },
                                        "id": 10006,
                                        "name": "Identifier",
                                        "src": "4855:6:53"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 9999,
                                          "type": "bytes32",
                                          "value": "role"
                                        },
                                        "id": 10007,
                                        "name": "Identifier",
                                        "src": "4862:4:53"
                                      }
                                    ],
                                    "id": 10008,
                                    "name": "IndexAccess",
                                    "src": "4855:12:53"
                                  }
                                ],
                                "id": 10009,
                                "name": "MemberAccess",
                                "src": "4855:22:53"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    null
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "tryCall": false,
                                  "type": "address payable",
                                  "type_conversion": false
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        null
                                      ],
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 4829,
                                      "type": "function () view returns (address payable)",
                                      "value": "_msgSender"
                                    },
                                    "id": 10010,
                                    "name": "Identifier",
                                    "src": "4879:10:53"
                                  }
                                ],
                                "id": 10011,
                                "name": "FunctionCall",
                                "src": "4879:12:53"
                              }
                            ],
                            "id": 10012,
                            "name": "FunctionCall",
                            "src": "4847:45:53"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e74",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"AccessControl: sender must be an admin to grant\"",
                              "value": "AccessControl: sender must be an admin to grant"
                            },
                            "id": 10013,
                            "name": "Literal",
                            "src": "4894:49:53"
                          }
                        ],
                        "id": 10014,
                        "name": "FunctionCall",
                        "src": "4839:105:53"
                      }
                    ],
                    "id": 10015,
                    "name": "ExpressionStatement",
                    "src": "4839:105:53"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "tryCall": false,
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                },
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 10124,
                              "type": "function (bytes32,address)",
                              "value": "_grantRole"
                            },
                            "id": 10016,
                            "name": "Identifier",
                            "src": "4955:10:53"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 9999,
                              "type": "bytes32",
                              "value": "role"
                            },
                            "id": 10017,
                            "name": "Identifier",
                            "src": "4966:4:53"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 10001,
                              "type": "address",
                              "value": "account"
                            },
                            "id": 10018,
                            "name": "Identifier",
                            "src": "4972:7:53"
                          }
                        ],
                        "id": 10019,
                        "name": "FunctionCall",
                        "src": "4955:25:53"
                      }
                    ],
                    "id": 10020,
                    "name": "ExpressionStatement",
                    "src": "4955:25:53"
                  }
                ],
                "id": 10021,
                "name": "Block",
                "src": "4829:158:53"
              }
            ],
            "id": 10022,
            "name": "FunctionDefinition",
            "src": "4764:223:53"
          },
          {
            "attributes": {
              "functionSelector": "d547741f",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "revokeRole",
              "overrides": null,
              "scope": 10149,
              "stateMutability": "nonpayable",
              "virtual": true,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "text": " @dev Revokes `role` from `account`.\n If `account` had been granted `role`, emits a {RoleRevoked} event.\n Requirements:\n - the caller must have ``role``'s admin role."
                },
                "id": 10023,
                "name": "StructuredDocumentation",
                "src": "4993:223:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "role",
                      "overrides": null,
                      "scope": 10048,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bytes32",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes32",
                          "type": "bytes32"
                        },
                        "id": 10024,
                        "name": "ElementaryTypeName",
                        "src": "5241:7:53"
                      }
                    ],
                    "id": 10025,
                    "name": "VariableDeclaration",
                    "src": "5241:12:53"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "account",
                      "overrides": null,
                      "scope": 10048,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 10026,
                        "name": "ElementaryTypeName",
                        "src": "5255:7:53"
                      }
                    ],
                    "id": 10027,
                    "name": "VariableDeclaration",
                    "src": "5255:15:53"
                  }
                ],
                "id": 10028,
                "name": "ParameterList",
                "src": "5240:31:53"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 10029,
                "name": "ParameterList",
                "src": "5287:0:53"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "tryCall": false,
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_64344570eab7406ca49d34d38bf2b2496dfda914405390c5057c8b0aabf798a3",
                                  "typeString": "literal_string \"AccessControl: sender must be an admin to revoke\""
                                }
                              ],
                              "overloadedDeclarations": [
                                -18,
                                -18
                              ],
                              "referencedDeclaration": -18,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 10030,
                            "name": "Identifier",
                            "src": "5297:7:53"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "isStructConstructorCall": false,
                              "lValueRequested": false,
                              "names": [
                                null
                              ],
                              "tryCall": false,
                              "type": "bool",
                              "type_conversion": false
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    },
                                    {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  ],
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 9921,
                                  "type": "function (bytes32,address) view returns (bool)",
                                  "value": "hasRole"
                                },
                                "id": 10031,
                                "name": "Identifier",
                                "src": "5305:7:53"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "adminRole",
                                  "referencedDeclaration": 9876,
                                  "type": "bytes32"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "type": "struct AccessControl.RoleData storage ref"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 9881,
                                          "type": "mapping(bytes32 => struct AccessControl.RoleData storage ref)",
                                          "value": "_roles"
                                        },
                                        "id": 10032,
                                        "name": "Identifier",
                                        "src": "5313:6:53"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 10025,
                                          "type": "bytes32",
                                          "value": "role"
                                        },
                                        "id": 10033,
                                        "name": "Identifier",
                                        "src": "5320:4:53"
                                      }
                                    ],
                                    "id": 10034,
                                    "name": "IndexAccess",
                                    "src": "5313:12:53"
                                  }
                                ],
                                "id": 10035,
                                "name": "MemberAccess",
                                "src": "5313:22:53"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    null
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "tryCall": false,
                                  "type": "address payable",
                                  "type_conversion": false
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        null
                                      ],
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 4829,
                                      "type": "function () view returns (address payable)",
                                      "value": "_msgSender"
                                    },
                                    "id": 10036,
                                    "name": "Identifier",
                                    "src": "5337:10:53"
                                  }
                                ],
                                "id": 10037,
                                "name": "FunctionCall",
                                "src": "5337:12:53"
                              }
                            ],
                            "id": 10038,
                            "name": "FunctionCall",
                            "src": "5305:45:53"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b65",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"AccessControl: sender must be an admin to revoke\"",
                              "value": "AccessControl: sender must be an admin to revoke"
                            },
                            "id": 10039,
                            "name": "Literal",
                            "src": "5352:50:53"
                          }
                        ],
                        "id": 10040,
                        "name": "FunctionCall",
                        "src": "5297:106:53"
                      }
                    ],
                    "id": 10041,
                    "name": "ExpressionStatement",
                    "src": "5297:106:53"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "tryCall": false,
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                },
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 10148,
                              "type": "function (bytes32,address)",
                              "value": "_revokeRole"
                            },
                            "id": 10042,
                            "name": "Identifier",
                            "src": "5414:11:53"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 10025,
                              "type": "bytes32",
                              "value": "role"
                            },
                            "id": 10043,
                            "name": "Identifier",
                            "src": "5426:4:53"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 10027,
                              "type": "address",
                              "value": "account"
                            },
                            "id": 10044,
                            "name": "Identifier",
                            "src": "5432:7:53"
                          }
                        ],
                        "id": 10045,
                        "name": "FunctionCall",
                        "src": "5414:26:53"
                      }
                    ],
                    "id": 10046,
                    "name": "ExpressionStatement",
                    "src": "5414:26:53"
                  }
                ],
                "id": 10047,
                "name": "Block",
                "src": "5287:160:53"
              }
            ],
            "id": 10048,
            "name": "FunctionDefinition",
            "src": "5221:226:53"
          },
          {
            "attributes": {
              "functionSelector": "36568abe",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "renounceRole",
              "overrides": null,
              "scope": 10149,
              "stateMutability": "nonpayable",
              "virtual": true,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "text": " @dev Revokes `role` from the calling account.\n Roles are often managed via {grantRole} and {revokeRole}: this function's\n purpose is to provide a mechanism for accounts to lose their privileges\n if they are compromised (such as when a trusted device is misplaced).\n If the calling account had been granted `role`, emits a {RoleRevoked}\n event.\n Requirements:\n - the caller must be `account`."
                },
                "id": 10049,
                "name": "StructuredDocumentation",
                "src": "5453:480:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "role",
                      "overrides": null,
                      "scope": 10070,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bytes32",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes32",
                          "type": "bytes32"
                        },
                        "id": 10050,
                        "name": "ElementaryTypeName",
                        "src": "5960:7:53"
                      }
                    ],
                    "id": 10051,
                    "name": "VariableDeclaration",
                    "src": "5960:12:53"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "account",
                      "overrides": null,
                      "scope": 10070,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 10052,
                        "name": "ElementaryTypeName",
                        "src": "5974:7:53"
                      }
                    ],
                    "id": 10053,
                    "name": "VariableDeclaration",
                    "src": "5974:15:53"
                  }
                ],
                "id": 10054,
                "name": "ParameterList",
                "src": "5959:31:53"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 10055,
                "name": "ParameterList",
                "src": "6006:0:53"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "tryCall": false,
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_fb06fa8ff2141e8ed74502f6792273793f25f0e9d3cf15344f3f5a0d4948fd4b",
                                  "typeString": "literal_string \"AccessControl: can only renounce roles for self\""
                                }
                              ],
                              "overloadedDeclarations": [
                                -18,
                                -18
                              ],
                              "referencedDeclaration": -18,
                              "type": "function (bool,string memory) pure",
                              "value": "require"
                            },
                            "id": 10056,
                            "name": "Identifier",
                            "src": "6016:7:53"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "operator": "==",
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 10053,
                                  "type": "address",
                                  "value": "account"
                                },
                                "id": 10057,
                                "name": "Identifier",
                                "src": "6024:7:53"
                              },
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    null
                                  ],
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "tryCall": false,
                                  "type": "address payable",
                                  "type_conversion": false
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        null
                                      ],
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 4829,
                                      "type": "function () view returns (address payable)",
                                      "value": "_msgSender"
                                    },
                                    "id": 10058,
                                    "name": "Identifier",
                                    "src": "6035:10:53"
                                  }
                                ],
                                "id": 10059,
                                "name": "FunctionCall",
                                "src": "6035:12:53"
                              }
                            ],
                            "id": 10060,
                            "name": "BinaryOperation",
                            "src": "6024:23:53"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "hexvalue": "416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "subdenomination": null,
                              "token": "string",
                              "type": "literal_string \"AccessControl: can only renounce roles for self\"",
                              "value": "AccessControl: can only renounce roles for self"
                            },
                            "id": 10061,
                            "name": "Literal",
                            "src": "6049:49:53"
                          }
                        ],
                        "id": 10062,
                        "name": "FunctionCall",
                        "src": "6016:83:53"
                      }
                    ],
                    "id": 10063,
                    "name": "ExpressionStatement",
                    "src": "6016:83:53"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "tryCall": false,
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                },
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 10148,
                              "type": "function (bytes32,address)",
                              "value": "_revokeRole"
                            },
                            "id": 10064,
                            "name": "Identifier",
                            "src": "6110:11:53"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 10051,
                              "type": "bytes32",
                              "value": "role"
                            },
                            "id": 10065,
                            "name": "Identifier",
                            "src": "6122:4:53"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 10053,
                              "type": "address",
                              "value": "account"
                            },
                            "id": 10066,
                            "name": "Identifier",
                            "src": "6128:7:53"
                          }
                        ],
                        "id": 10067,
                        "name": "FunctionCall",
                        "src": "6110:26:53"
                      }
                    ],
                    "id": 10068,
                    "name": "ExpressionStatement",
                    "src": "6110:26:53"
                  }
                ],
                "id": 10069,
                "name": "Block",
                "src": "6006:137:53"
              }
            ],
            "id": 10070,
            "name": "FunctionDefinition",
            "src": "5938:205:53"
          },
          {
            "attributes": {
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "_setupRole",
              "overrides": null,
              "scope": 10149,
              "stateMutability": "nonpayable",
              "virtual": true,
              "visibility": "internal"
            },
            "children": [
              {
                "attributes": {
                  "text": " @dev Grants `role` to `account`.\n If `account` had not been already granted `role`, emits a {RoleGranted}\n event. Note that unlike {grantRole}, this function doesn't perform any\n checks on the calling account.\n [WARNING]\n ====\n This function should only be called from the constructor when setting\n up the initial roles for the system.\n Using this function in any other way is effectively circumventing the admin\n system imposed by {AccessControl}.\n ===="
                },
                "id": 10071,
                "name": "StructuredDocumentation",
                "src": "6149:554:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "role",
                      "overrides": null,
                      "scope": 10084,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bytes32",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes32",
                          "type": "bytes32"
                        },
                        "id": 10072,
                        "name": "ElementaryTypeName",
                        "src": "6728:7:53"
                      }
                    ],
                    "id": 10073,
                    "name": "VariableDeclaration",
                    "src": "6728:12:53"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "account",
                      "overrides": null,
                      "scope": 10084,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 10074,
                        "name": "ElementaryTypeName",
                        "src": "6742:7:53"
                      }
                    ],
                    "id": 10075,
                    "name": "VariableDeclaration",
                    "src": "6742:15:53"
                  }
                ],
                "id": 10076,
                "name": "ParameterList",
                "src": "6727:31:53"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 10077,
                "name": "ParameterList",
                "src": "6776:0:53"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "tryCall": false,
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                },
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 10124,
                              "type": "function (bytes32,address)",
                              "value": "_grantRole"
                            },
                            "id": 10078,
                            "name": "Identifier",
                            "src": "6786:10:53"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 10073,
                              "type": "bytes32",
                              "value": "role"
                            },
                            "id": 10079,
                            "name": "Identifier",
                            "src": "6797:4:53"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 10075,
                              "type": "address",
                              "value": "account"
                            },
                            "id": 10080,
                            "name": "Identifier",
                            "src": "6803:7:53"
                          }
                        ],
                        "id": 10081,
                        "name": "FunctionCall",
                        "src": "6786:25:53"
                      }
                    ],
                    "id": 10082,
                    "name": "ExpressionStatement",
                    "src": "6786:25:53"
                  }
                ],
                "id": 10083,
                "name": "Block",
                "src": "6776:42:53"
              }
            ],
            "id": 10084,
            "name": "FunctionDefinition",
            "src": "6708:110:53"
          },
          {
            "attributes": {
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "_setRoleAdmin",
              "overrides": null,
              "scope": 10149,
              "stateMutability": "nonpayable",
              "virtual": true,
              "visibility": "internal"
            },
            "children": [
              {
                "attributes": {
                  "text": " @dev Sets `adminRole` as ``role``'s admin role."
                },
                "id": 10085,
                "name": "StructuredDocumentation",
                "src": "6824:66:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "role",
                      "overrides": null,
                      "scope": 10100,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bytes32",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes32",
                          "type": "bytes32"
                        },
                        "id": 10086,
                        "name": "ElementaryTypeName",
                        "src": "6918:7:53"
                      }
                    ],
                    "id": 10087,
                    "name": "VariableDeclaration",
                    "src": "6918:12:53"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "adminRole",
                      "overrides": null,
                      "scope": 10100,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bytes32",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes32",
                          "type": "bytes32"
                        },
                        "id": 10088,
                        "name": "ElementaryTypeName",
                        "src": "6932:7:53"
                      }
                    ],
                    "id": 10089,
                    "name": "VariableDeclaration",
                    "src": "6932:17:53"
                  }
                ],
                "id": 10090,
                "name": "ParameterList",
                "src": "6917:33:53"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 10091,
                "name": "ParameterList",
                "src": "6968:0:53"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "bytes32"
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": true,
                              "member_name": "adminRole",
                              "referencedDeclaration": 9876,
                              "type": "bytes32"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "type": "struct AccessControl.RoleData storage ref"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 9881,
                                      "type": "mapping(bytes32 => struct AccessControl.RoleData storage ref)",
                                      "value": "_roles"
                                    },
                                    "id": 10092,
                                    "name": "Identifier",
                                    "src": "6978:6:53"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 10087,
                                      "type": "bytes32",
                                      "value": "role"
                                    },
                                    "id": 10093,
                                    "name": "Identifier",
                                    "src": "6985:4:53"
                                  }
                                ],
                                "id": 10094,
                                "name": "IndexAccess",
                                "src": "6978:12:53"
                              }
                            ],
                            "id": 10095,
                            "name": "MemberAccess",
                            "src": "6978:22:53"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 10089,
                              "type": "bytes32",
                              "value": "adminRole"
                            },
                            "id": 10096,
                            "name": "Identifier",
                            "src": "7003:9:53"
                          }
                        ],
                        "id": 10097,
                        "name": "Assignment",
                        "src": "6978:34:53"
                      }
                    ],
                    "id": 10098,
                    "name": "ExpressionStatement",
                    "src": "6978:34:53"
                  }
                ],
                "id": 10099,
                "name": "Block",
                "src": "6968:51:53"
              }
            ],
            "id": 10100,
            "name": "FunctionDefinition",
            "src": "6895:124:53"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "_grantRole",
              "overrides": null,
              "scope": 10149,
              "stateMutability": "nonpayable",
              "virtual": false,
              "visibility": "private"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "role",
                      "overrides": null,
                      "scope": 10124,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bytes32",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes32",
                          "type": "bytes32"
                        },
                        "id": 10101,
                        "name": "ElementaryTypeName",
                        "src": "7045:7:53"
                      }
                    ],
                    "id": 10102,
                    "name": "VariableDeclaration",
                    "src": "7045:12:53"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "account",
                      "overrides": null,
                      "scope": 10124,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 10103,
                        "name": "ElementaryTypeName",
                        "src": "7059:7:53"
                      }
                    ],
                    "id": 10104,
                    "name": "VariableDeclaration",
                    "src": "7059:15:53"
                  }
                ],
                "id": 10105,
                "name": "ParameterList",
                "src": "7044:31:53"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 10106,
                "name": "ParameterList",
                "src": "7084:0:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "falseBody": null
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "tryCall": false,
                          "type": "bool",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "add",
                              "referencedDeclaration": 5753,
                              "type": "function (struct EnumerableSet.AddressSet storage pointer,address) returns (bool)"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "members",
                                  "referencedDeclaration": 9874,
                                  "type": "struct EnumerableSet.AddressSet storage ref"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "type": "struct AccessControl.RoleData storage ref"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 9881,
                                          "type": "mapping(bytes32 => struct AccessControl.RoleData storage ref)",
                                          "value": "_roles"
                                        },
                                        "id": 10107,
                                        "name": "Identifier",
                                        "src": "7098:6:53"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 10102,
                                          "type": "bytes32",
                                          "value": "role"
                                        },
                                        "id": 10108,
                                        "name": "Identifier",
                                        "src": "7105:4:53"
                                      }
                                    ],
                                    "id": 10109,
                                    "name": "IndexAccess",
                                    "src": "7098:12:53"
                                  }
                                ],
                                "id": 10110,
                                "name": "MemberAccess",
                                "src": "7098:20:53"
                              }
                            ],
                            "id": 10111,
                            "name": "MemberAccess",
                            "src": "7098:24:53"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 10104,
                              "type": "address",
                              "value": "account"
                            },
                            "id": 10112,
                            "name": "Identifier",
                            "src": "7123:7:53"
                          }
                        ],
                        "id": 10113,
                        "name": "FunctionCall",
                        "src": "7098:33:53"
                      },
                      {
                        "children": [
                          {
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "tryCall": false,
                                  "type": "tuple()",
                                  "type_conversion": false
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        },
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        },
                                        {
                                          "typeIdentifier": "t_address_payable",
                                          "typeString": "address payable"
                                        }
                                      ],
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 9893,
                                      "type": "function (bytes32,address,address)",
                                      "value": "RoleGranted"
                                    },
                                    "id": 10114,
                                    "name": "Identifier",
                                    "src": "7152:11:53"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 10102,
                                      "type": "bytes32",
                                      "value": "role"
                                    },
                                    "id": 10115,
                                    "name": "Identifier",
                                    "src": "7164:4:53"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 10104,
                                      "type": "address",
                                      "value": "account"
                                    },
                                    "id": 10116,
                                    "name": "Identifier",
                                    "src": "7170:7:53"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        null
                                      ],
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "isStructConstructorCall": false,
                                      "lValueRequested": false,
                                      "names": [
                                        null
                                      ],
                                      "tryCall": false,
                                      "type": "address payable",
                                      "type_conversion": false
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": [
                                            null
                                          ],
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 4829,
                                          "type": "function () view returns (address payable)",
                                          "value": "_msgSender"
                                        },
                                        "id": 10117,
                                        "name": "Identifier",
                                        "src": "7179:10:53"
                                      }
                                    ],
                                    "id": 10118,
                                    "name": "FunctionCall",
                                    "src": "7179:12:53"
                                  }
                                ],
                                "id": 10119,
                                "name": "FunctionCall",
                                "src": "7152:40:53"
                              }
                            ],
                            "id": 10120,
                            "name": "EmitStatement",
                            "src": "7147:45:53"
                          }
                        ],
                        "id": 10121,
                        "name": "Block",
                        "src": "7133:70:53"
                      }
                    ],
                    "id": 10122,
                    "name": "IfStatement",
                    "src": "7094:109:53"
                  }
                ],
                "id": 10123,
                "name": "Block",
                "src": "7084:125:53"
              }
            ],
            "id": 10124,
            "name": "FunctionDefinition",
            "src": "7025:184:53"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "_revokeRole",
              "overrides": null,
              "scope": 10149,
              "stateMutability": "nonpayable",
              "virtual": false,
              "visibility": "private"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "role",
                      "overrides": null,
                      "scope": 10148,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bytes32",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes32",
                          "type": "bytes32"
                        },
                        "id": 10125,
                        "name": "ElementaryTypeName",
                        "src": "7236:7:53"
                      }
                    ],
                    "id": 10126,
                    "name": "VariableDeclaration",
                    "src": "7236:12:53"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "account",
                      "overrides": null,
                      "scope": 10148,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 10127,
                        "name": "ElementaryTypeName",
                        "src": "7250:7:53"
                      }
                    ],
                    "id": 10128,
                    "name": "VariableDeclaration",
                    "src": "7250:15:53"
                  }
                ],
                "id": 10129,
                "name": "ParameterList",
                "src": "7235:31:53"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 10130,
                "name": "ParameterList",
                "src": "7275:0:53"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "falseBody": null
                    },
                    "children": [
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "tryCall": false,
                          "type": "bool",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "remove",
                              "referencedDeclaration": 5779,
                              "type": "function (struct EnumerableSet.AddressSet storage pointer,address) returns (bool)"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "member_name": "members",
                                  "referencedDeclaration": 9874,
                                  "type": "struct EnumerableSet.AddressSet storage ref"
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "type": "struct AccessControl.RoleData storage ref"
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 9881,
                                          "type": "mapping(bytes32 => struct AccessControl.RoleData storage ref)",
                                          "value": "_roles"
                                        },
                                        "id": 10131,
                                        "name": "Identifier",
                                        "src": "7289:6:53"
                                      },
                                      {
                                        "attributes": {
                                          "argumentTypes": null,
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 10126,
                                          "type": "bytes32",
                                          "value": "role"
                                        },
                                        "id": 10132,
                                        "name": "Identifier",
                                        "src": "7296:4:53"
                                      }
                                    ],
                                    "id": 10133,
                                    "name": "IndexAccess",
                                    "src": "7289:12:53"
                                  }
                                ],
                                "id": 10134,
                                "name": "MemberAccess",
                                "src": "7289:20:53"
                              }
                            ],
                            "id": 10135,
                            "name": "MemberAccess",
                            "src": "7289:27:53"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 10128,
                              "type": "address",
                              "value": "account"
                            },
                            "id": 10136,
                            "name": "Identifier",
                            "src": "7317:7:53"
                          }
                        ],
                        "id": 10137,
                        "name": "FunctionCall",
                        "src": "7289:36:53"
                      },
                      {
                        "children": [
                          {
                            "children": [
                              {
                                "attributes": {
                                  "argumentTypes": null,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "isStructConstructorCall": false,
                                  "lValueRequested": false,
                                  "names": [
                                    null
                                  ],
                                  "tryCall": false,
                                  "type": "tuple()",
                                  "type_conversion": false
                                },
                                "children": [
                                  {
                                    "attributes": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        },
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        },
                                        {
                                          "typeIdentifier": "t_address_payable",
                                          "typeString": "address payable"
                                        }
                                      ],
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 9902,
                                      "type": "function (bytes32,address,address)",
                                      "value": "RoleRevoked"
                                    },
                                    "id": 10138,
                                    "name": "Identifier",
                                    "src": "7346:11:53"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 10126,
                                      "type": "bytes32",
                                      "value": "role"
                                    },
                                    "id": 10139,
                                    "name": "Identifier",
                                    "src": "7358:4:53"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "overloadedDeclarations": [
                                        null
                                      ],
                                      "referencedDeclaration": 10128,
                                      "type": "address",
                                      "value": "account"
                                    },
                                    "id": 10140,
                                    "name": "Identifier",
                                    "src": "7364:7:53"
                                  },
                                  {
                                    "attributes": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        null
                                      ],
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "isStructConstructorCall": false,
                                      "lValueRequested": false,
                                      "names": [
                                        null
                                      ],
                                      "tryCall": false,
                                      "type": "address payable",
                                      "type_conversion": false
                                    },
                                    "children": [
                                      {
                                        "attributes": {
                                          "argumentTypes": [
                                            null
                                          ],
                                          "overloadedDeclarations": [
                                            null
                                          ],
                                          "referencedDeclaration": 4829,
                                          "type": "function () view returns (address payable)",
                                          "value": "_msgSender"
                                        },
                                        "id": 10141,
                                        "name": "Identifier",
                                        "src": "7373:10:53"
                                      }
                                    ],
                                    "id": 10142,
                                    "name": "FunctionCall",
                                    "src": "7373:12:53"
                                  }
                                ],
                                "id": 10143,
                                "name": "FunctionCall",
                                "src": "7346:40:53"
                              }
                            ],
                            "id": 10144,
                            "name": "EmitStatement",
                            "src": "7341:45:53"
                          }
                        ],
                        "id": 10145,
                        "name": "Block",
                        "src": "7327:70:53"
                      }
                    ],
                    "id": 10146,
                    "name": "IfStatement",
                    "src": "7285:112:53"
                  }
                ],
                "id": 10147,
                "name": "Block",
                "src": "7275:128:53"
              }
            ],
            "id": 10148,
            "name": "FunctionDefinition",
            "src": "7215:188:53"
          }
        ],
        "id": 10149,
        "name": "ContractDefinition",
        "src": "1715:5690:53"
      }
    ],
    "id": 10150,
    "name": "SourceUnit",
    "src": "33:7373:53"
  },
  "compiler": {
    "name": "solc",
    "version": "0.6.12+commit.27d51765.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.4.3",
  "updatedAt": "2021-11-29T02:07:34.167Z",
  "devdoc": {
    "details": "Contract module that allows children to implement role-based access control mechanisms. Roles are referred to by their `bytes32` identifier. These should be exposed in the external API and be unique. The best way to achieve this is by using `public constant` hash digests: ``` bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\"); ``` Roles can be used to represent a set of permissions. To restrict access to a function call, use {hasRole}: ``` function foo() public {     require(hasRole(MY_ROLE, msg.sender));     ... } ``` Roles can be granted and revoked dynamically via the {grantRole} and {revokeRole} functions. Each role has an associated admin role, and only accounts that have a role's admin role can call {grantRole} and {revokeRole}. By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means that only accounts with this role will be able to grant or revoke other roles. More complex role relationships can be created by using {_setRoleAdmin}. WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to grant and revoke this role. Extra precautions should be taken to secure accounts that have been granted it.",
    "events": {
      "RoleGranted(bytes32,address,address)": {
        "details": "Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {_setupRole}."
      },
      "RoleRevoked(bytes32,address,address)": {
        "details": "Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)"
      }
    },
    "kind": "dev",
    "methods": {
      "getRoleAdmin(bytes32)": {
        "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."
      },
      "getRoleMember(bytes32,uint256)": {
        "details": "Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information."
      },
      "getRoleMemberCount(bytes32)": {
        "details": "Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role."
      },
      "getRoleMemberIndex(bytes32,address)": {
        "details": "Returns the index of the account that have `role`."
      },
      "grantRole(bytes32,address)": {
        "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role."
      },
      "hasRole(bytes32,address)": {
        "details": "Returns `true` if `account` has been granted `role`."
      },
      "renounceRole(bytes32,address)": {
        "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`."
      },
      "revokeRole(bytes32,address)": {
        "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role."
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  }
}