{"file_path":"interfaces/GoldfishToken.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"@openzeppelin/contracts-upgradeable@5.4/token/ERC20/extensions/ERC20BurnableUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable@5.4/utils/PausableUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable@5.4/access/AccessControlUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable@5.4/proxy/utils/UUPSUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable@5.4/proxy/utils/Initializable.sol\";\n\n/**\n * @title GoldfishToken (GGBR)\n * @dev ERC20 token representing 1 thousandth of an ounce of gold per token\n * @notice Upgradeable token with role-based access control\n */\ncontract GoldfishToken is\n    Initializable,\n    ERC20BurnableUpgradeable,\n    PausableUpgradeable,\n    AccessControlUpgradeable,\n    UUPSUpgradeable\n{\n    // ============ Roles ============\n    bytes32 public constant PAUSER_ROLE = keccak256(\"PAUSER_ROLE\");\n    bytes32 public constant FREEZER_ROLE = keccak256(\"FREEZER_ROLE\");\n    bytes32 public constant SUPPLY_MANAGER_ROLE = keccak256(\"SUPPLY_MANAGER_ROLE\");\n\n    // ============ State Variables ============\n\n    // Frozen accounts cannot send or receive tokens\n    mapping(address => bool) public frozenAccounts;\n\n    // Whitelist/Blacklist for compliance\n    mapping(address => bool) public blacklistedAccounts;\n\n    // Platform contracts - these addresses have special permissions\n    address public minterContract;      // Only this contract can mint\n\n    // Supply management\n    uint256 public maxSupply;\n    uint256 public totalMinted;\n    uint256 public totalBurned;\n\n    // ============ Events ============\n    event AccountFrozen(address indexed account, bool frozen);\n    event AccountBlacklisted(address indexed account, bool status);\n    event ContractUpdated(string contractType, address indexed newAddress);\n    event MaxSupplyUpdated(uint256 oldCap, uint256 newCap);\n    event TokensMinted(address indexed to, uint256 amount, string memo);\n    event TokensBurned(address indexed from, uint256 amount, string reason);\n    event ForceTransfer(address indexed from, address indexed to, uint256 amount, string reason);\n    event BatchTransfer(\n        address indexed sender,\n        address[] recipients,\n        uint256[] amounts\n    );\n\n    // ============ Constructor ============\n\n    /// @custom:oz-upgrades-unsafe-allow constructor\n    constructor() {\n        _disableInitializers();\n    }\n\n    // ============ Initializer ============\n\n    function initialize() initializer public {\n        __ERC20_init(\"Goldfish\", \"GGBR\");\n        __ERC20Burnable_init();\n        __Pausable_init();\n        __AccessControl_init();\n        __UUPSUpgradeable_init();\n\n        // Grant all roles to deployer initially (minting is via minterContract only, not a role)\n        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);\n        _grantRole(PAUSER_ROLE, msg.sender);\n        _grantRole(FREEZER_ROLE, msg.sender);\n        _grantRole(SUPPLY_MANAGER_ROLE, msg.sender);\n\n        // Set initial state\n        maxSupply = 1000000000 * 10**18; // 1 billion tokens max\n    }\n\n    // ============ Admin Functions ============\n\n    function _authorizeUpgrade(address newImplementation) internal override onlyRole(DEFAULT_ADMIN_ROLE) {}\n\n    /**\n     * @dev Set the minter contract address\n     */\n    function setMinterContract(address _minter) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        require(_minter != address(0), \"Invalid address\");\n\n        minterContract = _minter;\n\n        emit ContractUpdated(\"Minter\", _minter);\n    }\n\n    // ============ Supply Management ============\n\n    /**\n     * @dev Update maximum supply cap\n     */\n    function setMaxSupply(uint256 _newCap) external onlyRole(SUPPLY_MANAGER_ROLE) {\n        require(_newCap >= totalSupply(), \"Below current supply\");\n        uint256 oldCap = maxSupply;\n        maxSupply = _newCap;\n        emit MaxSupplyUpdated(oldCap, _newCap);\n    }\n\n    // ============ Emergency Controls ============\n\n    /**\n     * @dev Pause all token operations\n     */\n    function pause() external onlyRole(PAUSER_ROLE) {\n        _pause();\n    }\n\n    /**\n     * @dev Unpause token operations\n     */\n    function unpause() external onlyRole(PAUSER_ROLE) {\n        _unpause();\n    }\n\n    // ============ Account Management ============\n\n    /**\n     * @dev Freeze or unfreeze an account\n     */\n    function freezeAccount(address account, bool freeze) external onlyRole(FREEZER_ROLE) {\n        frozenAccounts[account] = freeze;\n        emit AccountFrozen(account, freeze);\n    }\n\n    /**\n     * @dev Batch freeze/unfreeze accounts\n     */\n    function batchFreezeAccounts(address[] calldata accounts, bool freeze) external onlyRole(FREEZER_ROLE) {\n        for (uint256 i = 0; i < accounts.length; i++) {\n            frozenAccounts[accounts[i]] = freeze;\n            emit AccountFrozen(accounts[i], freeze);\n        }\n    }\n\n    /**\n     * @dev Add or remove address from blacklist\n     */\n    function setBlacklisted(address account, bool status) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        blacklistedAccounts[account] = status;\n        emit AccountBlacklisted(account, status);\n    }\n\n    /**\n     * @dev Batch blacklist/unblacklist accounts\n     */\n    function batchBlacklistAccounts(address[] calldata accounts, bool blacklist) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        for (uint256 i = 0; i < accounts.length; i++) {\n            blacklistedAccounts[accounts[i]] = blacklist;\n            emit AccountBlacklisted(accounts[i], blacklist);\n        }\n    }\n\n    // ============ Minting ============\n\n    /**\n     * @dev Mint new tokens (only minter contract address)\n     * @param to Recipient address\n     * @param amount Amount to mint\n     * @param memo Optional memo for tracking\n     */\n    function mint(address to, uint256 amount, string calldata memo) external {\n        require(msg.sender == minterContract, \"Not authorized\");\n        require(to != address(0), \"Invalid recipient\");\n        require(totalSupply() + amount <= maxSupply, \"Exceeds max supply\");\n\n        _mint(to, amount);\n        totalMinted += amount;\n\n        emit TokensMinted(to, amount, memo);\n    }\n\n    // ============ Burning ============\n\n    /**\n     * @dev Burn tokens from an address (for factory/minter contract)\n     * @param from Address to burn from\n     * @param amount Amount to burn\n     */\n    function burn(address from, uint256 amount) external {\n        require(msg.sender == minterContract, \"Not authorized\");\n        _burn(from, amount);\n        totalBurned += amount;\n        emit TokensBurned(from, amount, \"factory_burn\");\n    }\n\n    /**\n     * @dev Burn own tokens\n     */\n    function burn(uint256 amount) public override {\n        super.burn(amount);\n        totalBurned += amount;\n        emit TokensBurned(msg.sender, amount, \"self_burn\");\n    }\n\n    /**\n     * @dev Disabled: burnFrom bypasses minter authorization and breaks totalBurned/TokensBurned accounting.\n     * Use burn(uint256) for self-burn or burn(address,uint256) via minterContract for authorized burns.\n     */\n    function burnFrom(address, uint256) public override {\n        revert(\"burnFrom disabled: use burn() for self-burn\");\n    }\n\n    // ============ Force Transfer (Compliance) ============\n\n    /**\n     * @dev Force transfer for legal/compliance requirements\n     */\n    function forceTransfer(\n        address from,\n        address to,\n        uint256 amount,\n        string calldata reason\n    ) external onlyRole(DEFAULT_ADMIN_ROLE) whenNotPaused {\n        require(from != address(0) && to != address(0), \"Invalid addresses\");\n        super._update(from, to, amount); // Bypass freeze/blacklist for compliance actions\n        emit ForceTransfer(from, to, amount, reason);\n    }\n\n    // ============ Batch Transfer Functions ============\n\n    /**\n     * @dev Send tokens to multiple recipients in a single transaction\n     * @param _recipients Array of recipient addresses\n     * @param _amounts Array of amounts to send to each recipient\n     */\n    function batchTransfer(\n        address[] memory _recipients,\n        uint256[] memory _amounts\n    ) external {\n        require(_recipients.length == _amounts.length, \"Mismatched input arrays\");\n        require(_recipients.length > 0, \"Empty recipients array\");\n\n        uint256 totalAmount = 0;\n\n        // Calculate the total amount of tokens to be transferred\n        for (uint256 i = 0; i < _amounts.length; i++) {\n            require(_recipients[i] != address(0), \"Invalid recipient address\");\n            require(_recipients[i] != msg.sender, \"Self-transfer not allowed\");\n            require(_amounts[i] > 0, \"Amount must be greater than zero\");\n            totalAmount += _amounts[i];\n        }\n\n        // Check if sender has sufficient balance\n        require(balanceOf(msg.sender) >= totalAmount, \"Insufficient balance\");\n\n        // Perform transfers\n        for (uint256 i = 0; i < _recipients.length; i++) {\n            _transfer(msg.sender, _recipients[i], _amounts[i]);\n        }\n\n        emit BatchTransfer(msg.sender, _recipients, _amounts);\n    }\n\n    // ============ Internal Functions ============\n\n    /**\n     * @dev Hook that is called before any transfer of tokens\n     */\n    function _update(address from, address to, uint256 amount) internal override whenNotPaused {\n        // Check the spender\n        address spender = _msgSender();\n        require(!frozenAccounts[spender], \"Spender frozen\");\n        require(!blacklistedAccounts[spender], \"Spender blacklisted\");\n\n        // Check frozen accounts\n        require(!frozenAccounts[from], \"Sender frozen\");\n        require(!frozenAccounts[to], \"Recipient frozen\");\n\n        // Check blacklist\n        require(!blacklistedAccounts[from], \"Sender blacklisted\");\n        require(!blacklistedAccounts[to], \"Recipient blacklisted\");\n\n        super._update(from, to, amount);\n    }\n\n    // ============ View Functions ============\n\n    /**\n     * @dev Get circulating supply\n     */\n    function circulatingSupply() external view returns (uint256) {\n        return totalSupply();\n    }\n\n    /**\n     * @dev Check if account can transfer\n     */\n    function canTransfer(address account) external view returns (bool) {\n        if (paused()) return false;\n        if (frozenAccounts[account]) return false;\n        if (blacklistedAccounts[account]) return false;\n        return true;\n    }\n\n    /**\n     * @dev Get token statistics\n     */\n    function getTokenStats() external view returns (\n        uint256 currentSupply,\n        uint256 minted,\n        uint256 burned\n    ) {\n        return (totalSupply(), totalMinted, totalBurned);\n    }\n}","deployed_bytecode":"0x608060405260043610610287575f3560e01c80638456cb5911610159578063a2309ff8116100c0578063d5abeb0111610079578063d5abeb0114610983578063d89135cd146109ad578063dd62ed3e146109d7578063e511069214610a13578063e63ab1e914610a4f578063e724529c14610a7957610287565b8063a2309ff81461087b578063a9059cbb146108a5578063ad3cb1cc146108e1578063d01dd6d21461090b578063d3fc986414610933578063d547741f1461095b57610287565b80639358928b116101125780639358928b1461078357806393b9c8c9146107ad57806395d89b41146107d55780639b97e3f6146107ff5780639dc29fac14610829578063a217fddf1461085157610287565b80638456cb591461067b578063860838a51461069157806388d695b2146106cd57806389021456146106f557806391d148541461071d57806392f002331461075957610287565b806336568abe116101fd5780635c975abb116101b65780635c975abb146105735780636f8b44b01461059d57806370a08231146105c557806378fc3cb31461060157806379cc67901461063d5780638129fc1c1461066557610287565b806336568abe1461049f57806338478ae7146104c75780633f4ba83a146104ef57806342966c68146105055780634f1ef2861461052d57806352d1902d1461054957610287565b8063097cd9bf1161024f578063097cd9bf1461037f57806318160ddd146103ab57806323b872dd146103d5578063248a9ca3146104115780632f2ff15d1461044d578063313ce5671461047557610287565b806301ffc9a71461028b57806305a1eee5146102c757806306a85f0f146102ef57806306fdde0314610319578063095ea7b314610343575b5f5ffd5b348015610296575f5ffd5b506102b160048036038101906102ac9190613832565b610aa1565b6040516102be9190613877565b60405180910390f35b3480156102d2575f5ffd5b506102ed60048036038101906102e8919061391b565b610b1a565b005b3480156102fa575f5ffd5b50610303610c57565b6040516103109190613990565b60405180910390f35b348015610324575f5ffd5b5061032d610c7b565b60405161033a9190613a19565b60405180910390f35b34801561034e575f5ffd5b5061036960048036038101906103649190613ac6565b610d19565b6040516103769190613877565b60405180910390f35b34801561038a575f5ffd5b50610393610d3b565b6040516103a293929190613b13565b60405180910390f35b3480156103b6575f5ffd5b506103bf610d57565b6040516103cc9190613b48565b60405180910390f35b3480156103e0575f5ffd5b506103fb60048036038101906103f69190613b61565b610d6e565b6040516104089190613877565b60405180910390f35b34801561041c575f5ffd5b5061043760048036038101906104329190613bdb565b610d9c565b6040516104449190613990565b60405180910390f35b348015610458575f5ffd5b50610473600480360381019061046e9190613c06565b610dc6565b005b348015610480575f5ffd5b50610489610de8565b6040516104969190613c5f565b60405180910390f35b3480156104aa575f5ffd5b506104c560048036038101906104c09190613c06565b610df0565b005b3480156104d2575f5ffd5b506104ed60048036038101906104e89190613c78565b610e6b565b005b3480156104fa575f5ffd5b50610503610f75565b005b348015610510575f5ffd5b5061052b60048036038101906105269190613ca3565b610faa565b005b61054760048036038101906105429190613df6565b61101c565b005b348015610554575f5ffd5b5061055d61103b565b60405161056a9190613990565b60405180910390f35b34801561057e575f5ffd5b5061058761106c565b6040516105949190613877565b60405180910390f35b3480156105a8575f5ffd5b506105c360048036038101906105be9190613ca3565b61108e565b005b3480156105d0575f5ffd5b506105eb60048036038101906105e69190613c78565b61114d565b6040516105f89190613b48565b60405180910390f35b34801561060c575f5ffd5b5061062760048036038101906106229190613c78565b6111a0565b6040516106349190613877565b60405180910390f35b348015610648575f5ffd5b50610663600480360381019061065e9190613ac6565b61126d565b005b348015610670575f5ffd5b506106796112a8565b005b348015610686575f5ffd5b5061068f611554565b005b34801561069c575f5ffd5b506106b760048036038101906106b29190613c78565b611589565b6040516106c49190613877565b60405180910390f35b3480156106d8575f5ffd5b506106f360048036038101906106ee9190613fd0565b6115a5565b005b348015610700575f5ffd5b5061071b6004803603810190610716919061409b565b6118db565b005b348015610728575f5ffd5b50610743600480360381019061073e9190613c06565b611a12565b6040516107509190613877565b60405180910390f35b348015610764575f5ffd5b5061076d611a83565b60405161077a919061412e565b60405180910390f35b34801561078e575f5ffd5b50610797611aa8565b6040516107a49190613b48565b60405180910390f35b3480156107b8575f5ffd5b506107d360048036038101906107ce919061391b565b611ab6565b005b3480156107e0575f5ffd5b506107e9611bd6565b6040516107f69190613a19565b60405180910390f35b34801561080a575f5ffd5b50610813611c74565b6040516108209190613990565b60405180910390f35b348015610834575f5ffd5b5061084f600480360381019061084a9190613ac6565b611c98565b005b34801561085c575f5ffd5b50610865611d9b565b6040516108729190613990565b60405180910390f35b348015610886575f5ffd5b5061088f611da1565b60405161089c9190613b48565b60405180910390f35b3480156108b0575f5ffd5b506108cb60048036038101906108c69190613ac6565b611da7565b6040516108d89190613877565b60405180910390f35b3480156108ec575f5ffd5b506108f5611dc9565b6040516109029190613a19565b60405180910390f35b348015610916575f5ffd5b50610931600480360381019061092c9190614147565b611e02565b005b34801561093e575f5ffd5b5061095960048036038101906109549190614185565b611eb5565b005b348015610966575f5ffd5b50610981600480360381019061097c9190613c06565b612083565b005b34801561098e575f5ffd5b506109976120a5565b6040516109a49190613b48565b60405180910390f35b3480156109b8575f5ffd5b506109c16120ab565b6040516109ce9190613b48565b60405180910390f35b3480156109e2575f5ffd5b506109fd60048036038101906109f891906141f6565b6120b1565b604051610a0a9190613b48565b60405180910390f35b348015610a1e575f5ffd5b50610a396004803603810190610a349190613c78565b612141565b604051610a469190613877565b60405180910390f35b348015610a5a575f5ffd5b50610a6361215e565b604051610a709190613990565b60405180910390f35b348015610a84575f5ffd5b50610a9f6004803603810190610a9a9190614147565b612182565b005b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b135750610b1282612252565b5b9050919050565b7f92de27771f92d6942691d73358b3a4673e4880de8356f8f2cf452be87e02d363610b44816122bb565b5f5f90505b84849050811015610c5057825f5f878785818110610b6a57610b69614234565b5b9050602002016020810190610b7f9190613c78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550848482818110610be157610be0614234565b5b9050602002016020810190610bf69190613c78565b73ffffffffffffffffffffffffffffffffffffffff167fa33e6b076d391e96626483b30e365719f79f1d6594aff6587649ffd6c82ed7fa84604051610c3b9190613877565b60405180910390a28080600101915050610b49565b5050505050565b7f92de27771f92d6942691d73358b3a4673e4880de8356f8f2cf452be87e02d36381565b60605f610c866122cf565b9050806003018054610c979061428e565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc39061428e565b8015610d0e5780601f10610ce557610100808354040283529160200191610d0e565b820191905f5260205f20905b815481529060010190602001808311610cf157829003601f168201915b505050505091505090565b5f5f610d236122f6565b9050610d308185856122fd565b600191505092915050565b5f5f5f610d46610d57565b600454600554925092509250909192565b5f5f610d616122cf565b9050806002015491505090565b5f5f610d786122f6565b9050610d8585828561230f565b610d908585856123a2565b60019150509392505050565b5f5f610da6612492565b9050805f015f8481526020019081526020015f2060010154915050919050565b610dcf82610d9c565b610dd8816122bb565b610de283836124b9565b50505050565b5f6012905090565b610df86122f6565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e5c576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e6682826125b1565b505050565b5f5f1b610e77816122bb565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc90614308565b60405180910390fd5b8160025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167ff611fec7babefd259c57ea5b6006acff8140ab17bb816c65ba0aa7e36c09caa8604051610f6990614370565b60405180910390a25050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610f9f816122bb565b610fa76126a9565b50565b610fb381612717565b8060055f828254610fc491906143bb565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167ffad31924d655455395c87544c8aa1ffdb5a7505a22a3c2e03f28003b6556a75f826040516110119190614438565b60405180910390a250565b61102461272b565b61102d82612811565b6110378282612821565b5050565b5f61104461293f565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b5f5f6110766129c6565b9050805f015f9054906101000a900460ff1691505090565b7fc5a01215c40ae393b8dd7ca6c61496b1cc32e1f8c7c4359fd8dae25be62fcd416110b8816122bb565b6110c0610d57565b821015611102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f9906144ae565b60405180910390fd5b5f6003549050826003819055507f44ecfc706d63e347851cfd40acfa6cf2e3a41faa3e8b460210c03938e84a91ad81846040516111409291906144cc565b60405180910390a1505050565b5f5f6111576122cf565b9050805f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054915050919050565b5f6111a961106c565b156111b6575f9050611268565b5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561120c575f9050611268565b60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611263575f9050611268565b600190505b919050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129f90614563565b60405180910390fd5b5f6112b16129ed565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f5f8267ffffffffffffffff161480156112f95750825b90505f60018367ffffffffffffffff1614801561132c57505f3073ffffffffffffffffffffffffffffffffffffffff163b145b90508115801561133a575080155b15611371576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083156113be576001855f0160086101000a81548160ff0219169083151502179055505b6114326040518060400160405280600881526020017f476f6c64666973680000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4747425200000000000000000000000000000000000000000000000000000000815250612a00565b61143a612a16565b611442612a20565b61144a612a2a565b611452612a34565b61145e5f5f1b336124b9565b506114897f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a336124b9565b506114b47f92de27771f92d6942691d73358b3a4673e4880de8356f8f2cf452be87e02d363336124b9565b506114df7fc5a01215c40ae393b8dd7ca6c61496b1cc32e1f8c7c4359fd8dae25be62fcd41336124b9565b506b033b2e3c9fd0803ce8000000600381905550831561154d575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2600160405161154491906145d6565b60405180910390a15b5050505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61157e816122bb565b611586612a3e565b50565b5f602052805f5260405f205f915054906101000a900460ff1681565b80518251146115e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e090614639565b60405180910390fd5b5f82511161162c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611623906146a1565b60405180910390fd5b5f5f90505f5f90505b82518110156117df575f73ffffffffffffffffffffffffffffffffffffffff1684828151811061166857611667614234565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd90614709565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168482815181106116f0576116ef614234565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590614771565b60405180910390fd5b5f83828151811061176257611761614234565b5b6020026020010151116117aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a1906147d9565b60405180910390fd5b8281815181106117bd576117bc614234565b5b6020026020010151826117d091906143bb565b91508080600101915050611635565b50806117ea3361114d565b101561182b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182290614841565b60405180910390fd5b5f5f90505b835181101561188557611878338583815181106118505761184f614234565b5b602002602001015185848151811061186b5761186a614234565b5b60200260200101516123a2565b8080600101915050611830565b503373ffffffffffffffffffffffffffffffffffffffff167fd76871a3b9b205c530f73884df11af482cc4ac28f71bdb2f15a98e79a3a7907684846040516118ce9291906149cd565b60405180910390a2505050565b5f5f1b6118e7816122bb565b6118ef612aad565b5f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415801561195757505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b611996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198d90614a4c565b60405180910390fd5b6119a1868686612aee565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f2eaee783069d2f4cc557477a5af4ed6420985b57c0f64b600e0601415b580ba0868686604051611a0293929190614a96565b60405180910390a3505050505050565b5f5f611a1c612492565b9050805f015f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1691505092915050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f611ab1610d57565b905090565b5f5f1b611ac2816122bb565b5f5f90505b84849050811015611bcf578260015f878785818110611ae957611ae8614234565b5b9050602002016020810190611afe9190613c78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550848482818110611b6057611b5f614234565b5b9050602002016020810190611b759190613c78565b73ffffffffffffffffffffffffffffffffffffffff167f1d3a0f423a29cb00c6d792b5a695e34683386c493edbcf344426b5da5adf0e4484604051611bba9190613877565b60405180910390a28080600101915050611ac7565b5050505050565b60605f611be16122cf565b9050806004018054611bf29061428e565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1e9061428e565b8015611c695780601f10611c4057610100808354040283529160200191611c69565b820191905f5260205f20905b815481529060010190602001808311611c4c57829003601f168201915b505050505091505090565b7fc5a01215c40ae393b8dd7ca6c61496b1cc32e1f8c7c4359fd8dae25be62fcd4181565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1e90614b10565b60405180910390fd5b611d318282612d1d565b8060055f828254611d4291906143bb565b925050819055508173ffffffffffffffffffffffffffffffffffffffff167ffad31924d655455395c87544c8aa1ffdb5a7505a22a3c2e03f28003b6556a75f82604051611d8f9190614b78565b60405180910390a25050565b5f5f1b81565b60045481565b5f5f611db16122f6565b9050611dbe8185856123a2565b600191505092915050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b5f5f1b611e0e816122bb565b8160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167f1d3a0f423a29cb00c6d792b5a695e34683386c493edbcf344426b5da5adf0e4483604051611ea89190613877565b60405180910390a2505050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3b90614b10565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa990614bee565b60405180910390fd5b60035483611fbe610d57565b611fc891906143bb565b1115612009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200090614c56565b60405180910390fd5b6120138484612d9c565b8260045f82825461202491906143bb565b925050819055508373ffffffffffffffffffffffffffffffffffffffff167f9d89e36eadf856db0ad9ffb5a569e07f95634dddd9501141ecf04820484ad0dc84848460405161207593929190614a96565b60405180910390a250505050565b61208c82610d9c565b612095816122bb565b61209f83836125b1565b50505050565b60035481565b60055481565b5f5f6120bb6122cf565b9050806001015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205491505092915050565b6001602052805f5260405f205f915054906101000a900460ff1681565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b7f92de27771f92d6942691d73358b3a4673e4880de8356f8f2cf452be87e02d3636121ac816122bb565b815f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167fa33e6b076d391e96626483b30e365719f79f1d6594aff6587649ffd6c82ed7fa836040516122459190613877565b60405180910390a2505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122cc816122c76122f6565b612e1b565b50565b5f7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00905090565b5f33905090565b61230a8383836001612e6c565b505050565b5f61231a84846120b1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81101561239c578181101561238d578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161238493929190614c74565b60405180910390fd5b61239b84848484035f612e6c565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612412575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401612409919061412e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612482575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401612479919061412e565b60405180910390fd5b61248d838383613049565b505050565b5f7f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800905090565b5f5f6124c3612492565b90506124cf8484611a12565b6125a6576001815f015f8681526020019081526020015f205f015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506125426122f6565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506125ab565b5f9150505b92915050565b5f5f6125bb612492565b90506125c78484611a12565b1561269e575f815f015f8681526020019081526020015f205f015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061263a6122f6565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019150506126a3565b5f9150505b92915050565b6126b16133a6565b5f6126ba6129c6565b90505f815f015f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6126ff6122f6565b60405161270c919061412e565b60405180910390a150565b6127286127226122f6565b82612d1d565b50565b7f00000000000000000000000035fef16fea897dd6ca2e28041dbfb8d56e2978d673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614806127d857507f00000000000000000000000035fef16fea897dd6ca2e28041dbfb8d56e2978d673ffffffffffffffffffffffffffffffffffffffff166127bf6133e6565b73ffffffffffffffffffffffffffffffffffffffff1614155b1561280f576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f5f1b61281d816122bb565b5050565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561288957506040513d601f19601f820116820180604052508101906128869190614cbd565b60015b6128ca57816040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016128c1919061412e565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b811461293057806040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004016129279190613990565b60405180910390fd5b61293a8383613439565b505050565b7f00000000000000000000000035fef16fea897dd6ca2e28041dbfb8d56e2978d673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16146129c4576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300905090565b5f5f6129f76134ab565b90508091505090565b612a086134d4565b612a128282613514565b5050565b612a1e6134d4565b565b612a286134d4565b565b612a326134d4565b565b612a3c6134d4565b565b612a46612aad565b5f612a4f6129c6565b90506001815f015f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612a956122f6565b604051612aa2919061412e565b60405180910390a150565b612ab561106c565b15612aec576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f612af76122cf565b90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612b4b5781816002015f828254612b3f91906143bb565b92505081905550612c1d565b5f815f015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905082811015612bd6578481846040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612bcd93929190614c74565b60405180910390fd5b828103825f015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c665781816002015f8282540392505081905550612cb2565b81815f015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612d0f9190613b48565b60405180910390a350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d8d575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401612d84919061412e565b60405180910390fd5b612d98825f83613049565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e0c575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401612e03919061412e565b60405180910390fd5b612e175f8383613049565b5050565b612e258282611a12565b612e685780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401612e5f929190614ce8565b60405180910390fd5b5050565b5f612e756122cf565b90505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612ee7575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401612ede919061412e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612f57575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401612f4e919061412e565b60405180910390fd5b82816001015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508115613042578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516130399190613b48565b60405180910390a35b5050505050565b613051612aad565b5f61305a6122f6565b90505f5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156130e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130dc90614d59565b60405180910390fd5b60015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561316f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316690614dc1565b60405180910390fd5b5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156131f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ef90614e29565b60405180910390fd5b5f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615613281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327890614e91565b60405180910390fd5b60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561330b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330290614ef9565b60405180910390fd5b60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615613395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338c90614f61565b60405180910390fd5b6133a0848484612aee565b50505050565b6133ae61106c565b6133e4576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f6134127f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613550565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61344282613559565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f8151111561349e576134988282613622565b506134a7565b6134a66136a2565b5b5050565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005f1b905090565b6134dc6136de565b613512576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b61351c6134d4565b5f6135256122cf565b9050828160030190816135389190615127565b508181600401908161354a9190615127565b50505050565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b036135b457806040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016135ab919061412e565b60405180910390fd5b806135e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613550565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f5f8473ffffffffffffffffffffffffffffffffffffffff168460405161364b919061523a565b5f60405180830381855af49150503d805f8114613683576040519150601f19603f3d011682016040523d82523d5f602084013e613688565b606091505b50915091506136988583836136fc565b9250505092915050565b5f3411156136dc576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f6136e76129ed565b5f0160089054906101000a900460ff16905090565b6060826137115761370c82613789565b613781565b5f825114801561373757505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561377957836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401613770919061412e565b60405180910390fd5b819050613782565b5b9392505050565b5f8151111561379a57805160208201fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613811816137dd565b811461381b575f5ffd5b50565b5f8135905061382c81613808565b92915050565b5f60208284031215613847576138466137d5565b5b5f6138548482850161381e565b91505092915050565b5f8115159050919050565b6138718161385d565b82525050565b5f60208201905061388a5f830184613868565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f8401126138b1576138b0613890565b5b8235905067ffffffffffffffff8111156138ce576138cd613894565b5b6020830191508360208202830111156138ea576138e9613898565b5b9250929050565b6138fa8161385d565b8114613904575f5ffd5b50565b5f81359050613915816138f1565b92915050565b5f5f5f60408486031215613932576139316137d5565b5b5f84013567ffffffffffffffff81111561394f5761394e6137d9565b5b61395b8682870161389c565b9350935050602061396e86828701613907565b9150509250925092565b5f819050919050565b61398a81613978565b82525050565b5f6020820190506139a35f830184613981565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6139eb826139a9565b6139f581856139b3565b9350613a058185602086016139c3565b613a0e816139d1565b840191505092915050565b5f6020820190508181035f830152613a3181846139e1565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613a6282613a39565b9050919050565b613a7281613a58565b8114613a7c575f5ffd5b50565b5f81359050613a8d81613a69565b92915050565b5f819050919050565b613aa581613a93565b8114613aaf575f5ffd5b50565b5f81359050613ac081613a9c565b92915050565b5f5f60408385031215613adc57613adb6137d5565b5b5f613ae985828601613a7f565b9250506020613afa85828601613ab2565b9150509250929050565b613b0d81613a93565b82525050565b5f606082019050613b265f830186613b04565b613b336020830185613b04565b613b406040830184613b04565b949350505050565b5f602082019050613b5b5f830184613b04565b92915050565b5f5f5f60608486031215613b7857613b776137d5565b5b5f613b8586828701613a7f565b9350506020613b9686828701613a7f565b9250506040613ba786828701613ab2565b9150509250925092565b613bba81613978565b8114613bc4575f5ffd5b50565b5f81359050613bd581613bb1565b92915050565b5f60208284031215613bf057613bef6137d5565b5b5f613bfd84828501613bc7565b91505092915050565b5f5f60408385031215613c1c57613c1b6137d5565b5b5f613c2985828601613bc7565b9250506020613c3a85828601613a7f565b9150509250929050565b5f60ff82169050919050565b613c5981613c44565b82525050565b5f602082019050613c725f830184613c50565b92915050565b5f60208284031215613c8d57613c8c6137d5565b5b5f613c9a84828501613a7f565b91505092915050565b5f60208284031215613cb857613cb76137d5565b5b5f613cc584828501613ab2565b91505092915050565b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613d08826139d1565b810181811067ffffffffffffffff82111715613d2757613d26613cd2565b5b80604052505050565b5f613d396137cc565b9050613d458282613cff565b919050565b5f67ffffffffffffffff821115613d6457613d63613cd2565b5b613d6d826139d1565b9050602081019050919050565b828183375f83830152505050565b5f613d9a613d9584613d4a565b613d30565b905082815260208101848484011115613db657613db5613cce565b5b613dc1848285613d7a565b509392505050565b5f82601f830112613ddd57613ddc613890565b5b8135613ded848260208601613d88565b91505092915050565b5f5f60408385031215613e0c57613e0b6137d5565b5b5f613e1985828601613a7f565b925050602083013567ffffffffffffffff811115613e3a57613e396137d9565b5b613e4685828601613dc9565b9150509250929050565b5f67ffffffffffffffff821115613e6a57613e69613cd2565b5b602082029050602081019050919050565b5f613e8d613e8884613e50565b613d30565b90508083825260208201905060208402830185811115613eb057613eaf613898565b5b835b81811015613ed95780613ec58882613a7f565b845260208401935050602081019050613eb2565b5050509392505050565b5f82601f830112613ef757613ef6613890565b5b8135613f07848260208601613e7b565b91505092915050565b5f67ffffffffffffffff821115613f2a57613f29613cd2565b5b602082029050602081019050919050565b5f613f4d613f4884613f10565b613d30565b90508083825260208201905060208402830185811115613f7057613f6f613898565b5b835b81811015613f995780613f858882613ab2565b845260208401935050602081019050613f72565b5050509392505050565b5f82601f830112613fb757613fb6613890565b5b8135613fc7848260208601613f3b565b91505092915050565b5f5f60408385031215613fe657613fe56137d5565b5b5f83013567ffffffffffffffff811115614003576140026137d9565b5b61400f85828601613ee3565b925050602083013567ffffffffffffffff8111156140305761402f6137d9565b5b61403c85828601613fa3565b9150509250929050565b5f5f83601f84011261405b5761405a613890565b5b8235905067ffffffffffffffff81111561407857614077613894565b5b60208301915083600182028301111561409457614093613898565b5b9250929050565b5f5f5f5f5f608086880312156140b4576140b36137d5565b5b5f6140c188828901613a7f565b95505060206140d288828901613a7f565b94505060406140e388828901613ab2565b935050606086013567ffffffffffffffff811115614104576141036137d9565b5b61411088828901614046565b92509250509295509295909350565b61412881613a58565b82525050565b5f6020820190506141415f83018461411f565b92915050565b5f5f6040838503121561415d5761415c6137d5565b5b5f61416a85828601613a7f565b925050602061417b85828601613907565b9150509250929050565b5f5f5f5f6060858703121561419d5761419c6137d5565b5b5f6141aa87828801613a7f565b94505060206141bb87828801613ab2565b935050604085013567ffffffffffffffff8111156141dc576141db6137d9565b5b6141e887828801614046565b925092505092959194509250565b5f5f6040838503121561420c5761420b6137d5565b5b5f61421985828601613a7f565b925050602061422a85828601613a7f565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806142a557607f821691505b6020821081036142b8576142b7614261565b5b50919050565b7f496e76616c6964206164647265737300000000000000000000000000000000005f82015250565b5f6142f2600f836139b3565b91506142fd826142be565b602082019050919050565b5f6020820190508181035f83015261431f816142e6565b9050919050565b7f4d696e74657200000000000000000000000000000000000000000000000000005f82015250565b5f61435a6006836139b3565b915061436582614326565b602082019050919050565b5f6020820190508181035f8301526143878161434e565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6143c582613a93565b91506143d083613a93565b92508282019050808211156143e8576143e761438e565b5b92915050565b7f73656c665f6275726e00000000000000000000000000000000000000000000005f82015250565b5f6144226009836139b3565b915061442d826143ee565b602082019050919050565b5f60408201905061444b5f830184613b04565b818103602083015261445c81614416565b905092915050565b7f42656c6f772063757272656e7420737570706c790000000000000000000000005f82015250565b5f6144986014836139b3565b91506144a382614464565b602082019050919050565b5f6020820190508181035f8301526144c58161448c565b9050919050565b5f6040820190506144df5f830185613b04565b6144ec6020830184613b04565b9392505050565b7f6275726e46726f6d2064697361626c65643a20757365206275726e282920666f5f8201527f722073656c662d6275726e000000000000000000000000000000000000000000602082015250565b5f61454d602b836139b3565b9150614558826144f3565b604082019050919050565b5f6020820190508181035f83015261457a81614541565b9050919050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f819050919050565b5f6145c06145bb6145b684614581565b61459d565b61458a565b9050919050565b6145d0816145a6565b82525050565b5f6020820190506145e95f8301846145c7565b92915050565b7f4d69736d61746368656420696e707574206172726179730000000000000000005f82015250565b5f6146236017836139b3565b915061462e826145ef565b602082019050919050565b5f6020820190508181035f83015261465081614617565b9050919050565b7f456d70747920726563697069656e7473206172726179000000000000000000005f82015250565b5f61468b6016836139b3565b915061469682614657565b602082019050919050565b5f6020820190508181035f8301526146b88161467f565b9050919050565b7f496e76616c696420726563697069656e742061646472657373000000000000005f82015250565b5f6146f36019836139b3565b91506146fe826146bf565b602082019050919050565b5f6020820190508181035f830152614720816146e7565b9050919050565b7f53656c662d7472616e73666572206e6f7420616c6c6f776564000000000000005f82015250565b5f61475b6019836139b3565b915061476682614727565b602082019050919050565b5f6020820190508181035f8301526147888161474f565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e207a65726f5f82015250565b5f6147c36020836139b3565b91506147ce8261478f565b602082019050919050565b5f6020820190508181035f8301526147f0816147b7565b9050919050565b7f496e73756666696369656e742062616c616e63650000000000000000000000005f82015250565b5f61482b6014836139b3565b9150614836826147f7565b602082019050919050565b5f6020820190508181035f8301526148588161481f565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61489181613a58565b82525050565b5f6148a28383614888565b60208301905092915050565b5f602082019050919050565b5f6148c48261485f565b6148ce8185614869565b93506148d983614879565b805f5b838110156149095781516148f08882614897565b97506148fb836148ae565b9250506001810190506148dc565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61494881613a93565b82525050565b5f614959838361493f565b60208301905092915050565b5f602082019050919050565b5f61497b82614916565b6149858185614920565b935061499083614930565b805f5b838110156149c05781516149a7888261494e565b97506149b283614965565b925050600181019050614993565b5085935050505092915050565b5f6040820190508181035f8301526149e581856148ba565b905081810360208301526149f98184614971565b90509392505050565b7f496e76616c6964206164647265737365730000000000000000000000000000005f82015250565b5f614a366011836139b3565b9150614a4182614a02565b602082019050919050565b5f6020820190508181035f830152614a6381614a2a565b9050919050565b5f614a7583856139b3565b9350614a82838584613d7a565b614a8b836139d1565b840190509392505050565b5f604082019050614aa95f830186613b04565b8181036020830152614abc818486614a6a565b9050949350505050565b7f4e6f7420617574686f72697a65640000000000000000000000000000000000005f82015250565b5f614afa600e836139b3565b9150614b0582614ac6565b602082019050919050565b5f6020820190508181035f830152614b2781614aee565b9050919050565b7f666163746f72795f6275726e00000000000000000000000000000000000000005f82015250565b5f614b62600c836139b3565b9150614b6d82614b2e565b602082019050919050565b5f604082019050614b8b5f830184613b04565b8181036020830152614b9c81614b56565b905092915050565b7f496e76616c696420726563697069656e740000000000000000000000000000005f82015250565b5f614bd86011836139b3565b9150614be382614ba4565b602082019050919050565b5f6020820190508181035f830152614c0581614bcc565b9050919050565b7f45786365656473206d617820737570706c7900000000000000000000000000005f82015250565b5f614c406012836139b3565b9150614c4b82614c0c565b602082019050919050565b5f6020820190508181035f830152614c6d81614c34565b9050919050565b5f606082019050614c875f83018661411f565b614c946020830185613b04565b614ca16040830184613b04565b949350505050565b5f81519050614cb781613bb1565b92915050565b5f60208284031215614cd257614cd16137d5565b5b5f614cdf84828501614ca9565b91505092915050565b5f604082019050614cfb5f83018561411f565b614d086020830184613981565b9392505050565b7f5370656e6465722066726f7a656e0000000000000000000000000000000000005f82015250565b5f614d43600e836139b3565b9150614d4e82614d0f565b602082019050919050565b5f6020820190508181035f830152614d7081614d37565b9050919050565b7f5370656e64657220626c61636b6c6973746564000000000000000000000000005f82015250565b5f614dab6013836139b3565b9150614db682614d77565b602082019050919050565b5f6020820190508181035f830152614dd881614d9f565b9050919050565b7f53656e6465722066726f7a656e000000000000000000000000000000000000005f82015250565b5f614e13600d836139b3565b9150614e1e82614ddf565b602082019050919050565b5f6020820190508181035f830152614e4081614e07565b9050919050565b7f526563697069656e742066726f7a656e000000000000000000000000000000005f82015250565b5f614e7b6010836139b3565b9150614e8682614e47565b602082019050919050565b5f6020820190508181035f830152614ea881614e6f565b9050919050565b7f53656e64657220626c61636b6c697374656400000000000000000000000000005f82015250565b5f614ee36012836139b3565b9150614eee82614eaf565b602082019050919050565b5f6020820190508181035f830152614f1081614ed7565b9050919050565b7f526563697069656e7420626c61636b6c697374656400000000000000000000005f82015250565b5f614f4b6015836139b3565b9150614f5682614f17565b602082019050919050565b5f6020820190508181035f830152614f7881614f3f565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614fdb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614fa0565b614fe58683614fa0565b95508019841693508086168417925050509392505050565b5f61501761501261500d84613a93565b61459d565b613a93565b9050919050565b5f819050919050565b61503083614ffd565b61504461503c8261501e565b848454614fac565b825550505050565b5f5f905090565b61505b61504c565b615066818484615027565b505050565b5f5b8281101561508c576150815f828401615053565b60018101905061506d565b505050565b601f8211156150df57828211156150de576150ab81614f7f565b6150b483614f91565b6150bd85614f91565b60208610156150ca575f90505b8083016150d98284038261506b565b505050505b5b505050565b5f82821c905092915050565b5f6150ff5f19846008026150e4565b1980831691505092915050565b5f61511783836150f0565b9150826002028217905092915050565b615130826139a9565b67ffffffffffffffff81111561514957615148613cd2565b5b615153825461428e565b61515e828285615091565b5f60209050601f83116001811461518f575f841561517d578287015190505b615187858261510c565b8655506151ee565b601f19841661519d86614f7f565b5f5b828110156151c45784890151825560018201915060208501945060208101905061519f565b868310156151e157848901516151dd601f8916826150f0565b8355505b6001600288020188555050505b505050505050565b5f81519050919050565b5f81905092915050565b5f615214826151f6565b61521e8185615200565b935061522e8185602086016139c3565b80840191505092915050565b5f615245828461520a565b91508190509291505056fea26469706673582212209f09bdcb6455deb48fd6c03c262f711a46bbba4c56eff27aed1716c415f49ea764736f6c63430008220033","optimization_enabled":false,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"libraries":{},"optimizer":{"enabled":false,"runs":200},"outputSelection":{"*":{"":["*"],"*":["*"]}}},"optimization_runs":null,"sourcify_repo_url":null,"decoded_constructor_args":null,"compiler_version":"v0.8.34+commit.80d5c536","is_verified_via_verifier_alliance":false,"verified_at":"2026-05-20T15:08:48.821447Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610042575f5ffd5b5061005161005660201b60201c565b6101d1565b5f61006561015460201b60201c565b9050805f0160089054906101000a900460ff16156100af576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16146101515767ffffffffffffffff815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff60405161014891906101b8565b60405180910390a15b50565b5f5f61016461016d60201b60201c565b90508091505090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005f1b905090565b5f67ffffffffffffffff82169050919050565b6101b281610196565b82525050565b5f6020820190506101cb5f8301846101a9565b92915050565b6080516152866101f75f395f818161272d01528181612782015261294101526152865ff3fe608060405260043610610287575f3560e01c80638456cb5911610159578063a2309ff8116100c0578063d5abeb0111610079578063d5abeb0114610983578063d89135cd146109ad578063dd62ed3e146109d7578063e511069214610a13578063e63ab1e914610a4f578063e724529c14610a7957610287565b8063a2309ff81461087b578063a9059cbb146108a5578063ad3cb1cc146108e1578063d01dd6d21461090b578063d3fc986414610933578063d547741f1461095b57610287565b80639358928b116101125780639358928b1461078357806393b9c8c9146107ad57806395d89b41146107d55780639b97e3f6146107ff5780639dc29fac14610829578063a217fddf1461085157610287565b80638456cb591461067b578063860838a51461069157806388d695b2146106cd57806389021456146106f557806391d148541461071d57806392f002331461075957610287565b806336568abe116101fd5780635c975abb116101b65780635c975abb146105735780636f8b44b01461059d57806370a08231146105c557806378fc3cb31461060157806379cc67901461063d5780638129fc1c1461066557610287565b806336568abe1461049f57806338478ae7146104c75780633f4ba83a146104ef57806342966c68146105055780634f1ef2861461052d57806352d1902d1461054957610287565b8063097cd9bf1161024f578063097cd9bf1461037f57806318160ddd146103ab57806323b872dd146103d5578063248a9ca3146104115780632f2ff15d1461044d578063313ce5671461047557610287565b806301ffc9a71461028b57806305a1eee5146102c757806306a85f0f146102ef57806306fdde0314610319578063095ea7b314610343575b5f5ffd5b348015610296575f5ffd5b506102b160048036038101906102ac9190613832565b610aa1565b6040516102be9190613877565b60405180910390f35b3480156102d2575f5ffd5b506102ed60048036038101906102e8919061391b565b610b1a565b005b3480156102fa575f5ffd5b50610303610c57565b6040516103109190613990565b60405180910390f35b348015610324575f5ffd5b5061032d610c7b565b60405161033a9190613a19565b60405180910390f35b34801561034e575f5ffd5b5061036960048036038101906103649190613ac6565b610d19565b6040516103769190613877565b60405180910390f35b34801561038a575f5ffd5b50610393610d3b565b6040516103a293929190613b13565b60405180910390f35b3480156103b6575f5ffd5b506103bf610d57565b6040516103cc9190613b48565b60405180910390f35b3480156103e0575f5ffd5b506103fb60048036038101906103f69190613b61565b610d6e565b6040516104089190613877565b60405180910390f35b34801561041c575f5ffd5b5061043760048036038101906104329190613bdb565b610d9c565b6040516104449190613990565b60405180910390f35b348015610458575f5ffd5b50610473600480360381019061046e9190613c06565b610dc6565b005b348015610480575f5ffd5b50610489610de8565b6040516104969190613c5f565b60405180910390f35b3480156104aa575f5ffd5b506104c560048036038101906104c09190613c06565b610df0565b005b3480156104d2575f5ffd5b506104ed60048036038101906104e89190613c78565b610e6b565b005b3480156104fa575f5ffd5b50610503610f75565b005b348015610510575f5ffd5b5061052b60048036038101906105269190613ca3565b610faa565b005b61054760048036038101906105429190613df6565b61101c565b005b348015610554575f5ffd5b5061055d61103b565b60405161056a9190613990565b60405180910390f35b34801561057e575f5ffd5b5061058761106c565b6040516105949190613877565b60405180910390f35b3480156105a8575f5ffd5b506105c360048036038101906105be9190613ca3565b61108e565b005b3480156105d0575f5ffd5b506105eb60048036038101906105e69190613c78565b61114d565b6040516105f89190613b48565b60405180910390f35b34801561060c575f5ffd5b5061062760048036038101906106229190613c78565b6111a0565b6040516106349190613877565b60405180910390f35b348015610648575f5ffd5b50610663600480360381019061065e9190613ac6565b61126d565b005b348015610670575f5ffd5b506106796112a8565b005b348015610686575f5ffd5b5061068f611554565b005b34801561069c575f5ffd5b506106b760048036038101906106b29190613c78565b611589565b6040516106c49190613877565b60405180910390f35b3480156106d8575f5ffd5b506106f360048036038101906106ee9190613fd0565b6115a5565b005b348015610700575f5ffd5b5061071b6004803603810190610716919061409b565b6118db565b005b348015610728575f5ffd5b50610743600480360381019061073e9190613c06565b611a12565b6040516107509190613877565b60405180910390f35b348015610764575f5ffd5b5061076d611a83565b60405161077a919061412e565b60405180910390f35b34801561078e575f5ffd5b50610797611aa8565b6040516107a49190613b48565b60405180910390f35b3480156107b8575f5ffd5b506107d360048036038101906107ce919061391b565b611ab6565b005b3480156107e0575f5ffd5b506107e9611bd6565b6040516107f69190613a19565b60405180910390f35b34801561080a575f5ffd5b50610813611c74565b6040516108209190613990565b60405180910390f35b348015610834575f5ffd5b5061084f600480360381019061084a9190613ac6565b611c98565b005b34801561085c575f5ffd5b50610865611d9b565b6040516108729190613990565b60405180910390f35b348015610886575f5ffd5b5061088f611da1565b60405161089c9190613b48565b60405180910390f35b3480156108b0575f5ffd5b506108cb60048036038101906108c69190613ac6565b611da7565b6040516108d89190613877565b60405180910390f35b3480156108ec575f5ffd5b506108f5611dc9565b6040516109029190613a19565b60405180910390f35b348015610916575f5ffd5b50610931600480360381019061092c9190614147565b611e02565b005b34801561093e575f5ffd5b5061095960048036038101906109549190614185565b611eb5565b005b348015610966575f5ffd5b50610981600480360381019061097c9190613c06565b612083565b005b34801561098e575f5ffd5b506109976120a5565b6040516109a49190613b48565b60405180910390f35b3480156109b8575f5ffd5b506109c16120ab565b6040516109ce9190613b48565b60405180910390f35b3480156109e2575f5ffd5b506109fd60048036038101906109f891906141f6565b6120b1565b604051610a0a9190613b48565b60405180910390f35b348015610a1e575f5ffd5b50610a396004803603810190610a349190613c78565b612141565b604051610a469190613877565b60405180910390f35b348015610a5a575f5ffd5b50610a6361215e565b604051610a709190613990565b60405180910390f35b348015610a84575f5ffd5b50610a9f6004803603810190610a9a9190614147565b612182565b005b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b135750610b1282612252565b5b9050919050565b7f92de27771f92d6942691d73358b3a4673e4880de8356f8f2cf452be87e02d363610b44816122bb565b5f5f90505b84849050811015610c5057825f5f878785818110610b6a57610b69614234565b5b9050602002016020810190610b7f9190613c78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550848482818110610be157610be0614234565b5b9050602002016020810190610bf69190613c78565b73ffffffffffffffffffffffffffffffffffffffff167fa33e6b076d391e96626483b30e365719f79f1d6594aff6587649ffd6c82ed7fa84604051610c3b9190613877565b60405180910390a28080600101915050610b49565b5050505050565b7f92de27771f92d6942691d73358b3a4673e4880de8356f8f2cf452be87e02d36381565b60605f610c866122cf565b9050806003018054610c979061428e565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc39061428e565b8015610d0e5780601f10610ce557610100808354040283529160200191610d0e565b820191905f5260205f20905b815481529060010190602001808311610cf157829003601f168201915b505050505091505090565b5f5f610d236122f6565b9050610d308185856122fd565b600191505092915050565b5f5f5f610d46610d57565b600454600554925092509250909192565b5f5f610d616122cf565b9050806002015491505090565b5f5f610d786122f6565b9050610d8585828561230f565b610d908585856123a2565b60019150509392505050565b5f5f610da6612492565b9050805f015f8481526020019081526020015f2060010154915050919050565b610dcf82610d9c565b610dd8816122bb565b610de283836124b9565b50505050565b5f6012905090565b610df86122f6565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e5c576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e6682826125b1565b505050565b5f5f1b610e77816122bb565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc90614308565b60405180910390fd5b8160025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167ff611fec7babefd259c57ea5b6006acff8140ab17bb816c65ba0aa7e36c09caa8604051610f6990614370565b60405180910390a25050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610f9f816122bb565b610fa76126a9565b50565b610fb381612717565b8060055f828254610fc491906143bb565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167ffad31924d655455395c87544c8aa1ffdb5a7505a22a3c2e03f28003b6556a75f826040516110119190614438565b60405180910390a250565b61102461272b565b61102d82612811565b6110378282612821565b5050565b5f61104461293f565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b5f5f6110766129c6565b9050805f015f9054906101000a900460ff1691505090565b7fc5a01215c40ae393b8dd7ca6c61496b1cc32e1f8c7c4359fd8dae25be62fcd416110b8816122bb565b6110c0610d57565b821015611102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f9906144ae565b60405180910390fd5b5f6003549050826003819055507f44ecfc706d63e347851cfd40acfa6cf2e3a41faa3e8b460210c03938e84a91ad81846040516111409291906144cc565b60405180910390a1505050565b5f5f6111576122cf565b9050805f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054915050919050565b5f6111a961106c565b156111b6575f9050611268565b5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561120c575f9050611268565b60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611263575f9050611268565b600190505b919050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129f90614563565b60405180910390fd5b5f6112b16129ed565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f5f8267ffffffffffffffff161480156112f95750825b90505f60018367ffffffffffffffff1614801561132c57505f3073ffffffffffffffffffffffffffffffffffffffff163b145b90508115801561133a575080155b15611371576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083156113be576001855f0160086101000a81548160ff0219169083151502179055505b6114326040518060400160405280600881526020017f476f6c64666973680000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4747425200000000000000000000000000000000000000000000000000000000815250612a00565b61143a612a16565b611442612a20565b61144a612a2a565b611452612a34565b61145e5f5f1b336124b9565b506114897f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a336124b9565b506114b47f92de27771f92d6942691d73358b3a4673e4880de8356f8f2cf452be87e02d363336124b9565b506114df7fc5a01215c40ae393b8dd7ca6c61496b1cc32e1f8c7c4359fd8dae25be62fcd41336124b9565b506b033b2e3c9fd0803ce8000000600381905550831561154d575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2600160405161154491906145d6565b60405180910390a15b5050505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61157e816122bb565b611586612a3e565b50565b5f602052805f5260405f205f915054906101000a900460ff1681565b80518251146115e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e090614639565b60405180910390fd5b5f82511161162c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611623906146a1565b60405180910390fd5b5f5f90505f5f90505b82518110156117df575f73ffffffffffffffffffffffffffffffffffffffff1684828151811061166857611667614234565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd90614709565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168482815181106116f0576116ef614234565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361174e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174590614771565b60405180910390fd5b5f83828151811061176257611761614234565b5b6020026020010151116117aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a1906147d9565b60405180910390fd5b8281815181106117bd576117bc614234565b5b6020026020010151826117d091906143bb565b91508080600101915050611635565b50806117ea3361114d565b101561182b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182290614841565b60405180910390fd5b5f5f90505b835181101561188557611878338583815181106118505761184f614234565b5b602002602001015185848151811061186b5761186a614234565b5b60200260200101516123a2565b8080600101915050611830565b503373ffffffffffffffffffffffffffffffffffffffff167fd76871a3b9b205c530f73884df11af482cc4ac28f71bdb2f15a98e79a3a7907684846040516118ce9291906149cd565b60405180910390a2505050565b5f5f1b6118e7816122bb565b6118ef612aad565b5f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415801561195757505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b611996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198d90614a4c565b60405180910390fd5b6119a1868686612aee565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f2eaee783069d2f4cc557477a5af4ed6420985b57c0f64b600e0601415b580ba0868686604051611a0293929190614a96565b60405180910390a3505050505050565b5f5f611a1c612492565b9050805f015f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1691505092915050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f611ab1610d57565b905090565b5f5f1b611ac2816122bb565b5f5f90505b84849050811015611bcf578260015f878785818110611ae957611ae8614234565b5b9050602002016020810190611afe9190613c78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550848482818110611b6057611b5f614234565b5b9050602002016020810190611b759190613c78565b73ffffffffffffffffffffffffffffffffffffffff167f1d3a0f423a29cb00c6d792b5a695e34683386c493edbcf344426b5da5adf0e4484604051611bba9190613877565b60405180910390a28080600101915050611ac7565b5050505050565b60605f611be16122cf565b9050806004018054611bf29061428e565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1e9061428e565b8015611c695780601f10611c4057610100808354040283529160200191611c69565b820191905f5260205f20905b815481529060010190602001808311611c4c57829003601f168201915b505050505091505090565b7fc5a01215c40ae393b8dd7ca6c61496b1cc32e1f8c7c4359fd8dae25be62fcd4181565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1e90614b10565b60405180910390fd5b611d318282612d1d565b8060055f828254611d4291906143bb565b925050819055508173ffffffffffffffffffffffffffffffffffffffff167ffad31924d655455395c87544c8aa1ffdb5a7505a22a3c2e03f28003b6556a75f82604051611d8f9190614b78565b60405180910390a25050565b5f5f1b81565b60045481565b5f5f611db16122f6565b9050611dbe8185856123a2565b600191505092915050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b5f5f1b611e0e816122bb565b8160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167f1d3a0f423a29cb00c6d792b5a695e34683386c493edbcf344426b5da5adf0e4483604051611ea89190613877565b60405180910390a2505050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3b90614b10565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa990614bee565b60405180910390fd5b60035483611fbe610d57565b611fc891906143bb565b1115612009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200090614c56565b60405180910390fd5b6120138484612d9c565b8260045f82825461202491906143bb565b925050819055508373ffffffffffffffffffffffffffffffffffffffff167f9d89e36eadf856db0ad9ffb5a569e07f95634dddd9501141ecf04820484ad0dc84848460405161207593929190614a96565b60405180910390a250505050565b61208c82610d9c565b612095816122bb565b61209f83836125b1565b50505050565b60035481565b60055481565b5f5f6120bb6122cf565b9050806001015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205491505092915050565b6001602052805f5260405f205f915054906101000a900460ff1681565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b7f92de27771f92d6942691d73358b3a4673e4880de8356f8f2cf452be87e02d3636121ac816122bb565b815f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167fa33e6b076d391e96626483b30e365719f79f1d6594aff6587649ffd6c82ed7fa836040516122459190613877565b60405180910390a2505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122cc816122c76122f6565b612e1b565b50565b5f7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00905090565b5f33905090565b61230a8383836001612e6c565b505050565b5f61231a84846120b1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81101561239c578181101561238d578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161238493929190614c74565b60405180910390fd5b61239b84848484035f612e6c565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612412575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401612409919061412e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612482575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401612479919061412e565b60405180910390fd5b61248d838383613049565b505050565b5f7f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800905090565b5f5f6124c3612492565b90506124cf8484611a12565b6125a6576001815f015f8681526020019081526020015f205f015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506125426122f6565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506125ab565b5f9150505b92915050565b5f5f6125bb612492565b90506125c78484611a12565b1561269e575f815f015f8681526020019081526020015f205f015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061263a6122f6565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019150506126a3565b5f9150505b92915050565b6126b16133a6565b5f6126ba6129c6565b90505f815f015f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6126ff6122f6565b60405161270c919061412e565b60405180910390a150565b6127286127226122f6565b82612d1d565b50565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614806127d857507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166127bf6133e6565b73ffffffffffffffffffffffffffffffffffffffff1614155b1561280f576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f5f1b61281d816122bb565b5050565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561288957506040513d601f19601f820116820180604052508101906128869190614cbd565b60015b6128ca57816040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016128c1919061412e565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b811461293057806040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004016129279190613990565b60405180910390fd5b61293a8383613439565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16146129c4576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300905090565b5f5f6129f76134ab565b90508091505090565b612a086134d4565b612a128282613514565b5050565b612a1e6134d4565b565b612a286134d4565b565b612a326134d4565b565b612a3c6134d4565b565b612a46612aad565b5f612a4f6129c6565b90506001815f015f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612a956122f6565b604051612aa2919061412e565b60405180910390a150565b612ab561106c565b15612aec576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f612af76122cf565b90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612b4b5781816002015f828254612b3f91906143bb565b92505081905550612c1d565b5f815f015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905082811015612bd6578481846040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612bcd93929190614c74565b60405180910390fd5b828103825f015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c665781816002015f8282540392505081905550612cb2565b81815f015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612d0f9190613b48565b60405180910390a350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d8d575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401612d84919061412e565b60405180910390fd5b612d98825f83613049565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e0c575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401612e03919061412e565b60405180910390fd5b612e175f8383613049565b5050565b612e258282611a12565b612e685780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401612e5f929190614ce8565b60405180910390fd5b5050565b5f612e756122cf565b90505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612ee7575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401612ede919061412e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612f57575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401612f4e919061412e565b60405180910390fd5b82816001015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508115613042578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516130399190613b48565b60405180910390a35b5050505050565b613051612aad565b5f61305a6122f6565b90505f5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156130e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130dc90614d59565b60405180910390fd5b60015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561316f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316690614dc1565b60405180910390fd5b5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156131f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ef90614e29565b60405180910390fd5b5f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615613281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327890614e91565b60405180910390fd5b60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561330b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330290614ef9565b60405180910390fd5b60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615613395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338c90614f61565b60405180910390fd5b6133a0848484612aee565b50505050565b6133ae61106c565b6133e4576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f6134127f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613550565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61344282613559565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f8151111561349e576134988282613622565b506134a7565b6134a66136a2565b5b5050565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005f1b905090565b6134dc6136de565b613512576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b61351c6134d4565b5f6135256122cf565b9050828160030190816135389190615127565b508181600401908161354a9190615127565b50505050565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b036135b457806040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016135ab919061412e565b60405180910390fd5b806135e07f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b613550565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f5f8473ffffffffffffffffffffffffffffffffffffffff168460405161364b919061523a565b5f60405180830381855af49150503d805f8114613683576040519150601f19603f3d011682016040523d82523d5f602084013e613688565b606091505b50915091506136988583836136fc565b9250505092915050565b5f3411156136dc576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f6136e76129ed565b5f0160089054906101000a900460ff16905090565b6060826137115761370c82613789565b613781565b5f825114801561373757505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561377957836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401613770919061412e565b60405180910390fd5b819050613782565b5b9392505050565b5f8151111561379a57805160208201fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613811816137dd565b811461381b575f5ffd5b50565b5f8135905061382c81613808565b92915050565b5f60208284031215613847576138466137d5565b5b5f6138548482850161381e565b91505092915050565b5f8115159050919050565b6138718161385d565b82525050565b5f60208201905061388a5f830184613868565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f8401126138b1576138b0613890565b5b8235905067ffffffffffffffff8111156138ce576138cd613894565b5b6020830191508360208202830111156138ea576138e9613898565b5b9250929050565b6138fa8161385d565b8114613904575f5ffd5b50565b5f81359050613915816138f1565b92915050565b5f5f5f60408486031215613932576139316137d5565b5b5f84013567ffffffffffffffff81111561394f5761394e6137d9565b5b61395b8682870161389c565b9350935050602061396e86828701613907565b9150509250925092565b5f819050919050565b61398a81613978565b82525050565b5f6020820190506139a35f830184613981565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6139eb826139a9565b6139f581856139b3565b9350613a058185602086016139c3565b613a0e816139d1565b840191505092915050565b5f6020820190508181035f830152613a3181846139e1565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613a6282613a39565b9050919050565b613a7281613a58565b8114613a7c575f5ffd5b50565b5f81359050613a8d81613a69565b92915050565b5f819050919050565b613aa581613a93565b8114613aaf575f5ffd5b50565b5f81359050613ac081613a9c565b92915050565b5f5f60408385031215613adc57613adb6137d5565b5b5f613ae985828601613a7f565b9250506020613afa85828601613ab2565b9150509250929050565b613b0d81613a93565b82525050565b5f606082019050613b265f830186613b04565b613b336020830185613b04565b613b406040830184613b04565b949350505050565b5f602082019050613b5b5f830184613b04565b92915050565b5f5f5f60608486031215613b7857613b776137d5565b5b5f613b8586828701613a7f565b9350506020613b9686828701613a7f565b9250506040613ba786828701613ab2565b9150509250925092565b613bba81613978565b8114613bc4575f5ffd5b50565b5f81359050613bd581613bb1565b92915050565b5f60208284031215613bf057613bef6137d5565b5b5f613bfd84828501613bc7565b91505092915050565b5f5f60408385031215613c1c57613c1b6137d5565b5b5f613c2985828601613bc7565b9250506020613c3a85828601613a7f565b9150509250929050565b5f60ff82169050919050565b613c5981613c44565b82525050565b5f602082019050613c725f830184613c50565b92915050565b5f60208284031215613c8d57613c8c6137d5565b5b5f613c9a84828501613a7f565b91505092915050565b5f60208284031215613cb857613cb76137d5565b5b5f613cc584828501613ab2565b91505092915050565b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613d08826139d1565b810181811067ffffffffffffffff82111715613d2757613d26613cd2565b5b80604052505050565b5f613d396137cc565b9050613d458282613cff565b919050565b5f67ffffffffffffffff821115613d6457613d63613cd2565b5b613d6d826139d1565b9050602081019050919050565b828183375f83830152505050565b5f613d9a613d9584613d4a565b613d30565b905082815260208101848484011115613db657613db5613cce565b5b613dc1848285613d7a565b509392505050565b5f82601f830112613ddd57613ddc613890565b5b8135613ded848260208601613d88565b91505092915050565b5f5f60408385031215613e0c57613e0b6137d5565b5b5f613e1985828601613a7f565b925050602083013567ffffffffffffffff811115613e3a57613e396137d9565b5b613e4685828601613dc9565b9150509250929050565b5f67ffffffffffffffff821115613e6a57613e69613cd2565b5b602082029050602081019050919050565b5f613e8d613e8884613e50565b613d30565b90508083825260208201905060208402830185811115613eb057613eaf613898565b5b835b81811015613ed95780613ec58882613a7f565b845260208401935050602081019050613eb2565b5050509392505050565b5f82601f830112613ef757613ef6613890565b5b8135613f07848260208601613e7b565b91505092915050565b5f67ffffffffffffffff821115613f2a57613f29613cd2565b5b602082029050602081019050919050565b5f613f4d613f4884613f10565b613d30565b90508083825260208201905060208402830185811115613f7057613f6f613898565b5b835b81811015613f995780613f858882613ab2565b845260208401935050602081019050613f72565b5050509392505050565b5f82601f830112613fb757613fb6613890565b5b8135613fc7848260208601613f3b565b91505092915050565b5f5f60408385031215613fe657613fe56137d5565b5b5f83013567ffffffffffffffff811115614003576140026137d9565b5b61400f85828601613ee3565b925050602083013567ffffffffffffffff8111156140305761402f6137d9565b5b61403c85828601613fa3565b9150509250929050565b5f5f83601f84011261405b5761405a613890565b5b8235905067ffffffffffffffff81111561407857614077613894565b5b60208301915083600182028301111561409457614093613898565b5b9250929050565b5f5f5f5f5f608086880312156140b4576140b36137d5565b5b5f6140c188828901613a7f565b95505060206140d288828901613a7f565b94505060406140e388828901613ab2565b935050606086013567ffffffffffffffff811115614104576141036137d9565b5b61411088828901614046565b92509250509295509295909350565b61412881613a58565b82525050565b5f6020820190506141415f83018461411f565b92915050565b5f5f6040838503121561415d5761415c6137d5565b5b5f61416a85828601613a7f565b925050602061417b85828601613907565b9150509250929050565b5f5f5f5f6060858703121561419d5761419c6137d5565b5b5f6141aa87828801613a7f565b94505060206141bb87828801613ab2565b935050604085013567ffffffffffffffff8111156141dc576141db6137d9565b5b6141e887828801614046565b925092505092959194509250565b5f5f6040838503121561420c5761420b6137d5565b5b5f61421985828601613a7f565b925050602061422a85828601613a7f565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806142a557607f821691505b6020821081036142b8576142b7614261565b5b50919050565b7f496e76616c6964206164647265737300000000000000000000000000000000005f82015250565b5f6142f2600f836139b3565b91506142fd826142be565b602082019050919050565b5f6020820190508181035f83015261431f816142e6565b9050919050565b7f4d696e74657200000000000000000000000000000000000000000000000000005f82015250565b5f61435a6006836139b3565b915061436582614326565b602082019050919050565b5f6020820190508181035f8301526143878161434e565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6143c582613a93565b91506143d083613a93565b92508282019050808211156143e8576143e761438e565b5b92915050565b7f73656c665f6275726e00000000000000000000000000000000000000000000005f82015250565b5f6144226009836139b3565b915061442d826143ee565b602082019050919050565b5f60408201905061444b5f830184613b04565b818103602083015261445c81614416565b905092915050565b7f42656c6f772063757272656e7420737570706c790000000000000000000000005f82015250565b5f6144986014836139b3565b91506144a382614464565b602082019050919050565b5f6020820190508181035f8301526144c58161448c565b9050919050565b5f6040820190506144df5f830185613b04565b6144ec6020830184613b04565b9392505050565b7f6275726e46726f6d2064697361626c65643a20757365206275726e282920666f5f8201527f722073656c662d6275726e000000000000000000000000000000000000000000602082015250565b5f61454d602b836139b3565b9150614558826144f3565b604082019050919050565b5f6020820190508181035f83015261457a81614541565b9050919050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f819050919050565b5f6145c06145bb6145b684614581565b61459d565b61458a565b9050919050565b6145d0816145a6565b82525050565b5f6020820190506145e95f8301846145c7565b92915050565b7f4d69736d61746368656420696e707574206172726179730000000000000000005f82015250565b5f6146236017836139b3565b915061462e826145ef565b602082019050919050565b5f6020820190508181035f83015261465081614617565b9050919050565b7f456d70747920726563697069656e7473206172726179000000000000000000005f82015250565b5f61468b6016836139b3565b915061469682614657565b602082019050919050565b5f6020820190508181035f8301526146b88161467f565b9050919050565b7f496e76616c696420726563697069656e742061646472657373000000000000005f82015250565b5f6146f36019836139b3565b91506146fe826146bf565b602082019050919050565b5f6020820190508181035f830152614720816146e7565b9050919050565b7f53656c662d7472616e73666572206e6f7420616c6c6f776564000000000000005f82015250565b5f61475b6019836139b3565b915061476682614727565b602082019050919050565b5f6020820190508181035f8301526147888161474f565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e207a65726f5f82015250565b5f6147c36020836139b3565b91506147ce8261478f565b602082019050919050565b5f6020820190508181035f8301526147f0816147b7565b9050919050565b7f496e73756666696369656e742062616c616e63650000000000000000000000005f82015250565b5f61482b6014836139b3565b9150614836826147f7565b602082019050919050565b5f6020820190508181035f8301526148588161481f565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61489181613a58565b82525050565b5f6148a28383614888565b60208301905092915050565b5f602082019050919050565b5f6148c48261485f565b6148ce8185614869565b93506148d983614879565b805f5b838110156149095781516148f08882614897565b97506148fb836148ae565b9250506001810190506148dc565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61494881613a93565b82525050565b5f614959838361493f565b60208301905092915050565b5f602082019050919050565b5f61497b82614916565b6149858185614920565b935061499083614930565b805f5b838110156149c05781516149a7888261494e565b97506149b283614965565b925050600181019050614993565b5085935050505092915050565b5f6040820190508181035f8301526149e581856148ba565b905081810360208301526149f98184614971565b90509392505050565b7f496e76616c6964206164647265737365730000000000000000000000000000005f82015250565b5f614a366011836139b3565b9150614a4182614a02565b602082019050919050565b5f6020820190508181035f830152614a6381614a2a565b9050919050565b5f614a7583856139b3565b9350614a82838584613d7a565b614a8b836139d1565b840190509392505050565b5f604082019050614aa95f830186613b04565b8181036020830152614abc818486614a6a565b9050949350505050565b7f4e6f7420617574686f72697a65640000000000000000000000000000000000005f82015250565b5f614afa600e836139b3565b9150614b0582614ac6565b602082019050919050565b5f6020820190508181035f830152614b2781614aee565b9050919050565b7f666163746f72795f6275726e00000000000000000000000000000000000000005f82015250565b5f614b62600c836139b3565b9150614b6d82614b2e565b602082019050919050565b5f604082019050614b8b5f830184613b04565b8181036020830152614b9c81614b56565b905092915050565b7f496e76616c696420726563697069656e740000000000000000000000000000005f82015250565b5f614bd86011836139b3565b9150614be382614ba4565b602082019050919050565b5f6020820190508181035f830152614c0581614bcc565b9050919050565b7f45786365656473206d617820737570706c7900000000000000000000000000005f82015250565b5f614c406012836139b3565b9150614c4b82614c0c565b602082019050919050565b5f6020820190508181035f830152614c6d81614c34565b9050919050565b5f606082019050614c875f83018661411f565b614c946020830185613b04565b614ca16040830184613b04565b949350505050565b5f81519050614cb781613bb1565b92915050565b5f60208284031215614cd257614cd16137d5565b5b5f614cdf84828501614ca9565b91505092915050565b5f604082019050614cfb5f83018561411f565b614d086020830184613981565b9392505050565b7f5370656e6465722066726f7a656e0000000000000000000000000000000000005f82015250565b5f614d43600e836139b3565b9150614d4e82614d0f565b602082019050919050565b5f6020820190508181035f830152614d7081614d37565b9050919050565b7f5370656e64657220626c61636b6c6973746564000000000000000000000000005f82015250565b5f614dab6013836139b3565b9150614db682614d77565b602082019050919050565b5f6020820190508181035f830152614dd881614d9f565b9050919050565b7f53656e6465722066726f7a656e000000000000000000000000000000000000005f82015250565b5f614e13600d836139b3565b9150614e1e82614ddf565b602082019050919050565b5f6020820190508181035f830152614e4081614e07565b9050919050565b7f526563697069656e742066726f7a656e000000000000000000000000000000005f82015250565b5f614e7b6010836139b3565b9150614e8682614e47565b602082019050919050565b5f6020820190508181035f830152614ea881614e6f565b9050919050565b7f53656e64657220626c61636b6c697374656400000000000000000000000000005f82015250565b5f614ee36012836139b3565b9150614eee82614eaf565b602082019050919050565b5f6020820190508181035f830152614f1081614ed7565b9050919050565b7f526563697069656e7420626c61636b6c697374656400000000000000000000005f82015250565b5f614f4b6015836139b3565b9150614f5682614f17565b602082019050919050565b5f6020820190508181035f830152614f7881614f3f565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614fdb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614fa0565b614fe58683614fa0565b95508019841693508086168417925050509392505050565b5f61501761501261500d84613a93565b61459d565b613a93565b9050919050565b5f819050919050565b61503083614ffd565b61504461503c8261501e565b848454614fac565b825550505050565b5f5f905090565b61505b61504c565b615066818484615027565b505050565b5f5b8281101561508c576150815f828401615053565b60018101905061506d565b505050565b601f8211156150df57828211156150de576150ab81614f7f565b6150b483614f91565b6150bd85614f91565b60208610156150ca575f90505b8083016150d98284038261506b565b505050505b5b505050565b5f82821c905092915050565b5f6150ff5f19846008026150e4565b1980831691505092915050565b5f61511783836150f0565b9150826002028217905092915050565b615130826139a9565b67ffffffffffffffff81111561514957615148613cd2565b5b615153825461428e565b61515e828285615091565b5f60209050601f83116001811461518f575f841561517d578287015190505b615187858261510c565b8655506151ee565b601f19841661519d86614f7f565b5f5b828110156151c45784890151825560018201915060208501945060208101905061519f565b868310156151e157848901516151dd601f8916826150f0565b8355505b6001600288020188555050505b505050505050565b5f81519050919050565b5f81905092915050565b5f615214826151f6565b61521e8185615200565b935061522e8185602086016139c3565b80840191505092915050565b5f615245828461520a565b91508190509291505056fea26469706673582212209f09bdcb6455deb48fd6c03c262f711a46bbba4c56eff27aed1716c415f49ea764736f6c63430008220033","name":"GoldfishToken","is_blueprint":false,"license_type":"none","is_fully_verified":true,"is_verified_via_eth_bytecode_db":false,"language":"solidity","evm_version":"default","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":false,"additional_sources":[{"file_path":"@openzeppelin/contracts-upgradeable@5.4/access/AccessControlUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.20;\n\nimport {IAccessControl} from \"@openzeppelin/contracts/access/IAccessControl.sol\";\nimport {ContextUpgradeable} from \"../utils/ContextUpgradeable.sol\";\nimport {IERC165} from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\nimport {ERC165Upgradeable} from \"../utils/introspection/ERC165Upgradeable.sol\";\nimport {Initializable} from \"../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 * ```solidity\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 * ```solidity\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. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControl, ERC165Upgradeable {\n    struct RoleData {\n        mapping(address account => bool) hasRole;\n        bytes32 adminRole;\n    }\n\n    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n\n    /// @custom:storage-location erc7201:openzeppelin.storage.AccessControl\n    struct AccessControlStorage {\n        mapping(bytes32 role => RoleData) _roles;\n    }\n\n    // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.AccessControl\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant AccessControlStorageLocation = 0x02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800;\n\n    function _getAccessControlStorage() private pure returns (AccessControlStorage storage $) {\n        assembly {\n            $.slot := AccessControlStorageLocation\n        }\n    }\n\n    /**\n     * @dev Modifier that checks that an account has a specific role. Reverts\n     * with an {AccessControlUnauthorizedAccount} error including the required role.\n     */\n    modifier onlyRole(bytes32 role) {\n        _checkRole(role);\n        _;\n    }\n\n    function __AccessControl_init() internal onlyInitializing {\n    }\n\n    function __AccessControl_init_unchained() internal onlyInitializing {\n    }\n    /// @inheritdoc IERC165\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return interfaceId == type(IAccessControl).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 returns (bool) {\n        AccessControlStorage storage $ = _getAccessControlStorage();\n        return $._roles[role].hasRole[account];\n    }\n\n    /**\n     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\n     * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\n     */\n    function _checkRole(bytes32 role) internal view virtual {\n        _checkRole(role, _msgSender());\n    }\n\n    /**\n     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\n     * is missing `role`.\n     */\n    function _checkRole(bytes32 role, address account) internal view virtual {\n        if (!hasRole(role, account)) {\n            revert AccessControlUnauthorizedAccount(account, role);\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 returns (bytes32) {\n        AccessControlStorage storage $ = _getAccessControlStorage();\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     * May emit a {RoleGranted} event.\n     */\n    function grantRole(bytes32 role, address account) public virtual 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     * May emit a {RoleRevoked} event.\n     */\n    function revokeRole(bytes32 role, address account) public virtual 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 `callerConfirmation`.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function renounceRole(bytes32 role, address callerConfirmation) public virtual {\n        if (callerConfirmation != _msgSender()) {\n            revert AccessControlBadConfirmation();\n        }\n\n        _revokeRole(role, callerConfirmation);\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        AccessControlStorage storage $ = _getAccessControlStorage();\n        bytes32 previousAdminRole = getRoleAdmin(role);\n        $._roles[role].adminRole = adminRole;\n        emit RoleAdminChanged(role, previousAdminRole, adminRole);\n    }\n\n    /**\n     * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\n     *\n     * Internal function without access restriction.\n     *\n     * May emit a {RoleGranted} event.\n     */\n    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\n        AccessControlStorage storage $ = _getAccessControlStorage();\n        if (!hasRole(role, account)) {\n            $._roles[role].hasRole[account] = true;\n            emit RoleGranted(role, account, _msgSender());\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked.\n     *\n     * Internal function without access restriction.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\n        AccessControlStorage storage $ = _getAccessControlStorage();\n        if (hasRole(role, account)) {\n            $._roles[role].hasRole[account] = false;\n            emit RoleRevoked(role, account, _msgSender());\n            return true;\n        } else {\n            return false;\n        }\n    }\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable@5.4/proxy/utils/Initializable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n    /**\n     * @dev Storage of the initializable contract.\n     *\n     * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n     * when using with upgradeable contracts.\n     *\n     * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n     */\n    struct InitializableStorage {\n        /**\n         * @dev Indicates that the contract has been initialized.\n         */\n        uint64 _initialized;\n        /**\n         * @dev Indicates that the contract is in the process of being initialized.\n         */\n        bool _initializing;\n    }\n\n    // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n    /**\n     * @dev The contract is already initialized.\n     */\n    error InvalidInitialization();\n\n    /**\n     * @dev The contract is not initializing.\n     */\n    error NotInitializing();\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized(uint64 version);\n\n    /**\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n     * `onlyInitializing` functions can be used to initialize parent contracts.\n     *\n     * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n     * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n     * production.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier initializer() {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        // Cache values to avoid duplicated sloads\n        bool isTopLevelCall = !$._initializing;\n        uint64 initialized = $._initialized;\n\n        // Allowed calls:\n        // - initialSetup: the contract is not in the initializing state and no previous version was\n        //                 initialized\n        // - construction: the contract is initialized at version 1 (no reinitialization) and the\n        //                 current contract is just being deployed\n        bool initialSetup = initialized == 0 && isTopLevelCall;\n        bool construction = initialized == 1 && address(this).code.length == 0;\n\n        if (!initialSetup && !construction) {\n            revert InvalidInitialization();\n        }\n        $._initialized = 1;\n        if (isTopLevelCall) {\n            $._initializing = true;\n        }\n        _;\n        if (isTopLevelCall) {\n            $._initializing = false;\n            emit Initialized(1);\n        }\n    }\n\n    /**\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n     * used to initialize parent contracts.\n     *\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n     * are added through upgrades and that require initialization.\n     *\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\n     *\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n     * a contract, executing them in the right order is up to the developer or operator.\n     *\n     * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier reinitializer(uint64 version) {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        if ($._initializing || $._initialized >= version) {\n            revert InvalidInitialization();\n        }\n        $._initialized = version;\n        $._initializing = true;\n        _;\n        $._initializing = false;\n        emit Initialized(version);\n    }\n\n    /**\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\n     */\n    modifier onlyInitializing() {\n        _checkInitializing();\n        _;\n    }\n\n    /**\n     * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n     */\n    function _checkInitializing() internal view virtual {\n        if (!_isInitializing()) {\n            revert NotInitializing();\n        }\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     *\n     * Emits an {Initialized} event the first time it is successfully executed.\n     */\n    function _disableInitializers() internal virtual {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        if ($._initializing) {\n            revert InvalidInitialization();\n        }\n        if ($._initialized != type(uint64).max) {\n            $._initialized = type(uint64).max;\n            emit Initialized(type(uint64).max);\n        }\n    }\n\n    /**\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\n     */\n    function _getInitializedVersion() internal view returns (uint64) {\n        return _getInitializableStorage()._initialized;\n    }\n\n    /**\n     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n     */\n    function _isInitializing() internal view returns (bool) {\n        return _getInitializableStorage()._initializing;\n    }\n\n    /**\n     * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n     *\n     * NOTE: Consider following the ERC-7201 formula to derive storage locations.\n     */\n    function _initializableStorageSlot() internal pure virtual returns (bytes32) {\n        return INITIALIZABLE_STORAGE;\n    }\n\n    /**\n     * @dev Returns a pointer to the storage namespace.\n     */\n    // solhint-disable-next-line var-name-mixedcase\n    function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n        bytes32 slot = _initializableStorageSlot();\n        assembly {\n            $.slot := slot\n        }\n    }\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable@5.4/proxy/utils/UUPSUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/UUPSUpgradeable.sol)\n\npragma solidity ^0.8.22;\n\nimport {IERC1822Proxiable} from \"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\";\nimport {ERC1967Utils} from \"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\";\nimport {Initializable} from \"./Initializable.sol\";\n\n/**\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\n *\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\n * `UUPSUpgradeable` with a custom implementation of upgrades.\n *\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\n */\nabstract contract UUPSUpgradeable is Initializable, IERC1822Proxiable {\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n    address private immutable __self = address(this);\n\n    /**\n     * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)`\n     * and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called,\n     * while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string.\n     * If the getter returns `\"5.0.0\"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must\n     * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function\n     * during an upgrade.\n     */\n    string public constant UPGRADE_INTERFACE_VERSION = \"5.0.0\";\n\n    /**\n     * @dev The call is from an unauthorized context.\n     */\n    error UUPSUnauthorizedCallContext();\n\n    /**\n     * @dev The storage `slot` is unsupported as a UUID.\n     */\n    error UUPSUnsupportedProxiableUUID(bytes32 slot);\n\n    /**\n     * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\n     * a proxy contract with an implementation (as defined in ERC-1967) pointing to self. This should only be the case\n     * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\n     * function through ERC-1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\n     * fail.\n     */\n    modifier onlyProxy() {\n        _checkProxy();\n        _;\n    }\n\n    /**\n     * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\n     * callable on the implementing contract but not through proxies.\n     */\n    modifier notDelegated() {\n        _checkNotDelegated();\n        _;\n    }\n\n    function __UUPSUpgradeable_init() internal onlyInitializing {\n    }\n\n    function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the\n     * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\n     *\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n     * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\n     */\n    function proxiableUUID() external view virtual notDelegated returns (bytes32) {\n        return ERC1967Utils.IMPLEMENTATION_SLOT;\n    }\n\n    /**\n     * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\n     * encoded in `data`.\n     *\n     * Calls {_authorizeUpgrade}.\n     *\n     * Emits an {Upgraded} event.\n     *\n     * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\n     */\n    function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\n        _authorizeUpgrade(newImplementation);\n        _upgradeToAndCallUUPS(newImplementation, data);\n    }\n\n    /**\n     * @dev Reverts if the execution is not performed via delegatecall or the execution\n     * context is not of a proxy with an ERC-1967 compliant implementation pointing to self.\n     */\n    function _checkProxy() internal view virtual {\n        if (\n            address(this) == __self || // Must be called through delegatecall\n            ERC1967Utils.getImplementation() != __self // Must be called through an active proxy\n        ) {\n            revert UUPSUnauthorizedCallContext();\n        }\n    }\n\n    /**\n     * @dev Reverts if the execution is performed via delegatecall.\n     * See {notDelegated}.\n     */\n    function _checkNotDelegated() internal view virtual {\n        if (address(this) != __self) {\n            // Must not be called through delegatecall\n            revert UUPSUnauthorizedCallContext();\n        }\n    }\n\n    /**\n     * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\n     * {upgradeToAndCall}.\n     *\n     * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\n     *\n     * ```solidity\n     * function _authorizeUpgrade(address) internal onlyOwner {}\n     * ```\n     */\n    function _authorizeUpgrade(address newImplementation) internal virtual;\n\n    /**\n     * @dev Performs an implementation upgrade with a security check for UUPS proxies, and additional setup call.\n     *\n     * As a security check, {proxiableUUID} is invoked in the new implementation, and the return value\n     * is expected to be the implementation slot in ERC-1967.\n     *\n     * Emits an {IERC1967-Upgraded} event.\n     */\n    function _upgradeToAndCallUUPS(address newImplementation, bytes memory data) private {\n        try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n            if (slot != ERC1967Utils.IMPLEMENTATION_SLOT) {\n                revert UUPSUnsupportedProxiableUUID(slot);\n            }\n            ERC1967Utils.upgradeToAndCall(newImplementation, data);\n        } catch {\n            // The implementation is not UUPS\n            revert ERC1967Utils.ERC1967InvalidImplementation(newImplementation);\n        }\n    }\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable@5.4/token/ERC20/ERC20Upgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {IERC20Metadata} from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport {ContextUpgradeable} from \"../../utils/ContextUpgradeable.sol\";\nimport {IERC20Errors} from \"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\";\nimport {Initializable} from \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC-20\n * applications.\n */\nabstract contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20, IERC20Metadata, IERC20Errors {\n    /// @custom:storage-location erc7201:openzeppelin.storage.ERC20\n    struct ERC20Storage {\n        mapping(address account => uint256) _balances;\n\n        mapping(address account => mapping(address spender => uint256)) _allowances;\n\n        uint256 _totalSupply;\n\n        string _name;\n        string _symbol;\n    }\n\n    // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.ERC20\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant ERC20StorageLocation = 0x52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00;\n\n    function _getERC20Storage() private pure returns (ERC20Storage storage $) {\n        assembly {\n            $.slot := ERC20StorageLocation\n        }\n    }\n\n    /**\n     * @dev Sets the values for {name} and {symbol}.\n     *\n     * Both values are immutable: they can only be set once during construction.\n     */\n    function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing {\n        __ERC20_init_unchained(name_, symbol_);\n    }\n\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\n        ERC20Storage storage $ = _getERC20Storage();\n        $._name = name_;\n        $._symbol = symbol_;\n    }\n\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() public view virtual returns (string memory) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return $._name;\n    }\n\n    /**\n     * @dev Returns the symbol of the token, usually a shorter version of the\n     * name.\n     */\n    function symbol() public view virtual returns (string memory) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return $._symbol;\n    }\n\n    /**\n     * @dev Returns the number of decimals used to get its user representation.\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\n     * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n     *\n     * Tokens usually opt for a value of 18, imitating the relationship between\n     * Ether and Wei. This is the default value returned by this function, unless\n     * it's overridden.\n     *\n     * NOTE: This information is only used for _display_ purposes: it in\n     * no way affects any of the arithmetic of the contract, including\n     * {IERC20-balanceOf} and {IERC20-transfer}.\n     */\n    function decimals() public view virtual returns (uint8) {\n        return 18;\n    }\n\n    /// @inheritdoc IERC20\n    function totalSupply() public view virtual returns (uint256) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return $._totalSupply;\n    }\n\n    /// @inheritdoc IERC20\n    function balanceOf(address account) public view virtual returns (uint256) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return $._balances[account];\n    }\n\n    /**\n     * @dev See {IERC20-transfer}.\n     *\n     * Requirements:\n     *\n     * - `to` cannot be the zero address.\n     * - the caller must have a balance of at least `value`.\n     */\n    function transfer(address to, uint256 value) public virtual returns (bool) {\n        address owner = _msgSender();\n        _transfer(owner, to, value);\n        return true;\n    }\n\n    /// @inheritdoc IERC20\n    function allowance(address owner, address spender) public view virtual returns (uint256) {\n        ERC20Storage storage $ = _getERC20Storage();\n        return $._allowances[owner][spender];\n    }\n\n    /**\n     * @dev See {IERC20-approve}.\n     *\n     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\n     * `transferFrom`. This is semantically equivalent to an infinite approval.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     */\n    function approve(address spender, uint256 value) public virtual returns (bool) {\n        address owner = _msgSender();\n        _approve(owner, spender, value);\n        return true;\n    }\n\n    /**\n     * @dev See {IERC20-transferFrom}.\n     *\n     * Skips emitting an {Approval} event indicating an allowance update. This is not\n     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].\n     *\n     * NOTE: Does not update the allowance if the current allowance\n     * is the maximum `uint256`.\n     *\n     * Requirements:\n     *\n     * - `from` and `to` cannot be the zero address.\n     * - `from` must have a balance of at least `value`.\n     * - the caller must have allowance for ``from``'s tokens of at least\n     * `value`.\n     */\n    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n        address spender = _msgSender();\n        _spendAllowance(from, spender, value);\n        _transfer(from, to, value);\n        return true;\n    }\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to`.\n     *\n     * This internal function is equivalent to {transfer}, and can be used to\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\n     *\n     * Emits a {Transfer} event.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead.\n     */\n    function _transfer(address from, address to, uint256 value) internal {\n        if (from == address(0)) {\n            revert ERC20InvalidSender(address(0));\n        }\n        if (to == address(0)) {\n            revert ERC20InvalidReceiver(address(0));\n        }\n        _update(from, to, value);\n    }\n\n    /**\n     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\n     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\n     * this function.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _update(address from, address to, uint256 value) internal virtual {\n        ERC20Storage storage $ = _getERC20Storage();\n        if (from == address(0)) {\n            // Overflow check required: The rest of the code assumes that totalSupply never overflows\n            $._totalSupply += value;\n        } else {\n            uint256 fromBalance = $._balances[from];\n            if (fromBalance < value) {\n                revert ERC20InsufficientBalance(from, fromBalance, value);\n            }\n            unchecked {\n                // Overflow not possible: value <= fromBalance <= totalSupply.\n                $._balances[from] = fromBalance - value;\n            }\n        }\n\n        if (to == address(0)) {\n            unchecked {\n                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\n                $._totalSupply -= value;\n            }\n        } else {\n            unchecked {\n                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\n                $._balances[to] += value;\n            }\n        }\n\n        emit Transfer(from, to, value);\n    }\n\n    /**\n     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\n     * Relies on the `_update` mechanism\n     *\n     * Emits a {Transfer} event with `from` set to the zero address.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead.\n     */\n    function _mint(address account, uint256 value) internal {\n        if (account == address(0)) {\n            revert ERC20InvalidReceiver(address(0));\n        }\n        _update(address(0), account, value);\n    }\n\n    /**\n     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\n     * Relies on the `_update` mechanism.\n     *\n     * Emits a {Transfer} event with `to` set to the zero address.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead\n     */\n    function _burn(address account, uint256 value) internal {\n        if (account == address(0)) {\n            revert ERC20InvalidSender(address(0));\n        }\n        _update(account, address(0), value);\n    }\n\n    /**\n     * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.\n     *\n     * This internal function is equivalent to `approve`, and can be used to\n     * e.g. set automatic allowances for certain subsystems, etc.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `owner` cannot be the zero address.\n     * - `spender` cannot be the zero address.\n     *\n     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n     */\n    function _approve(address owner, address spender, uint256 value) internal {\n        _approve(owner, spender, value, true);\n    }\n\n    /**\n     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\n     *\n     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\n     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any\n     * `Approval` event during `transferFrom` operations.\n     *\n     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to\n     * true using the following override:\n     *\n     * ```solidity\n     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\n     *     super._approve(owner, spender, value, true);\n     * }\n     * ```\n     *\n     * Requirements are the same as {_approve}.\n     */\n    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\n        ERC20Storage storage $ = _getERC20Storage();\n        if (owner == address(0)) {\n            revert ERC20InvalidApprover(address(0));\n        }\n        if (spender == address(0)) {\n            revert ERC20InvalidSpender(address(0));\n        }\n        $._allowances[owner][spender] = value;\n        if (emitEvent) {\n            emit Approval(owner, spender, value);\n        }\n    }\n\n    /**\n     * @dev Updates `owner`'s allowance for `spender` based on spent `value`.\n     *\n     * Does not update the allowance value in case of infinite allowance.\n     * Revert if not enough allowance is available.\n     *\n     * Does not emit an {Approval} event.\n     */\n    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\n        uint256 currentAllowance = allowance(owner, spender);\n        if (currentAllowance < type(uint256).max) {\n            if (currentAllowance < value) {\n                revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n            }\n            unchecked {\n                _approve(owner, spender, currentAllowance - value, false);\n            }\n        }\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/interfaces/draft-IERC1822.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev ERC-1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822Proxiable {\n    /**\n     * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n     * address.\n     *\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n     * function revert if invoked through a proxy.\n     */\n    function proxiableUUID() external view returns (bytes32);\n}\n"},{"file_path":"@openzeppelin/contracts/utils/introspection/IERC165.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},{"file_path":"@openzeppelin/contracts/interfaces/IERC1967.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1967.sol)\n\npragma solidity >=0.4.11;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n */\ninterface IERC1967 {\n    /**\n     * @dev Emitted when the implementation is upgraded.\n     */\n    event Upgraded(address indexed implementation);\n\n    /**\n     * @dev Emitted when the admin account has changed.\n     */\n    event AdminChanged(address previousAdmin, address newAdmin);\n\n    /**\n     * @dev Emitted when the beacon is changed.\n     */\n    event BeaconUpgraded(address indexed beacon);\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable@5.4/token/ERC20/extensions/ERC20BurnableUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Burnable.sol)\n\npragma solidity ^0.8.20;\n\nimport {ERC20Upgradeable} from \"../ERC20Upgradeable.sol\";\nimport {ContextUpgradeable} from \"../../../utils/ContextUpgradeable.sol\";\nimport {Initializable} from \"../../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\n * tokens and those that they have an allowance for, in a way that can be\n * recognized off-chain (via event analysis).\n */\nabstract contract ERC20BurnableUpgradeable is Initializable, ContextUpgradeable, ERC20Upgradeable {\n    function __ERC20Burnable_init() internal onlyInitializing {\n    }\n\n    function __ERC20Burnable_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev Destroys a `value` amount of tokens from the caller.\n     *\n     * See {ERC20-_burn}.\n     */\n    function burn(uint256 value) public virtual {\n        _burn(_msgSender(), value);\n    }\n\n    /**\n     * @dev Destroys a `value` amount of tokens from `account`, deducting from\n     * the caller's allowance.\n     *\n     * See {ERC20-_burn} and {ERC20-allowance}.\n     *\n     * Requirements:\n     *\n     * - the caller must have allowance for ``accounts``'s tokens of at least\n     * `value`.\n     */\n    function burnFrom(address account, uint256 value) public virtual {\n        _spendAllowance(account, _msgSender(), value);\n        _burn(account, value);\n    }\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable@5.4/utils/ContextUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n    function __Context_init() internal onlyInitializing {\n    }\n\n    function __Context_init_unchained() internal onlyInitializing {\n    }\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable@5.4/utils/PausableUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (utils/Pausable.sol)\n\npragma solidity ^0.8.20;\n\nimport {ContextUpgradeable} from \"../utils/ContextUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n    /// @custom:storage-location erc7201:openzeppelin.storage.Pausable\n    struct PausableStorage {\n        bool _paused;\n    }\n\n    // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Pausable\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant PausableStorageLocation = 0xcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300;\n\n    function _getPausableStorage() private pure returns (PausableStorage storage $) {\n        assembly {\n            $.slot := PausableStorageLocation\n        }\n    }\n\n    /**\n     * @dev Emitted when the pause is triggered by `account`.\n     */\n    event Paused(address account);\n\n    /**\n     * @dev Emitted when the pause is lifted by `account`.\n     */\n    event Unpaused(address account);\n\n    /**\n     * @dev The operation failed because the contract is paused.\n     */\n    error EnforcedPause();\n\n    /**\n     * @dev The operation failed because the contract is not paused.\n     */\n    error ExpectedPause();\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is not paused.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    modifier whenNotPaused() {\n        _requireNotPaused();\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is paused.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    modifier whenPaused() {\n        _requirePaused();\n        _;\n    }\n\n    function __Pausable_init() internal onlyInitializing {\n    }\n\n    function __Pausable_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev Returns true if the contract is paused, and false otherwise.\n     */\n    function paused() public view virtual returns (bool) {\n        PausableStorage storage $ = _getPausableStorage();\n        return $._paused;\n    }\n\n    /**\n     * @dev Throws if the contract is paused.\n     */\n    function _requireNotPaused() internal view virtual {\n        if (paused()) {\n            revert EnforcedPause();\n        }\n    }\n\n    /**\n     * @dev Throws if the contract is not paused.\n     */\n    function _requirePaused() internal view virtual {\n        if (!paused()) {\n            revert ExpectedPause();\n        }\n    }\n\n    /**\n     * @dev Triggers stopped state.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    function _pause() internal virtual whenNotPaused {\n        PausableStorage storage $ = _getPausableStorage();\n        $._paused = true;\n        emit Paused(_msgSender());\n    }\n\n    /**\n     * @dev Returns to normal state.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    function _unpause() internal virtual whenPaused {\n        PausableStorage storage $ = _getPausableStorage();\n        $._paused = false;\n        emit Unpaused(_msgSender());\n    }\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable@5.4/utils/introspection/ERC165Upgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\nimport {Initializable} from \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165Upgradeable is Initializable, IERC165 {\n    function __ERC165_init() internal onlyInitializing {\n    }\n\n    function __ERC165_init_unchained() internal onlyInitializing {\n    }\n    /// @inheritdoc IERC165\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n        return interfaceId == type(IERC165).interfaceId;\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/access/IAccessControl.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (access/IAccessControl.sol)\n\npragma solidity >=0.8.4;\n\n/**\n * @dev External interface of AccessControl declared to support ERC-165 detection.\n */\ninterface IAccessControl {\n    /**\n     * @dev The `account` is missing a role.\n     */\n    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\n\n    /**\n     * @dev The caller of a function is not the expected one.\n     *\n     * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\n     */\n    error AccessControlBadConfirmation();\n\n    /**\n     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n     *\n     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n     * {RoleAdminChanged} not being emitted to signal this.\n     */\n    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n    /**\n     * @dev Emitted when `account` is granted `role`.\n     *\n     * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).\n     * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\n     */\n    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Emitted when `account` is revoked `role`.\n     *\n     * `sender` is the account that originated the contract call:\n     *   - if using `revokeRole`, it is the admin role bearer\n     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)\n     */\n    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) external view returns (bool);\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 {AccessControl-_setRoleAdmin}.\n     */\n    function getRoleAdmin(bytes32 role) external view returns (bytes32);\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) external;\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) external;\n\n    /**\n     * @dev Revokes `role` from the calling account.\n     *\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\n     * purpose is to provide a mechanism for accounts to lose their privileges\n     * if they are compromised (such as when a trusted device is misplaced).\n     *\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must be `callerConfirmation`.\n     */\n    function renounceRole(bytes32 role, address callerConfirmation) external;\n}\n"},{"file_path":"@openzeppelin/contracts/interfaces/draft-IERC6093.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC6093.sol)\npragma solidity >=0.8.4;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC20InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC20InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     * @param allowance Amount of tokens a `spender` is allowed to operate with.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC20InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n    /**\n     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.\n     * Used in balance queries.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721InvalidOwner(address owner);\n\n    /**\n     * @dev Indicates a `tokenId` whose `owner` is the zero address.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721NonexistentToken(uint256 tokenId);\n\n    /**\n     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param tokenId Identifier number of a token.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC721InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC721InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC721InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC1155InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC1155InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC1155MissingApprovalForAll(address operator, address owner);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC1155InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC1155InvalidOperator(address operator);\n\n    /**\n     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n     * Used in batch transfers.\n     * @param idsLength Length of the array of token identifiers\n     * @param valuesLength Length of the array of token amounts\n     */\n    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"},{"file_path":"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (proxy/ERC1967/ERC1967Utils.sol)\n\npragma solidity ^0.8.21;\n\nimport {IBeacon} from \"../beacon/IBeacon.sol\";\nimport {IERC1967} from \"../../interfaces/IERC1967.sol\";\nimport {Address} from \"../../utils/Address.sol\";\nimport {StorageSlot} from \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This library provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] slots.\n */\nlibrary ERC1967Utils {\n    /**\n     * @dev Storage slot with the address of the current implementation.\n     * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1.\n     */\n    // solhint-disable-next-line private-vars-leading-underscore\n    bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n    /**\n     * @dev The `implementation` of the proxy is invalid.\n     */\n    error ERC1967InvalidImplementation(address implementation);\n\n    /**\n     * @dev The `admin` of the proxy is invalid.\n     */\n    error ERC1967InvalidAdmin(address admin);\n\n    /**\n     * @dev The `beacon` of the proxy is invalid.\n     */\n    error ERC1967InvalidBeacon(address beacon);\n\n    /**\n     * @dev An upgrade function sees `msg.value > 0` that may be lost.\n     */\n    error ERC1967NonPayable();\n\n    /**\n     * @dev Returns the current implementation address.\n     */\n    function getImplementation() internal view returns (address) {\n        return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the ERC-1967 implementation slot.\n     */\n    function _setImplementation(address newImplementation) private {\n        if (newImplementation.code.length == 0) {\n            revert ERC1967InvalidImplementation(newImplementation);\n        }\n        StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;\n    }\n\n    /**\n     * @dev Performs implementation upgrade with additional setup call if data is nonempty.\n     * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n     * to avoid stuck value in the contract.\n     *\n     * Emits an {IERC1967-Upgraded} event.\n     */\n    function upgradeToAndCall(address newImplementation, bytes memory data) internal {\n        _setImplementation(newImplementation);\n        emit IERC1967.Upgraded(newImplementation);\n\n        if (data.length > 0) {\n            Address.functionDelegateCall(newImplementation, data);\n        } else {\n            _checkNonPayable();\n        }\n    }\n\n    /**\n     * @dev Storage slot with the admin of the contract.\n     * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1.\n     */\n    // solhint-disable-next-line private-vars-leading-underscore\n    bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n    /**\n     * @dev Returns the current admin.\n     *\n     * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using\n     * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n     * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n     */\n    function getAdmin() internal view returns (address) {\n        return StorageSlot.getAddressSlot(ADMIN_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the ERC-1967 admin slot.\n     */\n    function _setAdmin(address newAdmin) private {\n        if (newAdmin == address(0)) {\n            revert ERC1967InvalidAdmin(address(0));\n        }\n        StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;\n    }\n\n    /**\n     * @dev Changes the admin of the proxy.\n     *\n     * Emits an {IERC1967-AdminChanged} event.\n     */\n    function changeAdmin(address newAdmin) internal {\n        emit IERC1967.AdminChanged(getAdmin(), newAdmin);\n        _setAdmin(newAdmin);\n    }\n\n    /**\n     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n     * This is the keccak-256 hash of \"eip1967.proxy.beacon\" subtracted by 1.\n     */\n    // solhint-disable-next-line private-vars-leading-underscore\n    bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n    /**\n     * @dev Returns the current beacon.\n     */\n    function getBeacon() internal view returns (address) {\n        return StorageSlot.getAddressSlot(BEACON_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new beacon in the ERC-1967 beacon slot.\n     */\n    function _setBeacon(address newBeacon) private {\n        if (newBeacon.code.length == 0) {\n            revert ERC1967InvalidBeacon(newBeacon);\n        }\n\n        StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;\n\n        address beaconImplementation = IBeacon(newBeacon).implementation();\n        if (beaconImplementation.code.length == 0) {\n            revert ERC1967InvalidImplementation(beaconImplementation);\n        }\n    }\n\n    /**\n     * @dev Change the beacon and trigger a setup call if data is nonempty.\n     * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n     * to avoid stuck value in the contract.\n     *\n     * Emits an {IERC1967-BeaconUpgraded} event.\n     *\n     * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since\n     * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for\n     * efficiency.\n     */\n    function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {\n        _setBeacon(newBeacon);\n        emit IERC1967.BeaconUpgraded(newBeacon);\n\n        if (data.length > 0) {\n            Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n        } else {\n            _checkNonPayable();\n        }\n    }\n\n    /**\n     * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract\n     * if an upgrade doesn't perform an initialization call.\n     */\n    function _checkNonPayable() private {\n        if (msg.value > 0) {\n            revert ERC1967NonPayable();\n        }\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/proxy/beacon/IBeacon.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (proxy/beacon/IBeacon.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n    /**\n     * @dev Must return an address that can be used as a delegate call target.\n     *\n     * {UpgradeableBeacon} will check that this address is a contract.\n     */\n    function implementation() external view returns (address);\n}\n"},{"file_path":"@openzeppelin/contracts/token/ERC20/IERC20.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)\n\npragma solidity >=0.4.16;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},{"file_path":"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity >=0.6.2;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     */\n    function decimals() external view returns (uint8);\n}\n"},{"file_path":"@openzeppelin/contracts/utils/Address.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.4.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\nimport {Errors} from \"./Errors.sol\";\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n    /**\n     * @dev There's no code at `target` (it is not a contract).\n     */\n    error AddressEmptyCode(address target);\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        if (address(this).balance < amount) {\n            revert Errors.InsufficientBalance(address(this).balance, amount);\n        }\n\n        (bool success, bytes memory returndata) = recipient.call{value: amount}(\"\");\n        if (!success) {\n            _revert(returndata);\n        }\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason or custom error, it is bubbled\n     * up by this function (like regular Solidity function calls). However, if\n     * the call reverted with no returned reason, this function reverts with a\n     * {Errors.FailedCall} error.\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        if (address(this).balance < value) {\n            revert Errors.InsufficientBalance(address(this).balance, value);\n        }\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case\n     * of an unsuccessful call.\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata\n    ) internal view returns (bytes memory) {\n        if (!success) {\n            _revert(returndata);\n        } else {\n            // only check if target is a contract if the call was successful and the return data is empty\n            // otherwise we already know that it was a contract\n            if (returndata.length == 0 && target.code.length == 0) {\n                revert AddressEmptyCode(target);\n            }\n            return returndata;\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n     * revert reason or with a default {Errors.FailedCall} error.\n     */\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n        if (!success) {\n            _revert(returndata);\n        } else {\n            return returndata;\n        }\n    }\n\n    /**\n     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.\n     */\n    function _revert(bytes memory returndata) private pure {\n        // Look for revert reason and bubble it up if present\n        if (returndata.length > 0) {\n            // The easiest way to bubble the revert reason is using memory via assembly\n            assembly (\"memory-safe\") {\n                revert(add(returndata, 0x20), mload(returndata))\n            }\n        } else {\n            revert Errors.FailedCall();\n        }\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/utils/Errors.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of common custom errors used in multiple contracts\n *\n * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.\n * It is recommended to avoid relying on the error API for critical functionality.\n *\n * _Available since v5.1._\n */\nlibrary Errors {\n    /**\n     * @dev The ETH balance of the account is not enough to perform the operation.\n     */\n    error InsufficientBalance(uint256 balance, uint256 needed);\n\n    /**\n     * @dev A call to an address target failed. The target may have reverted.\n     */\n    error FailedCall();\n\n    /**\n     * @dev The deployment failed.\n     */\n    error FailedDeployment();\n\n    /**\n     * @dev A necessary precompile is missing.\n     */\n    error MissingPrecompile(address);\n}\n"},{"file_path":"@openzeppelin/contracts/utils/StorageSlot.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC-1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.\n *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n *     function _getImplementation() internal view returns (address) {\n *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n *     }\n *\n *     function _setImplementation(address newImplementation) internal {\n *         require(newImplementation.code.length > 0);\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n *     }\n * }\n * ```\n *\n * TIP: Consider using this library along with {SlotDerivation}.\n */\nlibrary StorageSlot {\n    struct AddressSlot {\n        address value;\n    }\n\n    struct BooleanSlot {\n        bool value;\n    }\n\n    struct Bytes32Slot {\n        bytes32 value;\n    }\n\n    struct Uint256Slot {\n        uint256 value;\n    }\n\n    struct Int256Slot {\n        int256 value;\n    }\n\n    struct StringSlot {\n        string value;\n    }\n\n    struct BytesSlot {\n        bytes value;\n    }\n\n    /**\n     * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n     */\n    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `BooleanSlot` with member `value` located at `slot`.\n     */\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Bytes32Slot` with member `value` located at `slot`.\n     */\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Uint256Slot` with member `value` located at `slot`.\n     */\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `Int256Slot` with member `value` located at `slot`.\n     */\n    function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns a `StringSlot` with member `value` located at `slot`.\n     */\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n     */\n    function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := store.slot\n        }\n    }\n\n    /**\n     * @dev Returns a `BytesSlot` with member `value` located at `slot`.\n     */\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n     */\n    function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n        assembly (\"memory-safe\") {\n            r.slot := store.slot\n        }\n    }\n}\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"AccountBlacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"frozen","type":"bool"}],"name":"AccountFrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address[]","name":"recipients","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"BatchTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"contractType","type":"string"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"ContractUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"ForceTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newCap","type":"uint256"}],"name":"MaxSupplyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"TokensBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"memo","type":"string"}],"name":"TokensMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREEZER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPPLY_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"blacklist","type":"bool"}],"name":"batchBlacklistAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"freeze","type":"bool"}],"name":"batchFreezeAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"batchTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklistedAccounts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"canTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"reason","type":"string"}],"name":"forceTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"freeze","type":"bool"}],"name":"freezeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"frozenAccounts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenStats","outputs":[{"internalType":"uint256","name":"currentSupply","type":"uint256"},{"internalType":"uint256","name":"minted","type":"uint256"},{"internalType":"uint256","name":"burned","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"memo","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minterContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","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":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setBlacklisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"setMinterContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":false,"constructor_args":null}