ETH Price: $3,407.28 (-1.61%)
Gas: 12 Gwei

Token

Aggregated Finance (AGFI)
 

Overview

Max Total Supply

800,000,000,000 AGFI

Holders

1,059

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
16,051,570.44 AGFI

Value
$0.00
0x7a3581Ab81b946107D960f8a4A3f3be2ED6A8C25
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:
AggregatedFinance

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-21
*/

// File: contracts/IUniswapV2Factory.sol


pragma solidity 0.8.13;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

// File: contracts/utils/SafeCast.sol


// 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: contracts/extensions/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: contracts/utils/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: contracts/utils/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: contracts/utils/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: contracts/extensions/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: contracts/utils/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: contracts/utils/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: contracts/utils/Arrays.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Collection of functions related to array types.
 */
library Arrays {
    /**
     * @dev Searches a sorted `array` and returns the first index that contains
     * a value greater or equal to `element`. If no such index exists (i.e. all
     * values in the array are strictly less than `element`), the array length is
     * returned. Time complexity O(log n).
     *
     * `array` is expected to be sorted in ascending order, and to contain no
     * repeated elements.
     */
    function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {
        if (array.length == 0) {
            return 0;
        }

        uint256 low = 0;
        uint256 high = array.length;

        while (low < high) {
            uint256 mid = Math.average(low, high);

            // Note that mid will always be strictly less than high (i.e. it will be a valid array index)
            // because Math.average rounds down (it does integer division with truncation).
            if (array[mid] > element) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }

        // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound.
        if (low > 0 && array[low - 1] == element) {
            return low - 1;
        } else {
            return low;
        }
    }
}

// File: contracts/extensions/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: contracts/extensions/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract 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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual 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 virtual onlyOwner {
        _transferOwnership(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 virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: contracts/extensions/IUniswapV2Router01.sol


pragma solidity ^0.8.0;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
 
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
 
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
// File: contracts/extensions/IUniswapV2Router02.sol


pragma solidity ^0.8.0;


interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);
 
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}
// File: contracts/extensions/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: contracts/extensions/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: contracts/extensions/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) private _balances;

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

    uint256 private _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 Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, 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: contracts/extensions/draft-ERC20Permit.sol


// OpenZeppelin Contracts v4.4.1 (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 immutable _PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    /**
     * @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: contracts/extensions/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 Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).
     */
    function _maxSupply() internal view virtual returns (uint224) {
        return type(uint224).max;
    }

    /**
     * @dev Snapshots the totalSupply after it has been increased.
     */
    function _mint(address account, uint256 amount) internal virtual override {
        super._mint(account, amount);
        require(totalSupply() <= _maxSupply(), "ERC20Votes: total supply risks overflowing votes");

        _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);
    }

    /**
     * @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: contracts/extensions/ERC20Snapshot.sol


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

pragma solidity ^0.8.0;




/**
 * @dev This contract extends an ERC20 token with a snapshot mechanism. When a snapshot is created, the balances and
 * total supply at the time are recorded for later access.
 *
 * This can be used to safely create mechanisms based on token balances such as trustless dividends or weighted voting.
 * In naive implementations it's possible to perform a "double spend" attack by reusing the same balance from different
 * accounts. By using snapshots to calculate dividends or voting power, those attacks no longer apply. It can also be
 * used to create an efficient ERC20 forking mechanism.
 *
 * Snapshots are created by the internal {_snapshot} function, which will emit the {Snapshot} event and return a
 * snapshot id. To get the total supply at the time of a snapshot, call the function {totalSupplyAt} with the snapshot
 * id. To get the balance of an account at the time of a snapshot, call the {balanceOfAt} function with the snapshot id
 * and the account address.
 *
 * NOTE: Snapshot policy can be customized by overriding the {_getCurrentSnapshotId} method. For example, having it
 * return `block.number` will trigger the creation of snapshot at the begining of each new block. When overridding this
 * function, be careful about the monotonicity of its result. Non-monotonic snapshot ids will break the contract.
 *
 * Implementing snapshots for every block using this method will incur significant gas costs. For a gas-efficient
 * alternative consider {ERC20Votes}.
 *
 * ==== Gas Costs
 *
 * Snapshots are efficient. Snapshot creation is _O(1)_. Retrieval of balances or total supply from a snapshot is _O(log
 * n)_ in the number of snapshots that have been created, although _n_ for a specific account will generally be much
 * smaller since identical balances in subsequent snapshots are stored as a single entry.
 *
 * There is a constant overhead for normal ERC20 transfers due to the additional snapshot bookkeeping. This overhead is
 * only significant for the first transfer that immediately follows a snapshot for a particular account. Subsequent
 * transfers will have normal cost until the next snapshot, and so on.
 */

abstract contract ERC20Snapshot is ERC20 {
    // Inspired by Jordi Baylina's MiniMeToken to record historical balances:
    // https://github.com/Giveth/minimd/blob/ea04d950eea153a04c51fa510b068b9dded390cb/contracts/MiniMeToken.sol

    using Arrays for uint256[];
    using Counters for Counters.Counter;

    // Snapshotted values have arrays of ids and the value corresponding to that id. These could be an array of a
    // Snapshot struct, but that would impede usage of functions that work on an array.
    struct Snapshots {
        uint256[] ids;
        uint256[] values;
    }

    mapping(address => Snapshots) private _accountBalanceSnapshots;
    Snapshots private _totalSupplySnapshots;

    // Snapshot ids increase monotonically, with the first value being 1. An id of 0 is invalid.
    Counters.Counter private _currentSnapshotId;

    /**
     * @dev Emitted by {_snapshot} when a snapshot identified by `id` is created.
     */
    event Snapshot(uint256 id);

    /**
     * @dev Creates a new snapshot and returns its snapshot id.
     *
     * Emits a {Snapshot} event that contains the same id.
     *
     * {_snapshot} is `internal` and you have to decide how to expose it externally. Its usage may be restricted to a
     * set of accounts, for example using {AccessControl}, or it may be open to the public.
     *
     * [WARNING]
     * ====
     * While an open way of calling {_snapshot} is required for certain trust minimization mechanisms such as forking,
     * you must consider that it can potentially be used by attackers in two ways.
     *
     * First, it can be used to increase the cost of retrieval of values from snapshots, although it will grow
     * logarithmically thus rendering this attack ineffective in the long term. Second, it can be used to target
     * specific accounts and increase the cost of ERC20 transfers for them, in the ways specified in the Gas Costs
     * section above.
     *
     * We haven't measured the actual numbers; if this is something you're interested in please reach out to us.
     * ====
     */
    function _snapshot() internal virtual returns (uint256) {
        _currentSnapshotId.increment();

        uint256 currentId = _getCurrentSnapshotId();
        emit Snapshot(currentId);
        return currentId;
    }

    /**
     * @dev Get the current snapshotId
     */
    function _getCurrentSnapshotId() internal view virtual returns (uint256) {
        return _currentSnapshotId.current();
    }

    /**
     * @dev Retrieves the balance of `account` at the time `snapshotId` was created.
     */
    function balanceOfAt(address account, uint256 snapshotId) public view virtual returns (uint256) {
        (bool snapshotted, uint256 value) = _valueAt(snapshotId, _accountBalanceSnapshots[account]);

        return snapshotted ? value : balanceOf(account);
    }

    /**
     * @dev Retrieves the total supply at the time `snapshotId` was created.
     */
    function totalSupplyAt(uint256 snapshotId) public view virtual returns (uint256) {
        (bool snapshotted, uint256 value) = _valueAt(snapshotId, _totalSupplySnapshots);

        return snapshotted ? value : totalSupply();
    }

    // Update balance and/or total supply snapshots before the values are modified. This is implemented
    // in the _beforeTokenTransfer hook, which is executed for _mint, _burn, and _transfer operations.
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, amount);

        if (from == address(0)) {
            // mint
            _updateAccountSnapshot(to);
            _updateTotalSupplySnapshot();
        } else if (to == address(0)) {
            // burn
            _updateAccountSnapshot(from);
            _updateTotalSupplySnapshot();
        } else {
            // transfer
            _updateAccountSnapshot(from);
            _updateAccountSnapshot(to);
        }
    }

    function _valueAt(uint256 snapshotId, Snapshots storage snapshots) private view returns (bool, uint256) {
        require(snapshotId > 0, "ERC20Snapshot: id is 0");
        require(snapshotId <= _getCurrentSnapshotId(), "ERC20Snapshot: nonexistent id");

        // When a valid snapshot is queried, there are three possibilities:
        //  a) The queried value was not modified after the snapshot was taken. Therefore, a snapshot entry was never
        //  created for this id, and all stored snapshot ids are smaller than the requested one. The value that corresponds
        //  to this id is the current one.
        //  b) The queried value was modified after the snapshot was taken. Therefore, there will be an entry with the
        //  requested id, and its value is the one to return.
        //  c) More snapshots were created after the requested one, and the queried value was later modified. There will be
        //  no entry for the requested id: the value that corresponds to it is that of the smallest snapshot id that is
        //  larger than the requested one.
        //
        // In summary, we need to find an element in an array, returning the index of the smallest value that is larger if
        // it is not found, unless said value doesn't exist (e.g. when all values are smaller). Arrays.findUpperBound does
        // exactly this.

        uint256 index = snapshots.ids.findUpperBound(snapshotId);

        if (index == snapshots.ids.length) {
            return (false, 0);
        } else {
            return (true, snapshots.values[index]);
        }
    }

    function _updateAccountSnapshot(address account) private {
        _updateSnapshot(_accountBalanceSnapshots[account], balanceOf(account));
    }

    function _updateTotalSupplySnapshot() private {
        _updateSnapshot(_totalSupplySnapshots, totalSupply());
    }

    function _updateSnapshot(Snapshots storage snapshots, uint256 currentValue) private {
        uint256 currentId = _getCurrentSnapshotId();
        if (_lastSnapshotId(snapshots.ids) < currentId) {
            snapshots.ids.push(currentId);
            snapshots.values.push(currentValue);
        }
    }

    function _lastSnapshotId(uint256[] storage ids) private view returns (uint256) {
        if (ids.length == 0) {
            return 0;
        } else {
            return ids[ids.length - 1];
        }
    }
}

// File: contracts/extensions/ERC20Burnable.sol


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

pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

// File: contracts/extensions/IRewardTracker.sol


pragma solidity ^0.8.13;



interface IRewardTracker is IERC20 {
    event RewardsDistributed(address indexed from, uint256 weiAmount);
    event RewardWithdrawn(address indexed to, uint256 weiAmount);
    event ExcludeFromRewards(address indexed account, bool excluded);
    event Claim(address indexed account, uint256 amount);
    event Compound(address indexed account, uint256 amount, uint256 tokens);
    event LogErrorString(string message);

    struct AccountInfo {
        address account;
        uint256 withdrawableRewards;
        uint256 totalRewards;
        uint256 lastClaimTime;
    }

    receive() external payable;

    function distributeRewards() external payable;

    function setBalance(address payable account, uint256 newBalance) external;

    function excludeFromRewards(address account, bool excluded) external;

    function isExcludedFromRewards(address account) external view returns (bool);

    function manualSendReward(uint256 amount, address holder) external;

    function processAccount(address payable account) external returns (bool);

    function compoundAccount(address payable account) external returns (bool);

    function withdrawableRewardOf(address account) external view returns (uint256);

    function withdrawnRewardOf(address account) external view returns (uint256);
    
    function accumulativeRewardOf(address account) external view returns (uint256);

    function getAccountInfo(address account) external view returns (address, uint256, uint256, uint256, uint256);

    function getLastClaimTime(address account) external view returns (uint256);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view override returns (uint256);

    function balanceOf(address account) external view override returns (uint256);

    function transfer(address, uint256) external pure override returns (bool);

    function allowance(address, address) external pure override returns (uint256);

    function approve(address, uint256) external pure override returns (bool);

    function transferFrom(address, address, uint256) external pure override returns (bool);
}
// File: contracts/RewardTracker.sol


pragma solidity ^0.8.13;




contract RewardTracker is IRewardTracker, Ownable {
    address immutable UNISWAPROUTER;

    string private constant _name = "AGFI_RewardTracker";
    string private constant _symbol = "AGFI_RewardTracker";

    uint256 public lastProcessedIndex;

    uint256 private _totalSupply;
    mapping(address => uint256) private _balances;

    uint256 private constant magnitude = 2**128;
    uint256 public immutable minTokenBalanceForRewards;
    uint256 private magnifiedRewardPerShare;
    uint256 public totalRewardsDistributed;
    uint256 public totalRewardsWithdrawn;

    address public immutable tokenAddress;

    mapping(address => bool) public excludedFromRewards;
    mapping(address => int256) private magnifiedRewardCorrections;
    mapping(address => uint256) private withdrawnRewards;
    mapping(address => uint256) private lastClaimTimes;

    constructor(address _tokenAddress, address _uniswapRouter) {
        minTokenBalanceForRewards = 1 * (10**9);
        tokenAddress = _tokenAddress;
        UNISWAPROUTER = _uniswapRouter;
    }

    receive() external override payable {
        distributeRewards();
    }

    function distributeRewards() public override payable {
        require(_totalSupply > 0, "Total supply invalid");
        if (msg.value > 0) {
            magnifiedRewardPerShare =
                magnifiedRewardPerShare +
                ((msg.value * magnitude) / _totalSupply);
            emit RewardsDistributed(msg.sender, msg.value);
            totalRewardsDistributed += msg.value;
        }
    }

    function setBalance(address payable account, uint256 newBalance)
        external
        override
        onlyOwner
    {
        if (excludedFromRewards[account]) {
            return;
        }
        if (newBalance >= minTokenBalanceForRewards) {
            _setBalance(account, newBalance);
        } else {
            _setBalance(account, 0);
        }
    }

    function excludeFromRewards(address account, bool excluded)
        external
        override
        onlyOwner
    {
        require(
            excludedFromRewards[account] != excluded,
            "AGFI_RewardTracker: account already set to requested state"
        );
        excludedFromRewards[account] = excluded;
        if (excluded) {
            _setBalance(account, 0);
        } else {
            uint256 newBalance = IERC20(tokenAddress).balanceOf(account);
            if (newBalance >= minTokenBalanceForRewards) {
                _setBalance(account, newBalance);
            } else {
                _setBalance(account, 0);
            }
        }
        emit ExcludeFromRewards(account, excluded);
    }

    function isExcludedFromRewards(address account) public override view returns (bool) {
        return excludedFromRewards[account];
    }

    function manualSendReward(uint256 amount, address holder)
        external
        override
        onlyOwner
    {
        uint256 contractETHBalance = address(this).balance;
        (bool success, ) = payable(holder).call{
            value: amount > 0 ? amount : contractETHBalance
        }("");
        require(success, "Manual send failed.");
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = _balances[account];
        if (newBalance > currentBalance) {
            uint256 addAmount = newBalance - currentBalance;
            _mint(account, addAmount);
        } else if (newBalance < currentBalance) {
            uint256 subAmount = currentBalance - newBalance;
            _burn(account, subAmount);
        }
    }

    function _mint(address account, uint256 amount) private {
        require(
            account != address(0),
            "AGFI_RewardTracker: mint to the zero address"
        );
        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
        magnifiedRewardCorrections[account] =
            magnifiedRewardCorrections[account] -
            int256(magnifiedRewardPerShare * amount);
    }

    function _burn(address account, uint256 amount) private {
        require(
            account != address(0),
            "AGFI_RewardTracker: burn from the zero address"
        );
        uint256 accountBalance = _balances[account];
        require(
            accountBalance >= amount,
            "AGFI_RewardTracker: burn amount exceeds balance"
        );
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;
        emit Transfer(account, address(0), amount);
        magnifiedRewardCorrections[account] =
            magnifiedRewardCorrections[account] +
            int256(magnifiedRewardPerShare * amount);
    }

    function processAccount(address payable account)
        public
        override
        onlyOwner
        returns (bool)
    {
        uint256 amount = _withdrawRewardOfUser(account);
        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount);
            return true;
        }
        return false;
    }

    function _withdrawRewardOfUser(address payable account)
        private
        returns (uint256)
    {
        uint256 _withdrawableReward = withdrawableRewardOf(account);
        if (_withdrawableReward > 0) {
            withdrawnRewards[account] += _withdrawableReward;
            totalRewardsWithdrawn += _withdrawableReward;
            (bool success, ) = account.call{value: _withdrawableReward}("");
            if (!success) {
                withdrawnRewards[account] -= _withdrawableReward;
                totalRewardsWithdrawn -= _withdrawableReward;
                emit LogErrorString("Withdraw failed");
                return 0;
            }
            emit RewardWithdrawn(account, _withdrawableReward);
            return _withdrawableReward;
        }
        return 0;
    }

    function compoundAccount(address payable account)
        public
        override
        onlyOwner
        returns (bool)
    {
        (uint256 amount, uint256 tokens) = _compoundRewardOfUser(account);
        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Compound(account, amount, tokens);
            return true;
        }
        return false;
    }

    function _compoundRewardOfUser(address payable account)
        private
        returns (uint256, uint256)
    {
        uint256 _withdrawableReward = withdrawableRewardOf(account);
        if (_withdrawableReward > 0) {
            withdrawnRewards[account] += _withdrawableReward;
            totalRewardsWithdrawn += _withdrawableReward;

            IUniswapV2Router02 uniswapV2Router = IUniswapV2Router02(
                UNISWAPROUTER
            );

            address[] memory path = new address[](2);
            path[0] = uniswapV2Router.WETH();
            path[1] = address(tokenAddress);

            bool success;
            uint256 tokens;

            uint256 initTokenBal = IERC20(tokenAddress).balanceOf(account);
            try
                uniswapV2Router
                    .swapExactETHForTokensSupportingFeeOnTransferTokens{
                    value: _withdrawableReward
                }(0, path, address(account), block.timestamp)
            {
                success = true;
                tokens = IERC20(tokenAddress).balanceOf(account) - initTokenBal;
            } catch Error(
                string memory /*err*/
            ) {
                success = false;
            }

            if (!success) {
                withdrawnRewards[account] -= _withdrawableReward;
                totalRewardsWithdrawn -= _withdrawableReward;
                emit LogErrorString("Withdraw failed");
                return (0, 0);
            }

            emit RewardWithdrawn(account, _withdrawableReward);
            return (_withdrawableReward, tokens);
        }
        return (0, 0);
    }

    function withdrawableRewardOf(address account)
        public
        override
        view
        returns (uint256)
    {
        return accumulativeRewardOf(account) - withdrawnRewards[account];
    }

    function withdrawnRewardOf(address account) public view returns (uint256) {
        return withdrawnRewards[account];
    }

    function accumulativeRewardOf(address account)
        public
        override
        view
        returns (uint256)
    {
        int256 a = int256(magnifiedRewardPerShare * balanceOf(account));
        int256 b = magnifiedRewardCorrections[account]; // this is an explicit int256 (signed)
        return uint256(a + b) / magnitude;
    }

    function getAccountInfo(address account)
        public
        override
        view
        returns (
            address,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        AccountInfo memory info;
        info.account = account;
        info.withdrawableRewards = withdrawableRewardOf(account);
        info.totalRewards = accumulativeRewardOf(account);
        info.lastClaimTime = lastClaimTimes[account];
        return (
            info.account,
            info.withdrawableRewards,
            info.totalRewards,
            info.lastClaimTime,
            totalRewardsWithdrawn
        );
    }

    function getLastClaimTime(address account) public override view returns (uint256) {
        return lastClaimTimes[account];
    }

    function name() public override pure returns (string memory) {
        return _name;
    }

    function symbol() public override pure returns (string memory) {
        return _symbol;
    }

    function decimals() public override pure returns (uint8) {
        return 9;
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    function transfer(address, uint256) public pure override returns (bool) {
        revert("AGFI_RewardTracker: method not implemented");
    }

    function allowance(address, address)
        public
        pure
        override
        returns (uint256)
    {
        revert("AGFI_RewardTracker: method not implemented");
    }

    function approve(address, uint256) public pure override returns (bool) {
        revert("AGFI_RewardTracker: method not implemented");
    }

    function transferFrom(
        address,
        address,
        uint256
    ) public pure override returns (bool) {
        revert("AGFI_RewardTracker: method not implemented");
    }
}
// File: contracts/AggregatedFinance.sol


pragma solidity ^0.8.13;










