ETH Price: $3,259.13 (+2.65%)
Gas: 3 Gwei

Token

RSTABLE (RST)
 

Overview

Max Total Supply

100,110 RST

Holders

116

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
1,000 RST

Value
$0.00
0x418eced7262261c57c78de9396b86a580c556fe4
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:
RStable

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-01-28
*/

// File: @openzeppelin\contracts\token\ERC20\IERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

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

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

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

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

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

// File: @openzeppelin\contracts\math\SafeMath.sol



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @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 sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

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

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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 mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin\contracts\utils\Address.sol



pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: node_modules\@openzeppelin\contracts\GSN\Context.sol



pragma solidity >=0.6.0 <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 GSN 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 payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin\contracts\access\Ownable.sol



pragma solidity >=0.6.0 <0.8.0;

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

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

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts\external\IUniswapV2Factory.sol

pragma solidity >=0.6.2;

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

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

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

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

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

// File: contracts\external\IUniswapV2Router01.sol

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,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

// File: contracts\external\IUniswapV2Router02.sol

pragma solidity >=0.6.2;


interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

// File: contracts\external\IWETH.sol

pragma solidity >=0.5.0;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
    function balanceOf(address) external view returns (uint256);
}

// File: contracts\Constants.sol



pragma solidity ^0.6.12;
// pragma experimental ABIEncoderV2;

library Constants {
    uint256 private constant MAX = ~uint256(0);
    uint256 private constant _launchSupply = 164000 * 10**9;
    uint256 private constant _largeTotal = (MAX - (MAX % _launchSupply));


    // uint256 private constant _baseExpansionFactor = 100;
    // uint256 private constant _baseContractionFactor = 100;
    uint256 private constant _baseUtilityFee = 50; // 0.5%
    // uint256 private constant _baseContractionCap = 1000;

    uint256 private constant _stabilizerFee = 50; // 0.5%
    // uint256 private constant _stabilizationLowerBound = 50;
    // uint256 private constant _stabilizationLowerReset = 75;
    // uint256 private constant _stabilizationUpperBound = 150;
    // uint256 private constant _stabilizationUpperReset = 125;
    // uint256 private constant _stabilizePercent = 10;

    uint256 private constant _treasuryFee = 100; // 1%

    // uint256 private constant _presaleIndividualCap = 1 ether;
    // uint256 private constant _presaleCap = 1 * 10**5 * 10**18;
    // uint256 private constant _maxPresaleGas = 200000000000;

    uint256 private constant _epochLength = 4 hours;

    uint256 private constant _liquidityReward = 25 * 10**9;
    uint256 private constant _minForLiquidity = 500 * 10**9;
    uint256 private constant _minForCallerLiquidity = 500 * 10**9;

    address private constant _treasuryAddress = 0xf7FBdEA9b0e7aF8034f9Fc99D7d95B4D4a52B948;

    string private constant _name = "RSTABLE";
    string private constant _symbol = "RST";
    uint8 private constant _decimals = 9;
    uint256 public constant twoYearSec = 63072000;

    uint256 private constant _addLiquidRate = 64000/80;

    /****** Getters *******/
    function getAddLiquidRate() internal pure returns (uint256){
        return _addLiquidRate;
    }
    function getLaunchSupply() internal pure returns (uint256) {
        return _launchSupply;
    }
    function getLargeTotal() internal pure returns (uint256) {
        return _largeTotal;
    }

   
    function getBaseUtilityFee() internal pure returns (uint256) {
        return _baseUtilityFee;
    }
    function getStabilizerFee() internal pure returns (uint256) {
        return _stabilizerFee;
    }
    
    function getTreasuryFee() internal pure returns (uint256) {
        return _treasuryFee;
    }
    function getEpochLength() internal pure returns (uint256) {
        return _epochLength;
    }
    function getLiquidityReward() internal pure returns (uint256) {
        return _liquidityReward;
    }
    function getMinForLiquidity() internal pure returns (uint256) {
        return _minForLiquidity;
    }
    function getMinForCallerLiquidity() internal pure returns (uint256) {
        return _minForCallerLiquidity;
    }

    
    function getTreasuryAdd() internal pure returns (address) {
        return _treasuryAddress;
    }
    function getName() internal pure returns (string memory)  {
        return _name;
    }
    function getSymbol() internal pure returns (string memory) {
        return _symbol;
    }
    function getDecimals() internal pure returns (uint8) {
        return _decimals;
    }
}

// File: contracts\State.sol



pragma solidity ^0.6.12;

contract State {

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

    // Supported pools and data for measuring mint & burn factors
    struct PoolCounter {
        address pairToken;
        uint256 tokenBalance;
        uint256 pairTokenBalance;
        uint256 lpBalance;
        uint256 startTokenBalance;
        uint256 startPairTokenBalance;
    }
    address[] _supportedPools;
    mapping (address => PoolCounter) _poolCounters;
    mapping (address => bool) _isSupportedPool;
    address _mainPool;

    uint256 public _currentEpoch;
 
    uint256 _largeTotal;
    uint256 _totalSupply;

    address _liquidityReserve = 0xa0DA83FcB4d921E966C67E747cDd66c4D60bB074;
    address _stabilizer = 0xa0DA83FcB4d921E966C67E747cDd66c4D60bB074;
    address uniswapRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    address uniswapFac = 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f;

    bool _taxLess;
    bool _presaleDone;
    address public presaleAdd;
    address public pol;

    uint256 public advanceMinThreshold = 512; // random range [0:1023], if number is >=511, < 512, advance.
    uint256 public advanceMaxThreshold = 513; 
    uint256 public advanceLotteryBits = 10; // 1024
    uint256 public maxEpochLength = 4 hours;
    uint256 public lastCalculatedBlock;
    uint256 public txNum;
    /*
        Based on assumption of 1 txes every 15secs, over 1hour, there are 240 txes
        There is 23% of trigger within the first hour
        There is 46% of trigger within the first 2 hours
        There is 70% of trigger within the first 3 hours
        There is 93% of trigger within the first 4 hours
    */
    // all sacled by 100,000
    uint256 public minBurnRate = 1000; //1%
    uint256 public maxBurnRate = 10000; //10%
    uint256 public minMintRate = 1000; //1%
    uint256 public maxMintRate = 8000; //8%

    bool public isBootstrap = true;
    uint256 public numEpochs = 0;
    uint256 public bootstrapEnd = 30;

    uint256 public mintRateOffset = 0;
    uint256 public burnRateOffset = 0;
    uint256 public lastMintRate;

    mapping(address=>bool) _isTaxlessSetter;
}

// File: contracts\Getters.sol



pragma solidity ^0.6.12;
// pragma experimental ABIEncoderV2;

// import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol";

// import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol";






contract Getters is State {
    using SafeMath for uint256;
    using Address for address;

    function getLargeBalances(address account) public view returns (uint256) {
        return _largeBalances[account];
    }
    function getAllowances(address account, address spender) public view returns (uint256) {
        return _allowances[account][spender];
    } 
    function getSupportedPools(uint256 index) public view returns (address) {
        return _supportedPools[index];
    }
    function getPoolCounters(address pool) public view returns (address, uint256, uint256, uint256, uint256, uint256) {
        PoolCounter memory pc = _poolCounters[pool];
        return (pc.pairToken, pc.tokenBalance, pc.pairTokenBalance, pc.lpBalance, pc.startTokenBalance, pc.startPairTokenBalance);
    }
    function isSupportedPool(address pool) public view returns (bool) {
        return _isSupportedPool[pool];
    }
    function mainPool() public view returns (address) {
        return _mainPool;
    }
    function getCurrentEpoch() public view returns (uint256) {
        return _currentEpoch;
    }
    
    function getLargeTotal() public view returns (uint256) {
        return _largeTotal;
    }
    function getTotalSupply() public view returns (uint256) {
        return _totalSupply;
    }
    function getLiquidityReserve() public view returns (address) {
        return _liquidityReserve;
    }
    function getPol() public view returns (address) {
        return pol;
    }
    function getStabilizer() public view returns (address) {
        return _stabilizer;
    }
    function isPresaleDone() public view returns (bool) {
        return _presaleDone;
    }
    // function getPresaleAddress() public view returns (address) {
    //     return _presaleCon;
    // }
   
    function isTaxLess() public view returns (bool) {
        return _taxLess;
    }
    function isTaxlessSetter(address account) public view returns (bool) {
        return _isTaxlessSetter[account];
    }
    function getUniswapRouter() public view returns (IUniswapV2Router02) {
        return IUniswapV2Router02(uniswapRouter);
    }
    function getUniswapFactory() public view returns (IUniswapV2Factory) {
        return IUniswapV2Factory(uniswapFac);
    }
    function getFactor() public view returns(uint256) {
        if (_presaleDone) {
            return _largeTotal.div(_totalSupply);
        } else {
            return _largeTotal.div(Constants.getLaunchSupply());
        }
    }
    function getUpdatedPoolCounters(address pool, address pairToken) public view returns (uint256, uint256, uint256) {
        uint256 lpBalance = IERC20(pool).totalSupply();
        uint256 tokenBalance = IERC20(address(this)).balanceOf(pool);
        uint256 pairTokenBalance = IERC20(address(pairToken)).balanceOf(pool);
        return (tokenBalance, pairTokenBalance, lpBalance);
    }
    function getExpansionRate(address poolAdd) public view returns (uint256) {
        uint256 expansionR = (_poolCounters[poolAdd].pairTokenBalance).mul(_poolCounters[poolAdd].startTokenBalance).mul(100000).div(_poolCounters[poolAdd].startPairTokenBalance).div(_poolCounters[poolAdd].tokenBalance);
        
        if (expansionR > 100000){ // more than 100percent
            expansionR = expansionR.mul(expansionR).div(100000);
            uint256 delta = expansionR - 100000;
            delta = delta + mintRateOffset;

            return (delta > maxMintRate) ? maxMintRate : delta;
           
        }else{
            return minMintRate;
        }
    }
    function getContractionRate(address poolAdd) public view returns (uint256) {
        uint256 contractionR = (_poolCounters[poolAdd].tokenBalance).mul(_poolCounters[poolAdd].startPairTokenBalance).mul(100000).div(_poolCounters[poolAdd].pairTokenBalance).div(_poolCounters[poolAdd].startTokenBalance);
        
        if (contractionR > 100000){ // more than 100percent
            contractionR = contractionR.mul(contractionR).div(100000);
            uint256 delta = contractionR - 100000;
            delta = delta + burnRateOffset;

            uint256 maxBurn = _getMaxBurnRate();
            return (delta > maxBurn) ? maxBurn : delta;
           
        }else{
            return minBurnRate;
        }
    }
    function getMintValue(address sender, uint256 amount) internal view returns(uint256, uint256, uint256, uint256) {
        uint256 expansionR = getExpansionRate(sender); // e.g. 14000 = 14%
        uint256 mintAmount = amount.mul(expansionR).div(100000);
        
        return (expansionR, mintAmount.mul(Constants.getStabilizerFee()).div(10000),mintAmount.mul(Constants.getTreasuryFee()).div(10000),mintAmount);
    }

    function getBurnValues(address recipient, uint256 amount) internal view returns(uint256, uint256) {
        uint256 currentFactor = getFactor();
        uint256 contractionR = getContractionRate(isSupportedPool(recipient) ? recipient : _mainPool); 
        // e.g. 14000 = 14%
        uint256 burnAmount = amount.mul(contractionR).div(100000);
        return (burnAmount, burnAmount.mul(currentFactor));
    }

    function getUtilityFee(uint256 amount) internal view returns(uint256, uint256) {
        uint256 currentFactor = getFactor();
        uint256 utilityFee = amount.mul(Constants.getBaseUtilityFee()).div(10000);
        return (utilityFee, utilityFee.mul(currentFactor));
    }
    // function getMintRate(address pool) external view returns (uint256) {
    //     uint256 expansionR = (_poolCounters[pool].pairTokenBalance).mul(_poolCounters[pool].startTokenBalance).mul(100).div(_poolCounters[pool].startPairTokenBalance).div(_poolCounters[pool].tokenBalance);
    //     if (expansionR > (Constants.getBaseExpansionFactor()).add(10000).div(100)) {
    //         uint256 mintFactor = expansionR.mul(expansionR);
    //         return mintFactor.sub(10000);
    //     } else {
    //         return Constants.getBaseExpansionFactor();
    //     }
    // }
    // function getBurnRate(address pool) external view returns (uint256) {
    //     uint256 contractionR = (_poolCounters[pool].tokenBalance).mul(_poolCounters[pool].startPairTokenBalance).mul(100).div(_poolCounters[pool].pairTokenBalance).div(_poolCounters[pool].startTokenBalance);
    //     uint256 burnRate;
    //     if (contractionR > (Constants.getBaseContractionFactor().add(10000)).div(100)) {
    //         uint256 burnFactor = contractionR.mul(contractionR);
    //         burnRate = burnFactor.sub(10000);
    //         if (burnRate > Constants.getBaseContractionCap()) {
    //             return Constants.getBaseContractionCap();
    //         }
    //         return burnRate;

    //     } else {
    //         return Constants.getBaseContractionFactor();
    //     }
    // }
    function _getMaxBurnRate() internal view returns (uint256) {
        if (isBootstrap) {
            return maxMintRate - 1;
        } else {
            return maxBurnRate;
        }
    }



}

// File: contracts\Setters.sol



pragma solidity ^0.6.12;
// pragma experimental ABIEncoderV2;




contract Setters is State, Getters {
    // function updatePresaleAddress(address presaleAddress) internal {
    //     _presaleCon = presaleAddress;
    // }
    event NewEpoch(uint256 timestamp, uint256 burnOffset, uint256 mintOffset);

    function setAllowances(address owner, address spender, uint256 amount) internal {
        _allowances[owner][spender] = amount;
    }
    function addToAccount(address account, uint256 amount) internal {
        uint256 currentFactor = getFactor();
        uint256 largeAmount = amount.mul(currentFactor);
        _largeBalances[account] = _largeBalances[account].add(largeAmount);
        _totalSupply = _totalSupply.add(amount);
    }
    function addToAll(uint256 amount) internal {
        _totalSupply = _totalSupply.add(amount);
    }
    function initializeEpoch() internal {
        _currentEpoch = now;
    }
    function updateEpoch(uint256 seed) internal {
        initializeEpoch();
        for (uint256 i=0; i<_supportedPools.length; i++) {
            _poolCounters[_supportedPools[i]].startTokenBalance = _poolCounters[_supportedPools[i]].tokenBalance;
            _poolCounters[_supportedPools[i]].startPairTokenBalance = _poolCounters[_supportedPools[i]].pairTokenBalance;
        }
        numEpochs += 1;
        if (numEpochs == bootstrapEnd){
            isBootstrap = false;
        }

        if (seed == 0){
            seed = getNewSeed();
        }
        // random mint/burn rate
        (seed, mintRateOffset) = getRandom(seed, minMintRate,maxMintRate.div(2));
        (, burnRateOffset) = getRandom(seed, minBurnRate,maxBurnRate.div(2));
        emit NewEpoch(now, mintRateOffset, burnRateOffset);
    }
    
    function getNewSeed() internal view returns (uint256){
        return uint256(keccak256(abi.encodePacked(blockhash(block.number-1), txNum)));
    }
    function getRandom(uint256 seed, uint256 min, uint256 max) internal pure returns (uint256, uint256) {
        uint256 r = uint256(keccak256(abi.encodePacked(seed))) % (max.sub(min));
        return (r, min + r);
    }

    function initializeLargeTotal() internal {
        _largeTotal = Constants.getLargeTotal();
    }
    function syncPair(address pool) internal returns(bool) {
        (uint256 tokenBalance, uint256 pairTokenBalance, uint256 lpBalance) = getUpdatedPoolCounters(pool, _poolCounters[pool].pairToken);
        bool lpBurn = lpBalance < _poolCounters[pool].lpBalance;
        _poolCounters[pool].lpBalance = lpBalance;
        _poolCounters[pool].tokenBalance = tokenBalance;
        _poolCounters[pool].pairTokenBalance = pairTokenBalance;
        return (lpBurn);
    }
    function silentSyncPair(address pool) public {
        (uint256 tokenBalance, uint256 pairTokenBalance, uint256 lpBalance) = getUpdatedPoolCounters(pool, _poolCounters[pool].pairToken);
        _poolCounters[pool].lpBalance = lpBalance;
        _poolCounters[pool].tokenBalance = tokenBalance;
        _poolCounters[pool].pairTokenBalance = pairTokenBalance;
    }
    function addSupportedPool(address pool, address pairToken) internal {
        require(!isSupportedPool(pool),"This pool is already supported");
        _isSupportedPool[pool] = true;
        _supportedPools.push(pool);
        (uint256 tokenBalance, uint256 pairTokenBalance, uint256 lpBalance) = getUpdatedPoolCounters(pool, pairToken);
        _poolCounters[pool] = PoolCounter(pairToken, tokenBalance, pairTokenBalance, lpBalance, tokenBalance, pairTokenBalance);
    }
    function removeSupportedPool(address pool) internal {
        require(isSupportedPool(pool), "This pool is currently not supported");
        for (uint256 i = 0; i < _supportedPools.length; i++) {
            if (_supportedPools[i] == pool) {
                _supportedPools[i] = _supportedPools[_supportedPools.length - 1];
                _isSupportedPool[pool] = false;
                delete _poolCounters[pool];
                _supportedPools.pop();
                break;
            }
        }
    }

  
}

// File: contracts\IUnicrypt.sol

pragma solidity >=0.6.0;

interface IUnicrypt {
    function depositToken(address token, uint256 amount, uint256 unlock_date) external payable;
    function withdrawToken(address token, uint256 amount) external;

