{
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "previousAdminRole",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "newAdminRole",
          "type": "bytes32"
        }
      ],
      "name": "RoleAdminChanged",
      "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": "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": "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"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "allSourcePaths": {
    "67": "node_modules/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol",
    "68": "node_modules/@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol",
    "72": "node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol",
    "83": "node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol",
    "86": "node_modules/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol",
    "87": "node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol",
    "88": "node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"
  },
  "ast": {
    "absolutePath": "node_modules/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol",
    "exportedSymbols": {
      "AccessControlUpgradeable": [
        19470
      ],
      "AddressUpgradeable": [
        16246
      ],
      "ContextUpgradeable": [
        26020
      ],
      "ERC165Upgradeable": [
        26312
      ],
      "IAccessControlUpgradeable": [
        26397
      ],
      "IERC165Upgradeable": [
        27269
      ],
      "Initializable": [
        19544
      ],
      "StringsUpgradeable": [
        26268
      ]
    },
    "id": 19471,
    "license": "MIT",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 19143,
        "literals": [
          "solidity",
          "^",
          "0.8",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "108:23:67"
      },
      {
        "absolutePath": "node_modules/@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol",
        "file": "./IAccessControlUpgradeable.sol",
        "id": 19144,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 19471,
        "sourceUnit": 26398,
        "src": "133:41:67",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol",
        "file": "../utils/ContextUpgradeable.sol",
        "id": 19145,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 19471,
        "sourceUnit": 26021,
        "src": "175:41:67",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "node_modules/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol",
        "file": "../utils/StringsUpgradeable.sol",
        "id": 19146,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 19471,
        "sourceUnit": 26269,
        "src": "217:41:67",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol",
        "file": "../utils/introspection/ERC165Upgradeable.sol",
        "id": 19147,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 19471,
        "sourceUnit": 26313,
        "src": "259:54:67",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol",
        "file": "../proxy/utils/Initializable.sol",
        "id": 19148,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 19471,
        "sourceUnit": 19545,
        "src": "314:42:67",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": true,
        "baseContracts": [
          {
            "baseName": {
              "id": 19150,
              "name": "Initializable",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 19544,
              "src": "1939:13:67"
            },
            "id": 19151,
            "nodeType": "InheritanceSpecifier",
            "src": "1939:13:67"
          },
          {
            "baseName": {
              "id": 19152,
              "name": "ContextUpgradeable",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 26020,
              "src": "1954:18:67"
            },
            "id": 19153,
            "nodeType": "InheritanceSpecifier",
            "src": "1954:18:67"
          },
          {
            "baseName": {
              "id": 19154,
              "name": "IAccessControlUpgradeable",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 26397,
              "src": "1974:25:67"
            },
            "id": 19155,
            "nodeType": "InheritanceSpecifier",
            "src": "1974:25:67"
          },
          {
            "baseName": {
              "id": 19156,
              "name": "ERC165Upgradeable",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 26312,
              "src": "2001:17:67"
            },
            "id": 19157,
            "nodeType": "InheritanceSpecifier",
            "src": "2001:17:67"
          }
        ],
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 19149,
          "nodeType": "StructuredDocumentation",
          "src": "358:1534:67",
          "text": " @dev Contract module that allows children to implement role-based access\n control mechanisms. This is a lightweight version that doesn't allow enumerating role\n members except through off-chain means by accessing the contract event logs. Some\n applications may benefit from on-chain enumerability, for those cases see\n {AccessControlEnumerable}.\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": 19470,
        "linearizedBaseContracts": [
          19470,
          26312,
          27269,
          26397,
          26020,
          19544
        ],
        "name": "AccessControlUpgradeable",
        "nameLocation": "1911:24:67",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": {
              "id": 19162,
              "nodeType": "Block",
              "src": "2083:7:67",
              "statements": []
            },
            "id": 19163,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 19160,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 19159,
                  "name": "onlyInitializing",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 19528,
                  "src": "2066:16:67"
                },
                "nodeType": "ModifierInvocation",
                "src": "2066:16:67"
              }
            ],
            "name": "__AccessControl_init",
            "nameLocation": "2034:20:67",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 19158,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2054:2:67"
            },
            "returnParameters": {
              "id": 19161,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2083:0:67"
            },
            "scope": 19470,
            "src": "2025:65:67",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 19168,
              "nodeType": "Block",
              "src": "2164:7:67",
              "statements": []
            },
            "id": 19169,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 19166,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 19165,
                  "name": "onlyInitializing",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 19528,
                  "src": "2147:16:67"
                },
                "nodeType": "ModifierInvocation",
                "src": "2147:16:67"
              }
            ],
            "name": "__AccessControl_init_unchained",
            "nameLocation": "2105:30:67",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 19164,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2135:2:67"
            },
            "returnParameters": {
              "id": 19167,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2164:0:67"
            },
            "scope": 19470,
            "src": "2096:75:67",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "canonicalName": "AccessControlUpgradeable.RoleData",
            "id": 19176,
            "members": [
              {
                "constant": false,
                "id": 19173,
                "mutability": "mutable",
                "name": "members",
                "nameLocation": "2227:7:67",
                "nodeType": "VariableDeclaration",
                "scope": 19176,
                "src": "2202:32:67",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                  "typeString": "mapping(address => bool)"
                },
                "typeName": {
                  "id": 19172,
                  "keyType": {
                    "id": 19170,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2210:7:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "Mapping",
                  "src": "2202:24:67",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                    "typeString": "mapping(address => bool)"
                  },
                  "valueType": {
                    "id": 19171,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2221:4:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  }
                },
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 19175,
                "mutability": "mutable",
                "name": "adminRole",
                "nameLocation": "2252:9:67",
                "nodeType": "VariableDeclaration",
                "scope": 19176,
                "src": "2244:17:67",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_bytes32",
                  "typeString": "bytes32"
                },
                "typeName": {
                  "id": 19174,
                  "name": "bytes32",
                  "nodeType": "ElementaryTypeName",
                  "src": "2244:7:67",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  }
                },
                "visibility": "internal"
              }
            ],
            "name": "RoleData",
            "nameLocation": "2183:8:67",
            "nodeType": "StructDefinition",
            "scope": 19470,
            "src": "2176:92:67",
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 19181,
            "mutability": "mutable",
            "name": "_roles",
            "nameLocation": "2311:6:67",
            "nodeType": "VariableDeclaration",
            "scope": 19470,
            "src": "2274:43:67",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$19176_storage_$",
              "typeString": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)"
            },
            "typeName": {
              "id": 19180,
              "keyType": {
                "id": 19177,
                "name": "bytes32",
                "nodeType": "ElementaryTypeName",
                "src": "2282:7:67",
                "typeDescriptions": {
                  "typeIdentifier": "t_bytes32",
                  "typeString": "bytes32"
                }
              },
              "nodeType": "Mapping",
              "src": "2274:28:67",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$19176_storage_$",
                "typeString": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)"
              },
              "valueType": {
                "id": 19179,
                "nodeType": "UserDefinedTypeName",
                "pathNode": {
                  "id": 19178,
                  "name": "RoleData",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 19176,
                  "src": "2293:8:67"
                },
                "referencedDeclaration": 19176,
                "src": "2293:8:67",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_RoleData_$19176_storage_ptr",
                  "typeString": "struct AccessControlUpgradeable.RoleData"
                }
              }
            },
            "visibility": "private"
          },
          {
            "constant": true,
            "functionSelector": "a217fddf",
            "id": 19184,
            "mutability": "constant",
            "name": "DEFAULT_ADMIN_ROLE",
            "nameLocation": "2348:18:67",
            "nodeType": "VariableDeclaration",
            "scope": 19470,
            "src": "2324:49:67",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bytes32",
              "typeString": "bytes32"
            },
            "typeName": {
              "id": 19182,
              "name": "bytes32",
              "nodeType": "ElementaryTypeName",
              "src": "2324:7:67",
              "typeDescriptions": {
                "typeIdentifier": "t_bytes32",
                "typeString": "bytes32"
              }
            },
            "value": {
              "hexValue": "30783030",
              "id": 19183,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "2369:4:67",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_0_by_1",
                "typeString": "int_const 0"
              },
              "value": "0x00"
            },
            "visibility": "public"
          },
          {
            "body": {
              "id": 19196,
              "nodeType": "Block",
              "src": "2792:58:67",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 19190,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19187,
                        "src": "2813:4:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 19191,
                          "name": "_msgSender",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 26005,
                          "src": "2819:10:67",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                            "typeString": "function () view returns (address)"
                          }
                        },
                        "id": 19192,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2819:12:67",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 19189,
                      "name": "_checkRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19281,
                      "src": "2802:10:67",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address) view"
                      }
                    },
                    "id": 19193,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2802:30:67",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19194,
                  "nodeType": "ExpressionStatement",
                  "src": "2802:30:67"
                },
                {
                  "id": 19195,
                  "nodeType": "PlaceholderStatement",
                  "src": "2842:1:67"
                }
              ]
            },
            "documentation": {
              "id": 19185,
              "nodeType": "StructuredDocumentation",
              "src": "2380:375:67",
              "text": " @dev Modifier that checks that an account has a specific role. Reverts\n with a standardized message including the required role.\n The format of the revert reason is given by the following regular expression:\n  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n _Available since v4.1._"
            },
            "id": 19197,
            "name": "onlyRole",
            "nameLocation": "2769:8:67",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 19188,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19187,
                  "mutability": "mutable",
                  "name": "role",
                  "nameLocation": "2786:4:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19197,
                  "src": "2778:12:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 19186,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2778:7:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2777:14:67"
            },
            "src": "2760:90:67",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              26306
            ],
            "body": {
              "id": 19218,
              "nodeType": "Block",
              "src": "3008:122:67",
              "statements": [
                {
                  "expression": {
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 19216,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "commonType": {
                        "typeIdentifier": "t_bytes4",
                        "typeString": "bytes4"
                      },
                      "id": 19211,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "id": 19206,
                        "name": "interfaceId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19200,
                        "src": "3025:11:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "==",
                      "rightExpression": {
                        "expression": {
                          "arguments": [
                            {
                              "id": 19208,
                              "name": "IAccessControlUpgradeable",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 26397,
                              "src": "3045:25:67",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_IAccessControlUpgradeable_$26397_$",
                                "typeString": "type(contract IAccessControlUpgradeable)"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_type$_t_contract$_IAccessControlUpgradeable_$26397_$",
                                "typeString": "type(contract IAccessControlUpgradeable)"
                              }
                            ],
                            "id": 19207,
                            "name": "type",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -27,
                            "src": "3040:4:67",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_metatype_pure$__$returns$__$",
                              "typeString": "function () pure"
                            }
                          },
                          "id": 19209,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3040:31:67",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_meta_type_t_contract$_IAccessControlUpgradeable_$26397",
                            "typeString": "type(contract IAccessControlUpgradeable)"
                          }
                        },
                        "id": 19210,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "memberName": "interfaceId",
                        "nodeType": "MemberAccess",
                        "src": "3040:43:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      },
                      "src": "3025:58:67",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "||",
                    "rightExpression": {
                      "arguments": [
                        {
                          "id": 19214,
                          "name": "interfaceId",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19200,
                          "src": "3111:11:67",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        ],
                        "expression": {
                          "id": 19212,
                          "name": "super",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -25,
                          "src": "3087:5:67",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_super$_AccessControlUpgradeable_$19470_$",
                            "typeString": "type(contract super AccessControlUpgradeable)"
                          }
                        },
                        "id": 19213,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "supportsInterface",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 26306,
                        "src": "3087:23:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_bytes4_$returns$_t_bool_$",
                          "typeString": "function (bytes4) view returns (bool)"
                        }
                      },
                      "id": 19215,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3087:36:67",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "3025:98:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 19205,
                  "id": 19217,
                  "nodeType": "Return",
                  "src": "3018:105:67"
                }
              ]
            },
            "documentation": {
              "id": 19198,
              "nodeType": "StructuredDocumentation",
              "src": "2856:56:67",
              "text": " @dev See {IERC165-supportsInterface}."
            },
            "functionSelector": "01ffc9a7",
            "id": 19219,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "supportsInterface",
            "nameLocation": "2926:17:67",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19202,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2984:8:67"
            },
            "parameters": {
              "id": 19201,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19200,
                  "mutability": "mutable",
                  "name": "interfaceId",
                  "nameLocation": "2951:11:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19219,
                  "src": "2944:18:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 19199,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "2944:6:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2943:20:67"
            },
            "returnParameters": {
              "id": 19205,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19204,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 19219,
                  "src": "3002:4:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 19203,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3002:4:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3001:6:67"
            },
            "scope": 19470,
            "src": "2917:213:67",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              26364
            ],
            "body": {
              "id": 19237,
              "nodeType": "Block",
              "src": "3309:53:67",
              "statements": [
                {
                  "expression": {
                    "baseExpression": {
                      "expression": {
                        "baseExpression": {
                          "id": 19230,
                          "name": "_roles",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19181,
                          "src": "3326:6:67",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$19176_storage_$",
                            "typeString": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData storage ref)"
                          }
                        },
                        "id": 19232,
                        "indexExpression": {
                          "id": 19231,
                          "name": "role",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19222,
                          "src": "3333:4:67",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "3326:12:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_RoleData_$19176_storage",
                          "typeString": "struct AccessControlUpgradeable.RoleData storage ref"
                        }
                      },
                      "id": 19233,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "members",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 19173,
                      "src": "3326:20:67",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                        "typeString": "mapping(address => bool)"
                      }
                    },
                    "id": 19235,
                    "indexExpression": {
                      "id": 19234,
                      "name": "account",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19224,
                      "src": "3347:7:67",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "3326:29:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 19229,
                  "id": 19236,
                  "nodeType": "Return",
                  "src": "3319:36:67"
                }
              ]
            },
            "documentation": {
              "id": 19220,
              "nodeType": "StructuredDocumentation",
              "src": "3136:76:67",
              "text": " @dev Returns `true` if `account` has been granted `role`."
            },
            "functionSelector": "91d14854",
            "id": 19238,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "hasRole",
            "nameLocation": "3226:7:67",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19226,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "3285:8:67"
            },
            "parameters": {
              "id": 19225,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19222,
                  "mutability": "mutable",
                  "name": "role",
                  "nameLocation": "3242:4:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19238,
                  "src": "3234:12:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 19221,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "3234:7:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19224,
                  "mutability": "mutable",
                  "name": "account",
                  "nameLocation": "3256:7:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19238,
                  "src": "3248:15:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19223,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3248:7:67",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3233:31:67"
            },
            "returnParameters": {
              "id": 19229,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19228,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 19238,
                  "src": "3303:4:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 19227,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3303:4:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3302:6:67"
            },
            "scope": 19470,
            "src": "3217:145:67",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19280,
              "nodeType": "Block",
              "src": "3716:441:67",
              "statements": [
                {
                  "condition": {
                    "id": 19250,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "!",
                    "prefix": true,
                    "src": "3730:23:67",
                    "subExpression": {
                      "arguments": [
                        {
                          "id": 19247,
                          "name": "role",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19241,
                          "src": "3739:4:67",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        {
                          "id": 19248,
                          "name": "account",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19243,
                          "src": "3745:7:67",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          },
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "id": 19246,
                        "name": "hasRole",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19238,
                        "src": "3731:7:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_address_$returns$_t_bool_$",
                          "typeString": "function (bytes32,address) view returns (bool)"
                        }
                      },
                      "id": 19249,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3731:22:67",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 19279,
                  "nodeType": "IfStatement",
                  "src": "3726:425:67",
                  "trueBody": {
                    "id": 19278,
                    "nodeType": "Block",
                    "src": "3755:396:67",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "arguments": [
                                {
                                  "arguments": [
                                    {
                                      "hexValue": "416363657373436f6e74726f6c3a206163636f756e7420",
                                      "id": 19256,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "string",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "3863:25:67",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_stringliteral_da0d07ce4a2849fbfc4cb9d6f939e9bd93016c372ca4a5ff14fe06caf3d67874",
                                        "typeString": "literal_string \"AccessControl: account \""
                                      },
                                      "value": "AccessControl: account "
                                    },
                                    {
                                      "arguments": [
                                        {
                                          "arguments": [
                                            {
                                              "id": 19261,
                                              "name": "account",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 19243,
                                              "src": "3953:7:67",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            ],
                                            "id": 19260,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "ElementaryTypeNameExpression",
                                            "src": "3945:7:67",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_uint160_$",
                                              "typeString": "type(uint160)"
                                            },
                                            "typeName": {
                                              "id": 19259,
                                              "name": "uint160",
                                              "nodeType": "ElementaryTypeName",
                                              "src": "3945:7:67",
                                              "typeDescriptions": {}
                                            }
                                          },
                                          "id": 19262,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "3945:16:67",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint160",
                                            "typeString": "uint160"
                                          }
                                        },
                                        {
                                          "hexValue": "3230",
                                          "id": 19263,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "3963:2:67",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_20_by_1",
                                            "typeString": "int_const 20"
                                          },
                                          "value": "20"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint160",
                                            "typeString": "uint160"
                                          },
                                          {
                                            "typeIdentifier": "t_rational_20_by_1",
                                            "typeString": "int_const 20"
                                          }
                                        ],
                                        "expression": {
                                          "id": 19257,
                                          "name": "StringsUpgradeable",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 26268,
                                          "src": "3914:18:67",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_contract$_StringsUpgradeable_$26268_$",
                                            "typeString": "type(library StringsUpgradeable)"
                                          }
                                        },
                                        "id": 19258,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "toHexString",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 26267,
                                        "src": "3914:30:67",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_string_memory_ptr_$",
                                          "typeString": "function (uint256,uint256) pure returns (string memory)"
                                        }
                                      },
                                      "id": 19264,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "3914:52:67",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string memory"
                                      }
                                    },
                                    {
                                      "hexValue": "206973206d697373696e6720726f6c6520",
                                      "id": 19265,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "string",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "3992:19:67",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_stringliteral_f986ce851518a691bccd44ea42a5a185d1b866ef6cb07984a09b81694d20ab69",
                                        "typeString": "literal_string \" is missing role \""
                                      },
                                      "value": " is missing role "
                                    },
                                    {
                                      "arguments": [
                                        {
                                          "arguments": [
                                            {
                                              "id": 19270,
                                              "name": "role",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 19241,
                                              "src": "4076:4:67",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_bytes32",
                                                "typeString": "bytes32"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_bytes32",
                                                "typeString": "bytes32"
                                              }
                                            ],
                                            "id": 19269,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "ElementaryTypeNameExpression",
                                            "src": "4068:7:67",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_uint256_$",
                                              "typeString": "type(uint256)"
                                            },
                                            "typeName": {
                                              "id": 19268,
                                              "name": "uint256",
                                              "nodeType": "ElementaryTypeName",
                                              "src": "4068:7:67",
                                              "typeDescriptions": {}
                                            }
                                          },
                                          "id": 19271,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "4068:13:67",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        {
                                          "hexValue": "3332",
                                          "id": 19272,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "4083:2:67",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_32_by_1",
                                            "typeString": "int_const 32"
                                          },
                                          "value": "32"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          {
                                            "typeIdentifier": "t_rational_32_by_1",
                                            "typeString": "int_const 32"
                                          }
                                        ],
                                        "expression": {
                                          "id": 19266,
                                          "name": "StringsUpgradeable",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 26268,
                                          "src": "4037:18:67",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_contract$_StringsUpgradeable_$26268_$",
                                            "typeString": "type(library StringsUpgradeable)"
                                          }
                                        },
                                        "id": 19267,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "toHexString",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 26267,
                                        "src": "4037:30:67",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_string_memory_ptr_$",
                                          "typeString": "function (uint256,uint256) pure returns (string memory)"
                                        }
                                      },
                                      "id": 19273,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "4037:49:67",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string memory"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_stringliteral_da0d07ce4a2849fbfc4cb9d6f939e9bd93016c372ca4a5ff14fe06caf3d67874",
                                        "typeString": "literal_string \"AccessControl: account \""
                                      },
                                      {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string memory"
                                      },
                                      {
                                        "typeIdentifier": "t_stringliteral_f986ce851518a691bccd44ea42a5a185d1b866ef6cb07984a09b81694d20ab69",
                                        "typeString": "literal_string \" is missing role \""
                                      },
                                      {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string memory"
                                      }
                                    ],
                                    "expression": {
                                      "id": 19254,
                                      "name": "abi",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -1,
                                      "src": "3821:3:67",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_magic_abi",
                                        "typeString": "abi"
                                      }
                                    },
                                    "id": 19255,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "memberName": "encodePacked",
                                    "nodeType": "MemberAccess",
                                    "src": "3821:16:67",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                                      "typeString": "function () pure returns (bytes memory)"
                                    }
                                  },
                                  "id": 19274,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "3821:287:67",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                ],
                                "id": 19253,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "3793:6:67",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_string_storage_ptr_$",
                                  "typeString": "type(string storage pointer)"
                                },
                                "typeName": {
                                  "id": 19252,
                                  "name": "string",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "3793:6:67",
                                  "typeDescriptions": {}
                                }
                              },
                              "id": 19275,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3793:333:67",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 19251,
                            "name": "revert",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -19,
                              -19
                            ],
                            "referencedDeclaration": -19,
                            "src": "3769:6:67",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (string memory) pure"
                            }
                          },
                          "id": 19276,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3769:371:67",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19277,
                        "nodeType": "ExpressionStatement",
                        "src": "3769:371:67"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 19239,
              "nodeType": "StructuredDocumentation",
              "src": "3368:270:67",
              "text": " @dev Revert with a standard message if `account` is missing `role`.\n The format of the revert reason is given by the following regular expression:\n  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/"
            },
            "id": 19281,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_checkRole",
            "nameLocation": "3652:10:67",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 19244,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19241,
                  "mutability": "mutable",
                  "name": "role",
                  "nameLocation": "3671:4:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19281,
                  "src": "3663:12:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 19240,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "3663:7:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19243,
                  "mutability": "mutable",
                  "name": "account",
                  "nameLocation": "3685:7:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19281,
                  "src": "3677:15:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19242,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3677:7:67",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3662:31:67"
            },
            "returnParameters": {
              "id": 19245,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3716:0:67"
            },
            "scope": 19470,
            "src": "3643:514:67",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              26372
            ],
            "body": {
              "id": 19295,
              "nodeType": "Block",
              "src": "4421:46:67",
              "statements": [
                {
                  "expression": {
                    "expression": {
                      "baseExpression": {
                        "id": 19290,
                        "name": "_roles",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19181,
                        "src": "4438:6:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$19176_storage_$",
                          "typeString": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData storage ref)"
                        }
                      },
                      "id": 19292,
                      "indexExpression": {
                        "id": 19291,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19284,
                        "src": "4445:4:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "4438:12:67",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_RoleData_$19176_storage",
                        "typeString": "struct AccessControlUpgradeable.RoleData storage ref"
                      }
                    },
                    "id": 19293,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "adminRole",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 19175,
                    "src": "4438:22:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "functionReturnParameters": 19289,
                  "id": 19294,
                  "nodeType": "Return",
                  "src": "4431:29:67"
                }
              ]
            },
            "documentation": {
              "id": 19282,
              "nodeType": "StructuredDocumentation",
              "src": "4163:170:67",
              "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": 19296,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getRoleAdmin",
            "nameLocation": "4347:12:67",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19286,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "4394:8:67"
            },
            "parameters": {
              "id": 19285,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19284,
                  "mutability": "mutable",
                  "name": "role",
                  "nameLocation": "4368:4:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19296,
                  "src": "4360:12:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 19283,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4360:7:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4359:14:67"
            },
            "returnParameters": {
              "id": 19289,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19288,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 19296,
                  "src": "4412:7:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 19287,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4412:7:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4411:9:67"
            },
            "scope": 19470,
            "src": "4338:129:67",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              26380
            ],
            "body": {
              "id": 19315,
              "nodeType": "Block",
              "src": "4820:42:67",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 19311,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19299,
                        "src": "4841:4:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 19312,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19301,
                        "src": "4847:7:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 19310,
                      "name": "_grantRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19433,
                      "src": "4830:10:67",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address)"
                      }
                    },
                    "id": 19313,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4830:25:67",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19314,
                  "nodeType": "ExpressionStatement",
                  "src": "4830:25:67"
                }
              ]
            },
            "documentation": {
              "id": 19297,
              "nodeType": "StructuredDocumentation",
              "src": "4473:239:67",
              "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": 19316,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": [
                  {
                    "arguments": [
                      {
                        "id": 19306,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19299,
                        "src": "4813:4:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      ],
                      "id": 19305,
                      "name": "getRoleAdmin",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19296,
                      "src": "4800:12:67",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$",
                        "typeString": "function (bytes32) view returns (bytes32)"
                      }
                    },
                    "id": 19307,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4800:18:67",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  }
                ],
                "id": 19308,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 19304,
                  "name": "onlyRole",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 19197,
                  "src": "4791:8:67"
                },
                "nodeType": "ModifierInvocation",
                "src": "4791:28:67"
              }
            ],
            "name": "grantRole",
            "nameLocation": "4726:9:67",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19303,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "4782:8:67"
            },
            "parameters": {
              "id": 19302,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19299,
                  "mutability": "mutable",
                  "name": "role",
                  "nameLocation": "4744:4:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19316,
                  "src": "4736:12:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 19298,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4736:7:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19301,
                  "mutability": "mutable",
                  "name": "account",
                  "nameLocation": "4758:7:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19316,
                  "src": "4750:15:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19300,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4750:7:67",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4735:31:67"
            },
            "returnParameters": {
              "id": 19309,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4820:0:67"
            },
            "scope": 19470,
            "src": "4717:145:67",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              26388
            ],
            "body": {
              "id": 19335,
              "nodeType": "Block",
              "src": "5200:43:67",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 19331,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19319,
                        "src": "5222:4:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 19332,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19321,
                        "src": "5228:7:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 19330,
                      "name": "_revokeRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19464,
                      "src": "5210:11:67",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address)"
                      }
                    },
                    "id": 19333,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5210:26:67",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19334,
                  "nodeType": "ExpressionStatement",
                  "src": "5210:26:67"
                }
              ]
            },
            "documentation": {
              "id": 19317,
              "nodeType": "StructuredDocumentation",
              "src": "4868:223:67",
              "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": 19336,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": [
                  {
                    "arguments": [
                      {
                        "id": 19326,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19319,
                        "src": "5193:4:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      ],
                      "id": 19325,
                      "name": "getRoleAdmin",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19296,
                      "src": "5180:12:67",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$",
                        "typeString": "function (bytes32) view returns (bytes32)"
                      }
                    },
                    "id": 19327,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5180:18:67",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  }
                ],
                "id": 19328,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 19324,
                  "name": "onlyRole",
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 19197,
                  "src": "5171:8:67"
                },
                "nodeType": "ModifierInvocation",
                "src": "5171:28:67"
              }
            ],
            "name": "revokeRole",
            "nameLocation": "5105:10:67",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19323,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "5162:8:67"
            },
            "parameters": {
              "id": 19322,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19319,
                  "mutability": "mutable",
                  "name": "role",
                  "nameLocation": "5124:4:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19336,
                  "src": "5116:12:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 19318,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5116:7:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19321,
                  "mutability": "mutable",
                  "name": "account",
                  "nameLocation": "5138:7:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19336,
                  "src": "5130:15:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19320,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5130:7:67",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5115:31:67"
            },
            "returnParameters": {
              "id": 19329,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5200:0:67"
            },
            "scope": 19470,
            "src": "5096:147:67",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              26396
            ],
            "body": {
              "id": 19358,
              "nodeType": "Block",
              "src": "5811:137:67",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 19349,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 19346,
                          "name": "account",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19341,
                          "src": "5829:7:67",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 19347,
                            "name": "_msgSender",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 26005,
                            "src": "5840:10:67",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                              "typeString": "function () view returns (address)"
                            }
                          },
                          "id": 19348,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5840:12:67",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "5829:23:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66",
                        "id": 19350,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "5854:49:67",
                        "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": 19345,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "5821:7:67",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 19351,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5821:83:67",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19352,
                  "nodeType": "ExpressionStatement",
                  "src": "5821:83:67"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 19354,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19339,
                        "src": "5927:4:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 19355,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19341,
                        "src": "5933:7:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 19353,
                      "name": "_revokeRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19464,
                      "src": "5915:11:67",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address)"
                      }
                    },
                    "id": 19356,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5915:26:67",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19357,
                  "nodeType": "ExpressionStatement",
                  "src": "5915:26:67"
                }
              ]
            },
            "documentation": {
              "id": 19337,
              "nodeType": "StructuredDocumentation",
              "src": "5249:480:67",
              "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 revoked `role`, emits a {RoleRevoked}\n event.\n Requirements:\n - the caller must be `account`."
            },
            "functionSelector": "36568abe",
            "id": 19359,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "renounceRole",
            "nameLocation": "5743:12:67",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19343,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "5802:8:67"
            },
            "parameters": {
              "id": 19342,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19339,
                  "mutability": "mutable",
                  "name": "role",
                  "nameLocation": "5764:4:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19359,
                  "src": "5756:12:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 19338,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5756:7:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19341,
                  "mutability": "mutable",
                  "name": "account",
                  "nameLocation": "5778:7:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19359,
                  "src": "5770:15:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19340,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5770:7:67",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5755:31:67"
            },
            "returnParameters": {
              "id": 19344,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5811:0:67"
            },
            "scope": 19470,
            "src": "5734:214:67",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19372,
              "nodeType": "Block",
              "src": "6655:42:67",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 19368,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19362,
                        "src": "6676:4:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 19369,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19364,
                        "src": "6682:7:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 19367,
                      "name": "_grantRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19433,
                      "src": "6665:10:67",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (bytes32,address)"
                      }
                    },
                    "id": 19370,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6665:25:67",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19371,
                  "nodeType": "ExpressionStatement",
                  "src": "6665:25:67"
                }
              ]
            },
            "documentation": {
              "id": 19360,
              "nodeType": "StructuredDocumentation",
              "src": "5954:628:67",
              "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 ====\n NOTE: This function is deprecated in favor of {_grantRole}."
            },
            "id": 19373,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_setupRole",
            "nameLocation": "6596:10:67",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 19365,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19362,
                  "mutability": "mutable",
                  "name": "role",
                  "nameLocation": "6615:4:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19373,
                  "src": "6607:12:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 19361,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "6607:7:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19364,
                  "mutability": "mutable",
                  "name": "account",
                  "nameLocation": "6629:7:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19373,
                  "src": "6621:15:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19363,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6621:7:67",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6606:31:67"
            },
            "returnParameters": {
              "id": 19366,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6655:0:67"
            },
            "scope": 19470,
            "src": "6587:110:67",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 19400,
              "nodeType": "Block",
              "src": "6895:174:67",
              "statements": [
                {
                  "assignments": [
                    19382
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 19382,
                      "mutability": "mutable",
                      "name": "previousAdminRole",
                      "nameLocation": "6913:17:67",
                      "nodeType": "VariableDeclaration",
                      "scope": 19400,
                      "src": "6905:25:67",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      },
                      "typeName": {
                        "id": 19381,
                        "name": "bytes32",
                        "nodeType": "ElementaryTypeName",
                        "src": "6905:7:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 19386,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 19384,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19376,
                        "src": "6946:4:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      ],
                      "id": 19383,
                      "name": "getRoleAdmin",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19296,
                      "src": "6933:12:67",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$",
                        "typeString": "function (bytes32) view returns (bytes32)"
                      }
                    },
                    "id": 19385,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6933:18:67",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "6905:46:67"
                },
                {
                  "expression": {
                    "id": 19392,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 19387,
                          "name": "_roles",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19181,
                          "src": "6961:6:67",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$19176_storage_$",
                            "typeString": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData storage ref)"
                          }
                        },
                        "id": 19389,
                        "indexExpression": {
                          "id": 19388,
                          "name": "role",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19376,
                          "src": "6968:4:67",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "6961:12:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_RoleData_$19176_storage",
                          "typeString": "struct AccessControlUpgradeable.RoleData storage ref"
                        }
                      },
                      "id": 19390,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "adminRole",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 19175,
                      "src": "6961:22:67",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 19391,
                      "name": "adminRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19378,
                      "src": "6986:9:67",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "src": "6961:34:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "id": 19393,
                  "nodeType": "ExpressionStatement",
                  "src": "6961:34:67"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 19395,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19376,
                        "src": "7027:4:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 19396,
                        "name": "previousAdminRole",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19382,
                        "src": "7033:17:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 19397,
                        "name": "adminRole",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19378,
                        "src": "7052:9:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      ],
                      "id": 19394,
                      "name": "RoleAdminChanged",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 26336,
                      "src": "7010:16:67",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_bytes32_$_t_bytes32_$returns$__$",
                        "typeString": "function (bytes32,bytes32,bytes32)"
                      }
                    },
                    "id": 19398,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7010:52:67",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19399,
                  "nodeType": "EmitStatement",
                  "src": "7005:57:67"
                }
              ]
            },
            "documentation": {
              "id": 19374,
              "nodeType": "StructuredDocumentation",
              "src": "6703:114:67",
              "text": " @dev Sets `adminRole` as ``role``'s admin role.\n Emits a {RoleAdminChanged} event."
            },
            "id": 19401,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_setRoleAdmin",
            "nameLocation": "6831:13:67",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 19379,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19376,
                  "mutability": "mutable",
                  "name": "role",
                  "nameLocation": "6853:4:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19401,
                  "src": "6845:12:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 19375,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "6845:7:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19378,
                  "mutability": "mutable",
                  "name": "adminRole",
                  "nameLocation": "6867:9:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19401,
                  "src": "6859:17:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 19377,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "6859:7:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6844:33:67"
            },
            "returnParameters": {
              "id": 19380,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6895:0:67"
            },
            "scope": 19470,
            "src": "6822:247:67",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 19432,
              "nodeType": "Block",
              "src": "7259:165:67",
              "statements": [
                {
                  "condition": {
                    "id": 19413,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "!",
                    "prefix": true,
                    "src": "7273:23:67",
                    "subExpression": {
                      "arguments": [
                        {
                          "id": 19410,
                          "name": "role",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19404,
                          "src": "7282:4:67",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        {
                          "id": 19411,
                          "name": "account",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19406,
                          "src": "7288:7:67",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          },
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "id": 19409,
                        "name": "hasRole",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19238,
                        "src": "7274:7:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_address_$returns$_t_bool_$",
                          "typeString": "function (bytes32,address) view returns (bool)"
                        }
                      },
                      "id": 19412,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "7274:22:67",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 19431,
                  "nodeType": "IfStatement",
                  "src": "7269:149:67",
                  "trueBody": {
                    "id": 19430,
                    "nodeType": "Block",
                    "src": "7298:120:67",
                    "statements": [
                      {
                        "expression": {
                          "id": 19421,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "baseExpression": {
                              "expression": {
                                "baseExpression": {
                                  "id": 19414,
                                  "name": "_roles",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19181,
                                  "src": "7312:6:67",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$19176_storage_$",
                                    "typeString": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData storage ref)"
                                  }
                                },
                                "id": 19416,
                                "indexExpression": {
                                  "id": 19415,
                                  "name": "role",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19404,
                                  "src": "7319:4:67",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "7312:12:67",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_RoleData_$19176_storage",
                                  "typeString": "struct AccessControlUpgradeable.RoleData storage ref"
                                }
                              },
                              "id": 19417,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "members",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 19173,
                              "src": "7312:20:67",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                                "typeString": "mapping(address => bool)"
                              }
                            },
                            "id": 19419,
                            "indexExpression": {
                              "id": 19418,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 19406,
                              "src": "7333:7:67",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "7312:29:67",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "hexValue": "74727565",
                            "id": 19420,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "bool",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "7344:4:67",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "value": "true"
                          },
                          "src": "7312:36:67",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 19422,
                        "nodeType": "ExpressionStatement",
                        "src": "7312:36:67"
                      },
                      {
                        "eventCall": {
                          "arguments": [
                            {
                              "id": 19424,
                              "name": "role",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 19404,
                              "src": "7379:4:67",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "id": 19425,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 19406,
                              "src": "7385:7:67",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 19426,
                                "name": "_msgSender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 26005,
                                "src": "7394:10:67",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                                  "typeString": "function () view returns (address)"
                                }
                              },
                              "id": 19427,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7394:12:67",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 19423,
                            "name": "RoleGranted",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 26345,
                            "src": "7367:11:67",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$returns$__$",
                              "typeString": "function (bytes32,address,address)"
                            }
                          },
                          "id": 19428,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7367:40:67",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19429,
                        "nodeType": "EmitStatement",
                        "src": "7362:45:67"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 19402,
              "nodeType": "StructuredDocumentation",
              "src": "7075:111:67",
              "text": " @dev Grants `role` to `account`.\n Internal function without access restriction."
            },
            "id": 19433,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_grantRole",
            "nameLocation": "7200:10:67",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 19407,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19404,
                  "mutability": "mutable",
                  "name": "role",
                  "nameLocation": "7219:4:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19433,
                  "src": "7211:12:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 19403,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "7211:7:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19406,
                  "mutability": "mutable",
                  "name": "account",
                  "nameLocation": "7233:7:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19433,
                  "src": "7225:15:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19405,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7225:7:67",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7210:31:67"
            },
            "returnParameters": {
              "id": 19408,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "7259:0:67"
            },
            "scope": 19470,
            "src": "7191:233:67",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 19463,
              "nodeType": "Block",
              "src": "7618:165:67",
              "statements": [
                {
                  "condition": {
                    "arguments": [
                      {
                        "id": 19442,
                        "name": "role",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19436,
                        "src": "7640:4:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 19443,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19438,
                        "src": "7646:7:67",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 19441,
                      "name": "hasRole",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19238,
                      "src": "7632:7:67",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_address_$returns$_t_bool_$",
                        "typeString": "function (bytes32,address) view returns (bool)"
                      }
                    },
                    "id": 19444,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7632:22:67",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 19462,
                  "nodeType": "IfStatement",
                  "src": "7628:149:67",
                  "trueBody": {
                    "id": 19461,
                    "nodeType": "Block",
                    "src": "7656:121:67",
                    "statements": [
                      {
                        "expression": {
                          "id": 19452,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "baseExpression": {
                              "expression": {
                                "baseExpression": {
                                  "id": 19445,
                                  "name": "_roles",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19181,
                                  "src": "7670:6:67",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_RoleData_$19176_storage_$",
                                    "typeString": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData storage ref)"
                                  }
                                },
                                "id": 19447,
                                "indexExpression": {
                                  "id": 19446,
                                  "name": "role",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19436,
                                  "src": "7677:4:67",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "7670:12:67",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_RoleData_$19176_storage",
                                  "typeString": "struct AccessControlUpgradeable.RoleData storage ref"
                                }
                              },
                              "id": 19448,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "members",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 19173,
                              "src": "7670:20:67",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                                "typeString": "mapping(address => bool)"
                              }
                            },
                            "id": 19450,
                            "indexExpression": {
                              "id": 19449,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 19438,
                              "src": "7691:7:67",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "7670:29:67",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "hexValue": "66616c7365",
                            "id": 19451,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "bool",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "7702:5:67",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "value": "false"
                          },
                          "src": "7670:37:67",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 19453,
                        "nodeType": "ExpressionStatement",
                        "src": "7670:37:67"
                      },
                      {
                        "eventCall": {
                          "arguments": [
                            {
                              "id": 19455,
                              "name": "role",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 19436,
                              "src": "7738:4:67",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "id": 19456,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 19438,
                              "src": "7744:7:67",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 19457,
                                "name": "_msgSender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 26005,
                                "src": "7753:10:67",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                                  "typeString": "function () view returns (address)"
                                }
                              },
                              "id": 19458,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7753:12:67",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 19454,
                            "name": "RoleRevoked",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 26354,
                            "src": "7726:11:67",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$returns$__$",
                              "typeString": "function (bytes32,address,address)"
                            }
                          },
                          "id": 19459,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7726:40:67",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19460,
                        "nodeType": "EmitStatement",
                        "src": "7721:45:67"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 19434,
              "nodeType": "StructuredDocumentation",
              "src": "7430:114:67",
              "text": " @dev Revokes `role` from `account`.\n Internal function without access restriction."
            },
            "id": 19464,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_revokeRole",
            "nameLocation": "7558:11:67",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 19439,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19436,
                  "mutability": "mutable",
                  "name": "role",
                  "nameLocation": "7578:4:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19464,
                  "src": "7570:12:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 19435,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "7570:7:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19438,
                  "mutability": "mutable",
                  "name": "account",
                  "nameLocation": "7592:7:67",
                  "nodeType": "VariableDeclaration",
                  "scope": 19464,
                  "src": "7584:15:67",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19437,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7584:7:67",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7569:31:67"
            },
            "returnParameters": {
              "id": 19440,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "7618:0:67"
            },
            "scope": 19470,
            "src": "7549:234:67",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "constant": false,
            "documentation": {
              "id": 19465,
              "nodeType": "StructuredDocumentation",
              "src": "7789:254:67",
              "text": " @dev This empty reserved space is put in place to allow future versions to add new\n variables without shifting down storage in the inheritance chain.\n See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps"
            },
            "id": 19469,
            "mutability": "mutable",
            "name": "__gap",
            "nameLocation": "8068:5:67",
            "nodeType": "VariableDeclaration",
            "scope": 19470,
            "src": "8048:25:67",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_array$_t_uint256_$49_storage",
              "typeString": "uint256[49]"
            },
            "typeName": {
              "baseType": {
                "id": 19466,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "8048:7:67",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              },
              "id": 19468,
              "length": {
                "hexValue": "3439",
                "id": 19467,
                "isConstant": false,
                "isLValue": false,
                "isPure": true,
                "kind": "number",
                "lValueRequested": false,
                "nodeType": "Literal",
                "src": "8056:2:67",
                "typeDescriptions": {
                  "typeIdentifier": "t_rational_49_by_1",
                  "typeString": "int_const 49"
                },
                "value": "49"
              },
              "nodeType": "ArrayTypeName",
              "src": "8048:11:67",
              "typeDescriptions": {
                "typeIdentifier": "t_array$_t_uint256_$49_storage_ptr",
                "typeString": "uint256[49]"
              }
            },
            "visibility": "private"
          }
        ],
        "scope": 19471,
        "src": "1893:6183:67",
        "usedErrors": []
      }
    ],
    "src": "108:7969:67"
  },
  "bytecode": "",
  "bytecodeSha1": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
  "compiler": {
    "evm_version": "istanbul",
    "optimizer": {
      "enabled": true,
      "runs": 200
    },
    "version": "0.8.6+commit.11564f7e"
  },
  "contractName": "AccessControlUpgradeable",
  "coverageMap": {
    "branches": {},
    "statements": {}
  },
  "dependencies": [
    "ContextUpgradeable",
    "ERC165Upgradeable",
    "IAccessControlUpgradeable",
    "IERC165Upgradeable",
    "Initializable",
    "StringsUpgradeable"
  ],
  "deployedBytecode": "",
  "deployedSourceMap": "",
  "language": "Solidity",
  "natspec": {
    "details": "Contract module that allows children to implement role-based access control mechanisms. This is a lightweight version that doesn't allow enumerating role members except through off-chain means by accessing the contract event logs. Some applications may benefit from on-chain enumerability, for those cases see {AccessControlEnumerable}. 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.",
    "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}."
      },
      "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 revoked `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."
      },
      "supportsInterface(bytes4)": {
        "details": "See {IERC165-supportsInterface}."
      }
    },
    "stateVariables": {
      "__gap": {
        "details": "This empty reserved space is put in place to allow future versions to add new variables without shifting down storage in the inheritance chain. See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps"
      }
    },
    "version": 1
  },
  "offset": [
    1893,
    8076
  ],
  "opcodes": "",
  "pcMap": {},
  "sha1": "f587eac41b18bbbe5ff25d470989a68a7bcd4b34",
  "source": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IAccessControlUpgradeable.sol\";\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../utils/StringsUpgradeable.sol\";\nimport \"../utils/introspection/ERC165Upgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\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 AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable {\n    function __AccessControl_init() internal onlyInitializing {\n    }\n\n    function __AccessControl_init_unchained() internal onlyInitializing {\n    }\n    struct RoleData {\n        mapping(address => bool) 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 Modifier that checks that an account has a specific role. Reverts\n     * with a standardized message including the required role.\n     *\n     * The format of the revert reason is given by the following regular expression:\n     *\n     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n     *\n     * _Available since v4.1._\n     */\n    modifier onlyRole(bytes32 role) {\n        _checkRole(role, _msgSender());\n        _;\n    }\n\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId);\n    }\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\n        return _roles[role].members[account];\n    }\n\n    /**\n     * @dev Revert with a standard message if `account` is missing `role`.\n     *\n     * The format of the revert reason is given by the following regular expression:\n     *\n     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n     */\n    function _checkRole(bytes32 role, address account) internal view virtual {\n        if (!hasRole(role, account)) {\n            revert(\n                string(\n                    abi.encodePacked(\n                        \"AccessControl: account \",\n                        StringsUpgradeable.toHexString(uint160(account), 20),\n                        \" is missing role \",\n                        StringsUpgradeable.toHexString(uint256(role), 32)\n                    )\n                )\n            );\n        }\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 virtual override 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 override onlyRole(getRoleAdmin(role)) {\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 override onlyRole(getRoleAdmin(role)) {\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 revoked `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 override {\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     * NOTE: This function is deprecated in favor of {_grantRole}.\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     * Emits a {RoleAdminChanged} event.\n     */\n    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n        bytes32 previousAdminRole = getRoleAdmin(role);\n        _roles[role].adminRole = adminRole;\n        emit RoleAdminChanged(role, previousAdminRole, adminRole);\n    }\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * Internal function without access restriction.\n     */\n    function _grantRole(bytes32 role, address account) internal virtual {\n        if (!hasRole(role, account)) {\n            _roles[role].members[account] = true;\n            emit RoleGranted(role, account, _msgSender());\n        }\n    }\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * Internal function without access restriction.\n     */\n    function _revokeRole(bytes32 role, address account) internal virtual {\n        if (hasRole(role, account)) {\n            _roles[role].members[account] = false;\n            emit RoleRevoked(role, account, _msgSender());\n        }\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[49] private __gap;\n}\n",
  "sourceMap": "",
  "sourcePath": "node_modules/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol",
  "type": "contract"
}