/// @custom:security-contact [email protected]
contract AggregatedFinance is ERC20, ERC20Burnable, ERC20Snapshot, Ownable, ERC20Permit, ERC20Votes {
    address constant UNISWAPROUTER = address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

    // non-immutable reward tracker so it can be upgraded if needed
    IRewardTracker public rewardTracker;
    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;

    mapping (address => uint256) private _balances;
    mapping (address => mapping(address => uint256)) private _allowances;
    mapping (address => bool) private _blacklist;
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;
    mapping (address => bool) private _isExcludedFromMaxWallet;
    mapping (address => uint256) private _holderLastTransferTimestamp; 
    mapping (address => uint256) private _holderFirstBuyTimestamp;
    mapping (address => bool) public automatedMarketMakerPairs;

    bool public limitsInEffect = true;
    bool public transferDelayEnabled = true;
    bool private swapping;
    bool private isCompounding;
    bool public taxEnabled = true;
    bool public transferTaxEnabled = false;
    bool public swapEnabled = false;
    bool public compoundingEnabled = true;

    uint256 public swapTokensAtAmount = 100000 * (1e9); // 100 thousand default threshold
    uint256 public lastSwapTime;

    uint256 public maxTransactionAmount = 1000000000 * (1e9); // 1 billion to start with 
    uint256 public maxWallet = 22000000000 * (1e9); // 22 billion to start with
    uint256 private launchedAt;

    // Fee channel definitions. Enable each individually, and define tax rates for each.
    bool public buyFeeC1Enabled = true;
    bool public buyFeeC2Enabled = false;
    bool public buyFeeC3Enabled = true;
    bool public buyFeeC4Enabled = true;
    bool public buyFeeC5Enabled = true;

    bool public sellFeeC1Enabled = true;
    bool public sellFeeC2Enabled = true;
    bool public sellFeeC3Enabled = true;
    bool public sellFeeC4Enabled = true;
    bool public sellFeeC5Enabled = true;

    bool public c2BurningEnabled = true;
    bool public c3RewardsEnabled = true;

    uint256 public tokensForC1;
    uint256 public tokensForC2;
    uint256 public tokensForC3;
    uint256 public tokensForC4;
    uint256 public tokensForC5;

    // treasury wallet, default to 0x3e822d55e79eA9F53C744BD9179d89dDec081556
    address public c1Wallet = address(0x3e822d55e79eA9F53C744BD9179d89dDec081556);

    // burning wallet, default to the staking rewards wallet, but when burning is enabled 
    // it will just burn them. The wallet still needs to be defined to function:
    // 0x16cc620dBBACc751DAB85d7Fc1164C62858d9b9f
    address public c2Wallet = address(0x16cc620dBBACc751DAB85d7Fc1164C62858d9b9f);

    // rewards wallet, default to the rewards contract itself, not a wallet. But
    // if rewards are disabled then they'll fall back to the staking rewards wallet:
    // 0x16cc620dBBACc751DAB85d7Fc1164C62858d9b9f
    address public c3Wallet = address(0x16cc620dBBACc751DAB85d7Fc1164C62858d9b9f);

    // staking rewards wallet, default to 0x16cc620dBBACc751DAB85d7Fc1164C62858d9b9f
    address public c4Wallet = address(0x16cc620dBBACc751DAB85d7Fc1164C62858d9b9f);

    // operations wallet, default to 0xf05E5AeFeCd9c370fbfFff94c6c4614E6c165b78
    address public c5Wallet = address(0xf05E5AeFeCd9c370fbfFff94c6c4614E6c165b78);

    uint256 public buyTotalFees = 1200; // 12% default
    uint256 public buyC1Fee = 400; // 4% Treasury
    uint256 public buyC2Fee = 0; // Nothing
    uint256 public buyC3Fee = 300; // 3% Eth Rewards
    uint256 public buyC4Fee = 300; // 3% Eth Staking Pool
    uint256 public buyC5Fee = 200; // 2% Operations
 
    uint256 public sellTotalFees = 1300; // 13% default
    uint256 public sellC1Fee = 400; // 4% Treasury
    uint256 public sellC2Fee = 100; // 1% Auto Burn
    uint256 public sellC3Fee = 300; // 3% Eth Rewards
    uint256 public sellC4Fee = 300; // 3% Eth Staking Pool
    uint256 public sellC5Fee = 200; // 2% Operations

    event LogErrorString(string message);
    event SwapEnabled(bool enabled);
    event TaxEnabled(bool enabled);
    event TransferTaxEnabled(bool enabled);
    event CompoundingEnabled(bool enabled);
    event MaxTxnUpdated(uint256 amount);
    event MaxWalletUpdated(uint256 amount);
    event ChangeSwapTokensAtAmount(uint256 amount);
    event LimitsReinstated();
    event LimitsRemoved();
    event C2BurningModified(bool enabled);
    event C3RewardsModified(bool enabled);
    event ChannelWalletsModified(address indexed newAddress, uint8 idx);

    event BoughtEarly(address indexed sniper);
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeFromMaxTransaction(address indexed account, bool isExcluded);
    event ExcludeFromMaxWallet(address account);
    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event SetRewardTracker(address indexed newAddress);
    event FeesUpdated();
    event SendChannel1(uint256 tokensSwapped, uint256 amount);
    event SendChannel2(uint256 tokensSwapped, uint256 amount);
    event SendChannel3(uint256 tokensSwapped, uint256 amount);
    event SendChannel4(uint256 tokensSwapped, uint256 amount);
    event SendChannel5(uint256 tokensSwapped, uint256 amount);
    event TokensBurned(uint256 amountBurned);

    constructor()
        ERC20("Aggregated Finance", "AGFI")
        ERC20Permit("Aggregated Finance")
    {

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(UNISWAPROUTER);
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

        rewardTracker = new RewardTracker(address(this), UNISWAPROUTER);

        rewardTracker.excludeFromRewards(address(rewardTracker), true);
        rewardTracker.excludeFromRewards(address(this), true);
        rewardTracker.excludeFromRewards(owner(), true);
        rewardTracker.excludeFromRewards(address(_uniswapV2Router), true);

        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);

        excludeFromMaxWallet(owner(), true);
        excludeFromMaxWallet(address(this), true);
        excludeFromMaxWallet(address(rewardTracker), true);

        _mint(msg.sender, 1000000000000 * (10 ** 9));
    }

    receive() external payable {}

    function decimals() override public pure returns (uint8) {
        return 9;
    }

    function excludeFromMaxTransaction(address account, bool excluded) public onlyOwner {
        _isExcludedMaxTransactionAmount[account] = excluded;
        emit ExcludeFromMaxTransaction(account, excluded);
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function excludeFromMaxWallet(address account, bool excluded) public onlyOwner {
        _isExcludedFromMaxWallet[account] = excluded;
        emit ExcludeFromMaxWallet(account);
    }

    function isExcludedFromMaxWallet(address account) public view returns (bool) {
        return _isExcludedFromMaxWallet[account];
    }

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }

    function blacklistAccount(address account, bool isBlacklisted) public onlyOwner {
        _blacklist[account] = isBlacklisted;
    }

    function setAutomatedMarketMakerPair(address pair, bool enabled) public onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");
        _setAutomatedMarketMakerPair(pair, enabled);
    }

    function _setAutomatedMarketMakerPair(address pair, bool enabled) private {
        automatedMarketMakerPairs[pair] = enabled;
        emit SetAutomatedMarketMakerPair(pair, enabled);
    }

    function setRewardTracker(address payable newTracker) public onlyOwner {
        require(newTracker != address(0), "newTracker cannot be zero address");
        rewardTracker = IRewardTracker(newTracker);
        emit SetRewardTracker(newTracker);
    }

    function claim() public {
        rewardTracker.processAccount(payable(_msgSender()));
    }

    function compound() public {
        require(compoundingEnabled, "AGFI: compounding is not enabled");
        isCompounding = true;
        rewardTracker.compoundAccount(payable(_msgSender()));
        isCompounding = false;
    }

    function withdrawableRewardOf(address account)
        public
        view
        returns (uint256)
    {
        return rewardTracker.withdrawableRewardOf(account);
    }

    function withdrawnRewardOf(address account) public view returns (uint256) {
        return rewardTracker.withdrawnRewardOf(account);
    }

    function accumulativeRewardOf(address account) public view returns (uint256) {
        return rewardTracker.accumulativeRewardOf(account);
    }

    function getAccountInfo(address account)
        public
        view
        returns (
            address,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        return rewardTracker.getAccountInfo(account);
    }

    function enableTrading() external onlyOwner {
        swapEnabled = true;
        launchedAt = block.number;
    }

    function getLastClaimTime(address account) public view returns (uint256) {
        return rewardTracker.getLastClaimTime(account);
    }

    function setCompoundingEnabled(bool enabled) external onlyOwner {
        compoundingEnabled = enabled;
        emit CompoundingEnabled(enabled);
    }

    function setSwapTokensAtAmount(uint256 amount) external onlyOwner {
        swapTokensAtAmount = amount;
        emit ChangeSwapTokensAtAmount(amount);
    }

    function setSwapEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
        emit SwapEnabled(enabled);
    }

    function setTaxEnabled(bool enabled) external onlyOwner {
        taxEnabled = enabled;
        emit TaxEnabled(enabled);
    }

    function setTransferTaxEnabled(bool enabled) external onlyOwner {
        transferTaxEnabled = enabled;
        emit TransferTaxEnabled(enabled);
    }

    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        maxTransactionAmount = newNum * (1e9);
        emit MaxTxnUpdated(newNum);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        maxWallet = newNum * (1e9);
        emit MaxWalletUpdated(newNum);
    }

    function removeLimits() external onlyOwner {
        limitsInEffect = false;
        emit LimitsRemoved();
    }

    function reinstateLimits() external onlyOwner {
        limitsInEffect = true;
        emit LimitsReinstated();
    }

    function modifyC2Burning(bool enabled) external onlyOwner {
        c2BurningEnabled = enabled;
        emit C2BurningModified(enabled);
    }

    function modifyC3Rewards(bool enabled) external onlyOwner {
        c3RewardsEnabled = enabled;
        emit C3RewardsModified(enabled);
    }

    function modifyChannelWallet(address newAddress, uint8 idx) external onlyOwner {
        require(newAddress != address(0), "modifyChannelWallet: newAddress can not be zero address.");

        if (idx == 1) {
            c1Wallet = newAddress;
        } else if (idx == 2) {
            c2Wallet = newAddress;
        } else if (idx == 3) {
            c3Wallet = newAddress;
        } else if (idx == 4) {
            c4Wallet = newAddress;
        } else if (idx == 5) {
            c5Wallet = newAddress;
        }

        emit ChannelWalletsModified(newAddress, idx);
    }

    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool) {
        transferDelayEnabled = false;
        // not bothering with an event emission, as it's only called once
        return true;
    }

    function updateBuyFees(
        bool _enableC1,
        uint256 _c1Fee,
        bool _enableC2,
        uint256 _c2Fee,
        bool _enableC3,
        uint256 _c3Fee,
        bool _enableC4,
        uint256 _c4Fee,
        bool _enableC5,
        uint256 _c5Fee
    ) external onlyOwner {
        buyFeeC1Enabled = _enableC1;
        buyC1Fee = _c1Fee;
        buyFeeC2Enabled = _enableC2;
        buyC2Fee = _c2Fee;
        buyFeeC3Enabled = _enableC3;
        buyC3Fee = _c3Fee;
        buyFeeC4Enabled = _enableC4;
        buyC4Fee = _c4Fee;
        buyFeeC5Enabled = _enableC5;
        buyC5Fee = _c5Fee;

        buyTotalFees = _c1Fee + _c2Fee + _c3Fee + _c4Fee + _c5Fee;
        require(buyTotalFees <= 30, "Must keep fees at 30% or less");
        emit FeesUpdated();
    }
 
    function updateSellFees(
        bool _enableC1,
        uint256 _c1Fee,
        bool _enableC2,
        uint256 _c2Fee,
        bool _enableC3,
        uint256 _c3Fee,
        bool _enableC4,
        uint256 _c4Fee,
        bool _enableC5,
        uint256 _c5Fee
    ) external onlyOwner {
        sellFeeC1Enabled = _enableC1;
        sellC1Fee = _c1Fee;
        sellFeeC2Enabled = _enableC2;
        sellC2Fee = _c2Fee;
        sellFeeC3Enabled = _enableC3;
        sellC3Fee = _c3Fee;
        sellFeeC4Enabled = _enableC4;
        sellC4Fee = _c4Fee;
        sellFeeC5Enabled = _enableC5;
        sellC5Fee = _c5Fee;

        sellTotalFees = _c1Fee + _c2Fee + _c3Fee + _c4Fee + _c5Fee;
        require(sellTotalFees <= 30, "Must keep fees at 30% or less");
        emit FeesUpdated();
    }

    function snapshot() public onlyOwner {
        _snapshot();
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal override(ERC20, ERC20Snapshot) {
        super._beforeTokenTransfer(from, to, amount);
    }

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

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

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "_transfer: transfer from the zero address");
        require(to != address(0), "_transfer: transfer to the zero address");
        require(!_blacklist[from], "_transfer: Sender is blacklisted");
        require(!_blacklist[to], "_transfer: Recipient is blacklisted");

         if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }
 
        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ) {
                if (!swapEnabled) {
                    require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
                }
 
                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
                if (transferDelayEnabled){
                    if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)) {
                        require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer: Transfer Delay enabled.  Only one purchase per block allowed.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }
 
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                        require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
 
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                        require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if(!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
            }
        }
 
        // anti bot logic
        if (block.number <= (launchedAt + 1) && 
            to != uniswapV2Pair && 
            to != address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D)
        ) {
            _blacklist[to] = true;
            emit BoughtEarly(to);
        }
 
        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            swapEnabled && // True
            canSwap && // true
            !swapping && // swapping=false !false true
            !automatedMarketMakerPairs[from] && // no swap on remove liquidity step 1 or DEX buy
            from != address(uniswapV2Router) && // no swap on remove liquidity step 2
            from != owner() &&
            to != owner()
        ) {
            swapping = true;

            _executeSwap(contractTokenBalance, address(this).balance);

            lastSwapTime = block.timestamp;
            swapping = false;
        }

        bool takeFee;

        if (
            from == address(uniswapV2Pair) ||
            to == address(uniswapV2Pair) ||
            automatedMarketMakerPairs[to] ||
            automatedMarketMakerPairs[from] ||
            transferTaxEnabled
        ) {
            takeFee = true;
        }

        if (_isExcludedFromFees[from] || _isExcludedFromFees[to] || swapping || isCompounding || !taxEnabled) {
            takeFee = false;
        }

        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            uint256 fees;
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = (amount * sellTotalFees) / 10000;
                if (sellFeeC1Enabled) {
                    tokensForC1 += fees * sellC1Fee / sellTotalFees;
                }
                if (sellFeeC2Enabled) {
                    tokensForC2 += fees * sellC2Fee / sellTotalFees;
                }
                if (sellFeeC3Enabled) {
                    tokensForC3 += fees * sellC3Fee / sellTotalFees;
                }
                if (sellFeeC4Enabled) {
                    tokensForC4 += fees * sellC4Fee / sellTotalFees;
                }
                if (sellFeeC5Enabled) {
                    tokensForC5 += fees * sellC5Fee / sellTotalFees;
                }
            // on buy
            } else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = (amount * buyTotalFees) / 10000;

                if (buyFeeC1Enabled) {
                    tokensForC1 += fees * buyC1Fee / buyTotalFees;
                }
                if (buyFeeC2Enabled) {
                    tokensForC2 += fees * buyC1Fee / buyTotalFees;
                }
                if (buyFeeC3Enabled) {
                    tokensForC3 += fees * buyC1Fee / buyTotalFees;
                }
                if (buyFeeC4Enabled) {
                    tokensForC4 += fees * buyC1Fee / buyTotalFees;
                }
                if (buyFeeC5Enabled) {
                    tokensForC5 += fees * buyC1Fee / buyTotalFees;
                }
            }
 
            amount -= fees;
            if (fees > 0){    
                super._transfer(from, address(this), fees);
            }
        }
 
        super._transfer(from, to, amount);

        rewardTracker.setBalance(payable(from), balanceOf(from));
        rewardTracker.setBalance(payable(to), balanceOf(to));
    }

    function _executeSwap(uint256 tokens, uint256 native) private {
        if (tokens <= 0) {
            return;
        }

        uint256 swapTokensTotal;
        // channel 1 (treasury)
        // just send to the c1 address
        uint256 swapTokensC1;
        if (address(c1Wallet) != address(0)) {
            swapTokensC1 = tokensForC1;
            swapTokensTotal += swapTokensC1;
        }

        // channel 2 (burning)
        // if c2 burn enabled, burn the tokens
        // otherwise just send to the c2 wallet
        uint256 swapTokensC2;
        if (address(c2Wallet) != address(0)) {
            if (c2BurningEnabled) {
                // burn them now, don't add to the swap amount
                _burn(address(this), tokensForC2);
                emit TokensBurned(tokensForC2);
            } else {
                swapTokensC2 = tokensForC2;
                swapTokensTotal += swapTokensC2;
            }
        }

        // channel 3 (rewards)
        // if c3 rewards enabled, send to rewards wallet
        // otherwise just send to the c3 address
        uint256 swapTokensC3;
        if (address(c3Wallet) != address(0)) {
            if (c3RewardsEnabled) {
                // just send the tokens now
                (bool success, ) = address(rewardTracker).call{
                    value: tokensForC3
                }("");
                if (success) {
                    emit SendChannel3(swapTokensC3, swapTokensC3);
                } else {
                    emit LogErrorString("Tracker failed to receive tokens");
                }
                super._transfer(address(this), c3Wallet, tokensForC3);
            } else {
                swapTokensC3 = tokensForC3;
                swapTokensTotal += swapTokensC3;
            }
        }

        // channel 4 (staking rewards)
        // just send to the c4 address
        uint256 swapTokensC4;
        if (address(c4Wallet) != address(0)) {
            swapTokensC4 = tokensForC4;
            swapTokensTotal += swapTokensC4;
        }

        // channel 5 (operations funds)
        // just send to the c5 address
        uint256 swapTokensC5;
        if (address(c5Wallet) != address(0)) {
            swapTokensC5 = tokensForC5;
            swapTokensTotal += swapTokensC5;
        }

        
        uint256 initNativeBal = address(this).balance;
        swapTokensForNative(swapTokensTotal);
        uint256 nativeSwapped = (address(this).balance - initNativeBal) + native;

        // reset the saved channel amounts
        tokensForC1 = 0;
        tokensForC2 = 0;
        tokensForC3 = 0;
        tokensForC4 = 0;
        tokensForC5 = 0;

        // set the eth conversion amounts
        uint256 nativeForC1 = (nativeSwapped * swapTokensC1) / swapTokensTotal;
        uint256 nativeForC2 = (nativeSwapped * swapTokensC2) / swapTokensTotal;
        uint256 nativeForC3 = (nativeSwapped * swapTokensC3) / swapTokensTotal;
        uint256 nativeForC4 = (nativeSwapped * swapTokensC4) / swapTokensTotal;
        uint256 nativeForC5 = (nativeSwapped * swapTokensC5) / swapTokensTotal;

        if (nativeForC1 > 0) {
            (bool success, ) = payable(c1Wallet).call{
                value: nativeForC1
            }("");
            if (success) {
                emit SendChannel1(swapTokensC1, nativeForC1);
            } else {
                emit LogErrorString("Wallet failed to receive channel 1 tokens");
            }
        }
        if (nativeForC2 > 0 && !c2BurningEnabled) {
            (bool success, ) = payable(c2Wallet).call{
                value: nativeForC2
            }("");
            if (success) {
                emit SendChannel2(swapTokensC2, nativeForC2);
            } else {
                emit LogErrorString("Wallet failed to receive channel 2 tokens");
            }
        }
        if (nativeForC3 > 0 && !c3RewardsEnabled) {
            (bool success, ) = payable(c3Wallet).call{
                value: nativeForC3
            }("");
            if (success) {
                emit SendChannel3(swapTokensC3, nativeForC3);
            } else {
                emit LogErrorString("Wallet failed to receive channel 3 tokens");
            }
        }
        if (nativeForC4 > 0) {
            (bool success, ) = payable(c4Wallet).call{
                value: nativeForC4
            }("");
            if (success) {
                emit SendChannel4(swapTokensC4, nativeForC4);
            } else {
                emit LogErrorString("Wallet failed to receive channel 4 tokens");
            }
        }
        if (nativeForC5 > 0) {
            (bool success, ) = payable(c5Wallet).call{
                value: nativeForC5
            }("");
            if (success) {
                emit SendChannel5(swapTokensC5, nativeForC5);
            } else {
                emit LogErrorString("Wallet failed to receive channel 5 tokens");
            }
        }
    }

    // swap the tokens back to ETH
    function swapTokensForNative(uint256 tokens) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokens);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokens,
            0, // accept any amount of native
            path,
            address(this),
            block.timestamp
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"sniper","type":"address"}],"name":"BoughtEarly","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"C2BurningModified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"C3RewardsModified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ChangeSwapTokensAtAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":false,"internalType":"uint8","name":"idx","type":"uint8"}],"name":"ChannelWalletsModified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"CompoundingEnabled","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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromMaxWallet","type":"event"},{"anonymous":false,"inputs":[],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"LimitsReinstated","type":"event"},{"anonymous":false,"inputs":[],"name":"LimitsRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"LogErrorString","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MaxTxnUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MaxWalletUpdated","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":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendChannel1","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendChannel2","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendChannel3","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendChannel4","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendChannel5","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetRewardTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Snapshot","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TaxEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountBurned","type":"uint256"}],"name":"TokensBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TransferTaxEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"accumulativeRewardOf","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"balanceOfAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isBlacklisted","type":"bool"}],"name":"blacklistAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyC1Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyC2Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyC3Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyC4Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyC5Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeeC1Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeeC2Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeeC3Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeeC4Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeeC5Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"c1Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"c2BurningEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"c2Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"c3RewardsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"c3Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"c4Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"c5Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compoundingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getLastClaimTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSwapTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"modifyC2Burning","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"modifyC3Rewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"},{"internalType":"uint8","name":"idx","type":"uint8"}],"name":"modifyChannelWallet","outputs":[],"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":"reinstateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardTracker","outputs":[{"internalType":"contract IRewardTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellC1Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellC2Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellC3Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellC4Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellC5Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeeC1Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeeC2Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeeC3Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeeC4Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFeeC5Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setCompoundingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newTracker","type":"address"}],"name":"setRewardTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setTaxEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setTransferTaxEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForC1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForC2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForC3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForC4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForC5","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":"uint256","name":"snapshotId","type":"uint256"}],"name":"totalSupplyAt","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":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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"},{"inputs":[],"name":"transferTaxEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enableC1","type":"bool"},{"internalType":"uint256","name":"_c1Fee","type":"uint256"},{"internalType":"bool","name":"_enableC2","type":"bool"},{"internalType":"uint256","name":"_c2Fee","type":"uint256"},{"internalType":"bool","name":"_enableC3","type":"bool"},{"internalType":"uint256","name":"_c3Fee","type":"uint256"},{"internalType":"bool","name":"_enableC4","type":"bool"},{"internalType":"uint256","name":"_c4Fee","type":"uint256"},{"internalType":"bool","name":"_enableC5","type":"bool"},{"internalType":"uint256","name":"_c5Fee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enableC1","type":"bool"},{"internalType":"uint256","name":"_c1Fee","type":"uint256"},{"internalType":"bool","name":"_enableC2","type":"bool"},{"internalType":"uint256","name":"_c2Fee","type":"uint256"},{"internalType":"bool","name":"_enableC3","type":"bool"},{"internalType":"uint256","name":"_c3Fee","type":"uint256"},{"internalType":"bool","name":"_enableC4","type":"bool"},{"internalType":"uint256","name":"_c4Fee","type":"uint256"},{"internalType":"bool","name":"_enableC5","type":"bool"},{"internalType":"uint256","name":"_c5Fee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableRewardOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawnRewardOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101a06040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610140526018805467ffffffff0000ffff1916670100000100000101179055655af3107a4000601955670de0b6b3a7640000601b556801314fb37062980000601c55601e80546001600160601b0319166b01010101010101010101000117905560248054733e822d55e79ea9f53c744bd9179d89ddec0815566001600160a01b031991821617909155602580547316cc620dbbacc751dab85d7fc1164c62858d9b9f90831681179091556026805483168217905560278054831690911790556028805473f05e5aefecd9c370fbffff94c6c4614e6c165b7892169190911790556104b0602955610190602a8190556000602b5561012c602c819055602d81905560c8602e819055610514602f55603092909255606460315560328190556033556034553480156200015657600080fd5b5060405180604001604052806012815260200171416767726567617465642046696e616e636560701b81525080604051806040016040528060018152602001603160f81b81525060405180604001604052806012815260200171416767726567617465642046696e616e636560701b815250604051806040016040528060048152602001634147464960e01b8152508160039080519060200190620001fd929190620011b7565b50805162000213906004906020840190620011b7565b505050620002306200022a6200076960201b60201c565b6200076d565b815160209283012081519183019190912060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818801819052818301969096526060810194909452608080850193909352308483018190528151808603909301835260c0948501909152815191909501209052919091526101205250737a250d5630b4cf539739df2c5dacb4c659f2488d620002e2816001620007bf565b6001600160a01b038116610160526040513090737a250d5630b4cf539739df2c5dacb4c659f2488d90620003169062001242565b6001600160a01b03928316815291166020820152604001604051809103906000f0801580156200034a573d6000803e3d6000fd5b50600e80546001600160a01b0319166001600160a01b03929092169182179055604051632ad4cab760e01b81526004810182905260016024820152632ad4cab790604401600060405180830381600087803b158015620003a957600080fd5b505af1158015620003be573d6000803e3d6000fd5b5050600e54604051632ad4cab760e01b8152306004820152600160248201526001600160a01b039091169250632ad4cab79150604401600060405180830381600087803b1580156200040f57600080fd5b505af115801562000424573d6000803e3d6000fd5b5050600e546001600160a01b03169150632ad4cab790506200044e6009546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260016024820152604401600060405180830381600087803b1580156200049757600080fd5b505af1158015620004ac573d6000803e3d6000fd5b5050600e54604051632ad4cab760e01b81526001600160a01b038581166004830152600160248301529091169250632ad4cab79150604401600060405180830381600087803b158015620004ff57600080fd5b505af115801562000514573d6000803e3d6000fd5b50505050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000557573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200057d919062001267565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620005cb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005f1919062001267565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200063f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000665919062001267565b6001600160a01b031661018081905262000681906001620007bf565b61018051620006929060016200086e565b620006b1620006a96009546001600160a01b031690565b6001620008c2565b620006be306001620008c2565b620006cd61dead6001620008c2565b620006ec620006e46009546001600160a01b031690565b6001620007bf565b620006f9306001620007bf565b6200070861dead6001620007bf565b620007276200071f6009546001600160a01b031690565b600162000966565b6200073430600162000966565b600e546200074d906001600160a01b0316600162000966565b6200076233683635c9adc5dea0000062000a0d565b506200132f565b3390565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6009546001600160a01b031633146200080e5760405162461bcd60e51b815260206004820181905260248201526000805160206200911883398151915260448201526064015b60405180910390fd5b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527fe0a7c1f8826ab3d62a6e242681ccca3828462e5c87816004b9f8d655b22d5f0891015b60405180910390a25050565b6001600160a01b038216600081815260176020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6009546001600160a01b031633146200090d5760405162461bcd60e51b8152602060048201819052602482015260008051602062009118833981519152604482015260640162000805565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910162000862565b6009546001600160a01b03163314620009b15760405162461bcd60e51b8152602060048201819052602482015260008051602062009118833981519152604482015260640162000805565b6001600160a01b038216600081815260146020908152604091829020805460ff191685151517905590519182527fc2a697a8536522338d97f8ab754f001d7b2092a2977baad0987080402a75a2ab910160405180910390a15050565b62000a24828262000a2860201b62002d5b1760201c565b5050565b62000a3f828262000adb60201b62002deb1760201c565b6001600160e01b0362000a5362000bd88216565b111562000abc5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b606482015260840162000805565b62000ad5600d62002ede62000bde60201b178362000bf3565b50505050565b6001600160a01b03821662000b335760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000805565b62000b416000838362000da5565b806002600082825462000b559190620012a8565b90915550506001600160a01b0382166000908152602081905260408120805483929062000b84908490620012a8565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a362000a246000838362000dc2565b60025490565b600062000bec8284620012a8565b9392505050565b82546000908190801562000c45578562000c0f600183620012c3565b8154811062000c225762000c22620012dd565b60009182526020909120015464010000000090046001600160e01b031662000c48565b60005b6001600160e01b0316925062000c5f83858760201c565b915060008111801562000ca35750438662000c7c600184620012c3565b8154811062000c8f5762000c8f620012dd565b60009182526020909120015463ffffffff16145b1562000d175762000cbf8262000dda60201b62002eea1760201c565b8662000ccd600184620012c3565b8154811062000ce05762000ce0620012dd565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b0316021790555062000d9c565b85604051806040016040528062000d394362000e4960201b62002f571760201c565b63ffffffff16815260200162000d5a8562000dda60201b62002eea1760201c565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b62000dbd83838362000eb060201b62002fbc1760201c565b505050565b62000dbd83838362000f1c60201b620030091760201c565b60006001600160e01b0382111562000e455760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b606482015260840162000805565b5090565b600063ffffffff82111562000e455760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b606482015260840162000805565b62000ec883838362000dbd60201b62002fdb1760201c565b6001600160a01b03831662000eec5762000ee28262000f68565b62000dbd62000fa0565b6001600160a01b03821662000f065762000ee28362000f68565b62000f118362000f68565b62000dbd8262000f68565b62000f3483838362000dbd60201b62002fdb1760201c565b6001600160a01b038381166000908152600b602052604080822054858416835291205462000dbd9291821691168362000fb2565b6001600160a01b0381166000908152600560209081526040808320918390529091205462000f9d9190620010ed565b620010ed565b50565b62000fb0600662000f9760025490565b565b816001600160a01b0316836001600160a01b03161415801562000fd55750600081115b1562000dbd576001600160a01b0383161562001062576001600160a01b0383166000908152600c60209081526040822082916200101f91906200113c901b6200303b178562000bf3565b91509150846001600160a01b031660008051602062009138833981519152838360405162001057929190918252602082015260400190565b60405180910390a250505b6001600160a01b0382161562000dbd576001600160a01b0382166000908152600c6020908152604082208291620010a6919062000bde901b62002ede178562000bf3565b91509150836001600160a01b0316600080516020620091388339815191528383604051620010de929190918252602082015260400190565b60405180910390a25050505050565b6000620010f96200114a565b905080620011078462001168565b101562000dbd578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b600062000bec8284620012c3565b6000620011636008620011b360201b620030471760201c565b905090565b805460009081036200117c57506000919050565b815482906200118e90600190620012c3565b81548110620011a157620011a1620012dd565b90600052602060002001549050919050565b5490565b828054620011c590620012f3565b90600052602060002090601f016020900481019282620011e9576000855562001234565b82601f106200120457805160ff191683800117855562001234565b8280016001018555821562001234579182015b828111156200123457825182559160200191906001019062001217565b5062000e4592915062001250565b611dc9806200734f83390190565b5b8082111562000e45576000815560010162001251565b6000602082840312156200127a57600080fd5b81516001600160a01b038116811462000bec57600080fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115620012be57620012be62001292565b500190565b600082821015620012d857620012d862001292565b500390565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200130857607f821691505b6020821081036200132957634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051610140516101605161018051615f69620013e660003960008181610adf01528181611e57015281816135350152818161387701528181613a300152613a6b01526000818161084d015281816134f70152818161399201528181615630015281816156e901526157250152600061255401526000614063015260006140b20152600061408d01526000613fe6015260006140100152600061403a0152615f696000f3fe6080604052600436106106a05760003560e01c8063760f54cc1161035f578063b62496f5116101d1578063dd62ed3e11610102578063f1127ed8116100a0578063f69e20461161007a578063f69e204614611422578063f8b45b0514611437578063f8d3d2c11461144d578063fc8783b41461146357600080fd5b8063f1127ed814611398578063f2293bb0146113e2578063f2fde38b1461140257600080fd5b8063e3f1149c116100dc578063e3f1149c14611323578063e4956ce214611343578063e884f26014611363578063eaf37db31461137857600080fd5b8063dd62ed3e146112a7578063e01af92c146112ed578063e2f456051461130d57600080fd5b8063c91ea1511161016f578063d505accf11610149578063d505accf1461123b578063d5fdb5a81461125b578063d7a7b1bc1461127b578063d85ba0631461129157600080fd5b8063c91ea151146111e4578063d1232015146111fa578063d2fcc0011461121b57600080fd5b8063c3cda520116101ab578063c3cda5201461116f578063c6af580b1461118f578063c876d0b9146111af578063c8c8ebe4146111ce57600080fd5b8063b62496f5146110ff578063c02466681461112f578063c18bc1951461114f57600080fd5b80638e72697e116102ab578063a2bfb7a211610249578063a88d178f11610223578063a88d178f1461107f578063a9059cbb1461109f578063ad76d686146110bf578063afa4f3b2146110df57600080fd5b8063a2bfb7a21461101f578063a457c2d71461103f578063a680e0bc1461105f57600080fd5b80639711715a116102855780639711715a14610faa578063981b24d014610fbf5780639a7a23d614610fdf5780639ab24eb014610fff57600080fd5b80638e72697e14610f5f57806395d89b4114610f7457806396f9e9be14610f8957600080fd5b80637ecebe0011610318578063870bd30b116102f2578063870bd30b14610eeb5780638a8c523c14610f0c5780638da5cb5b14610f215780638e539e8c14610f3f57600080fd5b80637ecebe0014610e9f57806383f7bf8c14610ebf57806385c366f414610ed557600080fd5b8063760f54cc14610dcb57806376ac933014610de157806377d3eaad14610e0157806379cc679014610e175780637b510fe814610e375780637ca8664714610e8957600080fd5b80633950935111610513578063587cde1e116104445780636ddd1713116103e257806370a08231116103bc57806370a0823114610d61578063715018a614610d81578063751039fc14610d965780637571336a14610dab57600080fd5b80636ddd171314610cf55780636fc7e2cd14610d165780636fcfff4514610d2c57600080fd5b80636a486a8e1161041e5780636a486a8e14610c705780636bcb411a14610c865780636c49697f14610ca65780636dd3d39f14610cbc57600080fd5b8063587cde1e14610c0157806359463e0214610c3a5780635c19a95c14610c5057600080fd5b80634d9051ef116104b15780634eeb42621161048b5780634eeb426214610b715780634fbee19314610b8757806352d9f17514610bc057806356981c2814610be157600080fd5b80634d9051ef14610b1b5780634e71d92d14610b3c5780634ee2cd7e14610b5157600080fd5b806343f4146b116104ed57806343f4146b14610a8c578063491ca9fb14610aac57806349bd5a5e14610acd5780634a62bb6514610b0157600080fd5b80633950935114610a2c5780633a46b1a814610a4c57806342966c6814610a6c57600080fd5b8063203e727e116105ed5780632e3fc9e21161058b57806332fa2df41161056557806332fa2df4146109bc578063363c4b29146109dc5780633644e515146109fd578063372c023514610a1257600080fd5b80632e3fc9e21461095e5780632f4504ae1461097f578063313ce567146109a057600080fd5b8063248f2048116105c7578063248f2048146108e65780632814d5d2146109075780632b54bebc146109285780632d5a5d341461093e57600080fd5b8063203e727e1461088457806323b872dd146108a6578063248cc4a3146108c657600080fd5b80630c70754e1161065a57806310d5de531161063457806310d5de53146107d3578063159241d5146108035780631694505e1461083b57806318160ddd1461086f57600080fd5b80630c70754e146107875780630dd87157146107a75780630f4507c1146107bd57600080fd5b806207dfb7146106ac578063010765ee146106e257806305b3ccb41461070157806306fdde031461072f578063095ea7b3146107515780630c4bcbd11461077157600080fd5b366106a757005b600080fd5b3480156106b857600080fd5b50601e546106cd90600160281b900460ff1681565b60405190151581526020015b60405180910390f35b3480156106ee57600080fd5b50601e546106cd90610100900460ff1681565b34801561070d57600080fd5b5061072161071c366004615959565b611483565b6040519081526020016106d9565b34801561073b57600080fd5b506107446114f9565b6040516106d99190615976565b34801561075d57600080fd5b506106cd61076c3660046159cb565b61158b565b34801561077d57600080fd5b5061072160225481565b34801561079357600080fd5b506107216107a2366004615959565b6115a3565b3480156107b357600080fd5b50610721601a5481565b3480156107c957600080fd5b5061072160345481565b3480156107df57600080fd5b506106cd6107ee366004615959565b60136020526000908152604090205460ff1681565b34801561080f57600080fd5b50602454610823906001600160a01b031681565b6040516001600160a01b0390911681526020016106d9565b34801561084757600080fd5b506108237f000000000000000000000000000000000000000000000000000000000000000081565b34801561087b57600080fd5b50600254610721565b34801561089057600080fd5b506108a461089f3660046159f7565b6115d6565b005b3480156108b257600080fd5b506106cd6108c1366004615a10565b611651565b3480156108d257600080fd5b50602854610823906001600160a01b031681565b3480156108f257600080fd5b50601e546106cd90600160481b900460ff1681565b34801561091357600080fd5b50601e546106cd90600160201b900460ff1681565b34801561093457600080fd5b50610721602a5481565b34801561094a57600080fd5b506108a4610959366004615a5f565b611675565b34801561096a57600080fd5b50601e546106cd90600160581b900460ff1681565b34801561098b57600080fd5b506018546106cd90600160381b900460ff1681565b3480156109ac57600080fd5b50604051600981526020016106d9565b3480156109c857600080fd5b506108a46109d7366004615a98565b6116ca565b3480156109e857600080fd5b50601e546106cd90600160301b900460ff1681565b348015610a0957600080fd5b50610721611743565b348015610a1e57600080fd5b50601e546106cd9060ff1681565b348015610a3857600080fd5b506106cd610a473660046159cb565b611752565b348015610a5857600080fd5b50610721610a673660046159cb565b611791565b348015610a7857600080fd5b506108a4610a873660046159f7565b61180b565b348015610a9857600080fd5b50602554610823906001600160a01b031681565b348015610ab857600080fd5b50601e546106cd90600160501b900460ff1681565b348015610ad957600080fd5b506108237f000000000000000000000000000000000000000000000000000000000000000081565b348015610b0d57600080fd5b506018546106cd9060ff1681565b348015610b2757600080fd5b50601e546106cd90600160381b900460ff1681565b348015610b4857600080fd5b506108a4611818565b348015610b5d57600080fd5b50610721610b6c3660046159cb565b611894565b348015610b7d57600080fd5b5061072160305481565b348015610b9357600080fd5b506106cd610ba2366004615959565b6001600160a01b031660009081526012602052604090205460ff1690565b348015610bcc57600080fd5b50601e546106cd906301000000900460ff1681565b348015610bed57600080fd5b506108a4610bfc366004615ac6565b6118dd565b348015610c0d57600080fd5b50610823610c1c366004615959565b6001600160a01b039081166000908152600b60205260409020541690565b348015610c4657600080fd5b50610721602b5481565b348015610c5c57600080fd5b506108a4610c6b366004615959565b611a9c565b348015610c7c57600080fd5b50610721602f5481565b348015610c9257600080fd5b50600e54610823906001600160a01b031681565b348015610cb257600080fd5b5061072160335481565b348015610cc857600080fd5b506106cd610cd7366004615959565b6001600160a01b031660009081526014602052604090205460ff1690565b348015610d0157600080fd5b506018546106cd90600160301b900460ff1681565b348015610d2257600080fd5b5061072160325481565b348015610d3857600080fd5b50610d4c610d47366004615959565b611aa6565b60405163ffffffff90911681526020016106d9565b348015610d6d57600080fd5b50610721610d7c366004615959565b611ac8565b348015610d8d57600080fd5b506108a4611ae3565b348015610da257600080fd5b506108a4611b19565b348015610db757600080fd5b506108a4610dc6366004615a5f565b611b78565b348015610dd757600080fd5b5061072160205481565b348015610ded57600080fd5b50602754610823906001600160a01b031681565b348015610e0d57600080fd5b5061072160215481565b348015610e2357600080fd5b506108a4610e323660046159cb565b611bfa565b348015610e4357600080fd5b50610e57610e52366004615959565b611c13565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a0016106d9565b348015610e9557600080fd5b50610721602c5481565b348015610eab57600080fd5b50610721610eba366004615959565b611c9d565b348015610ecb57600080fd5b50610721601f5481565b348015610ee157600080fd5b5061072160235481565b348015610ef757600080fd5b506018546106cd90600160201b900460ff1681565b348015610f1857600080fd5b506108a4611cbb565b348015610f2d57600080fd5b506009546001600160a01b0316610823565b348015610f4b57600080fd5b50610721610f5a3660046159f7565b611d01565b348015610f6b57600080fd5b506108a4611d5d565b348015610f8057600080fd5b50610744611dbf565b348015610f9557600080fd5b506018546106cd90600160281b900460ff1681565b348015610fb657600080fd5b506108a4611dce565b348015610fcb57600080fd5b50610721610fda3660046159f7565b611e00565b348015610feb57600080fd5b506108a4610ffa366004615a5f565b611e2b565b34801561100b57600080fd5b5061072161101a366004615959565b611f06565b34801561102b57600080fd5b506108a461103a366004615a98565b611f8c565b34801561104b57600080fd5b506106cd61105a3660046159cb565b612003565b34801561106b57600080fd5b5061072161107a366004615959565b612095565b34801561108b57600080fd5b506108a461109a366004615a98565b6120c8565b3480156110ab57600080fd5b506106cd6110ba3660046159cb565b61213f565b3480156110cb57600080fd5b506107216110da366004615959565b61214d565b3480156110eb57600080fd5b506108a46110fa3660046159f7565b612180565b34801561110b57600080fd5b506106cd61111a366004615959565b60176020526000908152604090205460ff1681565b34801561113b57600080fd5b506108a461114a366004615a5f565b6121df565b34801561115b57600080fd5b506108a461116a3660046159f7565b612261565b34801561117b57600080fd5b506108a461118a366004615afb565b6122cc565b34801561119b57600080fd5b506108a46111aa366004615a98565b612402565b3480156111bb57600080fd5b506018546106cd90610100900460ff1681565b3480156111da57600080fd5b50610721601b5481565b3480156111f057600080fd5b50610721602e5481565b34801561120657600080fd5b50601e546106cd90600160401b900460ff1681565b34801561122757600080fd5b506108a4611236366004615a5f565b61247a565b34801561124757600080fd5b506108a4611256366004615b55565b612500565b34801561126757600080fd5b506108a4611276366004615bc3565b612664565b34801561128757600080fd5b5061072160315481565b34801561129d57600080fd5b5061072160295481565b3480156112b357600080fd5b506107216112c2366004615c66565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156112f957600080fd5b506108a4611308366004615a98565b6127ea565b34801561131957600080fd5b5061072160195481565b34801561132f57600080fd5b506108a461133e366004615bc3565b612864565b34801561134f57600080fd5b506108a461135e366004615a98565b6129b5565b34801561136f57600080fd5b506106cd612a30565b34801561138457600080fd5b50602654610823906001600160a01b031681565b3480156113a457600080fd5b506113b86113b3366004615c94565b612a6e565b60408051825163ffffffff1681526020928301516001600160e01b031692810192909252016106d9565b3480156113ee57600080fd5b506108a46113fd366004615959565b612af1565b34801561140e57600080fd5b506108a461141d366004615959565b612bc5565b34801561142e57600080fd5b506108a4612c5d565b34801561144357600080fd5b50610721601c5481565b34801561145957600080fd5b50610721602d5481565b34801561146f57600080fd5b50601e546106cd9062010000900460ff1681565b600e5460405163016cf32d60e21b81526001600160a01b03838116600483015260009216906305b3ccb4906024015b602060405180830381865afa1580156114cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f39190615ccb565b92915050565b60606003805461150890615ce4565b80601f016020809104026020016040519081016040528092919081815260200182805461153490615ce4565b80156115815780601f1061155657610100808354040283529160200191611581565b820191906000526020600020905b81548152906001019060200180831161156457829003601f168201915b5050505050905090565b60003361159981858561304b565b5060019392505050565b600e546040516306383aa760e11b81526001600160a01b0383811660048301526000921690630c70754e906024016114b2565b6009546001600160a01b031633146116095760405162461bcd60e51b815260040161160090615d18565b60405180910390fd5b61161781633b9aca00615d63565b601b556040518181527fe5b4bfc380c3a1aee22ea479849c75117cc58c467670fd4c6427016d3998f2e0906020015b60405180910390a150565b60003361165f85828561316f565b61166a8585856131fb565b506001949350505050565b6009546001600160a01b0316331461169f5760405162461bcd60e51b815260040161160090615d18565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6009546001600160a01b031633146116f45760405162461bcd60e51b815260040161160090615d18565b60188054821515600160281b0265ff0000000000199091161790556040517fc7d978b78e876fea3ff1cb54617b34636eafef663e201877549e8644ae29495f9061164690831515815260200190565b600061174d613fd9565b905090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190611599908290869061178c908790615d82565b61304b565b60004382106117e25760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401611600565b6001600160a01b0383166000908152600c602052604090206118049083614100565b9392505050565b61181533826141bc565b50565b600e546001600160a01b031663807ab4f7336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af1158015611870573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118159190615d9a565b6001600160a01b0382166000908152600560205260408120819081906118bb9085906141c6565b91509150816118d2576118cd85611ac8565b6118d4565b805b95945050505050565b6009546001600160a01b031633146119075760405162461bcd60e51b815260040161160090615d18565b6001600160a01b0382166119835760405162461bcd60e51b815260206004820152603860248201527f6d6f646966794368616e6e656c57616c6c65743a206e6577416464726573732060448201527f63616e206e6f74206265207a65726f20616464726573732e00000000000000006064820152608401611600565b8060ff166001036119ae57602480546001600160a01b0319166001600160a01b038416179055611a56565b8060ff166002036119d957602580546001600160a01b0319166001600160a01b038416179055611a56565b8060ff16600303611a0457602680546001600160a01b0319166001600160a01b038416179055611a56565b8060ff16600403611a2f57602780546001600160a01b0319166001600160a01b038416179055611a56565b8060ff16600503611a5657602880546001600160a01b0319166001600160a01b0384161790555b60405160ff821681526001600160a01b038316907f44b4b43f7790513a495050ad13d875e38a4e8b7f68d8040dc33384d1f104ce11906020015b60405180910390a25050565b61181533826142bc565b6001600160a01b0381166000908152600c60205260408120546114f390612f57565b6001600160a01b031660009081526020819052604090205490565b6009546001600160a01b03163314611b0d5760405162461bcd60e51b815260040161160090615d18565b611b17600061434b565b565b6009546001600160a01b03163314611b435760405162461bcd60e51b815260040161160090615d18565b6018805460ff191690556040517f7bfa7bacf025baa75e5308bf15bcf2948f406c7ebe3eb1a8bb611862b9d647ef90600090a1565b6009546001600160a01b03163314611ba25760405162461bcd60e51b815260040161160090615d18565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527fe0a7c1f8826ab3d62a6e242681ccca3828462e5c87816004b9f8d655b22d5f089101611a90565b611c0582338361316f565b611c0f82826141bc565b5050565b600e54604051630f6a21fd60e31b81526001600160a01b0383811660048301526000928392839283928392911690637b510fe89060240160a060405180830381865afa158015611c67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8b9190615db7565b939a9299509097509550909350915050565b6001600160a01b0381166000908152600a60205260408120546114f3565b6009546001600160a01b03163314611ce55760405162461bcd60e51b815260040161160090615d18565b6018805466ff0000000000001916600160301b17905543601d55565b6000438210611d525760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401611600565b6114f3600d83614100565b6009546001600160a01b03163314611d875760405162461bcd60e51b815260040161160090615d18565b6018805460ff191660011790556040517fecd28d2c242feaa9f2efc5f2be891506d477b6836d1b969ccd5aa735fd5b38b190600090a1565b60606004805461150890615ce4565b6009546001600160a01b03163314611df85760405162461bcd60e51b815260040161160090615d18565b61181561439d565b6000806000611e108460066141c6565b9150915081611e2157600254611e23565b805b949350505050565b6009546001600160a01b03163314611e555760405162461bcd60e51b815260040161160090615d18565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611efc5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401611600565b611c0f82826143f7565b6001600160a01b0381166000908152600c60205260408120548015611f79576001600160a01b0383166000908152600c60205260409020611f48600183615e00565b81548110611f5857611f58615e17565b600091825260209091200154600160201b90046001600160e01b0316611f7c565b60005b6001600160e01b03169392505050565b6009546001600160a01b03163314611fb65760405162461bcd60e51b815260040161160090615d18565b601e8054821515600160581b0260ff60581b199091161790556040517f83283493c4a2ebc90693caf32194d32af62a993bb93a63c84ff55e325e4e97ee9061164690831515815260200190565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156120885760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401611600565b61166a828686840361304b565b600e546040516329a0382f60e21b81526001600160a01b038381166004830152600092169063a680e0bc906024016114b2565b6009546001600160a01b031633146120f25760405162461bcd60e51b815260040161160090615d18565b601e8054821515600160501b0260ff60501b199091161790556040517fd00f811311c98e2690397eeab86ca3288488a82a6c28c3ad8008c028ec4ed1b89061164690831515815260200190565b6000336115998185856131fb565b600e546040516356bb6b4360e11b81526001600160a01b038381166004830152600092169063ad76d686906024016114b2565b6009546001600160a01b031633146121aa5760405162461bcd60e51b815260040161160090615d18565b60198190556040518181527f6f3ccad01a6c8eda271113e7224718291fbf9c638c672466dff45d4340f8973e90602001611646565b6009546001600160a01b031633146122095760405162461bcd60e51b815260040161160090615d18565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101611a90565b6009546001600160a01b0316331461228b5760405162461bcd60e51b815260040161160090615d18565b61229981633b9aca00615d63565b601c556040518181527f12528a3c61e0f3b2d6fc707a9fc58b1af86e252cad0d7f4c154ebeabb162dace90602001611646565b8342111561231c5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401611600565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590526000906123969061238e9060a0016040516020818303038152906040528051906020012061444b565b858585614499565b90506123a1816144c1565b86146123ef5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401611600565b6123f981886142bc565b50505050505050565b6009546001600160a01b0316331461242c5760405162461bcd60e51b815260040161160090615d18565b60188054821515600160201b0264ff00000000199091161790556040517f5bb2376cf656637e70e36c01d3da25685bf3b353f18681b8a5e48c7b2effe1339061164690831515815260200190565b6009546001600160a01b031633146124a45760405162461bcd60e51b815260040161160090615d18565b6001600160a01b038216600081815260146020908152604091829020805460ff191685151517905590519182527fc2a697a8536522338d97f8ab754f001d7b2092a2977baad0987080402a75a2ab910160405180910390a15050565b834211156125505760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401611600565b60007f000000000000000000000000000000000000000000000000000000000000000088888861257f8c6144c1565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006125da8261444b565b905060006125ea82878787614499565b9050896001600160a01b0316816001600160a01b03161461264d5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401611600565b6126588a8a8a61304b565b50505050505050505050565b6009546001600160a01b0316331461268e5760405162461bcd60e51b815260040161160090615d18565b89601e60006101000a81548160ff02191690831515021790555088602a8190555087601e60016101000a81548160ff02191690831515021790555086602b8190555085601e60026101000a81548160ff02191690831515021790555084602c8190555083601e60036101000a81548160ff02191690831515021790555082602d8190555081601e60046101000a81548160ff02191690831515021790555080602e81905550808386898c6127429190615d82565b61274c9190615d82565b6127569190615d82565b6127609190615d82565b6029819055601e10156127b55760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333025206f72206c6573730000006044820152606401611600565b6040517f6d58c6dc772669fca481506571330f160785469830c3888c824e5ff2e81c47d790600090a150505050505050505050565b6009546001600160a01b031633146128145760405162461bcd60e51b815260040161160090615d18565b60188054821515600160301b0266ff000000000000199091161790556040517fb9bbb15e341600c8d067a0cadeba219905d5ba6d422b193c9c32265d26fc51c89061164690831515815260200190565b6009546001600160a01b0316331461288e5760405162461bcd60e51b815260040161160090615d18565b89601e60056101000a81548160ff0219169083151502179055508860308190555087601e60066101000a81548160ff0219169083151502179055508660318190555085601e60076101000a81548160ff0219169083151502179055508460328190555083601e60086101000a81548160ff0219169083151502179055508260338190555081601e60096101000a81548160ff02191690831515021790555080603481905550808386898c6129429190615d82565b61294c9190615d82565b6129569190615d82565b6129609190615d82565b602f819055601e10156127b55760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333025206f72206c6573730000006044820152606401611600565b6009546001600160a01b031633146129df5760405162461bcd60e51b815260040161160090615d18565b60188054821515600160381b0267ff00000000000000199091161790556040517f341322866a3a2c26c27efa4c270c5ba86f6963257118897dd8196f224c002d439061164690831515815260200190565b6009546000906001600160a01b03163314612a5d5760405162461bcd60e51b815260040161160090615d18565b506018805461ff0019169055600190565b60408051808201909152600080825260208201526001600160a01b0383166000908152600c60205260409020805463ffffffff8416908110612ab257612ab2615e17565b60009182526020918290206040805180820190915291015463ffffffff81168252600160201b90046001600160e01b0316918101919091529392505050565b6009546001600160a01b03163314612b1b5760405162461bcd60e51b815260040161160090615d18565b6001600160a01b038116612b7b5760405162461bcd60e51b815260206004820152602160248201527f6e6577547261636b65722063616e6e6f74206265207a65726f206164647265736044820152607360f81b6064820152608401611600565b600e80546001600160a01b0319166001600160a01b0383169081179091556040517f27d252e570592a130198f8a8e4fb0c66776ddd3c44cbff2e13059b63d8421a9390600090a250565b6009546001600160a01b03163314612bef5760405162461bcd60e51b815260040161160090615d18565b6001600160a01b038116612c545760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611600565b6118158161434b565b601854600160381b900460ff16612cb65760405162461bcd60e51b815260206004820181905260248201527f414746493a20636f6d706f756e64696e67206973206e6f7420656e61626c65646044820152606401611600565b6018805463ff00000019166301000000179055600e546001600160a01b0316636de1a5a9612ce13390565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af1158015612d27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d4b9190615d9a565b506018805463ff00000019169055565b612d658282612deb565b6002546001600160e01b031015612dd75760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401611600565b612de5600d612ede836144e9565b50505050565b6001600160a01b038216612e415760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401611600565b612e4d60008383614660565b8060026000828254612e5f9190615d82565b90915550506001600160a01b03821660009081526020819052604081208054839290612e8c908490615d82565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3611c0f6000838361466b565b60006118048284615d82565b60006001600160e01b03821115612f535760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401611600565b5090565b600063ffffffff821115612f535760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401611600565b6001600160a01b038316612fe057612fd382614676565b612fdb6146a0565b505050565b6001600160a01b038216612ff757612fd383614676565b61300083614676565b612fdb82614676565b6001600160a01b038381166000908152600b6020526040808220548584168352912054612fdb929182169116836146ae565b60006118048284615e00565b5490565b6001600160a01b0383166130ad5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611600565b6001600160a01b03821661310e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611600565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114612de557818110156131ee5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401611600565b612de5848484840361304b565b6001600160a01b0383166132635760405162461bcd60e51b815260206004820152602960248201527f5f7472616e736665723a207472616e736665722066726f6d20746865207a65726044820152686f206164647265737360b81b6064820152608401611600565b6001600160a01b0382166132c95760405162461bcd60e51b815260206004820152602760248201527f5f7472616e736665723a207472616e7366657220746f20746865207a65726f206044820152666164647265737360c81b6064820152608401611600565b6001600160a01b03831660009081526011602052604090205460ff16156133325760405162461bcd60e51b815260206004820181905260248201527f5f7472616e736665723a2053656e64657220697320626c61636b6c69737465646044820152606401611600565b6001600160a01b03821660009081526011602052604090205460ff16156133a75760405162461bcd60e51b815260206004820152602360248201527f5f7472616e736665723a20526563697069656e7420697320626c61636b6c69736044820152621d195960ea1b6064820152608401611600565b806000036133bb57612fdb838360006147eb565b60185460ff161561385d576009546001600160a01b038481169116148015906133f257506009546001600160a01b03838116911614155b801561340657506001600160a01b03821615155b801561341d57506001600160a01b03821661dead14155b8015613432575060185462010000900460ff16155b1561385d57601854600160301b900460ff166134cc576001600160a01b03831660009081526012602052604090205460ff168061348757506001600160a01b03821660009081526012602052604090205460ff165b6134cc5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401611600565b601854610100900460ff1615613617576009546001600160a01b0383811691161480159061352c57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b801561356a57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b15613617573260009081526015602052604090205443116136045760405162461bcd60e51b815260206004820152604860248201527f5f7472616e736665723a205472616e736665722044656c617920656e61626c6560448201527f642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b2060648201526730b63637bbb2b21760c11b608482015260a401611600565b3260009081526015602052604090204390555b6001600160a01b03831660009081526017602052604090205460ff16801561365857506001600160a01b03821660009081526013602052604090205460ff16155b1561372c57601b548111156136cd5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401611600565b601c546136d983611ac8565b6136e39083615d82565b11156137275760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401611600565b61385d565b6001600160a01b03821660009081526017602052604090205460ff16801561376d57506001600160a01b03831660009081526013602052604090205460ff16155b156137e357601b548111156137275760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401611600565b6001600160a01b03821660009081526013602052604090205460ff1661385d57601c5461380f83611ac8565b6138199083615d82565b111561385d5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401611600565b601d5461386b906001615d82565b43111580156138ac57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b80156138d557506001600160a01b038216737a250d5630b4cf539739df2c5dacb4c659f2488d14155b15613924576001600160a01b038216600081815260116020526040808220805460ff19166001179055517fb90badc1cf1c52268f4fa9afb5276aebf640bcca3300cdfc9cf37db17daa13e29190a25b600061392f30611ac8565b60195460185491925082101590600160301b900460ff16801561394f5750805b8015613964575060185462010000900460ff16155b801561398957506001600160a01b03851660009081526017602052604090205460ff16155b80156139c757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b80156139e157506009546001600160a01b03868116911614155b80156139fb57506009546001600160a01b03858116911614155b15613a2c576018805462ff0000191662010000179055613a1b82476149ca565b42601a556018805462ff0000191690555b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b03161480613a9f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316145b80613ac257506001600160a01b03851660009081526017602052604090205460ff165b80613ae557506001600160a01b03861660009081526017602052604090205460ff165b80613af95750601854600160281b900460ff165b15613b02575060015b6001600160a01b03861660009081526012602052604090205460ff1680613b4157506001600160a01b03851660009081526012602052604090205460ff165b80613b54575060185462010000900460ff165b80613b6857506018546301000000900460ff165b80613b7d5750601854600160201b900460ff16155b15613b86575060005b8015613ede576001600160a01b03851660009081526017602052604081205460ff168015613bb657506000602f54115b15613d2d57612710602f5486613bcc9190615d63565b613bd69190615e2d565b601e54909150600160281b900460ff1615613c1c57602f54603054613bfb9083615d63565b613c059190615e2d565b601f6000828254613c169190615d82565b90915550505b601e54600160301b900460ff1615613c5f57602f54603154613c3e9083615d63565b613c489190615e2d565b60206000828254613c599190615d82565b90915550505b601e54600160381b900460ff1615613ca257602f54603254613c819083615d63565b613c8b9190615e2d565b60216000828254613c9c9190615d82565b90915550505b601e54600160401b900460ff1615613ce557602f54603354613cc49083615d63565b613cce9190615e2d565b60226000828254613cdf9190615d82565b90915550505b601e54600160481b900460ff1615613d2857602f54603454613d079083615d63565b613d119190615e2d565b60236000828254613d229190615d82565b90915550505b613ebf565b6001600160a01b03871660009081526017602052604090205460ff168015613d5757506000602954115b15613ebf5761271060295486613d6d9190615d63565b613d779190615e2d565b601e5490915060ff1615613db657602954602a54613d959083615d63565b613d9f9190615e2d565b601f6000828254613db09190615d82565b90915550505b601e54610100900460ff1615613df757602954602a54613dd69083615d63565b613de09190615e2d565b60206000828254613df19190615d82565b90915550505b601e5462010000900460ff1615613e3957602954602a54613e189083615d63565b613e229190615e2d565b60216000828254613e339190615d82565b90915550505b601e546301000000900460ff1615613e7c57602954602a54613e5b9083615d63565b613e659190615e2d565b60226000828254613e769190615d82565b90915550505b601e54600160201b900460ff1615613ebf57602954602a54613e9e9083615d63565b613ea89190615e2d565b60236000828254613eb99190615d82565b90915550505b613ec98186615e00565b94508015613edc57613edc8730836147eb565b505b613ee98686866147eb565b600e546001600160a01b031663e30443bc87613f0481611ac8565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613f4a57600080fd5b505af1158015613f5e573d6000803e3d6000fd5b5050600e546001600160a01b0316915063e30443bc905086613f7f81611ac8565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613fc557600080fd5b505af1158015612658573d6000803e3d6000fd5b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561403257507f000000000000000000000000000000000000000000000000000000000000000046145b1561405c57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b8181101561416457600061411b82846151e9565b90508486828154811061413057614130615e17565b60009182526020909120015463ffffffff1611156141505780925061415e565b61415b816001615d82565b91505b50614107565b81156141a75784614176600184615e00565b8154811061418657614186615e17565b600091825260209091200154600160201b90046001600160e01b03166141aa565b60005b6001600160e01b031695945050505050565b611c0f8282615204565b600080600084116142125760405162461bcd60e51b815260206004820152601660248201527504552433230536e617073686f743a20696420697320360541b6044820152606401611600565b61421a61521c565b8411156142695760405162461bcd60e51b815260206004820152601d60248201527f4552433230536e617073686f743a206e6f6e6578697374656e742069640000006044820152606401611600565b60006142758486615227565b8454909150810361428d5760008092509250506142b5565b60018460010182815481106142a4576142a4615e17565b906000526020600020015492509250505b9250929050565b6001600160a01b038281166000908152600b6020526040812054909116906142e384611ac8565b6001600160a01b038581166000818152600b602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4612de58284836146ae565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006143ad600880546001019055565b60006143b761521c565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb67816040516143ea91815260200190565b60405180910390a1919050565b6001600160a01b038216600081815260176020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b60006114f3614458613fd9565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006144aa878787876152ec565b915091506144b7816153d9565b5095945050505050565b6001600160a01b0381166000908152600a602052604090208054600181018255905b50919050565b8254600090819080156145335785614502600183615e00565b8154811061451257614512615e17565b600091825260209091200154600160201b90046001600160e01b0316614536565b60005b6001600160e01b0316925061454f83858763ffffffff16565b915060008111801561458d57504386614569600184615e00565b8154811061457957614579615e17565b60009182526020909120015463ffffffff16145b156145ed5761459b82612eea565b866145a7600184615e00565b815481106145b7576145b7615e17565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b03160217905550614657565b85604051806040016040528061460243612f57565b63ffffffff16815260200161461685612eea565b6001600160e01b039081169091528254600181018455600093845260209384902083519490930151909116600160201b0263ffffffff909316929092179101555b50935093915050565b612fdb838383612fbc565b612fdb838383613009565b6001600160a01b03811660009081526005602052604090206118159061469b83611ac8565b61558f565b611b17600661469b60025490565b816001600160a01b0316836001600160a01b0316141580156146d05750600081115b15612fdb576001600160a01b0383161561475e576001600160a01b0383166000908152600c60205260408120819061470b9061303b856144e9565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051614753929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615612fdb576001600160a01b0382166000908152600c60205260408120819061479490612ede856144e9565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516147dc929190918252602082015260400190565b60405180910390a25050505050565b6001600160a01b03831661484f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401611600565b6001600160a01b0382166148b15760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401611600565b6148bc838383614660565b6001600160a01b038316600090815260208190526040902054818110156149345760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401611600565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061496b908490615d82565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516149b791815260200190565b60405180910390a3612de584848461466b565b600082116149d6575050565b60245460009081906001600160a01b0316156149fd5750601f546149fa8183615d82565b91505b6025546000906001600160a01b031615614a8057601e54600160501b900460ff1615614a6f57614a2f306020546141bc565b7f6ef4855b666dcc7884561072e4358b28dfe01feb1b7f4dcebc00e62d50394ac7602054604051614a6291815260200190565b60405180910390a1614a80565b50602054614a7d8184615d82565b92505b6026546000906001600160a01b031615614bca57601e54600160581b900460ff1615614bb957600e546021546040516000926001600160a01b031691908381818185875af1925050503d8060008114614af5576040519150601f19603f3d011682016040523d82523d6000602084013e614afa565b606091505b505090508015614b425760408051838152602081018490527f96070eb7bd2cf112ddb94f1a3d88b4aad96f9f1a97083af866c0bc17a0a91aff910160405180910390a1614b96565b600080516020615f14833981519152604051614b8d906020808252818101527f547261636b6572206661696c656420746f207265636569766520746f6b656e73604082015260600190565b60405180910390a15b602654602154614bb39130916001600160a01b03909116906147eb565b50614bca565b50602154614bc78185615d82565b93505b6027546000906001600160a01b031615614bef5750602254614bec8186615d82565b94505b6028546000906001600160a01b031615614c145750602354614c118187615d82565b95505b47614c1e876155d9565b600088614c2b8347615e00565b614c359190615d82565b6000601f819055602081905560218190556022819055602381905590915088614c5e8984615d63565b614c689190615e2d565b9050600089614c778985615d63565b614c819190615e2d565b905060008a614c908986615d63565b614c9a9190615e2d565b905060008b614ca98987615d63565b614cb39190615e2d565b905060008c614cc28988615d63565b614ccc9190615e2d565b90508415614dc6576024546040516000916001600160a01b03169087908381818185875af1925050503d8060008114614d21576040519150601f19603f3d011682016040523d82523d6000602084013e614d26565b606091505b505090508015614d6e57604080518e8152602081018890527f7318041d7e07afbd7fa76833c189e8b154eb2a0c7a4c43bebbaf8722bd1d553c910160405180910390a1614dc4565b600080516020615f14833981519152604051614dbb906020808252602990820152600080516020615ef4833981519152604082015268203120746f6b656e7360b81b606082015260800190565b60405180910390a15b505b600084118015614de05750601e54600160501b900460ff16155b15614ed7576025546040516000916001600160a01b03169086908381818185875af1925050503d8060008114614e32576040519150601f19603f3d011682016040523d82523d6000602084013e614e37565b606091505b505090508015614e7f57604080518d8152602081018790527fe0eabb774fbbfbb7ae11d5dc1b874b23769dd173501de5e5929554af4d12fbc0910160405180910390a1614ed5565b600080516020615f14833981519152604051614ecc906020808252602990820152600080516020615ef4833981519152604082015268203220746f6b656e7360b81b606082015260800190565b60405180910390a15b505b600083118015614ef15750601e54600160581b900460ff16155b15614fe8576026546040516000916001600160a01b03169085908381818185875af1925050503d8060008114614f43576040519150601f19603f3d011682016040523d82523d6000602084013e614f48565b606091505b505090508015614f9057604080518c8152602081018690527f96070eb7bd2cf112ddb94f1a3d88b4aad96f9f1a97083af866c0bc17a0a91aff910160405180910390a1614fe6565b600080516020615f14833981519152604051614fdd906020808252602990820152600080516020615ef4833981519152604082015268203320746f6b656e7360b81b606082015260800190565b60405180910390a15b505b81156150e0576027546040516000916001600160a01b03169084908381818185875af1925050503d806000811461503b576040519150601f19603f3d011682016040523d82523d6000602084013e615040565b606091505b50509050801561508857604080518b8152602081018590527f2c5d8716b48bd31229ddcc05f4a0fd9dd23a6d847c7e78f08a148b198f6f1a06910160405180910390a16150de565b600080516020615f148339815191526040516150d5906020808252602990820152600080516020615ef4833981519152604082015268203420746f6b656e7360b81b606082015260800190565b60405180910390a15b505b80156151d8576028546040516000916001600160a01b03169083908381818185875af1925050503d8060008114615133576040519150601f19603f3d011682016040523d82523d6000602084013e615138565b606091505b50509050801561518057604080518a8152602081018490527f7cee55fff8c2bd5183d732cce023a1cad3644c3e59fd1f12c815f525e893bceb910160405180910390a16151d6565b600080516020615f148339815191526040516151cd906020808252602990820152600080516020615ef4833981519152604082015268203520746f6b656e7360b81b606082015260800190565b60405180910390a15b505b505050505050505050505050505050565b60006151f86002848418615e2d565b61180490848416615d82565b61520e8282615799565b612de5600d61303b836144e9565b600061174d60085490565b8154600090810361523a575060006114f3565b82546000905b8082101561529657600061525483836151e9565b90508486828154811061526957615269615e17565b9060005260206000200154111561528257809150615290565b61528d816001615d82565b92505b50615240565b6000821180156152cb575083856152ae600185615e00565b815481106152be576152be615e17565b9060005260206000200154145b156152e4576152db600183615e00565b925050506114f3565b5090506114f3565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561532357506000905060036153d0565b8460ff16601b1415801561533b57508460ff16601c14155b1561534c57506000905060046153d0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156153a0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166153c9576000600192509250506153d0565b9150600090505b94509492505050565b60008160048111156153ed576153ed615e4f565b036153f55750565b600181600481111561540957615409615e4f565b036154565760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401611600565b600281600481111561546a5761546a615e4f565b036154b75760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401611600565b60038160048111156154cb576154cb615e4f565b036155235760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401611600565b600481600481111561553757615537615e4f565b036118155760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401611600565b600061559961521c565b9050806155a5846158fa565b1015612fdb578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061560e5761560e615e17565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561568c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906156b09190615e65565b816001815181106156c3576156c3615e17565b60200260200101906001600160a01b031690816001600160a01b03168152505061570e307f00000000000000000000000000000000000000000000000000000000000000008461304b565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790615763908590600090869030904290600401615e82565b600060405180830381600087803b15801561577d57600080fd5b505af1158015615791573d6000803e3d6000fd5b505050505050565b6001600160a01b0382166157f95760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401611600565b61580582600083614660565b6001600160a01b038216600090815260208190526040902054818110156158795760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401611600565b6001600160a01b03831660009081526020819052604081208383039055600280548492906158a8908490615e00565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3612fdb8360008461466b565b8054600090810361590d57506000919050565b8154829061591d90600190615e00565b8154811061592d5761592d615e17565b90600052602060002001549050919050565b919050565b6001600160a01b038116811461181557600080fd5b60006020828403121561596b57600080fd5b813561180481615944565b600060208083528351808285015260005b818110156159a357858101830151858201604001528201615987565b818111156159b5576000604083870101525b50601f01601f1916929092016040019392505050565b600080604083850312156159de57600080fd5b82356159e981615944565b946020939093013593505050565b600060208284031215615a0957600080fd5b5035919050565b600080600060608486031215615a2557600080fd5b8335615a3081615944565b92506020840135615a4081615944565b929592945050506040919091013590565b801515811461181557600080fd5b60008060408385031215615a7257600080fd5b8235615a7d81615944565b91506020830135615a8d81615a51565b809150509250929050565b600060208284031215615aaa57600080fd5b813561180481615a51565b803560ff8116811461593f57600080fd5b60008060408385031215615ad957600080fd5b8235615ae481615944565b9150615af260208401615ab5565b90509250929050565b60008060008060008060c08789031215615b1457600080fd5b8635615b1f81615944565b95506020870135945060408701359350615b3b60608801615ab5565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a031215615b7057600080fd5b8735615b7b81615944565b96506020880135615b8b81615944565b95506040880135945060608801359350615ba760808901615ab5565b925060a0880135915060c0880135905092959891949750929550565b6000806000806000806000806000806101408b8d031215615be357600080fd5b8a35615bee81615a51565b995060208b0135985060408b0135615c0581615a51565b975060608b0135965060808b0135615c1c81615a51565b955060a08b0135945060c08b0135615c3381615a51565b935060e08b013592506101008b0135615c4b81615a51565b809250506101208b013590509295989b9194979a5092959850565b60008060408385031215615c7957600080fd5b8235615c8481615944565b91506020830135615a8d81615944565b60008060408385031215615ca757600080fd5b8235615cb281615944565b9150602083013563ffffffff81168114615a8d57600080fd5b600060208284031215615cdd57600080fd5b5051919050565b600181811c90821680615cf857607f821691505b6020821081036144e357634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615615d7d57615d7d615d4d565b500290565b60008219821115615d9557615d95615d4d565b500190565b600060208284031215615dac57600080fd5b815161180481615a51565b600080600080600060a08688031215615dcf57600080fd5b8551615dda81615944565b602087015160408801516060890151608090990151929a91995097965090945092505050565b600082821015615e1257615e12615d4d565b500390565b634e487b7160e01b600052603260045260246000fd5b600082615e4a57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052602160045260246000fd5b600060208284031215615e7757600080fd5b815161180481615944565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015615ed25784516001600160a01b031683529383019391830191600101615ead565b50506001600160a01b0396909616606085015250505060800152939250505056fe57616c6c6574206661696c656420746f2072656365697665206368616e6e656c551303dd5f39cbfe6daba6b3e27754b8a7d72f519756a2cde2b92c2bbde159a7a264697066735822122086cf4e5cfe11a7c4d9ddf60a2ac55c955743d54d785a8cc27b1b1dce6175e12b64736f6c634300080d003360e06040523480156200001157600080fd5b5060405162001dc938038062001dc98339810160408190526200003491620000cc565b6200003f336200005f565b633b9aca0060a0526001600160a01b0391821660c0521660805262000104565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620000c757600080fd5b919050565b60008060408385031215620000e057600080fd5b620000eb83620000af565b9150620000fb60208401620000af565b90509250929050565b60805160a05160c051611c6b6200015e600039600081816104ad0152818161090701528181610fbb01528181611021015261115301526000818161054d015281816109780152610d4c01526000610ef00152611c6b6000f3fe6080604052600436106101d15760003560e01c8063807ab4f7116100f7578063ad76d68611610095578063eb53e21411610064578063eb53e214146105aa578063ee172546146105c0578063f2fde38b146105d6578063f82f235f146105f657600080fd5b8063ad76d68614610505578063c25907091461053b578063dd62ed3e1461056f578063e30443bc1461058a57600080fd5b806395d89b41116100d157806395d89b41146102185780639d76ea581461049b578063a680e0bc146104cf578063a9059cbb1461025957600080fd5b8063807ab4f7146104295780638357d0bb146104495780638da5cb5b1461046957600080fd5b80632ad4cab71161016f5780636f4a2cd01161013e5780636f4a2cd01461038457806370a082311461038c578063715018a6146103c25780637b510fe8146103d757600080fd5b80632ad4cab7146103125780633009a60914610332578063313ce567146103485780636de1a5a91461036457600080fd5b80630c70754e116101ab5780630c70754e146102895780630e832273146102a957806318160ddd146102e257806323b872dd146102f757600080fd5b806305b3ccb4146101e557806306fdde0314610218578063095ea7b31461025957600080fd5b366101e0576101de610626565b005b600080fd5b3480156101f157600080fd5b506102056102003660046117ec565b6106f4565b6040519081526020015b60405180910390f35b34801561022457600080fd5b50604080518082018252601281527120a3a324afa932bbb0b9322a3930b1b5b2b960711b6020820152905161020f9190611810565b34801561026557600080fd5b50610279610274366004611865565b610758565b604051901515815260200161020f565b34801561029557600080fd5b506102056102a43660046117ec565b6107b6565b3480156102b557600080fd5b506102796102c43660046117ec565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156102ee57600080fd5b50600254610205565b34801561030357600080fd5b50610279610274366004611891565b34801561031e57600080fd5b506101de61032d3660046118d2565b6107e8565b34801561033e57600080fd5b5061020560015481565b34801561035457600080fd5b506040516009815260200161020f565b34801561037057600080fd5b5061027961037f3660046117ec565b610a02565b6101de610626565b34801561039857600080fd5b506102056103a73660046117ec565b6001600160a01b031660009081526003602052604090205490565b3480156103ce57600080fd5b506101de610aad565b3480156103e357600080fd5b506103f76103f23660046117ec565b610ae1565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a00161020f565b34801561043557600080fd5b506102796104443660046117ec565b610b89565b34801561045557600080fd5b506101de610464366004611910565b610c2e565b34801561047557600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161020f565b3480156104a757600080fd5b506104837f000000000000000000000000000000000000000000000000000000000000000081565b3480156104db57600080fd5b506102056104ea3660046117ec565b6001600160a01b03166000908152600a602052604090205490565b34801561051157600080fd5b506102056105203660046117ec565b6001600160a01b031660009081526009602052604090205490565b34801561054757600080fd5b506102057f000000000000000000000000000000000000000000000000000000000000000081565b34801561057b57600080fd5b50610205610274366004611935565b34801561059657600080fd5b506101de6105a5366004611865565b610d00565b3480156105b657600080fd5b5061020560065481565b3480156105cc57600080fd5b5061020560055481565b3480156105e257600080fd5b506101de6105f13660046117ec565b610d8a565b34801561060257600080fd5b506102796106113660046117ec565b60076020526000908152604090205460ff1681565b6000600254116106745760405162461bcd60e51b8152602060048201526014602482015273151bdd185b081cdd5c1c1b1e481a5b9d985b1a5960621b60448201526064015b60405180910390fd5b34156106f25760025461068b600160801b34611979565b6106959190611998565b6004546106a291906119ba565b60045560405134815233907fdf29796aad820e4bb192f3a8d631b76519bcd2cbe77cc85af20e9df53cece0869060200160405180910390a234600560008282546106ec91906119ba565b90915550505b565b6001600160a01b038116600090815260036020526040812054600454829161071b91611979565b6001600160a01b038416600090815260086020526040902054909150600160801b61074682846119d2565b6107509190611998565b949350505050565b60405162461bcd60e51b815260206004820152602a60248201527f414746495f526577617264547261636b65723a206d6574686f64206e6f7420696044820152691b5c1b195b595b9d195960b21b606482015260009060840161066b565b6001600160a01b0381166000908152600960205260408120546107d8836106f4565b6107e29190611a13565b92915050565b6000546001600160a01b031633146108125760405162461bcd60e51b815260040161066b90611a2a565b6001600160a01b03821660009081526007602052604090205481151560ff9091161515036108a85760405162461bcd60e51b815260206004820152603a60248201527f414746495f526577617264547261636b65723a206163636f756e7420616c726560448201527f6164792073657420746f20726571756573746564207374617465000000000000606482015260840161066b565b6001600160a01b0382166000908152600760205260409020805460ff191682158015919091179091556108e5576108e0826000610e25565b6109b9565b6040516370a0823160e01b81526001600160a01b0383811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610950573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109749190611a5f565b90507f000000000000000000000000000000000000000000000000000000000000000081106109ac576109a78382610e25565b6109b7565b6109b7836000610e25565b505b816001600160a01b03167facf40045c9516ed93201cbb27e9656cc33f8636b026b0e20b4f6ddcfccf404aa826040516109f6911515815260200190565b60405180910390a25050565b600080546001600160a01b03163314610a2d5760405162461bcd60e51b815260040161066b90611a2a565b600080610a3984610e83565b90925090508115610aa3576001600160a01b0384166000818152600a602090815260409182902042905581518581529081018490527f0e311a2c6dbfb0153ec3a8a5bdca09070b3e5f60768fdc10a20453f38d186873910160405180910390a25060019392505050565b5060009392505050565b6000546001600160a01b03163314610ad75760405162461bcd60e51b815260040161066b90611a2a565b6106f260006112e1565b6000806000806000610b1d604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b6001600160a01b0387168152610b32876107b6565b6020820152610b40876106f4565b60408281019182526001600160a01b03989098166000908152600a6020908152989020546060830181905282519890920151905160065498999198909750919550909350915050565b600080546001600160a01b03163314610bb45760405162461bcd60e51b815260040161066b90611a2a565b6000610bbf83611331565b90508015610c25576001600160a01b0383166000818152600a602052604090819020429055517f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d490610c149084815260200190565b60405180910390a250600192915050565b50600092915050565b6000546001600160a01b03163314610c585760405162461bcd60e51b815260040161066b90611a2a565b4760006001600160a01b03831684610c705782610c72565b845b604051600081818185875af1925050503d8060008114610cae576040519150601f19603f3d011682016040523d82523d6000602084013e610cb3565b606091505b5050905080610cfa5760405162461bcd60e51b815260206004820152601360248201527226b0b73ab0b61039b2b732103330b4b632b21760691b604482015260640161066b565b50505050565b6000546001600160a01b03163314610d2a5760405162461bcd60e51b815260040161066b90611a2a565b6001600160a01b03821660009081526007602052604090205460ff16610d7b577f00000000000000000000000000000000000000000000000000000000000000008110610d7f57610d7b8282610e25565b5050565b610d7b826000610e25565b6000546001600160a01b03163314610db45760405162461bcd60e51b815260040161066b90611a2a565b6001600160a01b038116610e195760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161066b565b610e22816112e1565b50565b6001600160a01b03821660009081526003602052604090205480821115610e5e576000610e528284611a13565b9050610cfa84826114d8565b80821015610e7e576000610e728383611a13565b9050610cfa8482611619565b505050565b6000806000610e91846107b6565b905080156112d5576001600160a01b03841660009081526009602052604081208054839290610ec19084906119ba565b925050819055508060066000828254610eda91906119ba565b90915550506040805160028082526060820183527f0000000000000000000000000000000000000000000000000000000000000000926000929190602083019080368337019050509050816001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f869190611a78565b81600081518110610f9957610f99611a95565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610fed57610fed611a95565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b81528782166004820152600091829182917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611068573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108c9190611a5f565b9050846001600160a01b031663b6f9de95876000878d426040518663ffffffff1660e01b81526004016110c29493929190611aab565b6000604051808303818588803b1580156110db57600080fd5b505af1935050505080156110ed575060015b61112e576110f9611b15565b806308c379a003611122575061110d611b6c565b806111185750611124565b60009350506111cd565b505b3d6000803e3d6000fd5b6040516370a0823160e01b81526001600160a01b038a811660048301526001945082917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa15801561119c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c09190611a5f565b6111ca9190611a13565b91505b82611283576001600160a01b038916600090815260096020526040812080548892906111fa908490611a13565b9250508190555085600660008282546112139190611a13565b90915550506040517f551303dd5f39cbfe6daba6b3e27754b8a7d72f519756a2cde2b92c2bbde159a79061126a906020808252600f908201526e15da5d1a191c985dc819985a5b1959608a1b604082015260600190565b60405180910390a1506000988998509650505050505050565b886001600160a01b03167f1d3eee4ca001cff39eec6ec7615aacf2f2bd61791273830728ba00ccbd6e1337876040516112be91815260200190565b60405180910390a250939793965092945050505050565b50600093849350915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008061133d836107b6565b90508015610c25576001600160a01b0383166000908152600960205260408120805483929061136d9084906119ba565b92505081905550806006600082825461138691906119ba565b90915550506040516000906001600160a01b0385169083908381818185875af1925050503d80600081146113d6576040519150601f19603f3d011682016040523d82523d6000602084013e6113db565b606091505b505090508061148e576001600160a01b0384166000908152600960205260408120805484929061140c908490611a13565b9250508190555081600660008282546114259190611a13565b90915550506040517f551303dd5f39cbfe6daba6b3e27754b8a7d72f519756a2cde2b92c2bbde159a79061147c906020808252600f908201526e15da5d1a191c985dc819985a5b1959608a1b604082015260600190565b60405180910390a15060009392505050565b836001600160a01b03167f1d3eee4ca001cff39eec6ec7615aacf2f2bd61791273830728ba00ccbd6e1337836040516114c991815260200190565b60405180910390a25092915050565b6001600160a01b0382166115435760405162461bcd60e51b815260206004820152602c60248201527f414746495f526577617264547261636b65723a206d696e7420746f207468652060448201526b7a65726f206164647265737360a01b606482015260840161066b565b806002600082825461155591906119ba565b90915550506001600160a01b038216600090815260036020526040812080548392906115829084906119ba565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3806004546115d69190611979565b6001600160a01b0383166000908152600860205260409020546115f99190611bf6565b6001600160a01b0390921660009081526008602052604090209190915550565b6001600160a01b0382166116865760405162461bcd60e51b815260206004820152602e60248201527f414746495f526577617264547261636b65723a206275726e2066726f6d20746860448201526d65207a65726f206164647265737360901b606482015260840161066b565b6001600160a01b038216600090815260036020526040902054818110156117075760405162461bcd60e51b815260206004820152602f60248201527f414746495f526577617264547261636b65723a206275726e20616d6f756e742060448201526e657863656564732062616c616e636560881b606482015260840161066b565b6117118282611a13565b6001600160a01b0384166000908152600360205260408120919091556002805484929061173f908490611a13565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3816004546117939190611979565b6001600160a01b0384166000908152600860205260409020546117b691906119d2565b6001600160a01b039093166000908152600860205260409020929092555050565b6001600160a01b0381168114610e2257600080fd5b6000602082840312156117fe57600080fd5b8135611809816117d7565b9392505050565b600060208083528351808285015260005b8181101561183d57858101830151858201604001528201611821565b8181111561184f576000604083870101525b50601f01601f1916929092016040019392505050565b6000806040838503121561187857600080fd5b8235611883816117d7565b946020939093013593505050565b6000806000606084860312156118a657600080fd5b83356118b1816117d7565b925060208401356118c1816117d7565b929592945050506040919091013590565b600080604083850312156118e557600080fd5b82356118f0816117d7565b91506020830135801515811461190557600080fd5b809150509250929050565b6000806040838503121561192357600080fd5b823591506020830135611905816117d7565b6000806040838503121561194857600080fd5b8235611953816117d7565b91506020830135611905816117d7565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561199357611993611963565b500290565b6000826119b557634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156119cd576119cd611963565b500190565b600080821280156001600160ff1b03849003851316156119f4576119f4611963565b600160ff1b8390038412811615611a0d57611a0d611963565b50500190565b600082821015611a2557611a25611963565b500390565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611a7157600080fd5b5051919050565b600060208284031215611a8a57600080fd5b8151611809816117d7565b634e487b7160e01b600052603260045260246000fd5b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015611af55784516001600160a01b031683529383019391830191600101611ad0565b50506001600160a01b039690961660408501525050506060015292915050565b600060033d1115611b2e5760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff81118282101715611b6557634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d1015611b7a5790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715611baa57505050505090565b8285019150815181811115611bc25750505050505090565b843d8701016020828501011115611bdc5750505050505090565b611beb60208286010187611b31565b509095945050505050565b60008083128015600160ff1b850184121615611c1457611c14611963565b6001600160ff1b0384018313811615611c2f57611c2f611963565b5050039056fea26469706673582212206c568da71f24f1127169a07d889588673a3ba4b023cc9f5780839c423833e30864736f6c634300080d00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572dec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724