    function getTokenReleaseAtIndex (address token, uint index) external view returns (uint256, uint256);
    function getUserTokenInfo (address token, address user) external view returns (uint256, uint256, uint256);
    function getUserVestingAtIndex (address token, address user, uint index) external view returns (uint256, uint256);
}

// File: contracts\RST.sol



pragma solidity ^0.6.12;
// pragma experimental ABIEncoderV2;











contract RStable is Setters, Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    modifier onlyTaxlessSetter {
        require(isTaxlessSetter(_msgSender()),"not taxless");
        _;
    }
    modifier taxlessTx {
        _taxLess = true;
        _;
        _taxLess = false;
    }

    constructor() public Ownable(){
        // uniswapRouterV2 = IUniswapV2Router02(Constants.getRouterAdd());
        // uniswapFactory = IUniswapV2Factory(Constants.getFactoryAdd());
        updateEpoch(0);
        initializeLargeTotal();

        // if platform that require sending coins
        // initSaleWithBalance();
        
        // start with no tax during sale. taxlessly create pool first.
        //  _taxLess = true;
    }
    // function initSaleWithBalance() internal {
    //     // mint to myself.
    //     uint256 toMint = Constants.getLaunchSupply().sub(totalSupply());
    //     addToAccount(owner(),toMint);
    //     emit Transfer(address(0),address(this),toMint);
    // }

    // needed if sale platform mints on the go
    // function setPresaleDone() public payable onlyOwner {
    //     require(totalSupply() <= Constants.getLaunchSupply(), "Total supply is already minted");
    //     _mintRemaining();
    //     _presaleDone = true;
    // }
    


    function name() public pure returns (string memory) {
        return Constants.getName();
    }
    
    function symbol() public pure returns (string memory) {
        return Constants.getSymbol();
    }
    
    function decimals() public pure returns (uint8) {
        return Constants.getDecimals();
    }
    
    function totalSupply() public view override returns (uint256) {
        return getTotalSupply();
    }
    
    function circulatingSupply() public view returns (uint256) {
        return getTotalSupply().sub(balanceOf(address(this))).sub(balanceOf(getStabilizer()));
    }
    
    function balanceOf(address account) public view override returns (uint256) {
        uint256 currentFactor = getFactor();
        return getLargeBalances(account).div(currentFactor);
    }
    

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return getAllowances(owner,spender);
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), getAllowances(sender,_msgSender()).sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, getAllowances(_msgSender(),spender).add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, getAllowances(_msgSender(),spender).sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }
  
    function setPresaleDone() public payable  {
        // require(_msgSender() == presaleAdd, "no!");
        // require(totalSupply() <= Constants.getLaunchSupply(), "Total supply is already minted");
        _mintRemaining(); // mints the allocation for the LP
        _presaleDone = true;
        _createEthPool();
    }
    function _mintRemaining() private {
        require(!isPresaleDone(), "Cannot mint post presale");
        uint256 toMint = Constants.getLaunchSupply().sub(totalSupply());
        addToAccount(address(this),toMint);
        emit Transfer(address(0),address(this),toMint);
    }
    
    function mint(address to, uint256 amount) external { 
        require(!_presaleDone,"no minting after presale!");
        require(_msgSender() == presaleAdd, "no!");
        addToAccount(to,amount);
        emit Transfer(address(0),to,amount);
    }

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        setAllowances(owner, spender, amount);
        emit Approval(owner, spender, amount);
    }
    function randomAdvanceEpoch(address sender, address recipient, uint256 amount) internal {
        
        // if a new block, then calculate.
        if (now > getCurrentEpoch().add(maxEpochLength)){
            updateEpoch(0);
        } else {
            if (block.number == lastCalculatedBlock){
                return;
            }
            lastCalculatedBlock = block.number;
            (uint256 r, uint256 rMasked) = getRandom3(sender, recipient, amount);
            if (rMasked >= advanceMinThreshold && rMasked < advanceMaxThreshold){
                updateEpoch(r);
            }
        }
    }
    // function getRandom1(address sender, address recipient, uint256 amount) public view returns (uint256) {
    //     uint256 r = uint256(keccak256(abi.encodePacked(txNum, sender, recipient, amount, blockhash(block.number-1))));
    //     return r;
    // }
    // function getRandom2(uint256 r) public view returns (uint256) {
    //     uint256 r1 = r.sub((r >> advanceLotteryBits) << advanceLotteryBits);
    //     return r1;
    // }
    function getRandom3(address sender, address recipient, uint256 amount) public view returns (uint256, uint256) {
        uint256 r = uint256(keccak256(abi.encodePacked(txNum, sender, recipient, amount, blockhash(block.number-1))));
        uint256 r1 = _sliceNumber(r, advanceLotteryBits);
        return (r,r1);
    }
    function _sliceNumber(uint256 _n, uint256 _nbits) private pure returns (uint256) {
        // mask is made by shifting left an offset number of times
        uint256 mask = uint256((2**(_nbits)) - 1);
        // AND n with mask, and trim to max of _nbits bits
        return uint256((_n & mask));
    }

    function _transfer(address sender, address recipient, uint256 amount) private {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Amount must be greater than zero");
        require(amount <= balanceOf(sender),"Amount exceeds balance!!");
        // require(isPresaleDone(),"Presale yet to close");
        
        txNum += 1;
        
        uint256 currentFactor = getFactor();
        uint256 largeAmount = amount.mul(currentFactor);
        uint256 txType;
        if (isTaxLess()) {
            txType = 3;
        } else {
            bool lpBurn;
            if (isSupportedPool(sender)) {
                lpBurn = syncPair(sender);
            } else if (isSupportedPool(recipient)){
                silentSyncPair(recipient);
            } else {
                silentSyncPair(_mainPool);
            }
            txType = _getTxType(sender, lpBurn);
        }
        if (txType != 3){
            // random advance epoch
            randomAdvanceEpoch(sender, recipient, amount);
        }
        // Buy Transaction from supported pools - requires mint, no utility fee
        if (txType == 1) {
            (uint256 expansionR, uint256 stabilizerMint, uint256 treasuryMint, uint256 totalMint) = getMintValue(sender, amount);
            // uint256 mintSize = amount.div(100);
            lastMintRate = expansionR;

            _largeBalances[sender] = _largeBalances[sender].sub(largeAmount);
            _largeBalances[recipient] = _largeBalances[recipient].add(largeAmount);
            _largeBalances[getStabilizer()] = _largeBalances[getStabilizer()].add(stabilizerMint.mul(currentFactor));
            _largeBalances[Constants.getTreasuryAdd()] = _largeBalances[Constants.getTreasuryAdd()].add(treasuryMint.mul(currentFactor));
            _totalSupply = _totalSupply.add(totalMint);
            emit Transfer(sender, recipient, amount);
            emit Transfer(address(0),getStabilizer(),stabilizerMint); // stabilizer = dev fees for now.
            emit Transfer(address(0),Constants.getTreasuryAdd(),treasuryMint);
        }
        // Sells to supported pools or unsupported transfer - requires exit burn and utility fee
        else if (txType == 2) {
            (uint256 burnSize, uint256 largeBurnSize) = getBurnValues(recipient, amount);
            (uint256 utilityFee, uint256 largeUtilityFee) = getUtilityFee(amount);
            uint256 actualTransferAmount = amount.sub(burnSize).sub(utilityFee);
            uint256 largeTransferAmount = actualTransferAmount.mul(currentFactor);
            _largeBalances[sender] = _largeBalances[sender].sub(largeAmount);
            _largeBalances[recipient] = _largeBalances[recipient].add(largeTransferAmount);
            _largeBalances[_liquidityReserve] = _largeBalances[_liquidityReserve].add(largeUtilityFee);
            _totalSupply = _totalSupply.sub(burnSize);
            _largeTotal = _largeTotal.sub(largeBurnSize);
            emit Transfer(sender, recipient, actualTransferAmount);
            emit Transfer(sender, address(0), burnSize);
            emit Transfer(sender, _liquidityReserve, utilityFee);
        } 
        // Add Liquidity via interface or Remove Liquidity Transaction to supported pools - no fee of any sort
        else if (txType == 3) {
            _largeBalances[sender] = _largeBalances[sender].sub(largeAmount);
            _largeBalances[recipient] = _largeBalances[recipient].add(largeAmount);
            emit Transfer(sender, recipient, amount);
        }
    }

    function _getTxType(address sender, bool lpBurn) private view returns(uint256) {
        uint256 txType = 2;
        if (isSupportedPool(sender)) {
            if (lpBurn) {
                txType = 3;
            } else {
                txType = 1;
            }
        } else if (sender == uniswapRouter) {
            txType = 3;
        }
        return txType;
    }

    function _createEthPool() private taxlessTx{

        IUniswapV2Router02 uniswapRouterV2 = getUniswapRouter();
        IUniswapV2Factory uniswapFactory = getUniswapFactory();
        address tokenUniswapPair;
        if (uniswapFactory.getPair(address(uniswapRouterV2.WETH()), address(this)) == address(0)) {
            tokenUniswapPair = uniswapFactory.createPair(
            address(uniswapRouterV2.WETH()), address(this));
        } else {
            tokenUniswapPair = uniswapFactory.getPair(address(this),uniswapRouterV2.WETH());
        }
        uint256 amtEth = address(this).balance;
        uint256 amtToken = amtEth.mul(Constants.getAddLiquidRate()).div(10**9);
        if (amtToken > balanceOf(address(this))){
            amtToken = balanceOf(address(this));
        }

        _approve(address(this), address(uniswapRouterV2), amtToken);
   
        uniswapRouterV2.addLiquidityETH{value: amtEth}(address(this),
            amtToken, 0, 0, address(this), block.timestamp); // to lp
      
        addSupportedPool(tokenUniswapPair, address(uniswapRouterV2.WETH()));
        _mainPool = tokenUniswapPair;
        
        // lock
        uint amtLPheld = IERC20(tokenUniswapPair).balanceOf(address(this));      
        IERC20(tokenUniswapPair).approve(pol,amtLPheld);
   
        // lock liquidity
        // if (pol != address(0)){
        IUnicrypt(pol).depositToken(tokenUniswapPair, amtLPheld, block.timestamp.add(Constants.twoYearSec));
        // }
        
    }
    function spareFundsToTreasury(uint256 amt) external taxlessTx onlyOwner{
        _transfer(address(this), Constants.getTreasuryAdd(), amt);
    }
    

    function addNewSupportedPool(address pool, address pairToken) external onlyOwner() {
        addSupportedPool(pool, pairToken);
    }

    function removeOldSupportedPool(address pool) external onlyOwner() {
        removeSupportedPool(pool);
    }

    function setTaxlessSetter(address cont) external onlyOwner() {
        require(!isTaxlessSetter(cont),"already setter");
        _isTaxlessSetter[cont] = true;
    }

    function setTaxless(bool flag) public onlyTaxlessSetter {
        _taxLess = flag;
    }

    function removeTaxlessSetter(address cont) external onlyOwner() {
        require(isTaxlessSetter(cont),"not setter");
        _isTaxlessSetter[cont] = false;
    }

    function setLiquidityReserve(address reserve) external onlyOwner() {
        _isTaxlessSetter[_liquidityReserve] = false;
        uint256 oldBalance = balanceOf(_liquidityReserve);
        if (oldBalance > 0) {
            _transfer(_liquidityReserve, reserve, oldBalance);
            emit Transfer(_liquidityReserve, reserve, oldBalance);
        }
        _liquidityReserve = reserve;
        _isTaxlessSetter[reserve] = true;
    }

    function setStabilizer(address reserve) external onlyOwner() taxlessTx {
        _isTaxlessSetter[_stabilizer] = false;
        uint256 oldBalance = balanceOf(_stabilizer);
        if (oldBalance > 0) {
            _transfer(_stabilizer, reserve, oldBalance);
            emit Transfer(_stabilizer, reserve, oldBalance);
        }
        _stabilizer = reserve;
        _isTaxlessSetter[reserve] = true;
    }
    function setRouterAdd(address a) external onlyOwner {
        uniswapRouter = a;
    }
    function setFactoryAdd(address a) external onlyOwner{
        uniswapFac = a;
    }
    function setMaxEpochLength(uint256 secs) external onlyOwner {
        maxEpochLength = secs;
    }
    function setAdvance(uint256 min, uint256 max, uint256 bits) external onlyOwner {
        advanceMinThreshold = min;
        advanceMaxThreshold = max;
        advanceLotteryBits = bits;
    }
    function setRates(uint256 minBurn, uint256 maxBurn, uint256 minMint, uint256 maxMint) external onlyOwner {
        minBurnRate = minBurn;
        maxBurnRate = maxBurn;
        minMintRate = minMint;
        maxMintRate = maxMint;
    }
    function setIsBootstrap(bool b) external onlyOwner {
        isBootstrap = b;
    }
    function setNumEpochs(uint256 e) external onlyOwner {
        numEpochs = e;
    }
    function setBootstrapEnd(uint256 n) external onlyOwner {
        bootstrapEnd = n;
    }
    function setPresaleAdd(address a) external onlyOwner {
        presaleAdd = a;
    }
    function setPolAdd(address a) external onlyOwner {
        pol = a;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burnOffset","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintOffset","type":"uint256"}],"name":"NewEpoch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_currentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"pairToken","type":"address"}],"name":"addNewSupportedPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"advanceLotteryBits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"advanceMaxThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"advanceMinThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bootstrapEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnRateOffset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"getAllowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"poolAdd","type":"address"}],"name":"getContractionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"poolAdd","type":"address"}],"name":"getExpansionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getLargeBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLargeTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityReserve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPol","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"}],"name":"getPoolCounters","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getRandom3","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStabilizer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getSupportedPools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUniswapFactory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUniswapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"pairToken","type":"address"}],"name":"getUpdatedPoolCounters","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isBootstrap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleDone","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"}],"name":"isSupportedPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTaxLess","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isTaxlessSetter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastCalculatedBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastMintRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBurnRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxEpochLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBurnRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minMintRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintRateOffset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"numEpochs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pol","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleAdd","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"}],"name":"removeOldSupportedPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"cont","type":"address"}],"name":"removeTaxlessSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"},{"internalType":"uint256","name":"bits","type":"uint256"}],"name":"setAdvance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"setBootstrapEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"setFactoryAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"b","type":"bool"}],"name":"setIsBootstrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"reserve","type":"address"}],"name":"setLiquidityReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"secs","type":"uint256"}],"name":"setMaxEpochLength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"e","type":"uint256"}],"name":"setNumEpochs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"setPolAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"setPresaleAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPresaleDone","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minBurn","type":"uint256"},{"internalType":"uint256","name":"maxBurn","type":"uint256"},{"internalType":"uint256","name":"minMint","type":"uint256"},{"internalType":"uint256","name":"maxMint","type":"uint256"}],"name":"setRates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"setRouterAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"reserve","type":"address"}],"name":"setStabilizer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"setTaxless","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"cont","type":"address"}],"name":"setTaxlessSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"}],"name":"silentSyncPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"spareFundsToTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"txNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052600980546001600160a01b031990811673a0da83fcb4d921e966c67e747cdd66c4d60bb074908117909255600a805482169092178255600b80548216737a250d5630b4cf539739df2c5dacb4c659f2488d179055600c8054909116735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f179055610200600f556102016010556011556138406012556103e86015819055612710601655601755611f406018556019805460ff191660011790556000601a819055601e601b55601c819055601d55348015620000d157600080fd5b506000620000de62000148565b602080546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506200013860006200014c565b6200014262000369565b620005bd565b3390565b6200015662000383565b60005b6002548110156200028e5760036000600283815481106200017657fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020600101546003600060028481548110620001ca57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001812060040191909155600280546003929190849081106200020957fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000206002015460036000600284815481106200025d57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190206005015560010162000159565b50601a805460010190819055601b541415620002af576019805460ff191690555b80620002c257620002bf62000389565b90505b620002ed81601754620002e76002601854620003bf60201b620024cd1790919060201c565b62000410565b601c556015546016549192506200031a91839190620002e7906002620003bf602090811b620024cd17901c565b601d819055601c546040805142815260208101929092528181019290925290517f3bb7b347508b7c148ec2094ac60d2e3d8b7595421025643f08b45cb78b326b5892509081900360600190a150565b6200037e6200046460201b6200250f1760201c565b600755565b42600655565b60145460408051600019430140602080830191909152818301939093528151808203830181526060909101909152805191012090565b60006200040983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200046f60201b60201c565b9392505050565b60008060006200042f85856200051660201b6200251a1790919060201c565b6040805160208082018a90528251808303820181529183019092528051910120816200045757fe5b0696948701955050505050565b651963082d3fff1990565b60008183620004ff5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620004c3578181015183820152602001620004a9565b50505050905090810190601f168015620004f15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816200050c57fe5b0495945050505050565b60006200040983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506200056060201b60201c565b60008184841115620005b55760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315620004c3578181015183820152602001620004a9565b505050900390565b613f8080620005cd6000396000f3fe6080604052600436106104515760003560e01c806380c2bbd21161023f578063b21c327811610139578063dd272a92116100b6578063ebff765e1161007a578063ebff765e14610fdb578063ec2b4e3614610ff0578063f14c143814611023578063f2fde38b14611038578063f904ed9f1461106b57610451565b8063dd272a9214610f10578063dd62ed3e14610f25578063ddca149d14610f60578063e46761c414610f93578063ea8cf4e014610fa857610451565b8063bf9a3a1b116100fd578063bf9a3a1b14610e12578063c0e8b61f14610e6b578063c4e41b2214610e95578063cb4d319514610eaa578063db7f521a14610edd57610451565b8063b21c327814610d47578063b6333d8314610d82578063b72455bd14610db5578063b97dd9e214610dca578063bef2112414610ddf57610451565b80639c470766116101c7578063a457c2d71161018b578063a457c2d714610c63578063a5a302d314610c9c578063a5a587c714610cb1578063a9059cbb14610cdb578063ae2089ad14610d1457610451565b80639c47076614610bfa5780639d60440614610c0f5780639dd2367814610c245780639f053c5f14610c39578063a29b035514610c4e57610451565b80638da5cb5b1161020e5780638da5cb5b14610b7357806391ec28dd14610b88578063927ac38614610bbb5780639358928b14610bd057806395d89b4114610be557610451565b806380c2bbd214610a8857806380dc74da14610abb5780638484ed7e14610ad05780638939878314610b0357610451565b806344ad4f2a116103505780636cc23d94116102d8578063778e44a71161029c578063778e44a7146109bb5780637dff2680146109e75780637e47d62514610a115780637e82933f14610a3d57806380af179914610a7357610451565b80636cc23d94146108cf57806370a0823114610902578063715018a61461093557806372af217e1461094a5780637656a7c21461095f57610451565b8063522361461161031f57806352236146146107ee578063524900b5146108215780635d7e1c9a14610836578063651879a91461087257806369e13300146108a557610451565b806344ad4f2a1461079a578063452ec811146107af5780634c98e243146107c45780635184cc43146107d957610451565b8063284c6beb116103de5780633a4ef544116103a25780633a4ef544146106d85780633e6dfa36146106ed5780633eedf63c1461071e5780634028358a1461072657806340c10f191461076157610451565b8063284c6beb146106205780632dae70251461064a5780632f5baf1e1461065f578063313ce56714610674578063395093511461069f57610451565b8063095ea7b311610425578063095ea7b3146105315780630ae085811461057e57806318160ddd146105b357806323b872dd146105c857806323ecdf611461060b57610451565b8062d1666d1461045657806301fe2b0c1461047d57806306131df71461049257806306fdde03146104a7575b600080fd5b34801561046257600080fd5b5061046b611080565b60408051918252519081900360200190f35b34801561048957600080fd5b5061046b611086565b34801561049e57600080fd5b5061046b61108c565b3480156104b357600080fd5b506104bc611092565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104f65781810151838201526020016104de565b50505050905090810190601f1680156105235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561053d57600080fd5b5061056a6004803603604081101561055457600080fd5b506001600160a01b0381351690602001356110a2565b604080519115158252519081900360200190f35b34801561058a57600080fd5b506105b1600480360360208110156105a157600080fd5b50356001600160a01b03166110c0565b005b3480156105bf57600080fd5b5061046b61113a565b3480156105d457600080fd5b5061056a600480360360608110156105eb57600080fd5b506001600160a01b03813581169160208101359091169060400135611144565b34801561061757600080fd5b5061056a6111a1565b34801561062c57600080fd5b506105b16004803603602081101561064357600080fd5b50356111b1565b34801561065657600080fd5b5061046b61120e565b34801561066b57600080fd5b5061056a611214565b34801561068057600080fd5b5061068961121d565b6040805160ff9092168252519081900360200190f35b3480156106ab57600080fd5b5061056a600480360360408110156106c257600080fd5b506001600160a01b038135169060200135611227565b3480156106e457600080fd5b5061046b611250565b3480156106f957600080fd5b50610702611256565b604080516001600160a01b039092168252519081900360200190f35b6105b1611265565b34801561073257600080fd5b506105b16004803603604081101561074957600080fd5b506001600160a01b038135811691602001351661128a565b34801561076d57600080fd5b506105b16004803603604081101561078457600080fd5b506001600160a01b0381351690602001356112f0565b3480156107a657600080fd5b5061046b6113e1565b3480156107bb57600080fd5b5061046b6113e7565b3480156107d057600080fd5b5061046b6113ed565b3480156107e557600080fd5b5061046b6113f3565b3480156107fa57600080fd5b506105b16004803603602081101561081157600080fd5b50356001600160a01b0316611432565b34801561082d57600080fd5b50610702611549565b34801561084257600080fd5b506105b16004803603608081101561085957600080fd5b5080359060208101359060408101359060600135611558565b34801561087e57600080fd5b506105b16004803603602081101561089557600080fd5b50356001600160a01b03166115c4565b3480156108b157600080fd5b506105b1600480360360208110156108c857600080fd5b503561163e565b3480156108db57600080fd5b5061046b600480360360208110156108f257600080fd5b50356001600160a01b031661169b565b34801561090e57600080fd5b5061046b6004803603602081101561092557600080fd5b50356001600160a01b031661174e565b34801561094157600080fd5b506105b161176f565b34801561095657600080fd5b50610702611811565b34801561096b57600080fd5b506109a26004803603606081101561098257600080fd5b506001600160a01b03813581169160208101359091169060400135611820565b6040805192835260208301919091528051918290030190f35b3480156109c757600080fd5b506105b1600480360360208110156109de57600080fd5b503515156118ab565b3480156109f357600080fd5b5061070260048036036020811015610a0a57600080fd5b5035611916565b348015610a1d57600080fd5b506105b160048036036020811015610a3457600080fd5b50351515611940565b348015610a4957600080fd5b506105b160048036036060811015610a6057600080fd5b50803590602081013590604001356119ad565b348015610a7f57600080fd5b50610702611a13565b348015610a9457600080fd5b506105b160048036036020811015610aab57600080fd5b50356001600160a01b0316611a22565b348015610ac757600080fd5b50610702611a87565b348015610adc57600080fd5b506105b160048036036020811015610af357600080fd5b50356001600160a01b0316611a96565b348015610b0f57600080fd5b50610b3660048036036020811015610b2657600080fd5b50356001600160a01b0316611b56565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b348015610b7f57600080fd5b50610702611be2565b348015610b9457600080fd5b506105b160048036036020811015610bab57600080fd5b50356001600160a01b0316611bf1565b348015610bc757600080fd5b5061056a611c6b565b348015610bdc57600080fd5b5061046b611c7b565b348015610bf157600080fd5b506104bc611caa565b348015610c0657600080fd5b5061046b611cb4565b348015610c1b57600080fd5b50610702611cba565b348015610c3057600080fd5b5061046b611cc9565b348015610c4557600080fd5b5061046b611ccf565b348015610c5a57600080fd5b5061046b611cd5565b348015610c6f57600080fd5b5061056a60048036036040811015610c8657600080fd5b506001600160a01b038135169060200135611cdb565b348015610ca857600080fd5b50610702611d17565b348015610cbd57600080fd5b506105b160048036036020811015610cd457600080fd5b5035611d26565b348015610ce757600080fd5b5061056a60048036036040811015610cfe57600080fd5b506001600160a01b038135169060200135611db3565b348015610d2057600080fd5b5061046b60048036036020811015610d3757600080fd5b50356001600160a01b0316611dc7565b348015610d5357600080fd5b5061046b60048036036040811015610d6a57600080fd5b506001600160a01b0381358116916020013516611de2565b348015610d8e57600080fd5b5061056a60048036036020811015610da557600080fd5b50356001600160a01b0316611e0d565b348015610dc157600080fd5b5061046b611e2b565b348015610dd657600080fd5b5061046b611e31565b348015610deb57600080fd5b506105b160048036036020811015610e0257600080fd5b50356001600160a01b0316611e37565b348015610e1e57600080fd5b50610e4d60048036036040811015610e3557600080fd5b506001600160a01b0381358116916020013516611eff565b60408051938452602084019290925282820152519081900360600190f35b348015610e7757600080fd5b506105b160048036036020811015610e8e57600080fd5b503561206d565b348015610ea157600080fd5b5061046b6120ca565b348015610eb657600080fd5b506105b160048036036020811015610ecd57600080fd5b50356001600160a01b03166120d0565b348015610ee957600080fd5b506105b160048036036020811015610f0057600080fd5b50356001600160a01b0316612134565b348015610f1c57600080fd5b5061046b61226b565b348015610f3157600080fd5b5061046b60048036036040811015610f4857600080fd5b506001600160a01b0381358116916020013516612271565b348015610f6c57600080fd5b5061046b60048036036020811015610f8357600080fd5b50356001600160a01b031661227d565b348015610f9f57600080fd5b5061070261231b565b348015610fb457600080fd5b506105b160048036036020811015610fcb57600080fd5b50356001600160a01b031661232a565b348015610fe757600080fd5b5061046b6123a4565b348015610ffc57600080fd5b5061056a6004803603602081101561101357600080fd5b50356001600160a01b03166123aa565b34801561102f57600080fd5b5061046b6123c8565b34801561104457600080fd5b506105b16004803603602081101561105b57600080fd5b50356001600160a01b03166123ce565b34801561107757600080fd5b5061046b6124c7565b601c5481565b60175481565b60135481565b606061109c61255c565b90505b90565b60006110b66110af61257d565b8484612581565b5060015b92915050565b6110c861257d565b6020546001600160a01b03908116911614611118576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600061109c6120ca565b6000611151848484612666565b6111978461115d61257d565b61119285604051806060016040528060288152602001613e516028913961118b8a61118661257d565b611de2565b9190612c98565b612581565b5060019392505050565b600c54600160a01b900460ff1690565b6111b961257d565b6020546001600160a01b03908116911614611209576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b601255565b601d5481565b60195460ff1681565b600061109c612d2f565b60006110b661123461257d565b846111928561124a61124461257d565b89611de2565b90612d34565b60145481565b600c546001600160a01b031690565b61126d612d8e565b600c805460ff60a81b1916600160a81b179055611288612e32565b565b61129261257d565b6020546001600160a01b039081169116146112e2576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b6112ec8282613448565b5050565b600c54600160a81b900460ff161561134f576040805162461bcd60e51b815260206004820152601960248201527f6e6f206d696e74696e672061667465722070726573616c652100000000000000604482015290519081900360640190fd5b600d546001600160a01b031661136361257d565b6001600160a01b0316146113a4576040805162461bcd60e51b81526020600482015260036024820152626e6f2160e81b604482015290519081900360640190fd5b6113ae82826135a2565b6040805182815290516001600160a01b03841691600091600080516020613ebd8339815191529181900360200190a35050565b601e5481565b600f5481565b60065481565b600c54600090600160a81b900460ff161561141e57600854600754611417916124cd565b905061109f565b61141761142961360f565b600754906124cd565b61143a61257d565b6020546001600160a01b0390811691161461148a576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b600980546001600160a01b039081166000908152601f60205260408120805460ff1916905591546114bb911661174e565b9050801561150e576009546114da906001600160a01b03168383612666565b6009546040805183815290516001600160a01b03808616931691600080516020613ebd833981519152919081900360200190a35b50600980546001600160a01b039092166001600160a01b0319909216821790556000908152601f60205260409020805460ff19166001179055565b600b546001600160a01b031690565b61156061257d565b6020546001600160a01b039081169116146115b0576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b601593909355601691909155601755601855565b6115cc61257d565b6020546001600160a01b0390811691161461161c576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b61164661257d565b6020546001600160a01b03908116911614611696576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b601a55565b6001600160a01b038116600090815260036020526040812060048101546002820154600583015460019093015484936116f293926116ec9290918391620186a0916116e69190613619565b90613619565b906124cd565b9050620186a081111561174357611710620186a06116ec8380613619565b601d5490915081016201869f19016000611728613672565b90508082116117375781611739565b805b9350505050611749565b50506015545b919050565b6000806117596113f3565b9050611768816116ec85611dc7565b9392505050565b61177761257d565b6020546001600160a01b039081169116146117c7576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b6020546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3602080546001600160a01b0319169055565b600e546001600160a01b031690565b6000806000601454868686600143034060405160200180868152602001856001600160a01b031660601b8152601401846001600160a01b031660601b8152601401838152602001828152602001955050505050506040516020818303038152906040528051906020012060001c9050600061189d82601154613696565b919791965090945050505050565b6118b361257d565b6020546001600160a01b03908116911614611903576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b6019805460ff1916911515919091179055565b60006002828154811061192557fe5b6000918252602090912001546001600160a01b031692915050565b61195061194b61257d565b611e0d565b61198f576040805162461bcd60e51b815260206004820152600b60248201526a6e6f74207461786c65737360a81b604482015290519081900360640190fd5b600c8054911515600160a01b0260ff60a01b19909216919091179055565b6119b561257d565b6020546001600160a01b03908116911614611a05576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b600f92909255601055601155565b600a546001600160a01b031690565b6001600160a01b03808216600090815260036020526040812054909182918291611a4e91869116611eff565b6001600160a01b039096166000908152600360208190526040909120908101969096556001860191909155600290940193909355505050565b6009546001600160a01b031690565b611a9e61257d565b6020546001600160a01b03908116911614611aee576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b611af781611e0d565b611b35576040805162461bcd60e51b815260206004820152600a6024820152693737ba1039b2ba3a32b960b11b604482015290519081900360640190fd5b6001600160a01b03166000908152601f60205260409020805460ff19169055565b600080600080600080611b67613d85565b505050506001600160a01b03938416600090815260036020818152604092839020835160c0810185528154909816808952600182015492890183905260028201549489018590529281015460608901819052600482015460808a0181905260059092015460a090990189905292989197939650919450909250565b6020546001600160a01b031690565b611bf961257d565b6020546001600160a01b03908116911614611c49576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600c54600160a81b900460ff1690565b600061109c611c90611c8b611a13565b61174e565b611ca4611c9c3061174e565b611ca46120ca565b9061251a565b606061109c6136a1565b601a5481565b600d546001600160a01b031681565b601b5481565b60105481565b60155481565b60006110b6611ce861257d565b8461119285604051806060016040528060258152602001613f266025913961118b611d1161257d565b8a611de2565b6005546001600160a01b031690565b600c805460ff60a01b1916600160a01b179055611d4161257d565b6020546001600160a01b03908116911614611d91576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b611da330611d9d6136be565b83612666565b50600c805460ff60a01b19169055565b60006110b6611dc061257d565b8484612666565b6001600160a01b031660009081526020819052604090205490565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b03166000908152601f602052604090205460ff1690565b60075490565b60065490565b611e3f61257d565b6020546001600160a01b03908116911614611e8f576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b611e9881611e0d565b15611edb576040805162461bcd60e51b815260206004820152600e60248201526d30b63932b0b23c9039b2ba3a32b960911b604482015290519081900360640190fd5b6001600160a01b03166000908152601f60205260409020805460ff19166001179055565b600080600080856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f3e57600080fd5b505afa158015611f52573d6000803e3d6000fd5b505050506040513d6020811015611f6857600080fd5b5051604080516370a0823160e01b81526001600160a01b0389166004820152905191925060009130916370a08231916024808301926020929190829003018186803b158015611fb657600080fd5b505afa158015611fca573d6000803e3d6000fd5b505050506040513d6020811015611fe057600080fd5b5051604080516370a0823160e01b81526001600160a01b038a811660048301529151929350600092918916916370a0823191602480820192602092909190829003018186803b15801561203257600080fd5b505afa158015612046573d6000803e3d6000fd5b505050506040513d602081101561205c57600080fd5b505191989197509195509350505050565b61207561257d565b6020546001600160a01b039081169116146120c5576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b601b55565b60085490565b6120d861257d565b6020546001600160a01b03908116911614612128576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b612131816136d6565b50565b61213c61257d565b6020546001600160a01b0390811691161461218c576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b600c805460ff60a01b1916600160a01b179055600a80546001600160a01b039081166000908152601f60205260408120805460ff1916905591546121d0911661174e565b9050801561222357600a546121ef906001600160a01b03168383612666565b600a546040805183815290516001600160a01b03808616931691600080516020613ebd833981519152919081900360200190a35b50600a80546001600160a01b039092166001600160a01b0319909216821790556000908152601f60205260409020805460ff19166001179055600c805460ff60a01b19169055565b60185481565b60006117688383611de2565b6001600160a01b038116600090815260036020526040812060018101546005820154600483015460029093015484936122c893926116ec9290918391620186a0916116e69190613619565b9050620186a0811115612311576122e6620186a06116ec8380613619565b601c5460185491925082016201869f19019081116123045780612308565b6018545b92505050611749565b5050601754611749565b600e546001600160a01b031681565b61233261257d565b6020546001600160a01b03908116911614612382576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b60125481565b6001600160a01b031660009081526004602052604090205460ff1690565b60115481565b6123d661257d565b6020546001600160a01b03908116911614612426576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b6001600160a01b03811661246b5760405162461bcd60e51b8152600401808060200182810382526026815260200180613de86026913960400191505060405180910390fd5b6020546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3602080546001600160a01b0319166001600160a01b0392909216919091179055565b60165481565b600061176883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613839565b651963082d3fff1990565b600061176883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c98565b60408051808201909152600781526652535441424c4560c81b602082015290565b3390565b6001600160a01b0383166125c65760405162461bcd60e51b8152600401808060200182810382526024815260200180613f026024913960400191505060405180910390fd5b6001600160a01b03821661260b5760405162461bcd60e51b8152600401808060200182810382526022815260200180613e0e6022913960400191505060405180910390fd5b61261683838361389e565b816001600160a01b0316836001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6001600160a01b0383166126ab5760405162461bcd60e51b8152600401808060200182810382526025815260200180613edd6025913960400191505060405180910390fd5b6001600160a01b0382166126f05760405162461bcd60e51b8152600401808060200182810382526023815260200180613dc56023913960400191505060405180910390fd5b60008111612745576040805162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f604482015290519081900360640190fd5b61274e8361174e565b8111156127a2576040805162461bcd60e51b815260206004820152601860248201527f416d6f756e7420657863656564732062616c616e636521210000000000000000604482015290519081900360640190fd5b60148054600101905560006127b56113f3565b905060006127c38383613619565b905060006127cf6111a1565b156127dc5750600361283b565b60006127e7876123aa565b156127fc576127f5876138ca565b905061282d565b612805866123aa565b156128185761281386611a22565b61282d565b60055461282d906001600160a01b0316611a22565b6128378782613935565b9150505b8060031461284e5761284e86868661397e565b8060011415612a47576000806000806128678a896139f0565b601e8490556001600160a01b038e1660009081526020819052604090205493975091955093509150612899908761251a565b6001600160a01b03808c1660009081526020819052604080822093909355908b16815220546128c89087612d34565b6001600160a01b038a166000908152602081905260409020556129196128ee8489613619565b6000806128f9611a13565b6001600160a01b0316815260208101919091526040016000205490612d34565b600080612924611a13565b6001600160a01b0316815260208101919091526040016000205561295661294b8389613619565b6000806128f96136be565b6000806129616136be565b6001600160a01b031681526020810191909152604001600020556008546129889082612d34565b6008556040805189815290516001600160a01b03808c1692908d1691600080516020613ebd8339815191529181900360200190a36129c4611a13565b6001600160a01b031660006001600160a01b0316600080516020613ebd833981519152856040518082815260200191505060405180910390a3612a056136be565b6001600160a01b031660006001600160a01b0316600080516020613ebd833981519152846040518082815260200191505060405180910390a350505050612c90565b8060021415612bf157600080612a5d8787613a54565b91509150600080612a6d88613abd565b90925090506000612a8283611ca48b8861251a565b90506000612a90828a613619565b6001600160a01b038d16600090815260208190526040902054909150612ab6908961251a565b6001600160a01b03808e1660009081526020819052604080822093909355908d1681522054612ae59082612d34565b6001600160a01b03808d166000908152602081905260408082209390935560095490911681522054612b179084612d34565b6009546001600160a01b0316600090815260208190526040902055600854612b3f908761251a565b600855600754612b4f908661251a565b6007556040805183815290516001600160a01b03808e1692908f1691600080516020613ebd8339815191529181900360200190a36040805187815290516000916001600160a01b038f1691600080516020613ebd8339815191529181900360200190a36009546040805186815290516001600160a01b03928316928f1691600080516020613ebd833981519152919081900360200190a3505050505050612c90565b8060031415612c90576001600160a01b038616600090815260208190526040902054612c1d908361251a565b6001600160a01b038088166000908152602081905260408082209390935590871681522054612c4c9083612d34565b6001600160a01b038087166000818152602081815260409182902094909455805188815290519193928a1692600080516020613ebd83398151915292918290030190a35b505050505050565b60008184841115612d275760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612cec578181015183820152602001612cd4565b50505050905090810190601f168015612d195780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600990565b600082820183811015611768576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b612d96611c6b565b15612de8576040805162461bcd60e51b815260206004820152601860248201527f43616e6e6f74206d696e7420706f73742070726573616c650000000000000000604482015290519081900360640190fd5b6000612dfd612df561113a565b611ca461360f565b9050612e0930826135a2565b6040805182815290513091600091600080516020613ebd8339815191529181900360200190a350565b600c805460ff60a01b1916600160a01b1790556000612e4f611549565b90506000612e5b611256565b90506000806001600160a01b0316826001600160a01b031663e6a43905856001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612eb157600080fd5b505afa158015612ec5573d6000803e3d6000fd5b505050506040513d6020811015612edb57600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b039092166004830152306024830152516044808301926020929190829003018186803b158015612f2857600080fd5b505afa158015612f3c573d6000803e3d6000fd5b505050506040513d6020811015612f5257600080fd5b50516001600160a01b0316141561305757816001600160a01b031663c9c65396846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612fab57600080fd5b505afa158015612fbf573d6000803e3d6000fd5b505050506040513d6020811015612fd557600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b0390921660048301523060248301525160448083019260209291908290030181600087803b15801561302457600080fd5b505af1158015613038573d6000803e3d6000fd5b505050506040513d602081101561304e57600080fd5b50519050613149565b816001600160a01b031663e6a4390530856001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156130a057600080fd5b505afa1580156130b4573d6000803e3d6000fd5b505050506040513d60208110156130ca57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039384166004820152929091166024830152516044808301926020929190829003018186803b15801561311a57600080fd5b505afa15801561312e573d6000803e3d6000fd5b505050506040513d602081101561314457600080fd5b505190505b476000613166633b9aca006116ec61315f613afe565b8590613619565b90506131713061174e565b811115613184576131813061174e565b90505b61318f308683612581565b6040805163f305d71960e01b8152306004820181905260248201849052600060448301819052606483015260848201524260a482015290516001600160a01b0387169163f305d71991859160c48082019260609290919082900301818588803b1580156131fb57600080fd5b505af115801561320f573d6000803e3d6000fd5b50505050506040513d606081101561322657600080fd5b5050604080516315ab88c960e31b8152905161329f9185916001600160a01b0389169163ad5c4648916004808301926020929190829003018186803b15801561326e57600080fd5b505afa158015613282573d6000803e3d6000fd5b505050506040513d602081101561329857600080fd5b5051613448565b600580546001600160a01b0319166001600160a01b038516908117909155604080516370a0823160e01b81523060048201529051600092916370a08231916024808301926020929190829003018186803b1580156132fc57600080fd5b505afa158015613310573d6000803e3d6000fd5b505050506040513d602081101561332657600080fd5b5051600e546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810184905290519293509086169163095ea7b3916044808201926020929091908290030181600087803b15801561338157600080fd5b505af1158015613395573d6000803e3d6000fd5b505050506040513d60208110156133ab57600080fd5b5050600e546001600160a01b03166399c6d2de85836133ce426303c26700612d34565b6040518463ffffffff1660e01b815260040180846001600160a01b031681526020018381526020018281526020019350505050600060405180830381600087803b15801561341b57600080fd5b505af115801561342f573d6000803e3d6000fd5b5050600c805460ff60a01b191690555050505050505050565b613451826123aa565b156134a3576040805162461bcd60e51b815260206004820152601e60248201527f5468697320706f6f6c20697320616c726561647920737570706f727465640000604482015290519081900360640190fd5b6001600160a01b0382166000818152600460205260408120805460ff1916600190811790915560028054918201815582527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b03191690921790915580806135148585611eff565b6040805160c0810182526001600160a01b0398891681526020808201868152828401868152606084019586526080840197885260a084019687529b8b16600090815260039283905293909320915182546001600160a01b0319169a16999099178155905160018201559751600289015551958701959095555160048601555050905160059092019190915550565b60006135ac6113f3565b905060006135ba8383613619565b6001600160a01b0385166000908152602081905260409020549091506135e09082612d34565b6001600160a01b0385166000908152602081905260409020556008546136069084612d34565b60085550505050565b65952839be400090565b600082613628575060006110ba565b8282028284828161363557fe5b04146117685760405162461bcd60e51b8152600401808060200182810382526021815260200180613e306021913960400191505060405180910390fd5b60195460009060ff161561368d57506018546000190161109f565b5060165461109f565b60020a600019011690565b6040805180820190915260038152621494d560ea1b602082015290565b73f7fbdea9b0e7af8034f9fc99d7d95b4d4a52b94890565b6136df816123aa565b61371a5760405162461bcd60e51b8152600401808060200182810382526024815260200180613e996024913960400191505060405180910390fd5b60005b6002548110156112ec57816001600160a01b03166002828154811061373e57fe5b6000918252602090912001546001600160a01b031614156138315760028054600019810190811061376b57fe5b600091825260209091200154600280546001600160a01b03909216918390811061379157fe5b6000918252602080832090910180546001600160a01b039485166001600160a01b031991821617909155928516825260048082526040808420805460ff19169055600392839052832080549094168455600184018390556002808501849055918401839055830182905560059092015580548061380a57fe5b600082815260209020810160001990810180546001600160a01b03191690550190556112ec565b60010161371d565b600081836138885760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612cec578181015183820152602001612cd4565b50600083858161389457fe5b0495945050505050565b6001600160a01b0392831660009081526001602090815260408083209490951682529290925291902055565b6001600160a01b0380821660009081526003602052604081205490918291829182916138f891879116611eff565b6001600160a01b03979097166000908152600360208190526040909120908101805490899055600182019390935560020155909410949350505050565b60006002613942846123aa565b1561395e57821561395557506003613959565b5060015b611768565b600b546001600160a01b0385811691161415611768575060039392505050565b61398c60125461124a611e31565b4211156139a25761399d6000613b04565b6139eb565b6013544314156139b1576139eb565b436013556000806139c3858585611820565b91509150600f5481101580156139da575060105481105b156139e8576139e882613b04565b50505b505050565b6000806000806000613a018761227d565b90506000613a16620186a06116ec8985613619565b905081613a2a6127106116ec61315f613cfd565b613a426127106116ec613a3b613d02565b8690613619565b919a9099509097509095509350505050565b6000806000613a616113f3565b90506000613a8d613a71876123aa565b613a86576005546001600160a01b0316613a88565b865b61169b565b90506000613aa2620186a06116ec8885613619565b905080613aaf8185613619565b945094505050509250929050565b6000806000613aca6113f3565b90506000613ae66127106116ec613adf613cfd565b8890613619565b905080613af38184613619565b935093505050915091565b61032090565b613b0c613d07565b60005b600254811015613c3e576003600060028381548110613b2a57fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020600101546003600060028481548110613b7d57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400181206004019190915560028054600392919084908110613bbb57fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020600201546003600060028481548110613c0e57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060050155600101613b0f565b50601a805460010190819055601b541415613c5e576019805460ff191690555b80613c6e57613c6b613d0d565b90505b613c9081601754613c8b60026018546124cd90919063ffffffff16565b613d43565b601c55601554601654919250613cae91839190613c8b9060026124cd565b601d819055601c546040805142815260208101929092528181019290925290517f3bb7b347508b7c148ec2094ac60d2e3d8b7595421025643f08b45cb78b326b5892509081900360600190a150565b603290565b606490565b42600655565b60145460408051600019430140602080830191909152818301939093528151808203830181526060909101909152805191012090565b60008080613d51848661251a565b6040805160208082018a9052825180830382018152918301909252805191012081613d7857fe5b0696948701955050505050565b6040518060c0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152509056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725468697320706f6f6c2069732063757272656e746c79206e6f7420737570706f72746564ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203950eecfb05cd8337fc6cc176f62a283b539f25de01bdbe7a7e953faabec6fe164736f6c634300060c0033

