ETH Price: $3,298.57 (+0.40%)
 

Overview

Max Total Supply

1,000,000,000 SFM

Holders

1

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Token

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2022-08-08
*/

// SPDX-License-Identifier: MIT


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol)

pragma solidity ^0.8.0;

/**
 * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow
 * checks.
 *
 * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
 * easily result in undesired exploitation or bugs, since developers usually
 * assume that overflows raise errors. `SafeCast` restores this intuition by
 * reverting the transaction when such an operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 *
 * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing
 * all math on `uint256` and `int256` and then downcasting.
 */
library SafeCast {
    /**
     * @dev Returns the downcasted uint224 from uint256, reverting on
     * overflow (when the input is greater than largest uint224).
     *
     * Counterpart to Solidity's `uint224` operator.
     *
     * Requirements:
     *
     * - input must fit into 224 bits
     */
    function toUint224(uint256 value) internal pure returns (uint224) {
        require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits");
        return uint224(value);
    }

    /**
     * @dev Returns the downcasted uint128 from uint256, reverting on
     * overflow (when the input is greater than largest uint128).
     *
     * Counterpart to Solidity's `uint128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     */
    function toUint128(uint256 value) internal pure returns (uint128) {
        require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits");
        return uint128(value);
    }

    /**
     * @dev Returns the downcasted uint96 from uint256, reverting on
     * overflow (when the input is greater than largest uint96).
     *
     * Counterpart to Solidity's `uint96` operator.
     *
     * Requirements:
     *
     * - input must fit into 96 bits
     */
    function toUint96(uint256 value) internal pure returns (uint96) {
        require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits");
        return uint96(value);
    }

    /**
     * @dev Returns the downcasted uint64 from uint256, reverting on
     * overflow (when the input is greater than largest uint64).
     *
     * Counterpart to Solidity's `uint64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     */
    function toUint64(uint256 value) internal pure returns (uint64) {
        require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits");
        return uint64(value);
    }

    /**
     * @dev Returns the downcasted uint32 from uint256, reverting on
     * overflow (when the input is greater than largest uint32).
     *
     * Counterpart to Solidity's `uint32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     */
    function toUint32(uint256 value) internal pure returns (uint32) {
        require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits");
        return uint32(value);
    }

    /**
     * @dev Returns the downcasted uint16 from uint256, reverting on
     * overflow (when the input is greater than largest uint16).
     *
     * Counterpart to Solidity's `uint16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     */
    function toUint16(uint256 value) internal pure returns (uint16) {
        require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits");
        return uint16(value);
    }

    /**
     * @dev Returns the downcasted uint8 from uint256, reverting on
     * overflow (when the input is greater than largest uint8).
     *
     * Counterpart to Solidity's `uint8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     */
    function toUint8(uint256 value) internal pure returns (uint8) {
        require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits");
        return uint8(value);
    }

    /**
     * @dev Converts a signed int256 into an unsigned uint256.
     *
     * Requirements:
     *
     * - input must be greater than or equal to 0.
     */
    function toUint256(int256 value) internal pure returns (uint256) {
        require(value >= 0, "SafeCast: value must be positive");
        return uint256(value);
    }

    /**
     * @dev Returns the downcasted int128 from int256, reverting on
     * overflow (when the input is less than smallest int128 or
     * greater than largest int128).
     *
     * Counterpart to Solidity's `int128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     *
     * _Available since v3.1._
     */
    function toInt128(int256 value) internal pure returns (int128) {
        require(value >= type(int128).min && value <= type(int128).max, "SafeCast: value doesn't fit in 128 bits");
        return int128(value);
    }

    /**
     * @dev Returns the downcasted int64 from int256, reverting on
     * overflow (when the input is less than smallest int64 or
     * greater than largest int64).
     *
     * Counterpart to Solidity's `int64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     *
     * _Available since v3.1._
     */
    function toInt64(int256 value) internal pure returns (int64) {
        require(value >= type(int64).min && value <= type(int64).max, "SafeCast: value doesn't fit in 64 bits");
        return int64(value);
    }

    /**
     * @dev Returns the downcasted int32 from int256, reverting on
     * overflow (when the input is less than smallest int32 or
     * greater than largest int32).
     *
     * Counterpart to Solidity's `int32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     *
     * _Available since v3.1._
     */
    function toInt32(int256 value) internal pure returns (int32) {
        require(value >= type(int32).min && value <= type(int32).max, "SafeCast: value doesn't fit in 32 bits");
        return int32(value);
    }

    /**
     * @dev Returns the downcasted int16 from int256, reverting on
     * overflow (when the input is less than smallest int16 or
     * greater than largest int16).
     *
     * Counterpart to Solidity's `int16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     *
     * _Available since v3.1._
     */
    function toInt16(int256 value) internal pure returns (int16) {
        require(value >= type(int16).min && value <= type(int16).max, "SafeCast: value doesn't fit in 16 bits");
        return int16(value);
    }

    /**
     * @dev Returns the downcasted int8 from int256, reverting on
     * overflow (when the input is less than smallest int8 or
     * greater than largest int8).
     *
     * Counterpart to Solidity's `int8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     *
     * _Available since v3.1._
     */
    function toInt8(int256 value) internal pure returns (int8) {
        require(value >= type(int8).min && value <= type(int8).max, "SafeCast: value doesn't fit in 8 bits");
        return int8(value);
    }

    /**
     * @dev Converts an unsigned uint256 into a signed int256.
     *
     * Requirements:
     *
     * - input must be less than or equal to maxInt256.
     */
    function toInt256(uint256 value) internal pure returns (int256) {
        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive
        require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256");
        return int256(value);
    }
}

// File: IVotes.sol


// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)
pragma solidity ^0.8.0;

/**
 * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.
 *
 * _Available since v4.5._
 */
interface IVotes {
    /**
     * @dev Emitted when an account changes their delegate.
     */
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    /**
     * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.
     */
    event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);

    /**
     * @dev Returns the current amount of votes that `account` has.
     */
    function getVotes(address account) external view returns (uint256);

    /**
     * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).
     */
    function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);

    /**
     * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).
     *
     * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.
     * Votes that have not been delegated are still part of total supply, even though they would not participate in a
     * vote.
     */
    function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);

    /**
     * @dev Returns the delegate that `account` has chosen.
     */
    function delegates(address account) external view returns (address);

    /**
     * @dev Delegates votes from the sender to `delegatee`.
     */
    function delegate(address delegatee) external;

    /**
     * @dev Delegates votes from signer to `delegatee`.
     */
    function delegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}

// File: Math.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}

// File: Counters.sol


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: ECDSA.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File: draft-EIP712.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)

pragma solidity ^0.8.0;


/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

// File: Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: IERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: ERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) public _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 public _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[owner][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: draft-IERC20Permit.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: draft-ERC20Permit.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)

pragma solidity ^0.8.0;






/**
 * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * _Available since v3.4._
 */
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // solhint-disable-next-line var-name-mixedcase
    bytes32 private constant _PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;

    /**
     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
     *
     * It's a good idea to use the same `name` that is defined as the ERC20 token name.
     */
    constructor(string memory name) EIP712(name, "1") {}

    /**
     * @dev See {IERC20Permit-permit}.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "ERC20Permit: expired deadline");

        bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));

        bytes32 hash = _hashTypedDataV4(structHash);

        address signer = ECDSA.recover(hash, v, r, s);
        require(signer == owner, "ERC20Permit: invalid signature");

        _approve(owner, spender, value);
    }

    /**
     * @dev See {IERC20Permit-nonces}.
     */
    function nonces(address owner) public view virtual override returns (uint256) {
        return _nonces[owner].current();
    }

    /**
     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view override returns (bytes32) {
        return _domainSeparatorV4();
    }

    /**
     * @dev "Consume a nonce": return the current value and increment.
     *
     * _Available since v4.1._
     */
    function _useNonce(address owner) internal virtual returns (uint256 current) {
        Counters.Counter storage nonce = _nonces[owner];
        current = nonce.current();
        nonce.increment();
    }
}

// File: ERC20Votes.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol)

pragma solidity ^0.8.0;






/**
 * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,
 * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.
 *
 * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.
 *
 * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either
 * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting
 * power can be queried through the public accessors {getVotes} and {getPastVotes}.
 *
 * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it
 * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.
 *
 * _Available since v4.2._
 */
abstract contract ERC20Votes is IVotes, ERC20Permit {
    

    struct Checkpoint {
        uint32 fromBlock;
        uint224 votes;
    }

    bytes32 private constant _DELEGATION_TYPEHASH =
        keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    mapping(address => address) private _delegates;
    mapping(address => Checkpoint[]) private _checkpoints;
    Checkpoint[] private _totalSupplyCheckpoints;

    /**
     * @dev Get the `pos`-th checkpoint for `account`.
     */
    function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {
        return _checkpoints[account][pos];
    }

    /**
     * @dev Get number of checkpoints for `account`.
     */
    function numCheckpoints(address account) public view virtual returns (uint32) {
        return SafeCast.toUint32(_checkpoints[account].length);
    }

    /**
     * @dev Get the address `account` is currently delegating to.
     */
    function delegates(address account) public view virtual override returns (address) {
        return _delegates[account];
    }

    /**
     * @dev Gets the current votes balance for `account`
     */
    function getVotes(address account) public view virtual override returns (uint256) {
        uint256 pos = _checkpoints[account].length;
        return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;
    }

    /**
     * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.
     *
     * Requirements:
     *
     * - `blockNumber` must have been already mined
     */
    function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {
        require(blockNumber < block.number, "ERC20Votes: block not yet mined");
        return _checkpointsLookup(_checkpoints[account], blockNumber);
    }

    /**
     * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.
     * It is but NOT the sum of all the delegated votes!
     *
     * Requirements:
     *
     * - `blockNumber` must have been already mined
     */
    function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {
        require(blockNumber < block.number, "ERC20Votes: block not yet mined");
        return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);
    }

    /**
     * @dev Lookup a value in a list of (sorted) checkpoints.
     */
    function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {
        // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.
        //
        // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).
        // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.
        // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)
        // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)
        // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not
        // out of bounds (in which case we're looking too far in the past and the result is 0).
        // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is
        // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out
        // the same.
        uint256 high = ckpts.length;
        uint256 low = 0;
        while (low < high) {
            uint256 mid = Math.average(low, high);
            if (ckpts[mid].fromBlock > blockNumber) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }

        return high == 0 ? 0 : ckpts[high - 1].votes;
    }

    /**
     * @dev Delegate votes from the sender to `delegatee`.
     */
    function delegate(address delegatee) public virtual override {
        _delegate(_msgSender(), delegatee);
    }

    /**
     * @dev Delegates votes from signer to `delegatee`
     */
    function delegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= expiry, "ERC20Votes: signature expired");
        address signer = ECDSA.recover(
            _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),
            v,
            r,
            s
        );
        require(nonce == _useNonce(signer), "ERC20Votes: invalid nonce");
        _delegate(signer, delegatee);
    }


    /**
     * @dev Snapshots the totalSupply after it has been decreased.
     */
    function _burn(address account, uint256 amount) internal virtual override {
        super._burn(account, amount);

        _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);
    }

    /**
     * @dev Move voting power when tokens are transferred.
     *
     * Emits a {DelegateVotesChanged} event.
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._afterTokenTransfer(from, to, amount);

        _moveVotingPower(delegates(from), delegates(to), amount);
    }

    /**
     * @dev Change delegation for `delegator` to `delegatee`.
     *
     * Emits events {DelegateChanged} and {DelegateVotesChanged}.
     */
    function _delegate(address delegator, address delegatee) internal virtual {
        address currentDelegate = delegates(delegator);
        uint256 delegatorBalance = balanceOf(delegator);
        _delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveVotingPower(currentDelegate, delegatee, delegatorBalance);
    }

    function _moveVotingPower(
        address src,
        address dst,
        uint256 amount
    ) private {
        if (src != dst && amount > 0) {
            if (src != address(0)) {
                (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);
                emit DelegateVotesChanged(src, oldWeight, newWeight);
            }

            if (dst != address(0)) {
                (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);
                emit DelegateVotesChanged(dst, oldWeight, newWeight);
            }
        }
    }

    function _writeCheckpoint(
        Checkpoint[] storage ckpts,
        function(uint256, uint256) view returns (uint256) op,
        uint256 delta
    ) private returns (uint256 oldWeight, uint256 newWeight) {
        uint256 pos = ckpts.length;
        oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;
        newWeight = op(oldWeight, delta);

        if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {
            ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);
        } else {
            ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));
        }
    }

    function _add(uint256 a, uint256 b) private pure returns (uint256) {
        return a + b;
    }

    function _subtract(uint256 a, uint256 b) private pure returns (uint256) {
        return a - b;
    }
}