Deployed Bytecode

0x6080604052600436106106a05760003560e01c8063760f54cc1161035f578063b62496f5116101d1578063dd62ed3e11610102578063f1127ed8116100a0578063f69e20461161007a578063f69e204614611422578063f8b45b0514611437578063f8d3d2c11461144d578063fc8783b41461146357600080fd5b8063f1127ed814611398578063f2293bb0146113e2578063f2fde38b1461140257600080fd5b8063e3f1149c116100dc578063e3f1149c14611323578063e4956ce214611343578063e884f26014611363578063eaf37db31461137857600080fd5b8063dd62ed3e146112a7578063e01af92c146112ed578063e2f456051461130d57600080fd5b8063c91ea1511161016f578063d505accf11610149578063d505accf1461123b578063d5fdb5a81461125b578063d7a7b1bc1461127b578063d85ba0631461129157600080fd5b8063c91ea151146111e4578063d1232015146111fa578063d2fcc0011461121b57600080fd5b8063c3cda520116101ab578063c3cda5201461116f578063c6af580b1461118f578063c876d0b9146111af578063c8c8ebe4146111ce57600080fd5b8063b62496f5146110ff578063c02466681461112f578063c18bc1951461114f57600080fd5b80638e72697e116102ab578063a2bfb7a211610249578063a88d178f11610223578063a88d178f1461107f578063a9059cbb1461109f578063ad76d686146110bf578063afa4f3b2146110df57600080fd5b8063a2bfb7a21461101f578063a457c2d71461103f578063a680e0bc1461105f57600080fd5b80639711715a116102855780639711715a14610faa578063981b24d014610fbf5780639a7a23d614610fdf5780639ab24eb014610fff57600080fd5b80638e72697e14610f5f57806395d89b4114610f7457806396f9e9be14610f8957600080fd5b80637ecebe0011610318578063870bd30b116102f2578063870bd30b14610eeb5780638a8c523c14610f0c5780638da5cb5b14610f215780638e539e8c14610f3f57600080fd5b80637ecebe0014610e9f57806383f7bf8c14610ebf57806385c366f414610ed557600080fd5b8063760f54cc14610dcb57806376ac933014610de157806377d3eaad14610e0157806379cc679014610e175780637b510fe814610e375780637ca8664714610e8957600080fd5b80633950935111610513578063587cde1e116104445780636ddd1713116103e257806370a08231116103bc57806370a0823114610d61578063715018a614610d81578063751039fc14610d965780637571336a14610dab57600080fd5b80636ddd171314610cf55780636fc7e2cd14610d165780636fcfff4514610d2c57600080fd5b80636a486a8e1161041e5780636a486a8e14610c705780636bcb411a14610c865780636c49697f14610ca65780636dd3d39f14610cbc57600080fd5b8063587cde1e14610c0157806359463e0214610c3a5780635c19a95c14610c5057600080fd5b80634d9051ef116104b15780634eeb42621161048b5780634eeb426214610b715780634fbee19314610b8757806352d9f17514610bc057806356981c2814610be157600080fd5b80634d9051ef14610b1b5780634e71d92d14610b3c5780634ee2cd7e14610b5157600080fd5b806343f4146b116104ed57806343f4146b14610a8c578063491ca9fb14610aac57806349bd5a5e14610acd5780634a62bb6514610b0157600080fd5b80633950935114610a2c5780633a46b1a814610a4c57806342966c6814610a6c57600080fd5b8063203e727e116105ed5780632e3fc9e21161058b57806332fa2df41161056557806332fa2df4146109bc578063363c4b29146109dc5780633644e515146109fd578063372c023514610a1257600080fd5b80632e3fc9e21461095e5780632f4504ae1461097f578063313ce567146109a057600080fd5b8063248f2048116105c7578063248f2048146108e65780632814d5d2146109075780632b54bebc146109285780632d5a5d341461093e57600080fd5b8063203e727e1461088457806323b872dd146108a6578063248cc4a3146108c657600080fd5b80630c70754e1161065a57806310d5de531161063457806310d5de53146107d3578063159241d5146108035780631694505e1461083b57806318160ddd1461086f57600080fd5b80630c70754e146107875780630dd87157146107a75780630f4507c1146107bd57600080fd5b806207dfb7146106ac578063010765ee146106e257806305b3ccb41461070157806306fdde031461072f578063095ea7b3146107515780630c4bcbd11461077157600080fd5b366106a757005b600080fd5b3480156106b857600080fd5b50601e546106cd90600160281b900460ff1681565b60405190151581526020015b60405180910390f35b3480156106ee57600080fd5b50601e546106cd90610100900460ff1681565b34801561070d57600080fd5b5061072161071c366004615959565b611483565b6040519081526020016106d9565b34801561073b57600080fd5b506107446114f9565b6040516106d99190615976565b34801561075d57600080fd5b506106cd61076c3660046159cb565b61158b565b34801561077d57600080fd5b5061072160225481565b34801561079357600080fd5b506107216107a2366004615959565b6115a3565b3480156107b357600080fd5b50610721601a5481565b3480156107c957600080fd5b5061072160345481565b3480156107df57600080fd5b506106cd6107ee366004615959565b60136020526000908152604090205460ff1681565b34801561080f57600080fd5b50602454610823906001600160a01b031681565b6040516001600160a01b0390911681526020016106d9565b34801561084757600080fd5b506108237f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561087b57600080fd5b50600254610721565b34801561089057600080fd5b506108a461089f3660046159f7565b6115d6565b005b3480156108b257600080fd5b506106cd6108c1366004615a10565b611651565b3480156108d257600080fd5b50602854610823906001600160a01b031681565b3480156108f257600080fd5b50601e546106cd90600160481b900460ff1681565b34801561091357600080fd5b50601e546106cd90600160201b900460ff1681565b34801561093457600080fd5b50610721602a5481565b34801561094a57600080fd5b506108a4610959366004615a5f565b611675565b34801561096a57600080fd5b50601e546106cd90600160581b900460ff1681565b34801561098b57600080fd5b506018546106cd90600160381b900460ff1681565b3480156109ac57600080fd5b50604051600981526020016106d9565b3480156109c857600080fd5b506108a46109d7366004615a98565b6116ca565b3480156109e857600080fd5b50601e546106cd90600160301b900460ff1681565b348015610a0957600080fd5b50610721611743565b348015610a1e57600080fd5b50601e546106cd9060ff1681565b348015610a3857600080fd5b506106cd610a473660046159cb565b611752565b348015610a5857600080fd5b50610721610a673660046159cb565b611791565b348015610a7857600080fd5b506108a4610a873660046159f7565b61180b565b348015610a9857600080fd5b50602554610823906001600160a01b031681565b348015610ab857600080fd5b50601e546106cd90600160501b900460ff1681565b348015610ad957600080fd5b506108237f0000000000000000000000001cdcc303a53d4c437b1a9991a54f0e49b3af4e6381565b348015610b0d57600080fd5b506018546106cd9060ff1681565b348015610b2757600080fd5b50601e546106cd90600160381b900460ff1681565b348015610b4857600080fd5b506108a4611818565b348015610b5d57600080fd5b50610721610b6c3660046159cb565b611894565b348015610b7d57600080fd5b5061072160305481565b348015610b9357600080fd5b506106cd610ba2366004615959565b6001600160a01b031660009081526012602052604090205460ff1690565b348015610bcc57600080fd5b50601e546106cd906301000000900460ff1681565b348015610bed57600080fd5b506108a4610bfc366004615ac6565b6118dd565b348015610c0d57600080fd5b50610823610c1c366004615959565b6001600160a01b039081166000908152600b60205260409020541690565b348015610c4657600080fd5b50610721602b5481565b348015610c5c57600080fd5b506108a4610c6b366004615959565b611a9c565b348015610c7c57600080fd5b50610721602f5481565b348015610c9257600080fd5b50600e54610823906001600160a01b031681565b348015610cb257600080fd5b5061072160335481565b348015610cc857600080fd5b506106cd610cd7366004615959565b6001600160a01b031660009081526014602052604090205460ff1690565b348015610d0157600080fd5b506018546106cd90600160301b900460ff1681565b348015610d2257600080fd5b5061072160325481565b348015610d3857600080fd5b50610d4c610d47366004615959565b611aa6565b60405163ffffffff90911681526020016106d9565b348015610d6d57600080fd5b50610721610d7c366004615959565b611ac8565b348015610d8d57600080fd5b506108a4611ae3565b348015610da257600080fd5b506108a4611b19565b348015610db757600080fd5b506108a4610dc6366004615a5f565b611b78565b348015610dd757600080fd5b5061072160205481565b348015610ded57600080fd5b50602754610823906001600160a01b031681565b348015610e0d57600080fd5b5061072160215481565b348015610e2357600080fd5b506108a4610e323660046159cb565b611bfa565b348015610e4357600080fd5b50610e57610e52366004615959565b611c13565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a0016106d9565b348015610e9557600080fd5b50610721602c5481565b348015610eab57600080fd5b50610721610eba366004615959565b611c9d565b348015610ecb57600080fd5b50610721601f5481565b348015610ee157600080fd5b5061072160235481565b348015610ef757600080fd5b506018546106cd90600160201b900460ff1681565b348015610f1857600080fd5b506108a4611cbb565b348015610f2d57600080fd5b506009546001600160a01b0316610823565b348015610f4b57600080fd5b50610721610f5a3660046159f7565b611d01565b348015610f6b57600080fd5b506108a4611d5d565b348015610f8057600080fd5b50610744611dbf565b348015610f9557600080fd5b506018546106cd90600160281b900460ff1681565b348015610fb657600080fd5b506108a4611dce565b348015610fcb57600080fd5b50610721610fda3660046159f7565b611e00565b348015610feb57600080fd5b506108a4610ffa366004615a5f565b611e2b565b34801561100b57600080fd5b5061072161101a366004615959565b611f06565b34801561102b57600080fd5b506108a461103a366004615a98565b611f8c565b34801561104b57600080fd5b506106cd61105a3660046159cb565b612003565b34801561106b57600080fd5b5061072161107a366004615959565b612095565b34801561108b57600080fd5b506108a461109a366004615a98565b6120c8565b3480156110ab57600080fd5b506106cd6110ba3660046159cb565b61213f565b3480156110cb57600080fd5b506107216110da366004615959565b61214d565b3480156110eb57600080fd5b506108a46110fa3660046159f7565b612180565b34801561110b57600080fd5b506106cd61111a366004615959565b60176020526000908152604090205460ff1681565b34801561113b57600080fd5b506108a461114a366004615a5f565b6121df565b34801561115b57600080fd5b506108a461116a3660046159f7565b612261565b34801561117b57600080fd5b506108a461118a366004615afb565b6122cc565b34801561119b57600080fd5b506108a46111aa366004615a98565b612402565b3480156111bb57600080fd5b506018546106cd90610100900460ff1681565b3480156111da57600080fd5b50610721601b5481565b3480156111f057600080fd5b50610721602e5481565b34801561120657600080fd5b50601e546106cd90600160401b900460ff1681565b34801561122757600080fd5b506108a4611236366004615a5f565b61247a565b34801561124757600080fd5b506108a4611256366004615b55565b612500565b34801561126757600080fd5b506108a4611276366004615bc3565b612664565b34801561128757600080fd5b5061072160315481565b34801561129d57600080fd5b5061072160295481565b3480156112b357600080fd5b506107216112c2366004615c66565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156112f957600080fd5b506108a4611308366004615a98565b6127ea565b34801561131957600080fd5b5061072160195481565b34801561132f57600080fd5b506108a461133e366004615bc3565b612864565b34801561134f57600080fd5b506108a461135e366004615a98565b6129b5565b34801561136f57600080fd5b506106cd612a30565b34801561138457600080fd5b50602654610823906001600160a01b031681565b3480156113a457600080fd5b506113b86113b3366004615c94565b612a6e565b60408051825163ffffffff1681526020928301516001600160e01b031692810192909252016106d9565b3480156113ee57600080fd5b506108a46113fd366004615959565b612af1565b34801561140e57600080fd5b506108a461141d366004615959565b612bc5565b34801561142e57600080fd5b506108a4612c5d565b34801561144357600080fd5b50610721601c5481565b34801561145957600080fd5b50610721602d5481565b34801561146f57600080fd5b50601e546106cd9062010000900460ff1681565b600e5460405163016cf32d60e21b81526001600160a01b03838116600483015260009216906305b3ccb4906024015b602060405180830381865afa1580156114cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f39190615ccb565b92915050565b60606003805461150890615ce4565b80601f016020809104026020016040519081016040528092919081815260200182805461153490615ce4565b80156115815780601f1061155657610100808354040283529160200191611581565b820191906000526020600020905b81548152906001019060200180831161156457829003601f168201915b5050505050905090565b60003361159981858561304b565b5060019392505050565b600e546040516306383aa760e11b81526001600160a01b0383811660048301526000921690630c70754e906024016114b2565b6009546001600160a01b031633146116095760405162461bcd60e51b815260040161160090615d18565b60405180910390fd5b61161781633b9aca00615d63565b601b556040518181527fe5b4bfc380c3a1aee22ea479849c75117cc58c467670fd4c6427016d3998f2e0906020015b60405180910390a150565b60003361165f85828561316f565b61166a8585856131fb565b506001949350505050565b6009546001600160a01b0316331461169f5760405162461bcd60e51b815260040161160090615d18565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6009546001600160a01b031633146116f45760405162461bcd60e51b815260040161160090615d18565b60188054821515600160281b0265ff0000000000199091161790556040517fc7d978b78e876fea3ff1cb54617b34636eafef663e201877549e8644ae29495f9061164690831515815260200190565b600061174d613fd9565b905090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190611599908290869061178c908790615d82565b61304b565b60004382106117e25760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401611600565b6001600160a01b0383166000908152600c602052604090206118049083614100565b9392505050565b61181533826141bc565b50565b600e546001600160a01b031663807ab4f7336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af1158015611870573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118159190615d9a565b6001600160a01b0382166000908152600560205260408120819081906118bb9085906141c6565b91509150816118d2576118cd85611ac8565b6118d4565b805b95945050505050565b6009546001600160a01b031633146119075760405162461bcd60e51b815260040161160090615d18565b6001600160a01b0382166119835760405162461bcd60e51b815260206004820152603860248201527f6d6f646966794368616e6e656c57616c6c65743a206e6577416464726573732060448201527f63616e206e6f74206265207a65726f20616464726573732e00000000000000006064820152608401611600565b8060ff166001036119ae57602480546001600160a01b0319166001600160a01b038416179055611a56565b8060ff166002036119d957602580546001600160a01b0319166001600160a01b038416179055611a56565b8060ff16600303611a0457602680546001600160a01b0319166001600160a01b038416179055611a56565b8060ff16600403611a2f57602780546001600160a01b0319166001600160a01b038416179055611a56565b8060ff16600503611a5657602880546001600160a01b0319166001600160a01b0384161790555b60405160ff821681526001600160a01b038316907f44b4b43f7790513a495050ad13d875e38a4e8b7f68d8040dc33384d1f104ce11906020015b60405180910390a25050565b61181533826142bc565b6001600160a01b0381166000908152600c60205260408120546114f390612f57565b6001600160a01b031660009081526020819052604090205490565b6009546001600160a01b03163314611b0d5760405162461bcd60e51b815260040161160090615d18565b611b17600061434b565b565b6009546001600160a01b03163314611b435760405162461bcd60e51b815260040161160090615d18565b6018805460ff191690556040517f7bfa7bacf025baa75e5308bf15bcf2948f406c7ebe3eb1a8bb611862b9d647ef90600090a1565b6009546001600160a01b03163314611ba25760405162461bcd60e51b815260040161160090615d18565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527fe0a7c1f8826ab3d62a6e242681ccca3828462e5c87816004b9f8d655b22d5f089101611a90565b611c0582338361316f565b611c0f82826141bc565b5050565b600e54604051630f6a21fd60e31b81526001600160a01b0383811660048301526000928392839283928392911690637b510fe89060240160a060405180830381865afa158015611c67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8b9190615db7565b939a9299509097509550909350915050565b6001600160a01b0381166000908152600a60205260408120546114f3565b6009546001600160a01b03163314611ce55760405162461bcd60e51b815260040161160090615d18565b6018805466ff0000000000001916600160301b17905543601d55565b6000438210611d525760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401611600565b6114f3600d83614100565b6009546001600160a01b03163314611d875760405162461bcd60e51b815260040161160090615d18565b6018805460ff191660011790556040517fecd28d2c242feaa9f2efc5f2be891506d477b6836d1b969ccd5aa735fd5b38b190600090a1565b60606004805461150890615ce4565b6009546001600160a01b03163314611df85760405162461bcd60e51b815260040161160090615d18565b61181561439d565b6000806000611e108460066141c6565b9150915081611e2157600254611e23565b805b949350505050565b6009546001600160a01b03163314611e555760405162461bcd60e51b815260040161160090615d18565b7f0000000000000000000000001cdcc303a53d4c437b1a9991a54f0e49b3af4e636001600160a01b0316826001600160a01b031603611efc5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401611600565b611c0f82826143f7565b6001600160a01b0381166000908152600c60205260408120548015611f79576001600160a01b0383166000908152600c60205260409020611f48600183615e00565b81548110611f5857611f58615e17565b600091825260209091200154600160201b90046001600160e01b0316611f7c565b60005b6001600160e01b03169392505050565b6009546001600160a01b03163314611fb65760405162461bcd60e51b815260040161160090615d18565b601e8054821515600160581b0260ff60581b199091161790556040517f83283493c4a2ebc90693caf32194d32af62a993bb93a63c84ff55e325e4e97ee9061164690831515815260200190565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156120885760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401611600565b61166a828686840361304b565b600e546040516329a0382f60e21b81526001600160a01b038381166004830152600092169063a680e0bc906024016114b2565b6009546001600160a01b031633146120f25760405162461bcd60e51b815260040161160090615d18565b601e8054821515600160501b0260ff60501b199091161790556040517fd00f811311c98e2690397eeab86ca3288488a82a6c28c3ad8008c028ec4ed1b89061164690831515815260200190565b6000336115998185856131fb565b600e546040516356bb6b4360e11b81526001600160a01b038381166004830152600092169063ad76d686906024016114b2565b6009546001600160a01b031633146121aa5760405162461bcd60e51b815260040161160090615d18565b60198190556040518181527f6f3ccad01a6c8eda271113e7224718291fbf9c638c672466dff45d4340f8973e90602001611646565b6009546001600160a01b031633146122095760405162461bcd60e51b815260040161160090615d18565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101611a90565b6009546001600160a01b0316331461228b5760405162461bcd60e51b815260040161160090615d18565b61229981633b9aca00615d63565b601c556040518181527f12528a3c61e0f3b2d6fc707a9fc58b1af86e252cad0d7f4c154ebeabb162dace90602001611646565b8342111561231c5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401611600565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590526000906123969061238e9060a0016040516020818303038152906040528051906020012061444b565b858585614499565b90506123a1816144c1565b86146123ef5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401611600565b6123f981886142bc565b50505050505050565b6009546001600160a01b0316331461242c5760405162461bcd60e51b815260040161160090615d18565b60188054821515600160201b0264ff00000000199091161790556040517f5bb2376cf656637e70e36c01d3da25685bf3b353f18681b8a5e48c7b2effe1339061164690831515815260200190565b6009546001600160a01b031633146124a45760405162461bcd60e51b815260040161160090615d18565b6001600160a01b038216600081815260146020908152604091829020805460ff191685151517905590519182527fc2a697a8536522338d97f8ab754f001d7b2092a2977baad0987080402a75a2ab910160405180910390a15050565b834211156125505760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401611600565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861257f8c6144c1565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006125da8261444b565b905060006125ea82878787614499565b9050896001600160a01b0316816001600160a01b03161461264d5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401611600565b6126588a8a8a61304b565b50505050505050505050565b6009546001600160a01b0316331461268e5760405162461bcd60e51b815260040161160090615d18565b89601e60006101000a81548160ff02191690831515021790555088602a8190555087601e60016101000a81548160ff02191690831515021790555086602b8190555085601e60026101000a81548160ff02191690831515021790555084602c8190555083601e60036101000a81548160ff02191690831515021790555082602d8190555081601e60046101000a81548160ff02191690831515021790555080602e81905550808386898c6127429190615d82565b61274c9190615d82565b6127569190615d82565b6127609190615d82565b6029819055601e10156127b55760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333025206f72206c6573730000006044820152606401611600565b6040517f6d58c6dc772669fca481506571330f160785469830c3888c824e5ff2e81c47d790600090a150505050505050505050565b6009546001600160a01b031633146128145760405162461bcd60e51b815260040161160090615d18565b60188054821515600160301b0266ff000000000000199091161790556040517fb9bbb15e341600c8d067a0cadeba219905d5ba6d422b193c9c32265d26fc51c89061164690831515815260200190565b6009546001600160a01b0316331461288e5760405162461bcd60e51b815260040161160090615d18565b89601e60056101000a81548160ff0219169083151502179055508860308190555087601e60066101000a81548160ff0219169083151502179055508660318190555085601e60076101000a81548160ff0219169083151502179055508460328190555083601e60086101000a81548160ff0219169083151502179055508260338190555081601e60096101000a81548160ff02191690831515021790555080603481905550808386898c6129429190615d82565b61294c9190615d82565b6129569190615d82565b6129609190615d82565b602f819055601e10156127b55760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333025206f72206c6573730000006044820152606401611600565b6009546001600160a01b031633146129df5760405162461bcd60e51b815260040161160090615d18565b60188054821515600160381b0267ff00000000000000199091161790556040517f341322866a3a2c26c27efa4c270c5ba86f6963257118897dd8196f224c002d439061164690831515815260200190565b6009546000906001600160a01b03163314612a5d5760405162461bcd60e51b815260040161160090615d18565b506018805461ff0019169055600190565b60408051808201909152600080825260208201526001600160a01b0383166000908152600c60205260409020805463ffffffff8416908110612ab257612ab2615e17565b60009182526020918290206040805180820190915291015463ffffffff81168252600160201b90046001600160e01b0316918101919091529392505050565b6009546001600160a01b03163314612b1b5760405162461bcd60e51b815260040161160090615d18565b6001600160a01b038116612b7b5760405162461bcd60e51b815260206004820152602160248201527f6e6577547261636b65722063616e6e6f74206265207a65726f206164647265736044820152607360f81b6064820152608401611600565b600e80546001600160a01b0319166001600160a01b0383169081179091556040517f27d252e570592a130198f8a8e4fb0c66776ddd3c44cbff2e13059b63d8421a9390600090a250565b6009546001600160a01b03163314612bef5760405162461bcd60e51b815260040161160090615d18565b6001600160a01b038116612c545760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611600565b6118158161434b565b601854600160381b900460ff16612cb65760405162461bcd60e51b815260206004820181905260248201527f414746493a20636f6d706f756e64696e67206973206e6f7420656e61626c65646044820152606401611600565b6018805463ff00000019166301000000179055600e546001600160a01b0316636de1a5a9612ce13390565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af1158015612d27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d4b9190615d9a565b506018805463ff00000019169055565b612d658282612deb565b6002546001600160e01b031015612dd75760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401611600565b612de5600d612ede836144e9565b50505050565b6001600160a01b038216612e415760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401611600565b612e4d60008383614660565b8060026000828254612e5f9190615d82565b90915550506001600160a01b03821660009081526020819052604081208054839290612e8c908490615d82565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3611c0f6000838361466b565b60006118048284615d82565b60006001600160e01b03821115612f535760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401611600565b5090565b600063ffffffff821115612f535760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401611600565b6001600160a01b038316612fe057612fd382614676565b612fdb6146a0565b505050565b6001600160a01b038216612ff757612fd383614676565b61300083614676565b612fdb82614676565b6001600160a01b038381166000908152600b6020526040808220548584168352912054612fdb929182169116836146ae565b60006118048284615e00565b5490565b6001600160a01b0383166130ad5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611600565b6001600160a01b03821661310e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611600565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114612de557818110156131ee5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401611600565b612de5848484840361304b565b6001600160a01b0383166132635760405162461bcd60e51b815260206004820152602960248201527f5f7472616e736665723a207472616e736665722066726f6d20746865207a65726044820152686f206164647265737360b81b6064820152608401611600565b6001600160a01b0382166132c95760405162461bcd60e51b815260206004820152602760248201527f5f7472616e736665723a207472616e7366657220746f20746865207a65726f206044820152666164647265737360c81b6064820152608401611600565b6001600160a01b03831660009081526011602052604090205460ff16156133325760405162461bcd60e51b815260206004820181905260248201527f5f7472616e736665723a2053656e64657220697320626c61636b6c69737465646044820152606401611600565b6001600160a01b03821660009081526011602052604090205460ff16156133a75760405162461bcd60e51b815260206004820152602360248201527f5f7472616e736665723a20526563697069656e7420697320626c61636b6c69736044820152621d195960ea1b6064820152608401611600565b806000036133bb57612fdb838360006147eb565b60185460ff161561385d576009546001600160a01b038481169116148015906133f257506009546001600160a01b03838116911614155b801561340657506001600160a01b03821615155b801561341d57506001600160a01b03821661dead14155b8015613432575060185462010000900460ff16155b1561385d57601854600160301b900460ff166134cc576001600160a01b03831660009081526012602052604090205460ff168061348757506001600160a01b03821660009081526012602052604090205460ff165b6134cc5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401611600565b601854610100900460ff1615613617576009546001600160a01b0383811691161480159061352c57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b031614155b801561356a57507f0000000000000000000000001cdcc303a53d4c437b1a9991a54f0e49b3af4e636001600160a01b0316826001600160a01b031614155b15613617573260009081526015602052604090205443116136045760405162461bcd60e51b815260206004820152604860248201527f5f7472616e736665723a205472616e736665722044656c617920656e61626c6560448201527f642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b2060648201526730b63637bbb2b21760c11b608482015260a401611600565b3260009081526015602052604090204390555b6001600160a01b03831660009081526017602052604090205460ff16801561365857506001600160a01b03821660009081526013602052604090205460ff16155b1561372c57601b548111156136cd5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401611600565b601c546136d983611ac8565b6136e39083615d82565b11156137275760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401611600565b61385d565b6001600160a01b03821660009081526017602052604090205460ff16801561376d57506001600160a01b03831660009081526013602052604090205460ff16155b156137e357601b548111156137275760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401611600565b6001600160a01b03821660009081526013602052604090205460ff1661385d57601c5461380f83611ac8565b6138199083615d82565b111561385d5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401611600565b601d5461386b906001615d82565b43111580156138ac57507f0000000000000000000000001cdcc303a53d4c437b1a9991a54f0e49b3af4e636001600160a01b0316826001600160a01b031614155b80156138d557506001600160a01b038216737a250d5630b4cf539739df2c5dacb4c659f2488d14155b15613924576001600160a01b038216600081815260116020526040808220805460ff19166001179055517fb90badc1cf1c52268f4fa9afb5276aebf640bcca3300cdfc9cf37db17daa13e29190a25b600061392f30611ac8565b60195460185491925082101590600160301b900460ff16801561394f5750805b8015613964575060185462010000900460ff16155b801561398957506001600160a01b03851660009081526017602052604090205460ff16155b80156139c757507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316856001600160a01b031614155b80156139e157506009546001600160a01b03868116911614155b80156139fb57506009546001600160a01b03858116911614155b15613a2c576018805462ff0000191662010000179055613a1b82476149ca565b42601a556018805462ff0000191690555b60007f0000000000000000000000001cdcc303a53d4c437b1a9991a54f0e49b3af4e636001600160a01b0316866001600160a01b03161480613a9f57507f0000000000000000000000001cdcc303a53d4c437b1a9991a54f0e49b3af4e636001600160a01b0316856001600160a01b0316145b80613ac257506001600160a01b03851660009081526017602052604090205460ff165b80613ae557506001600160a01b03861660009081526017602052604090205460ff165b80613af95750601854600160281b900460ff165b15613b02575060015b6001600160a01b03861660009081526012602052604090205460ff1680613b4157506001600160a01b03851660009081526012602052604090205460ff165b80613b54575060185462010000900460ff165b80613b6857506018546301000000900460ff165b80613b7d5750601854600160201b900460ff16155b15613b86575060005b8015613ede576001600160a01b03851660009081526017602052604081205460ff168015613bb657506000602f54115b15613d2d57612710602f5486613bcc9190615d63565b613bd69190615e2d565b601e54909150600160281b900460ff1615613c1c57602f54603054613bfb9083615d63565b613c059190615e2d565b601f6000828254613c169190615d82565b90915550505b601e54600160301b900460ff1615613c5f57602f54603154613c3e9083615d63565b613c489190615e2d565b60206000828254613c599190615d82565b90915550505b601e54600160381b900460ff1615613ca257602f54603254613c819083615d63565b613c8b9190615e2d565b60216000828254613c9c9190615d82565b90915550505b601e54600160401b900460ff1615613ce557602f54603354613cc49083615d63565b613cce9190615e2d565b60226000828254613cdf9190615d82565b90915550505b601e54600160481b900460ff1615613d2857602f54603454613d079083615d63565b613d119190615e2d565b60236000828254613d229190615d82565b90915550505b613ebf565b6001600160a01b03871660009081526017602052604090205460ff168015613d5757506000602954115b15613ebf5761271060295486613d6d9190615d63565b613d779190615e2d565b601e5490915060ff1615613db657602954602a54613d959083615d63565b613d9f9190615e2d565b601f6000828254613db09190615d82565b90915550505b601e54610100900460ff1615613df757602954602a54613dd69083615d63565b613de09190615e2d565b60206000828254613df19190615d82565b90915550505b601e5462010000900460ff1615613e3957602954602a54613e189083615d63565b613e229190615e2d565b60216000828254613e339190615d82565b90915550505b601e546301000000900460ff1615613e7c57602954602a54613e5b9083615d63565b613e659190615e2d565b60226000828254613e769190615d82565b90915550505b601e54600160201b900460ff1615613ebf57602954602a54613e9e9083615d63565b613ea89190615e2d565b60236000828254613eb99190615d82565b90915550505b613ec98186615e00565b94508015613edc57613edc8730836147eb565b505b613ee98686866147eb565b600e546001600160a01b031663e30443bc87613f0481611ac8565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613f4a57600080fd5b505af1158015613f5e573d6000803e3d6000fd5b5050600e546001600160a01b0316915063e30443bc905086613f7f81611ac8565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613fc557600080fd5b505af1158015612658573d6000803e3d6000fd5b6000306001600160a01b037f00000000000000000000000080c24111d3f9e1ffecf3b41b9ca68e60a890866b1614801561403257507f000000000000000000000000000000000000000000000000000000000000000146145b1561405c57507f63864db2f0726809e77e5514020fd3cd3f09a5677709445efa93aa3340c600c890565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f1b6c552d2412af3508f99a446e6635ca0f3a86d0dc16739def2662ae32050b20828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b8181101561416457600061411b82846151e9565b90508486828154811061413057614130615e17565b60009182526020909120015463ffffffff1611156141505780925061415e565b61415b816001615d82565b91505b50614107565b81156141a75784614176600184615e00565b8154811061418657614186615e17565b600091825260209091200154600160201b90046001600160e01b03166141aa565b60005b6001600160e01b031695945050505050565b611c0f8282615204565b600080600084116142125760405162461bcd60e51b815260206004820152601660248201527504552433230536e617073686f743a20696420697320360541b6044820152606401611600565b61421a61521c565b8411156142695760405162461bcd60e51b815260206004820152601d60248201527f4552433230536e617073686f743a206e6f6e6578697374656e742069640000006044820152606401611600565b60006142758486615227565b8454909150810361428d5760008092509250506142b5565b60018460010182815481106142a4576142a4615e17565b906000526020600020015492509250505b9250929050565b6001600160a01b038281166000908152600b6020526040812054909116906142e384611ac8565b6001600160a01b038581166000818152600b602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4612de58284836146ae565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006143ad600880546001019055565b60006143b761521c565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb67816040516143ea91815260200190565b60405180910390a1919050565b6001600160a01b038216600081815260176020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b60006114f3614458613fd9565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006144aa878787876152ec565b915091506144b7816153d9565b5095945050505050565b6001600160a01b0381166000908152600a602052604090208054600181018255905b50919050565b8254600090819080156145335785614502600183615e00565b8154811061451257614512615e17565b600091825260209091200154600160201b90046001600160e01b0316614536565b60005b6001600160e01b0316925061454f83858763ffffffff16565b915060008111801561458d57504386614569600184615e00565b8154811061457957614579615e17565b60009182526020909120015463ffffffff16145b156145ed5761459b82612eea565b866145a7600184615e00565b815481106145b7576145b7615e17565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b03160217905550614657565b85604051806040016040528061460243612f57565b63ffffffff16815260200161461685612eea565b6001600160e01b039081169091528254600181018455600093845260209384902083519490930151909116600160201b0263ffffffff909316929092179101555b50935093915050565b612fdb838383612fbc565b612fdb838383613009565b6001600160a01b03811660009081526005602052604090206118159061469b83611ac8565b61558f565b611b17600661469b60025490565b816001600160a01b0316836001600160a01b0316141580156146d05750600081115b15612fdb576001600160a01b0383161561475e576001600160a01b0383166000908152600c60205260408120819061470b9061303b856144e9565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051614753929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615612fdb576001600160a01b0382166000908152600c60205260408120819061479490612ede856144e9565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516147dc929190918252602082015260400190565b60405180910390a25050505050565b6001600160a01b03831661484f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401611600565b6001600160a01b0382166148b15760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401611600565b6148bc838383614660565b6001600160a01b038316600090815260208190526040902054818110156149345760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401611600565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061496b908490615d82565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516149b791815260200190565b60405180910390a3612de584848461466b565b600082116149d6575050565b60245460009081906001600160a01b0316156149fd5750601f546149fa8183615d82565b91505b6025546000906001600160a01b031615614a8057601e54600160501b900460ff1615614a6f57614a2f306020546141bc565b7f6ef4855b666dcc7884561072e4358b28dfe01feb1b7f4dcebc00e62d50394ac7602054604051614a6291815260200190565b60405180910390a1614a80565b50602054614a7d8184615d82565b92505b6026546000906001600160a01b031615614bca57601e54600160581b900460ff1615614bb957600e546021546040516000926001600160a01b031691908381818185875af1925050503d8060008114614af5576040519150601f19603f3d011682016040523d82523d6000602084013e614afa565b606091505b505090508015614b425760408051838152602081018490527f96070eb7bd2cf112ddb94f1a3d88b4aad96f9f1a97083af866c0bc17a0a91aff910160405180910390a1614b96565b600080516020615f14833981519152604051614b8d906020808252818101527f547261636b6572206661696c656420746f207265636569766520746f6b656e73604082015260600190565b60405180910390a15b602654602154614bb39130916001600160a01b03909116906147eb565b50614bca565b50602154614bc78185615d82565b93505b6027546000906001600160a01b031615614bef5750602254614bec8186615d82565b94505b6028546000906001600160a01b031615614c145750602354614c118187615d82565b95505b47614c1e876155d9565b600088614c2b8347615e00565b614c359190615d82565b6000601f819055602081905560218190556022819055602381905590915088614c5e8984615d63565b614c689190615e2d565b9050600089614c778985615d63565b614c819190615e2d565b905060008a614c908986615d63565b614c9a9190615e2d565b905060008b614ca98987615d63565b614cb39190615e2d565b905060008c614cc28988615d63565b614ccc9190615e2d565b90508415614dc6576024546040516000916001600160a01b03169087908381818185875af1925050503d8060008114614d21576040519150601f19603f3d011682016040523d82523d6000602084013e614d26565b606091505b505090508015614d6e57604080518e8152602081018890527f7318041d7e07afbd7fa76833c189e8b154eb2a0c7a4c43bebbaf8722bd1d553c910160405180910390a1614dc4565b600080516020615f14833981519152604051614dbb906020808252602990820152600080516020615ef4833981519152604082015268203120746f6b656e7360b81b606082015260800190565b60405180910390a15b505b600084118015614de05750601e54600160501b900460ff16155b15614ed7576025546040516000916001600160a01b03169086908381818185875af1925050503d8060008114614e32576040519150601f19603f3d011682016040523d82523d6000602084013e614e37565b606091505b505090508015614e7f57604080518d8152602081018790527fe0eabb774fbbfbb7ae11d5dc1b874b23769dd173501de5e5929554af4d12fbc0910160405180910390a1614ed5565b600080516020615f14833981519152604051614ecc906020808252602990820152600080516020615ef4833981519152604082015268203220746f6b656e7360b81b606082015260800190565b60405180910390a15b505b600083118015614ef15750601e54600160581b900460ff16155b15614fe8576026546040516000916001600160a01b03169085908381818185875af1925050503d8060008114614f43576040519150601f19603f3d011682016040523d82523d6000602084013e614f48565b606091505b505090508015614f9057604080518c8152602081018690527f96070eb7bd2cf112ddb94f1a3d88b4aad96f9f1a97083af866c0bc17a0a91aff910160405180910390a1614fe6565b600080516020615f14833981519152604051614fdd906020808252602990820152600080516020615ef4833981519152604082015268203320746f6b656e7360b81b606082015260800190565b60405180910390a15b505b81156150e0576027546040516000916001600160a01b03169084908381818185875af1925050503d806000811461503b576040519150601f19603f3d011682016040523d82523d6000602084013e615040565b606091505b50509050801561508857604080518b8152602081018590527f2c5d8716b48bd31229ddcc05f4a0fd9dd23a6d847c7e78f08a148b198f6f1a06910160405180910390a16150de565b600080516020615f148339815191526040516150d5906020808252602990820152600080516020615ef4833981519152604082015268203420746f6b656e7360b81b606082015260800190565b60405180910390a15b505b80156151d8576028546040516000916001600160a01b03169083908381818185875af1925050503d8060008114615133576040519150601f19603f3d011682016040523d82523d6000602084013e615138565b606091505b50509050801561518057604080518a8152602081018490527f7cee55fff8c2bd5183d732cce023a1cad3644c3e59fd1f12c815f525e893bceb910160405180910390a16151d6565b600080516020615f148339815191526040516151cd906020808252602990820152600080516020615ef4833981519152604082015268203520746f6b656e7360b81b606082015260800190565b60405180910390a15b505b505050505050505050505050505050565b60006151f86002848418615e2d565b61180490848416615d82565b61520e8282615799565b612de5600d61303b836144e9565b600061174d60085490565b8154600090810361523a575060006114f3565b82546000905b8082101561529657600061525483836151e9565b90508486828154811061526957615269615e17565b9060005260206000200154111561528257809150615290565b61528d816001615d82565b92505b50615240565b6000821180156152cb575083856152ae600185615e00565b815481106152be576152be615e17565b9060005260206000200154145b156152e4576152db600183615e00565b925050506114f3565b5090506114f3565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561532357506000905060036153d0565b8460ff16601b1415801561533b57508460ff16601c14155b1561534c57506000905060046153d0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156153a0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166153c9576000600192509250506153d0565b9150600090505b94509492505050565b60008160048111156153ed576153ed615e4f565b036153f55750565b600181600481111561540957615409615e4f565b036154565760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401611600565b600281600481111561546a5761546a615e4f565b036154b75760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401611600565b60038160048111156154cb576154cb615e4f565b036155235760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401611600565b600481600481111561553757615537615e4f565b036118155760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401611600565b600061559961521c565b9050806155a5846158fa565b1015612fdb578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061560e5761560e615e17565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561568c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906156b09190615e65565b816001815181106156c3576156c3615e17565b60200260200101906001600160a01b031690816001600160a01b03168152505061570e307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461304b565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790615763908590600090869030904290600401615e82565b600060405180830381600087803b15801561577d57600080fd5b505af1158015615791573d6000803e3d6000fd5b505050505050565b6001600160a01b0382166157f95760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401611600565b61580582600083614660565b6001600160a01b038216600090815260208190526040902054818110156158795760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401611600565b6001600160a01b03831660009081526020819052604081208383039055600280548492906158a8908490615e00565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3612fdb8360008461466b565b8054600090810361590d57506000919050565b8154829061591d90600190615e00565b8154811061592d5761592d615e17565b90600052602060002001549050919050565b919050565b6001600160a01b038116811461181557600080fd5b60006020828403121561596b57600080fd5b813561180481615944565b600060208083528351808285015260005b818110156159a357858101830151858201604001528201615987565b818111156159b5576000604083870101525b50601f01601f1916929092016040019392505050565b600080604083850312156159de57600080fd5b82356159e981615944565b946020939093013593505050565b600060208284031215615a0957600080fd5b5035919050565b600080600060608486031215615a2557600080fd5b8335615a3081615944565b92506020840135615a4081615944565b929592945050506040919091013590565b801515811461181557600080fd5b60008060408385031215615a7257600080fd5b8235615a7d81615944565b91506020830135615a8d81615a51565b809150509250929050565b600060208284031215615aaa57600080fd5b813561180481615a51565b803560ff8116811461593f57600080fd5b60008060408385031215615ad957600080fd5b8235615ae481615944565b9150615af260208401615ab5565b90509250929050565b60008060008060008060c08789031215615b1457600080fd5b8635615b1f81615944565b95506020870135945060408701359350615b3b60608801615ab5565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a031215615b7057600080fd5b8735615b7b81615944565b96506020880135615b8b81615944565b95506040880135945060608801359350615ba760808901615ab5565b925060a0880135915060c0880135905092959891949750929550565b6000806000806000806000806000806101408b8d031215615be357600080fd5b8a35615bee81615a51565b995060208b0135985060408b0135615c0581615a51565b975060608b0135965060808b0135615c1c81615a51565b955060a08b0135945060c08b0135615c3381615a51565b935060e08b013592506101008b0135615c4b81615a51565b809250506101208b013590509295989b9194979a5092959850565b60008060408385031215615c7957600080fd5b8235615c8481615944565b91506020830135615a8d81615944565b60008060408385031215615ca757600080fd5b8235615cb281615944565b9150602083013563ffffffff81168114615a8d57600080fd5b600060208284031215615cdd57600080fd5b5051919050565b600181811c90821680615cf857607f821691505b6020821081036144e357634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615615d7d57615d7d615d4d565b500290565b60008219821115615d9557615d95615d4d565b500190565b600060208284031215615dac57600080fd5b815161180481615a51565b600080600080600060a08688031215615dcf57600080fd5b8551615dda81615944565b602087015160408801516060890151608090990151929a91995097965090945092505050565b600082821015615e1257615e12615d4d565b500390565b634e487b7160e01b600052603260045260246000fd5b600082615e4a57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052602160045260246000fd5b600060208284031215615e7757600080fd5b815161180481615944565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015615ed25784516001600160a01b031683529383019391830191600101615ead565b50506001600160a01b0396909616606085015250505060800152939250505056fe57616c6c6574206661696c656420746f2072656365697665206368616e6e656c551303dd5f39cbfe6daba6b3e27754b8a7d72f519756a2cde2b92c2bbde159a7a264697066735822122086cf4e5cfe11a7c4d9ddf60a2ac55c955743d54d785a8cc27b1b1dce6175e12b64736f6c634300080d0033