Deployed Bytecode

0x6080604052600436106104515760003560e01c806380c2bbd21161023f578063b21c327811610139578063dd272a92116100b6578063ebff765e1161007a578063ebff765e14610fdb578063ec2b4e3614610ff0578063f14c143814611023578063f2fde38b14611038578063f904ed9f1461106b57610451565b8063dd272a9214610f10578063dd62ed3e14610f25578063ddca149d14610f60578063e46761c414610f93578063ea8cf4e014610fa857610451565b8063bf9a3a1b116100fd578063bf9a3a1b14610e12578063c0e8b61f14610e6b578063c4e41b2214610e95578063cb4d319514610eaa578063db7f521a14610edd57610451565b8063b21c327814610d47578063b6333d8314610d82578063b72455bd14610db5578063b97dd9e214610dca578063bef2112414610ddf57610451565b80639c470766116101c7578063a457c2d71161018b578063a457c2d714610c63578063a5a302d314610c9c578063a5a587c714610cb1578063a9059cbb14610cdb578063ae2089ad14610d1457610451565b80639c47076614610bfa5780639d60440614610c0f5780639dd2367814610c245780639f053c5f14610c39578063a29b035514610c4e57610451565b80638da5cb5b1161020e5780638da5cb5b14610b7357806391ec28dd14610b88578063927ac38614610bbb5780639358928b14610bd057806395d89b4114610be557610451565b806380c2bbd214610a8857806380dc74da14610abb5780638484ed7e14610ad05780638939878314610b0357610451565b806344ad4f2a116103505780636cc23d94116102d8578063778e44a71161029c578063778e44a7146109bb5780637dff2680146109e75780637e47d62514610a115780637e82933f14610a3d57806380af179914610a7357610451565b80636cc23d94146108cf57806370a0823114610902578063715018a61461093557806372af217e1461094a5780637656a7c21461095f57610451565b8063522361461161031f57806352236146146107ee578063524900b5146108215780635d7e1c9a14610836578063651879a91461087257806369e13300146108a557610451565b806344ad4f2a1461079a578063452ec811146107af5780634c98e243146107c45780635184cc43146107d957610451565b8063284c6beb116103de5780633a4ef544116103a25780633a4ef544146106d85780633e6dfa36146106ed5780633eedf63c1461071e5780634028358a1461072657806340c10f191461076157610451565b8063284c6beb146106205780632dae70251461064a5780632f5baf1e1461065f578063313ce56714610674578063395093511461069f57610451565b8063095ea7b311610425578063095ea7b3146105315780630ae085811461057e57806318160ddd146105b357806323b872dd146105c857806323ecdf611461060b57610451565b8062d1666d1461045657806301fe2b0c1461047d57806306131df71461049257806306fdde03146104a7575b600080fd5b34801561046257600080fd5b5061046b611080565b60408051918252519081900360200190f35b34801561048957600080fd5b5061046b611086565b34801561049e57600080fd5b5061046b61108c565b3480156104b357600080fd5b506104bc611092565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104f65781810151838201526020016104de565b50505050905090810190601f1680156105235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561053d57600080fd5b5061056a6004803603604081101561055457600080fd5b506001600160a01b0381351690602001356110a2565b604080519115158252519081900360200190f35b34801561058a57600080fd5b506105b1600480360360208110156105a157600080fd5b50356001600160a01b03166110c0565b005b3480156105bf57600080fd5b5061046b61113a565b3480156105d457600080fd5b5061056a600480360360608110156105eb57600080fd5b506001600160a01b03813581169160208101359091169060400135611144565b34801561061757600080fd5b5061056a6111a1565b34801561062c57600080fd5b506105b16004803603602081101561064357600080fd5b50356111b1565b34801561065657600080fd5b5061046b61120e565b34801561066b57600080fd5b5061056a611214565b34801561068057600080fd5b5061068961121d565b6040805160ff9092168252519081900360200190f35b3480156106ab57600080fd5b5061056a600480360360408110156106c257600080fd5b506001600160a01b038135169060200135611227565b3480156106e457600080fd5b5061046b611250565b3480156106f957600080fd5b50610702611256565b604080516001600160a01b039092168252519081900360200190f35b6105b1611265565b34801561073257600080fd5b506105b16004803603604081101561074957600080fd5b506001600160a01b038135811691602001351661128a565b34801561076d57600080fd5b506105b16004803603604081101561078457600080fd5b506001600160a01b0381351690602001356112f0565b3480156107a657600080fd5b5061046b6113e1565b3480156107bb57600080fd5b5061046b6113e7565b3480156107d057600080fd5b5061046b6113ed565b3480156107e557600080fd5b5061046b6113f3565b3480156107fa57600080fd5b506105b16004803603602081101561081157600080fd5b50356001600160a01b0316611432565b34801561082d57600080fd5b50610702611549565b34801561084257600080fd5b506105b16004803603608081101561085957600080fd5b5080359060208101359060408101359060600135611558565b34801561087e57600080fd5b506105b16004803603602081101561089557600080fd5b50356001600160a01b03166115c4565b3480156108b157600080fd5b506105b1600480360360208110156108c857600080fd5b503561163e565b3480156108db57600080fd5b5061046b600480360360208110156108f257600080fd5b50356001600160a01b031661169b565b34801561090e57600080fd5b5061046b6004803603602081101561092557600080fd5b50356001600160a01b031661174e565b34801561094157600080fd5b506105b161176f565b34801561095657600080fd5b50610702611811565b34801561096b57600080fd5b506109a26004803603606081101561098257600080fd5b506001600160a01b03813581169160208101359091169060400135611820565b6040805192835260208301919091528051918290030190f35b3480156109c757600080fd5b506105b1600480360360208110156109de57600080fd5b503515156118ab565b3480156109f357600080fd5b5061070260048036036020811015610a0a57600080fd5b5035611916565b348015610a1d57600080fd5b506105b160048036036020811015610a3457600080fd5b50351515611940565b348015610a4957600080fd5b506105b160048036036060811015610a6057600080fd5b50803590602081013590604001356119ad565b348015610a7f57600080fd5b50610702611a13565b348015610a9457600080fd5b506105b160048036036020811015610aab57600080fd5b50356001600160a01b0316611a22565b348015610ac757600080fd5b50610702611a87565b348015610adc57600080fd5b506105b160048036036020811015610af357600080fd5b50356001600160a01b0316611a96565b348015610b0f57600080fd5b50610b3660048036036020811015610b2657600080fd5b50356001600160a01b0316611b56565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b348015610b7f57600080fd5b50610702611be2565b348015610b9457600080fd5b506105b160048036036020811015610bab57600080fd5b50356001600160a01b0316611bf1565b348015610bc757600080fd5b5061056a611c6b565b348015610bdc57600080fd5b5061046b611c7b565b348015610bf157600080fd5b506104bc611caa565b348015610c0657600080fd5b5061046b611cb4565b348015610c1b57600080fd5b50610702611cba565b348015610c3057600080fd5b5061046b611cc9565b348015610c4557600080fd5b5061046b611ccf565b348015610c5a57600080fd5b5061046b611cd5565b348015610c6f57600080fd5b5061056a60048036036040811015610c8657600080fd5b506001600160a01b038135169060200135611cdb565b348015610ca857600080fd5b50610702611d17565b348015610cbd57600080fd5b506105b160048036036020811015610cd457600080fd5b5035611d26565b348015610ce757600080fd5b5061056a60048036036040811015610cfe57600080fd5b506001600160a01b038135169060200135611db3565b348015610d2057600080fd5b5061046b60048036036020811015610d3757600080fd5b50356001600160a01b0316611dc7565b348015610d5357600080fd5b5061046b60048036036040811015610d6a57600080fd5b506001600160a01b0381358116916020013516611de2565b348015610d8e57600080fd5b5061056a60048036036020811015610da557600080fd5b50356001600160a01b0316611e0d565b348015610dc157600080fd5b5061046b611e2b565b348015610dd657600080fd5b5061046b611e31565b348015610deb57600080fd5b506105b160048036036020811015610e0257600080fd5b50356001600160a01b0316611e37565b348015610e1e57600080fd5b50610e4d60048036036040811015610e3557600080fd5b506001600160a01b0381358116916020013516611eff565b60408051938452602084019290925282820152519081900360600190f35b348015610e7757600080fd5b506105b160048036036020811015610e8e57600080fd5b503561206d565b348015610ea157600080fd5b5061046b6120ca565b348015610eb657600080fd5b506105b160048036036020811015610ecd57600080fd5b50356001600160a01b03166120d0565b348015610ee957600080fd5b506105b160048036036020811015610f0057600080fd5b50356001600160a01b0316612134565b348015610f1c57600080fd5b5061046b61226b565b348015610f3157600080fd5b5061046b60048036036040811015610f4857600080fd5b506001600160a01b0381358116916020013516612271565b348015610f6c57600080fd5b5061046b60048036036020811015610f8357600080fd5b50356001600160a01b031661227d565b348015610f9f57600080fd5b5061070261231b565b348015610fb457600080fd5b506105b160048036036020811015610fcb57600080fd5b50356001600160a01b031661232a565b348015610fe757600080fd5b5061046b6123a4565b348015610ffc57600080fd5b5061056a6004803603602081101561101357600080fd5b50356001600160a01b03166123aa565b34801561102f57600080fd5b5061046b6123c8565b34801561104457600080fd5b506105b16004803603602081101561105b57600080fd5b50356001600160a01b03166123ce565b34801561107757600080fd5b5061046b6124c7565b601c5481565b60175481565b60135481565b606061109c61255c565b90505b90565b60006110b66110af61257d565b8484612581565b5060015b92915050565b6110c861257d565b6020546001600160a01b03908116911614611118576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600061109c6120ca565b6000611151848484612666565b6111978461115d61257d565b61119285604051806060016040528060288152602001613e516028913961118b8a61118661257d565b611de2565b9190612c98565b612581565b5060019392505050565b600c54600160a01b900460ff1690565b6111b961257d565b6020546001600160a01b03908116911614611209576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b601255565b601d5481565b60195460ff1681565b600061109c612d2f565b60006110b661123461257d565b846111928561124a61124461257d565b89611de2565b90612d34565b60145481565b600c546001600160a01b031690565b61126d612d8e565b600c805460ff60a81b1916600160a81b179055611288612e32565b565b61129261257d565b6020546001600160a01b039081169116146112e2576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b6112ec8282613448565b5050565b600c54600160a81b900460ff161561134f576040805162461bcd60e51b815260206004820152601960248201527f6e6f206d696e74696e672061667465722070726573616c652100000000000000604482015290519081900360640190fd5b600d546001600160a01b031661136361257d565b6001600160a01b0316146113a4576040805162461bcd60e51b81526020600482015260036024820152626e6f2160e81b604482015290519081900360640190fd5b6113ae82826135a2565b6040805182815290516001600160a01b03841691600091600080516020613ebd8339815191529181900360200190a35050565b601e5481565b600f5481565b60065481565b600c54600090600160a81b900460ff161561141e57600854600754611417916124cd565b905061109f565b61141761142961360f565b600754906124cd565b61143a61257d565b6020546001600160a01b0390811691161461148a576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b600980546001600160a01b039081166000908152601f60205260408120805460ff1916905591546114bb911661174e565b9050801561150e576009546114da906001600160a01b03168383612666565b6009546040805183815290516001600160a01b03808616931691600080516020613ebd833981519152919081900360200190a35b50600980546001600160a01b039092166001600160a01b0319909216821790556000908152601f60205260409020805460ff19166001179055565b600b546001600160a01b031690565b61156061257d565b6020546001600160a01b039081169116146115b0576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b601593909355601691909155601755601855565b6115cc61257d565b6020546001600160a01b0390811691161461161c576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b61164661257d565b6020546001600160a01b03908116911614611696576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b601a55565b6001600160a01b038116600090815260036020526040812060048101546002820154600583015460019093015484936116f293926116ec9290918391620186a0916116e69190613619565b90613619565b906124cd565b9050620186a081111561174357611710620186a06116ec8380613619565b601d5490915081016201869f19016000611728613672565b90508082116117375781611739565b805b9350505050611749565b50506015545b919050565b6000806117596113f3565b9050611768816116ec85611dc7565b9392505050565b61177761257d565b6020546001600160a01b039081169116146117c7576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b6020546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3602080546001600160a01b0319169055565b600e546001600160a01b031690565b6000806000601454868686600143034060405160200180868152602001856001600160a01b031660601b8152601401846001600160a01b031660601b8152601401838152602001828152602001955050505050506040516020818303038152906040528051906020012060001c9050600061189d82601154613696565b919791965090945050505050565b6118b361257d565b6020546001600160a01b03908116911614611903576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b6019805460ff1916911515919091179055565b60006002828154811061192557fe5b6000918252602090912001546001600160a01b031692915050565b61195061194b61257d565b611e0d565b61198f576040805162461bcd60e51b815260206004820152600b60248201526a6e6f74207461786c65737360a81b604482015290519081900360640190fd5b600c8054911515600160a01b0260ff60a01b19909216919091179055565b6119b561257d565b6020546001600160a01b03908116911614611a05576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b600f92909255601055601155565b600a546001600160a01b031690565b6001600160a01b03808216600090815260036020526040812054909182918291611a4e91869116611eff565b6001600160a01b039096166000908152600360208190526040909120908101969096556001860191909155600290940193909355505050565b6009546001600160a01b031690565b611a9e61257d565b6020546001600160a01b03908116911614611aee576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b611af781611e0d565b611b35576040805162461bcd60e51b815260206004820152600a6024820152693737ba1039b2ba3a32b960b11b604482015290519081900360640190fd5b6001600160a01b03166000908152601f60205260409020805460ff19169055565b600080600080600080611b67613d85565b505050506001600160a01b03938416600090815260036020818152604092839020835160c0810185528154909816808952600182015492890183905260028201549489018590529281015460608901819052600482015460808a0181905260059092015460a090990189905292989197939650919450909250565b6020546001600160a01b031690565b611bf961257d565b6020546001600160a01b03908116911614611c49576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600c54600160a81b900460ff1690565b600061109c611c90611c8b611a13565b61174e565b611ca4611c9c3061174e565b611ca46120ca565b9061251a565b606061109c6136a1565b601a5481565b600d546001600160a01b031681565b601b5481565b60105481565b60155481565b60006110b6611ce861257d565b8461119285604051806060016040528060258152602001613f266025913961118b611d1161257d565b8a611de2565b6005546001600160a01b031690565b600c805460ff60a01b1916600160a01b179055611d4161257d565b6020546001600160a01b03908116911614611d91576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b611da330611d9d6136be565b83612666565b50600c805460ff60a01b19169055565b60006110b6611dc061257d565b8484612666565b6001600160a01b031660009081526020819052604090205490565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b03166000908152601f602052604090205460ff1690565b60075490565b60065490565b611e3f61257d565b6020546001600160a01b03908116911614611e8f576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b611e9881611e0d565b15611edb576040805162461bcd60e51b815260206004820152600e60248201526d30b63932b0b23c9039b2ba3a32b960911b604482015290519081900360640190fd5b6001600160a01b03166000908152601f60205260409020805460ff19166001179055565b600080600080856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f3e57600080fd5b505afa158015611f52573d6000803e3d6000fd5b505050506040513d6020811015611f6857600080fd5b5051604080516370a0823160e01b81526001600160a01b0389166004820152905191925060009130916370a08231916024808301926020929190829003018186803b158015611fb657600080fd5b505afa158015611fca573d6000803e3d6000fd5b505050506040513d6020811015611fe057600080fd5b5051604080516370a0823160e01b81526001600160a01b038a811660048301529151929350600092918916916370a0823191602480820192602092909190829003018186803b15801561203257600080fd5b505afa158015612046573d6000803e3d6000fd5b505050506040513d602081101561205c57600080fd5b505191989197509195509350505050565b61207561257d565b6020546001600160a01b039081169116146120c5576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b601b55565b60085490565b6120d861257d565b6020546001600160a01b03908116911614612128576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b612131816136d6565b50565b61213c61257d565b6020546001600160a01b0390811691161461218c576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b600c805460ff60a01b1916600160a01b179055600a80546001600160a01b039081166000908152601f60205260408120805460ff1916905591546121d0911661174e565b9050801561222357600a546121ef906001600160a01b03168383612666565b600a546040805183815290516001600160a01b03808616931691600080516020613ebd833981519152919081900360200190a35b50600a80546001600160a01b039092166001600160a01b0319909216821790556000908152601f60205260409020805460ff19166001179055600c805460ff60a01b19169055565b60185481565b60006117688383611de2565b6001600160a01b038116600090815260036020526040812060018101546005820154600483015460029093015484936122c893926116ec9290918391620186a0916116e69190613619565b9050620186a0811115612311576122e6620186a06116ec8380613619565b601c5460185491925082016201869f19019081116123045780612308565b6018545b92505050611749565b5050601754611749565b600e546001600160a01b031681565b61233261257d565b6020546001600160a01b03908116911614612382576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b60125481565b6001600160a01b031660009081526004602052604090205460ff1690565b60115481565b6123d661257d565b6020546001600160a01b03908116911614612426576040805162461bcd60e51b81526020600482018190526024820152600080516020613e79833981519152604482015290519081900360640190fd5b6001600160a01b03811661246b5760405162461bcd60e51b8152600401808060200182810382526026815260200180613de86026913960400191505060405180910390fd5b6020546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3602080546001600160a01b0319166001600160a01b0392909216919091179055565b60165481565b600061176883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613839565b651963082d3fff1990565b600061176883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c98565b60408051808201909152600781526652535441424c4560c81b602082015290565b3390565b6001600160a01b0383166125c65760405162461bcd60e51b8152600401808060200182810382526024815260200180613f026024913960400191505060405180910390fd5b6001600160a01b03821661260b5760405162461bcd60e51b8152600401808060200182810382526022815260200180613e0e6022913960400191505060405180910390fd5b61261683838361389e565b816001600160a01b0316836001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6001600160a01b0383166126ab5760405162461bcd60e51b8152600401808060200182810382526025815260200180613edd6025913960400191505060405180910390fd5b6001600160a01b0382166126f05760405162461bcd60e51b8152600401808060200182810382526023815260200180613dc56023913960400191505060405180910390fd5b60008111612745576040805162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f604482015290519081900360640190fd5b61274e8361174e565b8111156127a2576040805162461bcd60e51b815260206004820152601860248201527f416d6f756e7420657863656564732062616c616e636521210000000000000000604482015290519081900360640190fd5b60148054600101905560006127b56113f3565b905060006127c38383613619565b905060006127cf6111a1565b156127dc5750600361283b565b60006127e7876123aa565b156127fc576127f5876138ca565b905061282d565b612805866123aa565b156128185761281386611a22565b61282d565b60055461282d906001600160a01b0316611a22565b6128378782613935565b9150505b8060031461284e5761284e86868661397e565b8060011415612a47576000806000806128678a896139f0565b601e8490556001600160a01b038e1660009081526020819052604090205493975091955093509150612899908761251a565b6001600160a01b03808c1660009081526020819052604080822093909355908b16815220546128c89087612d34565b6001600160a01b038a166000908152602081905260409020556129196128ee8489613619565b6000806128f9611a13565b6001600160a01b0316815260208101919091526040016000205490612d34565b600080612924611a13565b6001600160a01b0316815260208101919091526040016000205561295661294b8389613619565b6000806128f96136be565b6000806129616136be565b6001600160a01b031681526020810191909152604001600020556008546129889082612d34565b6008556040805189815290516001600160a01b03808c1692908d1691600080516020613ebd8339815191529181900360200190a36129c4611a13565b6001600160a01b031660006001600160a01b0316600080516020613ebd833981519152856040518082815260200191505060405180910390a3612a056136be565b6001600160a01b031660006001600160a01b0316600080516020613ebd833981519152846040518082815260200191505060405180910390a350505050612c90565b8060021415612bf157600080612a5d8787613a54565b91509150600080612a6d88613abd565b90925090506000612a8283611ca48b8861251a565b90506000612a90828a613619565b6001600160a01b038d16600090815260208190526040902054909150612ab6908961251a565b6001600160a01b03808e1660009081526020819052604080822093909355908d1681522054612ae59082612d34565b6001600160a01b03808d166000908152602081905260408082209390935560095490911681522054612b179084612d34565b6009546001600160a01b0316600090815260208190526040902055600854612b3f908761251a565b600855600754612b4f908661251a565b6007556040805183815290516001600160a01b03808e1692908f1691600080516020613ebd8339815191529181900360200190a36040805187815290516000916001600160a01b038f1691600080516020613ebd8339815191529181900360200190a36009546040805186815290516001600160a01b03928316928f1691600080516020613ebd833981519152919081900360200190a3505050505050612c90565b8060031415612c90576001600160a01b038616600090815260208190526040902054612c1d908361251a565b6001600160a01b038088166000908152602081905260408082209390935590871681522054612c4c9083612d34565b6001600160a01b038087166000818152602081815260409182902094909455805188815290519193928a1692600080516020613ebd83398151915292918290030190a35b505050505050565b60008184841115612d275760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612cec578181015183820152602001612cd4565b50505050905090810190601f168015612d195780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600990565b600082820183811015611768576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b612d96611c6b565b15612de8576040805162461bcd60e51b815260206004820152601860248201527f43616e6e6f74206d696e7420706f73742070726573616c650000000000000000604482015290519081900360640190fd5b6000612dfd612df561113a565b611ca461360f565b9050612e0930826135a2565b6040805182815290513091600091600080516020613ebd8339815191529181900360200190a350565b600c805460ff60a01b1916600160a01b1790556000612e4f611549565b90506000612e5b611256565b90506000806001600160a01b0316826001600160a01b031663e6a43905856001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612eb157600080fd5b505afa158015612ec5573d6000803e3d6000fd5b505050506040513d6020811015612edb57600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b039092166004830152306024830152516044808301926020929190829003018186803b158015612f2857600080fd5b505afa158015612f3c573d6000803e3d6000fd5b505050506040513d6020811015612f5257600080fd5b50516001600160a01b0316141561305757816001600160a01b031663c9c65396846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612fab57600080fd5b505afa158015612fbf573d6000803e3d6000fd5b505050506040513d6020811015612fd557600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b0390921660048301523060248301525160448083019260209291908290030181600087803b15801561302457600080fd5b505af1158015613038573d6000803e3d6000fd5b505050506040513d602081101561304e57600080fd5b50519050613149565b816001600160a01b031663e6a4390530856001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156130a057600080fd5b505afa1580156130b4573d6000803e3d6000fd5b505050506040513d60208110156130ca57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039384166004820152929091166024830152516044808301926020929190829003018186803b15801561311a57600080fd5b505afa15801561312e573d6000803e3d6000fd5b505050506040513d602081101561314457600080fd5b505190505b476000613166633b9aca006116ec61315f613afe565b8590613619565b90506131713061174e565b811115613184576131813061174e565b90505b61318f308683612581565b6040805163f305d71960e01b8152306004820181905260248201849052600060448301819052606483015260848201524260a482015290516001600160a01b0387169163f305d71991859160c48082019260609290919082900301818588803b1580156131fb57600080fd5b505af115801561320f573d6000803e3d6000fd5b50505050506040513d606081101561322657600080fd5b5050604080516315ab88c960e31b8152905161329f9185916001600160a01b0389169163ad5c4648916004808301926020929190829003018186803b15801561326e57600080fd5b505afa158015613282573d6000803e3d6000fd5b505050506040513d602081101561329857600080fd5b5051613448565b600580546001600160a01b0319166001600160a01b038516908117909155604080516370a0823160e01b81523060048201529051600092916370a08231916024808301926020929190829003018186803b1580156132fc57600080fd5b505afa158015613310573d6000803e3d6000fd5b505050506040513d602081101561332657600080fd5b5051600e546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810184905290519293509086169163095ea7b3916044808201926020929091908290030181600087803b15801561338157600080fd5b505af1158015613395573d6000803e3d6000fd5b505050506040513d60208110156133ab57600080fd5b5050600e546001600160a01b03166399c6d2de85836133ce426303c26700612d34565b6040518463ffffffff1660e01b815260040180846001600160a01b031681526020018381526020018281526020019350505050600060405180830381600087803b15801561341b57600080fd5b505af115801561342f573d6000803e3d6000fd5b5050600c805460ff60a01b191690555050505050505050565b613451826123aa565b156134a3576040805162461bcd60e51b815260206004820152601e60248201527f5468697320706f6f6c20697320616c726561647920737570706f727465640000604482015290519081900360640190fd5b6001600160a01b0382166000818152600460205260408120805460ff1916600190811790915560028054918201815582527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b03191690921790915580806135148585611eff565b6040805160c0810182526001600160a01b0398891681526020808201868152828401868152606084019586526080840197885260a084019687529b8b16600090815260039283905293909320915182546001600160a01b0319169a16999099178155905160018201559751600289015551958701959095555160048601555050905160059092019190915550565b60006135ac6113f3565b905060006135ba8383613619565b6001600160a01b0385166000908152602081905260409020549091506135e09082612d34565b6001600160a01b0385166000908152602081905260409020556008546136069084612d34565b60085550505050565b65952839be400090565b600082613628575060006110ba565b8282028284828161363557fe5b04146117685760405162461bcd60e51b8152600401808060200182810382526021815260200180613e306021913960400191505060405180910390fd5b60195460009060ff161561368d57506018546000190161109f565b5060165461109f565b60020a600019011690565b6040805180820190915260038152621494d560ea1b602082015290565b73f7fbdea9b0e7af8034f9fc99d7d95b4d4a52b94890565b6136df816123aa565b61371a5760405162461bcd60e51b8152600401808060200182810382526024815260200180613e996024913960400191505060405180910390fd5b60005b6002548110156112ec57816001600160a01b03166002828154811061373e57fe5b6000918252602090912001546001600160a01b031614156138315760028054600019810190811061376b57fe5b600091825260209091200154600280546001600160a01b03909216918390811061379157fe5b6000918252602080832090910180546001600160a01b039485166001600160a01b031991821617909155928516825260048082526040808420805460ff19169055600392839052832080549094168455600184018390556002808501849055918401839055830182905560059092015580548061380a57fe5b600082815260209020810160001990810180546001600160a01b03191690550190556112ec565b60010161371d565b600081836138885760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612cec578181015183820152602001612cd4565b50600083858161389457fe5b0495945050505050565b6001600160a01b0392831660009081526001602090815260408083209490951682529290925291902055565b6001600160a01b0380821660009081526003602052604081205490918291829182916138f891879116611eff565b6001600160a01b03979097166000908152600360208190526040909120908101805490899055600182019390935560020155909410949350505050565b60006002613942846123aa565b1561395e57821561395557506003613959565b5060015b611768565b600b546001600160a01b0385811691161415611768575060039392505050565b61398c60125461124a611e31565b4211156139a25761399d6000613b04565b6139eb565b6013544314156139b1576139eb565b436013556000806139c3858585611820565b91509150600f5481101580156139da575060105481105b156139e8576139e882613b04565b50505b505050565b6000806000806000613a018761227d565b90506000613a16620186a06116ec8985613619565b905081613a2a6127106116ec61315f613cfd565b613a426127106116ec613a3b613d02565b8690613619565b919a9099509097509095509350505050565b6000806000613a616113f3565b90506000613a8d613a71876123aa565b613a86576005546001600160a01b0316613a88565b865b61169b565b90506000613aa2620186a06116ec8885613619565b905080613aaf8185613619565b945094505050509250929050565b6000806000613aca6113f3565b90506000613ae66127106116ec613adf613cfd565b8890613619565b905080613af38184613619565b935093505050915091565b61032090565b613b0c613d07565b60005b600254811015613c3e576003600060028381548110613b2a57fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020600101546003600060028481548110613b7d57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400181206004019190915560028054600392919084908110613bbb57fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020600201546003600060028481548110613c0e57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060050155600101613b0f565b50601a805460010190819055601b541415613c5e576019805460ff191690555b80613c6e57613c6b613d0d565b90505b613c9081601754613c8b60026018546124cd90919063ffffffff16565b613d43565b601c55601554601654919250613cae91839190613c8b9060026124cd565b601d819055601c546040805142815260208101929092528181019290925290517f3bb7b347508b7c148ec2094ac60d2e3d8b7595421025643f08b45cb78b326b5892509081900360600190a150565b603290565b606490565b42600655565b60145460408051600019430140602080830191909152818301939093528151808203830181526060909101909152805191012090565b60008080613d51848661251a565b6040805160208082018a9052825180830382018152918301909252805191012081613d7857fe5b0696948701955050505050565b6040518060c0016040528060006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152509056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725468697320706f6f6c2069732063757272656e746c79206e6f7420737570706f72746564ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203950eecfb05cd8337fc6cc176f62a283b539f25de01bdbe7a7e953faabec6fe164736f6c634300060c0033