// File: SFM.sol


pragma solidity ^0.8.0;


contract Ownable is Context {
	address private _owner;

	event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

	/**
	* @dev Initializes the contract setting the deployer as the initial owner.
	*/
	constructor () {
		address msgSender = _msgSender();
		_owner = msgSender;
		emit OwnershipTransferred(address(0), msgSender);
	}

	/**
	* @dev Returns the address of the current owner.
	*/
	function owner() public view returns (address) {
		return _owner;
	}

	/**
	* @dev Throws if called by any account other than the owner.
	*/
	modifier onlyOwner() {
		require(_owner == _msgSender(), "Ownable: caller is not the owner");
		_;
	}

	/**
	* @dev Leaves the contract without owner. It will not be possible to call
	* `onlyOwner` functions anymore. Can only be called by the current owner.
	*
	* NOTE: Renouncing ownership will leave the contract without an owner,
	* thereby removing any functionality that is only available to the owner.
	*/
	function renounceOwnership() public onlyOwner {
		emit OwnershipTransferred(_owner, address(0));
		_owner = address(0);
	}

	/**
	* @dev Transfers ownership of the contract to a new account (`newOwner`).
	* Can only be called by the current owner.
	*/
	function transferOwnership(address newOwner) public onlyOwner {
		_transferOwnership(newOwner);
	}

	/**
	* @dev Transfers ownership of the contract to a new account (`newOwner`).
	*/
	function _transferOwnership(address newOwner) internal {
		require(newOwner != address(0), "Ownable: new owner is the zero address");
		emit OwnershipTransferred(_owner, newOwner);
		_owner = newOwner;
	}
}