Deployed Bytecode Sourcemap

94532:26736:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96475:35;;;;;;;;;;-1:-1:-1;96475:35:0;;;;-1:-1:-1;;;96475:35:0;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;96475:35:0;;;;;;;;96308;;;;;;;;;;-1:-1:-1;96308:35:0;;;;;;;;;;;104166:146;;;;;;;;;;-1:-1:-1;104166:146:0;;;;;:::i;:::-;;:::i;:::-;;;740:25:1;;;728:2;713:18;104166:146:0;594:177:1;47925:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;50276:201::-;;;;;;;;;;-1:-1:-1;50276:201:0;;;;;:::i;:::-;;:::i;96872:26::-;;;;;;;;;;;;;;;;103832:178;;;;;;;;;;-1:-1:-1;103832:178:0;;;;;:::i;:::-;;:::i;95934:27::-;;;;;;;;;;;;;;;;98658:30;;;;;;;;;;;;;;;;95187:64;;;;;;;;;;-1:-1:-1;95187:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;97019:77;;;;;;;;;;-1:-1:-1;97019:77:0;;;;-1:-1:-1;;;;;97019:77:0;;;;;;-1:-1:-1;;;;;1862:32:1;;;1844:51;;1832:2;1817:18;97019:77:0;1698:203:1;94843:51:0;;;;;;;;;;;;;;;49045:108;;;;;;;;;;-1:-1:-1;49133:12:0;;49045:108;;105648:156;;;;;;;;;;-1:-1:-1;105648:156:0;;;;;:::i;:::-;;:::i;:::-;;51057:295;;;;;;;;;;-1:-1:-1;51057:295:0;;;;;:::i;:::-;;:::i;97974:77::-;;;;;;;;;;-1:-1:-1;97974:77:0;;;;-1:-1:-1;;;;;97974:77:0;;;96643:35;;;;;;;;;;-1:-1:-1;96643:35:0;;;;-1:-1:-1;;;96643:35:0;;;;;;96432:34;;;;;;;;;;-1:-1:-1;96432:34:0;;;;-1:-1:-1;;;96432:34:0;;;;;;98116:29;;;;;;;;;;;;;;;;102626:134;;;;;;;;;;-1:-1:-1;102626:134:0;;;;;:::i;:::-;;:::i;96729:35::-;;;;;;;;;;-1:-1:-1;96729:35:0;;;;-1:-1:-1;;;96729:35:0;;;;;;95797:37;;;;;;;;;;-1:-1:-1;95797:37:0;;;;-1:-1:-1;;;95797:37:0;;;;;;101650:84;;;;;;;;;;-1:-1:-1;101650:84:0;;101725:1;3439:36:1;;3427:2;3412:18;101650:84:0;3297:184:1;105486:154:0;;;;;;;;;;-1:-1:-1;105486:154:0;;;;;:::i;:::-;;:::i;96517:35::-;;;;;;;;;;-1:-1:-1;96517:35:0;;;;-1:-1:-1;;;96517:35:0;;;;;;61126:115;;;;;;;;;;;;;:::i;96267:34::-;;;;;;;;;;-1:-1:-1;96267:34:0;;;;;;;;51761:240;;;;;;;;;;-1:-1:-1;51761:240:0;;;;;:::i;:::-;;:::i;64302:268::-;;;;;;;;;;-1:-1:-1;64302:268:0;;;;;:::i;:::-;;:::i;80392:91::-;;;;;;;;;;-1:-1:-1;80392:91:0;;;;;:::i;:::-;;:::i;97330:77::-;;;;;;;;;;-1:-1:-1;97330:77:0;;;;-1:-1:-1;;;;;97330:77:0;;;96687:35;;;;;;;;;;-1:-1:-1;96687:35:0;;;;-1:-1:-1;;;96687:35:0;;;;;;94901:38;;;;;;;;;;;;;;;95531:33;;;;;;;;;;-1:-1:-1;95531:33:0;;;;;;;;96559:35;;;;;;;;;;-1:-1:-1;96559:35:0;;;;-1:-1:-1;;;96559:35:0;;;;;;103487:94;;;;;;;;;;;;;:::i;75940:266::-;;;;;;;;;;-1:-1:-1;75940:266:0;;;;;:::i;:::-;;:::i;98438:30::-;;;;;;;;;;;;;;;;102493:125;;;;;;;;;;-1:-1:-1;102493:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;102582:28:0;102558:4;102582:28;;;:19;:28;;;;;;;;;102493:125;96391:34;;;;;;;;;;-1:-1:-1;96391:34:0;;;;;;;;;;;106528:594;;;;;;;;;;-1:-1:-1;106528:594:0;;;;;:::i;:::-;;:::i;63676:128::-;;;;;;;;;;-1:-1:-1;63676:128:0;;;;;:::i;:::-;-1:-1:-1;;;;;63777:19:0;;;63750:7;63777:19;;;:10;:19;;;;;;;;63676:128;98167:27;;;;;;;;;;;;;;;;66775:114;;;;;;;;;;-1:-1:-1;66775:114:0;;;;;:::i;:::-;;:::i;98381:35::-;;;;;;;;;;;;;;;;94801;;;;;;;;;;-1:-1:-1;94801:35:0;;;;-1:-1:-1;;;;;94801:35:0;;;98598:30;;;;;;;;;;;;;;;;102349:136;;;;;;;;;;-1:-1:-1;102349:136:0;;;;;:::i;:::-;-1:-1:-1;;;;;102444:33:0;102420:4;102444:33;;;:24;:33;;;;;;;;;102349:136;95759:31;;;;;;;;;;-1:-1:-1;95759:31:0;;;;-1:-1:-1;;;95759:31:0;;;;;;98543:30;;;;;;;;;;;;;;;;63432:151;;;;;;;;;;-1:-1:-1;63432:151:0;;;;;:::i;:::-;;:::i;:::-;;;4810:10:1;4798:23;;;4780:42;;4768:2;4753:18;63432:151:0;4636:192:1;49216:127:0;;;;;;;;;;-1:-1:-1;49216:127:0;;;;;:::i;:::-;;:::i;36372:103::-;;;;;;;;;;;;;:::i;105971:115::-;;;;;;;;;;;;;:::i;101742:214::-;;;;;;;;;;-1:-1:-1;101742:214:0;;;;;:::i;:::-;;:::i;96806:26::-;;;;;;;;;;;;;;;;97807:77;;;;;;;;;;-1:-1:-1;97807:77:0;;;;-1:-1:-1;;;;;97807:77:0;;;96839:26;;;;;;;;;;;;;;;;80802:164;;;;;;;;;;-1:-1:-1;80802:164:0;;;;;:::i;:::-;;:::i;104320:278::-;;;;;;;;;;-1:-1:-1;104320:278:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5110:32:1;;;5092:51;;5174:2;5159:18;;5152:34;;;;5202:18;;;5195:34;;;;5260:2;5245:18;;5238:34;5303:3;5288:19;;5281:35;5079:3;5064:19;104320:278:0;4833:489:1;98212:29:0;;;;;;;;;;;;;;;;60868:128;;;;;;;;;;-1:-1:-1;60868:128:0;;;;;:::i;:::-;;:::i;96773:26::-;;;;;;;;;;;;;;;;96905;;;;;;;;;;;;;;;;95678:29;;;;;;;;;;-1:-1:-1;95678:29:0;;;;-1:-1:-1;;;95678:29:0;;;;;;104606:117;;;;;;;;;;;;;:::i;35721:87::-;;;;;;;;;;-1:-1:-1;35794:6:0;;-1:-1:-1;;;;;35794:6:0;35721:87;;64859:259;;;;;;;;;;-1:-1:-1;64859:259:0;;;;;:::i;:::-;;:::i;106094:120::-;;;;;;;;;;;;;:::i;48144:104::-;;;;;;;;;;;;;:::i;95714:38::-;;;;;;;;;;-1:-1:-1;95714:38:0;;;;-1:-1:-1;;;95714:38:0;;;;;;109045:67;;;;;;;;;;;;;:::i;76310:234::-;;;;;;;;;;-1:-1:-1;76310:234:0;;;;;:::i;:::-;;:::i;102768:246::-;;;;;;;;;;-1:-1:-1;102768:246:0;;;;;:::i;:::-;;:::i;63888:212::-;;;;;;;;;;-1:-1:-1;63888:212:0;;;;;:::i;:::-;;:::i;106375:145::-;;;;;;;;;;-1:-1:-1;106375:145:0;;;;;:::i;:::-;;:::i;52504:438::-;;;;;;;;;;-1:-1:-1;52504:438:0;;;;;:::i;:::-;;:::i;104731:138::-;;;;;;;;;;-1:-1:-1;104731:138:0;;;;;:::i;:::-;;:::i;106222:145::-;;;;;;;;;;-1:-1:-1;106222:145:0;;;;;:::i;:::-;;:::i;49549:193::-;;;;;;;;;;-1:-1:-1;49549:193:0;;;;;:::i;:::-;;:::i;104018:140::-;;;;;;;;;;-1:-1:-1;104018:140:0;;;;;:::i;:::-;;:::i;105039:160::-;;;;;;;;;;-1:-1:-1;105039:160:0;;;;;:::i;:::-;;:::i;95464:58::-;;;;;;;;;;-1:-1:-1;95464:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;101964:182;;;;;;;;;;-1:-1:-1;101964:182:0;;;;;:::i;:::-;;:::i;105812:151::-;;;;;;;;;;-1:-1:-1;105812:151:0;;;;;:::i;:::-;;:::i;66971:591::-;;;;;;;;;;-1:-1:-1;66971:591:0;;;;;:::i;:::-;;:::i;105348:130::-;;;;;;;;;;-1:-1:-1;105348:130:0;;;;;:::i;:::-;;:::i;95571:39::-;;;;;;;;;;-1:-1:-1;95571:39:0;;;;;;;;;;;95970:56;;;;;;;;;;;;;;;;98325:29;;;;;;;;;;;;;;;;96601:35;;;;;;;;;;-1:-1:-1;96601:35:0;;;;-1:-1:-1;;;96601:35:0;;;;;;102154:187;;;;;;;;;;-1:-1:-1;102154:187:0;;;;;:::i;:::-;;:::i;60157:645::-;;;;;;;;;;-1:-1:-1;60157:645:0;;;;;:::i;:::-;;:::i;107401:807::-;;;;;;;;;;-1:-1:-1;107401:807:0;;;;;:::i;:::-;;:::i;98490:30::-;;;;;;;;;;;;;;;;98060:34;;;;;;;;;;;;;;;;49805:151;;;;;;;;;;-1:-1:-1;49805:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;49921:18:0;;;49894:7;49921:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;49805:151;105207:133;;;;;;;;;;-1:-1:-1;105207:133:0;;;;;:::i;:::-;;:::i;95843:50::-;;;;;;;;;;;;;;;;108217:820;;;;;;;;;;-1:-1:-1;108217:820:0;;;;;:::i;:::-;;:::i;104877:154::-;;;;;;;;;;-1:-1:-1;104877:154:0;;;;;:::i;:::-;;:::i;107183:210::-;;;;;;;;;;;;;:::i;97635:77::-;;;;;;;;;;-1:-1:-1;97635:77:0;;;;-1:-1:-1;;;;;97635:77:0;;;63202:150;;;;;;;;;;-1:-1:-1;63202:150:0;;;;;:::i;:::-;;:::i;:::-;;;;8837:13:1;;8852:10;8833:30;8815:49;;8924:4;8912:17;;;8906:24;-1:-1:-1;;;;;8902:50:1;8880:20;;;8873:80;;;;8788:18;63202:150:0;8613:346:1;103222:257:0;;;;;;;;;;-1:-1:-1;103222:257:0;;;;;:::i;:::-;;:::i;36630:201::-;;;;;;;;;;-1:-1:-1;36630:201:0;;;;;:::i;:::-;;:::i;103589:235::-;;;;;;;;;;;;;:::i;96061:46::-;;;;;;;;;;;;;;;;98266:29;;;;;;;;;;;;;;;;96350:34;;;;;;;;;;-1:-1:-1;96350:34:0;;;;;;;;;;;104166:146;104261:13;;:43;;-1:-1:-1;;;104261:43:0;;-1:-1:-1;;;;;1862:32:1;;;104261:43:0;;;1844:51:1;104234:7:0;;104261:13;;:34;;1817:18:1;;104261:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;104254:50;104166:146;-1:-1:-1;;104166:146:0:o;47925:100::-;47979:13;48012:5;48005:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47925:100;:::o;50276:201::-;50359:4;34535:10;50415:32;34535:10;50431:7;50440:6;50415:8;:32::i;:::-;-1:-1:-1;50465:4:0;;50276:201;-1:-1:-1;;;50276:201:0:o;103832:178::-;103959:13;;:43;;-1:-1:-1;;;103959:43:0;;-1:-1:-1;;;;;1862:32:1;;;103959:43:0;;;1844:51:1;103927:7:0;;103959:13;;:34;;1817:18:1;;103959:43:0;1698:203:1;105648:156:0;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;;;;;;;;;105745:14:::1;:6:::0;105755:3:::1;105745:14;:::i;:::-;105722:20;:37:::0;105775:21:::1;::::0;740:25:1;;;105775:21:0::1;::::0;728:2:1;713:18;105775:21:0::1;;;;;;;;105648:156:::0;:::o;51057:295::-;51188:4;34535:10;51246:38;51262:4;34535:10;51277:6;51246:15;:38::i;:::-;51295:27;51305:4;51311:2;51315:6;51295:9;:27::i;:::-;-1:-1:-1;51340:4:0;;51057:295;-1:-1:-1;;;;51057:295:0:o;102626:134::-;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;102717:19:0;;;::::1;;::::0;;;:10:::1;:19;::::0;;;;:35;;-1:-1:-1;;102717:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;102626:134::o;105486:154::-;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;105561:18:::1;:28:::0;;;::::1;;-1:-1:-1::0;;;105561:28:0::1;-1:-1:-1::0;;105561:28:0;;::::1;;::::0;;105605:27:::1;::::0;::::1;::::0;::::1;::::0;105582:7;179:14:1;172:22;154:41;;142:2;127:18;;14:187;61126:115:0;61186:7;61213:20;:18;:20::i;:::-;61206:27;;61126:115;:::o;51761:240::-;34535:10;51849:4;51930:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;51930:27:0;;;;;;;;;;51849:4;;34535:10;51905:66;;34535:10;;51930:27;;:40;;51960:10;;51930:40;:::i;:::-;51905:8;:66::i;64302:268::-;64400:7;64442:12;64428:11;:26;64420:70;;;;-1:-1:-1;;;64420:70:0;;10799:2:1;64420:70:0;;;10781:21:1;10838:2;10818:18;;;10811:30;10877:33;10857:18;;;10850:61;10928:18;;64420:70:0;10597:355:1;64420:70:0;-1:-1:-1;;;;;64527:21:0;;;;;;:12;:21;;;;;64508:54;;64550:11;64508:18;:54::i;:::-;64501:61;64302:268;-1:-1:-1;;;64302:268:0:o;80392:91::-;80448:27;34535:10;80468:6;80448:5;:27::i;:::-;80392:91;:::o;103487:94::-;103522:13;;-1:-1:-1;;;;;103522:13:0;:28;34535:10;103522:51;;-1:-1:-1;;;;;;103522:51:0;;;;;;;-1:-1:-1;;;;;1862:32:1;;;103522:51:0;;;1844::1;1817:18;;103522:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;75940:266::-;-1:-1:-1;;;;;76104:33:0;;76027:7;76104:33;;;:24;:33;;;;;76027:7;;;;76083:55;;76092:10;;76083:8;:55::i;:::-;76047:91;;;;76158:11;:40;;76180:18;76190:7;76180:9;:18::i;:::-;76158:40;;;76172:5;76158:40;76151:47;75940:266;-1:-1:-1;;;;;75940:266:0:o;106528:594::-;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;106626:24:0;::::1;106618:93;;;::::0;-1:-1:-1;;;106618:93:0;;11633:2:1;106618:93:0::1;::::0;::::1;11615:21:1::0;11672:2;11652:18;;;11645:30;11711:34;11691:18;;;11684:62;11782:26;11762:18;;;11755:54;11826:19;;106618:93:0::1;11431:420:1::0;106618:93:0::1;106728:3;:8;;106735:1;106728:8:::0;106724:334:::1;;106753:8;:21:::0;;-1:-1:-1;;;;;;106753:21:0::1;-1:-1:-1::0;;;;;106753:21:0;::::1;;::::0;;106724:334:::1;;;106796:3;:8;;106803:1;106796:8:::0;106792:266:::1;;106821:8;:21:::0;;-1:-1:-1;;;;;;106821:21:0::1;-1:-1:-1::0;;;;;106821:21:0;::::1;;::::0;;106792:266:::1;;;106864:3;:8;;106871:1;106864:8:::0;106860:198:::1;;106889:8;:21:::0;;-1:-1:-1;;;;;;106889:21:0::1;-1:-1:-1::0;;;;;106889:21:0;::::1;;::::0;;106860:198:::1;;;106932:3;:8;;106939:1;106932:8:::0;106928:130:::1;;106957:8;:21:::0;;-1:-1:-1;;;;;;106957:21:0::1;-1:-1:-1::0;;;;;106957:21:0;::::1;;::::0;;106928:130:::1;;;107000:3;:8;;107007:1;107000:8:::0;106996:62:::1;;107025:8;:21:::0;;-1:-1:-1;;;;;;107025:21:0::1;-1:-1:-1::0;;;;;107025:21:0;::::1;;::::0;;106996:62:::1;107075:39;::::0;3469:4:1;3457:17;;3439:36;;-1:-1:-1;;;;;107075:39:0;::::1;::::0;::::1;::::0;3427:2:1;3412:18;107075:39:0::1;;;;;;;;106528:594:::0;;:::o;66775:114::-;66847:34;34535:10;66871:9;66847;:34::i;63432:151::-;-1:-1:-1;;;;;63546:21:0;;63502:6;63546:21;;;:12;:21;;;;;:28;63528:47;;:17;:47::i;49216:127::-;-1:-1:-1;;;;;49317:18:0;49290:7;49317:18;;;;;;;;;;;;49216:127::o;36372:103::-;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;36437:30:::1;36464:1;36437:18;:30::i;:::-;36372:103::o:0;105971:115::-;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;106025:14:::1;:22:::0;;-1:-1:-1;;106025:22:0::1;::::0;;106063:15:::1;::::0;::::1;::::0;106042:5:::1;::::0;106063:15:::1;105971:115::o:0;101742:214::-;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;101837:40:0;::::1;;::::0;;;:31:::1;:40;::::0;;;;;;;;:51;;-1:-1:-1;;101837:51:0::1;::::0;::::1;;::::0;;::::1;::::0;;;101904:44;;154:41:1;;;101904:44:0::1;::::0;127:18:1;101904:44:0::1;14:187:1::0;80802:164:0;80879:46;80895:7;34535:10;80918:6;80879:15;:46::i;:::-;80936:22;80942:7;80951:6;80936:5;:22::i;:::-;80802:164;;:::o;104320:278::-;104553:13;;:37;;-1:-1:-1;;;104553:37:0;;-1:-1:-1;;;;;1862:32:1;;;104553:37:0;;;1844:51:1;104423:7:0;;;;;;;;;;104553:13;;;:28;;1817:18:1;;104553:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;104546:44;;;;-1:-1:-1;104546:44:0;;-1:-1:-1;104546:44:0;-1:-1:-1;104546:44:0;;-1:-1:-1;104320:278:0;-1:-1:-1;;104320:278:0:o;60868:128::-;-1:-1:-1;;;;;60964:14:0;;60937:7;60964:14;;;:7;:14;;;;;30446;60964:24;30354:114;104606:117;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;104661:11:::1;:18:::0;;-1:-1:-1;;104661:18:0::1;-1:-1:-1::0;;;104661:18:0::1;::::0;;104703:12:::1;104690:10;:25:::0;104606:117::o;64859:259::-;64946:7;64988:12;64974:11;:26;64966:70;;;;-1:-1:-1;;;64966:70:0;;10799:2:1;64966:70:0;;;10781:21:1;10838:2;10818:18;;;10811:30;10877:33;10857:18;;;10850:61;10928:18;;64966:70:0;10597:355:1;64966:70:0;65054:56;65073:23;65098:11;65054:18;:56::i;106094:120::-;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;106151:14:::1;:21:::0;;-1:-1:-1;;106151:21:0::1;106168:4;106151:21;::::0;;106188:18:::1;::::0;::::1;::::0;106151:14:::1;::::0;106188:18:::1;106094:120::o:0;48144:104::-;48200:13;48233:7;48226:14;;;;;:::i;109045:67::-;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;109093:11:::1;:9;:11::i;76310:234::-:0;76382:7;76403:16;76421:13;76438:43;76447:10;76459:21;76438:8;:43::i;:::-;76402:79;;;;76501:11;:35;;49133:12;;76501:35;;;76515:5;76501:35;76494:42;76310:234;-1:-1:-1;;;;76310:234:0:o;102768:246::-;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;102877:13:::1;-1:-1:-1::0;;;;;102869:21:0::1;:4;-1:-1:-1::0;;;;;102869:21:0::1;::::0;102861:91:::1;;;::::0;-1:-1:-1;;;102861:91:0;;12560:2:1;102861:91:0::1;::::0;::::1;12542:21:1::0;12599:2;12579:18;;;12572:30;12638:34;12618:18;;;12611:62;12709:27;12689:18;;;12682:55;12754:19;;102861:91:0::1;12358:421:1::0;102861:91:0::1;102963:43;102992:4;102998:7;102963:28;:43::i;63888:212::-:0;-1:-1:-1;;;;;63995:21:0;;63961:7;63995:21;;;:12;:21;;;;;:28;64041:8;;:51;;-1:-1:-1;;;;;64056:21:0;;;;;;:12;:21;;;;;64078:7;64084:1;64078:3;:7;:::i;:::-;64056:30;;;;;;;;:::i;:::-;;;;;;;;;;:36;-1:-1:-1;;;64056:36:0;;-1:-1:-1;;;;;64056:36:0;64041:51;;;64052:1;64041:51;-1:-1:-1;;;;;64034:58:0;;63888:212;-1:-1:-1;;;63888:212:0:o;106375:145::-;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;106444:16:::1;:26:::0;;;::::1;;-1:-1:-1::0;;;106444:26:0::1;-1:-1:-1::0;;;;106444:26:0;;::::1;;::::0;;106486::::1;::::0;::::1;::::0;::::1;::::0;106463:7;179:14:1;172:22;154:41;;142:2;127:18;;14:187;52504:438:0;34535:10;52597:4;52680:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;52680:27:0;;;;;;;;;;52597:4;;34535:10;52726:35;;;;52718:85;;;;-1:-1:-1;;;52718:85:0;;13248:2:1;52718:85:0;;;13230:21:1;13287:2;13267:18;;;13260:30;13326:34;13306:18;;;13299:62;-1:-1:-1;;;13377:18:1;;;13370:35;13422:19;;52718:85:0;13046:401:1;52718:85:0;52839:60;52848:5;52855:7;52883:15;52864:16;:34;52839:8;:60::i;104731:138::-;104822:13;;:39;;-1:-1:-1;;;104822:39:0;;-1:-1:-1;;;;;1862:32:1;;;104822:39:0;;;1844:51:1;104795:7:0;;104822:13;;:30;;1817:18:1;;104822:39:0;1698:203:1;106222:145:0;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;106291:16:::1;:26:::0;;;::::1;;-1:-1:-1::0;;;106291:26:0::1;-1:-1:-1::0;;;;106291:26:0;;::::1;;::::0;;106333::::1;::::0;::::1;::::0;::::1;::::0;106310:7;179:14:1;172:22;154:41;;142:2;127:18;;14:187;49549:193:0;49628:4;34535:10;49684:28;34535:10;49701:2;49705:6;49684:9;:28::i;104018:140::-;104110:13;;:40;;-1:-1:-1;;;104110:40:0;;-1:-1:-1;;;;;1862:32:1;;;104110:40:0;;;1844:51:1;104083:7:0;;104110:13;;:31;;1817:18:1;;104110:40:0;1698:203:1;105039:160:0;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;105116:18:::1;:27:::0;;;105159:32:::1;::::0;740:25:1;;;105159:32:0::1;::::0;728:2:1;713:18;105159:32:0::1;594:177:1::0;101964:182:0;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;102049:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;102049:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;102104:34;;154:41:1;;;102104:34:0::1;::::0;127:18:1;102104:34:0::1;14:187:1::0;105812:151:0;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;105901:14:::1;:6:::0;105911:3:::1;105901:14;:::i;:::-;105889:9;:26:::0;105931:24:::1;::::0;740:25:1;;;105931:24:0::1;::::0;728:2:1;713:18;105931:24:0::1;594:177:1::0;66971:591:0;67198:6;67179:15;:25;;67171:67;;;;-1:-1:-1;;;67171:67:0;;13654:2:1;67171:67:0;;;13636:21:1;13693:2;13673:18;;;13666:30;13732:31;13712:18;;;13705:59;13781:18;;67171:67:0;13452:353:1;67171:67:0;67321:58;;;62882:71;67321:58;;;14041:25:1;-1:-1:-1;;;;;14102:32:1;;14082:18;;;14075:60;;;;14151:18;;;14144:34;;;14194:18;;;14187:34;;;67249:14:0;;67266:174;;67294:87;;14013:19:1;;67321:58:0;;;;;;;;;;;;67311:69;;;;;;67294:16;:87::i;:::-;67396:1;67412;67428;67266:13;:174::i;:::-;67249:191;;67468:17;67478:6;67468:9;:17::i;:::-;67459:5;:26;67451:64;;;;-1:-1:-1;;;67451:64:0;;14434:2:1;67451:64:0;;;14416:21:1;14473:2;14453:18;;;14446:30;14512:27;14492:18;;;14485:55;14557:18;;67451:64:0;14232:349:1;67451:64:0;67526:28;67536:6;67544:9;67526;:28::i;:::-;67160:402;66971:591;;;;;;:::o;105348:130::-;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;105415:10:::1;:20:::0;;;::::1;;-1:-1:-1::0;;;105415:20:0::1;-1:-1:-1::0;;105415:20:0;;::::1;;::::0;;105451:19:::1;::::0;::::1;::::0;::::1;::::0;105428:7;179:14:1;172:22;154:41;;142:2;127:18;;14:187;102154::0;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;102244:33:0;::::1;;::::0;;;:24:::1;:33;::::0;;;;;;;;:44;;-1:-1:-1;;102244:44:0::1;::::0;::::1;;;::::0;;102304:29;;1844:51:1;;;102304:29:0::1;::::0;1817:18:1;102304:29:0::1;;;;;;;102154:187:::0;;:::o;60157:645::-;60401:8;60382:15;:27;;60374:69;;;;-1:-1:-1;;;60374:69:0;;14788:2:1;60374:69:0;;;14770:21:1;14827:2;14807:18;;;14800:30;14866:31;14846:18;;;14839:59;14915:18;;60374:69:0;14586:353:1;60374:69:0;60456:18;60498:16;60516:5;60523:7;60532:5;60539:16;60549:5;60539:9;:16::i;:::-;60487:79;;;;;;15231:25:1;;;;-1:-1:-1;;;;;15330:15:1;;;15310:18;;;15303:43;15382:15;;;;15362:18;;;15355:43;15414:18;;;15407:34;15457:19;;;15450:35;15501:19;;;15494:35;;;15203:19;;60487:79:0;;;;;;;;;;;;60477:90;;;;;;60456:111;;60580:12;60595:28;60612:10;60595:16;:28::i;:::-;60580:43;;60636:14;60653:28;60667:4;60673:1;60676;60679;60653:13;:28::i;:::-;60636:45;;60710:5;-1:-1:-1;;;;;60700:15:0;:6;-1:-1:-1;;;;;60700:15:0;;60692:58;;;;-1:-1:-1;;;60692:58:0;;15742:2:1;60692:58:0;;;15724:21:1;15781:2;15761:18;;;15754:30;15820:32;15800:18;;;15793:60;15870:18;;60692:58:0;15540:354:1;60692:58:0;60763:31;60772:5;60779:7;60788:5;60763:8;:31::i;:::-;60363:439;;;60157:645;;;;;;;:::o;107401:807::-;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;107729:9:::1;107711:15;;:27;;;;;;;;;;;;;;;;;;107760:6;107749:8;:17;;;;107795:9;107777:15;;:27;;;;;;;;;;;;;;;;;;107826:6;107815:8;:17;;;;107861:9;107843:15;;:27;;;;;;;;;;;;;;;;;;107892:6;107881:8;:17;;;;107927:9;107909:15;;:27;;;;;;;;;;;;;;;;;;107958:6;107947:8;:17;;;;107993:9;107975:15;;:27;;;;;;;;;;;;;;;;;;108024:6;108013:8;:17;;;;108094:6;108085;108076;108067;108058;:15;;;;:::i;:::-;:24;;;;:::i;:::-;:33;;;;:::i;:::-;:42;;;;:::i;:::-;108043:12;:57:::0;;;108135:2:::1;-1:-1:-1::0;108119:18:0::1;108111:60;;;::::0;-1:-1:-1;;;108111:60:0;;16101:2:1;108111:60:0::1;::::0;::::1;16083:21:1::0;16140:2;16120:18;;;16113:30;16179:31;16159:18;;;16152:59;16228:18;;108111:60:0::1;15899:353:1::0;108111:60:0::1;108187:13;::::0;::::1;::::0;;;::::1;107401:807:::0;;;;;;;;;;:::o;105207:133::-;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;105275:11:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;105275:21:0::1;-1:-1:-1::0;;105275:21:0;;::::1;;::::0;;105312:20:::1;::::0;::::1;::::0;::::1;::::0;105289:7;179:14:1;172:22;154:41;;142:2;127:18;;14:187;108217:820:0;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;108547:9:::1;108528:16;;:28;;;;;;;;;;;;;;;;;;108579:6;108567:9;:18;;;;108615:9;108596:16;;:28;;;;;;;;;;;;;;;;;;108647:6;108635:9;:18;;;;108683:9;108664:16;;:28;;;;;;;;;;;;;;;;;;108715:6;108703:9;:18;;;;108751:9;108732:16;;:28;;;;;;;;;;;;;;;;;;108783:6;108771:9;:18;;;;108819:9;108800:16;;:28;;;;;;;;;;;;;;;;;;108851:6;108839:9;:18;;;;108922:6;108913;108904;108895;108886;:15;;;;:::i;:::-;:24;;;;:::i;:::-;:33;;;;:::i;:::-;:42;;;;:::i;:::-;108870:13;:58:::0;;;108964:2:::1;-1:-1:-1::0;108947:19:0::1;108939:61;;;::::0;-1:-1:-1;;;108939:61:0;;16101:2:1;108939:61:0::1;::::0;::::1;16083:21:1::0;16140:2;16120:18;;;16113:30;16179:31;16159:18;;;16152:59;16228:18;;108939:61:0::1;15899:353:1::0;104877:154:0;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;104952:18:::1;:28:::0;;;::::1;;-1:-1:-1::0;;;104952:28:0::1;-1:-1:-1::0;;104952:28:0;;::::1;;::::0;;104996:27:::1;::::0;::::1;::::0;::::1;::::0;104973:7;179:14:1;172:22;154:41;;142:2;127:18;;14:187;107183:210:0;35794:6;;107243:4;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;-1:-1:-1;107260:20:0::1;:28:::0;;-1:-1:-1;;107260:28:0::1;::::0;;:20:::1;107183:210:::0;:::o;63202:150::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;63318:21:0;;;;;;:12;:21;;;;;:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;;63311:33;;;;;;;;;63318:26;;63311:33;;;;;;-1:-1:-1;;;63311:33:0;;-1:-1:-1;;;;;63311:33:0;;;;;;;;;63202:150;-1:-1:-1;;;63202:150:0:o;103222:257::-;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;103312:24:0;::::1;103304:70;;;::::0;-1:-1:-1;;;103304:70:0;;16459:2:1;103304:70:0::1;::::0;::::1;16441:21:1::0;16498:2;16478:18;;;16471:30;16537:34;16517:18;;;16510:62;-1:-1:-1;;;16588:18:1;;;16581:31;16629:19;;103304:70:0::1;16257:397:1::0;103304:70:0::1;103385:13;:42:::0;;-1:-1:-1;;;;;;103385:42:0::1;-1:-1:-1::0;;;;;103385:42:0;::::1;::::0;;::::1;::::0;;;103443:28:::1;::::0;::::1;::::0;-1:-1:-1;;103443:28:0::1;103222:257:::0;:::o;36630:201::-;35794:6;;-1:-1:-1;;;;;35794:6:0;34535:10;35941:23;35933:68;;;;-1:-1:-1;;;35933:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36719:22:0;::::1;36711:73;;;::::0;-1:-1:-1;;;36711:73:0;;16861:2:1;36711:73:0::1;::::0;::::1;16843:21:1::0;16900:2;16880:18;;;16873:30;16939:34;16919:18;;;16912:62;-1:-1:-1;;;16990:18:1;;;16983:36;17036:19;;36711:73:0::1;16659:402:1::0;36711:73:0::1;36795:28;36814:8;36795:18;:28::i;103589:235::-:0;103635:18;;-1:-1:-1;;;103635:18:0;;;;103627:63;;;;-1:-1:-1;;;103627:63:0;;17268:2:1;103627:63:0;;;17250:21:1;;;17287:18;;;17280:30;17346:34;17326:18;;;17319:62;17398:18;;103627:63:0;17066:356:1;103627:63:0;103701:13;:20;;-1:-1:-1;;103701:20:0;;;;;103732:13;;-1:-1:-1;;;;;103732:13:0;:29;103770:12;34535:10;;34455:98;103770:12;103732:52;;-1:-1:-1;;;;;;103732:52:0;;;;;;;-1:-1:-1;;;;;1862:32:1;;;103732:52:0;;;1844:51:1;1817:18;;103732:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;103795:13:0;:21;;-1:-1:-1;;103795:21:0;;;103589:235::o;67868:290::-;67953:28;67965:7;67974:6;67953:11;:28::i;:::-;49133:12;;-1:-1:-1;;;;;;68000:29:0;67992:90;;;;-1:-1:-1;;;67992:90:0;;17629:2:1;67992:90:0;;;17611:21:1;17668:2;17648:18;;;17641:30;17707:34;17687:18;;;17680:62;-1:-1:-1;;;17758:18:1;;;17751:46;17814:19;;67992:90:0;17427:412:1;67992:90:0;68095:55;68112:23;68137:4;68143:6;68095:16;:55::i;:::-;;;67868:290;;:::o;54379:399::-;-1:-1:-1;;;;;54463:21:0;;54455:65;;;;-1:-1:-1;;;54455:65:0;;18046:2:1;54455:65:0;;;18028:21:1;18085:2;18065:18;;;18058:30;18124:33;18104:18;;;18097:61;18175:18;;54455:65:0;17844:355:1;54455:65:0;54533:49;54562:1;54566:7;54575:6;54533:20;:49::i;:::-;54611:6;54595:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;54628:18:0;;:9;:18;;;;;;;;;;:28;;54650:6;;54628:9;:28;;54650:6;;54628:28;:::i;:::-;;;;-1:-1:-1;;54672:37:0;;740:25:1;;;-1:-1:-1;;;;;54672:37:0;;;54689:1;;54672:37;;728:2:1;713:18;54672:37:0;;;;;;;54722:48;54750:1;54754:7;54763:6;54722:19;:48::i;70712:98::-;70770:7;70797:5;70801:1;70797;:5;:::i;1901:195::-;1958:7;-1:-1:-1;;;;;1986:26:0;;;1978:78;;;;-1:-1:-1;;;1978:78:0;;18406:2:1;1978:78:0;;;18388:21:1;18445:2;18425:18;;;18418:30;18484:34;18464:18;;;18457:62;-1:-1:-1;;;18535:18:1;;;18528:37;18582:19;;1978:78:0;18204:403:1;1978:78:0;-1:-1:-1;2082:5:0;1901:195::o;3871:190::-;3927:6;3963:16;3954:25;;;3946:76;;;;-1:-1:-1;;;3946:76:0;;18814:2:1;3946:76:0;;;18796:21:1;18853:2;18833:18;;;18826:30;18892:34;18872:18;;;18865:62;-1:-1:-1;;;18943:18:1;;;18936:36;18989:19;;3946:76:0;18612:402:1;76761:622:0;-1:-1:-1;;;;;76965:18:0;;76961:415;;77021:26;77044:2;77021:22;:26::i;:::-;77062:28;:26;:28::i;:::-;76761:622;;;:::o;76961:415::-;-1:-1:-1;;;;;77112:16:0;;77108:268;;77166:28;77189:4;77166:22;:28::i;77108:268::-;77295:28;77318:4;77295:22;:28::i;:::-;77338:26;77361:2;77338:22;:26::i;68586:262::-;-1:-1:-1;;;;;63777:19:0;;;63750:7;63777:19;;;:10;:19;;;;;;;;;;;;;;;68784:56;;63777:19;;;;;68833:6;68784:16;:56::i;70818:103::-;70881:7;70908:5;70912:1;70908;:5;:::i;30354:114::-;30446:14;;30354:114::o;56140:380::-;-1:-1:-1;;;;;56276:19:0;;56268:68;;;;-1:-1:-1;;;56268:68:0;;19221:2:1;56268:68:0;;;19203:21:1;19260:2;19240:18;;;19233:30;19299:34;19279:18;;;19272:62;-1:-1:-1;;;19350:18:1;;;19343:34;19394:19;;56268:68:0;19019:400:1;56268:68:0;-1:-1:-1;;;;;56355:21:0;;56347:68;;;;-1:-1:-1;;;56347:68:0;;19626:2:1;56347:68:0;;;19608:21:1;19665:2;19645:18;;;19638:30;19704:34;19684:18;;;19677:62;-1:-1:-1;;;19755:18:1;;;19748:32;19797:19;;56347:68:0;19424:398:1;56347:68:0;-1:-1:-1;;;;;56428:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;56480:32;;740:25:1;;;56480:32:0;;713:18:1;56480:32:0;;;;;;;56140:380;;;:::o;56807:453::-;-1:-1:-1;;;;;49921:18:0;;;56942:24;49921:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;57009:37:0;;57005:248;;57091:6;57071:16;:26;;57063:68;;;;-1:-1:-1;;;57063:68:0;;20029:2:1;57063:68:0;;;20011:21:1;20068:2;20048:18;;;20041:30;20107:31;20087:18;;;20080:59;20156:18;;57063:68:0;19827:353:1;57063:68:0;57175:51;57184:5;57191:7;57219:6;57200:16;:25;57175:8;:51::i;109751:5914::-;-1:-1:-1;;;;;109883:18:0;;109875:72;;;;-1:-1:-1;;;109875:72:0;;20387:2:1;109875:72:0;;;20369:21:1;20426:2;20406:18;;;20399:30;20465:34;20445:18;;;20438:62;-1:-1:-1;;;20516:18:1;;;20509:39;20565:19;;109875:72:0;20185:405:1;109875:72:0;-1:-1:-1;;;;;109966:16:0;;109958:68;;;;-1:-1:-1;;;109958:68:0;;20797:2:1;109958:68:0;;;20779:21:1;20836:2;20816:18;;;20809:30;20875:34;20855:18;;;20848:62;-1:-1:-1;;;20926:18:1;;;20919:37;20973:19;;109958:68:0;20595:403:1;109958:68:0;-1:-1:-1;;;;;110046:16:0;;;;;;:10;:16;;;;;;;;110045:17;110037:62;;;;-1:-1:-1;;;110037:62:0;;21205:2:1;110037:62:0;;;21187:21:1;;;21224:18;;;21217:30;21283:34;21263:18;;;21256:62;21335:18;;110037:62:0;21003:356:1;110037:62:0;-1:-1:-1;;;;;110119:14:0;;;;;;:10;:14;;;;;;;;110118:15;110110:63;;;;-1:-1:-1;;;110110:63:0;;21566:2:1;110110:63:0;;;21548:21:1;21605:2;21585:18;;;21578:30;21644:34;21624:18;;;21617:62;-1:-1:-1;;;21695:18:1;;;21688:33;21738:19;;110110:63:0;21364:399:1;110110:63:0;110191:6;110201:1;110191:11;110187:93;;110219:28;110235:4;110241:2;110245:1;110219:15;:28::i;110187:93::-;110297:14;;;;110293:1814;;;35794:6;;-1:-1:-1;;;;;110350:15:0;;;35794:6;;110350:15;;;;:49;;-1:-1:-1;35794:6:0;;-1:-1:-1;;;;;110386:13:0;;;35794:6;;110386:13;;110350:49;:86;;;;-1:-1:-1;;;;;;110420:16:0;;;;110350:86;:128;;;;-1:-1:-1;;;;;;110457:21:0;;110471:6;110457:21;;110350:128;:158;;;;-1:-1:-1;110500:8:0;;;;;;;110499:9;110350:158;110328:1768;;;110548:11;;-1:-1:-1;;;110548:11:0;;;;110543:148;;-1:-1:-1;;;;;110592:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;110621:23:0;;;;;;:19;:23;;;;;;;;110592:52;110584:87;;;;-1:-1:-1;;;110584:87:0;;21970:2:1;110584:87:0;;;21952:21:1;22009:2;21989:18;;;21982:30;-1:-1:-1;;;22028:18:1;;;22021:52;22090:18;;110584:87:0;21768:346:1;110584:87:0;110850:20;;;;;;;110846:423;;;35794:6;;-1:-1:-1;;;;;110898:13:0;;;35794:6;;110898:13;;;;:47;;;110929:15;-1:-1:-1;;;;;110915:30:0;:2;-1:-1:-1;;;;;110915:30:0;;;110898:47;:79;;;;;110963:13;-1:-1:-1;;;;;110949:28:0;:2;-1:-1:-1;;;;;110949:28:0;;;110898:79;110894:356;;;111043:9;111014:39;;;;:28;:39;;;;;;111056:12;-1:-1:-1;111006:139:0;;;;-1:-1:-1;;;111006:139:0;;22321:2:1;111006:139:0;;;22303:21:1;22360:2;22340:18;;;22333:30;22399:34;22379:18;;;22372:62;22470:34;22450:18;;;22443:62;-1:-1:-1;;;22521:19:1;;;22514:39;22570:19;;111006:139:0;22119:476:1;111006:139:0;111201:9;111172:39;;;;:28;:39;;;;;111214:12;111172:54;;110894:356;-1:-1:-1;;;;;111322:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;111358:35:0;;;;;;:31;:35;;;;;;;;111357:36;111322:71;111318:763;;;111440:20;;111430:6;:30;;111422:96;;;;-1:-1:-1;;;111422:96:0;;22802:2:1;111422:96:0;;;22784:21:1;22841:2;22821:18;;;22814:30;22880:34;22860:18;;;22853:62;-1:-1:-1;;;22931:18:1;;;22924:51;22992:19;;111422:96:0;22600:417:1;111422:96:0;111579:9;;111562:13;111572:2;111562:9;:13::i;:::-;111553:22;;:6;:22;:::i;:::-;:35;;111545:67;;;;-1:-1:-1;;;111545:67:0;;23224:2:1;111545:67:0;;;23206:21:1;23263:2;23243:18;;;23236:30;-1:-1:-1;;;23282:18:1;;;23275:49;23341:18;;111545:67:0;23022:343:1;111545:67:0;111318:763;;;-1:-1:-1;;;;;111691:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;111725:37:0;;;;;;:31;:37;;;;;;;;111724:38;111691:71;111687:394;;;111809:20;;111799:6;:30;;111791:97;;;;-1:-1:-1;;;111791:97:0;;23572:2:1;111791:97:0;;;23554:21:1;23611:2;23591:18;;;23584:30;23650:34;23630:18;;;23623:62;-1:-1:-1;;;23701:18:1;;;23694:52;23763:19;;111791:97:0;23370:418:1;111687:394:0;-1:-1:-1;;;;;111935:35:0;;;;;;:31;:35;;;;;;;;111931:150;;112028:9;;112011:13;112021:2;112011:9;:13::i;:::-;112002:22;;:6;:22;:::i;:::-;:35;;111994:67;;;;-1:-1:-1;;;111994:67:0;;23224:2:1;111994:67:0;;;23206:21:1;23263:2;23243:18;;;23236:30;-1:-1:-1;;;23282:18:1;;;23275:49;23341:18;;111994:67:0;23022:343:1;111994:67:0;112168:10;;:14;;112181:1;112168:14;:::i;:::-;112151:12;:32;;:69;;;;;112207:13;-1:-1:-1;;;;;112201:19:0;:2;-1:-1:-1;;;;;112201:19:0;;;112151:69;:144;;;;-1:-1:-1;;;;;;112238:57:0;;112252:42;112238:57;;112151:144;112147:243;;;-1:-1:-1;;;;;112322:14:0;;;;;;:10;:14;;;;;;:21;;-1:-1:-1;;112322:21:0;112339:4;112322:21;;;112363:15;;;112322:14;112363:15;112147:243;112403:28;112434:24;112452:4;112434:9;:24::i;:::-;112510:18;;112559:11;;112403:55;;-1:-1:-1;112486:42:0;;;;-1:-1:-1;;;112559:11:0;;;;:43;;;;;112595:7;112559:43;:77;;;;-1:-1:-1;112628:8:0;;;;;;;112627:9;112559:77;:156;;;;-1:-1:-1;;;;;;112684:31:0;;;;;;:25;:31;;;;;;;;112683:32;112559:156;:254;;;;;112797:15;-1:-1:-1;;;;;112781:32:0;:4;-1:-1:-1;;;;;112781:32:0;;;112559:254;:324;;;;-1:-1:-1;35794:6:0;;-1:-1:-1;;;;;112868:15:0;;;35794:6;;112868:15;;112559:324;:354;;;;-1:-1:-1;35794:6:0;;-1:-1:-1;;;;;112900:13:0;;;35794:6;;112900:13;;112559:354;112541:578;;;112940:8;:15;;-1:-1:-1;;112940:15:0;;;;;112972:57;112985:20;113007:21;112972:12;:57::i;:::-;113061:15;113046:12;:30;113091:8;:16;;-1:-1:-1;;113091:16:0;;;112541:578;113131:12;113190:13;-1:-1:-1;;;;;113174:30:0;:4;-1:-1:-1;;;;;113174:30:0;;:75;;;;113235:13;-1:-1:-1;;;;;113221:28:0;:2;-1:-1:-1;;;;;113221:28:0;;113174:75;:121;;;-1:-1:-1;;;;;;113266:29:0;;;;;;:25;:29;;;;;;;;113174:121;:169;;;-1:-1:-1;;;;;;113312:31:0;;;;;;:25;:31;;;;;;;;113174:169;:204;;;-1:-1:-1;113360:18:0;;-1:-1:-1;;;113360:18:0;;;;113174:204;113156:275;;;-1:-1:-1;113415:4:0;113156:275;-1:-1:-1;;;;;113447:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;113476:23:0;;;;;;:19;:23;;;;;;;;113447:52;:64;;;-1:-1:-1;113503:8:0;;;;;;;113447:64;:81;;;-1:-1:-1;113515:13:0;;;;;;;113447:81;:96;;;-1:-1:-1;113533:10:0;;-1:-1:-1;;;113533:10:0;;;;113532:11;113447:96;113443:144;;;-1:-1:-1;113570:5:0;113443:144;113677:7;113673:1806;;;-1:-1:-1;;;;;113756:29:0;;113701:12;113756:29;;;:25;:29;;;;;;;;:50;;;;;113805:1;113789:13;;:17;113756:50;113752:1576;;;113861:5;113844:13;;113835:6;:22;;;;:::i;:::-;113834:32;;;;:::i;:::-;113889:16;;113827:39;;-1:-1:-1;;;;113889:16:0;;;;113885:112;;;113964:13;;113952:9;;113945:16;;:4;:16;:::i;:::-;:32;;;;:::i;:::-;113930:11;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;113885:112:0;114019:16;;-1:-1:-1;;;114019:16:0;;;;114015:112;;;114094:13;;114082:9;;114075:16;;:4;:16;:::i;:::-;:32;;;;:::i;:::-;114060:11;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;114015:112:0;114149:16;;-1:-1:-1;;;114149:16:0;;;;114145:112;;;114224:13;;114212:9;;114205:16;;:4;:16;:::i;:::-;:32;;;;:::i;:::-;114190:11;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;114145:112:0;114279:16;;-1:-1:-1;;;114279:16:0;;;;114275:112;;;114354:13;;114342:9;;114335:16;;:4;:16;:::i;:::-;:32;;;;:::i;:::-;114320:11;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;114275:112:0;114409:16;;-1:-1:-1;;;114409:16:0;;;;114405:112;;;114484:13;;114472:9;;114465:16;;:4;:16;:::i;:::-;:32;;;;:::i;:::-;114450:11;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;114405:112:0;113752:1576;;;-1:-1:-1;;;;;114565:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;114615:1;114600:12;;:16;114565:51;114561:767;;;114670:5;114654:12;;114645:6;:21;;;;:::i;:::-;114644:31;;;;:::i;:::-;114700:15;;114637:38;;-1:-1:-1;114700:15:0;;114696:109;;;114773:12;;114762:8;;114755:15;;:4;:15;:::i;:::-;:30;;;;:::i;:::-;114740:11;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;114696:109:0;114827:15;;;;;;;114823:109;;;114900:12;;114889:8;;114882:15;;:4;:15;:::i;:::-;:30;;;;:::i;:::-;114867:11;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;114823:109:0;114954:15;;;;;;;114950:109;;;115027:12;;115016:8;;115009:15;;:4;:15;:::i;:::-;:30;;;;:::i;:::-;114994:11;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;114950:109:0;115081:15;;;;;;;115077:109;;;115154:12;;115143:8;;115136:15;;:4;:15;:::i;:::-;:30;;;;:::i;:::-;115121:11;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;115077:109:0;115208:15;;-1:-1:-1;;;115208:15:0;;;;115204:109;;;115281:12;;115270:8;;115263:15;;:4;:15;:::i;:::-;:30;;;;:::i;:::-;115248:11;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;115204:109:0;115345:14;115355:4;115345:14;;:::i;:::-;;-1:-1:-1;115378:8:0;;115374:94;;115410:42;115426:4;115440;115447;115410:15;:42::i;:::-;113686:1793;113673:1806;115492:33;115508:4;115514:2;115518:6;115492:15;:33::i;:::-;115538:13;;-1:-1:-1;;;;;115538:13:0;:24;115571:4;115578:15;115571:4;115578:9;:15::i;:::-;115538:56;;-1:-1:-1;;;;;;115538:56:0;;;;;;;-1:-1:-1;;;;;24223:32:1;;;115538:56:0;;;24205:51:1;24272:18;;;24265:34;24178:18;;115538:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;115605:13:0;;-1:-1:-1;;;;;115605:13:0;;-1:-1:-1;115605:24:0;;-1:-1:-1;115638:2:0;115643:13;115638:2;115643:9;:13::i;:::-;115605:52;;-1:-1:-1;;;;;;115605:52:0;;;;;;;-1:-1:-1;;;;;24223:32:1;;;115605:52:0;;;24205:51:1;24272:18;;;24265:34;24178:18;;115605:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25756:314;25809:7;25841:4;-1:-1:-1;;;;;25850:12:0;25833:29;;:66;;;;;25883:16;25866:13;:33;25833:66;25829:234;;;-1:-1:-1;25923:24:0;;25756:314::o;25829:234::-;-1:-1:-1;26259:73:0;;;26009:10;26259:73;;;;29369:25:1;;;;26021:12:0;29410:18:1;;;29403:34;26035:15:0;29453:18:1;;;29446:34;26303:13:0;29496:18:1;;;29489:34;26326:4:0;29539:19:1;;;;29532:61;;;;26259:73:0;;;;;;;;;;29341:19:1;;;;26259:73:0;;;26249:84;;;;;;61126:115::o;65207:1482::-;66340:12;;65306:7;;;66389:236;66402:4;66396:3;:10;66389:236;;;66423:11;66437:23;66450:3;66455:4;66437:12;:23::i;:::-;66423:37;;66502:11;66479:5;66485:3;66479:10;;;;;;;;:::i;:::-;;;;;;;;;;:20;;;:34;66475:139;;;66541:3;66534:10;;66475:139;;;66591:7;:3;66597:1;66591:7;:::i;:::-;66585:13;;66475:139;66408:217;66389:236;;;66644:9;;:37;;66660:5;66666:8;66673:1;66666:4;:8;:::i;:::-;66660:15;;;;;;;;:::i;:::-;;;;;;;;;;:21;-1:-1:-1;;;66660:21:0;;-1:-1:-1;;;;;66660:21:0;66644:37;;;66656:1;66644:37;-1:-1:-1;;;;;66637:44:0;;65207:1482;-1:-1:-1;;;;;65207:1482:0:o;109611:132::-;109707:28;109719:7;109728:6;109707:11;:28::i;77391:1619::-;77480:4;77486:7;77527:1;77514:10;:14;77506:49;;;;-1:-1:-1;;;77506:49:0;;24512:2:1;77506:49:0;;;24494:21:1;24551:2;24531:18;;;24524:30;-1:-1:-1;;;24570:18:1;;;24563:52;24632:18;;77506:49:0;24310:346:1;77506:49:0;77588:23;:21;:23::i;:::-;77574:10;:37;;77566:79;;;;-1:-1:-1;;;77566:79:0;;24863:2:1;77566:79:0;;;24845:21:1;24902:2;24882:18;;;24875:30;24941:31;24921:18;;;24914:59;24990:18;;77566:79:0;24661:353:1;77566:79:0;78784:13;78800:40;:9;78829:10;78800:28;:40::i;:::-;78866:20;;78784:56;;-1:-1:-1;78857:29:0;;78853:150;;78911:5;78918:1;78903:17;;;;;;;78853:150;78961:4;78967:9;:16;;78984:5;78967:23;;;;;;;;:::i;:::-;;;;;;;;;78953:38;;;;;77391:1619;;;;;;:::o;69012:388::-;-1:-1:-1;;;;;63777:19:0;;;69097:23;63777:19;;;:10;:19;;;;;;;;;;69181:20;63777:19;69181:9;:20::i;:::-;-1:-1:-1;;;;;69212:21:0;;;;;;;:10;:21;;;;;;:33;;-1:-1:-1;;;;;;69212:33:0;;;;;;;;;;69263:54;;69154:47;;-1:-1:-1;69212:33:0;69263:54;;;;;;69212:21;69263:54;69330:62;69347:15;69364:9;69375:16;69330;:62::i;36991:191::-;37084:6;;;-1:-1:-1;;;;;37101:17:0;;;-1:-1:-1;;;;;;37101:17:0;;;;;;;37134:40;;37084:6;;;37101:17;37084:6;;37134:40;;37065:16;;37134:40;37054:128;36991:191;:::o;75412:223::-;75459:7;75479:30;:18;30565:19;;30583:1;30565:19;;;30476:127;75479:30;75522:17;75542:23;:21;:23::i;:::-;75522:43;;75581:19;75590:9;75581:19;;;;740:25:1;;728:2;713:18;;594:177;75581:19:0;;;;;;;;75618:9;75412:223;-1:-1:-1;75412:223:0:o;103022:192::-;-1:-1:-1;;;;;103107:31:0;;;;;;:25;:31;;;;;;:41;;-1:-1:-1;;103107:41:0;;;;;;;;;;103164:42;;103107:41;;:31;103164:42;;;103022:192;;:::o;26983:167::-;27060:7;27087:55;27109:20;:18;:20::i;:::-;27131:10;22480:57;;-1:-1:-1;;;22480:57:0;;;29862:27:1;29905:11;;;29898:27;;;29941:12;;;29934:28;;;22443:7:0;;29978:12:1;;22480:57:0;;;;;;;;;;;;22470:68;;;;;;22463:75;;22350:196;;;;;20659:279;20787:7;20808:17;20827:18;20849:25;20860:4;20866:1;20869;20872;20849:10;:25::i;:::-;20807:67;;;;20885:18;20897:5;20885:11;:18::i;:::-;-1:-1:-1;20921:9:0;20659:279;-1:-1:-1;;;;;20659:279:0:o;61379:207::-;-1:-1:-1;;;;;61500:14:0;;61439:15;61500:14;;;:7;:14;;;;;30446;;30583:1;30565:19;;;;30446:14;61561:17;61456:130;61379:207;;;:::o;70059:645::-;70296:12;;70233:17;;;;70331:8;;:35;;70346:5;70352:7;70358:1;70352:3;:7;:::i;:::-;70346:14;;;;;;;;:::i;:::-;;;;;;;;;;:20;-1:-1:-1;;;70346:20:0;;-1:-1:-1;;;;;70346:20:0;70331:35;;;70342:1;70331:35;-1:-1:-1;;;;;70319:47:0;;;70389:20;70392:9;70403:5;70389:2;:20;;:::i;:::-;70377:32;;70432:1;70426:3;:7;:51;;;;-1:-1:-1;70465:12:0;70437:5;70443:7;70449:1;70443:3;:7;:::i;:::-;70437:14;;;;;;;;:::i;:::-;;;;;;;;;;:24;;;:40;70426:51;70422:275;;;70517:29;70536:9;70517:18;:29::i;:::-;70494:5;70500:7;70506:1;70500:3;:7;:::i;:::-;70494:14;;;;;;;;:::i;:::-;;;;;;;;:20;;;:52;;;;;-1:-1:-1;;;;;70494:52:0;;;;;-1:-1:-1;;;;;70494:52:0;;;;;;70422:275;;;70579:5;70590:94;;;;;;;;70613:31;70631:12;70613:17;:31::i;:::-;70590:94;;;;;;70653:29;70672:9;70653:18;:29::i;:::-;-1:-1:-1;;;;;70590:94:0;;;;;;70579:106;;;;;;;-1:-1:-1;70579:106:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;70579:106:0;;;;;;;;;;;;70422:275;70271:433;70059:645;;;;;;:::o;109120:175::-;109243:44;109270:4;109276:2;109280:6;109243:26;:44::i;109303:170::-;109422:43;109448:4;109454:2;109458:6;109422:25;:43::i;79018:146::-;-1:-1:-1;;;;;79102:33:0;;;;;;:24;:33;;;;;79086:70;;79137:18;79127:7;79137:9;:18::i;:::-;79086:15;:70::i;79172:118::-;79229:53;79245:21;79268:13;49133:12;;;49045:108;69408:643;69540:3;-1:-1:-1;;;;;69533:10:0;:3;-1:-1:-1;;;;;69533:10:0;;;:24;;;;;69556:1;69547:6;:10;69533:24;69529:515;;;-1:-1:-1;;;;;69578:17:0;;;69574:224;;-1:-1:-1;;;;;69674:17:0;;69617;69674;;;:12;:17;;;;;69617;;69657:54;;69693:9;69704:6;69657:16;:54::i;:::-;69616:95;;;;69756:3;-1:-1:-1;;;;;69735:47:0;;69761:9;69772;69735:47;;;;;;25193:25:1;;;25249:2;25234:18;;25227:34;25181:2;25166:18;;25019:248;69735:47:0;;;;;;;;69597:201;;69574:224;-1:-1:-1;;;;;69818:17:0;;;69814:219;;-1:-1:-1;;;;;69914:17:0;;69857;69914;;;:12;:17;;;;;69857;;69897:49;;69933:4;69939:6;69897:16;:49::i;:::-;69856:90;;;;69991:3;-1:-1:-1;;;;;69970:47:0;;69996:9;70007;69970:47;;;;;;25193:25:1;;;25249:2;25234:18;;25227:34;25181:2;25166:18;;25019:248;69970:47:0;;;;;;;;69837:196;;69408:643;;;:::o;53421:671::-;-1:-1:-1;;;;;53552:18:0;;53544:68;;;;-1:-1:-1;;;53544:68:0;;25474:2:1;53544:68:0;;;25456:21:1;25513:2;25493:18;;;25486:30;25552:34;25532:18;;;25525:62;-1:-1:-1;;;25603:18:1;;;25596:35;25648:19;;53544:68:0;25272:401:1;53544:68:0;-1:-1:-1;;;;;53631:16:0;;53623:64;;;;-1:-1:-1;;;53623:64:0;;25880:2:1;53623:64:0;;;25862:21:1;25919:2;25899:18;;;25892:30;25958:34;25938:18;;;25931:62;-1:-1:-1;;;26009:18:1;;;26002:33;26052:19;;53623:64:0;25678:399:1;53623:64:0;53700:38;53721:4;53727:2;53731:6;53700:20;:38::i;:::-;-1:-1:-1;;;;;53773:15:0;;53751:19;53773:15;;;;;;;;;;;53807:21;;;;53799:72;;;;-1:-1:-1;;;53799:72:0;;26284:2:1;53799:72:0;;;26266:21:1;26323:2;26303:18;;;26296:30;26362:34;26342:18;;;26335:62;-1:-1:-1;;;26413:18:1;;;26406:36;26459:19;;53799:72:0;26082:402:1;53799:72:0;-1:-1:-1;;;;;53907:15:0;;;:9;:15;;;;;;;;;;;53925:20;;;53907:38;;53967:13;;;;;;;;:23;;53939:6;;53907:9;53967:23;;53939:6;;53967:23;:::i;:::-;;;;;;;;54023:2;-1:-1:-1;;;;;54008:26:0;54017:4;-1:-1:-1;;;;;54008:26:0;;54027:6;54008:26;;;;740:25:1;;728:2;713:18;;594:177;54008:26:0;;;;;;;;54047:37;54067:4;54073:2;54077:6;54047:19;:37::i;115673:5058::-;115760:1;115750:6;:11;115746:50;;115673:5058;;:::o;115746:50::-;115958:8;;115808:23;;;;-1:-1:-1;;;;;115958:8:0;115950:31;115946:136;;-1:-1:-1;116013:11:0;;116039:31;116013:11;116039:31;;:::i;:::-;;;115946:136;116266:8;;116223:20;;-1:-1:-1;;;;;116266:8:0;116258:31;116254:383;;116310:16;;-1:-1:-1;;;116310:16:0;;;;116306:320;;;116411:33;116425:4;116432:11;;116411:5;:33::i;:::-;116468:25;116481:11;;116468:25;;;;740::1;;728:2;713:18;;594:177;116468:25:0;;;;;;;;116306:320;;;-1:-1:-1;116549:11:0;;116579:31;116549:11;116579:31;;:::i;:::-;;;116306:320;116832:8;;116789:20;;-1:-1:-1;;;;;116832:8:0;116824:31;116820:687;;116876:16;;-1:-1:-1;;;116876:16:0;;;;116872:624;;;116985:13;;117034:11;;116977:91;;116959:12;;-1:-1:-1;;;;;116985:13:0;;117034:11;116959:12;116977:91;116959:12;116977:91;117034:11;116985:13;116977:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;116958:110;;;117091:7;117087:205;;;117128:40;;;25193:25:1;;;25249:2;25234:18;;25227:34;;;117128:40:0;;25166:18:1;117128:40:0;;;;;;;117087:205;;;-1:-1:-1;;;;;;;;;;;117222:50:0;;;;26901:2:1;26883:21;;;26920:18;;;26913:30;26979:34;26974:2;26959:18;;26952:62;27046:2;27031:18;;26699:356;117222:50:0;;;;;;;;117087:205;117341:8;;117351:11;;117310:53;;117334:4;;-1:-1:-1;;;;;117341:8:0;;;;117310:15;:53::i;:::-;116894:485;116872:624;;;-1:-1:-1;117419:11:0;;117449:31;117419:11;117449:31;;:::i;:::-;;;116872:624;117642:8;;117599:20;;-1:-1:-1;;;;;117642:8:0;117634:31;117630:136;;-1:-1:-1;117697:11:0;;117723:31;117697:11;117723:31;;:::i;:::-;;;117630:136;117902:8;;117859:20;;-1:-1:-1;;;;;117902:8:0;117894:31;117890:136;;-1:-1:-1;117957:11:0;;117983:31;117957:11;117983:31;;:::i;:::-;;;117890:136;118072:21;118104:36;118124:15;118104:19;:36::i;:::-;118151:21;118217:6;118176:37;118200:13;118176:21;:37;:::i;:::-;118175:48;;;;:::i;:::-;118294:1;118280:11;:15;;;118306:11;:15;;;118332:11;:15;;;118358:11;:15;;;118384:11;:15;;;118151:72;;-1:-1:-1;118510:15:0;118478:28;118494:12;118151:72;118478:28;:::i;:::-;118477:48;;;;:::i;:::-;118455:70;-1:-1:-1;118536:19:0;118591:15;118559:28;118575:12;118559:13;:28;:::i;:::-;118558:48;;;;:::i;:::-;118536:70;-1:-1:-1;118617:19:0;118672:15;118640:28;118656:12;118640:13;:28;:::i;:::-;118639:48;;;;:::i;:::-;118617:70;-1:-1:-1;118698:19:0;118753:15;118721:28;118737:12;118721:13;:28;:::i;:::-;118720:48;;;;:::i;:::-;118698:70;-1:-1:-1;118779:19:0;118834:15;118802:28;118818:12;118802:13;:28;:::i;:::-;118801:48;;;;:::i;:::-;118779:70;-1:-1:-1;118866:15:0;;118862:356;;118925:8;;118917:78;;118899:12;;-1:-1:-1;;;;;118925:8:0;;118965:11;;118899:12;118917:78;118899:12;118917:78;118965:11;118925:8;118917:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118898:97;;;119014:7;119010:197;;;119047:39;;;25193:25:1;;;25249:2;25234:18;;25227:34;;;119047:39:0;;25166:18:1;119047:39:0;;;;;;;119010:197;;;-1:-1:-1;;;;;;;;;;;119132:59:0;;;;27262:2:1;27244:21;;;27301:2;27281:18;;;27274:30;-1:-1:-1;;;;;;;;;;;27335:2:1;27320:18;;27313:62;-1:-1:-1;;;27406:2:1;27391:18;;27384:39;27455:3;27440:19;;27060:405;119132:59:0;;;;;;;;119010:197;118883:335;118862:356;119246:1;119232:11;:15;:36;;;;-1:-1:-1;119252:16:0;;-1:-1:-1;;;119252:16:0;;;;119251:17;119232:36;119228:377;;;119312:8;;119304:78;;119286:12;;-1:-1:-1;;;;;119312:8:0;;119352:11;;119286:12;119304:78;119286:12;119304:78;119352:11;119312:8;119304:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;119285:97;;;119401:7;119397:197;;;119434:39;;;25193:25:1;;;25249:2;25234:18;;25227:34;;;119434:39:0;;25166:18:1;119434:39:0;;;;;;;119397:197;;;-1:-1:-1;;;;;;;;;;;119519:59:0;;;;27672:2:1;27654:21;;;27711:2;27691:18;;;27684:30;-1:-1:-1;;;;;;;;;;;27745:2:1;27730:18;;27723:62;-1:-1:-1;;;27816:2:1;27801:18;;27794:39;27865:3;27850:19;;27470:405;119519:59:0;;;;;;;;119397:197;119270:335;119228:377;119633:1;119619:11;:15;:36;;;;-1:-1:-1;119639:16:0;;-1:-1:-1;;;119639:16:0;;;;119638:17;119619:36;119615:377;;;119699:8;;119691:78;;119673:12;;-1:-1:-1;;;;;119699:8:0;;119739:11;;119673:12;119691:78;119673:12;119691:78;119739:11;119699:8;119691:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;119672:97;;;119788:7;119784:197;;;119821:39;;;25193:25:1;;;25249:2;25234:18;;25227:34;;;119821:39:0;;25166:18:1;119821:39:0;;;;;;;119784:197;;;-1:-1:-1;;;;;;;;;;;119906:59:0;;;;28082:2:1;28064:21;;;28121:2;28101:18;;;28094:30;-1:-1:-1;;;;;;;;;;;28155:2:1;28140:18;;28133:62;-1:-1:-1;;;28226:2:1;28211:18;;28204:39;28275:3;28260:19;;27880:405;119906:59:0;;;;;;;;119784:197;119657:335;119615:377;120006:15;;120002:356;;120065:8;;120057:78;;120039:12;;-1:-1:-1;;;;;120065:8:0;;120105:11;;120039:12;120057:78;120039:12;120057:78;120105:11;120065:8;120057:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;120038:97;;;120154:7;120150:197;;;120187:39;;;25193:25:1;;;25249:2;25234:18;;25227:34;;;120187:39:0;;25166:18:1;120187:39:0;;;;;;;120150:197;;;-1:-1:-1;;;;;;;;;;;120272:59:0;;;;28492:2:1;28474:21;;;28531:2;28511:18;;;28504:30;-1:-1:-1;;;;;;;;;;;28565:2:1;28550:18;;28543:62;-1:-1:-1;;;28636:2:1;28621:18;;28614:39;28685:3;28670:19;;28290:405;120272:59:0;;;;;;;;120150:197;120023:335;120002:356;120372:15;;120368:356;;120431:8;;120423:78;;120405:12;;-1:-1:-1;;;;;120431:8:0;;120471:11;;120405:12;120423:78;120405:12;120423:78;120471:11;120431:8;120423:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;120404:97;;;120520:7;120516:197;;;120553:39;;;25193:25:1;;;25249:2;25234:18;;25227:34;;;120553:39:0;;25166:18:1;120553:39:0;;;;;;;120516:197;;;-1:-1:-1;;;;;;;;;;;120638:59:0;;;;28902:2:1;28884:21;;;28941:2;28921:18;;;28914:30;-1:-1:-1;;;;;;;;;;;28975:2:1;28960:18;;28953:62;-1:-1:-1;;;29046:2:1;29031:18;;29024:39;29095:3;29080:19;;28700:405;120638:59:0;;;;;;;;120516:197;120389:335;120368:356;115735:4996;;;;;;;;;;;;;115673:5058;;:::o;31658:156::-;31720:7;31795:11;31805:1;31796:5;;;31795:11;:::i;:::-;31785:21;;31786:5;;;31785:21;:::i;68252:194::-;68337:28;68349:7;68358:6;68337:11;:28::i;:::-;68378:60;68395:23;68420:9;68431:6;68378:16;:60::i;75701:127::-;75765:7;75792:28;:18;30446:14;;30354:114;32860:918;32973:12;;32949:7;;32973:17;;32969:58;;-1:-1:-1;33014:1:0;33007:8;;32969:58;33080:12;;33039:11;;33105:424;33118:4;33112:3;:10;33105:424;;;33139:11;33153:23;33166:3;33171:4;33153:12;:23::i;:::-;33139:37;;33410:7;33397:5;33403:3;33397:10;;;;;;;;:::i;:::-;;;;;;;;;:20;33393:125;;;33445:3;33438:10;;33393:125;;;33495:7;:3;33501:1;33495:7;:::i;:::-;33489:13;;33393:125;33124:405;33105:424;;;33655:1;33649:3;:7;:36;;;;-1:-1:-1;33678:7:0;33660:5;33666:7;33672:1;33666:3;:7;:::i;:::-;33660:14;;;;;;;;:::i;:::-;;;;;;;;;:25;33649:36;33645:126;;;33709:7;33715:1;33709:3;:7;:::i;:::-;33702:14;;;;;;33645:126;-1:-1:-1;33756:3:0;-1:-1:-1;33749:10:0;;18888:1632;19019:7;;19953:66;19940:79;;19936:163;;;-1:-1:-1;20052:1:0;;-1:-1:-1;20056:30:0;20036:51;;19936:163;20113:1;:7;;20118:2;20113:7;;:18;;;;;20124:1;:7;;20129:2;20124:7;;20113:18;20109:102;;;-1:-1:-1;20164:1:0;;-1:-1:-1;20168:30:0;20148:51;;20109:102;20325:24;;;20308:14;20325:24;;;;;;;;;30228:25:1;;;30301:4;30289:17;;30269:18;;;30262:45;;;;30323:18;;;30316:34;;;30366:18;;;30359:34;;;20325:24:0;;30200:19:1;;20325:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20325:24:0;;-1:-1:-1;;20325:24:0;;;-1:-1:-1;;;;;;;20364:20:0;;20360:103;;20417:1;20421:29;20401:50;;;;;;;20360:103;20483:6;-1:-1:-1;20491:20:0;;-1:-1:-1;18888:1632:0;;;;;;;;:::o;13597:643::-;13675:20;13666:5;:29;;;;;;;;:::i;:::-;;13662:571;;13597:643;:::o;13662:571::-;13773:29;13764:5;:38;;;;;;;;:::i;:::-;;13760:473;;13819:34;;-1:-1:-1;;;13819:34:0;;30738:2:1;13819:34:0;;;30720:21:1;30777:2;30757:18;;;30750:30;30816:26;30796:18;;;30789:54;30860:18;;13819:34:0;30536:348:1;13760:473:0;13884:35;13875:5;:44;;;;;;;;:::i;:::-;;13871:362;;13936:41;;-1:-1:-1;;;13936:41:0;;31091:2:1;13936:41:0;;;31073:21:1;31130:2;31110:18;;;31103:30;31169:33;31149:18;;;31142:61;31220:18;;13936:41:0;30889:355:1;13871:362:0;14008:30;13999:5;:39;;;;;;;;:::i;:::-;;13995:238;;14055:44;;-1:-1:-1;;;14055:44:0;;31451:2:1;14055:44:0;;;31433:21:1;31490:2;31470:18;;;31463:30;31529:34;31509:18;;;31502:62;-1:-1:-1;;;31580:18:1;;;31573:32;31622:19;;14055:44:0;31249:398:1;13995:238:0;14130:30;14121:5;:39;;;;;;;;:::i;:::-;;14117:116;;14177:44;;-1:-1:-1;;;14177:44:0;;31854:2:1;14177:44:0;;;31836:21:1;31893:2;31873:18;;;31866:30;31932:34;31912:18;;;31905:62;-1:-1:-1;;;31983:18:1;;;31976:32;32025:19;;14177:44:0;31652:398:1;79298:310:0;79393:17;79413:23;:21;:23::i;:::-;79393:43;-1:-1:-1;79393:43:0;79451:30;79467:9;79451:15;:30::i;:::-;:42;79447:154;;;79510:29;;;;;;;;-1:-1:-1;79510:29:0;;;;;;;;;;;;;;79554:16;;;:35;;;;;;;;;;;;;;;79298:310::o;120775:490::-;120863:16;;;120877:1;120863:16;;;;;;;;120839:21;;120863:16;;;;;;;;;;-1:-1:-1;120863:16:0;120839:40;;120908:4;120890;120895:1;120890:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;120890:23:0;;;-1:-1:-1;;;;;120890:23:0;;;;;120934:15;-1:-1:-1;;;;;120934:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;120924:4;120929:1;120924:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;120924:32:0;;;-1:-1:-1;;;;;120924:32:0;;;;;120967:57;120984:4;120999:15;121017:6;120967:8;:57::i;:::-;121035:222;;-1:-1:-1;;;121035:222:0;;-1:-1:-1;;;;;121035:15:0;:66;;;;:222;;121116:6;;121137:1;;121184:4;;121211;;121231:15;;121035:222;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;120828:437;120775:490;:::o;55111:591::-;-1:-1:-1;;;;;55195:21:0;;55187:67;;;;-1:-1:-1;;;55187:67:0;;33630:2:1;55187:67:0;;;33612:21:1;33669:2;33649:18;;;33642:30;33708:34;33688:18;;;33681:62;-1:-1:-1;;;33759:18:1;;;33752:31;33800:19;;55187:67:0;33428:397:1;55187:67:0;55267:49;55288:7;55305:1;55309:6;55267:20;:49::i;:::-;-1:-1:-1;;;;;55354:18:0;;55329:22;55354:18;;;;;;;;;;;55391:24;;;;55383:71;;;;-1:-1:-1;;;55383:71:0;;34032:2:1;55383:71:0;;;34014:21:1;34071:2;34051:18;;;34044:30;34110:34;34090:18;;;34083:62;-1:-1:-1;;;34161:18:1;;;34154:32;34203:19;;55383:71:0;33830:398:1;55383:71:0;-1:-1:-1;;;;;55490:18:0;;:9;:18;;;;;;;;;;55511:23;;;55490:44;;55556:12;:22;;55528:6;;55490:9;55556:22;;55528:6;;55556:22;:::i;:::-;;;;-1:-1:-1;;55596:37:0;;740:25:1;;;55622:1:0;;-1:-1:-1;;;;;55596:37:0;;;;;728:2:1;713:18;55596:37:0;;;;;;;55646:48;55666:7;55683:1;55687:6;55646:19;:48::i;79616:212::-;79710:10;;79686:7;;79710:15;;79706:115;;-1:-1:-1;79749:1:0;;79616:212;-1:-1:-1;79616:212:0:o;79706:115::-;79794:10;;79790:3;;79794:14;;79807:1;;79794:14;:::i;:::-;79790:19;;;;;;;;:::i;:::-;;;;;;;;;79783:26;;79616:212;;;:::o;79706:115::-;79616:212;;;:::o;206:131:1:-;-1:-1:-1;;;;;281:31:1;;271:42;;261:70;;327:1;324;317:12;342:247;401:6;454:2;442:9;433:7;429:23;425:32;422:52;;;470:1;467;460:12;422:52;509:9;496:23;528:31;553:5;528:31;:::i;776:597::-;888:4;917:2;946;935:9;928:21;978:6;972:13;1021:6;1016:2;1005:9;1001:18;994:34;1046:1;1056:140;1070:6;1067:1;1064:13;1056:140;;;1165:14;;;1161:23;;1155:30;1131:17;;;1150:2;1127:26;1120:66;1085:10;;1056:140;;;1214:6;1211:1;1208:13;1205:91;;;1284:1;1279:2;1270:6;1259:9;1255:22;1251:31;1244:42;1205:91;-1:-1:-1;1357:2:1;1336:15;-1:-1:-1;;1332:29:1;1317:45;;;;1364:2;1313:54;;776:597;-1:-1:-1;;;776:597:1:o;1378:315::-;1446:6;1454;1507:2;1495:9;1486:7;1482:23;1478:32;1475:52;;;1523:1;1520;1513:12;1475:52;1562:9;1549:23;1581:31;1606:5;1581:31;:::i;:::-;1631:5;1683:2;1668:18;;;;1655:32;;-1:-1:-1;;;1378:315:1:o;2141:180::-;2200:6;2253:2;2241:9;2232:7;2228:23;2224:32;2221:52;;;2269:1;2266;2259:12;2221:52;-1:-1:-1;2292:23:1;;2141:180;-1:-1:-1;2141:180:1:o;2326:456::-;2403:6;2411;2419;2472:2;2460:9;2451:7;2447:23;2443:32;2440:52;;;2488:1;2485;2478:12;2440:52;2527:9;2514:23;2546:31;2571:5;2546:31;:::i;:::-;2596:5;-1:-1:-1;2653:2:1;2638:18;;2625:32;2666:33;2625:32;2666:33;:::i;:::-;2326:456;;2718:7;;-1:-1:-1;;;2772:2:1;2757:18;;;;2744:32;;2326:456::o;2787:118::-;2873:5;2866:13;2859:21;2852:5;2849:32;2839:60;;2895:1;2892;2885:12;2910:382;2975:6;2983;3036:2;3024:9;3015:7;3011:23;3007:32;3004:52;;;3052:1;3049;3042:12;3004:52;3091:9;3078:23;3110:31;3135:5;3110:31;:::i;:::-;3160:5;-1:-1:-1;3217:2:1;3202:18;;3189:32;3230:30;3189:32;3230:30;:::i;:::-;3279:7;3269:17;;;2910:382;;;;;:::o;3486:241::-;3542:6;3595:2;3583:9;3574:7;3570:23;3566:32;3563:52;;;3611:1;3608;3601:12;3563:52;3650:9;3637:23;3669:28;3691:5;3669:28;:::i;3914:156::-;3980:20;;4040:4;4029:16;;4019:27;;4009:55;;4060:1;4057;4050:12;4075:317;4141:6;4149;4202:2;4190:9;4181:7;4177:23;4173:32;4170:52;;;4218:1;4215;4208:12;4170:52;4257:9;4244:23;4276:31;4301:5;4276:31;:::i;:::-;4326:5;-1:-1:-1;4350:36:1;4382:2;4367:18;;4350:36;:::i;:::-;4340:46;;4075:317;;;;;:::o;5327:592::-;5429:6;5437;5445;5453;5461;5469;5522:3;5510:9;5501:7;5497:23;5493:33;5490:53;;;5539:1;5536;5529:12;5490:53;5578:9;5565:23;5597:31;5622:5;5597:31;:::i;:::-;5647:5;-1:-1:-1;5699:2:1;5684:18;;5671:32;;-1:-1:-1;5750:2:1;5735:18;;5722:32;;-1:-1:-1;5773:36:1;5805:2;5790:18;;5773:36;:::i;:::-;5763:46;;5856:3;5845:9;5841:19;5828:33;5818:43;;5908:3;5897:9;5893:19;5880:33;5870:43;;5327:592;;;;;;;;:::o;5924:734::-;6035:6;6043;6051;6059;6067;6075;6083;6136:3;6124:9;6115:7;6111:23;6107:33;6104:53;;;6153:1;6150;6143:12;6104:53;6192:9;6179:23;6211:31;6236:5;6211:31;:::i;:::-;6261:5;-1:-1:-1;6318:2:1;6303:18;;6290:32;6331:33;6290:32;6331:33;:::i;:::-;6383:7;-1:-1:-1;6437:2:1;6422:18;;6409:32;;-1:-1:-1;6488:2:1;6473:18;;6460:32;;-1:-1:-1;6511:37:1;6543:3;6528:19;;6511:37;:::i;:::-;6501:47;;6595:3;6584:9;6580:19;6567:33;6557:43;;6647:3;6636:9;6632:19;6619:33;6609:43;;5924:734;;;;;;;;;;:::o;6663:1128::-;6788:6;6796;6804;6812;6820;6828;6836;6844;6852;6860;6913:3;6901:9;6892:7;6888:23;6884:33;6881:53;;;6930:1;6927;6920:12;6881:53;6969:9;6956:23;6988:28;7010:5;6988:28;:::i;:::-;7035:5;-1:-1:-1;7087:2:1;7072:18;;7059:32;;-1:-1:-1;7143:2:1;7128:18;;7115:32;7156:30;7115:32;7156:30;:::i;:::-;7205:7;-1:-1:-1;7259:2:1;7244:18;;7231:32;;-1:-1:-1;7315:3:1;7300:19;;7287:33;7329:30;7287:33;7329:30;:::i;:::-;7378:7;-1:-1:-1;7432:3:1;7417:19;;7404:33;;-1:-1:-1;7489:3:1;7474:19;;7461:33;7503:30;7461:33;7503:30;:::i;:::-;7552:7;-1:-1:-1;7606:3:1;7591:19;;7578:33;;-1:-1:-1;7663:3:1;7648:19;;7635:33;7677:30;7635:33;7677:30;:::i;:::-;7726:7;7716:17;;;7780:3;7769:9;7765:19;7752:33;7742:43;;6663:1128;;;;;;;;;;;;;:::o;7796:388::-;7864:6;7872;7925:2;7913:9;7904:7;7900:23;7896:32;7893:52;;;7941:1;7938;7931:12;7893:52;7980:9;7967:23;7999:31;8024:5;7999:31;:::i;:::-;8049:5;-1:-1:-1;8106:2:1;8091:18;;8078:32;8119:33;8078:32;8119:33;:::i;8189:419::-;8256:6;8264;8317:2;8305:9;8296:7;8292:23;8288:32;8285:52;;;8333:1;8330;8323:12;8285:52;8372:9;8359:23;8391:31;8416:5;8391:31;:::i;:::-;8441:5;-1:-1:-1;8498:2:1;8483:18;;8470:32;8546:10;8533:24;;8521:37;;8511:65;;8572:1;8569;8562:12;9224:184;9294:6;9347:2;9335:9;9326:7;9322:23;9318:32;9315:52;;;9363:1;9360;9353:12;9315:52;-1:-1:-1;9386:16:1;;9224:184;-1:-1:-1;9224:184:1:o;9413:380::-;9492:1;9488:12;;;;9535;;;9556:61;;9610:4;9602:6;9598:17;9588:27;;9556:61;9663:2;9655:6;9652:14;9632:18;9629:38;9626:161;;9709:10;9704:3;9700:20;9697:1;9690:31;9744:4;9741:1;9734:15;9772:4;9769:1;9762:15;9798:356;10000:2;9982:21;;;10019:18;;;10012:30;10078:34;10073:2;10058:18;;10051:62;10145:2;10130:18;;9798:356::o;10159:127::-;10220:10;10215:3;10211:20;10208:1;10201:31;10251:4;10248:1;10241:15;10275:4;10272:1;10265:15;10291:168;10331:7;10397:1;10393;10389:6;10385:14;10382:1;10379:21;10374:1;10367:9;10360:17;10356:45;10353:71;;;10404:18;;:::i;:::-;-1:-1:-1;10444:9:1;;10291:168::o;10464:128::-;10504:3;10535:1;10531:6;10528:1;10525:13;10522:39;;;10541:18;;:::i;:::-;-1:-1:-1;10577:9:1;;10464:128::o;11181:245::-;11248:6;11301:2;11289:9;11280:7;11276:23;11272:32;11269:52;;;11317:1;11314;11307:12;11269:52;11349:9;11343:16;11368:28;11390:5;11368:28;:::i;11856:497::-;11962:6;11970;11978;11986;11994;12047:3;12035:9;12026:7;12022:23;12018:33;12015:53;;;12064:1;12061;12054:12;12015:53;12096:9;12090:16;12115:31;12140:5;12115:31;:::i;:::-;12210:2;12195:18;;12189:25;12254:2;12239:18;;12233:25;12298:2;12283:18;;12277:25;12342:3;12327:19;;;12321:26;12165:5;;12189:25;;-1:-1:-1;12233:25:1;12277;-1:-1:-1;12321:26:1;;-1:-1:-1;11856:497:1;-1:-1:-1;;;11856:497:1:o;12784:125::-;12824:4;12852:1;12849;12846:8;12843:34;;;12857:18;;:::i;:::-;-1:-1:-1;12894:9:1;;12784:125::o;12914:127::-;12975:10;12970:3;12966:20;12963:1;12956:31;13006:4;13003:1;12996:15;13030:4;13027:1;13020:15;23793:217;23833:1;23859;23849:132;;23903:10;23898:3;23894:20;23891:1;23884:31;23938:4;23935:1;23928:15;23966:4;23963:1;23956:15;23849:132;-1:-1:-1;23995:9:1;;23793:217::o;30404:127::-;30465:10;30460:3;30456:20;30453:1;30446:31;30496:4;30493:1;30486:15;30520:4;30517:1;30510:15;32187:251;32257:6;32310:2;32298:9;32289:7;32285:23;32281:32;32278:52;;;32326:1;32323;32316:12;32278:52;32358:9;32352:16;32377:31;32402:5;32377:31;:::i;32443:980::-;32705:4;32753:3;32742:9;32738:19;32784:6;32773:9;32766:25;32810:2;32848:6;32843:2;32832:9;32828:18;32821:34;32891:3;32886:2;32875:9;32871:18;32864:31;32915:6;32950;32944:13;32981:6;32973;32966:22;33019:3;33008:9;33004:19;32997:26;;33058:2;33050:6;33046:15;33032:29;;33079:1;33089:195;33103:6;33100:1;33097:13;33089:195;;;33168:13;;-1:-1:-1;;;;;33164:39:1;33152:52;;33259:15;;;;33224:12;;;;33200:1;33118:9;33089:195;;;-1:-1:-1;;;;;;;33340:32:1;;;;33335:2;33320:18;;33313:60;-1:-1:-1;;;33404:3:1;33389:19;33382:35;33301:3;32443:980;-1:-1:-1;;;32443:980:1:o

Swarm Source

ipfs://6c568da71f24f1127169a07d889588673a3ba4b023cc9f5780839c423833e308
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.