Deployed Bytecode Sourcemap

42560:15017:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30088:33;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;29883;;;;;;;;;;;;;:::i;29364:34::-;;;;;;;;;;;;;:::i;43922:97::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45076:161;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45076:161:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;56391:88;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56391:88:0;-1:-1:-1;;;;;56391:88:0;;:::i;:::-;;44253:104;;;;;;;;;;;;;:::i;45245:314::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45245:314:0;;;;;;;;;;;;;;;;;:::i;32364:82::-;;;;;;;;;;;;;:::i;56576:100::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56576:100:0;;:::i;30128:33::-;;;;;;;;;;;;;:::i;29975:30::-;;;;;;;;;;;;;:::i;44144:97::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45567:219;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45567:219:0;;;;;;;;:::i;29405:20::-;;;;;;;;;;;;;:::i;32712:124::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;32712:124:0;;;;;;;;;;;;;;46074:326;;;:::i;54804:135::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;54804:135:0;;;;;;;;;;:::i;46700:254::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46700:254:0;;;;;;;;:::i;30168:27::-;;;;;;;;;;;;;:::i;29108:40::-;;;;;;;;;;;;;:::i;28619:28::-;;;;;;;;;;;;;:::i;32842:233::-;;;;;;;;;;;;;:::i;55515:444::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55515:444:0;-1:-1:-1;;;;;55515:444:0;;:::i;32578:128::-;;;;;;;;;;;;;:::i;56883:241::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56883:241:0;;;;;;;;;;;;;;;;;:::i;57407:86::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57407:86:0;-1:-1:-1;;;;;57407:86:0;;:::i;57221:84::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57221:84:0;;:::i;34156:729::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34156:729:0;-1:-1:-1;;;;;34156:729:0;;:::i;44544:191::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44544:191:0;-1:-1:-1;;;;;44544:191:0;;:::i;18018:148::-;;;;;;;;;;;;;:::i;31971:77::-;;;;;;;;;;;;;:::i;48386:321::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;48386:321:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;57130:85;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57130:85:0;;;;:::i;30904:120::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30904:120:0;;:::i;55242:90::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55242:90:0;;;;:::i;56682:195::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56682:195:0;;;;;;;;;;;;:::i;32054:92::-;;;;;;;;;;;;;:::i;40450:369::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40450:369:0;-1:-1:-1;;;;;40450:369:0;;:::i;31861:104::-;;;;;;;;;;;;;:::i;55340:167::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55340:167:0;-1:-1:-1;;;;;55340:167:0;;:::i;31030:308::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31030:308:0;-1:-1:-1;;;;;31030:308:0;;:::i;:::-;;;;-1:-1:-1;;;;;31030:308:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17376:79;;;;;;;;;;;;;:::i;57499:75::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57499:75:0;-1:-1:-1;;;;;57499:75:0;;:::i;32152:90::-;;;;;;;;;;;;;:::i;44369:163::-;;;;;;;;;;;;;:::i;44031:101::-;;;;;;;;;;;;;:::i;30012:28::-;;;;;;;;;;;;;:::i;29049:25::-;;;;;;;;;;;;;:::i;30047:32::-;;;;;;;;;;;;;:::i;29217:40::-;;;;;;;;;;;;;:::i;29791:33::-;;;;;;;;;;;;;:::i;45794:270::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45794:270:0;;;;;;;;:::i;31464:85::-;;;;;;;;;;;;;:::i;54643:147::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54643:147:0;;:::i;44749:167::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44749:167:0;;;;;;;;:::i;30627:122::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30627:122:0;-1:-1:-1;;;;;30627:122:0;;:::i;30755:142::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30755:142:0;;;;;;;;;;:::i;32452:120::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32452:120:0;-1:-1:-1;;;;;32452:120:0;;:::i;31663:92::-;;;;;;;;;;;;;:::i;31555:96::-;;;;;;;;;;;;;:::i;55066:168::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55066:168:0;-1:-1:-1;;;;;55066:168:0;;:::i;33081:390::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33081:390:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;57311:90;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57311:90:0;;:::i;31761:94::-;;;;;;;;;;;;;:::i;54947:111::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54947:111:0;-1:-1:-1;;;;;54947:111:0;;:::i;55967:418::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55967:418:0;-1:-1:-1;;;;;55967:418:0;;:::i;29928:33::-;;;;;;;;;;;;;:::i;44924:144::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44924:144:0;;;;;;;;;;:::i;33477:673::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33477:673:0;-1:-1:-1;;;;;33477:673:0;;:::i;29081:18::-;;;;;;;;;;;;;:::i;56485:85::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56485:85:0;-1:-1:-1;;;;;56485:85:0;;:::i;29318:39::-;;;;;;;;;;;;;:::i;31344:114::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31344:114:0;-1:-1:-1;;;;;31344:114:0;;:::i;29265:38::-;;;;;;;;;;;;;:::i;18321:244::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18321:244:0;-1:-1:-1;;;;;18321:244:0;;:::i;29836:34::-;;;;;;;;;;;;;:::i;30088:33::-;;;;:::o;29883:::-;;;;:::o;29364:34::-;;;;:::o;43922:97::-;43959:13;43992:19;:17;:19::i;:::-;43985:26;;43922:97;;:::o;45076:161::-;45151:4;45168:39;45177:12;:10;:12::i;:::-;45191:7;45200:6;45168:8;:39::i;:::-;-1:-1:-1;45225:4:0;45076:161;;;;;:::o;56391:88::-;17598:12;:10;:12::i;:::-;17588:6;;-1:-1:-1;;;;;17588:6:0;;;:22;;;17580:67;;;;;-1:-1:-1;;;17580:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17580:67:0;;;;;;;;;;;;;;;56454:13:::1;:17:::0;;-1:-1:-1;;;;;;56454:17:0::1;-1:-1:-1::0;;;;;56454:17:0;;;::::1;::::0;;;::::1;::::0;;56391:88::o;44253:104::-;44306:7;44333:16;:14;:16::i;45245:314::-;45343:4;45360:36;45370:6;45378:9;45389:6;45360:9;:36::i;:::-;45407:122;45416:6;45424:12;:10;:12::i;:::-;45438:90;45477:6;45438:90;;;;;;;;;;;;;;;;;:34;45452:6;45459:12;:10;:12::i;:::-;45438:13;:34::i;:::-;:38;:90;:38;:90::i;:::-;45407:8;:122::i;:::-;-1:-1:-1;45547:4:0;45245:314;;;;;:::o;32364:82::-;32430:8;;-1:-1:-1;;;32430:8:0;;;;;32364:82::o;56576:100::-;17598:12;:10;:12::i;:::-;17588:6;;-1:-1:-1;;;;;17588:6:0;;;:22;;;17580:67;;;;;-1:-1:-1;;;17580:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17580:67:0;;;;;;;;;;;;;;;56647:14:::1;:21:::0;56576:100::o;30128:33::-;;;;:::o;29975:30::-;;;;;;:::o;44144:97::-;44185:5;44210:23;:21;:23::i;45567:219::-;45655:4;45672:84;45681:12;:10;:12::i;:::-;45695:7;45704:51;45744:10;45704:35;45718:12;:10;:12::i;:::-;45731:7;45704:13;:35::i;:::-;:39;;:51::i;29405:20::-;;;;:::o;32712:124::-;32817:10;;-1:-1:-1;;;;;32817:10:0;32712:124;:::o;46074:326::-;46284:16;:14;:16::i;:::-;46346:12;:19;;-1:-1:-1;;;;46346:19:0;-1:-1:-1;;;46346:19:0;;;46376:16;:14;:16::i;:::-;46074:326::o;54804:135::-;17598:12;:10;:12::i;:::-;17588:6;;-1:-1:-1;;;;;17588:6:0;;;:22;;;17580:67;;;;;-1:-1:-1;;;17580:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17580:67:0;;;;;;;;;;;;;;;54898:33:::1;54915:4;54921:9;54898:16;:33::i;:::-;54804:135:::0;;:::o;46700:254::-;46772:12;;-1:-1:-1;;;46772:12:0;;;;46771:13;46763:50;;;;;-1:-1:-1;;;46763:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46848:10;;-1:-1:-1;;;;;46848:10:0;46832:12;:10;:12::i;:::-;-1:-1:-1;;;;;46832:26:0;;46824:42;;;;;-1:-1:-1;;;46824:42:0;;;;;;;;;;;;-1:-1:-1;;;46824:42:0;;;;;;;;;;;;;;;46877:23;46890:2;46893:6;46877:12;:23::i;:::-;46916:30;;;;;;;;-1:-1:-1;;;;;46916:30:0;;;46933:1;;-1:-1:-1;;;;;;;;;;;46916:30:0;;;;;;;;46700:254;;:::o;30168:27::-;;;;:::o;29108:40::-;;;;:::o;28619:28::-;;;;:::o;32842:233::-;32907:12;;32883:7;;-1:-1:-1;;;32907:12:0;;;;32903:165;;;32959:12;;32943:11;;:29;;:15;:29::i;:::-;32936:36;;;;32903:165;33012:44;33028:27;:25;:27::i;:::-;33012:11;;;:15;:44::i;55515:444::-;17598:12;:10;:12::i;:::-;17588:6;;-1:-1:-1;;;;;17588:6:0;;;:22;;;17580:67;;;;;-1:-1:-1;;;17580:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17580:67:0;;;;;;;;;;;;;;;55610:17:::1;::::0;;-1:-1:-1;;;;;55610:17:0;;::::1;55631:5;55593:35:::0;;;:16:::1;:35;::::0;;;;:43;;-1:-1:-1;;55593:43:0::1;::::0;;55678:17;;55668:28:::1;::::0;55678:17:::1;55668:9;:28::i;:::-;55647:49:::0;-1:-1:-1;55711:14:0;;55707:164:::1;;55752:17;::::0;55742:49:::1;::::0;-1:-1:-1;;;;;55752:17:0::1;55771:7:::0;55780:10;55742:9:::1;:49::i;:::-;55820:17;::::0;55811:48:::1;::::0;;;;;;;-1:-1:-1;;;;;55811:48:0;;::::1;::::0;55820:17:::1;::::0;-1:-1:-1;;;;;;;;;;;55811:48:0;;;;;::::1;::::0;;::::1;55707:164;-1:-1:-1::0;55881:17:0::1;:27:::0;;-1:-1:-1;;;;;55881:27:0;;::::1;-1:-1:-1::0;;;;;;55881:27:0;;::::1;::::0;::::1;::::0;;:17:::1;55919:25:::0;;;:16:::1;:25;::::0;;;;:32;;-1:-1:-1;;55919:32:0::1;55881:27:::0;55919:32:::1;::::0;;55515:444::o;32578:128::-;32684:13;;-1:-1:-1;;;;;32684:13:0;32578:128;:::o;56883:241::-;17598:12;:10;:12::i;:::-;17588:6;;-1:-1:-1;;;;;17588:6:0;;;:22;;;17580:67;;;;;-1:-1:-1;;;17580:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17580:67:0;;;;;;;;;;;;;;;56999:11:::1;:21:::0;;;;57031:11:::1;:21:::0;;;;57063:11:::1;:21:::0;57095:11:::1;:21:::0;56883:241::o;57407:86::-;17598:12;:10;:12::i;:::-;17588:6;;-1:-1:-1;;;;;17588:6:0;;;:22;;;17580:67;;;;;-1:-1:-1;;;17580:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17580:67:0;;;;;;;;;;;;;;;57471:10:::1;:14:::0;;-1:-1:-1;;;;;;57471:14:0::1;-1:-1:-1::0;;;;;57471:14:0;;;::::1;::::0;;;::::1;::::0;;57407:86::o;57221:84::-;17598:12;:10;:12::i;:::-;17588:6;;-1:-1:-1;;;;;17588:6:0;;;:22;;;17580:67;;;;;-1:-1:-1;;;17580:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17580:67:0;;;;;;;;;;;;;;;57284:9:::1;:13:::0;57221:84::o;34156:729::-;-1:-1:-1;;;;;34414:22:0;;34222:7;34414:22;;;:13;:22;;;;;:40;;;;34369:39;;;;34307:44;;;;34266:35;;;;;34222:7;;34265:190;;34414:40;34265:144;;34369:39;;34265:144;;34357:6;;34265:87;;34266:35;34265:41;:87::i;:::-;:91;;:99::i;:::-;:103;;:144::i;:190::-;34242:213;;34495:6;34480:12;:21;34476:402;;;34556:42;34591:6;34556:30;34573:12;;34556:16;:30::i;:42::-;34681:14;;34541:57;;-1:-1:-1;34673:22:0;;-1:-1:-1;;34673:22:0;34613:13;34730:17;:15;:17::i;:::-;34712:35;;34778:7;34770:5;:15;34769:35;;34799:5;34769:35;;;34789:7;34769:35;34762:42;;;;;;;34476:402;-1:-1:-1;;34855:11:0;;34156:729;;;;:::o;44544:191::-;44610:7;44630:21;44654:11;:9;:11::i;:::-;44630:35;;44683:44;44713:13;44683:25;44700:7;44683:16;:25::i;:44::-;44676:51;44544:191;-1:-1:-1;;;44544:191:0:o;18018:148::-;17598:12;:10;:12::i;:::-;17588:6;;-1:-1:-1;;;;;17588:6:0;;;:22;;;17580:67;;;;;-1:-1:-1;;;17580:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17580:67:0;;;;;;;;;;;;;;;18109:6:::1;::::0;18088:40:::1;::::0;18125:1:::1;::::0;-1:-1:-1;;;;;18109:6:0::1;::::0;18088:40:::1;::::0;18125:1;;18088:40:::1;18139:6;:19:::0;;-1:-1:-1;;;;;;18139:19:0::1;::::0;;18018:148::o;31971:77::-;32037:3;;-1:-1:-1;;;;;32037:3:0;31971:77;:::o;48386:321::-;48478:7;48487;48507:9;48554:5;;48561:6;48569:9;48580:6;48611:1;48598:12;:14;48588:25;48537:77;;;;;;;;;;;-1:-1:-1;;;;;48537:77:0;;;;;;;;-1:-1:-1;;;;;48537:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48527:88;;;;;;48519:97;;48507:109;;48627:10;48640:35;48653:1;48656:18;;48640:12;:35::i;:::-;48694:1;;;;-1:-1:-1;48386:321:0;;-1:-1:-1;;;;;48386:321:0:o;57130:85::-;17598:12;:10;:12::i;:::-;17588:6;;-1:-1:-1;;;;;17588:6:0;;;:22;;;17580:67;;;;;-1:-1:-1;;;17580:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17580:67:0;;;;;;;;;;;;;;;57192:11:::1;:15:::0;;-1:-1:-1;;57192:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;57130:85::o;30904:120::-;30967:7;30994:15;31010:5;30994:22;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30994:22:0;;30904:120;-1:-1:-1;;30904:120:0:o;55242:90::-;42734:29;42750:12;:10;:12::i;:::-;42734:15;:29::i;:::-;42726:52;;;;;-1:-1:-1;;;42726:52:0;;;;;;;;;;;;-1:-1:-1;;;42726:52:0;;;;;;;;;;;;;;;55309:8:::1;:15:::0;;;::::1;;-1:-1:-1::0;;;55309:15:0::1;-1:-1:-1::0;;;;55309:15:0;;::::1;::::0;;;::::1;::::0;;55242:90::o;56682:195::-;17598:12;:10;:12::i;:::-;17588:6;;-1:-1:-1;;;;;17588:6:0;;;:22;;;17580:67;;;;;-1:-1:-1;;;17580:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17580:67:0;;;;;;;;;;;;;;;56772:19:::1;:25:::0;;;;56808:19:::1;:25:::0;56844:18:::1;:25:::0;56682:195::o;32054:92::-;32127:11;;-1:-1:-1;;;;;32127:11:0;32054:92;:::o;40450:369::-;-1:-1:-1;;;;;40605:19:0;;;40507:20;40605:19;;;:13;:19;;;;;:29;40507:20;;;;;;40576:59;;40599:4;;40605:29;40576:22;:59::i;:::-;-1:-1:-1;;;;;40646:19:0;;;;;;;:13;:19;;;;;;;;:29;;;:41;;;;40698:32;;;:47;;;;-1:-1:-1;40756:36:0;;;:55;;;;-1:-1:-1;;;40450:369:0:o;31861:104::-;31940:17;;-1:-1:-1;;;;;31940:17:0;31861:104;:::o;55340:167::-;17598:12;:10;:12::i;:::-;17588:6;;-1:-1:-1;;;;;17588:6:0;;;:22;;;17580:67;;;;;-1:-1:-1;;;17580:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17580:67:0;;;;;;;;;;;;;;;55423:21:::1;55439:4;55423:15;:21::i;:::-;55415:43;;;::::0;;-1:-1:-1;;;55415:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;55415:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;55469:22:0::1;55494:5;55469:22:::0;;;:16:::1;:22;::::0;;;;:30;;-1:-1:-1;;55469:30:0::1;::::0;;55340:167::o;31030:308::-;31090:7;31099;31108;31117;31126;31135;31155:21;;:::i;:::-;-1:-1:-1;;;;;;;;;31179:19:0;;;;;;;:13;:19;;;;;;;;;31155:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31155:43:0;;-1:-1:-1;31155:43:0;;-1:-1:-1;31030:308:0:o;17376:79::-;17441:6;;-1:-1:-1;;;;;17441:6:0;17376:79;:::o;57499:75::-;17598:12;:10;:12::i;:::-;17588:6;;-1:-1:-1;;;;;17588:6:0;;;:22;;;17580:67;;;;;-1:-1:-1;;;17580:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17580:67:0;;;;;;;;;;;;;;;57559:3:::1;:7:::0;;-1:-1:-1;;;;;;57559:7:0::1;-1:-1:-1::0;;;;;57559:7:0;;;::::1;::::0;;;::::1;::::0;;57499:75::o;32152:90::-;32222:12;;-1:-1:-1;;;32222:12:0;;;;;32152:90::o;44369:163::-;44419:7;44446:78;44497:26;44507:15;:13;:15::i;:::-;44497:9;:26::i;:::-;44446:46;44467:24;44485:4;44467:9;:24::i;:::-;44446:16;:14;:16::i;:::-;:20;;:46::i;44031:101::-;44070:13;44103:21;:19;:21::i;30012:28::-;;;;:::o;29049:25::-;;;-1:-1:-1;;;;;29049:25:0;;:::o;30047:32::-;;;;:::o;29217:40::-;;;;:::o;29791:33::-;;;;:::o;45794:270::-;45887:4;45904:130;45913:12;:10;:12::i;:::-;45927:7;45936:97;45976:15;45936:97;;;;;;;;;;;;;;;;;:35;45950:12;:10;:12::i;:::-;45963:7;45936:13;:35::i;31464:85::-;31532:9;;-1:-1:-1;;;;;31532:9:0;31464:85;:::o;54643:147::-;42834:8;:15;;-1:-1:-1;;;;42834:15:0;-1:-1:-1;;;42834:15:0;;;17598:12:::1;:10;:12::i;:::-;17588:6;::::0;-1:-1:-1;;;;;17588:6:0;;::::1;:22:::0;::::1;;17580:67;;;::::0;;-1:-1:-1;;;17580:67:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;17580:67:0;;;;;;;;;;;;;::::1;;54725:57:::2;54743:4;54750:26;:24;:26::i;:::-;54778:3;54725:9;:57::i;:::-;-1:-1:-1::0;42872:8:0;:16;;-1:-1:-1;;;;42872:16:0;;;54643:147::o;44749:167::-;44827:4;44844:42;44854:12;:10;:12::i;:::-;44868:9;44879:6;44844:9;:42::i;30627:122::-;-1:-1:-1;;;;;30718:23:0;30691:7;30718:23;;;;;;;;;;;;30627:122::o;30755:142::-;-1:-1:-1;;;;;30860:20:0;;;30833:7;30860:20;;;:11;:20;;;;;;;;:29;;;;;;;;;;;;;30755:142::o;32452:120::-;-1:-1:-1;;;;;32539:25:0;32515:4;32539:25;;;:16;:25;;;;;;;;;32452:120::o;31663:92::-;31736:11;;31663:92;:::o;31555:96::-;31630:13;;31555:96;:::o;55066:168::-;17598:12;:10;:12::i;:::-;17588:6;;-1:-1:-1;;;;;17588:6:0;;;:22;;;17580:67;;;;;-1:-1:-1;;;17580:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17580:67:0;;;;;;;;;;;;;;;55147:21:::1;55163:4;55147:15;:21::i;:::-;55146:22;55138:48;;;::::0;;-1:-1:-1;;;55138:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;55138:48:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;55197:22:0::1;;::::0;;;:16:::1;:22;::::0;;;;:29;;-1:-1:-1;;55197:29:0::1;55222:4;55197:29;::::0;;55066:168::o;33081:390::-;33167:7;33176;33185;33205:17;33232:4;-1:-1:-1;;;;;33225:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33225:26:0;33285:37;;;-1:-1:-1;;;33285:37:0;;-1:-1:-1;;;;;33285:37:0;;;;;;;;33225:26;;-1:-1:-1;33262:20:0;;33300:4;;33285:31;;:37;;;;;33225:26;;33285:37;;;;;;;33300:4;33285:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33285:37:0;33360:42;;;-1:-1:-1;;;33360:42:0;;-1:-1:-1;;;;;33360:42:0;;;;;;;;;33285:37;;-1:-1:-1;33333:24:0;;33360:36;;;;;;:42;;;;;33285:37;;33360:42;;;;;;;;:36;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33360:42:0;33421:12;;33360:42;;-1:-1:-1;33453:9:0;;-1:-1:-1;33081:390:0;-1:-1:-1;;;;33081:390:0:o;57311:90::-;17598:12;:10;:12::i;:::-;17588:6;;-1:-1:-1;;;;;17588:6:0;;;:22;;;17580:67;;;;;-1:-1:-1;;;17580:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17580:67:0;;;;;;;;;;;;;;;57377:12:::1;:16:::0;57311:90::o;31761:94::-;31835:12;;31761:94;:::o;54947:111::-;17598:12;:10;:12::i;:::-;17588:6;;-1:-1:-1;;;;;17588:6:0;;;:22;;;17580:67;;;;;-1:-1:-1;;;17580:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17580:67:0;;;;;;;;;;;;;;;55025:25:::1;55045:4;55025:19;:25::i;:::-;54947:111:::0;:::o;55967:418::-;17598:12;:10;:12::i;:::-;17588:6;;-1:-1:-1;;;;;17588:6:0;;;:22;;;17580:67;;;;;-1:-1:-1;;;17580:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17580:67:0;;;;;;;;;;;;;;;42834:8:::1;:15:::0;;-1:-1:-1;;;;42834:15:0::1;-1:-1:-1::0;;;42834:15:0::1;::::0;;56066:11:::2;::::0;;-1:-1:-1;;;;;56066:11:0;;::::2;42834:15:::0;56049:29;;;:16:::2;:29;::::0;;;;:37;;-1:-1:-1;;56049:37:0::2;::::0;;56128:11;;56118:22:::2;::::0;56128:11:::2;56118:9;:22::i;:::-;56097:43:::0;-1:-1:-1;56155:14:0;;56151:152:::2;;56196:11;::::0;56186:43:::2;::::0;-1:-1:-1;;;;;56196:11:0::2;56209:7:::0;56218:10;56186:9:::2;:43::i;:::-;56258:11;::::0;56249:42:::2;::::0;;;;;;;-1:-1:-1;;;;;56249:42:0;;::::2;::::0;56258:11:::2;::::0;-1:-1:-1;;;;;;;;;;;56249:42:0;;;;;::::2;::::0;;::::2;56151:152;-1:-1:-1::0;56313:11:0::2;:21:::0;;-1:-1:-1;;;;;56313:21:0;;::::2;-1:-1:-1::0;;;;;;56313:21:0;;::::2;::::0;::::2;::::0;;:11:::2;56345:25:::0;;;:16:::2;:25;::::0;;;;:32;;-1:-1:-1;;56345:32:0::2;56313:21:::0;56345:32:::2;::::0;;42872:8:::1;:16:::0;;-1:-1:-1;;;;42872:16:0::1;::::0;;55967:418::o;29928:33::-;;;;:::o;44924:144::-;45005:7;45032:28;45046:5;45052:7;45032:13;:28::i;33477:673::-;-1:-1:-1;;;;;33736:22:0;;33541:7;33736:22;;;:13;:22;;;;;:35;;;;33686:44;;;;33628:40;;;;33583:39;;;;;33541:7;;33582:190;;33736:35;33582:149;;33686:44;;33582:149;;33674:6;;33582:87;;33583:39;33582:45;:87::i;:190::-;33561:211;;33810:6;33797:10;:19;33793:350;;;33869:38;33900:6;33869:26;33884:10;;33869:14;:26::i;:38::-;33988:14;;34035:11;;33856:51;;-1:-1:-1;33980:22:0;;-1:-1:-1;;33980:22:0;;34027:19;;34026:43;;34064:5;34026:43;;;34050:11;;34026:43;34019:50;;;;;;33793:350;-1:-1:-1;;34120:11:0;;34113:18;;29081;;;-1:-1:-1;;;;;29081:18:0;;:::o;56485:85::-;17598:12;:10;:12::i;:::-;17588:6;;-1:-1:-1;;;;;17588:6:0;;;:22;;;17580:67;;;;;-1:-1:-1;;;17580:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17580:67:0;;;;;;;;;;;;;;;56548:10:::1;:14:::0;;-1:-1:-1;;;;;;56548:14:0::1;-1:-1:-1::0;;;;;56548:14:0;;;::::1;::::0;;;::::1;::::0;;56485:85::o;29318:39::-;;;;:::o;31344:114::-;-1:-1:-1;;;;;31428:22:0;31404:4;31428:22;;;:16;:22;;;;;;;;;31344:114::o;29265:38::-;;;;:::o;18321:244::-;17598:12;:10;:12::i;:::-;17588:6;;-1:-1:-1;;;;;17588:6:0;;;:22;;;17580:67;;;;;-1:-1:-1;;;17580:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17580:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;18410:22:0;::::1;18402:73;;;;-1:-1:-1::0;;;18402:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18512:6;::::0;18491:38:::1;::::0;-1:-1:-1;;;;;18491:38:0;;::::1;::::0;18512:6:::1;::::0;18491:38:::1;::::0;18512:6:::1;::::0;18491:38:::1;18540:6;:17:::0;;-1:-1:-1;;;;;;18540:17:0::1;-1:-1:-1::0;;;;;18540:17:0;;;::::1;::::0;;;::::1;::::0;;18321:244::o;29836:34::-;;;;:::o;6076:132::-;6134:7;6161:39;6165:1;6168;6161:39;;;;;;;;;;;;;;;;;:3;:39::i;26678:94::-;-1:-1:-1;;24926:27:0;26678:94::o;4239:136::-;4297:7;4324:43;4328:1;4331;4324:43;;;;;;;;;;;;;;;;;:3;:43::i;27665:89::-;27741:5;;;;;;;;;;;;-1:-1:-1;;;27741:5:0;;;;27665:89;:::o;15911:106::-;15999:10;15911:106;:::o;46962:336::-;-1:-1:-1;;;;;47055:19:0;;47047:68;;;;-1:-1:-1;;;47047:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47134:21:0;;47126:68;;;;-1:-1:-1;;;47126:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47205:37;47219:5;47226:7;47235:6;47205:13;:37::i;:::-;47274:7;-1:-1:-1;;;;;47258:32:0;47267:5;-1:-1:-1;;;;;47258:32:0;;47283:6;47258:32;;;;;;;;;;;;;;;;;;46962:336;;;:::o;49028:3688::-;-1:-1:-1;;;;;49125:20:0;;49117:70;;;;-1:-1:-1;;;49117:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49206:23:0;;49198:71;;;;-1:-1:-1;;;49198:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49297:1;49288:6;:10;49280:55;;;;;-1:-1:-1;;;49280:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49364:17;49374:6;49364:9;:17::i;:::-;49354:6;:27;;49346:63;;;;;-1:-1:-1;;;49346:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49491:5;:10;;49500:1;49491:10;;;:5;49546:11;:9;:11::i;:::-;49522:35;-1:-1:-1;49568:19:0;49590:25;:6;49522:35;49590:10;:25::i;:::-;49568:47;;49626:14;49655:11;:9;:11::i;:::-;49651:414;;;-1:-1:-1;49692:1:0;49651:414;;;49726:11;49756:23;49772:6;49756:15;:23::i;:::-;49752:252;;;49809:16;49818:6;49809:8;:16::i;:::-;49800:25;;49752:252;;;49851:26;49867:9;49851:15;:26::i;:::-;49847:157;;;49897:25;49912:9;49897:14;:25::i;:::-;49847:157;;;49978:9;;49963:25;;-1:-1:-1;;;;;49978:9:0;49963:14;:25::i;:::-;50027:26;50038:6;50046;50027:10;:26::i;:::-;50018:35;;49651:414;;50079:6;50089:1;50079:11;50075:125;;50143:45;50162:6;50170:9;50181:6;50143:18;:45::i;:::-;50295:6;50305:1;50295:11;50291:2418;;;50324:18;50344:22;50368:20;50390:17;50411:28;50424:6;50432;50411:12;:28::i;:::-;50506:12;:25;;;-1:-1:-1;;;;;50573:22:0;;:14;:22;;;;;;;;;;;50323:116;;-1:-1:-1;50323:116:0;;-1:-1:-1;50323:116:0;-1:-1:-1;50323:116:0;-1:-1:-1;50573:39:0;;50600:11;50573:26;:39::i;:::-;-1:-1:-1;;;;;50548:22:0;;;:14;:22;;;;;;;;;;;:64;;;;50655:25;;;;;;;:42;;50685:11;50655:29;:42::i;:::-;-1:-1:-1;;;;;50627:25:0;;:14;:25;;;;;;;;;;:70;50746;50782:33;:14;50801:13;50782:18;:33::i;:::-;50746:14;:31;50761:15;:13;:15::i;:::-;-1:-1:-1;;;;;50746:31:0;;;;;;;;;;;;-1:-1:-1;50746:31:0;;;:35;:70::i;:::-;50712:14;:31;50727:15;:13;:15::i;:::-;-1:-1:-1;;;;;50712:31:0;;;;;;;;;;;;-1:-1:-1;50712:31:0;:104;50876:79;50923:31;:12;50940:13;50923:16;:31::i;:::-;50876:14;:42;50891:26;:24;:26::i;50876:79::-;50831:14;:42;50846:26;:24;:26::i;:::-;-1:-1:-1;;;;;50831:42:0;;;;;;;;;;;;-1:-1:-1;50831:42:0;:124;50985:12;;:27;;51002:9;50985:16;:27::i;:::-;50970:12;:42;51032:35;;;;;;;;-1:-1:-1;;;;;51032:35:0;;;;;;;;-1:-1:-1;;;;;;;;;;;51032:35:0;;;;;;;;51107:15;:13;:15::i;:::-;-1:-1:-1;;;;;51087:51:0;51104:1;-1:-1:-1;;;;;51087:51:0;-1:-1:-1;;;;;;;;;;;51123:14:0;51087:51;;;;;;;;;;;;;;;;;;51212:26;:24;:26::i;:::-;-1:-1:-1;;;;;51192:60:0;51209:1;-1:-1:-1;;;;;51192:60:0;-1:-1:-1;;;;;;;;;;;51239:12:0;51192:60;;;;;;;;;;;;;;;;;;50291:2418;;;;;;;51381:6;51391:1;51381:11;51377:1332;;;51410:16;51428:21;51453:32;51467:9;51478:6;51453:13;:32::i;:::-;51409:76;;;;51501:18;51521:23;51548:21;51562:6;51548:13;:21::i;:::-;51500:69;;-1:-1:-1;51500:69:0;-1:-1:-1;51584:28:0;51615:36;51500:69;51615:20;:6;51626:8;51615:10;:20::i;:36::-;51584:67;-1:-1:-1;51666:27:0;51696:39;51584:67;51721:13;51696:24;:39::i;:::-;-1:-1:-1;;;;;51775:22:0;;:14;:22;;;;;;;;;;;51666:69;;-1:-1:-1;51775:39:0;;51802:11;51775:26;:39::i;:::-;-1:-1:-1;;;;;51750:22:0;;;:14;:22;;;;;;;;;;;:64;;;;51857:25;;;;;;;:50;;51887:19;51857:29;:50::i;:::-;-1:-1:-1;;;;;51829:25:0;;;:14;:25;;;;;;;;;;;:78;;;;51973:17;;;;;51958:33;;;;:54;;51996:15;51958:37;:54::i;:::-;51937:17;;-1:-1:-1;;;;;51937:17:0;51922:14;:33;;;;;;;;;;:90;52042:12;;:26;;52059:8;52042:16;:26::i;:::-;52027:12;:41;52097:11;;:30;;52113:13;52097:15;:30::i;:::-;52083:11;:44;52147:49;;;;;;;;-1:-1:-1;;;;;52147:49:0;;;;;;;;-1:-1:-1;;;;;;;;;;;52147:49:0;;;;;;;;52216:38;;;;;;;;52241:1;;-1:-1:-1;;;;;52216:38:0;;;-1:-1:-1;;;;;;;;;;;52216:38:0;;;;;;;;52291:17;;52274:47;;;;;;;;-1:-1:-1;;;;;52291:17:0;;;;52274:47;;;-1:-1:-1;;;;;;;;;;;52274:47:0;;;;;;;;;51377:1332;;;;;;;;;52465:6;52475:1;52465:11;52461:248;;;-1:-1:-1;;;;;52518:22:0;;:14;:22;;;;;;;;;;;:39;;52545:11;52518:26;:39::i;:::-;-1:-1:-1;;;;;52493:22:0;;;:14;:22;;;;;;;;;;;:64;;;;52600:25;;;;;;;:42;;52630:11;52600:29;:42::i;:::-;-1:-1:-1;;;;;52572:25:0;;;:14;:25;;;;;;;;;;;;:70;;;;52662:35;;;;;;;52572:25;;52662:35;;;;-1:-1:-1;;;;;;;;;;;52662:35:0;;;;;;;;52461:248;49028:3688;;;;;;:::o;4678:192::-;4764:7;4800:12;4792:6;;;;4784:29;;;;-1:-1:-1;;;4784:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4836:5:0;;;4678:192::o;27858:88::-;26318:1;27858:88;:::o;3775:181::-;3833:7;3865:5;;;3889:6;;;;3881:46;;;;;-1:-1:-1;;;3881:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;46406:282;46460:15;:13;:15::i;:::-;46459:16;46451:53;;;;;-1:-1:-1;;;46451:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46515:14;46532:46;46564:13;:11;:13::i;:::-;46532:27;:25;:27::i;:46::-;46515:63;;46589:34;46610:4;46616:6;46589:12;:34::i;:::-;46639:41;;;;;;;;46667:4;;46656:1;;-1:-1:-1;;;;;;;;;;;46639:41:0;;;;;;;;46406:282;:::o;53117:1520::-;42834:8;:15;;-1:-1:-1;;;;42834:15:0;-1:-1:-1;;;42834:15:0;;;;53210:18:::1;:16;:18::i;:::-;53173:55;;53239:32;53274:19;:17;:19::i;:::-;53239:54;;53304:24;53425:1:::0;-1:-1:-1;;;;;53343:84:0::1;:14;-1:-1:-1::0;;;;;53343:22:0::1;;53374:15;-1:-1:-1::0;;;;;53374:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;53374:22:0;53343:70:::1;::::0;;-1:-1:-1;;;;;;53343:70:0::1;::::0;;;;;;-1:-1:-1;;;;;53343:70:0;;::::1;;::::0;::::1;::::0;53407:4:::1;53343:70:::0;;;;;;;;;;53374:22:::1;::::0;53343:70;;;;;;;;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;53343:70:0;-1:-1:-1;;;;;53343:84:0::1;;53339:335;;;53463:14;-1:-1:-1::0;;;;;53463:25:0::1;;53511:15;-1:-1:-1::0;;;;;53511:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;53511:22:0;53463:87:::1;::::0;;-1:-1:-1;;;;;;53463:87:0::1;::::0;;;;;;-1:-1:-1;;;;;53463:87:0;;::::1;;::::0;::::1;::::0;53544:4:::1;53463:87:::0;;;;;;;;;;53511:22:::1;::::0;53463:87;;;;;;;-1:-1:-1;53463:87:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;53463:87:0;;-1:-1:-1;53339:335:0::1;;;53602:14;-1:-1:-1::0;;;;;53602:22:0::1;;53633:4;53639:15;-1:-1:-1::0;;;;;53639:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;53639:22:0;53602:60:::1;::::0;;-1:-1:-1;;;;;;53602:60:0::1;::::0;;;;;;-1:-1:-1;;;;;53602:60:0;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;53639:22:::1;::::0;53602:60;;;;;;;;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;53602:60:0;;-1:-1:-1;53339:335:0::1;53701:21;53684:14;53752:51;53797:5;53752:40;53763:28;:26;:28::i;:::-;53752:6:::0;;:10:::1;:40::i;:51::-;53733:70;;53829:24;53847:4;53829:9;:24::i;:::-;53818:8;:35;53814:102;;;53880:24;53898:4;53880:9;:24::i;:::-;53869:35;;53814:102;53928:59;53945:4;53960:15;53978:8;53928;:59::i;:::-;54003:122;::::0;;-1:-1:-1;;;54003:122:0;;54058:4:::1;54003:122;::::0;::::1;::::0;;;;;;;;;54088:1:::1;54003:122:::0;;;;;;;;;;;;;;54109:15:::1;54003:122:::0;;;;;;-1:-1:-1;;;;;54003:31:0;::::1;::::0;::::1;::::0;54042:6;;54003:122;;;;;::::1;::::0;;;;;;;;;54042:6;54003:31;:122;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;54003:122:0;54196:22;;-1:-1:-1;;;54196:22:0;;;;54153:67:::1;::::0;54170:16;;-1:-1:-1;;;;;54196:20:0;::::1;::::0;::::1;::::0;:22:::1;::::0;;::::1;::::0;54003:122:::1;::::0;54196:22;;;;;;;:20;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;54196:22:0;54153:16:::1;:67::i;:::-;54231:9;:28:::0;;-1:-1:-1;;;;;;54231:28:0::1;-1:-1:-1::0;;;;;54231:28:0;::::1;::::0;;::::1;::::0;;;54314:49:::1;::::0;;-1:-1:-1;;;54314:49:0;;54357:4:::1;54314:49;::::0;::::1;::::0;;;-1:-1:-1;;54231:28:0;54314:34:::1;::::0;:49;;;;;::::1;::::0;;;;;;;;54231:28;54314:49;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;54314:49:0;54413:3:::1;::::0;54380:47:::1;::::0;;-1:-1:-1;;;54380:47:0;;-1:-1:-1;;;;;54413:3:0;;::::1;54380:47;::::0;::::1;::::0;;;;;;;;;54314:49;;-1:-1:-1;54380:32:0;;::::1;::::0;::::1;::::0;:47;;;;;54314:49:::1;::::0;54380:47;;;;;;;;54413:3:::1;54380:32:::0;:47;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;54516:3:0::1;::::0;-1:-1:-1;;;;;54516:3:0::1;54506:27;54534:16:::0;54552:9;54563:41:::1;:15;26363:8;54563:19;:41::i;:::-;54506:99;;;;;;;;;;;;;-1:-1:-1::0;;;;;54506:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;42872:8:0;:16;;-1:-1:-1;;;;42872:16:0;;;-1:-1:-1;;;;;;;;53117:1520:0:o;40825:478::-;40913:21;40929:4;40913:15;:21::i;:::-;40912:22;40904:64;;;;;-1:-1:-1;;;40904:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40979:22:0;;;;;;:16;:22;;;;;:29;;-1:-1:-1;;40979:29:0;41004:4;40979:29;;;;;;41019:15;:26;;;;;;;;;;;;;-1:-1:-1;;;;;;41019:26:0;;;;;;;40979:22;;41126:39;40996:4;41155:9;41126:22;:39::i;:::-;41198:97;;;;;;;;-1:-1:-1;;;;;41198:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41176:19;;;-1:-1:-1;41176:19:0;;;:13;:19;;;;;;;;:119;;;;-1:-1:-1;;;;;;41176:119:0;;;;;;;;;;;-1:-1:-1;41176:119:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41176:119:0;;;;;;;;;;-1:-1:-1;40825:478:0:o;38148:303::-;38223:21;38247:11;:9;:11::i;:::-;38223:35;-1:-1:-1;38269:19:0;38291:25;:6;38223:35;38291:10;:25::i;:::-;-1:-1:-1;;;;;38353:23:0;;:14;:23;;;;;;;;;;;38269:47;;-1:-1:-1;38353:40:0;;38269:47;38353:27;:40::i;:::-;-1:-1:-1;;;;;38327:23:0;;:14;:23;;;;;;;;;;:66;38419:12;;:24;;38436:6;38419:16;:24::i;:::-;38404:12;:39;-1:-1:-1;;;;38148:303:0:o;26574:98::-;24865:14;26574:98;:::o;5129:471::-;5187:7;5432:6;5428:47;;-1:-1:-1;5462:1:0;5455:8;;5428:47;5499:5;;;5503:1;5499;:5;:1;5523:5;;;;;:10;5515:56;;;;-1:-1:-1;;;5515:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37441:194;37515:11;;37491:7;;37515:11;;37511:117;;;-1:-1:-1;37550:11:0;;-1:-1:-1;;37550:15:0;37543:22;;37511:117;-1:-1:-1;37605:11:0;;37598:18;;48713:307;48897:1;:11;-1:-1:-1;;48896:17:0;49001:9;;48713:307::o;27760:92::-;27837:7;;;;;;;;;;;;-1:-1:-1;;;27837:7:0;;;;27760:92;:::o;27559:100::-;26138:42;27559:100;:::o;41309:519::-;41380:21;41396:4;41380:15;:21::i;:::-;41372:70;;;;-1:-1:-1;;;41372:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41458:9;41453:368;41477:15;:22;41473:26;;41453:368;;;41547:4;-1:-1:-1;;;;;41525:26:0;:15;41541:1;41525:18;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41525:18:0;:26;41521:289;;;41593:15;41609:22;;-1:-1:-1;;41609:26:0;;;41593:43;;;;;;;;;;;;;;;;41572:15;:18;;-1:-1:-1;;;;;41593:43:0;;;;41588:1;;41572:18;;;;;;;;;;;;;;;;;:64;;-1:-1:-1;;;;;41572:64:0;;;-1:-1:-1;;;;;;41572:64:0;;;;;;;41655:22;;;;;:16;:22;;;;;;;:30;;-1:-1:-1;;41655:30:0;;;41711:13;:19;;;;;;41704:26;;;;;;;41572:64;41704:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;41749:21;;;;;;;;;;;;;;;;-1:-1:-1;;41749:21:0;;;;;-1:-1:-1;;;;;;41749:21:0;;;;;;41789:5;;41521:289;41501:3;;41453:368;;6704:278;6790:7;6825:12;6818:5;6810:28;;;;-1:-1:-1;;;6810:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6849:9;6865:1;6861;:5;;;;;;;6704:278;-1:-1:-1;;;;;6704:278:0:o;38007:135::-;-1:-1:-1;;;;;38098:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;38007:135::o;39973:471::-;-1:-1:-1;;;;;40138:19:0;;;40022:4;40138:19;;;:13;:19;;;;;:29;40022:4;;;;;;;;40109:59;;40132:4;;40138:29;40109:22;:59::i;:::-;-1:-1:-1;;;;;40205:19:0;;;;40179:11;40205:19;;;:13;:19;;;;;;;;:29;;;;;40245:41;;;;-1:-1:-1;40297:32:0;;:47;;;;-1:-1:-1;40355:36:0;:55;40193:41;;;;39973:471;-1:-1:-1;;;;39973:471:0:o;52724:385::-;52794:7;52831:1;52847:23;52863:6;52847:15;:23::i;:::-;52843:235;;;52891:6;52887:108;;;-1:-1:-1;52927:1:0;52887:108;;;-1:-1:-1;52978:1:0;52887:108;52843:235;;;53026:13;;-1:-1:-1;;;;;53016:23:0;;;53026:13;;53016:23;53012:66;;;-1:-1:-1;53065:1:0;;52724:385;-1:-1:-1;;;52724:385:0:o;47304:625::-;47467:37;47489:14;;47467:17;:15;:17::i;:37::-;47461:3;:43;47457:465;;;47520:14;47532:1;47520:11;:14::i;:::-;47457:465;;;47587:19;;47571:12;:35;47567:81;;;47626:7;;47567:81;47684:12;47662:19;:34;47712:9;;47742:37;47753:6;47761:9;47772:6;47742:10;:37::i;:::-;47711:68;;;;47809:19;;47798:7;:30;;:63;;;;;47842:19;;47832:7;:29;47798:63;47794:117;;;47881:14;47893:1;47881:11;:14::i;:::-;47457:465;;;47304:625;;;:::o;34891:424::-;34967:7;34976;34985;34994;35014:18;35035:24;35052:6;35035:16;:24::i;:::-;35014:45;-1:-1:-1;35090:18:0;35111:34;35138:6;35111:22;:6;35014:45;35111:10;:22::i;:34::-;35090:55;;35174:10;35186:55;35235:5;35186:44;35201:28;:26;:28::i;35186:55::-;35242:53;35289:5;35242:42;35257:26;:24;:26::i;:::-;35242:10;;:14;:42::i;:53::-;35166:141;;;;-1:-1:-1;35166:141:0;;-1:-1:-1;35296:10:0;;-1:-1:-1;34891:424:0;-1:-1:-1;;;;34891:424:0:o;35323:415::-;35403:7;35412;35432:21;35456:11;:9;:11::i;:::-;35432:35;;35478:20;35501:70;35520:26;35536:9;35520:15;:26::i;:::-;:50;;35561:9;;-1:-1:-1;;;;;35561:9:0;35520:50;;;35549:9;35520:50;35501:18;:70::i;:::-;35478:93;-1:-1:-1;35612:18:0;35633:36;35662:6;35633:24;:6;35478:93;35633:10;:24::i;:36::-;35612:57;-1:-1:-1;35612:57:0;35700:29;35612:57;35715:13;35700:14;:29::i;:::-;35680:50;;;;;;;35323:415;;;;;:::o;35746:278::-;35807:7;35816;35836:21;35860:11;:9;:11::i;:::-;35836:35;;35882:18;35903:52;35949:5;35903:41;35914:29;:27;:29::i;:::-;35903:6;;:10;:41::i;:52::-;35882:73;-1:-1:-1;35882:73:0;35986:29;35882:73;36001:13;35986:14;:29::i;:::-;35966:50;;;;;;35746:278;;;:::o;26469:99::-;26422:8;26469:99;:::o;38644:829::-;38699:17;:15;:17::i;:::-;38732:9;38727:299;38747:15;:22;38745:24;;38727:299;;;38845:13;:33;38859:15;38875:1;38859:18;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38859:18:0;-1:-1:-1;;;;;38845:33:0;-1:-1:-1;;;;;38845:33:0;;;;;;;;;;;;:46;;;38791:13;:33;38805:15;38821:1;38805:18;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38805:18:0;38791:33;;;;;;;;;;;;:51;;:100;;;;38978:15;:18;;38964:13;;38805:18;38978:15;38994:1;;38978:18;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38978:18:0;-1:-1:-1;;;;;38964:33:0;-1:-1:-1;;;;;38964:33:0;;;;;;;;;;;;:50;;;38906:13;:33;38920:15;38936:1;38920:18;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38920:18:0;38906:33;;;;;;;;;;;;:55;;:108;38920:18;38771:3;38727:299;;;-1:-1:-1;39036:9:0;:14;;39049:1;39036:14;;;;;39078:12;;39065:25;39061:76;;;39106:11;:19;;-1:-1:-1;;39106:19:0;;;39061:76;39153:9;39149:60;;39185:12;:10;:12::i;:::-;39178:19;;39149:60;39278:47;39288:4;39294:11;;39306:18;39322:1;39306:11;;:15;;:18;;;;:::i;:::-;39278:9;:47::i;:::-;39260:14;39253:72;39373:11;;39385;;39253:72;;-1:-1:-1;39357:47:0;;39253:72;;39373:11;39385:18;;39401:1;39385:15;:18::i;39357:47::-;39339:14;39336:68;;;39434:14;;39420:45;;;39429:3;39420:45;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39420:45:0;;;;;;;;38644:829;:::o;26893:100::-;25254:2;26893:100;:::o;27005:96::-;25628:3;27005:96;:::o;38564:74::-;38627:3;38611:13;:19;38564:74::o;39485:149::-;39618:5;;39574:50;;;-1:-1:-1;;39601:12:0;:14;39591:25;39574:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39564:61;;;;;39485:149;:::o;39640:220::-;39722:7;;;39809:12;:3;39817;39809:7;:12::i;:::-;39781:22;;;;;;;;;;;;;;;;;;;;;;;;;39771:33;;;;;39763:59;;;;;;;39844:7;;;;-1:-1:-1;;;;;39640:220:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://3950eecfb05cd8337fc6cc176f62a283b539f25de01bdbe7a7e953faabec6fe1
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.