contract Token is ERC20Votes, Ownable {

    constructor(uint256 amount) ERC20("SFMDAO", "SFM") ERC20Permit("SFMDAO") {
		 require(msg.sender != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), msg.sender,  amount);

        _totalSupply = amount;
        _balances[msg.sender] += amount;
        emit Transfer(address(0), msg.sender, amount);

        _afterTokenTransfer(address(0), msg.sender, amount);
    }

    // The functions below are overrides required by Solidity.

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal override(ERC20Votes) {
        super._afterTokenTransfer(from, to, amount);
    }

   

    function _burn(address account, uint256 amount)
        internal
        override(ERC20Votes)
    {
        super._burn(account, amount);
    }

    function burn(uint256 _amount) external onlyOwner {
        _burn(msg.sender, _amount);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_balances","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":"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":"amount","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":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint32","name":"pos","type":"uint32"}],"name":"checkpoints","outputs":[{"components":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint224","name":"votes","type":"uint224"}],"internalType":"struct ERC20Votes.Checkpoint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"amount","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":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101406040523480156200001257600080fd5b506040516200500438038062005004833981810160405281019062000038919062000c33565b6040518060400160405280600681526020017f53464d44414f0000000000000000000000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f53464d44414f00000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f53464d000000000000000000000000000000000000000000000000000000000081525081600390805190602001906200012992919062000b6c565b5080600490805190602001906200014292919062000b6c565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001ae8184846200041460201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b8152505080610120818152505050505050505060006200020d6200045060201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156200031f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003169062000e45565b60405180910390fd5b62000333600033836200045860201b60201c565b80600281905550806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200038a919062000ec2565b925050819055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620003f1919062000e67565b60405180910390a36200040d600033836200045d60201b60201c565b5062001050565b600083838346306040516020016200043195949392919062000da4565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b505050565b620004758383836200047a60201b620013c41760201c565b505050565b62000492838383620004ca60201b620013ef1760201c565b620004c5620004a784620004cf60201b60201c565b620004b884620004cf60201b60201c565b836200053860201b60201c565b505050565b505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015620005755750600081115b156200075657600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000668576000806200060f600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206200075b60201b620013f417856200077360201b60201c565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516200065d92919062000e84565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200075557600080620006fc600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002062000a9060201b6200140a17856200077360201b60201c565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516200074a92919062000e84565b60405180910390a250505b5b505050565b600081836200076b919062000f1f565b905092915050565b600080600085805490509050600081146200080c578560018262000798919062000f1f565b81548110620007d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166200080f565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692506200083b83858760201c565b9150600081118015620008b8575043866001836200085a919062000f1f565b8154811062000892577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b156200097d57620008d48262000aa860201b620014201760201c565b86600183620008e4919062000f1f565b815481106200091c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555062000a87565b8560405180604001604052806200099f4362000b1660201b6200148b1760201c565b63ffffffff168152602001620009c08562000aa860201b620014201760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b6000818362000aa0919062000ec2565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff801682111562000b0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b059062000e01565b60405180910390fd5b819050919050565b600063ffffffff801682111562000b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b5b9062000e23565b60405180910390fd5b819050919050565b82805462000b7a9062000fa2565b90600052602060002090601f01602090048101928262000b9e576000855562000bea565b82601f1062000bb957805160ff191683800117855562000bea565b8280016001018555821562000bea579182015b8281111562000be957825182559160200191906001019062000bcc565b5b50905062000bf9919062000bfd565b5090565b5b8082111562000c1857600081600090555060010162000bfe565b5090565b60008151905062000c2d8162001036565b92915050565b60006020828403121562000c4657600080fd5b600062000c568482850162000c1c565b91505092915050565b62000c6a8162000f5a565b82525050565b62000c7b8162000f6e565b82525050565b600062000c9060278362000eb1565b91507f53616665436173743a2076616c756520646f65736e27742066697420696e203260008301527f32342062697473000000000000000000000000000000000000000000000000006020830152604082019050919050565b600062000cf860268362000eb1565b91507f53616665436173743a2076616c756520646f65736e27742066697420696e203360008301527f32206269747300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600062000d60601f8362000eb1565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b62000d9e8162000f98565b82525050565b600060a08201905062000dbb600083018862000c70565b62000dca602083018762000c70565b62000dd9604083018662000c70565b62000de8606083018562000d93565b62000df7608083018462000c5f565b9695505050505050565b6000602082019050818103600083015262000e1c8162000c81565b9050919050565b6000602082019050818103600083015262000e3e8162000ce9565b9050919050565b6000602082019050818103600083015262000e608162000d51565b9050919050565b600060208201905062000e7e600083018462000d93565b92915050565b600060408201905062000e9b600083018562000d93565b62000eaa602083018462000d93565b9392505050565b600082825260208201905092915050565b600062000ecf8262000f98565b915062000edc8362000f98565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000f145762000f1362000fd8565b5b828201905092915050565b600062000f2c8262000f98565b915062000f398362000f98565b92508282101562000f4f5762000f4e62000fd8565b5b828203905092915050565b600062000f678262000f78565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000600282049050600182168062000fbb57607f821691505b6020821081141562000fd25762000fd162001007565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b620010418162000f98565b81146200104d57600080fd5b50565b60805160a05160c05160601c60e0516101005161012051613f61620010a36000396000611a6c01526000611aae01526000611a8d015260006119c201526000611a1801526000611a410152613f616000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a457c2d711610097578063d505accf11610071578063d505accf14610569578063dd62ed3e14610585578063f1127ed8146105b5578063f2fde38b146105e5576101c4565b8063a457c2d7146104ed578063a9059cbb1461051d578063c3cda5201461054d576101c4565b80638da5cb5b116100d35780638da5cb5b146104515780638e539e8c1461046f57806395d89b411461049f5780639ab24eb0146104bd576101c4565b806370a08231146103e7578063715018a6146104175780637ecebe0014610421576101c4565b80633a46b1a811610166578063587cde1e11610140578063587cde1e1461033b5780635c19a95c1461036b5780636ebcf607146103875780636fcfff45146103b7576101c4565b80633a46b1a8146102d15780633eaaf86b1461030157806342966c681461031f576101c4565b806323b872dd116101a257806323b872dd14610235578063313ce567146102655780633644e5151461028357806339509351146102a1576101c4565b806306fdde03146101c9578063095ea7b3146101e757806318160ddd14610217575b600080fd5b6101d1610601565b6040516101de91906138bb565b60405180910390f35b61020160048036038101906101fc9190612d26565b610693565b60405161020e9190613747565b60405180910390f35b61021f6106b6565b60405161022c9190613bb8565b60405180910390f35b61024f600480360381019061024a9190612c39565b6106c0565b60405161025c9190613747565b60405180910390f35b61026d6106ef565b60405161027a9190613c17565b60405180910390f35b61028b6106f8565b6040516102989190613762565b60405180910390f35b6102bb60048036038101906102b69190612d26565b610707565b6040516102c89190613747565b60405180910390f35b6102eb60048036038101906102e69190612d26565b6107b1565b6040516102f89190613bb8565b60405180910390f35b610309610845565b6040516103169190613bb8565b60405180910390f35b61033960048036038101906103349190612e27565b61084b565b005b61035560048036038101906103509190612bd4565b6108ef565b604051610362919061372c565b60405180910390f35b61038560048036038101906103809190612bd4565b610958565b005b6103a1600480360381019061039c9190612bd4565b61096c565b6040516103ae9190613bb8565b60405180910390f35b6103d160048036038101906103cc9190612bd4565b610984565b6040516103de9190613bfc565b60405180910390f35b61040160048036038101906103fc9190612bd4565b6109d8565b60405161040e9190613bb8565b60405180910390f35b61041f610a20565b005b61043b60048036038101906104369190612bd4565b610b78565b6040516104489190613bb8565b60405180910390f35b610459610bc8565b604051610466919061372c565b60405180910390f35b61048960048036038101906104849190612e27565b610bf2565b6040516104969190613bb8565b60405180910390f35b6104a7610c48565b6040516104b491906138bb565b60405180910390f35b6104d760048036038101906104d29190612bd4565b610cda565b6040516104e49190613bb8565b60405180910390f35b61050760048036038101906105029190612d26565b610e11565b6040516105149190613747565b60405180910390f35b61053760048036038101906105329190612d26565b610efb565b6040516105449190613747565b60405180910390f35b61056760048036038101906105629190612d62565b610f1e565b005b610583600480360381019061057e9190612c88565b611022565b005b61059f600480360381019061059a9190612bfd565b611164565b6040516105ac9190613bb8565b60405180910390f35b6105cf60048036038101906105ca9190612deb565b6111eb565b6040516105dc9190613b9d565b60405180910390f35b6105ff60048036038101906105fa9190612bd4565b611321565b005b60606003805461061090613dde565b80601f016020809104026020016040519081016040528092919081815260200182805461063c90613dde565b80156106895780601f1061065e57610100808354040283529160200191610689565b820191906000526020600020905b81548152906001019060200180831161066c57829003601f168201915b5050505050905090565b60008061069e6114de565b90506106ab8185856114e6565b600191505092915050565b6000600254905090565b6000806106cb6114de565b90506106d88582856116b1565b6106e385858561173d565b60019150509392505050565b60006012905090565b60006107026119be565b905090565b6000806107126114de565b90506107a6818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107a19190613c59565b6114e6565b600191505092915050565b60004382106107f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ec9061391d565b60405180910390fd5b61083d600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611ad8565b905092915050565b60025481565b6108536114de565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146108e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d990613abd565b60405180910390fd5b6108ec3382611c30565b50565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6109696109636114de565b82611c3e565b50565b60006020528060005260406000206000915090505481565b60006109d1600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061148b565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a286114de565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aae90613abd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000610bc1600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611d58565b9050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000438210610c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2d9061391d565b60405180910390fd5b610c41600983611ad8565b9050919050565b606060048054610c5790613dde565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8390613dde565b8015610cd05780601f10610ca557610100808354040283529160200191610cd0565b820191906000526020600020905b815481529060010190602001808311610cb357829003601f168201915b5050505050905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610de857600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600182610d769190613ce0565b81548110610dad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610deb565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610e1c6114de565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015610ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed990613b7d565b60405180910390fd5b610eef82868684036114e6565b60019250505092915050565b600080610f066114de565b9050610f1381858561173d565b600191505092915050565b83421115610f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f589061393d565b60405180910390fd5b6000610fc3610fbb7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610fa094939291906137de565b60405160208183030381529060405280519060200120611d66565b858585611d80565b9050610fce81611dab565b861461100f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110069061399d565b60405180910390fd5b6110198188611c3e565b50505050505050565b83421115611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c90613a1d565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886110948c611dab565b896040516020016110aa9695949392919061377d565b60405160208183030381529060405280519060200120905060006110cd82611d66565b905060006110dd82878787611d80565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114490613a9d565b60405180910390fd5b6111588a8a8a6114e6565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6111f3612b2d565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110611270577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b6113296114de565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af90613abd565b60405180910390fd5b6113c181611e09565b50565b6113cf8383836113ef565b6113ea6113db846108ef565b6113e4846108ef565b83611f39565b505050565b505050565b600081836114029190613ce0565b905092915050565b600081836114189190613c59565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147a90613add565b60405180910390fd5b819050919050565b600063ffffffff80168211156114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd90613b3d565b60405180910390fd5b819050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d90613b5d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bd906139dd565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516116a49190613bb8565b60405180910390a3505050565b60006116bd8484611164565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117375781811015611729576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611720906139fd565b60405180910390fd5b61173684848484036114e6565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a490613b1d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561181d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611814906138fd565b60405180910390fd5b611828838383612132565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156118ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a590613a3d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119419190613c59565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119a59190613bb8565b60405180910390a36119b8848484612137565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015611a3a57507f000000000000000000000000000000000000000000000000000000000000000046145b15611a67577f00000000000000000000000000000000000000000000000000000000000000009050611ad5565b611ad27f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612147565b90505b90565b6000808380549050905060005b81811015611b7d576000611af98284612181565b905084868281548110611b35577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff161115611b6757809250611b77565b600181611b749190613c59565b91505b50611ae5565b60008214611c055784600183611b939190613ce0565b81548110611bca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611c08565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b611c3a82826121a7565b5050565b6000611c49836108ef565b90506000611c56846109d8565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611d52828483611f39565b50505050565b600081600001549050919050565b6000611d79611d736119be565b836121c5565b9050919050565b6000806000611d91878787876121f8565b91509150611d9e81612305565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611df881611d58565b9150611e0381612656565b50919050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e70906139bd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611f755750600081115b1561212d57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461205357600080611ffc600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206113f48561266c565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612048929190613bd3565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461212c576000806120d5600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061140a8561266c565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612121929190613bd3565b60405180910390a250505b5b505050565b505050565b6121428383836113c4565b505050565b60008383834630604051602001612162959493929190613823565b6040516020818303038152906040528051906020012090509392505050565b600060028284186121929190613caf565b82841661219f9190613c59565b905092915050565b6121b18282612956565b6121bf60096113f48361266c565b50505050565b600082826040516020016121da9291906136f5565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156122335760006003915091506122fc565b601b8560ff161415801561224b5750601c8560ff1614155b1561225d5760006004915091506122fc565b6000600187878787604051600081526020016040526040516122829493929190613876565b6020604051602081039080840390855afa1580156122a4573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122f3576000600192509250506122fc565b80600092509250505b94509492505050565b6000600481111561233f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612378577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561238357612653565b600160048111156123bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156123f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612437576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242e906138dd565b60405180910390fd5b60026004811115612471577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156124aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156124eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e29061397d565b60405180910390fd5b60036004811115612525577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561255e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561259f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259690613a5d565b60405180910390fd5b6004808111156125d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612611577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264990613a7d565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b60008060008580549050905060008114612700578560018261268e9190613ce0565b815481106126c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612703565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925061273183858763ffffffff16565b91506000811180156127aa5750438660018361274d9190613ce0565b81548110612784577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b1561285d576127b882611420565b866001836127c69190613ce0565b815481106127fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555061294d565b8560405180604001604052806128724361148b565b63ffffffff16815260200161288685611420565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129bd90613afd565b60405180910390fd5b6129d282600083612132565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4f9061395d565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254612aaf9190613ce0565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b149190613bb8565b60405180910390a3612b2883600084612137565b505050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081359050612b7a81613eb8565b92915050565b600081359050612b8f81613ecf565b92915050565b600081359050612ba481613ee6565b92915050565b600081359050612bb981613efd565b92915050565b600081359050612bce81613f14565b92915050565b600060208284031215612be657600080fd5b6000612bf484828501612b6b565b91505092915050565b60008060408385031215612c1057600080fd5b6000612c1e85828601612b6b565b9250506020612c2f85828601612b6b565b9150509250929050565b600080600060608486031215612c4e57600080fd5b6000612c5c86828701612b6b565b9350506020612c6d86828701612b6b565b9250506040612c7e86828701612b95565b9150509250925092565b600080600080600080600060e0888a031215612ca357600080fd5b6000612cb18a828b01612b6b565b9750506020612cc28a828b01612b6b565b9650506040612cd38a828b01612b95565b9550506060612ce48a828b01612b95565b9450506080612cf58a828b01612bbf565b93505060a0612d068a828b01612b80565b92505060c0612d178a828b01612b80565b91505092959891949750929550565b60008060408385031215612d3957600080fd5b6000612d4785828601612b6b565b9250506020612d5885828601612b95565b9150509250929050565b60008060008060008060c08789031215612d7b57600080fd5b6000612d8989828a01612b6b565b9650506020612d9a89828a01612b95565b9550506040612dab89828a01612b95565b9450506060612dbc89828a01612bbf565b9350506080612dcd89828a01612b80565b92505060a0612dde89828a01612b80565b9150509295509295509295565b60008060408385031215612dfe57600080fd5b6000612e0c85828601612b6b565b9250506020612e1d85828601612baa565b9150509250929050565b600060208284031215612e3957600080fd5b6000612e4784828501612b95565b91505092915050565b612e5981613d14565b82525050565b612e6881613d26565b82525050565b612e7781613d32565b82525050565b612e8e612e8982613d32565b613e10565b82525050565b6000612e9f82613c32565b612ea98185613c3d565b9350612eb9818560208601613dab565b612ec281613ea7565b840191505092915050565b6000612eda601883613c3d565b91507f45434453413a20696e76616c6964207369676e617475726500000000000000006000830152602082019050919050565b6000612f1a602383613c3d565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f80601f83613c3d565b91507f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006000830152602082019050919050565b6000612fc0601d83613c3d565b91507f4552433230566f7465733a207369676e617475726520657870697265640000006000830152602082019050919050565b6000613000602283613c3d565b91507f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008301527f63650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613066601f83613c3d565b91507f45434453413a20696e76616c6964207369676e6174757265206c656e677468006000830152602082019050919050565b60006130a6601983613c3d565b91507f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006000830152602082019050919050565b60006130e6602683613c3d565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061314c602283613c3d565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131b2600283613c4e565b91507f19010000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006131f2601d83613c3d565b91507f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006000830152602082019050919050565b6000613232601d83613c3d565b91507f45524332305065726d69743a206578706972656420646561646c696e650000006000830152602082019050919050565b6000613272602683613c3d565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006132d8602283613c3d565b91507f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061333e602283613c3d565b91507f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133a4601e83613c3d565b91507f45524332305065726d69743a20696e76616c6964207369676e617475726500006000830152602082019050919050565b60006133e4602083613c3d565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613424602783613c3d565b91507f53616665436173743a2076616c756520646f65736e27742066697420696e203260008301527f32342062697473000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061348a602183613c3d565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134f0602583613c3d565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613556602683613c3d565b91507f53616665436173743a2076616c756520646f65736e27742066697420696e203360008301527f32206269747300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006135bc602483613c3d565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613622602583613c3d565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60408201600082015161369160008501826136c8565b5060208201516136a460208501826136aa565b50505050565b6136b381613d5c565b82525050565b6136c281613d84565b82525050565b6136d181613d8e565b82525050565b6136e081613d8e565b82525050565b6136ef81613d9e565b82525050565b6000613700826131a5565b915061370c8285612e7d565b60208201915061371c8284612e7d565b6020820191508190509392505050565b60006020820190506137416000830184612e50565b92915050565b600060208201905061375c6000830184612e5f565b92915050565b60006020820190506137776000830184612e6e565b92915050565b600060c0820190506137926000830189612e6e565b61379f6020830188612e50565b6137ac6040830187612e50565b6137b960608301866136b9565b6137c660808301856136b9565b6137d360a08301846136b9565b979650505050505050565b60006080820190506137f36000830187612e6e565b6138006020830186612e50565b61380d60408301856136b9565b61381a60608301846136b9565b95945050505050565b600060a0820190506138386000830188612e6e565b6138456020830187612e6e565b6138526040830186612e6e565b61385f60608301856136b9565b61386c6080830184612e50565b9695505050505050565b600060808201905061388b6000830187612e6e565b61389860208301866136e6565b6138a56040830185612e6e565b6138b26060830184612e6e565b95945050505050565b600060208201905081810360008301526138d58184612e94565b905092915050565b600060208201905081810360008301526138f681612ecd565b9050919050565b6000602082019050818103600083015261391681612f0d565b9050919050565b6000602082019050818103600083015261393681612f73565b9050919050565b6000602082019050818103600083015261395681612fb3565b9050919050565b6000602082019050818103600083015261397681612ff3565b9050919050565b6000602082019050818103600083015261399681613059565b9050919050565b600060208201905081810360008301526139b681613099565b9050919050565b600060208201905081810360008301526139d6816130d9565b9050919050565b600060208201905081810360008301526139f68161313f565b9050919050565b60006020820190508181036000830152613a16816131e5565b9050919050565b60006020820190508181036000830152613a3681613225565b9050919050565b60006020820190508181036000830152613a5681613265565b9050919050565b60006020820190508181036000830152613a76816132cb565b9050919050565b60006020820190508181036000830152613a9681613331565b9050919050565b60006020820190508181036000830152613ab681613397565b9050919050565b60006020820190508181036000830152613ad6816133d7565b9050919050565b60006020820190508181036000830152613af681613417565b9050919050565b60006020820190508181036000830152613b168161347d565b9050919050565b60006020820190508181036000830152613b36816134e3565b9050919050565b60006020820190508181036000830152613b5681613549565b9050919050565b60006020820190508181036000830152613b76816135af565b9050919050565b60006020820190508181036000830152613b9681613615565b9050919050565b6000604082019050613bb2600083018461367b565b92915050565b6000602082019050613bcd60008301846136b9565b92915050565b6000604082019050613be860008301856136b9565b613bf560208301846136b9565b9392505050565b6000602082019050613c1160008301846136d7565b92915050565b6000602082019050613c2c60008301846136e6565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000613c6482613d84565b9150613c6f83613d84565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ca457613ca3613e1a565b5b828201905092915050565b6000613cba82613d84565b9150613cc583613d84565b925082613cd557613cd4613e49565b5b828204905092915050565b6000613ceb82613d84565b9150613cf683613d84565b925082821015613d0957613d08613e1a565b5b828203905092915050565b6000613d1f82613d3c565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b60005b83811015613dc9578082015181840152602081019050613dae565b83811115613dd8576000848401525b50505050565b60006002820490506001821680613df657607f821691505b60208210811415613e0a57613e09613e78565b5b50919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b613ec181613d14565b8114613ecc57600080fd5b50565b613ed881613d32565b8114613ee357600080fd5b50565b613eef81613d84565b8114613efa57600080fd5b50565b613f0681613d8e565b8114613f1157600080fd5b50565b613f1d81613d9e565b8114613f2857600080fd5b5056fea2646970667358221220456499f9435fdf764c3cf159f344ca5a8a610f7323035e145cd9fa4e42e0078864736f6c634300080000330000000000000000000000000000000000000000033b2e3c9fd0803ce8000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a457c2d711610097578063d505accf11610071578063d505accf14610569578063dd62ed3e14610585578063f1127ed8146105b5578063f2fde38b146105e5576101c4565b8063a457c2d7146104ed578063a9059cbb1461051d578063c3cda5201461054d576101c4565b80638da5cb5b116100d35780638da5cb5b146104515780638e539e8c1461046f57806395d89b411461049f5780639ab24eb0146104bd576101c4565b806370a08231146103e7578063715018a6146104175780637ecebe0014610421576101c4565b80633a46b1a811610166578063587cde1e11610140578063587cde1e1461033b5780635c19a95c1461036b5780636ebcf607146103875780636fcfff45146103b7576101c4565b80633a46b1a8146102d15780633eaaf86b1461030157806342966c681461031f576101c4565b806323b872dd116101a257806323b872dd14610235578063313ce567146102655780633644e5151461028357806339509351146102a1576101c4565b806306fdde03146101c9578063095ea7b3146101e757806318160ddd14610217575b600080fd5b6101d1610601565b6040516101de91906138bb565b60405180910390f35b61020160048036038101906101fc9190612d26565b610693565b60405161020e9190613747565b60405180910390f35b61021f6106b6565b60405161022c9190613bb8565b60405180910390f35b61024f600480360381019061024a9190612c39565b6106c0565b60405161025c9190613747565b60405180910390f35b61026d6106ef565b60405161027a9190613c17565b60405180910390f35b61028b6106f8565b6040516102989190613762565b60405180910390f35b6102bb60048036038101906102b69190612d26565b610707565b6040516102c89190613747565b60405180910390f35b6102eb60048036038101906102e69190612d26565b6107b1565b6040516102f89190613bb8565b60405180910390f35b610309610845565b6040516103169190613bb8565b60405180910390f35b61033960048036038101906103349190612e27565b61084b565b005b61035560048036038101906103509190612bd4565b6108ef565b604051610362919061372c565b60405180910390f35b61038560048036038101906103809190612bd4565b610958565b005b6103a1600480360381019061039c9190612bd4565b61096c565b6040516103ae9190613bb8565b60405180910390f35b6103d160048036038101906103cc9190612bd4565b610984565b6040516103de9190613bfc565b60405180910390f35b61040160048036038101906103fc9190612bd4565b6109d8565b60405161040e9190613bb8565b60405180910390f35b61041f610a20565b005b61043b60048036038101906104369190612bd4565b610b78565b6040516104489190613bb8565b60405180910390f35b610459610bc8565b604051610466919061372c565b60405180910390f35b61048960048036038101906104849190612e27565b610bf2565b6040516104969190613bb8565b60405180910390f35b6104a7610c48565b6040516104b491906138bb565b60405180910390f35b6104d760048036038101906104d29190612bd4565b610cda565b6040516104e49190613bb8565b60405180910390f35b61050760048036038101906105029190612d26565b610e11565b6040516105149190613747565b60405180910390f35b61053760048036038101906105329190612d26565b610efb565b6040516105449190613747565b60405180910390f35b61056760048036038101906105629190612d62565b610f1e565b005b610583600480360381019061057e9190612c88565b611022565b005b61059f600480360381019061059a9190612bfd565b611164565b6040516105ac9190613bb8565b60405180910390f35b6105cf60048036038101906105ca9190612deb565b6111eb565b6040516105dc9190613b9d565b60405180910390f35b6105ff60048036038101906105fa9190612bd4565b611321565b005b60606003805461061090613dde565b80601f016020809104026020016040519081016040528092919081815260200182805461063c90613dde565b80156106895780601f1061065e57610100808354040283529160200191610689565b820191906000526020600020905b81548152906001019060200180831161066c57829003601f168201915b5050505050905090565b60008061069e6114de565b90506106ab8185856114e6565b600191505092915050565b6000600254905090565b6000806106cb6114de565b90506106d88582856116b1565b6106e385858561173d565b60019150509392505050565b60006012905090565b60006107026119be565b905090565b6000806107126114de565b90506107a6818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107a19190613c59565b6114e6565b600191505092915050565b60004382106107f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ec9061391d565b60405180910390fd5b61083d600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611ad8565b905092915050565b60025481565b6108536114de565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146108e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d990613abd565b60405180910390fd5b6108ec3382611c30565b50565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6109696109636114de565b82611c3e565b50565b60006020528060005260406000206000915090505481565b60006109d1600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061148b565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a286114de565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aae90613abd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000610bc1600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611d58565b9050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000438210610c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2d9061391d565b60405180910390fd5b610c41600983611ad8565b9050919050565b606060048054610c5790613dde565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8390613dde565b8015610cd05780601f10610ca557610100808354040283529160200191610cd0565b820191906000526020600020905b815481529060010190602001808311610cb357829003601f168201915b5050505050905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610de857600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600182610d769190613ce0565b81548110610dad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610deb565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610e1c6114de565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015610ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed990613b7d565b60405180910390fd5b610eef82868684036114e6565b60019250505092915050565b600080610f066114de565b9050610f1381858561173d565b600191505092915050565b83421115610f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f589061393d565b60405180910390fd5b6000610fc3610fbb7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610fa094939291906137de565b60405160208183030381529060405280519060200120611d66565b858585611d80565b9050610fce81611dab565b861461100f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110069061399d565b60405180910390fd5b6110198188611c3e565b50505050505050565b83421115611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c90613a1d565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886110948c611dab565b896040516020016110aa9695949392919061377d565b60405160208183030381529060405280519060200120905060006110cd82611d66565b905060006110dd82878787611d80565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114490613a9d565b60405180910390fd5b6111588a8a8a6114e6565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6111f3612b2d565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110611270577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b6113296114de565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af90613abd565b60405180910390fd5b6113c181611e09565b50565b6113cf8383836113ef565b6113ea6113db846108ef565b6113e4846108ef565b83611f39565b505050565b505050565b600081836114029190613ce0565b905092915050565b600081836114189190613c59565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147a90613add565b60405180910390fd5b819050919050565b600063ffffffff80168211156114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd90613b3d565b60405180910390fd5b819050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d90613b5d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bd906139dd565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516116a49190613bb8565b60405180910390a3505050565b60006116bd8484611164565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117375781811015611729576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611720906139fd565b60405180910390fd5b61173684848484036114e6565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a490613b1d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561181d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611814906138fd565b60405180910390fd5b611828838383612132565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156118ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a590613a3d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119419190613c59565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119a59190613bb8565b60405180910390a36119b8848484612137565b50505050565b60007f000000000000000000000000750b74f3f992a492b7606227dc9a9de59627bf8d73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015611a3a57507f000000000000000000000000000000000000000000000000000000000000000146145b15611a67577ffa3ffb68cd5a514e05a13ad47e3c901a912549e97159de4c34279726d35ccae39050611ad5565b611ad27f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fcb870142b61a1a4f7998aac8269e8ecf20b7b69bd71c0f39b8064d1aa523c3c57fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6612147565b90505b90565b6000808380549050905060005b81811015611b7d576000611af98284612181565b905084868281548110611b35577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff161115611b6757809250611b77565b600181611b749190613c59565b91505b50611ae5565b60008214611c055784600183611b939190613ce0565b81548110611bca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611c08565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b611c3a82826121a7565b5050565b6000611c49836108ef565b90506000611c56846109d8565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611d52828483611f39565b50505050565b600081600001549050919050565b6000611d79611d736119be565b836121c5565b9050919050565b6000806000611d91878787876121f8565b91509150611d9e81612305565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611df881611d58565b9150611e0381612656565b50919050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e70906139bd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611f755750600081115b1561212d57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461205357600080611ffc600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206113f48561266c565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612048929190613bd3565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461212c576000806120d5600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061140a8561266c565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612121929190613bd3565b60405180910390a250505b5b505050565b505050565b6121428383836113c4565b505050565b60008383834630604051602001612162959493929190613823565b6040516020818303038152906040528051906020012090509392505050565b600060028284186121929190613caf565b82841661219f9190613c59565b905092915050565b6121b18282612956565b6121bf60096113f48361266c565b50505050565b600082826040516020016121da9291906136f5565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156122335760006003915091506122fc565b601b8560ff161415801561224b5750601c8560ff1614155b1561225d5760006004915091506122fc565b6000600187878787604051600081526020016040526040516122829493929190613876565b6020604051602081039080840390855afa1580156122a4573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122f3576000600192509250506122fc565b80600092509250505b94509492505050565b6000600481111561233f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612378577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561238357612653565b600160048111156123bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156123f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612437576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242e906138dd565b60405180910390fd5b60026004811115612471577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156124aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156124eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e29061397d565b60405180910390fd5b60036004811115612525577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561255e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561259f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259690613a5d565b60405180910390fd5b6004808111156125d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612611577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264990613a7d565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b60008060008580549050905060008114612700578560018261268e9190613ce0565b815481106126c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612703565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925061273183858763ffffffff16565b91506000811180156127aa5750438660018361274d9190613ce0565b81548110612784577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b1561285d576127b882611420565b866001836127c69190613ce0565b815481106127fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555061294d565b8560405180604001604052806128724361148b565b63ffffffff16815260200161288685611420565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129bd90613afd565b60405180910390fd5b6129d282600083612132565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4f9061395d565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254612aaf9190613ce0565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b149190613bb8565b60405180910390a3612b2883600084612137565b505050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081359050612b7a81613eb8565b92915050565b600081359050612b8f81613ecf565b92915050565b600081359050612ba481613ee6565b92915050565b600081359050612bb981613efd565b92915050565b600081359050612bce81613f14565b92915050565b600060208284031215612be657600080fd5b6000612bf484828501612b6b565b91505092915050565b60008060408385031215612c1057600080fd5b6000612c1e85828601612b6b565b9250506020612c2f85828601612b6b565b9150509250929050565b600080600060608486031215612c4e57600080fd5b6000612c5c86828701612b6b565b9350506020612c6d86828701612b6b565b9250506040612c7e86828701612b95565b9150509250925092565b600080600080600080600060e0888a031215612ca357600080fd5b6000612cb18a828b01612b6b565b9750506020612cc28a828b01612b6b565b9650506040612cd38a828b01612b95565b9550506060612ce48a828b01612b95565b9450506080612cf58a828b01612bbf565b93505060a0612d068a828b01612b80565b92505060c0612d178a828b01612b80565b91505092959891949750929550565b60008060408385031215612d3957600080fd5b6000612d4785828601612b6b565b9250506020612d5885828601612b95565b9150509250929050565b60008060008060008060c08789031215612d7b57600080fd5b6000612d8989828a01612b6b565b9650506020612d9a89828a01612b95565b9550506040612dab89828a01612b95565b9450506060612dbc89828a01612bbf565b9350506080612dcd89828a01612b80565b92505060a0612dde89828a01612b80565b9150509295509295509295565b60008060408385031215612dfe57600080fd5b6000612e0c85828601612b6b565b9250506020612e1d85828601612baa565b9150509250929050565b600060208284031215612e3957600080fd5b6000612e4784828501612b95565b91505092915050565b612e5981613d14565b82525050565b612e6881613d26565b82525050565b612e7781613d32565b82525050565b612e8e612e8982613d32565b613e10565b82525050565b6000612e9f82613c32565b612ea98185613c3d565b9350612eb9818560208601613dab565b612ec281613ea7565b840191505092915050565b6000612eda601883613c3d565b91507f45434453413a20696e76616c6964207369676e617475726500000000000000006000830152602082019050919050565b6000612f1a602383613c3d565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f80601f83613c3d565b91507f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006000830152602082019050919050565b6000612fc0601d83613c3d565b91507f4552433230566f7465733a207369676e617475726520657870697265640000006000830152602082019050919050565b6000613000602283613c3d565b91507f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008301527f63650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613066601f83613c3d565b91507f45434453413a20696e76616c6964207369676e6174757265206c656e677468006000830152602082019050919050565b60006130a6601983613c3d565b91507f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006000830152602082019050919050565b60006130e6602683613c3d565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061314c602283613c3d565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131b2600283613c4e565b91507f19010000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006131f2601d83613c3d565b91507f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006000830152602082019050919050565b6000613232601d83613c3d565b91507f45524332305065726d69743a206578706972656420646561646c696e650000006000830152602082019050919050565b6000613272602683613c3d565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006132d8602283613c3d565b91507f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061333e602283613c3d565b91507f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133a4601e83613c3d565b91507f45524332305065726d69743a20696e76616c6964207369676e617475726500006000830152602082019050919050565b60006133e4602083613c3d565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613424602783613c3d565b91507f53616665436173743a2076616c756520646f65736e27742066697420696e203260008301527f32342062697473000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061348a602183613c3d565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134f0602583613c3d565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613556602683613c3d565b91507f53616665436173743a2076616c756520646f65736e27742066697420696e203360008301527f32206269747300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006135bc602483613c3d565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613622602583613c3d565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60408201600082015161369160008501826136c8565b5060208201516136a460208501826136aa565b50505050565b6136b381613d5c565b82525050565b6136c281613d84565b82525050565b6136d181613d8e565b82525050565b6136e081613d8e565b82525050565b6136ef81613d9e565b82525050565b6000613700826131a5565b915061370c8285612e7d565b60208201915061371c8284612e7d565b6020820191508190509392505050565b60006020820190506137416000830184612e50565b92915050565b600060208201905061375c6000830184612e5f565b92915050565b60006020820190506137776000830184612e6e565b92915050565b600060c0820190506137926000830189612e6e565b61379f6020830188612e50565b6137ac6040830187612e50565b6137b960608301866136b9565b6137c660808301856136b9565b6137d360a08301846136b9565b979650505050505050565b60006080820190506137f36000830187612e6e565b6138006020830186612e50565b61380d60408301856136b9565b61381a60608301846136b9565b95945050505050565b600060a0820190506138386000830188612e6e565b6138456020830187612e6e565b6138526040830186612e6e565b61385f60608301856136b9565b61386c6080830184612e50565b9695505050505050565b600060808201905061388b6000830187612e6e565b61389860208301866136e6565b6138a56040830185612e6e565b6138b26060830184612e6e565b95945050505050565b600060208201905081810360008301526138d58184612e94565b905092915050565b600060208201905081810360008301526138f681612ecd565b9050919050565b6000602082019050818103600083015261391681612f0d565b9050919050565b6000602082019050818103600083015261393681612f73565b9050919050565b6000602082019050818103600083015261395681612fb3565b9050919050565b6000602082019050818103600083015261397681612ff3565b9050919050565b6000602082019050818103600083015261399681613059565b9050919050565b600060208201905081810360008301526139b681613099565b9050919050565b600060208201905081810360008301526139d6816130d9565b9050919050565b600060208201905081810360008301526139f68161313f565b9050919050565b60006020820190508181036000830152613a16816131e5565b9050919050565b60006020820190508181036000830152613a3681613225565b9050919050565b60006020820190508181036000830152613a5681613265565b9050919050565b60006020820190508181036000830152613a76816132cb565b9050919050565b60006020820190508181036000830152613a9681613331565b9050919050565b60006020820190508181036000830152613ab681613397565b9050919050565b60006020820190508181036000830152613ad6816133d7565b9050919050565b60006020820190508181036000830152613af681613417565b9050919050565b60006020820190508181036000830152613b168161347d565b9050919050565b60006020820190508181036000830152613b36816134e3565b9050919050565b60006020820190508181036000830152613b5681613549565b9050919050565b60006020820190508181036000830152613b76816135af565b9050919050565b60006020820190508181036000830152613b9681613615565b9050919050565b6000604082019050613bb2600083018461367b565b92915050565b6000602082019050613bcd60008301846136b9565b92915050565b6000604082019050613be860008301856136b9565b613bf560208301846136b9565b9392505050565b6000602082019050613c1160008301846136d7565b92915050565b6000602082019050613c2c60008301846136e6565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000613c6482613d84565b9150613c6f83613d84565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ca457613ca3613e1a565b5b828201905092915050565b6000613cba82613d84565b9150613cc583613d84565b925082613cd557613cd4613e49565b5b828204905092915050565b6000613ceb82613d84565b9150613cf683613d84565b925082821015613d0957613d08613e1a565b5b828203905092915050565b6000613d1f82613d3c565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b60005b83811015613dc9578082015181840152602081019050613dae565b83811115613dd8576000848401525b50505050565b60006002820490506001821680613df657607f821691505b60208210811415613e0a57613e09613e78565b5b50919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b613ec181613d14565b8114613ecc57600080fd5b50565b613ed881613d32565b8114613ee357600080fd5b50565b613eef81613d84565b8114613efa57600080fd5b50565b613f0681613d8e565b8114613f1157600080fd5b50565b613f1d81613d9e565b8114613f2857600080fd5b5056fea2646970667358221220456499f9435fdf764c3cf159f344ca5a8a610f7323035e145cd9fa4e42e0078864736f6c63430008000033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000

-----Decoded View---------------
Arg [0] : amount (uint256): 1000000000000000000000000000

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000


Deployed Bytecode Sourcemap

61373:1004:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35556:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37907:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36676:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38688:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36518:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50447:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39392:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53610:268;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34964:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62279:95;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52984:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56083:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34835:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52740:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36847:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60704:125;;;:::i;:::-;;50189:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60130:70;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54167:259;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35775:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53196:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40135:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37180:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56279:591;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49478:645;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37436:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52510:150;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60966:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35556;35610:13;35643:5;35636:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35556:100;:::o;37907:201::-;37990:4;38007:13;38023:12;:10;:12::i;:::-;38007:28;;38046:32;38055:5;38062:7;38071:6;38046:8;:32::i;:::-;38096:4;38089:11;;;37907:201;;;;:::o;36676:108::-;36737:7;36764:12;;36757:19;;36676:108;:::o;38688:295::-;38819:4;38836:15;38854:12;:10;:12::i;:::-;38836:30;;38877:38;38893:4;38899:7;38908:6;38877:15;:38::i;:::-;38926:27;38936:4;38942:2;38946:6;38926:9;:27::i;:::-;38971:4;38964:11;;;38688:295;;;;;:::o;36518:93::-;36576:5;36601:2;36594:9;;36518:93;:::o;50447:115::-;50507:7;50534:20;:18;:20::i;:::-;50527:27;;50447:115;:::o;39392:240::-;39480:4;39497:13;39513:12;:10;:12::i;:::-;39497:28;;39536:66;39545:5;39552:7;39591:10;39561:11;:18;39573:5;39561:18;;;;;;;;;;;;;;;:27;39580:7;39561:27;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;39536:8;:66::i;:::-;39620:4;39613:11;;;39392:240;;;;:::o;53610:268::-;53708:7;53750:12;53736:11;:26;53728:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;53816:54;53835:12;:21;53848:7;53835:21;;;;;;;;;;;;;;;53858:11;53816:18;:54::i;:::-;53809:61;;53610:268;;;;:::o;34964:27::-;;;;:::o;62279:95::-;60323:12;:10;:12::i;:::-;60313:22;;:6;;;;;;;;;;;:22;;;60305:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;62340:26:::1;62346:10;62358:7;62340:5;:26::i;:::-;62279:95:::0;:::o;52984:128::-;53058:7;53085:10;:19;53096:7;53085:19;;;;;;;;;;;;;;;;;;;;;;;;;53078:26;;52984:128;;;:::o;56083:114::-;56155:34;56165:12;:10;:12::i;:::-;56179:9;56155;:34::i;:::-;56083:114;:::o;34835:44::-;;;;;;;;;;;;;;;;;:::o;52740:151::-;52810:6;52836:47;52854:12;:21;52867:7;52854:21;;;;;;;;;;;;;;;:28;;;;52836:17;:47::i;:::-;52829:54;;52740:151;;;:::o;36847:127::-;36921:7;36948:9;:18;36958:7;36948:18;;;;;;;;;;;;;;;;36941:25;;36847:127;;;:::o;60704:125::-;60323:12;:10;:12::i;:::-;60313:22;;:6;;;;;;;;;;;:22;;;60305:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;60797:1:::1;60760:40;;60781:6;;;;;;;;;;;60760:40;;;;;;;;;;;;60822:1;60805:6;;:19;;;;;;;;;;;;;;;;;;60704:125::o:0;50189:128::-;50258:7;50285:24;:7;:14;50293:5;50285:14;;;;;;;;;;;;;;;:22;:24::i;:::-;50278:31;;50189:128;;;:::o;60130:70::-;60168:7;60189:6;;;;;;;;;;;60182:13;;60130:70;:::o;54167:259::-;54254:7;54296:12;54282:11;:26;54274:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;54362:56;54381:23;54406:11;54362:18;:56::i;:::-;54355:63;;54167:259;;;:::o;35775:104::-;35831:13;35864:7;35857:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35775:104;:::o;53196:212::-;53269:7;53289:11;53303:12;:21;53316:7;53303:21;;;;;;;;;;;;;;;:28;;;;53289:42;;53356:1;53349:3;:8;:51;;53364:12;:21;53377:7;53364:21;;;;;;;;;;;;;;;53392:1;53386:3;:7;;;;:::i;:::-;53364:30;;;;;;;;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;53349:51;;;53360:1;53349:51;53342:58;;;;;53196:212;;;:::o;40135:438::-;40228:4;40245:13;40261:12;:10;:12::i;:::-;40245:28;;40284:24;40311:11;:18;40323:5;40311:18;;;;;;;;;;;;;;;:27;40330:7;40311:27;;;;;;;;;;;;;;;;40284:54;;40377:15;40357:16;:35;;40349:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;40470:60;40479:5;40486:7;40514:15;40495:16;:34;40470:8;:60::i;:::-;40561:4;40554:11;;;;40135:438;;;;:::o;37180:193::-;37259:4;37276:13;37292:12;:10;:12::i;:::-;37276:28;;37315;37325:5;37332:2;37336:6;37315:9;:28::i;:::-;37361:4;37354:11;;;37180:193;;;;:::o;56279:591::-;56506:6;56487:15;:25;;56479:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;56557:14;56574:174;56602:87;52190:71;56662:9;56673:5;56680:6;56629:58;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56619:69;;;;;;56602:16;:87::i;:::-;56704:1;56720;56736;56574:13;:174::i;:::-;56557:191;;56776:17;56786:6;56776:9;:17::i;:::-;56767:5;:26;56759:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;56834:28;56844:6;56852:9;56834;:28::i;:::-;56279:591;;;;;;;:::o;49478:645::-;49722:8;49703:15;:27;;49695:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;49777:18;48969:95;49837:5;49844:7;49853:5;49860:16;49870:5;49860:9;:16::i;:::-;49878:8;49808:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49798:90;;;;;;49777:111;;49901:12;49916:28;49933:10;49916:16;:28::i;:::-;49901:43;;49957:14;49974:28;49988:4;49994:1;49997;50000;49974:13;:28::i;:::-;49957:45;;50031:5;50021:15;;:6;:15;;;50013:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50084:31;50093:5;50100:7;50109:5;50084:8;:31::i;:::-;49478:645;;;;;;;;;;:::o;37436:151::-;37525:7;37552:11;:18;37564:5;37552:18;;;;;;;;;;;;;;;:27;37571:7;37552:27;;;;;;;;;;;;;;;;37545:34;;37436:151;;;;:::o;52510:150::-;52589:17;;:::i;:::-;52626:12;:21;52639:7;52626:21;;;;;;;;;;;;;;;52648:3;52626:26;;;;;;;;;;;;;;;;;;;;;;;;;52619:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52510:150;;;;:::o;60966:100::-;60323:12;:10;:12::i;:::-;60313:22;;:6;;;;;;;;;;;:22;;;60305:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;61033:28:::1;61052:8;61033:18;:28::i;:::-;60966:100:::0;:::o;57300:262::-;57442:43;57468:4;57474:2;57478:6;57442:25;:43::i;:::-;57498:56;57515:15;57525:4;57515:9;:15::i;:::-;57532:13;57542:2;57532:9;:13::i;:::-;57547:6;57498:16;:56::i;:::-;57300:262;;;:::o;45542:124::-;;;;:::o;59532:103::-;59595:7;59626:1;59622;:5;;;;:::i;:::-;59615:12;;59532:103;;;;:::o;59426:98::-;59484:7;59515:1;59511;:5;;;;:::i;:::-;59504:12;;59426:98;;;;:::o;1170:195::-;1227:7;1264:17;1255:26;;:5;:26;;1247:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;1351:5;1336:21;;1170:195;;;:::o;3140:190::-;3196:6;3232:16;3223:25;;:5;:25;;3215:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;3316:5;3302:20;;3140:190;;;:::o;29703:98::-;29756:7;29783:10;29776:17;;29703:98;:::o;43093:380::-;43246:1;43229:19;;:5;:19;;;;43221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43327:1;43308:21;;:7;:21;;;;43300:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43411:6;43381:11;:18;43393:5;43381:18;;;;;;;;;;;;;;;:27;43400:7;43381:27;;;;;;;;;;;;;;;:36;;;;43449:7;43433:32;;43442:5;43433:32;;;43458:6;43433:32;;;;;;:::i;:::-;;;;;;;;43093:380;;;:::o;43760:453::-;43895:24;43922:25;43932:5;43939:7;43922:9;:25::i;:::-;43895:52;;43982:17;43962:16;:37;43958:248;;44044:6;44024:16;:26;;44016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44128:51;44137:5;44144:7;44172:6;44153:16;:25;44128:8;:51::i;:::-;43958:248;43760:453;;;;:::o;41052:671::-;41199:1;41183:18;;:4;:18;;;;41175:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41276:1;41262:16;;:2;:16;;;;41254:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;41331:38;41352:4;41358:2;41362:6;41331:20;:38::i;:::-;41382:19;41404:9;:15;41414:4;41404:15;;;;;;;;;;;;;;;;41382:37;;41453:6;41438:11;:21;;41430:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;41570:6;41556:11;:20;41538:9;:15;41548:4;41538:15;;;;;;;;;;;;;;;:38;;;;41615:6;41598:9;:13;41608:2;41598:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;41654:2;41639:26;;41648:4;41639:26;;;41658:6;41639:26;;;;;;:::i;:::-;;;;;;;;41678:37;41698:4;41704:2;41708:6;41678:19;:37::i;:::-;41052:671;;;;:::o;27653:314::-;27706:7;27747:12;27730:29;;27738:4;27730:29;;;:66;;;;;27780:16;27763:13;:33;27730:66;27726:234;;;27820:24;27813:31;;;;27726:234;27884:64;27906:10;27918:12;27932:15;27884:21;:64::i;:::-;27877:71;;27653:314;;:::o;54515:1482::-;54614:7;55633:12;55648:5;:12;;;;55633:27;;55671:11;55697:236;55710:4;55704:3;:10;55697:236;;;55731:11;55745:23;55758:3;55763:4;55745:12;:23::i;:::-;55731:37;;55810:11;55787:5;55793:3;55787:10;;;;;;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;:34;;;55783:139;;;55849:3;55842:10;;55783:139;;;55905:1;55899:3;:7;;;;:::i;:::-;55893:13;;55783:139;55697:236;;;;55960:1;55952:4;:9;:37;;55968:5;55981:1;55974:4;:8;;;;:::i;:::-;55968:15;;;;;;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;55952:37;;;55964:1;55952:37;55945:44;;;;;;54515:1482;;;;:::o;62123:148::-;62235:28;62247:7;62256:6;62235:11;:28::i;:::-;62123:148;;:::o;57726:388::-;57811:23;57837:20;57847:9;57837;:20::i;:::-;57811:46;;57868:24;57895:20;57905:9;57895;:20::i;:::-;57868:47;;57950:9;57926:10;:21;57937:9;57926:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;58021:9;57977:54;;58004:15;57977:54;;57993:9;57977:54;;;;;;;;;;;;58044:62;58061:15;58078:9;58089:16;58044;:62::i;:::-;57726:388;;;;:::o;12288:114::-;12353:7;12380;:14;;;12373:21;;12288:114;;;:::o;28880:167::-;28957:7;28984:55;29006:20;:18;:20::i;:::-;29028:10;28984:21;:55::i;:::-;28977:62;;28880:167;;;:::o;22572:279::-;22700:7;22721:17;22740:18;22762:25;22773:4;22779:1;22782;22785;22762:10;:25::i;:::-;22720:67;;;;22798:18;22810:5;22798:11;:18::i;:::-;22834:9;22827:16;;;;22572:279;;;;;;:::o;50700:207::-;50760:15;50788:30;50821:7;:14;50829:5;50821:14;;;;;;;;;;;;;;;50788:47;;50856:15;:5;:13;:15::i;:::-;50846:25;;50882:17;:5;:15;:17::i;:::-;50700:207;;;;:::o;61158:208::-;61246:1;61226:22;;:8;:22;;;;61218:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;61330:8;61301:38;;61322:6;;;;;;;;;;;61301:38;;;;;;;;;;;;61353:8;61344:6;;:17;;;;;;;;;;;;;;;;;;61158:208;:::o;58122:643::-;58254:3;58247:10;;:3;:10;;;;:24;;;;;58270:1;58261:6;:10;58247:24;58243:515;;;58307:1;58292:17;;:3;:17;;;58288:224;;58331:17;58350;58371:54;58388:12;:17;58401:3;58388:17;;;;;;;;;;;;;;;58407:9;58418:6;58371:16;:54::i;:::-;58330:95;;;;58470:3;58449:47;;;58475:9;58486;58449:47;;;;;;;:::i;:::-;;;;;;;;58288:224;;;58547:1;58532:17;;:3;:17;;;58528:219;;58571:17;58590;58611:49;58628:12;:17;58641:3;58628:17;;;;;;;;;;;;;;;58647:4;58653:6;58611:16;:49::i;:::-;58570:90;;;;58705:3;58684:47;;;58710:9;58721;58684:47;;;;;;;:::i;:::-;;;;;;;;58528:219;;;58243:515;58122:643;;;:::o;44813:125::-;;;;:::o;61911:197::-;62057:43;62083:4;62089:2;62093:6;62057:25;:43::i;:::-;61911:197;;;:::o;27975:263::-;28119:7;28167:8;28177;28187:11;28200:13;28223:4;28156:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28146:84;;;;;;28139:91;;27975:263;;;;;:::o;10879:156::-;10941:7;11026:1;11021;11017;:5;11016:11;;;;:::i;:::-;11011:1;11007;:5;11006:21;;;;:::i;:::-;10999:28;;10879:156;;;;:::o;56966:194::-;57051:28;57063:7;57072:6;57051:11;:28::i;:::-;57092:60;57109:23;57134:9;57145:6;57092:16;:60::i;:::-;;;56966:194;;:::o;24263:196::-;24356:7;24422:15;24439:10;24393:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24383:68;;;;;;24376:75;;24263:196;;;;:::o;20801:1632::-;20932:7;20941:12;21866:66;21861:1;21853:10;;:79;21849:163;;;21965:1;21969:30;21949:51;;;;;;21849:163;22031:2;22026:1;:7;;;;:18;;;;;22042:2;22037:1;:7;;;;22026:18;22022:102;;;22077:1;22081:30;22061:51;;;;;;22022:102;22221:14;22238:24;22248:4;22254:1;22257;22260;22238:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22221:41;;22295:1;22277:20;;:6;:20;;;22273:103;;;22330:1;22334:29;22314:50;;;;;;;22273:103;22396:6;22404:20;22388:37;;;;;20801:1632;;;;;;;;:::o;15510:643::-;15588:20;15579:29;;;;;;;;;;;;;;;;:5;:29;;;;;;;;;;;;;;;;;15575:571;;;15625:7;;15575:571;15686:29;15677:38;;;;;;;;;;;;;;;;:5;:38;;;;;;;;;;;;;;;;;15673:473;;;15732:34;;;;;;;;;;:::i;:::-;;;;;;;;15673:473;15797:35;15788:44;;;;;;;;;;;;;;;;:5;:44;;;;;;;;;;;;;;;;;15784:362;;;15849:41;;;;;;;;;;:::i;:::-;;;;;;;;15784:362;15921:30;15912:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;15908:238;;;15968:44;;;;;;;;;;:::i;:::-;;;;;;;;15908:238;16043:30;16034:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;16030:116;;;16090:44;;;;;;;;;;:::i;:::-;;;;;;;;16030:116;15510:643;;:::o;12410:127::-;12517:1;12499:7;:14;;;:19;;;;;;;;;;;12410:127;:::o;58773:645::-;58947:17;58966;58996:11;59010:5;:12;;;;58996:26;;59052:1;59045:3;:8;:35;;59060:5;59072:1;59066:3;:7;;;;:::i;:::-;59060:14;;;;;;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;59045:35;;;59056:1;59045:35;59033:47;;;;59103:20;59106:9;59117:5;59103:2;:20;;:::i;:::-;59091:32;;59146:1;59140:3;:7;:51;;;;;59179:12;59151:5;59163:1;59157:3;:7;;;;:::i;:::-;59151:14;;;;;;;;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;:40;;;59140:51;59136:275;;;59231:29;59250:9;59231:18;:29::i;:::-;59208:5;59220:1;59214:3;:7;;;;:::i;:::-;59208:14;;;;;;;;;;;;;;;;;;;;;;;:20;;;:52;;;;;;;;;;;;;;;;;;59136:275;;;59293:5;59304:94;;;;;;;;59327:31;59345:12;59327:17;:31::i;:::-;59304:94;;;;;;59367:29;59386:9;59367:18;:29::i;:::-;59304:94;;;;;59293:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59136:275;58773:645;;;;;;;:::o;42064:591::-;42167:1;42148:21;;:7;:21;;;;42140:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;42220:49;42241:7;42258:1;42262:6;42220:20;:49::i;:::-;42282:22;42307:9;:18;42317:7;42307:18;;;;;;;;;;;;;;;;42282:43;;42362:6;42344:14;:24;;42336:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;42481:6;42464:14;:23;42443:9;:18;42453:7;42443:18;;;;;;;;;;;;;;;:44;;;;42525:6;42509:12;;:22;;;;;;;:::i;:::-;;;;;;;;42575:1;42549:37;;42558:7;42549:37;;;42579:6;42549:37;;;;;;:::i;:::-;;;;;;;;42599:48;42619:7;42636:1;42640:6;42599:19;:48::i;:::-;42064:591;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::o;7:139:1:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:139::-;;236:6;223:20;214:29;;252:33;279:5;252:33;:::i;:::-;204:87;;;;:::o;297:139::-;;381:6;368:20;359:29;;397:33;424:5;397:33;:::i;:::-;349:87;;;;:::o;442:137::-;;525:6;512:20;503:29;;541:32;567:5;541:32;:::i;:::-;493:86;;;;:::o;585:135::-;;667:6;654:20;645:29;;683:31;708:5;683:31;:::i;:::-;635:85;;;;:::o;726:262::-;;834:2;822:9;813:7;809:23;805:32;802:2;;;850:1;847;840:12;802:2;893:1;918:53;963:7;954:6;943:9;939:22;918:53;:::i;:::-;908:63;;864:117;792:196;;;;:::o;994:407::-;;;1119:2;1107:9;1098:7;1094:23;1090:32;1087:2;;;1135:1;1132;1125:12;1087:2;1178:1;1203:53;1248:7;1239:6;1228:9;1224:22;1203:53;:::i;:::-;1193:63;;1149:117;1305:2;1331:53;1376:7;1367:6;1356:9;1352:22;1331:53;:::i;:::-;1321:63;;1276:118;1077:324;;;;;:::o;1407:552::-;;;;1549:2;1537:9;1528:7;1524:23;1520:32;1517:2;;;1565:1;1562;1555:12;1517:2;1608:1;1633:53;1678:7;1669:6;1658:9;1654:22;1633:53;:::i;:::-;1623:63;;1579:117;1735:2;1761:53;1806:7;1797:6;1786:9;1782:22;1761:53;:::i;:::-;1751:63;;1706:118;1863:2;1889:53;1934:7;1925:6;1914:9;1910:22;1889:53;:::i;:::-;1879:63;;1834:118;1507:452;;;;;:::o;1965:1132::-;;;;;;;;2173:3;2161:9;2152:7;2148:23;2144:33;2141:2;;;2190:1;2187;2180:12;2141:2;2233:1;2258:53;2303:7;2294:6;2283:9;2279:22;2258:53;:::i;:::-;2248:63;;2204:117;2360:2;2386:53;2431:7;2422:6;2411:9;2407:22;2386:53;:::i;:::-;2376:63;;2331:118;2488:2;2514:53;2559:7;2550:6;2539:9;2535:22;2514:53;:::i;:::-;2504:63;;2459:118;2616:2;2642:53;2687:7;2678:6;2667:9;2663:22;2642:53;:::i;:::-;2632:63;;2587:118;2744:3;2771:51;2814:7;2805:6;2794:9;2790:22;2771:51;:::i;:::-;2761:61;;2715:117;2871:3;2898:53;2943:7;2934:6;2923:9;2919:22;2898:53;:::i;:::-;2888:63;;2842:119;3000:3;3027:53;3072:7;3063:6;3052:9;3048:22;3027:53;:::i;:::-;3017:63;;2971:119;2131:966;;;;;;;;;;:::o;3103:407::-;;;3228:2;3216:9;3207:7;3203:23;3199:32;3196:2;;;3244:1;3241;3234:12;3196:2;3287:1;3312:53;3357:7;3348:6;3337:9;3333:22;3312:53;:::i;:::-;3302:63;;3258:117;3414:2;3440:53;3485:7;3476:6;3465:9;3461:22;3440:53;:::i;:::-;3430:63;;3385:118;3186:324;;;;;:::o;3516:986::-;;;;;;;3707:3;3695:9;3686:7;3682:23;3678:33;3675:2;;;3724:1;3721;3714:12;3675:2;3767:1;3792:53;3837:7;3828:6;3817:9;3813:22;3792:53;:::i;:::-;3782:63;;3738:117;3894:2;3920:53;3965:7;3956:6;3945:9;3941:22;3920:53;:::i;:::-;3910:63;;3865:118;4022:2;4048:53;4093:7;4084:6;4073:9;4069:22;4048:53;:::i;:::-;4038:63;;3993:118;4150:2;4176:51;4219:7;4210:6;4199:9;4195:22;4176:51;:::i;:::-;4166:61;;4121:116;4276:3;4303:53;4348:7;4339:6;4328:9;4324:22;4303:53;:::i;:::-;4293:63;;4247:119;4405:3;4432:53;4477:7;4468:6;4457:9;4453:22;4432:53;:::i;:::-;4422:63;;4376:119;3665:837;;;;;;;;:::o;4508:405::-;;;4632:2;4620:9;4611:7;4607:23;4603:32;4600:2;;;4648:1;4645;4638:12;4600:2;4691:1;4716:53;4761:7;4752:6;4741:9;4737:22;4716:53;:::i;:::-;4706:63;;4662:117;4818:2;4844:52;4888:7;4879:6;4868:9;4864:22;4844:52;:::i;:::-;4834:62;;4789:117;4590:323;;;;;:::o;4919:262::-;;5027:2;5015:9;5006:7;5002:23;4998:32;4995:2;;;5043:1;5040;5033:12;4995:2;5086:1;5111:53;5156:7;5147:6;5136:9;5132:22;5111:53;:::i;:::-;5101:63;;5057:117;4985:196;;;;:::o;5187:118::-;5274:24;5292:5;5274:24;:::i;:::-;5269:3;5262:37;5252:53;;:::o;5311:109::-;5392:21;5407:5;5392:21;:::i;:::-;5387:3;5380:34;5370:50;;:::o;5426:118::-;5513:24;5531:5;5513:24;:::i;:::-;5508:3;5501:37;5491:53;;:::o;5550:157::-;5655:45;5675:24;5693:5;5675:24;:::i;:::-;5655:45;:::i;:::-;5650:3;5643:58;5633:74;;:::o;5713:364::-;;5829:39;5862:5;5829:39;:::i;:::-;5884:71;5948:6;5943:3;5884:71;:::i;:::-;5877:78;;5964:52;6009:6;6004:3;5997:4;5990:5;5986:16;5964:52;:::i;:::-;6041:29;6063:6;6041:29;:::i;:::-;6036:3;6032:39;6025:46;;5805:272;;;;;:::o;6083:322::-;;6246:67;6310:2;6305:3;6246:67;:::i;:::-;6239:74;;6343:26;6339:1;6334:3;6330:11;6323:47;6396:2;6391:3;6387:12;6380:19;;6229:176;;;:::o;6411:367::-;;6574:67;6638:2;6633:3;6574:67;:::i;:::-;6567:74;;6671:34;6667:1;6662:3;6658:11;6651:55;6737:5;6732:2;6727:3;6723:12;6716:27;6769:2;6764:3;6760:12;6753:19;;6557:221;;;:::o;6784:329::-;;6947:67;7011:2;7006:3;6947:67;:::i;:::-;6940:74;;7044:33;7040:1;7035:3;7031:11;7024:54;7104:2;7099:3;7095:12;7088:19;;6930:183;;;:::o;7119:327::-;;7282:67;7346:2;7341:3;7282:67;:::i;:::-;7275:74;;7379:31;7375:1;7370:3;7366:11;7359:52;7437:2;7432:3;7428:12;7421:19;;7265:181;;;:::o;7452:366::-;;7615:67;7679:2;7674:3;7615:67;:::i;:::-;7608:74;;7712:34;7708:1;7703:3;7699:11;7692:55;7778:4;7773:2;7768:3;7764:12;7757:26;7809:2;7804:3;7800:12;7793:19;;7598:220;;;:::o;7824:329::-;;7987:67;8051:2;8046:3;7987:67;:::i;:::-;7980:74;;8084:33;8080:1;8075:3;8071:11;8064:54;8144:2;8139:3;8135:12;8128:19;;7970:183;;;:::o;8159:323::-;;8322:67;8386:2;8381:3;8322:67;:::i;:::-;8315:74;;8419:27;8415:1;8410:3;8406:11;8399:48;8473:2;8468:3;8464:12;8457:19;;8305:177;;;:::o;8488:370::-;;8651:67;8715:2;8710:3;8651:67;:::i;:::-;8644:74;;8748:34;8744:1;8739:3;8735:11;8728:55;8814:8;8809:2;8804:3;8800:12;8793:30;8849:2;8844:3;8840:12;8833:19;;8634:224;;;:::o;8864:366::-;;9027:67;9091:2;9086:3;9027:67;:::i;:::-;9020:74;;9124:34;9120:1;9115:3;9111:11;9104:55;9190:4;9185:2;9180:3;9176:12;9169:26;9221:2;9216:3;9212:12;9205:19;;9010:220;;;:::o;9236:396::-;;9417:84;9499:1;9494:3;9417:84;:::i;:::-;9410:91;;9531:66;9527:1;9522:3;9518:11;9511:87;9624:1;9619:3;9615:11;9608:18;;9400:232;;;:::o;9638:327::-;;9801:67;9865:2;9860:3;9801:67;:::i;:::-;9794:74;;9898:31;9894:1;9889:3;9885:11;9878:52;9956:2;9951:3;9947:12;9940:19;;9784:181;;;:::o;9971:327::-;;10134:67;10198:2;10193:3;10134:67;:::i;:::-;10127:74;;10231:31;10227:1;10222:3;10218:11;10211:52;10289:2;10284:3;10280:12;10273:19;;10117:181;;;:::o;10304:370::-;;10467:67;10531:2;10526:3;10467:67;:::i;:::-;10460:74;;10564:34;10560:1;10555:3;10551:11;10544:55;10630:8;10625:2;10620:3;10616:12;10609:30;10665:2;10660:3;10656:12;10649:19;;10450:224;;;:::o;10680:366::-;;10843:67;10907:2;10902:3;10843:67;:::i;:::-;10836:74;;10940:34;10936:1;10931:3;10927:11;10920:55;11006:4;11001:2;10996:3;10992:12;10985:26;11037:2;11032:3;11028:12;11021:19;;10826:220;;;:::o;11052:366::-;;11215:67;11279:2;11274:3;11215:67;:::i;:::-;11208:74;;11312:34;11308:1;11303:3;11299:11;11292:55;11378:4;11373:2;11368:3;11364:12;11357:26;11409:2;11404:3;11400:12;11393:19;;11198:220;;;:::o;11424:328::-;;11587:67;11651:2;11646:3;11587:67;:::i;:::-;11580:74;;11684:32;11680:1;11675:3;11671:11;11664:53;11743:2;11738:3;11734:12;11727:19;;11570:182;;;:::o;11758:330::-;;11921:67;11985:2;11980:3;11921:67;:::i;:::-;11914:74;;12018:34;12014:1;12009:3;12005:11;11998:55;12079:2;12074:3;12070:12;12063:19;;11904:184;;;:::o;12094:371::-;;12257:67;12321:2;12316:3;12257:67;:::i;:::-;12250:74;;12354:34;12350:1;12345:3;12341:11;12334:55;12420:9;12415:2;12410:3;12406:12;12399:31;12456:2;12451:3;12447:12;12440:19;;12240:225;;;:::o;12471:365::-;;12634:67;12698:2;12693:3;12634:67;:::i;:::-;12627:74;;12731:34;12727:1;12722:3;12718:11;12711:55;12797:3;12792:2;12787:3;12783:12;12776:25;12827:2;12822:3;12818:12;12811:19;;12617:219;;;:::o;12842:369::-;;13005:67;13069:2;13064:3;13005:67;:::i;:::-;12998:74;;13102:34;13098:1;13093:3;13089:11;13082:55;13168:7;13163:2;13158:3;13154:12;13147:29;13202:2;13197:3;13193:12;13186:19;;12988:223;;;:::o;13217:370::-;;13380:67;13444:2;13439:3;13380:67;:::i;:::-;13373:74;;13477:34;13473:1;13468:3;13464:11;13457:55;13543:8;13538:2;13533:3;13529:12;13522:30;13578:2;13573:3;13569:12;13562:19;;13363:224;;;:::o;13593:368::-;;13756:67;13820:2;13815:3;13756:67;:::i;:::-;13749:74;;13853:34;13849:1;13844:3;13840:11;13833:55;13919:6;13914:2;13909:3;13905:12;13898:28;13952:2;13947:3;13943:12;13936:19;;13739:222;;;:::o;13967:369::-;;14130:67;14194:2;14189:3;14130:67;:::i;:::-;14123:74;;14227:34;14223:1;14218:3;14214:11;14207:55;14293:7;14288:2;14283:3;14279:12;14272:29;14327:2;14322:3;14318:12;14311:19;;14113:223;;;:::o;14410:517::-;14563:4;14558:3;14554:14;14655:4;14648:5;14644:16;14638:23;14674:61;14729:4;14724:3;14720:14;14706:12;14674:61;:::i;:::-;14578:167;14828:4;14821:5;14817:16;14811:23;14847:63;14904:4;14899:3;14895:14;14881:12;14847:63;:::i;:::-;14755:165;14532:395;;;:::o;14933:108::-;15010:24;15028:5;15010:24;:::i;:::-;15005:3;14998:37;14988:53;;:::o;15047:118::-;15134:24;15152:5;15134:24;:::i;:::-;15129:3;15122:37;15112:53;;:::o;15171:105::-;15246:23;15263:5;15246:23;:::i;:::-;15241:3;15234:36;15224:52;;:::o;15282:115::-;15367:23;15384:5;15367:23;:::i;:::-;15362:3;15355:36;15345:52;;:::o;15403:112::-;15486:22;15502:5;15486:22;:::i;:::-;15481:3;15474:35;15464:51;;:::o;15521:663::-;;15784:148;15928:3;15784:148;:::i;:::-;15777:155;;15942:75;16013:3;16004:6;15942:75;:::i;:::-;16042:2;16037:3;16033:12;16026:19;;16055:75;16126:3;16117:6;16055:75;:::i;:::-;16155:2;16150:3;16146:12;16139:19;;16175:3;16168:10;;15766:418;;;;;:::o;16190:222::-;;16321:2;16310:9;16306:18;16298:26;;16334:71;16402:1;16391:9;16387:17;16378:6;16334:71;:::i;:::-;16288:124;;;;:::o;16418:210::-;;16543:2;16532:9;16528:18;16520:26;;16556:65;16618:1;16607:9;16603:17;16594:6;16556:65;:::i;:::-;16510:118;;;;:::o;16634:222::-;;16765:2;16754:9;16750:18;16742:26;;16778:71;16846:1;16835:9;16831:17;16822:6;16778:71;:::i;:::-;16732:124;;;;:::o;16862:775::-;;17133:3;17122:9;17118:19;17110:27;;17147:71;17215:1;17204:9;17200:17;17191:6;17147:71;:::i;:::-;17228:72;17296:2;17285:9;17281:18;17272:6;17228:72;:::i;:::-;17310;17378:2;17367:9;17363:18;17354:6;17310:72;:::i;:::-;17392;17460:2;17449:9;17445:18;17436:6;17392:72;:::i;:::-;17474:73;17542:3;17531:9;17527:19;17518:6;17474:73;:::i;:::-;17557;17625:3;17614:9;17610:19;17601:6;17557:73;:::i;:::-;17100:537;;;;;;;;;:::o;17643:553::-;;17858:3;17847:9;17843:19;17835:27;;17872:71;17940:1;17929:9;17925:17;17916:6;17872:71;:::i;:::-;17953:72;18021:2;18010:9;18006:18;17997:6;17953:72;:::i;:::-;18035;18103:2;18092:9;18088:18;18079:6;18035:72;:::i;:::-;18117;18185:2;18174:9;18170:18;18161:6;18117:72;:::i;:::-;17825:371;;;;;;;:::o;18202:664::-;;18445:3;18434:9;18430:19;18422:27;;18459:71;18527:1;18516:9;18512:17;18503:6;18459:71;:::i;:::-;18540:72;18608:2;18597:9;18593:18;18584:6;18540:72;:::i;:::-;18622;18690:2;18679:9;18675:18;18666:6;18622:72;:::i;:::-;18704;18772:2;18761:9;18757:18;18748:6;18704:72;:::i;:::-;18786:73;18854:3;18843:9;18839:19;18830:6;18786:73;:::i;:::-;18412:454;;;;;;;;:::o;18872:545::-;;19083:3;19072:9;19068:19;19060:27;;19097:71;19165:1;19154:9;19150:17;19141:6;19097:71;:::i;:::-;19178:68;19242:2;19231:9;19227:18;19218:6;19178:68;:::i;:::-;19256:72;19324:2;19313:9;19309:18;19300:6;19256:72;:::i;:::-;19338;19406:2;19395:9;19391:18;19382:6;19338:72;:::i;:::-;19050:367;;;;;;;:::o;19423:313::-;;19574:2;19563:9;19559:18;19551:26;;19623:9;19617:4;19613:20;19609:1;19598:9;19594:17;19587:47;19651:78;19724:4;19715:6;19651:78;:::i;:::-;19643:86;;19541:195;;;;:::o;19742:419::-;;19946:2;19935:9;19931:18;19923:26;;19995:9;19989:4;19985:20;19981:1;19970:9;19966:17;19959:47;20023:131;20149:4;20023:131;:::i;:::-;20015:139;;19913:248;;;:::o;20167:419::-;;20371:2;20360:9;20356:18;20348:26;;20420:9;20414:4;20410:20;20406:1;20395:9;20391:17;20384:47;20448:131;20574:4;20448:131;:::i;:::-;20440:139;;20338:248;;;:::o;20592:419::-;;20796:2;20785:9;20781:18;20773:26;;20845:9;20839:4;20835:20;20831:1;20820:9;20816:17;20809:47;20873:131;20999:4;20873:131;:::i;:::-;20865:139;;20763:248;;;:::o;21017:419::-;;21221:2;21210:9;21206:18;21198:26;;21270:9;21264:4;21260:20;21256:1;21245:9;21241:17;21234:47;21298:131;21424:4;21298:131;:::i;:::-;21290:139;;21188:248;;;:::o;21442:419::-;;21646:2;21635:9;21631:18;21623:26;;21695:9;21689:4;21685:20;21681:1;21670:9;21666:17;21659:47;21723:131;21849:4;21723:131;:::i;:::-;21715:139;;21613:248;;;:::o;21867:419::-;;22071:2;22060:9;22056:18;22048:26;;22120:9;22114:4;22110:20;22106:1;22095:9;22091:17;22084:47;22148:131;22274:4;22148:131;:::i;:::-;22140:139;;22038:248;;;:::o;22292:419::-;;22496:2;22485:9;22481:18;22473:26;;22545:9;22539:4;22535:20;22531:1;22520:9;22516:17;22509:47;22573:131;22699:4;22573:131;:::i;:::-;22565:139;;22463:248;;;:::o;22717:419::-;;22921:2;22910:9;22906:18;22898:26;;22970:9;22964:4;22960:20;22956:1;22945:9;22941:17;22934:47;22998:131;23124:4;22998:131;:::i;:::-;22990:139;;22888:248;;;:::o;23142:419::-;;23346:2;23335:9;23331:18;23323:26;;23395:9;23389:4;23385:20;23381:1;23370:9;23366:17;23359:47;23423:131;23549:4;23423:131;:::i;:::-;23415:139;;23313:248;;;:::o;23567:419::-;;23771:2;23760:9;23756:18;23748:26;;23820:9;23814:4;23810:20;23806:1;23795:9;23791:17;23784:47;23848:131;23974:4;23848:131;:::i;:::-;23840:139;;23738:248;;;:::o;23992:419::-;;24196:2;24185:9;24181:18;24173:26;;24245:9;24239:4;24235:20;24231:1;24220:9;24216:17;24209:47;24273:131;24399:4;24273:131;:::i;:::-;24265:139;;24163:248;;;:::o;24417:419::-;;24621:2;24610:9;24606:18;24598:26;;24670:9;24664:4;24660:20;24656:1;24645:9;24641:17;24634:47;24698:131;24824:4;24698:131;:::i;:::-;24690:139;;24588:248;;;:::o;24842:419::-;;25046:2;25035:9;25031:18;25023:26;;25095:9;25089:4;25085:20;25081:1;25070:9;25066:17;25059:47;25123:131;25249:4;25123:131;:::i;:::-;25115:139;;25013:248;;;:::o;25267:419::-;;25471:2;25460:9;25456:18;25448:26;;25520:9;25514:4;25510:20;25506:1;25495:9;25491:17;25484:47;25548:131;25674:4;25548:131;:::i;:::-;25540:139;;25438:248;;;:::o;25692:419::-;;25896:2;25885:9;25881:18;25873:26;;25945:9;25939:4;25935:20;25931:1;25920:9;25916:17;25909:47;25973:131;26099:4;25973:131;:::i;:::-;25965:139;;25863:248;;;:::o;26117:419::-;;26321:2;26310:9;26306:18;26298:26;;26370:9;26364:4;26360:20;26356:1;26345:9;26341:17;26334:47;26398:131;26524:4;26398:131;:::i;:::-;26390:139;;26288:248;;;:::o;26542:419::-;;26746:2;26735:9;26731:18;26723:26;;26795:9;26789:4;26785:20;26781:1;26770:9;26766:17;26759:47;26823:131;26949:4;26823:131;:::i;:::-;26815:139;;26713:248;;;:::o;26967:419::-;;27171:2;27160:9;27156:18;27148:26;;27220:9;27214:4;27210:20;27206:1;27195:9;27191:17;27184:47;27248:131;27374:4;27248:131;:::i;:::-;27240:139;;27138:248;;;:::o;27392:419::-;;27596:2;27585:9;27581:18;27573:26;;27645:9;27639:4;27635:20;27631:1;27620:9;27616:17;27609:47;27673:131;27799:4;27673:131;:::i;:::-;27665:139;;27563:248;;;:::o;27817:419::-;;28021:2;28010:9;28006:18;27998:26;;28070:9;28064:4;28060:20;28056:1;28045:9;28041:17;28034:47;28098:131;28224:4;28098:131;:::i;:::-;28090:139;;27988:248;;;:::o;28242:419::-;;28446:2;28435:9;28431:18;28423:26;;28495:9;28489:4;28485:20;28481:1;28470:9;28466:17;28459:47;28523:131;28649:4;28523:131;:::i;:::-;28515:139;;28413:248;;;:::o;28667:419::-;;28871:2;28860:9;28856:18;28848:26;;28920:9;28914:4;28910:20;28906:1;28895:9;28891:17;28884:47;28948:131;29074:4;28948:131;:::i;:::-;28940:139;;28838:248;;;:::o;29092:334::-;;29279:2;29268:9;29264:18;29256:26;;29292:127;29416:1;29405:9;29401:17;29392:6;29292:127;:::i;:::-;29246:180;;;;:::o;29432:222::-;;29563:2;29552:9;29548:18;29540:26;;29576:71;29644:1;29633:9;29629:17;29620:6;29576:71;:::i;:::-;29530:124;;;;:::o;29660:332::-;;29819:2;29808:9;29804:18;29796:26;;29832:71;29900:1;29889:9;29885:17;29876:6;29832:71;:::i;:::-;29913:72;29981:2;29970:9;29966:18;29957:6;29913:72;:::i;:::-;29786:206;;;;;:::o;29998:218::-;;30127:2;30116:9;30112:18;30104:26;;30140:69;30206:1;30195:9;30191:17;30182:6;30140:69;:::i;:::-;30094:122;;;;:::o;30222:214::-;;30349:2;30338:9;30334:18;30326:26;;30362:67;30426:1;30415:9;30411:17;30402:6;30362:67;:::i;:::-;30316:120;;;;:::o;30442:99::-;;30528:5;30522:12;30512:22;;30501:40;;;:::o;30547:169::-;;30665:6;30660:3;30653:19;30705:4;30700:3;30696:14;30681:29;;30643:73;;;;:::o;30722:148::-;;30861:3;30846:18;;30836:34;;;;:::o;30876:305::-;;30935:20;30953:1;30935:20;:::i;:::-;30930:25;;30969:20;30987:1;30969:20;:::i;:::-;30964:25;;31123:1;31055:66;31051:74;31048:1;31045:81;31042:2;;;31129:18;;:::i;:::-;31042:2;31173:1;31170;31166:9;31159:16;;30920:261;;;;:::o;31187:185::-;;31244:20;31262:1;31244:20;:::i;:::-;31239:25;;31278:20;31296:1;31278:20;:::i;:::-;31273:25;;31317:1;31307:2;;31322:18;;:::i;:::-;31307:2;31364:1;31361;31357:9;31352:14;;31229:143;;;;:::o;31378:191::-;;31438:20;31456:1;31438:20;:::i;:::-;31433:25;;31472:20;31490:1;31472:20;:::i;:::-;31467:25;;31511:1;31508;31505:8;31502:2;;;31516:18;;:::i;:::-;31502:2;31561:1;31558;31554:9;31546:17;;31423:146;;;;:::o;31575:96::-;;31641:24;31659:5;31641:24;:::i;:::-;31630:35;;31620:51;;;:::o;31677:90::-;;31754:5;31747:13;31740:21;31729:32;;31719:48;;;:::o;31773:77::-;;31839:5;31828:16;;31818:32;;;:::o;31856:126::-;;31933:42;31926:5;31922:54;31911:65;;31901:81;;;:::o;31988:142::-;;32065:58;32058:5;32054:70;32043:81;;32033:97;;;:::o;32136:77::-;;32202:5;32191:16;;32181:32;;;:::o;32219:93::-;;32295:10;32288:5;32284:22;32273:33;;32263:49;;;:::o;32318:86::-;;32393:4;32386:5;32382:16;32371:27;;32361:43;;;:::o;32410:307::-;32478:1;32488:113;32502:6;32499:1;32496:13;32488:113;;;32587:1;32582:3;32578:11;32572:18;32568:1;32563:3;32559:11;32552:39;32524:2;32521:1;32517:10;32512:15;;32488:113;;;32619:6;32616:1;32613:13;32610:2;;;32699:1;32690:6;32685:3;32681:16;32674:27;32610:2;32459:258;;;;:::o;32723:320::-;;32804:1;32798:4;32794:12;32784:22;;32851:1;32845:4;32841:12;32872:18;32862:2;;32928:4;32920:6;32916:17;32906:27;;32862:2;32990;32982:6;32979:14;32959:18;32956:38;32953:2;;;33009:18;;:::i;:::-;32953:2;32774:269;;;;:::o;33049:79::-;;33117:5;33106:16;;33096:32;;;:::o;33134:180::-;33182:77;33179:1;33172:88;33279:4;33276:1;33269:15;33303:4;33300:1;33293:15;33320:180;33368:77;33365:1;33358:88;33465:4;33462:1;33455:15;33489:4;33486:1;33479:15;33506:180;33554:77;33551:1;33544:88;33651:4;33648:1;33641:15;33675:4;33672:1;33665:15;33692:102;;33784:2;33780:7;33775:2;33768:5;33764:14;33760:28;33750:38;;33740:54;;;:::o;33800:122::-;33873:24;33891:5;33873:24;:::i;:::-;33866:5;33863:35;33853:2;;33912:1;33909;33902:12;33853:2;33843:79;:::o;33928:122::-;34001:24;34019:5;34001:24;:::i;:::-;33994:5;33991:35;33981:2;;34040:1;34037;34030:12;33981:2;33971:79;:::o;34056:122::-;34129:24;34147:5;34129:24;:::i;:::-;34122:5;34119:35;34109:2;;34168:1;34165;34158:12;34109:2;34099:79;:::o;34184:120::-;34256:23;34273:5;34256:23;:::i;:::-;34249:5;34246:34;34236:2;;34294:1;34291;34284:12;34236:2;34226:78;:::o;34310:118::-;34381:22;34397:5;34381:22;:::i;:::-;34374:5;34371:33;34361:2;;34418:1;34415;34408:12;34361:2;34351:77;:::o

Swarm Source

ipfs://456499f9435fdf764c3cf159f344ca5a8a610f7323035e145cd9fa4e42e00788
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.