ETH Price: $3,377.14 (-1.13%)
Gas: 10 Gwei

Token

Metapolitans (MAPS)
 

Overview

Max Total Supply

10,000,000,000 MAPS

Holders

213

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Filtered by Token Holder
525960.eth
Balance
2,000,000 MAPS

Value
$0.00
0x97013995b4866f7279e2bf6dbd7677529b21a762
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:
Metapolitans

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 8 of 8: _Metapolitans.sol
//SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.7;

import "./Interfaces.sol";
import "./BaseErc20.sol";
import "./Burnable.sol";
import "./Taxable.sol";
import "./TaxDistributor.sol";
import "./AntiSniper.sol";

contract Metapolitans is BaseErc20, AntiSniper, Burnable, Taxable {

    constructor () {
        configure(0xE0Ab061C098066a6c48C509f9F4c9F3fD4fa8473);

        symbol = "MAPS";
        name = "Metapolitans";
        decimals = 8;

        // Swap
        address routerAddress = getRouterAddress();
        IDEXRouter router = IDEXRouter(routerAddress);
        address WBNB = router.WETH();
        address pair = IDEXFactory(router.factory()).createPair(WBNB, address(this));
        exchanges[pair] = true;
        taxDistributor = new TaxDistributor(routerAddress, pair, WBNB, 1200, 1200);

        // Anti Sniper
        enableSniperBlocking = true;
        isNeverSniper[address(taxDistributor)] = true;
        enableHighTaxCountdown = true;
        enableBlockLogProtection = true;

        // Tax
        minimumTimeBetweenSwaps = 30 seconds;
        minimumTokensBeforeSwap = 10000 * 10 ** decimals;
        excludedFromTax[address(taxDistributor)] = true;
        taxDistributor.createBurnTax("Burn", 100, 100);
        taxDistributor.createLiquidityTax("Liquidity", 100, 200, 0x000000000000000000000000000000000000dEaD);
        taxDistributor.createWalletTax("Treasury", 600, 600, 0x212F5880A3bd0c083DC2A438F001B733a0F7e483, true);
        autoSwapTax = false;

        // Burnable
        ableToBurn[address(taxDistributor)] = true;

        // Finalise
        _allowed[address(taxDistributor)][routerAddress] = 2**256 - 1;
        _totalSupply = _totalSupply + (10_000_000_000 * 10 ** decimals);
        _balances[owner] = _balances[owner] + _totalSupply;
        emit Transfer(address(0), owner, _totalSupply);
    }


    // Overrides
    
    function launch() public override(AntiSniper, BaseErc20) onlyOwner {
        super.launch();
    }

    function configure(address _owner) internal override(AntiSniper, Burnable, Taxable, BaseErc20) {
        super.configure(_owner);
    }

    function onOwnerChange(address from, address to) internal override(AntiSniper, Burnable, Taxable, BaseErc20) {
        super.onOwnerChange(from, to);
    }
    
    function preTransfer(address from, address to, uint256 value) override(AntiSniper, Taxable, BaseErc20) internal {
        super.preTransfer(from, to, value);
    }
    
    function calculateTransferAmount(address from, address to, uint256 value) override(AntiSniper, Taxable, BaseErc20) internal returns (uint256) {
        return super.calculateTransferAmount(from, to, value);
    }
    
    function postTransfer(address from, address to) override(BaseErc20) internal {
        super.postTransfer(from, to);
    }


} 

File 1 of 8: AddressLibrary.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity 0.8.7;

/**
 * @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
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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://consensys.net/diligence/blog/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");

        (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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

File 2 of 8: AntiSniper.sol
//SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.7;

import "./Interfaces.sol";
import "./BaseErc20.sol";

abstract contract AntiSniper is BaseErc20 {

    bool public enableSniperBlocking;
    bool public enableBlockLogProtection;
    bool public enableHighTaxCountdown;

    uint256 public msPercentage;
    uint256 public mhPercentage;
    uint256 public maxGasLimit;

    uint256 public launchTime;
    uint256 public launchBlock;
    uint256 public snipersCaught;
    
    mapping (address => bool) public isSniper;
    mapping (address => bool) public isNeverSniper;
    mapping (address => uint256) public transactionBlockLog;
    
    // Overrides
    
    function configure(address _owner) internal virtual override {
        isNeverSniper[_owner] = true;
        super.configure(_owner);
    }

    function onOwnerChange(address from, address to) internal virtual override {
        isNeverSniper[from] = false;
        isNeverSniper[to] = true;
        super.onOwnerChange(from, to);
    }
    
    function launch() override virtual public onlyOwner {
        super.launch();
        launchTime = block.timestamp;
        launchBlock = block.number;
    }
    
    function preTransfer(address from, address to, uint256 value) override virtual internal {
        require(enableSniperBlocking == false || isSniper[msg.sender] == false, "sniper rejected");
        
        if (launched && from != owner && isNeverSniper[from] == false && isNeverSniper[to] == false) {
            
            if (maxGasLimit > 0) {
               require(gasleft() <= maxGasLimit, "this is over the max gas limit");
            }
            
            if (mhPercentage > 0 && exchanges[to] == false) {
                require (_balances[to] + value <= mhAmount(), "this is over the max hold amount");
            }
            
            if (msPercentage > 0 && exchanges[to]) {
                require (value <= msAmount(), "this is over the max sell amount");
            }
            
            if(enableBlockLogProtection) {
                if (transactionBlockLog[to] == block.number) {
                    isSniper[to] = true;
                    snipersCaught ++;
                }
                if (transactionBlockLog[from] == block.number) {
                    isSniper[from] = true;
                    snipersCaught ++;
                }
                if (exchanges[to] == false) {
                    transactionBlockLog[to] = block.number;
                }
                if (exchanges[from] == false) {
                    transactionBlockLog[from] = block.number;
                }
            }

        }
        
        super.preTransfer(from, to, value);
    }
    
    function calculateTransferAmount(address from, address to, uint256 value) internal virtual override returns (uint256) {
        uint256 amountAfterTax = value;
        if (launched && enableHighTaxCountdown) {
            if (from != owner && sniperTax() > 0 && isNeverSniper[from] == false && isNeverSniper[to] == false) {
                uint256 taxAmount = (value * sniperTax()) / 10000;
                amountAfterTax = amountAfterTax - taxAmount;
                if (taxAmount > 0) {
                    _balances[address(this)] = _balances[address(this)] + taxAmount;
                    emit Transfer(from, address(this), taxAmount);
                }
            }
        }
        return super.calculateTransferAmount(from, to, amountAfterTax);
    }
    
    // Public methods
    
    function mhAmount() public view returns (uint256) {
        return (_totalSupply * mhPercentage) / 10000;
    }
    
    function msAmount() public view returns (uint256) {
         return (_totalSupply * msPercentage) / 10000;
    }
    
   function sniperTax() public virtual view returns (uint256) {
        if(launched) {
            if (block.number - launchBlock < 3) {
                return 9900;
            }
        }
        return 0;
    }
    
    // Admin methods

    function setSniperBlocking(bool enabled) external onlyOwner {
        enableSniperBlocking = enabled;
        emit ConfigurationChanged(msg.sender, "change to sniper blocking");
    }
    
    function setBlockLogProtection(bool enabled) external onlyOwner {
        enableBlockLogProtection = enabled;
        emit ConfigurationChanged(msg.sender, "change to block log protection");
    }
    
    function setHighTaxCountdown(bool enabled) external onlyOwner {
        enableHighTaxCountdown = enabled;
        emit ConfigurationChanged(msg.sender, "change to high tax countdwn");
    }
    
    function setMsPercentage(uint256 amount) external onlyOwner {
        msPercentage = amount;
        emit ConfigurationChanged(msg.sender, "change to max sell percentage");
    }
    
    function setMhPercentage(uint256 amount) external onlyOwner {
        mhPercentage = amount;
        emit ConfigurationChanged(msg.sender, "change to max hold percentage");
    }
    
    function setMaxGasLimit(uint256 amount) external onlyOwner {
        maxGasLimit = amount;
        emit ConfigurationChanged(msg.sender, "change to max gas limit");
    }
    
    function setIsSniper(address who, bool enabled) external onlyOwner {
        isSniper[who] = enabled;
        emit ConfigurationChanged(msg.sender, "change to sniper list");
    }

    function setNeverSniper(address who, bool enabled) external onlyOwner {
        isNeverSniper[who] = enabled;
        emit ConfigurationChanged(msg.sender, "change to never sniper list");
    }

    // private methods
}

File 3 of 8: BaseErc20.sol
//SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.7;

import "./Interfaces.sol";
import "./AddressLibrary.sol";

abstract contract BaseErc20 is IERC20, IOwnable {
    using Address for address;

    mapping (address => uint256) internal _balances;
    mapping (address => mapping (address => uint256)) internal _allowed;
    uint256 internal _totalSupply;
    
    string public symbol;
    string public  name;
    uint8 public decimals;
    
    address public override owner;
    bool public launched;
    
    mapping (address => bool) public canAlwaysTrade;
    mapping (address => bool) public excludedFromSelling;
    mapping (address => bool) public exchanges;
    
    event ConfigurationChanged(address indexed who, string option);

    modifier onlyOwner() {
        require(msg.sender == owner, "can only be called by the contract owner");
        _;
    }
    
    modifier isLaunched() {
        require(launched, "can only be called once token is launched");
        _;
    }

    // @dev Trading is allowed before launch if the sender is the owner, we are transferring from the owner, or in canAlwaysTrade list
    modifier tradingEnabled(address from) {
        require(launched || from == owner || canAlwaysTrade[msg.sender], "trading not enabled");
        _;
    }
    
    function configure(address _owner) internal virtual {
        owner = _owner;
        canAlwaysTrade[owner] = true;
    }

    /**
    * @dev Total number of tokens in existence
    */
    function totalSupply() external override view returns (uint256) {
        return _totalSupply;
    }

    /**
    * @dev Gets the balance of the specified address.
    * @param _owner The address to query the balance of.
    * @return An uint256 representing the amount owned by the passed address.
    */
    function balanceOf(address _owner) external override view returns (uint256) {
        return _balances[_owner];
    }

    /**
     * @dev Function to check the amount of tokens that an owner allowed to a spender.
     * @param _owner address The address which owns the funds.
     * @param spender address The address which will spend the funds.
     * @return A uint256 specifying the amount of tokens still available for the spender.
     */
    function allowance(address _owner, address spender) external override view returns (uint256) {
        return _allowed[_owner][spender];
    }

    /**
    * @dev Transfer token for a specified address
    * @param to The address to transfer to.
    * @param value The amount to be transferred.
    */
    function transfer(address to, uint256 value) external override tradingEnabled(msg.sender) returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    /**
     * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     * 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
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     */
    function approve(address spender, uint256 value) external override tradingEnabled(msg.sender) returns (bool) {
        require(spender != address(0), "cannot approve the 0 address");

        _allowed[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev Transfer tokens from one address to another.
     * Note that while this function emits an Approval event, this is not required as per the specification,
     * and other compliant implementations may not emit the event.
     * @param from address The address which you want to send tokens from
     * @param to address The address which you want to transfer to
     * @param value uint256 the amount of tokens to be transferred
     */
    function transferFrom(address from, address to, uint256 value) external override tradingEnabled(from) returns (bool) {
        _allowed[from][msg.sender] = _allowed[from][msg.sender] - value;
        _transfer(from, to, value);
        emit Approval(from, msg.sender, _allowed[from][msg.sender]);
        return true;
    }

    /**
     * @dev Increase the amount of tokens that an owner allowed to a spender.
     * approve should be called when allowed_[_spender] == 0. To increment
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * Emits an Approval event.
     * @param spender The address which will spend the funds.
     * @param addedValue The amount of tokens to increase the allowance by.
     */
    function increaseAllowance(address spender, uint256 addedValue) external tradingEnabled(msg.sender) returns (bool) {
        require(spender != address(0), "cannot approve the 0 address");

        _allowed[msg.sender][spender] = _allowed[msg.sender][spender] + addedValue;
        emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
        return true;
    }

    /**
     * @dev Decrease the amount of tokens that an owner allowed to a spender.
     * approve should be called when allowed_[_spender] == 0. To decrement
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * Emits an Approval event.
     * @param spender The address which will spend the funds.
     * @param subtractedValue The amount of tokens to decrease the allowance by.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) external tradingEnabled(msg.sender) returns (bool) {
        require(spender != address(0), "cannot approve the 0 address");

        _allowed[msg.sender][spender] = _allowed[msg.sender][spender] - subtractedValue;
        emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
        return true;
    }

    receive() external payable {}
    
    // Virtual methods
    function launch() virtual public onlyOwner {
        launched = true;
        emit ConfigurationChanged(msg.sender, "contract launched");
    }
    
    function preTransfer(address from, address to, uint256 value) virtual internal { }

    function calculateTransferAmount(address from, address to, uint256 value) virtual internal returns (uint256) {
        require(from != to, "you cannot transfer to yourself");
        return value;
    }
    
    function onOwnerChange(address from, address to) virtual internal {
        canAlwaysTrade[from] = false;
        canAlwaysTrade[to] = true;
    }

    function postTransfer(address from, address to) virtual internal { }
    


    // Admin methods
    function changeOwner(address who) external onlyOwner {
        require(who != address(0), "cannot be zero address");
        onOwnerChange(owner, who);
        owner = who;
        emit ConfigurationChanged(msg.sender, "owner changed");
    }

    function removeBnb() external onlyOwner {
        uint256 balance = address(this).balance;
        Address.sendValue(payable(owner), balance);
    }

    function transferTokens(address token, address to) external onlyOwner returns(bool){
        uint256 balance = IERC20(token).balanceOf(address(this));
        return IERC20(token).transfer(to, balance);
    }
    
    function setCanAlwaysTrade(address who, bool enabled) external onlyOwner {
        canAlwaysTrade[who] = enabled;
        emit ConfigurationChanged(msg.sender, "change to can always trade list");
    }
    
    function setExchange(address who, bool isExchange) external onlyOwner {
        exchanges[who] = isExchange;
        emit ConfigurationChanged(msg.sender, "change to exchange list");
    }
    
   
    // Private methods

    function getRouterAddress() internal view returns (address routerAddress) {
        if (block.chainid == 1 || block.chainid == 3 || block.chainid == 4  || block.chainid == 5) {
            routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ; // ETHEREUM
        } else if (block.chainid == 56) {
            routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // BSC MAINNET
        } else if (block.chainid == 97) {
            routerAddress = 0xc99f3718dB7c90b020cBBbb47eD26b0BA0C6512B; // BSC TESTNET - https://pancakeswap.rainbit.me/
        } else {
            revert("Unknown Chain ID");
        }
    }

    /**
    * @dev Transfer token for a specified addresses
    * @param from The address to transfer from.
    * @param to The address to transfer to.
    * @param value The amount to be transferred.
    */
    function _transfer(address from, address to, uint256 value) private {
        require(to != address(0), "cannot be zero address");
        require(excludedFromSelling[from] == false || exchanges[to] == false, "address is not allowed to sell");
        
        preTransfer(from, to, value);

        uint256 modifiedAmount = calculateTransferAmount(from, to, value);
        _balances[from] = _balances[from] - value;
        _balances[to] = _balances[to] + modifiedAmount;

        emit Transfer(from, to, modifiedAmount);

        postTransfer(from, to);
    }
}

File 4 of 8: Burnable.sol
//SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.7;

import "./Interfaces.sol";
import "./BaseErc20.sol";

abstract contract Burnable is BaseErc20, IBurnable {
    
    mapping (address => bool) public ableToBurn;

    modifier onlyBurner() {
        require(ableToBurn[msg.sender], "no burn permissions");
        _;
    }

    // Overrides
    
    function configure(address _owner) internal virtual override {
        ableToBurn[_owner] = true;
        super.configure(_owner);
    }
    
    function onOwnerChange(address from, address to) internal virtual override {
        ableToBurn[from] = false;
        ableToBurn[to] = true;
        super.onOwnerChange(from, to);
    }
    
    
    // Admin methods

    function setAbleToBurn(address who, bool enabled) external onlyOwner {
        ableToBurn[who] = enabled;
        emit ConfigurationChanged(msg.sender, "change to burners list");
    }

    /**
     * @dev Internal function that burns an amount of the token of a given
     * account.
     * @param value The amount that will be burnt.
     */
    function burn(uint256 value) external override onlyBurner {
        _burn(msg.sender, value);
    }

    /**
     * @dev Internal function that burns an amount of the token of a given
     * account, deducting from the sender's allowance for said account. Uses the
     * internal burn function.
     * Emits an Approval event (reflecting the reduced allowance).
     * @param account The account whose tokens will be burnt.
     * @param value The amount that will be burnt.
     */
    function burnFrom(address account, uint256 value) external override onlyBurner {
        _allowed[account][msg.sender] = _allowed[account][msg.sender] - value;
        _burn(account, value);
        emit Approval(account, msg.sender, _allowed[account][msg.sender]);
    }


    // Private methods

    function _burn(address account, uint256 value) internal {
        require(account != address(0), "Cannot burn from null address");

        _totalSupply = _totalSupply - value;
        _balances[account] = _balances[account] - value;
        emit Transfer(account, address(0), value);
    }
}

File 5 of 8: Interfaces.sol
//SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.7;

interface IOwnable {
    function owner() external view returns (address);
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address who) external view returns (uint256);
    function allowance(address _owner, address spender) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IBurnable {
    function burn(uint256 value) external;
    function burnFrom(address account, uint256 value) external;
}

interface IDEXFactory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IDEXRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    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 swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
    function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
}

interface IDividendDistributor {
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external;
    function setShare(address shareholder, uint256 amount) external;
    function depositNative() external payable;
    function depositToken(address from, uint256 amount) external;
    function process(uint256 gas) external;
    function inSwap() external view returns (bool);
}


interface ITaxDistributor {
    receive() external payable;
    function lastSwapTime() external view returns (uint256);
    function inSwap() external view returns (bool);
    function createWalletTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external;
    function createDistributorTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external;
    function createDividendTax(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external;
    function createBurnTax(string memory name, uint256 buyTax, uint256 sellTax) external;
    function createLiquidityTax(string memory name, uint256 buyTax, uint256 sellTax, address holder) external;
    function distribute() external payable;
    function getSellTax() external view returns (uint256);
    function getBuyTax() external view returns (uint256);
    function setTaxWallet(string memory taxName, address wallet) external;
    function setSellTax(string memory taxName, uint256 taxPercentage) external;
    function setBuyTax(string memory taxName, uint256 taxPercentage) external;
    function takeSellTax(uint256 value) external returns (uint256);
    function takeBuyTax(uint256 value) external returns (uint256);
}

interface IWalletDistributor {
    function receiveToken(address token, address from, uint256 amount) external;
}

File 6 of 8: Taxable.sol
//SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.7;

import "./Interfaces.sol";
import "./BaseErc20.sol";

abstract contract Taxable is BaseErc20 {
    
    ITaxDistributor taxDistributor;

    bool public autoSwapTax;
    uint256 public minimumTimeBetweenSwaps;
    uint256 public minimumTokensBeforeSwap;
    mapping (address => bool) public excludedFromTax;
    uint256 swapStartTime;
    
    // Overrides
    
    function configure(address _owner) internal virtual override {
        excludedFromTax[_owner] = true;
        super.configure(_owner);
    }

    function onOwnerChange(address from, address to) internal virtual override {
        excludedFromTax[from] = false;
        excludedFromTax[to] = true;
        super.onOwnerChange(from, to);
    }
    
    function calculateTransferAmount(address from, address to, uint256 value) internal virtual override returns (uint256) {
        
        uint256 amountAfterTax = value;

        if (excludedFromTax[from] == false && excludedFromTax[to] == false && launched) {
            if (exchanges[from]) {
                // we are BUYING
                amountAfterTax = taxDistributor.takeBuyTax(value);
            } else if (exchanges[to]) {
                // we are SELLING
                amountAfterTax = taxDistributor.takeSellTax(value);
            }
        }

        uint256 taxAmount = value - amountAfterTax;
        if (taxAmount > 0) {
            _balances[address(taxDistributor)] = _balances[address(taxDistributor)] + taxAmount;
            emit Transfer(from, address(taxDistributor), taxAmount);
        }
        return super.calculateTransferAmount(from, to, amountAfterTax);
    }


    function preTransfer(address from, address to, uint256 value) override virtual internal {
        uint256 timeSinceLastSwap = block.timestamp - taxDistributor.lastSwapTime();
        if (
            launched && 
            autoSwapTax && 
            exchanges[to] && 
            swapStartTime + 60 <= block.timestamp &&
            timeSinceLastSwap >= minimumTimeBetweenSwaps &&
            _balances[address(taxDistributor)] >= minimumTokensBeforeSwap &&
            taxDistributor.inSwap() == false
        ) {
            swapStartTime = block.timestamp;
            try taxDistributor.distribute() {} catch {}
        }
        super.preTransfer(from, to, value);
    }
    
    
    // Public methods
    
    /**
     * @dev Return the current total sell tax from the tax distributor
     */
    function sellTax() external view returns (uint256) {
        return taxDistributor.getSellTax();
    }

    /**
     * @dev Return the current total sell tax from the tax distributor
     */
    function buyTax() external view returns (uint256) {
        return taxDistributor.getBuyTax();
    }

    /**
     * @dev Return the address of the tax distributor contract
     */
    function taxDistributorAddress() external view returns (address) {
        return address(taxDistributor);
    }    
    
    
    // Admin methods

    function setAutoSwaptax(bool enabled) external onlyOwner {
        autoSwapTax = enabled;
        emit ConfigurationChanged(msg.sender, "change to auto swap");
    }

    function setExcludedFromTax(address who, bool enabled) external onlyOwner {
        require(exchanges[who] == false || enabled == false, "Cannot exclude an exchange from tax");
        excludedFromTax[who] = enabled;
        emit ConfigurationChanged(msg.sender, "change to tax exclusion list");
    }

    function setTaxDistributionThresholds(uint256 minAmount, uint256 minTime) external onlyOwner {
        minimumTokensBeforeSwap = minAmount;
        minimumTimeBetweenSwaps = minTime;
        emit ConfigurationChanged(msg.sender, "change to auto swap thresholds");
    }
    
    function setSellTax(string memory taxName, uint256 taxAmount) external onlyOwner {
        taxDistributor.setSellTax(taxName, taxAmount);
        emit ConfigurationChanged(msg.sender, "change to sell tax");
    }

    function setBuyTax(string memory taxName, uint256 taxAmount) external onlyOwner {
        taxDistributor.setBuyTax(taxName, taxAmount);
        emit ConfigurationChanged(msg.sender, "change to buy tax");
    }
    
    function setTaxWallet(string memory taxName, address wallet) external onlyOwner {
        taxDistributor.setTaxWallet(taxName, wallet);
        emit ConfigurationChanged(msg.sender, "change to tax wallet");
    }
    
    function runSwapManually() external isLaunched {
        taxDistributor.distribute();
    }
}

File 7 of 8: TaxDistributor.sol
//SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.7;

import "./Interfaces.sol";
import "./AddressLibrary.sol";

contract TaxDistributor is ITaxDistributor {
    using Address for address;

    address immutable public tokenPair;
    address immutable public routerAddress;
    address immutable private _token;
    address immutable private _wbnb;

    IDEXRouter private _router;

    bool public override inSwap;
    uint256 public override lastSwapTime;

    uint256 immutable public maxSellTax;
    uint256 immutable public maxBuyTax;

    enum TaxType { WALLET, DIVIDEND, LIQUIDITY, DISTRIBUTOR, BURN }
    struct Tax {
        string taxName;
        uint256 buyTaxPercentage;
        uint256 sellTaxPercentage;
        uint256 taxPool;
        TaxType taxType;
        address location;
        uint256 share;
        bool convertToNative;
    }
    Tax[] public taxes;

    event TaxesDistributed(uint256 tokensSwapped, uint256 ethReceived);
    event DistributionError(string text);

    modifier onlyToken() {
        require(msg.sender == _token, "no permissions");
        _;
    }

    modifier swapLock() {
        require(inSwap == false, "already swapping");
        inSwap = true;
        _;
        inSwap = false;
    }

    constructor (address router, address pair, address wbnb, uint256 _maxSellTax, uint256 _maxBuyTax) {
        require(wbnb != address(0), "pairedToken cannot be 0 address");
        require(pair != address(0), "pair cannot be 0 address");
        require(router != address(0), "router cannot be 0 address");
        _token = msg.sender;
        _wbnb = wbnb;
        _router = IDEXRouter(router);
        maxSellTax = _maxSellTax;
        maxBuyTax = _maxBuyTax;
        tokenPair = pair;
        routerAddress = router;
    }

    receive() external override payable {}

    function createWalletTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external override onlyToken {
        require(checkTaxExists(name) == false, "This tax already exists");
        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.WALLET, wallet, 0, convertToNative));
    }

    function createDistributorTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external override onlyToken {
        require(checkTaxExists(name) == false, "This tax already exists");
        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.DISTRIBUTOR, wallet, 0, convertToNative));
    }
    
    function createDividendTax(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external override onlyToken {
        require(checkTaxExists(name) == false, "This tax already exists");
        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.DIVIDEND, dividendDistributor, 0, convertToNative));
    }
    
    function createBurnTax(string memory name, uint256 buyTax, uint256 sellTax) external override onlyToken {
        require(checkTaxExists(name) == false, "This tax already exists");
        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.BURN, address(0), 0, false));
    }

    function createLiquidityTax(string memory name, uint256 buyTax, uint256 sellTax, address holder) external override onlyToken {
        require(checkTaxExists(name) == false, "This tax already exists");
        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.LIQUIDITY, holder, 0, false));
    }

    function checkTaxExists(string memory taxName) private view returns(bool) {
        for (uint256 i = 0; i < taxes.length; i++) {
            if (compareStrings(taxes[i].taxName, taxName)) {
                return true;
            }
        }
        return false;
    }

    function distribute() external payable override onlyToken swapLock {
        address[] memory path = new address[](2);
        path[0] = _token;
        path[1] = _wbnb;
        IERC20 token = IERC20(_token);

        uint256 totalTokens;
        for (uint256 i = 0; i < taxes.length; i++) {
            if (taxes[i].taxType == TaxType.LIQUIDITY) {
                uint256 half = taxes[i].taxPool / 2;
                totalTokens += taxes[i].taxPool - half;
            } else if (taxes[i].convertToNative) {
                totalTokens += taxes[i].taxPool;
            }
        }
        totalTokens = checkTokenAmount(token, totalTokens);

        uint256[] memory amts = _router.swapExactTokensForETH(
            totalTokens,
            0,
            path,
            address(this),
            block.timestamp + 300
        );
        uint256 amountBNB = address(this).balance;

        if (totalTokens != amts[0] || amountBNB != amts[1] ) {
            emit DistributionError("Unexpected amounts returned from swap");
        }

        // Calculate the distribution
        uint256 toDistribute = amountBNB;
        for (uint256 i = 0; i < taxes.length; i++) {

            if (taxes[i].convertToNative || taxes[i].taxType == TaxType.LIQUIDITY) {
                if (i == taxes.length - 1) {
                    taxes[i].share = toDistribute;
                } else if (taxes[i].taxType == TaxType.LIQUIDITY) {
                    uint256 half = taxes[i].taxPool / 2;
                    uint256 share = (amountBNB * (taxes[i].taxPool - half)) / totalTokens;
                    taxes[i].share = share;
                    toDistribute = toDistribute - share;
                } else {
                    uint256 share = (amountBNB * taxes[i].taxPool) / totalTokens;
                    taxes[i].share = share;
                    toDistribute = toDistribute - share;
                }
            }
        }

        // Distribute the coins
        for (uint256 i = 0; i < taxes.length; i++) {
            
            if (taxes[i].taxType == TaxType.WALLET) {
                if (taxes[i].convertToNative) {
                    Address.sendValue(payable(taxes[i].location), taxes[i].share);
                } else {
                    require(token.transfer(taxes[i].location, checkTokenAmount(token, taxes[i].taxPool)), "could not transfer tokens");
                }
            }
            else if (taxes[i].taxType == TaxType.DISTRIBUTOR) {
                if (taxes[i].convertToNative) {
                    Address.sendValue(payable(taxes[i].location), taxes[i].share);
                } else {
                    token.approve(taxes[i].location, taxes[i].taxPool);
                    IWalletDistributor(taxes[i].location).receiveToken(_token, address(this), checkTokenAmount(token, taxes[i].taxPool));
                }
            }
            else if (taxes[i].taxType == TaxType.DIVIDEND) {
               if (taxes[i].convertToNative) {
                    IDividendDistributor(taxes[i].location).depositNative{value: taxes[i].share}();
                } else {
                    IDividendDistributor(taxes[i].location).depositToken(address(this), checkTokenAmount(token, taxes[i].taxPool));
                }
            }
            else if (taxes[i].taxType == TaxType.BURN) {
                IBurnable(_token).burn(checkTokenAmount(token, taxes[i].taxPool));
            }
            else if (taxes[i].taxType == TaxType.LIQUIDITY) {
                if(taxes[i].share > 0){
                    uint256 half = checkTokenAmount(token, taxes[i].taxPool / 2);
                    _router.addLiquidityETH{value: taxes[i].share}(
                        _token,
                        half,
                        0,
                        0,
                        taxes[i].location,
                        block.timestamp + 300
                    );
                }
            }
            
            taxes[i].taxPool = 0;
            taxes[i].share = 0;
        }

        // Remove any leftoever tokens
        if (address(this).balance > 0) {
            Address.sendValue(payable(_token), address(this).balance);
        }

        if (token.balanceOf(address(this)) > 0) {
            token.transfer(_token, token.balanceOf(address(this)));
        }

        emit TaxesDistributed(totalTokens, amountBNB);

        lastSwapTime = block.timestamp;
    }

    function getSellTax() public override onlyToken view returns (uint256) {
        uint256 taxAmount;
        for (uint256 i = 0; i < taxes.length; i++) {
            taxAmount += taxes[i].sellTaxPercentage;
        }
        return taxAmount;
    }

    function getBuyTax() public override onlyToken view returns (uint256) {
        uint256 taxAmount;
        for (uint256 i = 0; i < taxes.length; i++) {
            taxAmount += taxes[i].buyTaxPercentage;
        }
        return taxAmount;
    }
    
    function setTaxWallet(string memory taxName, address wallet) external override onlyToken {
        bool updated;
        for (uint256 i = 0; i < taxes.length; i++) {
            if ((taxes[i].taxType == TaxType.WALLET || taxes[i].taxType == TaxType.LIQUIDITY || taxes[i].taxType == TaxType.DISTRIBUTOR) && compareStrings(taxes[i].taxName, taxName)) {
                taxes[i].location = wallet;
                updated = true;
            }
        }
        require(updated, "could not find tax to update");
    }

    function setSellTax(string memory taxName, uint256 taxPercentage) external override onlyToken {
        bool updated;
        for (uint256 i = 0; i < taxes.length; i++) {
            if (compareStrings(taxes[i].taxName, taxName)) {
                taxes[i].sellTaxPercentage = taxPercentage;
                updated = true;
            }
        }
        require(updated, "could not find tax to update");
        require(getSellTax() <= maxSellTax, "tax cannot be set this high");
    }

    function setBuyTax(string memory taxName, uint256 taxPercentage) external override onlyToken {
        bool updated;
        for (uint256 i = 0; i < taxes.length; i++) {
            //if (taxes[i].taxName == taxName) {
            if (compareStrings(taxes[i].taxName, taxName)) {
                taxes[i].buyTaxPercentage = taxPercentage;
                updated = true;
            }
        }
        require(updated, "could not find tax to update");
        require(getBuyTax() <= maxBuyTax, "tax cannot be set this high");
    }

    function takeSellTax(uint256 value) external override onlyToken returns (uint256) {
        for (uint256 i = 0; i < taxes.length; i++) {
            if (taxes[i].sellTaxPercentage > 0) {
                uint256 taxAmount = (value * taxes[i].sellTaxPercentage) / 10000;
                taxes[i].taxPool += taxAmount;
                value = value - taxAmount;
            }
        }
        return value;
    }

    function takeBuyTax(uint256 value) external override onlyToken returns (uint256) {
        for (uint256 i = 0; i < taxes.length; i++) {
            if (taxes[i].buyTaxPercentage > 0) {
                uint256 taxAmount = (value * taxes[i].buyTaxPercentage) / 10000;
                taxes[i].taxPool += taxAmount;
                value = value - taxAmount;
            }
        }
        return value;
    }
    
    
    
    // Private methods
    function compareStrings(string memory a, string memory b) private pure returns (bool) {
        return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b))));
    }

    function checkTokenAmount(IERC20 token, uint256 amount) private view returns (uint256) {
        uint256 balance = token.balanceOf(address(this));
        if (balance > amount) {
            return amount;
        }
        return balance;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"string","name":"option","type":"string"}],"name":"ConfigurationChanged","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":[{"internalType":"address","name":"","type":"address"}],"name":"ableToBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoSwapTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canAlwaysTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableBlockLogProtection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableHighTaxCountdown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableSniperBlocking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exchanges","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromSelling","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isNeverSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGasLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mhAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mhPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTimeBetweenSwaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"msAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"msPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeBnb","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"runSwapManually","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAbleToBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAutoSwaptax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setBlockLogProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setCanAlwaysTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"isExchange","type":"bool"}],"name":"setExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setHighTaxCountdown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setIsSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxGasLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMhPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMsPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setNeverSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSniperBlocking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"minTime","type":"uint256"}],"name":"setTaxDistributionThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"address","name":"wallet","type":"address"}],"name":"setTaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sniperTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"snipersCaught","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxDistributorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"transactionBlockLog","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"transferTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506200003173e0ab061c098066a6c48c509f9f4c9f3fd4fa84736200064b565b604080518082019091526004808252634d41505360e01b60209092019182526200005e916003916200082b565b5060408051808201909152600c8082526b4d657461706f6c6974616e7360a01b602090920191825262000094916004916200082b565b506005805460ff191660081790556000620000ae62000664565b905060008190506000816001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620000f157600080fd5b505afa15801562000106573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200012c9190620008df565b90506000826001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200016a57600080fd5b505afa1580156200017f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001a59190620008df565b6040516364e329cb60e11b81526001600160a01b038481166004830152306024830152919091169063c9c6539690604401602060405180830381600087803b158015620001f157600080fd5b505af115801562000206573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022c9190620008df565b6001600160a01b03811660009081526008602052604090819020805460ff19166001179055519091508490829084906104b09081906200026c90620008ba565b6001600160a01b03958616815293851660208501529390911660408301526060820152608081019190915260a001604051809103906000f080158015620002b7573d6000803e3d6000fd5b50601480546001600160a01b0319166001600160a01b039290921691821790556009805460ff19908116600190811783556000938452601160205260409093208054909116909217909155805462ffff00191662010100179055601e601555600554620003299060ff16600a62000975565b620003379061271062000a36565b601655601480546001600160a01b0390811660009081526017602052604090819020805460ff1916600117905591549151633ed69e0360e21b815291169063fb5a780c90620003b3906064908190600401606080825260049082015263213ab93760e11b60808201526020810192909252604082015260a00190565b600060405180830381600087803b158015620003ce57600080fd5b505af1158015620003e3573d6000803e3d6000fd5b50506014546040516376a674cf60e11b81526080600482015260096084820152684c697175696469747960b81b60a482015260646024820181905260c8604483015261dead908201526001600160a01b03909116925063ed4ce99e915060c401600060405180830381600087803b1580156200045e57600080fd5b505af115801562000473573d6000803e3d6000fd5b5050601454604051634693167f60e11b815260a06004820152600860a482015267547265617375727960c01b60c482015261025860248201819052604482015273212f5880a3bd0c083dc2a438f001b733a0f7e4836064820152600160848201526001600160a01b039091169250638d262cfe915060e401600060405180830381600087803b1580156200050657600080fd5b505af11580156200051b573d6000803e3d6000fd5b50506014805460ff60a01b19811682556001600160a01b039081166000908152601360209081526040808320805460ff19166001908117909155945484168352938152838220928a168252919091522060001990555050600554620005859060ff16600a62000975565b62000596906402540be40062000a36565b600254620005a5919062000911565b600281905560055461010090046001600160a01b0316600090815260208190526040902054620005d6919062000911565b600580546001600160a01b03610100918290048116600090815260208190526040808220959095559254600254945192900416927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef916200063991815260200190565b60405180910390a35050505062000aab565b62000661816200073260201b620022351760201c565b50565b60004660011480620006765750466003145b80620006825750466004145b806200068e5750466005145b15620006ad5750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b4660381415620006d057507310ed43c718714eb63d5aa57b78b54704e256024e90565b4660611415620006f3575073c99f3718db7c90b020cbbbb47ed26b0ba0c6512b90565b60405162461bcd60e51b815260206004820152601060248201526f155b9adb9bdddb8810da185a5b88125160821b604482015260640160405180910390fd5b6001600160a01b0381166000908152601760209081526040909120805460ff19166001179055620006619082906200225d6200076e821b17901c565b6001600160a01b0381166000908152601360209081526040909120805460ff191660011790556200066190829062002285620007aa821b17901c565b6001600160a01b0381166000908152601160209081526040909120805460ff1916600117905562000661908290620022ad620007e6821b17901c565b60058054610100600160a81b0319166101006001600160a01b03938416810291909117918290559004166000908152600660205260409020805460ff19166001179055565b828054620008399062000a58565b90600052602060002090601f0160209004810192826200085d5760008555620008a8565b82601f106200087857805160ff1916838001178555620008a8565b82800160010185558215620008a8579182015b82811115620008a85782518255916020019190600101906200088b565b50620008b6929150620008c8565b5090565b6132b2806200422583390190565b5b80821115620008b65760008155600101620008c9565b600060208284031215620008f257600080fd5b81516001600160a01b03811681146200090a57600080fd5b9392505050565b6000821982111562000927576200092762000a95565b500190565b600181815b808511156200096d57816000190482111562000951576200095162000a95565b808516156200095f57918102915b93841c939080029062000931565b509250929050565b60006200090a60ff841683600082620009915750600162000a30565b81620009a05750600062000a30565b8160018114620009b95760028114620009c457620009e4565b600191505062000a30565b60ff841115620009d857620009d862000a95565b50506001821b62000a30565b5060208310610133831016604e8410600b841016171562000a09575081810a62000a30565b62000a1583836200092c565b806000190482111562000a2c5762000a2c62000a95565b0290505b92915050565b600081600019048311821515161562000a535762000a5362000a95565b500290565b600181811c9082168062000a6d57607f821691505b6020821081141562000a8f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b61376a8062000abb6000396000f3fe6080604052600436106103bc5760003560e01c80636b8f2f3b116101f2578063c2ed286b1161010d578063dba61c58116100a0578063e948474b1161006f578063e948474b14610b69578063ede49a1914610b99578063f19fffcb14610bb3578063f1f5cd9114610bd357600080fd5b8063dba61c5814610ae2578063dd62ed3e14610af8578063e53be8d114610b3e578063e79d416014610b5357600080fd5b8063d00efb2f116100dc578063d00efb2f14610a69578063d2d7ad8314610a7f578063d31acb2814610a95578063db38a41d14610ab557600080fd5b8063c2ed286b146109fe578063c4a5abcd14610a1e578063c552f4c514610a34578063cc1776d314610a5457600080fd5b80638da5cb5b11610185578063a6f9dae111610154578063a6f9dae11461096e578063a9059cbb1461098e578063b0ad3ebf146109ae578063c20c5caf146109de57600080fd5b80638da5cb5b146108e457806395d89b4114610909578063989763ef1461091e578063a457c2d71461094e57600080fd5b8063790ca413116101c1578063790ca4131461086d57806379cc6790146108835780638091f3bf146108a357806381045345146108c457600080fd5b80636b8f2f3b146107d15780636f864552146107f257806370a08231146108075780637412dbb31461083d57600080fd5b806339509351116102e25780635543379a116102755780635e45da23116102445780635e45da23146107665780636331bf651461077c5780636508c57e146107915780636a092e79146107b157600080fd5b80635543379a146106e6578063583dd79d146107065780635d90bbaf146107265780635d9d7d431461074657600080fd5b80634f7041a5116102b15780634f7041a5146106725780634f72e2a2146106875780634fbc2775146106a757806352c6dbc4146106c757600080fd5b8063395093511461060757806342966c6814610627578063442ef7d21461064757806345541cba1461065c57600080fd5b8063185511081161035a5780632b750627116103295780632b7506271461055b578063313ce5671461058b5780633164df8b146105b757806336827499146105e757600080fd5b806318551108146104c95780631e19ae77146104fb57806323b872dd1461051b57806328be90381461053b57600080fd5b8063095ea7b311610396578063095ea7b31461042a5780630f3a325f1461045a5780631776834a1461048a57806318160ddd146104aa57600080fd5b806301339c21146103c857806306fdde03146103df57806307a1cfbd1461040a57600080fd5b366103c357005b600080fd5b3480156103d457600080fd5b506103dd610be8565b005b3480156103eb57600080fd5b506103f4610c2a565b60405161040191906134c9565b60405180910390f35b34801561041657600080fd5b506103dd6104253660046133e3565b610cb8565b34801561043657600080fd5b5061044a61044536600461333a565b610da2565b6040519015158152602001610401565b34801561046657600080fd5b5061044a610475366004613272565b60106020526000908152604090205460ff1681565b34801561049657600080fd5b506103dd6104a5366004613428565b610e81565b3480156104b657600080fd5b506002545b604051908152602001610401565b3480156104d557600080fd5b506014546001600160a01b03165b6040516001600160a01b039091168152602001610401565b34801561050757600080fd5b506103dd610516366004613303565b610f10565b34801561052757600080fd5b5061044a6105363660046132c7565b610fae565b34801561054757600080fd5b506103dd610556366004613303565b6110c4565b34801561056757600080fd5b5061044a610576366004613272565b60116020526000908152604090205460ff1681565b34801561059757600080fd5b506005546105a59060ff1681565b60405160ff9091168152602001610401565b3480156105c357600080fd5b5061044a6105d2366004613272565b60136020526000908152604090205460ff1681565b3480156105f357600080fd5b506103dd610602366004613364565b611169565b34801561061357600080fd5b5061044a61062236600461333a565b6111ff565b34801561063357600080fd5b506103dd610642366004613428565b6112fe565b34801561065357600080fd5b506103dd611360565b34801561066857600080fd5b506104bb600a5481565b34801561067e57600080fd5b506104bb611435565b34801561069357600080fd5b506103dd6106a2366004613364565b6114b7565b3480156106b357600080fd5b506103dd6106c2366004613303565b611545565b3480156106d357600080fd5b5060095461044a90610100900460ff1681565b3480156106f257600080fd5b506103dd610701366004613364565b6115ea565b34801561071257600080fd5b506103dd61072136600461339e565b61167e565b34801561073257600080fd5b506103dd610741366004613303565b61175f565b34801561075257600080fd5b506103dd610761366004613303565b6117fc565b34801561077257600080fd5b506104bb600c5481565b34801561078857600080fd5b506104bb6118a1565b34801561079d57600080fd5b506103dd6107ac3660046133e3565b6118c0565b3480156107bd57600080fd5b5061044a6107cc366004613294565b61199f565b3480156107dd57600080fd5b5060145461044a90600160a01b900460ff1681565b3480156107fe57600080fd5b506104bb611ad9565b34801561081357600080fd5b506104bb610822366004613272565b6001600160a01b031660009081526020819052604090205490565b34801561084957600080fd5b5061044a610858366004613272565b60086020526000908152604090205460ff1681565b34801561087957600080fd5b506104bb600d5481565b34801561088f57600080fd5b506103dd61089e36600461333a565b611aee565b3480156108af57600080fd5b5060055461044a90600160a81b900460ff1681565b3480156108d057600080fd5b506103dd6108df366004613428565b611bed565b3480156108f057600080fd5b506005546104e39061010090046001600160a01b031681565b34801561091557600080fd5b506103f4611c71565b34801561092a57600080fd5b5061044a610939366004613272565b60176020526000908152604090205460ff1681565b34801561095a57600080fd5b5061044a61096936600461333a565b611c7e565b34801561097a57600080fd5b506103dd610989366004613272565b611d38565b34801561099a57600080fd5b5061044a6109a936600461333a565b611e33565b3480156109ba57600080fd5b5061044a6109c9366004613272565b60066020526000908152604090205460ff1681565b3480156109ea57600080fd5b506103dd6109f9366004613428565b611ead565b348015610a0a57600080fd5b506103dd610a19366004613303565b611f31565b348015610a2a57600080fd5b506104bb600b5481565b348015610a4057600080fd5b506103dd610a4f366004613364565b612054565b348015610a6057600080fd5b506104bb6120e3565b348015610a7557600080fd5b506104bb600e5481565b348015610a8b57600080fd5b506104bb60165481565b348015610aa157600080fd5b506103dd610ab036600461345a565b612128565b348015610ac157600080fd5b506104bb610ad0366004613272565b60126020526000908152604090205481565b348015610aee57600080fd5b506104bb60155481565b348015610b0457600080fd5b506104bb610b13366004613294565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b4a57600080fd5b506103dd6121b1565b348015610b5f57600080fd5b506104bb600f5481565b348015610b7557600080fd5b5061044a610b84366004613272565b60076020526000908152604090205460ff1681565b348015610ba557600080fd5b5060095461044a9060ff1681565b348015610bbf57600080fd5b5060095461044a9062010000900460ff1681565b348015610bdf57600080fd5b506104bb6121fd565b60055461010090046001600160a01b03163314610c205760405162461bcd60e51b8152600401610c179061358c565b60405180910390fd5b610c286122f2565b565b60048054610c3790613644565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6390613644565b8015610cb05780601f10610c8557610100808354040283529160200191610cb0565b820191906000526020600020905b815481529060010190602001808311610c9357829003601f168201915b505050505081565b60055461010090046001600160a01b03163314610ce75760405162461bcd60e51b8152600401610c179061358c565b6014546040516307a1cfbd60e01b81526001600160a01b03909116906307a1cfbd90610d199085908590600401613506565b600060405180830381600087803b158015610d3357600080fd5b505af1158015610d47573d6000803e3d6000fd5b50505050336001600160a01b03166000805160206136d5833981519152604051610d96906020808252601190820152700c6d0c2dcceca40e8de40c4eaf240e8c2f607b1b604082015260600190565b60405180910390a25050565b6005546000903390600160a81b900460ff1680610dd157506005546001600160a01b0382811661010090920416145b80610deb57503360009081526006602052604090205460ff165b610e075760405162461bcd60e51b8152600401610c179061355f565b6001600160a01b038416610e2d5760405162461bcd60e51b8152600401610c1790613528565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208790555186815291929160008051602061371583398151915291015b60405180910390a35060019392505050565b60055461010090046001600160a01b03163314610eb05760405162461bcd60e51b8152600401610c179061358c565b600c81905560405133906000805160206136d583398151915290610f059060208082526017908201527f6368616e676520746f206d617820676173206c696d6974000000000000000000604082015260600190565b60405180910390a250565b60055461010090046001600160a01b03163314610f3f5760405162461bcd60e51b8152600401610c179061358c565b6001600160a01b03821660009081526013602052604090819020805483151560ff199091161790555133906000805160206136d583398151915290610d969060208082526016908201527518da185b99d9481d1bc8189d5c9b995c9cc81b1a5cdd60521b604082015260600190565b6005546000908490600160a81b900460ff1680610fdd57506005546001600160a01b0382811661010090920416145b80610ff757503360009081526006602052604090205460ff165b6110135760405162461bcd60e51b8152600401610c179061355f565b6001600160a01b038516600090815260016020908152604080832033845290915290205461104290849061362d565b6001600160a01b0386166000908152600160209081526040808320338452909152902055611071858585612333565b6001600160a01b03851660008181526001602090815260408083203380855290835292819020549051908152919291600080516020613715833981519152910160405180910390a3506001949350505050565b60055461010090046001600160a01b031633146110f35760405162461bcd60e51b8152600401610c179061358c565b6001600160a01b03821660009081526008602052604090819020805483151560ff199091161790555133906000805160206136d583398151915290610d969060208082526017908201527f6368616e676520746f2065786368616e6765206c697374000000000000000000604082015260600190565b60055461010090046001600160a01b031633146111985760405162461bcd60e51b8152600401610c179061358c565b60098054821515620100000262ff00001990911617905560405133906000805160206136d583398151915290610f05906020808252601b908201527f6368616e676520746f20686967682074617820636f756e7464776e0000000000604082015260600190565b6005546000903390600160a81b900460ff168061122e57506005546001600160a01b0382811661010090920416145b8061124857503360009081526006602052604090205460ff165b6112645760405162461bcd60e51b8152600401610c179061355f565b6001600160a01b03841661128a5760405162461bcd60e51b8152600401610c1790613528565b3360009081526001602090815260408083206001600160a01b03881684529091529020546112b99084906135d4565b3360008181526001602090815260408083206001600160a01b038a16808552908352928190208590555193845290926000805160206137158339815191529101610e6f565b3360009081526013602052604090205460ff166113535760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610c17565b61135d33826124c5565b50565b600554600160a81b900460ff166113cb5760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b6064820152608401610c17565b601460009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561141b57600080fd5b505af115801561142f573d6000803e3d6000fd5b50505050565b60145460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a916004808301926020929190829003018186803b15801561147a57600080fd5b505afa15801561148e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b29190613441565b905090565b60055461010090046001600160a01b031633146114e65760405162461bcd60e51b8152600401610c179061358c565b60148054821515600160a01b0260ff60a01b1990911617905560405133906000805160206136d583398151915290610f059060208082526013908201527206368616e676520746f206175746f207377617606c1b604082015260600190565b60055461010090046001600160a01b031633146115745760405162461bcd60e51b8152600401610c179061358c565b6001600160a01b03821660009081526006602052604090819020805483151560ff199091161790555133906000805160206136d583398151915290610d96906020808252601f908201527f6368616e676520746f2063616e20616c77617973207472616465206c69737400604082015260600190565b60055461010090046001600160a01b031633146116195760405162461bcd60e51b8152600401610c179061358c565b600980548215156101000261ff001990911617905560405133906000805160206136d583398151915290610f05906020808252601e908201527f6368616e676520746f20626c6f636b206c6f672070726f74656374696f6e0000604082015260600190565b60055461010090046001600160a01b031633146116ad5760405162461bcd60e51b8152600401610c179061358c565b60145460405163583dd79d60e01b81526001600160a01b039091169063583dd79d906116df90859085906004016134dc565b600060405180830381600087803b1580156116f957600080fd5b505af115801561170d573d6000803e3d6000fd5b50505050336001600160a01b03166000805160206136d5833981519152604051610d969060208082526014908201527318da185b99d9481d1bc81d185e081dd85b1b195d60621b604082015260600190565b60055461010090046001600160a01b0316331461178e5760405162461bcd60e51b8152600401610c179061358c565b6001600160a01b03821660009081526010602052604090819020805483151560ff199091161790555133906000805160206136d583398151915290610d969060208082526015908201527418da185b99d9481d1bc81cdb9a5c195c881b1a5cdd605a1b604082015260600190565b60055461010090046001600160a01b0316331461182b5760405162461bcd60e51b8152600401610c179061358c565b6001600160a01b03821660009081526011602052604090819020805483151560ff199091161790555133906000805160206136d583398151915290610d96906020808252601b908201527f6368616e676520746f206e6576657220736e69706572206c6973740000000000604082015260600190565b6000612710600b546002546118b6919061360e565b6114b291906135ec565b60055461010090046001600160a01b031633146118ef5760405162461bcd60e51b8152600401610c179061358c565b60145460405163328462bf60e11b81526001600160a01b0390911690636508c57e906119219085908590600401613506565b600060405180830381600087803b15801561193b57600080fd5b505af115801561194f573d6000803e3d6000fd5b50505050336001600160a01b03166000805160206136d5833981519152604051610d96906020808252601290820152710c6d0c2dcceca40e8de40e6cad8d840e8c2f60731b604082015260600190565b60055460009061010090046001600160a01b031633146119d15760405162461bcd60e51b8152600401610c179061358c565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b158015611a1357600080fd5b505afa158015611a27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4b9190613441565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb90604401602060405180830381600087803b158015611a9957600080fd5b505af1158015611aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad19190613381565b949350505050565b6000612710600a546002546118b6919061360e565b3360009081526013602052604090205460ff16611b435760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610c17565b6001600160a01b0382166000908152600160209081526040808320338452909152902054611b7290829061362d565b6001600160a01b0383166000908152600160209081526040808320338452909152902055611ba082826124c5565b6001600160a01b0382166000818152600160209081526040808320338085529083529281902054905190815291929160008051602061371583398151915291015b60405180910390a35050565b60055461010090046001600160a01b03163314611c1c5760405162461bcd60e51b8152600401610c179061358c565b600b81905560405133906000805160206136d583398151915290610f05906020808252601d908201527f6368616e676520746f206d617820686f6c642070657263656e74616765000000604082015260600190565b60038054610c3790613644565b6005546000903390600160a81b900460ff1680611cad57506005546001600160a01b0382811661010090920416145b80611cc757503360009081526006602052604090205460ff165b611ce35760405162461bcd60e51b8152600401610c179061355f565b6001600160a01b038416611d095760405162461bcd60e51b8152600401610c1790613528565b3360009081526001602090815260408083206001600160a01b03881684529091529020546112b990849061362d565b60055461010090046001600160a01b03163314611d675760405162461bcd60e51b8152600401610c179061358c565b6001600160a01b038116611db65760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610c17565b600554611dd19061010090046001600160a01b03168261258a565b600580546001600160a01b03831661010002610100600160a81b031990911617905560405133906000805160206136d583398151915290610f05906020808252600d908201526c1bdddb995c8818da185b99d959609a1b604082015260600190565b6005546000903390600160a81b900460ff1680611e6257506005546001600160a01b0382811661010090920416145b80611e7c57503360009081526006602052604090205460ff165b611e985760405162461bcd60e51b8152600401610c179061355f565b611ea3338585612333565b5060019392505050565b60055461010090046001600160a01b03163314611edc5760405162461bcd60e51b8152600401610c179061358c565b600a81905560405133906000805160206136d583398151915290610f05906020808252601d908201527f6368616e676520746f206d61782073656c6c2070657263656e74616765000000604082015260600190565b60055461010090046001600160a01b03163314611f605760405162461bcd60e51b8152600401610c179061358c565b6001600160a01b03821660009081526008602052604090205460ff161580611f86575080155b611fde5760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b6064820152608401610c17565b6001600160a01b03821660009081526017602052604090819020805483151560ff199091161790555133906000805160206136d583398151915290610d96906020808252601c908201527f6368616e676520746f20746178206578636c7573696f6e206c69737400000000604082015260600190565b60055461010090046001600160a01b031633146120835760405162461bcd60e51b8152600401610c179061358c565b6009805482151560ff1990911617905560405133906000805160206136d583398151915290610f059060208082526019908201527f6368616e676520746f20736e6970657220626c6f636b696e6700000000000000604082015260600190565b6014546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de916004808301926020929190829003018186803b15801561147a57600080fd5b60055461010090046001600160a01b031633146121575760405162461bcd60e51b8152600401610c179061358c565b6016829055601581905560405133906000805160206136d583398151915290610d96906020808252601e908201527f6368616e676520746f206175746f2073776170207468726573686f6c64730000604082015260600190565b60055461010090046001600160a01b031633146121e05760405162461bcd60e51b8152600401610c179061358c565b600554479061135d9061010090046001600160a01b031682612598565b600554600090600160a81b900460ff161561222f576003600e5443612222919061362d565b101561222f57506126ac90565b50600090565b6001600160a01b0381166000908152601760205260409020805460ff1916600117905561135d815b6001600160a01b0381166000908152601360205260409020805460ff1916600117905561135d815b6001600160a01b0381166000908152601160205260409020805460ff1916600117905561135d815b60058054610100600160a81b0319166101006001600160a01b03938416810291909117918290559004166000908152600660205260409020805460ff19166001179055565b60055461010090046001600160a01b031633146123215760405162461bcd60e51b8152600401610c179061358c565b6123296126b6565b42600d5543600e55565b6001600160a01b0382166123825760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610c17565b6001600160a01b03831660009081526007602052604090205460ff1615806123c357506001600160a01b03821660009081526008602052604090205460ff16155b61240f5760405162461bcd60e51b815260206004820152601e60248201527f61646472657373206973206e6f7420616c6c6f77656420746f2073656c6c00006044820152606401610c17565b61241a838383612746565b6000612427848484612751565b6001600160a01b03851660009081526020819052604090205490915061244e90839061362d565b6001600160a01b03808616600090815260208190526040808220939093559085168152205461247e9082906135d4565b6001600160a01b038481166000818152602081815260409182902094909455518481529092918716916000805160206136f5833981519152910160405180910390a361142f565b6001600160a01b03821661251b5760405162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74206275726e2066726f6d206e756c6c20616464726573730000006044820152606401610c17565b80600254612529919061362d565b6002556001600160a01b03821660009081526020819052604090205461255090829061362d565b6001600160a01b03831660008181526020818152604080832094909455925184815290926000805160206136f58339815191529101611be1565b612594828261275e565b5050565b804710156125e85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c17565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612635576040519150601f19603f3d011682016040523d82523d6000602084013e61263a565b606091505b50509050806126b15760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c17565b505050565b60055461010090046001600160a01b031633146126e55760405162461bcd60e51b8152600401610c179061358c565b6005805460ff60a81b1916600160a81b17905560405133906000805160206136d58339815191529061273c9060208082526011908201527018dbdb9d1c9858dd081b185d5b98da1959607a1b604082015260600190565b60405180910390a2565b6126b183838361279e565b6000611ad18484846129ba565b6001600160a01b03808316600090815260176020526040808220805460ff1990811690915592841682529020805490911660011790556125948282612bfb565b60145460408051630dd8715760e01b815290516000926001600160a01b031691630dd87157916004808301926020929190829003018186803b1580156127e357600080fd5b505afa1580156127f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281b9190613441565b612825904261362d565b600554909150600160a81b900460ff16801561284a5750601454600160a01b900460ff165b801561286e57506001600160a01b03831660009081526008602052604090205460ff165b8015612888575042601854603c61288591906135d4565b11155b801561289657506015548110155b80156128be57506016546014546001600160a01b031660009081526020819052604090205410155b801561294d5750601460009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b815260040160206040518083038186803b15801561291357600080fd5b505afa158015612927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294b9190613381565b155b156129af57426018556014546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b15801561299c57600080fd5b505af19250505080156129ad575060015b505b61142f848484612c77565b6001600160a01b038316600090815260176020526040812054829060ff161580156129fe57506001600160a01b03841660009081526017602052604090205460ff16155b8015612a135750600554600160a81b900460ff165b15612b60576001600160a01b03851660009081526008602052604090205460ff1615612abe5760145460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc790602401602060405180830381600087803b158015612a7f57600080fd5b505af1158015612a93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab79190613441565b9050612b60565b6001600160a01b03841660009081526008602052604090205460ff1615612b6057601454604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd590602401602060405180830381600087803b158015612b2557600080fd5b505af1158015612b39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b5d9190613441565b90505b6000612b6c828561362d565b90508015612be6576014546001600160a01b0316600090815260208190526040902054612b9a9082906135d4565b601480546001600160a01b0390811660009081526020818152604091829020949094559154915184815291811692908916916000805160206136f5833981519152910160405180910390a35b612bf1868684613014565b9695505050505050565b6001600160a01b038281166000818152601360209081526040808320805460ff199081169091559486168084528184208054871660019081179091558585526011845282852080548816905581855282852080548816821790559484526006909252808320805486169055908252902080549092161790555050565b60095460ff161580612c9957503360009081526010602052604090205460ff16155b612cd75760405162461bcd60e51b815260206004820152600f60248201526e1cdb9a5c195c881c995a9958dd1959608a1b6044820152606401610c17565b600554600160a81b900460ff168015612d0357506005546001600160a01b038481166101009092041614155b8015612d2857506001600160a01b03831660009081526011602052604090205460ff16155b8015612d4d57506001600160a01b03821660009081526011602052604090205460ff16155b156126b157600c5415612dac57600c545a1115612dac5760405162461bcd60e51b815260206004820152601e60248201527f74686973206973206f76657220746865206d617820676173206c696d697400006044820152606401610c17565b6000600b54118015612dd757506001600160a01b03821660009081526008602052604090205460ff16155b15612e5657612de46118a1565b6001600160a01b038316600090815260208190526040902054612e089083906135d4565b1115612e565760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e746044820152606401610c17565b6000600a54118015612e8057506001600160a01b03821660009081526008602052604090205460ff165b15612edc57612e8d611ad9565b811115612edc5760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d61782073656c6c20616d6f756e746044820152606401610c17565b600954610100900460ff16156126b1576001600160a01b038216600090815260126020526040902054431415612f43576001600160a01b0382166000908152601060205260408120805460ff19166001179055600f805491612f3d8361367f565b91905055505b6001600160a01b038316600090815260126020526040902054431415612f9a576001600160a01b0383166000908152601060205260408120805460ff19166001179055600f805491612f948361367f565b91905055505b6001600160a01b03821660009081526008602052604090205460ff16612fd6576001600160a01b03821660009081526012602052604090204390555b6001600160a01b03831660009081526008602052604090205460ff166126b15750506001600160a01b03166000908152601260205260409020439055565b6005546000908290600160a81b900460ff16801561303a575060095462010000900460ff165b1561314a576005546001600160a01b038681166101009092041614801590613069575060006130676121fd565b115b801561308e57506001600160a01b03851660009081526011602052604090205460ff16155b80156130b357506001600160a01b03841660009081526011602052604090205460ff16155b1561314a5760006127106130c56121fd565b6130cf908661360e565b6130d991906135ec565b90506130e5818361362d565b9150801561314857306000908152602081905260409020546131089082906135d4565b3060008181526020818152604091829020939093555183815290916001600160a01b038916916000805160206136f5833981519152910160405180910390a35b505b61315585858361315e565b95945050505050565b6000826001600160a01b0316846001600160a01b031614156131c25760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610c17565b5092915050565b80356001600160a01b03811681146131e057600080fd5b919050565b600082601f8301126131f657600080fd5b813567ffffffffffffffff80821115613211576132116136b0565b604051601f8301601f19908116603f01168101908282118183101715613239576132396136b0565b8160405283815286602085880101111561325257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561328457600080fd5b61328d826131c9565b9392505050565b600080604083850312156132a757600080fd5b6132b0836131c9565b91506132be602084016131c9565b90509250929050565b6000806000606084860312156132dc57600080fd5b6132e5846131c9565b92506132f3602085016131c9565b9150604084013590509250925092565b6000806040838503121561331657600080fd5b61331f836131c9565b9150602083013561332f816136c6565b809150509250929050565b6000806040838503121561334d57600080fd5b613356836131c9565b946020939093013593505050565b60006020828403121561337657600080fd5b813561328d816136c6565b60006020828403121561339357600080fd5b815161328d816136c6565b600080604083850312156133b157600080fd5b823567ffffffffffffffff8111156133c857600080fd5b6133d4858286016131e5565b9250506132be602084016131c9565b600080604083850312156133f657600080fd5b823567ffffffffffffffff81111561340d57600080fd5b613419858286016131e5565b95602094909401359450505050565b60006020828403121561343a57600080fd5b5035919050565b60006020828403121561345357600080fd5b5051919050565b6000806040838503121561346d57600080fd5b50508035926020909101359150565b6000815180845260005b818110156134a257602081850181015186830182015201613486565b818111156134b4576000602083870101525b50601f01601f19169290920160200192915050565b60208152600061328d602083018461347c565b6040815260006134ef604083018561347c565b905060018060a01b03831660208301529392505050565b604081526000613519604083018561347c565b90508260208301529392505050565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b600082198211156135e7576135e761369a565b500190565b60008261360957634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156136285761362861369a565b500290565b60008282101561363f5761363f61369a565b500390565b600181811c9082168061365857607f821691505b6020821081141561367957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136935761369361369a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461135d57600080fdfed43eee071b91e7714b533dbf825ec024145ba03675691f363d9a4c47e88b4dc5ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212208ff54f95308b63bcfb6b41ca8bf851668aaec5ffe66993ade70bd4d034d5ace864736f6c634300080700336101406040523480156200001257600080fd5b50604051620032b2380380620032b28339810160408190526200003591620001b5565b6001600160a01b038316620000915760405162461bcd60e51b815260206004820152601f60248201527f706169726564546f6b656e2063616e6e6f74206265203020616464726573730060448201526064015b60405180910390fd5b6001600160a01b038416620000e95760405162461bcd60e51b815260206004820152601860248201527f706169722063616e6e6f74206265203020616464726573730000000000000000604482015260640162000088565b6001600160a01b038516620001415760405162461bcd60e51b815260206004820152601a60248201527f726f757465722063616e6e6f7420626520302061646472657373000000000000604482015260640162000088565b33606090811b60c0526001600160601b031993811b841660e052600080546001600160a01b0388166001600160a01b0319909116179055610100929092526101205291821b811660805291901b1660a05262000212565b80516001600160a01b0381168114620001b057600080fd5b919050565b600080600080600060a08688031215620001ce57600080fd5b620001d98662000198565b9450620001e96020870162000198565b9350620001f96040870162000198565b6060870151608090970151959894975095949392505050565b60805160601c60a05160601c60c05160601c60e05160601c6101005161012051612fb1620003016000396000818161032a01526105930152600081816102ad0152610cb00152600061114a01526000818161042401528181610618015281816107bc0152818161085c0152818161090601528181610a2d01528181610bea01528181610ce201528181610d8c01528181610f1a01528181611037015281816110f60152818161119601528181611a8701528181611d2501528181611e7201528181611fed015281816120b80152818161221001526123ad015260006101e1015260006103d70152612fb16000f3fe6080604052600436106101235760003560e01c8063a411209a116100a0578063db017dc711610064578063db017dc71461037d578063e4fc6b6d1461039d578063ed4ce99e146103a5578063ee16c160146103c5578063fb5a780c146103f957600080fd5b8063a411209a1461029b578063b0bc85de146102cf578063c5be2bc7146102e4578063c8e956ab14610318578063d83067861461034c57600080fd5b80633268cc56116100e75780633268cc56146101cf5780634fa26fd51461021b578063583dd79d1461023b5780636508c57e1461025b5780638d262cfe1461027b57600080fd5b806307a1cfbd1461012f5780630dd8715714610151578063135b4fc01461017a578063252d723a1461019a5780632b1fb89e146101af57600080fd5b3661012a57005b600080fd5b34801561013b57600080fd5b5061014f61014a366004612a5f565b610419565b005b34801561015d57600080fd5b5061016760015481565b6040519081526020015b60405180910390f35b34801561018657600080fd5b5061014f610195366004612b53565b61060d565b3480156101a657600080fd5b506101676107af565b3480156101bb57600080fd5b5061014f6101ca366004612b53565b610851565b3480156101db57600080fd5b506102037f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610171565b34801561022757600080fd5b50610167610236366004612bc9565b6108f9565b34801561024757600080fd5b5061014f610256366004612a11565b610a22565b34801561026757600080fd5b5061014f610276366004612a5f565b610bdf565b34801561028757600080fd5b5061014f610296366004612b53565b610cd7565b3480156102a757600080fd5b506101677f000000000000000000000000000000000000000000000000000000000000000081565b3480156102db57600080fd5b50610167610d7f565b3480156102f057600080fd5b506103046102ff366004612bc9565b610e1b565b604051610171989796959493929190612c45565b34801561032457600080fd5b506101677f000000000000000000000000000000000000000000000000000000000000000081565b34801561035857600080fd5b5060005461036d90600160a01b900460ff1681565b6040519015158152602001610171565b34801561038957600080fd5b50610167610398366004612bc9565b610f0d565b61014f61102c565b3480156103b157600080fd5b5061014f6103c0366004612af2565b612205565b3480156103d157600080fd5b506102037f000000000000000000000000000000000000000000000000000000000000000081565b34801561040557600080fd5b5061014f610414366004612aa4565b6123a2565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461046a5760405162461bcd60e51b815260040161046190612d52565b60405180910390fd5b6000805b6002548110156105735761052e6002828154811061048e5761048e612f3e565b906000526020600020906007020160000180546104aa90612ebc565b80601f01602080910402602001604051908101604052809291908181526020018280546104d690612ebc565b80156105235780601f106104f857610100808354040283529160200191610523565b820191906000526020600020905b81548152906001019060200180831161050657829003601f168201915b505050505085612531565b1561056157826002828154811061054757610547612f3e565b906000526020600020906007020160010181905550600191505b8061056b81612ef7565b91505061046e565b50806105915760405162461bcd60e51b815260040161046190612d1b565b7f00000000000000000000000000000000000000000000000000000000000000006105ba6107af565b11156106085760405162461bcd60e51b815260206004820152601b60248201527f7461782063616e6e6f74206265207365742074686973206869676800000000006044820152606401610461565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106555760405162461bcd60e51b815260040161046190612d52565b61065e8561258b565b1561067b5760405162461bcd60e51b815260040161046190612ce4565b600260405180610100016040528087815260200186815260200185815260200160008152602001600360048111156106b5576106b5612f28565b81526001600160a01b038516602080830191909152600060408301819052851515606090930192909252835460018101855593825290819020825180519394600702909101926107089284920190612827565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083600481111561075157610751612f28565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff19169115159190911790555050505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107f95760405162461bcd60e51b815260040161046190612d52565b6000805b60025481101561084b576002818154811061081a5761081a612f3e565b906000526020600020906007020160010154826108379190612e1c565b91508061084381612ef7565b9150506107fd565b50905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108995760405162461bcd60e51b815260040161046190612d52565b6108a28561258b565b156108bf5760405162461bcd60e51b815260040161046190612ce4565b600260405180610100016040528087815260200186815260200185815260200160008152602001600160048111156106b5576106b5612f28565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109435760405162461bcd60e51b815260040161046190612d52565b60005b600254811015610a185760006002828154811061096557610965612f3e565b9060005260206000209060070201600201541115610a065760006127106002838154811061099557610995612f3e565b906000526020600020906007020160020154856109b29190612e56565b6109bc9190612e34565b905080600283815481106109d2576109d2612f3e565b906000526020600020906007020160030160008282546109f29190612e1c565b90915550610a0290508185612e75565b9350505b80610a1081612ef7565b915050610946565b508190505b919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a6a5760405162461bcd60e51b815260040161046190612d52565b6000805b600254811015610bc157600060028281548110610a8d57610a8d612f3e565b60009182526020909120600460079092020181015460ff1690811115610ab557610ab5612f28565b1480610afa57506002808281548110610ad057610ad0612f3e565b60009182526020909120600460079092020181015460ff1690811115610af857610af8612f28565b145b80610b3f5750600360028281548110610b1557610b15612f3e565b60009182526020909120600460079092020181015460ff1690811115610b3d57610b3d612f28565b145b8015610b5c5750610b5c6002828154811061048e5761048e612f3e565b15610baf578260028281548110610b7557610b75612f3e565b906000526020600020906007020160040160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550600191505b80610bb981612ef7565b915050610a6e565b50806106085760405162461bcd60e51b815260040161046190612d1b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c275760405162461bcd60e51b815260040161046190612d52565b6000805b600254811015610c9057610c4b6002828154811061048e5761048e612f3e565b15610c7e578260028281548110610c6457610c64612f3e565b906000526020600020906007020160020181905550600191505b80610c8881612ef7565b915050610c2b565b5080610cae5760405162461bcd60e51b815260040161046190612d1b565b7f00000000000000000000000000000000000000000000000000000000000000006105ba610d7f565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d1f5760405162461bcd60e51b815260040161046190612d52565b610d288561258b565b15610d455760405162461bcd60e51b815260040161046190612ce4565b600260405180610100016040528087815260200186815260200185815260200160008152602001600060048111156106b5576106b5612f28565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610dc95760405162461bcd60e51b815260040161046190612d52565b6000805b60025481101561084b5760028181548110610dea57610dea612f3e565b90600052602060002090600702016002015482610e079190612e1c565b915080610e1381612ef7565b915050610dcd565b60028181548110610e2b57600080fd5b9060005260206000209060070201600091509050806000018054610e4e90612ebc565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7a90612ebc565b8015610ec75780601f10610e9c57610100808354040283529160200191610ec7565b820191906000526020600020905b815481529060010190602001808311610eaa57829003601f168201915b505050506001830154600284015460038501546004860154600587015460069097015495969395929450909260ff808316936101009093046001600160a01b0316921688565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f575760405162461bcd60e51b815260040161046190612d52565b60005b600254811015610a1857600060028281548110610f7957610f79612f3e565b906000526020600020906007020160010154111561101a57600061271060028381548110610fa957610fa9612f3e565b90600052602060002090600702016001015485610fc69190612e56565b610fd09190612e34565b90508060028381548110610fe657610fe6612f3e565b906000526020600020906007020160030160008282546110069190612e1c565b9091555061101690508185612e75565b9350505b8061102481612ef7565b915050610f5a565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110745760405162461bcd60e51b815260040161046190612d52565b600054600160a01b900460ff16156110c15760405162461bcd60e51b815260206004820152601060248201526f616c7265616479207377617070696e6760801b6044820152606401610461565b6000805460ff60a01b1916600160a01b17815560408051600280825260608201835290916020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061112857611128612f3e565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061117c5761117c612f3e565b6001600160a01b03909216602092830291909101909101527f00000000000000000000000000000000000000000000000000000000000000006000805b6002548110156112ef5760028082815481106111d7576111d7612f3e565b60009182526020909120600460079092020181015460ff16908111156111ff576111ff612f28565b141561127b576000600280838154811061121b5761121b612f3e565b9060005260206000209060070201600301546112379190612e34565b9050806002838154811061124d5761124d612f3e565b9060005260206000209060070201600301546112699190612e75565b6112739084612e1c565b9250506112dd565b6002818154811061128e5761128e612f3e565b600091825260209091206006600790920201015460ff16156112dd57600281815481106112bd576112bd612f3e565b906000526020600020906007020160030154826112da9190612e1c565b91505b806112e781612ef7565b9150506111b9565b506112fa8282612678565b60008054919250906001600160a01b03166318cbafe5838387306113204261012c612e1c565b6040518663ffffffff1660e01b8152600401611340959493929190612d7a565b600060405180830381600087803b15801561135a57600080fd5b505af115801561136e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113969190810190612947565b90506000479050816000815181106113b0576113b0612f3e565b6020026020010151831415806113e05750816001815181106113d4576113d4612f3e565b60200260200101518114155b1561145b577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d16040516114529060208082526025908201527f556e657870656374656420616d6f756e74732072657475726e65642066726f6d604082015264020737761760dc1b606082015260800190565b60405180910390a15b8060005b6002548110156116a1576002818154811061147c5761147c612f3e565b600091825260209091206006600790920201015460ff16806114d7575060028082815481106114ad576114ad612f3e565b60009182526020909120600460079092020181015460ff16908111156114d5576114d5612f28565b145b1561168f576002546114eb90600190612e75565b81141561152057816002828154811061150657611506612f3e565b90600052602060002090600702016005018190555061168f565b600280828154811061153457611534612f3e565b60009182526020909120600460079092020181015460ff169081111561155c5761155c612f28565b141561161a576000600280838154811061157857611578612f3e565b9060005260206000209060070201600301546115949190612e34565b905060008682600285815481106115ad576115ad612f3e565b9060005260206000209060070201600301546115c99190612e75565b6115d39087612e56565b6115dd9190612e34565b905080600284815481106115f3576115f3612f3e565b60009182526020909120600560079092020101556116118185612e75565b9350505061168f565b6000856002838154811061163057611630612f3e565b9060005260206000209060070201600301548561164d9190612e56565b6116579190612e34565b9050806002838154811061166d5761166d612f3e565b600091825260209091206005600790920201015561168b8184612e75565b9250505b8061169981612ef7565b91505061145f565b5060005b600254811015611fe1576000600282815481106116c4576116c4612f3e565b60009182526020909120600460079092020181015460ff16908111156116ec576116ec612f28565b14156118ca576002818154811061170557611705612f3e565b600091825260209091206006600790920201015460ff161561178b576117866002828154811061173757611737612f3e565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166002838154811061176f5761176f612f3e565b90600052602060002090600702016005015461270e565b611f7c565b856001600160a01b031663a9059cbb600283815481106117ad576117ad612f3e565b906000526020600020906007020160040160019054906101000a90046001600160a01b031661180089600286815481106117e9576117e9612f3e565b906000526020600020906007020160030154612678565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561184657600080fd5b505af115801561185a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187e91906129f4565b6117865760405162461bcd60e51b815260206004820152601960248201527f636f756c64206e6f74207472616e7366657220746f6b656e73000000000000006044820152606401610461565b6003600282815481106118df576118df612f3e565b60009182526020909120600460079092020181015460ff169081111561190757611907612f28565b1415611b2b576002818154811061192057611920612f3e565b600091825260209091206006600790920201015460ff1615611952576117866002828154811061173757611737612f3e565b856001600160a01b031663095ea7b36002838154811061197457611974612f3e565b906000526020600020906007020160040160019054906101000a90046001600160a01b0316600284815481106119ac576119ac612f3e565b60009182526020909120600360079092020101546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015611a0657600080fd5b505af1158015611a1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3e91906129f4565b5060028181548110611a5257611a52612f3e565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b0316634ec109f47f000000000000000000000000000000000000000000000000000000000000000030611abe8a600287815481106117e9576117e9612f3e565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015b600060405180830381600087803b158015611b0e57600080fd5b505af1158015611b22573d6000803e3d6000fd5b50505050611f7c565b600160028281548110611b4057611b40612f3e565b60009182526020909120600460079092020181015460ff1690811115611b6857611b68612f28565b1415611ce05760028181548110611b8157611b81612f3e565b600091825260209091206006600790920201015460ff1615611c515760028181548110611bb057611bb0612f3e565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663db6b524660028381548110611bf657611bf6612f3e565b9060005260206000209060070201600501546040518263ffffffff1660e01b81526004016000604051808303818588803b158015611c3357600080fd5b505af1158015611c47573d6000803e3d6000fd5b5050505050611f7c565b60028181548110611c6457611c64612f3e565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663338b5dea30611caf89600286815481106117e9576117e9612f3e565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611af4565b600460028281548110611cf557611cf5612f3e565b60009182526020909120600460079092020181015460ff1690811115611d1d57611d1d612f28565b1415611d87577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342966c68611d6988600285815481106117e9576117e9612f3e565b6040518263ffffffff1660e01b8152600401611af491815260200190565b6002808281548110611d9b57611d9b612f3e565b60009182526020909120600460079092020181015460ff1690811115611dc357611dc3612f28565b1415611f7c57600060028281548110611dde57611dde612f3e565b9060005260206000209060070201600501541115611f7c576000611e31876002808581548110611e1057611e10612f3e565b906000526020600020906007020160030154611e2c9190612e34565b612678565b600054600280549293506001600160a01b039091169163f305d719919085908110611e5e57611e5e612f3e565b9060005260206000209060070201600501547f00000000000000000000000000000000000000000000000000000000000000008460008060028981548110611ea857611ea8612f3e565b600091825260209091206007909102016004015461010090046001600160a01b0316611ed64261012c612e1c565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c4016060604051808303818588803b158015611f3e57600080fd5b505af1158015611f52573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f779190612bfb565b505050505b600060028281548110611f9157611f91612f3e565b906000526020600020906007020160030181905550600060028281548110611fbb57611fbb612f3e565b600091825260209091206005600790920201015580611fd981612ef7565b9150506116a5565b504715612012576120127f00000000000000000000000000000000000000000000000000000000000000004761270e565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a082319060240160206040518083038186803b15801561205457600080fd5b505afa158015612068573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208c9190612be2565b11156121b3576040516370a0823160e01b81523060048201526001600160a01b0386169063a9059cbb907f00000000000000000000000000000000000000000000000000000000000000009083906370a082319060240160206040518083038186803b1580156120fb57600080fd5b505afa15801561210f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121339190612be2565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561217957600080fd5b505af115801561218d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b191906129f4565b505b60408051858152602081018490527f5e20c9aee521e656eed033c4ae35378c79c584706f5ce7f410ab3fba389607a1910160405180910390a150504260015550506000805460ff60a01b191690555050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461224d5760405162461bcd60e51b815260040161046190612d52565b6122568461258b565b156122735760405162461bcd60e51b815260040161046190612ce4565b600260405180610100016040528086815260200185815260200184815260200160008152602001600260048111156122ad576122ad612f28565b81526001600160a01b0384166020808301919091526000604083018190526060909201829052835460018101855593825290819020825180519394600702909101926122fc9284920190612827565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083600481111561234557612345612f28565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff191691151591909117905550505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146123ea5760405162461bcd60e51b815260040161046190612d52565b6123f38361258b565b156124105760405162461bcd60e51b815260040161046190612ce4565b60026040518061010001604052808581526020018481526020018381526020016000815260200160048081111561244957612449612f28565b81526000602080830182905260408301829052606090920181905283546001810185559381528190208251805193946007029091019261248c9284920190612827565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908360048111156124d5576124d5612f28565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff1916911515919091179055505050565b6000816040516020016125449190612c29565b604051602081830303815290604052805190602001208360405160200161256b9190612c29565b604051602081830303815290604052805190602001201490505b92915050565b6000805b60025481101561266f5761264f600282815481106125af576125af612f3e565b906000526020600020906007020160000180546125cb90612ebc565b80601f01602080910402602001604051908101604052809291908181526020018280546125f790612ebc565b80156126445780601f1061261957610100808354040283529160200191612644565b820191906000526020600020905b81548152906001019060200180831161262757829003601f168201915b505050505084612531565b1561265d5750600192915050565b8061266781612ef7565b91505061258f565b50600092915050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038516906370a082319060240160206040518083038186803b1580156126bc57600080fd5b505afa1580156126d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f49190612be2565b9050828111156127075782915050612585565b9392505050565b8047101561275e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610461565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146127ab576040519150601f19603f3d011682016040523d82523d6000602084013e6127b0565b606091505b50509050806106085760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610461565b82805461283390612ebc565b90600052602060002090601f016020900481019282612855576000855561289b565b82601f1061286e57805160ff191683800117855561289b565b8280016001018555821561289b579182015b8281111561289b578251825591602001919060010190612880565b506128a79291506128ab565b5090565b5b808211156128a757600081556001016128ac565b80356001600160a01b0381168114610a1d57600080fd5b600082601f8301126128e857600080fd5b813567ffffffffffffffff81111561290257612902612f54565b612915601f8201601f1916602001612deb565b81815284602083860101111561292a57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561295a57600080fd5b825167ffffffffffffffff8082111561297257600080fd5b818501915085601f83011261298657600080fd5b81518181111561299857612998612f54565b8060051b91506129a9848301612deb565b8181528481019084860184860187018a10156129c457600080fd5b600095505b838610156129e75780518352600195909501949186019186016129c9565b5098975050505050505050565b600060208284031215612a0657600080fd5b815161270781612f6a565b60008060408385031215612a2457600080fd5b823567ffffffffffffffff811115612a3b57600080fd5b612a47858286016128d7565b925050612a56602084016128c0565b90509250929050565b60008060408385031215612a7257600080fd5b823567ffffffffffffffff811115612a8957600080fd5b612a95858286016128d7565b95602094909401359450505050565b600080600060608486031215612ab957600080fd5b833567ffffffffffffffff811115612ad057600080fd5b612adc868287016128d7565b9660208601359650604090950135949350505050565b60008060008060808587031215612b0857600080fd5b843567ffffffffffffffff811115612b1f57600080fd5b612b2b878288016128d7565b9450506020850135925060408501359150612b48606086016128c0565b905092959194509250565b600080600080600060a08688031215612b6b57600080fd5b853567ffffffffffffffff811115612b8257600080fd5b612b8e888289016128d7565b9550506020860135935060408601359250612bab606087016128c0565b91506080860135612bbb81612f6a565b809150509295509295909350565b600060208284031215612bdb57600080fd5b5035919050565b600060208284031215612bf457600080fd5b5051919050565b600080600060608486031215612c1057600080fd5b8351925060208401519150604084015190509250925092565b60008251612c3b818460208701612e8c565b9190910192915050565b60006101008083528a5180828501526101209150612c698183860160208f01612e8c565b602084018b9052604084018a905260608401899052601f01601f1916830101905060058610612ca857634e487b7160e01b600052602160045260246000fd5b856080830152612cc360a08301866001600160a01b03169052565b8360c0830152612cd760e083018415159052565b9998505050505050505050565b60208082526017908201527f546869732074617820616c726561647920657869737473000000000000000000604082015260600190565b6020808252601c908201527f636f756c64206e6f742066696e642074617820746f2075706461746500000000604082015260600190565b6020808252600e908201526d6e6f207065726d697373696f6e7360901b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612dca5784516001600160a01b031683529383019391830191600101612da5565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715612e1457612e14612f54565b604052919050565b60008219821115612e2f57612e2f612f12565b500190565b600082612e5157634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612e7057612e70612f12565b500290565b600082821015612e8757612e87612f12565b500390565b60005b83811015612ea7578181015183820152602001612e8f565b83811115612eb6576000848401525b50505050565b600181811c90821680612ed057607f821691505b60208210811415612ef157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612f0b57612f0b612f12565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114612f7857600080fd5b5056fea26469706673582212207b879f4c5c1e6b48e23d43772037ccaf290458485917adac09c58e8c4e9ad81d64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106103bc5760003560e01c80636b8f2f3b116101f2578063c2ed286b1161010d578063dba61c58116100a0578063e948474b1161006f578063e948474b14610b69578063ede49a1914610b99578063f19fffcb14610bb3578063f1f5cd9114610bd357600080fd5b8063dba61c5814610ae2578063dd62ed3e14610af8578063e53be8d114610b3e578063e79d416014610b5357600080fd5b8063d00efb2f116100dc578063d00efb2f14610a69578063d2d7ad8314610a7f578063d31acb2814610a95578063db38a41d14610ab557600080fd5b8063c2ed286b146109fe578063c4a5abcd14610a1e578063c552f4c514610a34578063cc1776d314610a5457600080fd5b80638da5cb5b11610185578063a6f9dae111610154578063a6f9dae11461096e578063a9059cbb1461098e578063b0ad3ebf146109ae578063c20c5caf146109de57600080fd5b80638da5cb5b146108e457806395d89b4114610909578063989763ef1461091e578063a457c2d71461094e57600080fd5b8063790ca413116101c1578063790ca4131461086d57806379cc6790146108835780638091f3bf146108a357806381045345146108c457600080fd5b80636b8f2f3b146107d15780636f864552146107f257806370a08231146108075780637412dbb31461083d57600080fd5b806339509351116102e25780635543379a116102755780635e45da23116102445780635e45da23146107665780636331bf651461077c5780636508c57e146107915780636a092e79146107b157600080fd5b80635543379a146106e6578063583dd79d146107065780635d90bbaf146107265780635d9d7d431461074657600080fd5b80634f7041a5116102b15780634f7041a5146106725780634f72e2a2146106875780634fbc2775146106a757806352c6dbc4146106c757600080fd5b8063395093511461060757806342966c6814610627578063442ef7d21461064757806345541cba1461065c57600080fd5b8063185511081161035a5780632b750627116103295780632b7506271461055b578063313ce5671461058b5780633164df8b146105b757806336827499146105e757600080fd5b806318551108146104c95780631e19ae77146104fb57806323b872dd1461051b57806328be90381461053b57600080fd5b8063095ea7b311610396578063095ea7b31461042a5780630f3a325f1461045a5780631776834a1461048a57806318160ddd146104aa57600080fd5b806301339c21146103c857806306fdde03146103df57806307a1cfbd1461040a57600080fd5b366103c357005b600080fd5b3480156103d457600080fd5b506103dd610be8565b005b3480156103eb57600080fd5b506103f4610c2a565b60405161040191906134c9565b60405180910390f35b34801561041657600080fd5b506103dd6104253660046133e3565b610cb8565b34801561043657600080fd5b5061044a61044536600461333a565b610da2565b6040519015158152602001610401565b34801561046657600080fd5b5061044a610475366004613272565b60106020526000908152604090205460ff1681565b34801561049657600080fd5b506103dd6104a5366004613428565b610e81565b3480156104b657600080fd5b506002545b604051908152602001610401565b3480156104d557600080fd5b506014546001600160a01b03165b6040516001600160a01b039091168152602001610401565b34801561050757600080fd5b506103dd610516366004613303565b610f10565b34801561052757600080fd5b5061044a6105363660046132c7565b610fae565b34801561054757600080fd5b506103dd610556366004613303565b6110c4565b34801561056757600080fd5b5061044a610576366004613272565b60116020526000908152604090205460ff1681565b34801561059757600080fd5b506005546105a59060ff1681565b60405160ff9091168152602001610401565b3480156105c357600080fd5b5061044a6105d2366004613272565b60136020526000908152604090205460ff1681565b3480156105f357600080fd5b506103dd610602366004613364565b611169565b34801561061357600080fd5b5061044a61062236600461333a565b6111ff565b34801561063357600080fd5b506103dd610642366004613428565b6112fe565b34801561065357600080fd5b506103dd611360565b34801561066857600080fd5b506104bb600a5481565b34801561067e57600080fd5b506104bb611435565b34801561069357600080fd5b506103dd6106a2366004613364565b6114b7565b3480156106b357600080fd5b506103dd6106c2366004613303565b611545565b3480156106d357600080fd5b5060095461044a90610100900460ff1681565b3480156106f257600080fd5b506103dd610701366004613364565b6115ea565b34801561071257600080fd5b506103dd61072136600461339e565b61167e565b34801561073257600080fd5b506103dd610741366004613303565b61175f565b34801561075257600080fd5b506103dd610761366004613303565b6117fc565b34801561077257600080fd5b506104bb600c5481565b34801561078857600080fd5b506104bb6118a1565b34801561079d57600080fd5b506103dd6107ac3660046133e3565b6118c0565b3480156107bd57600080fd5b5061044a6107cc366004613294565b61199f565b3480156107dd57600080fd5b5060145461044a90600160a01b900460ff1681565b3480156107fe57600080fd5b506104bb611ad9565b34801561081357600080fd5b506104bb610822366004613272565b6001600160a01b031660009081526020819052604090205490565b34801561084957600080fd5b5061044a610858366004613272565b60086020526000908152604090205460ff1681565b34801561087957600080fd5b506104bb600d5481565b34801561088f57600080fd5b506103dd61089e36600461333a565b611aee565b3480156108af57600080fd5b5060055461044a90600160a81b900460ff1681565b3480156108d057600080fd5b506103dd6108df366004613428565b611bed565b3480156108f057600080fd5b506005546104e39061010090046001600160a01b031681565b34801561091557600080fd5b506103f4611c71565b34801561092a57600080fd5b5061044a610939366004613272565b60176020526000908152604090205460ff1681565b34801561095a57600080fd5b5061044a61096936600461333a565b611c7e565b34801561097a57600080fd5b506103dd610989366004613272565b611d38565b34801561099a57600080fd5b5061044a6109a936600461333a565b611e33565b3480156109ba57600080fd5b5061044a6109c9366004613272565b60066020526000908152604090205460ff1681565b3480156109ea57600080fd5b506103dd6109f9366004613428565b611ead565b348015610a0a57600080fd5b506103dd610a19366004613303565b611f31565b348015610a2a57600080fd5b506104bb600b5481565b348015610a4057600080fd5b506103dd610a4f366004613364565b612054565b348015610a6057600080fd5b506104bb6120e3565b348015610a7557600080fd5b506104bb600e5481565b348015610a8b57600080fd5b506104bb60165481565b348015610aa157600080fd5b506103dd610ab036600461345a565b612128565b348015610ac157600080fd5b506104bb610ad0366004613272565b60126020526000908152604090205481565b348015610aee57600080fd5b506104bb60155481565b348015610b0457600080fd5b506104bb610b13366004613294565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b4a57600080fd5b506103dd6121b1565b348015610b5f57600080fd5b506104bb600f5481565b348015610b7557600080fd5b5061044a610b84366004613272565b60076020526000908152604090205460ff1681565b348015610ba557600080fd5b5060095461044a9060ff1681565b348015610bbf57600080fd5b5060095461044a9062010000900460ff1681565b348015610bdf57600080fd5b506104bb6121fd565b60055461010090046001600160a01b03163314610c205760405162461bcd60e51b8152600401610c179061358c565b60405180910390fd5b610c286122f2565b565b60048054610c3790613644565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6390613644565b8015610cb05780601f10610c8557610100808354040283529160200191610cb0565b820191906000526020600020905b815481529060010190602001808311610c9357829003601f168201915b505050505081565b60055461010090046001600160a01b03163314610ce75760405162461bcd60e51b8152600401610c179061358c565b6014546040516307a1cfbd60e01b81526001600160a01b03909116906307a1cfbd90610d199085908590600401613506565b600060405180830381600087803b158015610d3357600080fd5b505af1158015610d47573d6000803e3d6000fd5b50505050336001600160a01b03166000805160206136d5833981519152604051610d96906020808252601190820152700c6d0c2dcceca40e8de40c4eaf240e8c2f607b1b604082015260600190565b60405180910390a25050565b6005546000903390600160a81b900460ff1680610dd157506005546001600160a01b0382811661010090920416145b80610deb57503360009081526006602052604090205460ff165b610e075760405162461bcd60e51b8152600401610c179061355f565b6001600160a01b038416610e2d5760405162461bcd60e51b8152600401610c1790613528565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208790555186815291929160008051602061371583398151915291015b60405180910390a35060019392505050565b60055461010090046001600160a01b03163314610eb05760405162461bcd60e51b8152600401610c179061358c565b600c81905560405133906000805160206136d583398151915290610f059060208082526017908201527f6368616e676520746f206d617820676173206c696d6974000000000000000000604082015260600190565b60405180910390a250565b60055461010090046001600160a01b03163314610f3f5760405162461bcd60e51b8152600401610c179061358c565b6001600160a01b03821660009081526013602052604090819020805483151560ff199091161790555133906000805160206136d583398151915290610d969060208082526016908201527518da185b99d9481d1bc8189d5c9b995c9cc81b1a5cdd60521b604082015260600190565b6005546000908490600160a81b900460ff1680610fdd57506005546001600160a01b0382811661010090920416145b80610ff757503360009081526006602052604090205460ff165b6110135760405162461bcd60e51b8152600401610c179061355f565b6001600160a01b038516600090815260016020908152604080832033845290915290205461104290849061362d565b6001600160a01b0386166000908152600160209081526040808320338452909152902055611071858585612333565b6001600160a01b03851660008181526001602090815260408083203380855290835292819020549051908152919291600080516020613715833981519152910160405180910390a3506001949350505050565b60055461010090046001600160a01b031633146110f35760405162461bcd60e51b8152600401610c179061358c565b6001600160a01b03821660009081526008602052604090819020805483151560ff199091161790555133906000805160206136d583398151915290610d969060208082526017908201527f6368616e676520746f2065786368616e6765206c697374000000000000000000604082015260600190565b60055461010090046001600160a01b031633146111985760405162461bcd60e51b8152600401610c179061358c565b60098054821515620100000262ff00001990911617905560405133906000805160206136d583398151915290610f05906020808252601b908201527f6368616e676520746f20686967682074617820636f756e7464776e0000000000604082015260600190565b6005546000903390600160a81b900460ff168061122e57506005546001600160a01b0382811661010090920416145b8061124857503360009081526006602052604090205460ff165b6112645760405162461bcd60e51b8152600401610c179061355f565b6001600160a01b03841661128a5760405162461bcd60e51b8152600401610c1790613528565b3360009081526001602090815260408083206001600160a01b03881684529091529020546112b99084906135d4565b3360008181526001602090815260408083206001600160a01b038a16808552908352928190208590555193845290926000805160206137158339815191529101610e6f565b3360009081526013602052604090205460ff166113535760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610c17565b61135d33826124c5565b50565b600554600160a81b900460ff166113cb5760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b6064820152608401610c17565b601460009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561141b57600080fd5b505af115801561142f573d6000803e3d6000fd5b50505050565b60145460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a916004808301926020929190829003018186803b15801561147a57600080fd5b505afa15801561148e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b29190613441565b905090565b60055461010090046001600160a01b031633146114e65760405162461bcd60e51b8152600401610c179061358c565b60148054821515600160a01b0260ff60a01b1990911617905560405133906000805160206136d583398151915290610f059060208082526013908201527206368616e676520746f206175746f207377617606c1b604082015260600190565b60055461010090046001600160a01b031633146115745760405162461bcd60e51b8152600401610c179061358c565b6001600160a01b03821660009081526006602052604090819020805483151560ff199091161790555133906000805160206136d583398151915290610d96906020808252601f908201527f6368616e676520746f2063616e20616c77617973207472616465206c69737400604082015260600190565b60055461010090046001600160a01b031633146116195760405162461bcd60e51b8152600401610c179061358c565b600980548215156101000261ff001990911617905560405133906000805160206136d583398151915290610f05906020808252601e908201527f6368616e676520746f20626c6f636b206c6f672070726f74656374696f6e0000604082015260600190565b60055461010090046001600160a01b031633146116ad5760405162461bcd60e51b8152600401610c179061358c565b60145460405163583dd79d60e01b81526001600160a01b039091169063583dd79d906116df90859085906004016134dc565b600060405180830381600087803b1580156116f957600080fd5b505af115801561170d573d6000803e3d6000fd5b50505050336001600160a01b03166000805160206136d5833981519152604051610d969060208082526014908201527318da185b99d9481d1bc81d185e081dd85b1b195d60621b604082015260600190565b60055461010090046001600160a01b0316331461178e5760405162461bcd60e51b8152600401610c179061358c565b6001600160a01b03821660009081526010602052604090819020805483151560ff199091161790555133906000805160206136d583398151915290610d969060208082526015908201527418da185b99d9481d1bc81cdb9a5c195c881b1a5cdd605a1b604082015260600190565b60055461010090046001600160a01b0316331461182b5760405162461bcd60e51b8152600401610c179061358c565b6001600160a01b03821660009081526011602052604090819020805483151560ff199091161790555133906000805160206136d583398151915290610d96906020808252601b908201527f6368616e676520746f206e6576657220736e69706572206c6973740000000000604082015260600190565b6000612710600b546002546118b6919061360e565b6114b291906135ec565b60055461010090046001600160a01b031633146118ef5760405162461bcd60e51b8152600401610c179061358c565b60145460405163328462bf60e11b81526001600160a01b0390911690636508c57e906119219085908590600401613506565b600060405180830381600087803b15801561193b57600080fd5b505af115801561194f573d6000803e3d6000fd5b50505050336001600160a01b03166000805160206136d5833981519152604051610d96906020808252601290820152710c6d0c2dcceca40e8de40e6cad8d840e8c2f60731b604082015260600190565b60055460009061010090046001600160a01b031633146119d15760405162461bcd60e51b8152600401610c179061358c565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b158015611a1357600080fd5b505afa158015611a27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4b9190613441565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb90604401602060405180830381600087803b158015611a9957600080fd5b505af1158015611aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad19190613381565b949350505050565b6000612710600a546002546118b6919061360e565b3360009081526013602052604090205460ff16611b435760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610c17565b6001600160a01b0382166000908152600160209081526040808320338452909152902054611b7290829061362d565b6001600160a01b0383166000908152600160209081526040808320338452909152902055611ba082826124c5565b6001600160a01b0382166000818152600160209081526040808320338085529083529281902054905190815291929160008051602061371583398151915291015b60405180910390a35050565b60055461010090046001600160a01b03163314611c1c5760405162461bcd60e51b8152600401610c179061358c565b600b81905560405133906000805160206136d583398151915290610f05906020808252601d908201527f6368616e676520746f206d617820686f6c642070657263656e74616765000000604082015260600190565b60038054610c3790613644565b6005546000903390600160a81b900460ff1680611cad57506005546001600160a01b0382811661010090920416145b80611cc757503360009081526006602052604090205460ff165b611ce35760405162461bcd60e51b8152600401610c179061355f565b6001600160a01b038416611d095760405162461bcd60e51b8152600401610c1790613528565b3360009081526001602090815260408083206001600160a01b03881684529091529020546112b990849061362d565b60055461010090046001600160a01b03163314611d675760405162461bcd60e51b8152600401610c179061358c565b6001600160a01b038116611db65760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610c17565b600554611dd19061010090046001600160a01b03168261258a565b600580546001600160a01b03831661010002610100600160a81b031990911617905560405133906000805160206136d583398151915290610f05906020808252600d908201526c1bdddb995c8818da185b99d959609a1b604082015260600190565b6005546000903390600160a81b900460ff1680611e6257506005546001600160a01b0382811661010090920416145b80611e7c57503360009081526006602052604090205460ff165b611e985760405162461bcd60e51b8152600401610c179061355f565b611ea3338585612333565b5060019392505050565b60055461010090046001600160a01b03163314611edc5760405162461bcd60e51b8152600401610c179061358c565b600a81905560405133906000805160206136d583398151915290610f05906020808252601d908201527f6368616e676520746f206d61782073656c6c2070657263656e74616765000000604082015260600190565b60055461010090046001600160a01b03163314611f605760405162461bcd60e51b8152600401610c179061358c565b6001600160a01b03821660009081526008602052604090205460ff161580611f86575080155b611fde5760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b6064820152608401610c17565b6001600160a01b03821660009081526017602052604090819020805483151560ff199091161790555133906000805160206136d583398151915290610d96906020808252601c908201527f6368616e676520746f20746178206578636c7573696f6e206c69737400000000604082015260600190565b60055461010090046001600160a01b031633146120835760405162461bcd60e51b8152600401610c179061358c565b6009805482151560ff1990911617905560405133906000805160206136d583398151915290610f059060208082526019908201527f6368616e676520746f20736e6970657220626c6f636b696e6700000000000000604082015260600190565b6014546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de916004808301926020929190829003018186803b15801561147a57600080fd5b60055461010090046001600160a01b031633146121575760405162461bcd60e51b8152600401610c179061358c565b6016829055601581905560405133906000805160206136d583398151915290610d96906020808252601e908201527f6368616e676520746f206175746f2073776170207468726573686f6c64730000604082015260600190565b60055461010090046001600160a01b031633146121e05760405162461bcd60e51b8152600401610c179061358c565b600554479061135d9061010090046001600160a01b031682612598565b600554600090600160a81b900460ff161561222f576003600e5443612222919061362d565b101561222f57506126ac90565b50600090565b6001600160a01b0381166000908152601760205260409020805460ff1916600117905561135d815b6001600160a01b0381166000908152601360205260409020805460ff1916600117905561135d815b6001600160a01b0381166000908152601160205260409020805460ff1916600117905561135d815b60058054610100600160a81b0319166101006001600160a01b03938416810291909117918290559004166000908152600660205260409020805460ff19166001179055565b60055461010090046001600160a01b031633146123215760405162461bcd60e51b8152600401610c179061358c565b6123296126b6565b42600d5543600e55565b6001600160a01b0382166123825760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610c17565b6001600160a01b03831660009081526007602052604090205460ff1615806123c357506001600160a01b03821660009081526008602052604090205460ff16155b61240f5760405162461bcd60e51b815260206004820152601e60248201527f61646472657373206973206e6f7420616c6c6f77656420746f2073656c6c00006044820152606401610c17565b61241a838383612746565b6000612427848484612751565b6001600160a01b03851660009081526020819052604090205490915061244e90839061362d565b6001600160a01b03808616600090815260208190526040808220939093559085168152205461247e9082906135d4565b6001600160a01b038481166000818152602081815260409182902094909455518481529092918716916000805160206136f5833981519152910160405180910390a361142f565b6001600160a01b03821661251b5760405162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74206275726e2066726f6d206e756c6c20616464726573730000006044820152606401610c17565b80600254612529919061362d565b6002556001600160a01b03821660009081526020819052604090205461255090829061362d565b6001600160a01b03831660008181526020818152604080832094909455925184815290926000805160206136f58339815191529101611be1565b612594828261275e565b5050565b804710156125e85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610c17565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612635576040519150601f19603f3d011682016040523d82523d6000602084013e61263a565b606091505b50509050806126b15760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610c17565b505050565b60055461010090046001600160a01b031633146126e55760405162461bcd60e51b8152600401610c179061358c565b6005805460ff60a81b1916600160a81b17905560405133906000805160206136d58339815191529061273c9060208082526011908201527018dbdb9d1c9858dd081b185d5b98da1959607a1b604082015260600190565b60405180910390a2565b6126b183838361279e565b6000611ad18484846129ba565b6001600160a01b03808316600090815260176020526040808220805460ff1990811690915592841682529020805490911660011790556125948282612bfb565b60145460408051630dd8715760e01b815290516000926001600160a01b031691630dd87157916004808301926020929190829003018186803b1580156127e357600080fd5b505afa1580156127f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281b9190613441565b612825904261362d565b600554909150600160a81b900460ff16801561284a5750601454600160a01b900460ff165b801561286e57506001600160a01b03831660009081526008602052604090205460ff165b8015612888575042601854603c61288591906135d4565b11155b801561289657506015548110155b80156128be57506016546014546001600160a01b031660009081526020819052604090205410155b801561294d5750601460009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b815260040160206040518083038186803b15801561291357600080fd5b505afa158015612927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294b9190613381565b155b156129af57426018556014546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b15801561299c57600080fd5b505af19250505080156129ad575060015b505b61142f848484612c77565b6001600160a01b038316600090815260176020526040812054829060ff161580156129fe57506001600160a01b03841660009081526017602052604090205460ff16155b8015612a135750600554600160a81b900460ff165b15612b60576001600160a01b03851660009081526008602052604090205460ff1615612abe5760145460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc790602401602060405180830381600087803b158015612a7f57600080fd5b505af1158015612a93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab79190613441565b9050612b60565b6001600160a01b03841660009081526008602052604090205460ff1615612b6057601454604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd590602401602060405180830381600087803b158015612b2557600080fd5b505af1158015612b39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b5d9190613441565b90505b6000612b6c828561362d565b90508015612be6576014546001600160a01b0316600090815260208190526040902054612b9a9082906135d4565b601480546001600160a01b0390811660009081526020818152604091829020949094559154915184815291811692908916916000805160206136f5833981519152910160405180910390a35b612bf1868684613014565b9695505050505050565b6001600160a01b038281166000818152601360209081526040808320805460ff199081169091559486168084528184208054871660019081179091558585526011845282852080548816905581855282852080548816821790559484526006909252808320805486169055908252902080549092161790555050565b60095460ff161580612c9957503360009081526010602052604090205460ff16155b612cd75760405162461bcd60e51b815260206004820152600f60248201526e1cdb9a5c195c881c995a9958dd1959608a1b6044820152606401610c17565b600554600160a81b900460ff168015612d0357506005546001600160a01b038481166101009092041614155b8015612d2857506001600160a01b03831660009081526011602052604090205460ff16155b8015612d4d57506001600160a01b03821660009081526011602052604090205460ff16155b156126b157600c5415612dac57600c545a1115612dac5760405162461bcd60e51b815260206004820152601e60248201527f74686973206973206f76657220746865206d617820676173206c696d697400006044820152606401610c17565b6000600b54118015612dd757506001600160a01b03821660009081526008602052604090205460ff16155b15612e5657612de46118a1565b6001600160a01b038316600090815260208190526040902054612e089083906135d4565b1115612e565760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e746044820152606401610c17565b6000600a54118015612e8057506001600160a01b03821660009081526008602052604090205460ff165b15612edc57612e8d611ad9565b811115612edc5760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d61782073656c6c20616d6f756e746044820152606401610c17565b600954610100900460ff16156126b1576001600160a01b038216600090815260126020526040902054431415612f43576001600160a01b0382166000908152601060205260408120805460ff19166001179055600f805491612f3d8361367f565b91905055505b6001600160a01b038316600090815260126020526040902054431415612f9a576001600160a01b0383166000908152601060205260408120805460ff19166001179055600f805491612f948361367f565b91905055505b6001600160a01b03821660009081526008602052604090205460ff16612fd6576001600160a01b03821660009081526012602052604090204390555b6001600160a01b03831660009081526008602052604090205460ff166126b15750506001600160a01b03166000908152601260205260409020439055565b6005546000908290600160a81b900460ff16801561303a575060095462010000900460ff165b1561314a576005546001600160a01b038681166101009092041614801590613069575060006130676121fd565b115b801561308e57506001600160a01b03851660009081526011602052604090205460ff16155b80156130b357506001600160a01b03841660009081526011602052604090205460ff16155b1561314a5760006127106130c56121fd565b6130cf908661360e565b6130d991906135ec565b90506130e5818361362d565b9150801561314857306000908152602081905260409020546131089082906135d4565b3060008181526020818152604091829020939093555183815290916001600160a01b038916916000805160206136f5833981519152910160405180910390a35b505b61315585858361315e565b95945050505050565b6000826001600160a01b0316846001600160a01b031614156131c25760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610c17565b5092915050565b80356001600160a01b03811681146131e057600080fd5b919050565b600082601f8301126131f657600080fd5b813567ffffffffffffffff80821115613211576132116136b0565b604051601f8301601f19908116603f01168101908282118183101715613239576132396136b0565b8160405283815286602085880101111561325257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561328457600080fd5b61328d826131c9565b9392505050565b600080604083850312156132a757600080fd5b6132b0836131c9565b91506132be602084016131c9565b90509250929050565b6000806000606084860312156132dc57600080fd5b6132e5846131c9565b92506132f3602085016131c9565b9150604084013590509250925092565b6000806040838503121561331657600080fd5b61331f836131c9565b9150602083013561332f816136c6565b809150509250929050565b6000806040838503121561334d57600080fd5b613356836131c9565b946020939093013593505050565b60006020828403121561337657600080fd5b813561328d816136c6565b60006020828403121561339357600080fd5b815161328d816136c6565b600080604083850312156133b157600080fd5b823567ffffffffffffffff8111156133c857600080fd5b6133d4858286016131e5565b9250506132be602084016131c9565b600080604083850312156133f657600080fd5b823567ffffffffffffffff81111561340d57600080fd5b613419858286016131e5565b95602094909401359450505050565b60006020828403121561343a57600080fd5b5035919050565b60006020828403121561345357600080fd5b5051919050565b6000806040838503121561346d57600080fd5b50508035926020909101359150565b6000815180845260005b818110156134a257602081850181015186830182015201613486565b818111156134b4576000602083870101525b50601f01601f19169290920160200192915050565b60208152600061328d602083018461347c565b6040815260006134ef604083018561347c565b905060018060a01b03831660208301529392505050565b604081526000613519604083018561347c565b90508260208301529392505050565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b600082198211156135e7576135e761369a565b500190565b60008261360957634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156136285761362861369a565b500290565b60008282101561363f5761363f61369a565b500390565b600181811c9082168061365857607f821691505b6020821081141561367957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136935761369361369a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461135d57600080fdfed43eee071b91e7714b533dbf825ec024145ba03675691f363d9a4c47e88b4dc5ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212208ff54f95308b63bcfb6b41ca8bf851668aaec5ffe66993ade70bd4d034d5ace864736f6c63430008070033

Deployed Bytecode Sourcemap

235:2665:7:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1944:100;;;;;;;;;;;;;:::i;:::-;;415:19:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4119:212:6;;;;;;;;;;-1:-1:-1;4119:212:6;;;;;:::i;:::-;;:::i;3461:314:2:-;;;;;;;;;;-1:-1:-1;3461:314:2;;;;;:::i;:::-;;:::i;:::-;;;5542:14:8;;5535:22;5517:41;;5505:2;5490:18;3461:314:2;5377:187:8;509:41:1;;;;;;;;;;-1:-1:-1;509:41:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;5112:173;;;;;;;;;;-1:-1:-1;5112:173:1;;;;;:::i;:::-;;:::i;1543:102:2:-;;;;;;;;;;-1:-1:-1;1625:12:2;;1543:102;;;19172:25:8;;;19160:2;19145:18;1543:102:2;19026:177:8;2962:114:6;;;;;;;;;;-1:-1:-1;3053:14:6;;-1:-1:-1;;;;;3053:14:6;2962:114;;;-1:-1:-1;;;;;5054:32:8;;;5036:51;;5024:2;5009:18;2962:114:6;4890:203:8;762:187:3;;;;;;;;;;-1:-1:-1;762:187:3;;;;;:::i;:::-;;:::i;4248:328:2:-;;;;;;;;;;-1:-1:-1;4248:328:2;;;;;:::i;:::-;;:::i;8037:191::-;;;;;;;;;;-1:-1:-1;8037:191:2;;;;;:::i;:::-;;:::i;557:46:1:-;;;;;;;;;;-1:-1:-1;557:46:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;441:21:2;;;;;;;;;;-1:-1:-1;441:21:2;;;;;;;;;;;19380:4:8;19368:17;;;19350:36;;19338:2;19323:18;441:21:2;19208:184:8;188:43:3;;;;;;;;;;-1:-1:-1;188:43:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;4522:192:1;;;;;;;;;;-1:-1:-1;4522:192:1;;;;;:::i;:::-;;:::i;5091:381:2:-;;;;;;;;;;-1:-1:-1;5091:381:2;;;;;:::i;:::-;;:::i;1120:101:3:-;;;;;;;;;;-1:-1:-1;1120:101:3;;;;;:::i;:::-;;:::i;4570:93:6:-;;;;;;;;;;;;;:::i;300:27:1:-;;;;;;;;;;;;;;;;2770:102:6;;;;;;;;;;;;;:::i;3122:168::-;;;;;;;;;;-1:-1:-1;3122:168:6;;;;;:::i;:::-;;:::i;7821:204:2:-;;;;;;;;;;-1:-1:-1;7821:204:2;;;;;:::i;:::-;;:::i;214:36:1:-;;;;;;;;;;-1:-1:-1;214:36:1;;;;;;;;;;;4311:199;;;;;;;;;;-1:-1:-1;4311:199:1;;;;;:::i;:::-;;:::i;4343:215:6:-;;;;;;;;;;-1:-1:-1;4343:215:6;;;;;:::i;:::-;;:::i;5297:182:1:-;;;;;;;;;;-1:-1:-1;5297:182:1;;;;;:::i;:::-;;:::i;5487:196::-;;;;;;;;;;-1:-1:-1;5487:196:1;;;;;:::i;:::-;;:::i;368:26::-;;;;;;;;;;;;;;;;3610:113;;;;;;;;;;;;;:::i;3896:215:6:-;;;;;;;;;;-1:-1:-1;3896:215:6;;;;;:::i;:::-;;:::i;7598:211:2:-;;;;;;;;;;-1:-1:-1;7598:211:2;;;;;:::i;:::-;;:::i;215:23:6:-;;;;;;;;;;-1:-1:-1;215:23:6;;;;-1:-1:-1;;;215:23:6;;;;;;3735:114:1;;;;;;;;;;;;;:::i;1862:119:2:-;;;;;;;;;;-1:-1:-1;1862:119:2;;;;;:::i;:::-;-1:-1:-1;;;;;1956:17:2;1929:7;1956:17;;;;;;;;;;;;1862:119;657:42;;;;;;;;;;-1:-1:-1;657:42:2;;;;;:::i;:::-;;;;;;;;;;;;;;;;403:25:1;;;;;;;;;;;;;;;;1620:275:3;;;;;;;;;;-1:-1:-1;1620:275:3;;;;;:::i;:::-;;:::i;511:20:2:-;;;;;;;;;;-1:-1:-1;511:20:2;;;;-1:-1:-1;;;511:20:2;;;;;;4919:181:1;;;;;;;;;;-1:-1:-1;4919:181:1;;;;;:::i;:::-;;:::i;475:29:2:-;;;;;;;;;;-1:-1:-1;475:29:2;;;;;;;-1:-1:-1;;;;;475:29:2;;;388:20;;;;;;;;;;;;;:::i;335:48:6:-;;;;;;;;;;-1:-1:-1;335:48:6;;;;;:::i;:::-;;;;;;;;;;;;;;;;5992:391:2;;;;;;;;;;-1:-1:-1;5992:391:2;;;;;:::i;:::-;;:::i;7184:247::-;;;;;;;;;;-1:-1:-1;7184:247:2;;;;;:::i;:::-;;:::i;2636:178::-;;;;;;;;;;-1:-1:-1;2636:178:2;;;;;:::i;:::-;;:::i;544:47::-;;;;;;;;;;-1:-1:-1;544:47:2;;;;;:::i;:::-;;;;;;;;;;;;;;;;4726:181:1;;;;;;;;;;-1:-1:-1;4726:181:1;;;;;:::i;:::-;;:::i;3298:305:6:-;;;;;;;;;;-1:-1:-1;3298:305:6;;;;;:::i;:::-;;:::i;334:27:1:-;;;;;;;;;;;;;;;;4113:186;;;;;;;;;;-1:-1:-1;4113:186:1;;;;;:::i;:::-;;:::i;2568:104:6:-;;;;;;;;;;;;;:::i;435:26:1:-;;;;;;;;;;;;;;;;290:38:6;;;;;;;;;;;;;;;;3611:273;;;;;;;;;;-1:-1:-1;3611:273:6;;;;;:::i;:::-;;:::i;610:55:1:-;;;;;;;;;;-1:-1:-1;610:55:1;;;;;:::i;:::-;;;;;;;;;;;;;;245:38:6;;;;;;;;;;;;;;;;2321:144:2;;;;;;;;;;-1:-1:-1;2321:144:2;;;;;:::i;:::-;-1:-1:-1;;;;;2432:16:2;;;2405:7;2432:16;;;:8;:16;;;;;;;;:25;;;;;;;;;;;;;2321:144;7439:151;;;;;;;;;;;;;:::i;468:28:1:-;;;;;;;;;;;;;;;;598:52:2;;;;;;;;;;-1:-1:-1;598:52:2;;;;;:::i;:::-;;;;;;;;;;;;;;;;175:32:1;;;;;;;;;;-1:-1:-1;175:32:1;;;;;;;;257:34;;;;;;;;;;-1:-1:-1;257:34:1;;;;;;;;;;;3860:217;;;;;;;;;;;;;:::i;1944:100:7:-;837:5:2;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;;;;;;;;;2022:14:7::1;:12;:14::i;:::-;1944:100::o:0;415:19:2:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4119:212:6:-;837:5:2;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;4210:14:6::1;::::0;:44:::1;::::0;-1:-1:-1;;;4210:44:6;;-1:-1:-1;;;;;4210:14:6;;::::1;::::0;:24:::1;::::0;:44:::1;::::0;4235:7;;4244:9;;4210:44:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4291:10;-1:-1:-1::0;;;;;4270:53:6::1;-1:-1:-1::0;;;;;;;;;;;4270:53:6::1;;;;12802:2:8::0;12784:21;;;12841:2;12821:18;;;12814:30;-1:-1:-1;;;12875:2:8;12860:18;;12853:47;12932:2;12917:18;;12600:341;4270:53:6::1;;;;;;;;4119:212:::0;;:::o;3461:314:2:-;1235:8;;3564:4;;3543:10;;-1:-1:-1;;;1235:8:2;;;;;:25;;-1:-1:-1;1255:5:2;;-1:-1:-1;;;;;1247:13:2;;;1255:5;;;;;1247:13;1235:25;:55;;;-1:-1:-1;1279:10:2;1264:26;;;;:14;:26;;;;;;;;1235:55;1227:87;;;;-1:-1:-1;;;1227:87:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;3589:21:2;::::1;3581:62;;;;-1:-1:-1::0;;;3581:62:2::1;;;;;;;:::i;:::-;3665:10;3656:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;3656:29:2;::::1;::::0;;;;;;;;;;:37;;;3709:36;19172:25:8;;;3656:29:2;;3665:10;-1:-1:-1;;;;;;;;;;;3709:36:2;19145:18:8;3709:36:2::1;;;;;;;;-1:-1:-1::0;3763:4:2::1;::::0;3461:314;-1:-1:-1;;;3461:314:2:o;5112:173:1:-;837:5:2;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;5182:11:1::1;:20:::0;;;5218:59:::1;::::0;5239:10:::1;::::0;-1:-1:-1;;;;;;;;;;;5218:59:1;::::1;::::0;13852:2:8;13834:21;;;13891:2;13871:18;;;13864:30;13930:25;13925:2;13910:18;;13903:53;13988:2;13973:18;;13650:347;5218:59:1::1;;;;;;;;5112:173:::0;:::o;762:187:3:-;837:5:2;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;842:15:3;::::1;;::::0;;;:10:::1;:15;::::0;;;;;;:25;;;::::1;;-1:-1:-1::0;;842:25:3;;::::1;;::::0;;883:58;904:10:::1;::::0;-1:-1:-1;;;;;;;;;;;883:58:3;::::1;::::0;6614:2:8;6596:21;;;6653:2;6633:18;;;6626:30;-1:-1:-1;;;6687:2:8;6672:18;;6665:52;6749:2;6734:18;;6412:346;4248:328:2;1235:8;;4359:4;;4344;;-1:-1:-1;;;1235:8:2;;;;;:25;;-1:-1:-1;1255:5:2;;-1:-1:-1;;;;;1247:13:2;;;1255:5;;;;;1247:13;1235:25;:55;;;-1:-1:-1;1279:10:2;1264:26;;;;:14;:26;;;;;;;;1235:55;1227:87;;;;-1:-1:-1;;;1227:87:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;4405:14:2;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;4420:10:::1;4405:26:::0;;;;;;;;:34:::1;::::0;4434:5;;4405:34:::1;:::i;:::-;-1:-1:-1::0;;;;;4376:14:2;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;4391:10:::1;4376:26:::0;;;;;;;:63;4450:26:::1;4385:4:::0;4466:2;4470:5;4450:9:::1;:26::i;:::-;-1:-1:-1::0;;;;;4492:54:2;::::1;4519:14;::::0;;;:8:::1;:14;::::0;;;;;;;4507:10:::1;4519:26:::0;;;;;;;;;;;4492:54;;19172:25:8;;;4507:10:2;;4492:54;-1:-1:-1;;;;;;;;;;;4492:54:2;19145:18:8;4492:54:2::1;;;;;;;-1:-1:-1::0;4564:4:2::1;::::0;4248:328;-1:-1:-1;;;;4248:328:2:o;8037:191::-;837:5;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;8118:14:2;::::1;;::::0;;;:9:::1;:14;::::0;;;;;;:27;;;::::1;;-1:-1:-1::0;;8118:27:2;;::::1;;::::0;;8161:59;8182:10:::1;::::0;-1:-1:-1;;;;;;;;;;;8161:59:2;::::1;::::0;8718:2:8;8700:21;;;8757:2;8737:18;;;8730:30;8796:25;8791:2;8776:18;;8769:53;8854:2;8839:18;;8516:347;4522:192:1;837:5:2;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;4595:22:1::1;:32:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;4595:32:1;;::::1;;::::0;;4643:63:::1;::::0;4664:10:::1;::::0;-1:-1:-1;;;;;;;;;;;4643:63:1;::::1;::::0;14564:2:8;14546:21;;;14603:2;14583:18;;;14576:30;14642:29;14637:2;14622:18;;14615:57;14704:2;14689:18;;14362:351;5091:381:2;1235:8;;5200:4;;5179:10;;-1:-1:-1;;;1235:8:2;;;;;:25;;-1:-1:-1;1255:5:2;;-1:-1:-1;;;;;1247:13:2;;;1255:5;;;;;1247:13;1235:25;:55;;;-1:-1:-1;1279:10:2;1264:26;;;;:14;:26;;;;;;;;1235:55;1227:87;;;;-1:-1:-1;;;1227:87:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;5225:21:2;::::1;5217:62;;;;-1:-1:-1::0;;;5217:62:2::1;;;;;;;:::i;:::-;5333:10;5324:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;5324:29:2;::::1;::::0;;;;;;;;:42:::1;::::0;5356:10;;5324:42:::1;:::i;:::-;5301:10;5292:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;5292:29:2;::::1;::::0;;;;;;;;;;:74;;;5382:60;19172:25:8;;;5292:29:2;;-1:-1:-1;;;;;;;;;;;5382:60:2;19145:18:8;5382:60:2::1;19026:177:8::0;1120:101:3;292:10;281:22;;;;:10;:22;;;;;;;;273:54;;;;-1:-1:-1;;;273:54:3;;8028:2:8;273:54:3;;;8010:21:8;8067:2;8047:18;;;8040:30;-1:-1:-1;;;8086:18:8;;;8079:49;8145:18;;273:54:3;7826:343:8;273:54:3;1189:24:::1;1195:10;1207:5;1189;:24::i;:::-;1120:101:::0;:::o;4570:93:6:-;960:8:2;;-1:-1:-1;;;960:8:2;;;;952:62;;;;-1:-1:-1;;;952:62:2;;9783:2:8;952:62:2;;;9765:21:8;9822:2;9802:18;;;9795:30;9861:34;9841:18;;;9834:62;-1:-1:-1;;;9912:18:8;;;9905:39;9961:19;;952:62:2;9581:405:8;952:62:2;4628:14:6::1;;;;;;;;;-1:-1:-1::0;;;;;4628:14:6::1;-1:-1:-1::0;;;;;4628:25:6::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4570:93::o:0;2770:102::-;2838:14;;:26;;;-1:-1:-1;;;2838:26:6;;;;2811:7;;-1:-1:-1;;;;;2838:14:6;;:24;;:26;;;;;;;;;;;;;;:14;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2831:33;;2770:102;:::o;3122:168::-;837:5:2;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;3190:11:6::1;:21:::0;;;::::1;;-1:-1:-1::0;;;3190:21:6::1;-1:-1:-1::0;;;;3190:21:6;;::::1;;::::0;;3227:55:::1;::::0;3248:10:::1;::::0;-1:-1:-1;;;;;;;;;;;3227:55:6;::::1;::::0;12045:2:8;12027:21;;;12084:2;12064:18;;;12057:30;-1:-1:-1;;;12118:2:8;12103:18;;12096:49;12177:2;12162:18;;11843:343;7821:204:2;837:5;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;7905:19:2;::::1;;::::0;;;:14:::1;:19;::::0;;;;;;:29;;;::::1;;-1:-1:-1::0;;7905:29:2;;::::1;;::::0;;7950:67;7971:10:::1;::::0;-1:-1:-1;;;;;;;;;;;7950:67:2;::::1;::::0;14204:2:8;14186:21;;;14243:2;14223:18;;;14216:30;14282:33;14277:2;14262:18;;14255:61;14348:2;14333:18;;14002:355;4311:199:1;837:5:2;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;4386:24:1::1;:34:::0;;;::::1;;;;-1:-1:-1::0;;4386:34:1;;::::1;;::::0;;4436:66:::1;::::0;4457:10:::1;::::0;-1:-1:-1;;;;;;;;;;;4436:66:1;::::1;::::0;14920:2:8;14902:21;;;14959:2;14939:18;;;14932:30;14998:32;14993:2;14978:18;;14971:60;15063:2;15048:18;;14718:354;4343:215:6;837:5:2;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;4434:14:6::1;::::0;:44:::1;::::0;-1:-1:-1;;;4434:44:6;;-1:-1:-1;;;;;4434:14:6;;::::1;::::0;:27:::1;::::0;:44:::1;::::0;4462:7;;4471:6;;4434:44:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4515:10;-1:-1:-1::0;;;;;4494:56:6::1;-1:-1:-1::0;;;;;;;;;;;4494:56:6::1;;;;16753:2:8::0;16735:21;;;16792:2;16772:18;;;16765:30;-1:-1:-1;;;16826:2:8;16811:18;;16804:50;16886:2;16871:18;;16551:344;5297:182:1;837:5:2;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;5375:13:1;::::1;;::::0;;;:8:::1;:13;::::0;;;;;;:23;;;::::1;;-1:-1:-1::0;;5375:23:1;;::::1;;::::0;;5414:57;5435:10:::1;::::0;-1:-1:-1;;;;;;;;;;;5414:57:1;::::1;::::0;13148:2:8;13130:21;;;13187:2;13167:18;;;13160:30;-1:-1:-1;;;13221:2:8;13206:18;;13199:51;13282:2;13267:18;;12946:345;5487:196:1;837:5:2;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;5568:18:1;::::1;;::::0;;;:13:::1;:18;::::0;;;;;;:28;;;::::1;;-1:-1:-1::0;;5568:28:1;;::::1;;::::0;;5612:63;5633:10:::1;::::0;-1:-1:-1;;;;;;;;;;;5612:63:1;::::1;::::0;9427:2:8;9409:21;;;9466:2;9446:18;;;9439:30;9505:29;9500:2;9485:18;;9478:57;9567:2;9552:18;;9225:351;3610:113:1;3651:7;3710:5;3694:12;;3679;;:27;;;;:::i;:::-;3678:37;;;;:::i;3896:215:6:-;837:5:2;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;3988:14:6::1;::::0;:45:::1;::::0;-1:-1:-1;;;3988:45:6;;-1:-1:-1;;;;;3988:14:6;;::::1;::::0;:25:::1;::::0;:45:::1;::::0;4014:7;;4023:9;;3988:45:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4070:10;-1:-1:-1::0;;;;;4049:54:6::1;-1:-1:-1::0;;;;;;;;;;;4049:54:6::1;;;;18881:2:8::0;18863:21;;;18920:2;18900:18;;;18893:30;-1:-1:-1;;;18954:2:8;18939:18;;18932:48;19012:2;18997:18;;18679:342;7598:211:2;837:5;;7676:4;;837:5;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;7710:38:::1;::::0;-1:-1:-1;;;7710:38:2;;7742:4:::1;7710:38;::::0;::::1;5036:51:8::0;7692:15:2::1;::::0;-1:-1:-1;;;;;7710:23:2;::::1;::::0;::::1;::::0;5009:18:8;;7710:38:2::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7766:35;::::0;-1:-1:-1;;;7766:35:2;;-1:-1:-1;;;;;5290:32:8;;;7766:35:2::1;::::0;::::1;5272:51:8::0;5339:18;;;5332:34;;;7692:56:2;;-1:-1:-1;7766:22:2;;::::1;::::0;::::1;::::0;5245:18:8;;7766:35:2::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7759:42:::0;7598:211;-1:-1:-1;;;;7598:211:2:o;3735:114:1:-;3776:7;3836:5;3820:12;;3805;;:27;;;;:::i;1620:275:3:-;292:10;281:22;;;;:10;:22;;;;;;;;273:54;;;;-1:-1:-1;;;273:54:3;;8028:2:8;273:54:3;;;8010:21:8;8067:2;8047:18;;;8040:30;-1:-1:-1;;;8086:18:8;;;8079:49;8145:18;;273:54:3;7826:343:8;273:54:3;-1:-1:-1;;;;;1742:17:3;::::1;;::::0;;;:8:::1;:17;::::0;;;;;;;1760:10:::1;1742:29:::0;;;;;;;;:37:::1;::::0;1774:5;;1742:37:::1;:::i;:::-;-1:-1:-1::0;;;;;1710:17:3;::::1;;::::0;;;:8:::1;:17;::::0;;;;;;;1728:10:::1;1710:29:::0;;;;;;;:69;1790:21:::1;1719:7:::0;1805:5;1790::::1;:21::i;:::-;-1:-1:-1::0;;;;;1827:60:3;::::1;1857:17;::::0;;;:8:::1;:17;::::0;;;;;;;1845:10:::1;1857:29:::0;;;;;;;;;;;1827:60;;19172:25:8;;;1845:10:3;;1827:60;-1:-1:-1;;;;;;;;;;;1827:60:3;19145:18:8;1827:60:3::1;;;;;;;;1620:275:::0;;:::o;4919:181:1:-;837:5:2;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;4990:12:1::1;:21:::0;;;5027:65:::1;::::0;5048:10:::1;::::0;-1:-1:-1;;;;;;;;;;;5027:65:1;::::1;::::0;10902:2:8;10884:21;;;10941:2;10921:18;;;10914:30;10980:31;10975:2;10960:18;;10953:59;11044:2;11029:18;;10700:353;388:20:2;;;;;;;:::i;5992:391::-;1235:8;;6106:4;;6085:10;;-1:-1:-1;;;1235:8:2;;;;;:25;;-1:-1:-1;1255:5:2;;-1:-1:-1;;;;;1247:13:2;;;1255:5;;;;;1247:13;1235:25;:55;;;-1:-1:-1;1279:10:2;1264:26;;;;:14;:26;;;;;;;;1235:55;1227:87;;;;-1:-1:-1;;;1227:87:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;6131:21:2;::::1;6123:62;;;;-1:-1:-1::0;;;6123:62:2::1;;;;;;;:::i;:::-;6239:10;6230:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;6230:29:2;::::1;::::0;;;;;;;;:47:::1;::::0;6262:15;;6230:47:::1;:::i;7184:247::-:0;837:5;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;7256:17:2;::::1;7248:52;;;::::0;-1:-1:-1;;;7248:52:2;;15640:2:8;7248:52:2::1;::::0;::::1;15622:21:8::0;15679:2;15659:18;;;15652:30;-1:-1:-1;;;15698:18:8;;;15691:52;15760:18;;7248:52:2::1;15438:346:8::0;7248:52:2::1;7325:5;::::0;7311:25:::1;::::0;7325:5:::1;::::0;::::1;-1:-1:-1::0;;;;;7325:5:2::1;7332:3:::0;7311:13:::1;:25::i;:::-;7347:5;:11:::0;;-1:-1:-1;;;;;7347:11:2;::::1;;;-1:-1:-1::0;;;;;;7347:11:2;;::::1;;::::0;;7374:49:::1;::::0;7395:10:::1;::::0;-1:-1:-1;;;;;;;;;;;7374:49:2;::::1;::::0;8376:2:8;8358:21;;;8415:2;8395:18;;;8388:30;-1:-1:-1;;;8449:2:8;8434:18;;8427:43;8502:2;8487:18;;8174:337;2636:178:2;1235:8;;2735:4;;2714:10;;-1:-1:-1;;;1235:8:2;;;;;:25;;-1:-1:-1;1255:5:2;;-1:-1:-1;;;;;1247:13:2;;;1255:5;;;;;1247:13;1235:25;:55;;;-1:-1:-1;1279:10:2;1264:26;;;;:14;:26;;;;;;;;1235:55;1227:87;;;;-1:-1:-1;;;1227:87:2;;;;;;;:::i;:::-;2752:32:::1;2762:10;2774:2;2778:5;2752:9;:32::i;:::-;-1:-1:-1::0;2802:4:2::1;::::0;2636:178;-1:-1:-1;;;2636:178:2:o;4726:181:1:-;837:5:2;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;4797:12:1::1;:21:::0;;;4834:65:::1;::::0;4855:10:::1;::::0;-1:-1:-1;;;;;;;;;;;4834:65:1;::::1;::::0;16395:2:8;16377:21;;;16434:2;16414:18;;;16407:30;16473:31;16468:2;16453:18;;16446:59;16537:2;16522:18;;16193:353;3298:305:6;837:5:2;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;3391:14:6;::::1;;::::0;;;:9:::1;:14;::::0;;;;;::::1;;:23;::::0;:43:::1;;-1:-1:-1::0;3418:16:6;::::1;3391:43;3383:91;;;::::0;-1:-1:-1;;;3383:91:6;;15991:2:8;3383:91:6::1;::::0;::::1;15973:21:8::0;16030:2;16010:18;;;16003:30;16069:34;16049:18;;;16042:62;-1:-1:-1;;;16120:18:8;;;16113:33;16163:19;;3383:91:6::1;15789:399:8::0;3383:91:6::1;-1:-1:-1::0;;;;;3485:20:6;::::1;;::::0;;;:15:::1;:20;::::0;;;;;;:30;;;::::1;;-1:-1:-1::0;;3485:30:6;;::::1;;::::0;;3531:64;3552:10:::1;::::0;-1:-1:-1;;;;;;;;;;;3531:64:6;::::1;::::0;17446:2:8;17428:21;;;17485:2;17465:18;;;17458:30;17524;17519:2;17504:18;;17497:58;17587:2;17572:18;;17244:352;4113:186:1;837:5:2;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;4184:20:1::1;:30:::0;;;::::1;;-1:-1:-1::0;;4184:30:1;;::::1;;::::0;;4230:61:::1;::::0;4251:10:::1;::::0;-1:-1:-1;;;;;;;;;;;4230:61:1;::::1;::::0;13498:2:8;13480:21;;;13537:2;13517:18;;;13510:30;13576:27;13571:2;13556:18;;13549:55;13636:2;13621:18;;13296:349;2568:104:6;2637:14;;:27;;;-1:-1:-1;;;2637:27:6;;;;2610:7;;-1:-1:-1;;;;;2637:14:6;;:25;;:27;;;;;;;;;;;;;;:14;:27;;;;;;;;;;3611:273;837:5:2;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;3715:23:6::1;:35:::0;;;3761:23:::1;:33:::0;;;3810:66:::1;::::0;3831:10:::1;::::0;-1:-1:-1;;;;;;;;;;;3810:66:6;::::1;::::0;18522:2:8;18504:21;;;18561:2;18541:18;;;18534:30;18600:32;18595:2;18580:18;;18573:60;18665:2;18650:18;;18320:354;7439:151:2;837:5;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;7566:5:::1;::::0;7508:21:::1;::::0;7540:42:::1;::::0;7566:5:::1;::::0;::::1;-1:-1:-1::0;;;;;7566:5:2::1;7508:21:::0;7540:17:::1;:42::i;3860:217:1:-:0;3933:8;;3910:7;;-1:-1:-1;;;3933:8:1;;;;3930:121;;;3991:1;3977:11;;3962:12;:26;;;;:::i;:::-;:30;3958:82;;;-1:-1:-1;4020:4:1;;3860:217::o;3958:82::-;-1:-1:-1;4068:1:1;;3860:217::o;448:144:6:-;-1:-1:-1;;;;;520:23:6;;;;;;:15;:23;;;;;:30;;-1:-1:-1;;520:30:6;546:4;520:30;;;561:23;536:6;379:139:3;-1:-1:-1;;;;;451:18:3;;;;;;:10;:18;;;;;:25;;-1:-1:-1;;451:25:3;472:4;451:25;;;487:23;462:6;702:142:1;-1:-1:-1;;;;;774:21:1;;;;;;:13;:21;;;;;:28;;-1:-1:-1;;774:28:1;798:4;774:28;;;813:23;788:6;1346:124:2;1409:5;:14;;-1:-1:-1;;;;;;1409:14:2;;-1:-1:-1;;;;;1409:14:2;;;;;;;;;;;;;1449:5;;;-1:-1:-1;1434:21:2;;;:14;:21;;;;;:28;;-1:-1:-1;;1434:28:2;-1:-1:-1;1434:28:2;;;1346:124::o;1060:161:1:-;837:5:2;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;1123:14:1::1;:12;:14::i;:::-;1161:15;1148:10;:28:::0;1201:12:::1;1187:11;:26:::0;1060:161::o;9129:575:2:-;-1:-1:-1;;;;;9216:16:2;;9208:51;;;;-1:-1:-1;;;9208:51:2;;15640:2:8;9208:51:2;;;15622:21:8;15679:2;15659:18;;;15652:30;-1:-1:-1;;;15698:18:8;;;15691:52;15760:18;;9208:51:2;15438:346:8;9208:51:2;-1:-1:-1;;;;;9278:25:2;;;;;;:19;:25;;;;;;;;:34;;:60;;-1:-1:-1;;;;;;9316:13:2;;;;;;:9;:13;;;;;;;;:22;9278:60;9270:103;;;;-1:-1:-1;;;9270:103:2;;7311:2:8;9270:103:2;;;7293:21:8;7350:2;7330:18;;;7323:30;7389:32;7369:18;;;7362:60;7439:18;;9270:103:2;7109:354:8;9270:103:2;9394:28;9406:4;9412:2;9416:5;9394:11;:28::i;:::-;9435:22;9460:40;9484:4;9490:2;9494:5;9460:23;:40::i;:::-;-1:-1:-1;;;;;9529:15:2;;:9;:15;;;;;;;;;;;9435:65;;-1:-1:-1;9529:23:2;;9547:5;;9529:23;:::i;:::-;-1:-1:-1;;;;;9511:15:2;;;:9;:15;;;;;;;;;;;:41;;;;9579:13;;;;;;;:30;;9595:14;;9579:30;:::i;:::-;-1:-1:-1;;;;;9563:13:2;;;:9;:13;;;;;;;;;;;;:46;;;;9627:34;19172:25:8;;;9563:13:2;;9627:34;;;;-1:-1:-1;;;;;;;;;;;9627:34:2;19145:18:8;9627:34:2;;;;;;;9674:22;2197:157:7;1931:296:3;-1:-1:-1;;;;;2006:21:3;;1998:63;;;;-1:-1:-1;;;1998:63:3;;7670:2:8;1998:63:3;;;7652:21:8;7709:2;7689:18;;;7682:30;7748:31;7728:18;;;7721:59;7797:18;;1998:63:3;7468:353:8;1998:63:3;2104:5;2089:12;;:20;;;;:::i;:::-;2074:12;:35;-1:-1:-1;;;;;2141:18:3;;:9;:18;;;;;;;;;;;:26;;2162:5;;2141:26;:::i;:::-;-1:-1:-1;;;;;2120:18:3;;:9;:18;;;;;;;;;;;:47;;;;2183:36;;19172:25:8;;;2120:9:3;;-1:-1:-1;;;;;;;;;;;2183:36:3;19145:18:8;2183:36:3;19026:177:8;2197:157:7;2317:29;2337:4;2343:2;2317:19;:29::i;:::-;2197:157;;:::o;2710:317:0:-;2825:6;2800:21;:31;;2792:73;;;;-1:-1:-1;;;2792:73:0;;11687:2:8;2792:73:0;;;11669:21:8;11726:2;11706:18;;;11699:30;11765:31;11745:18;;;11738:59;11814:18;;2792:73:0;11485:353:8;2792:73:0;2879:12;2897:9;-1:-1:-1;;;;;2897:14:0;2919:6;2897:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2878:52;;;2949:7;2941:78;;;;-1:-1:-1;;;2941:78:0;;11260:2:8;2941:78:0;;;11242:21:8;11299:2;11279:18;;;11272:30;11338:34;11318:18;;;11311:62;11409:28;11389:18;;;11382:56;11455:19;;2941:78:0;11058:422:8;2941:78:0;2781:246;2710:317;;:::o;6456:146:2:-;837:5;;;;;-1:-1:-1;;;;;837:5:2;823:10;:19;815:72;;;;-1:-1:-1;;;815:72:2;;;;;;;:::i;:::-;6510:8:::1;:15:::0;;-1:-1:-1;;;;6510:15:2::1;-1:-1:-1::0;;;6510:15:2::1;::::0;;6541:53:::1;::::0;6562:10:::1;::::0;-1:-1:-1;;;;;;;;;;;6541:53:2;::::1;::::0;6965:2:8;6947:21;;;7004:2;6984:18;;;6977:30;-1:-1:-1;;;7038:2:8;7023:18;;7016:47;7095:2;7080:18;;6763:341;6541:53:2::1;;;;;;;;6456:146::o:0;2366:165:7:-;2489:34;2507:4;2513:2;2517:5;2489:17;:34::i;2543:214::-;2676:7;2703:46;2733:4;2739:2;2743:5;2703:29;:46::i;600:200:6:-;-1:-1:-1;;;;;686:21:6;;;710:5;686:21;;;:15;:21;;;;;;:29;;-1:-1:-1;;686:29:6;;;;;;726:19;;;;;;;:26;;;;;686:29;726:26;;;763:29;702:4;742:2;763:19;:29::i;1738:693::-;1883:14;;:29;;;-1:-1:-1;;;1883:29:6;;;;1837:25;;-1:-1:-1;;;;;1883:14:6;;:27;;:29;;;;;;;;;;;;;;:14;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1865:47;;:15;:47;:::i;:::-;1941:8;;1837:75;;-1:-1:-1;;;;1941:8:6;;;;:37;;;;-1:-1:-1;1967:11:6;;-1:-1:-1;;;1967:11:6;;;;1941:37;:68;;;;-1:-1:-1;;;;;;1996:13:6;;;;;;:9;:13;;;;;;;;1941:68;:123;;;;;2049:15;2027:13;;2043:2;2027:18;;;;:::i;:::-;:37;;1941:123;:184;;;;;2102:23;;2081:17;:44;;1941:184;:262;;;;-1:-1:-1;2180:23:6;;2160:14;;-1:-1:-1;;;;;2160:14:6;2142:9;:34;;;;;;;;;;;:61;;1941:262;:311;;;;;2220:14;;;;;;;;;-1:-1:-1;;;;;2220:14:6;-1:-1:-1;;;;;2220:21:6;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;1941:311;1923:456;;;2295:15;2279:13;:31;2329:14;;:27;;;-1:-1:-1;;;2329:27:6;;;;-1:-1:-1;;;;;2329:14:6;;;;:25;;:27;;;;;:14;;:27;;;;;;;;:14;;:27;;;;;;;;;;;;;;;;;;;;;;;;;2325:43;;2389:34;2407:4;2413:2;2417:5;2389:17;:34::i;812:916::-;-1:-1:-1;;;;;998:21:6;;921:7;998:21;;;:15;:21;;;;;;976:5;;998:21;;:30;;;:62;;-1:-1:-1;;;;;;1032:19:6;;;;;;:15;:19;;;;;;;;:28;998:62;:74;;;;-1:-1:-1;1064:8:6;;-1:-1:-1;;;1064:8:6;;;;998:74;994:390;;;-1:-1:-1;;;;;1093:15:6;;;;;;:9;:15;;;;;;;;1089:284;;;1180:14;;:32;;-1:-1:-1;;;1180:32:6;;;;;19172:25:8;;;-1:-1:-1;;;;;1180:14:6;;;;:25;;19145:18:8;;1180:32:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1163:49;;1089:284;;;-1:-1:-1;;;;;1238:13:6;;;;;;:9;:13;;;;;;;;1234:139;;;1324:14;;:33;;-1:-1:-1;;;1324:33:6;;;;;19172:25:8;;;-1:-1:-1;;;;;1324:14:6;;;;:26;;19145:18:8;;1324:33:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1307:50;;1234:139;1396:17;1416:22;1424:14;1416:5;:22;:::i;:::-;1396:42;-1:-1:-1;1453:13:6;;1449:199;;1538:14;;-1:-1:-1;;;;;1538:14:6;1520:9;:34;;;;;;;;;;;:46;;1557:9;;1520:46;:::i;:::-;1501:14;;;-1:-1:-1;;;;;1501:14:6;;;1483:9;:34;;;;;;;;;;;;:83;;;;1609:14;;1586:50;;19172:25:8;;;1609:14:6;;;;1586:50;;;;-1:-1:-1;;;;;;;;;;;1586:50:6;19145:18:8;1586:50:6;;;;;;;1449:199;1665:55;1695:4;1701:2;1705:14;1665:29;:55::i;:::-;1658:62;812:916;-1:-1:-1;;;;;;812:916:6:o;530:190:3:-;-1:-1:-1;;;;;616:16:3;;;635:5;616:16;;;:10;:16;;;;;;;;:24;;-1:-1:-1;;616:24:3;;;;;;651:14;;;;;;;;;:21;;;;-1:-1:-1;651:21:3;;;;;;938:19:1;;;:13;:19;;;;;:27;;;;;;976:17;;;;;;:24;;;;;;;;6998:20:2;;;:14;:20;;;;;;:28;;;;;;7037:18;;;;;:25;;;;;;;;2197:157:7;;:::o;1233:1551:1:-;1340:20;;;;:29;;:62;;-1:-1:-1;1382:10:1;1373:20;;;;:8;:20;;;;;;;;:29;1340:62;1332:90;;;;-1:-1:-1;;;1332:90:1;;17102:2:8;1332:90:1;;;17084:21:8;17141:2;17121:18;;;17114:30;-1:-1:-1;;;17160:18:8;;;17153:45;17215:18;;1332:90:1;16900:339:8;1332:90:1;1447:8;;-1:-1:-1;;;1447:8:1;;;;:25;;;;-1:-1:-1;1467:5:1;;-1:-1:-1;;;;;1459:13:1;;;1467:5;;;;;1459:13;;1447:25;:57;;;;-1:-1:-1;;;;;;1476:19:1;;;;;;:13;:19;;;;;;;;:28;1447:57;:87;;;;-1:-1:-1;;;;;;1508:17:1;;;;;;:13;:17;;;;;;;;:26;1447:87;1443:1279;;;1569:11;;:15;1565:122;;1625:11;;1612:9;:24;;1604:67;;;;-1:-1:-1;;;1604:67:1;;18163:2:8;1604:67:1;;;18145:21:8;18202:2;18182:18;;;18175:30;18241:32;18221:18;;;18214:60;18291:18;;1604:67:1;17961:354:8;1604:67:1;1734:1;1719:12;;:16;:42;;;;-1:-1:-1;;;;;;1739:13:1;;;;;;:9;:13;;;;;;;;:22;1719:42;1715:164;;;1816:10;:8;:10::i;:::-;-1:-1:-1;;;;;1791:13:1;;:9;:13;;;;;;;;;;;:21;;1807:5;;1791:21;:::i;:::-;:35;;1782:81;;;;-1:-1:-1;;;1782:81:1;;10193:2:8;1782:81:1;;;10175:21:8;;;10212:18;;;10205:30;10271:34;10251:18;;;10244:62;10323:18;;1782:81:1;9991:356:8;1782:81:1;1926:1;1911:12;;:16;:33;;;;-1:-1:-1;;;;;;1931:13:1;;;;;;:9;:13;;;;;;;;1911:33;1907:139;;;1983:10;:8;:10::i;:::-;1974:5;:19;;1965:65;;;;-1:-1:-1;;;1965:65:1;;15279:2:8;1965:65:1;;;15261:21:8;;;15298:18;;;15291:30;15357:34;15337:18;;;15330:62;15409:18;;1965:65:1;15077:356:8;1965:65:1;2077:24;;;;;;;2074:635;;;-1:-1:-1;;;;;2126:23:1;;;;;;:19;:23;;;;;;2153:12;2126:39;2122:146;;;-1:-1:-1;;;;;2190:12:1;;;;;;:8;:12;;;;;:19;;-1:-1:-1;;2190:19:1;2205:4;2190:19;;;2232:13;:16;;;;;;:::i;:::-;;;;;;2122:146;-1:-1:-1;;;;;2290:25:1;;;;;;:19;:25;;;;;;2319:12;2290:41;2286:150;;;-1:-1:-1;;;;;2356:14:1;;;;;;:8;:14;;;;;:21;;-1:-1:-1;;2356:21:1;2373:4;2356:21;;;2400:13;:16;;;;;;:::i;:::-;;;;;;2286:150;-1:-1:-1;;;;;2458:13:1;;;;;;:9;:13;;;;;;;;2454:109;;-1:-1:-1;;;;;2505:23:1;;;;;;:19;:23;;;;;2531:12;2505:38;;2454:109;-1:-1:-1;;;;;2585:15:1;;;;;;:9;:15;;;;;;;;2581:113;;-1:-1:-1;;;;;;;2634:25:1;;;;;:19;:25;;;;;2662:12;2634:40;;2710:317:0:o;2796:773:1:-;2970:8;;2905:7;;2950:5;;-1:-1:-1;;;2970:8:1;;;;:34;;;;-1:-1:-1;2982:22:1;;;;;;;2970:34;2966:523;;;3033:5;;-1:-1:-1;;;;;3025:13:1;;;3033:5;;;;;3025:13;;;;:32;;;3056:1;3042:11;:9;:11::i;:::-;:15;3025:32;:64;;;;-1:-1:-1;;;;;;3061:19:1;;;;;;:13;:19;;;;;;;;:28;3025:64;:94;;;;-1:-1:-1;;;;;;3093:17:1;;;;;;:13;:17;;;;;;;;:26;3025:94;3021:457;;;3140:17;3184:5;3169:11;:9;:11::i;:::-;3161:19;;:5;:19;:::i;:::-;3160:29;;;;:::i;:::-;3140:49;-1:-1:-1;3225:26:1;3140:49;3225:14;:26;:::i;:::-;3208:43;-1:-1:-1;3274:13:1;;3270:193;;3357:4;3339:9;:24;;;;;;;;;;;:36;;3366:9;;3339:36;:::i;:::-;3330:4;3312:9;:24;;;;;;;;;;;;:63;;;;3403:40;19172:25:8;;;3330:4:1;;-1:-1:-1;;;;;3403:40:1;;;-1:-1:-1;;;;;;;;;;;3403:40:1;19145:18:8;3403:40:1;;;;;;;3270:193;3121:357;3021:457;3506:55;3536:4;3542:2;3546:14;3506:29;:55::i;:::-;3499:62;2796:773;-1:-1:-1;;;;;2796:773:1:o;6704:205:2:-;6804:7;6840:2;-1:-1:-1;;;;;6832:10:2;:4;-1:-1:-1;;;;;6832:10:2;;;6824:54;;;;-1:-1:-1;;;6824:54:2;;17803:2:8;6824:54:2;;;17785:21:8;17842:2;17822:18;;;17815:30;17881:33;17861:18;;;17854:61;17932:18;;6824:54:2;17601:355:8;6824:54:2;-1:-1:-1;6896:5:2;6704:205;-1:-1:-1;;6704:205:2:o;14:173:8:-;82:20;;-1:-1:-1;;;;;131:31:8;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:719::-;235:5;288:3;281:4;273:6;269:17;265:27;255:55;;306:1;303;296:12;255:55;342:6;329:20;368:18;405:2;401;398:10;395:36;;;411:18;;:::i;:::-;486:2;480:9;454:2;540:13;;-1:-1:-1;;536:22:8;;;560:2;532:31;528:40;516:53;;;584:18;;;604:22;;;581:46;578:72;;;630:18;;:::i;:::-;670:10;666:2;659:22;705:2;697:6;690:18;751:3;744:4;739:2;731:6;727:15;723:26;720:35;717:55;;;768:1;765;758:12;717:55;832:2;825:4;817:6;813:17;806:4;798:6;794:17;781:54;879:1;872:4;867:2;859:6;855:15;851:26;844:37;899:6;890:15;;;;;;192:719;;;;:::o;916:186::-;975:6;1028:2;1016:9;1007:7;1003:23;999:32;996:52;;;1044:1;1041;1034:12;996:52;1067:29;1086:9;1067:29;:::i;:::-;1057:39;916:186;-1:-1:-1;;;916:186:8:o;1107:260::-;1175:6;1183;1236:2;1224:9;1215:7;1211:23;1207:32;1204:52;;;1252:1;1249;1242:12;1204:52;1275:29;1294:9;1275:29;:::i;:::-;1265:39;;1323:38;1357:2;1346:9;1342:18;1323:38;:::i;:::-;1313:48;;1107:260;;;;;:::o;1372:328::-;1449:6;1457;1465;1518:2;1506:9;1497:7;1493:23;1489:32;1486:52;;;1534:1;1531;1524:12;1486:52;1557:29;1576:9;1557:29;:::i;:::-;1547:39;;1605:38;1639:2;1628:9;1624:18;1605:38;:::i;:::-;1595:48;;1690:2;1679:9;1675:18;1662:32;1652:42;;1372:328;;;;;:::o;1705:315::-;1770:6;1778;1831:2;1819:9;1810:7;1806:23;1802:32;1799:52;;;1847:1;1844;1837:12;1799:52;1870:29;1889:9;1870:29;:::i;:::-;1860:39;;1949:2;1938:9;1934:18;1921:32;1962:28;1984:5;1962:28;:::i;:::-;2009:5;1999:15;;;1705:315;;;;;:::o;2025:254::-;2093:6;2101;2154:2;2142:9;2133:7;2129:23;2125:32;2122:52;;;2170:1;2167;2160:12;2122:52;2193:29;2212:9;2193:29;:::i;:::-;2183:39;2269:2;2254:18;;;;2241:32;;-1:-1:-1;;;2025:254:8:o;2284:241::-;2340:6;2393:2;2381:9;2372:7;2368:23;2364:32;2361:52;;;2409:1;2406;2399:12;2361:52;2448:9;2435:23;2467:28;2489:5;2467:28;:::i;2530:245::-;2597:6;2650:2;2638:9;2629:7;2625:23;2621:32;2618:52;;;2666:1;2663;2656:12;2618:52;2698:9;2692:16;2717:28;2739:5;2717:28;:::i;2780:396::-;2858:6;2866;2919:2;2907:9;2898:7;2894:23;2890:32;2887:52;;;2935:1;2932;2925:12;2887:52;2975:9;2962:23;3008:18;3000:6;2997:30;2994:50;;;3040:1;3037;3030:12;2994:50;3063;3105:7;3096:6;3085:9;3081:22;3063:50;:::i;:::-;3053:60;;;3132:38;3166:2;3155:9;3151:18;3132:38;:::i;3181:390::-;3259:6;3267;3320:2;3308:9;3299:7;3295:23;3291:32;3288:52;;;3336:1;3333;3326:12;3288:52;3376:9;3363:23;3409:18;3401:6;3398:30;3395:50;;;3441:1;3438;3431:12;3395:50;3464;3506:7;3497:6;3486:9;3482:22;3464:50;:::i;:::-;3454:60;3561:2;3546:18;;;;3533:32;;-1:-1:-1;;;;3181:390:8:o;3576:180::-;3635:6;3688:2;3676:9;3667:7;3663:23;3659:32;3656:52;;;3704:1;3701;3694:12;3656:52;-1:-1:-1;3727:23:8;;3576:180;-1:-1:-1;3576:180:8:o;3761:184::-;3831:6;3884:2;3872:9;3863:7;3859:23;3855:32;3852:52;;;3900:1;3897;3890:12;3852:52;-1:-1:-1;3923:16:8;;3761:184;-1:-1:-1;3761:184:8:o;3950:248::-;4018:6;4026;4079:2;4067:9;4058:7;4054:23;4050:32;4047:52;;;4095:1;4092;4085:12;4047:52;-1:-1:-1;;4118:23:8;;;4188:2;4173:18;;;4160:32;;-1:-1:-1;3950:248:8:o;4203:472::-;4245:3;4283:5;4277:12;4310:6;4305:3;4298:19;4335:1;4345:162;4359:6;4356:1;4353:13;4345:162;;;4421:4;4477:13;;;4473:22;;4467:29;4449:11;;;4445:20;;4438:59;4374:12;4345:162;;;4525:6;4522:1;4519:13;4516:87;;;4591:1;4584:4;4575:6;4570:3;4566:16;4562:27;4555:38;4516:87;-1:-1:-1;4657:2:8;4636:15;-1:-1:-1;;4632:29:8;4623:39;;;;4664:4;4619:50;;4203:472;-1:-1:-1;;4203:472:8:o;5569:220::-;5718:2;5707:9;5700:21;5681:4;5738:45;5779:2;5768:9;5764:18;5756:6;5738:45;:::i;5794:317::-;5971:2;5960:9;5953:21;5934:4;5991:45;6032:2;6021:9;6017:18;6009:6;5991:45;:::i;:::-;5983:53;;6101:1;6097;6092:3;6088:11;6084:19;6076:6;6072:32;6067:2;6056:9;6052:18;6045:60;5794:317;;;;;:::o;6116:291::-;6293:2;6282:9;6275:21;6256:4;6313:45;6354:2;6343:9;6339:18;6331:6;6313:45;:::i;:::-;6305:53;;6394:6;6389:2;6378:9;6374:18;6367:34;6116:291;;;;;:::o;8868:352::-;9070:2;9052:21;;;9109:2;9089:18;;;9082:30;9148;9143:2;9128:18;;9121:58;9211:2;9196:18;;8868:352::o;10352:343::-;10554:2;10536:21;;;10593:2;10573:18;;;10566:30;-1:-1:-1;;;10627:2:8;10612:18;;10605:49;10686:2;10671:18;;10352:343::o;12191:404::-;12393:2;12375:21;;;12432:2;12412:18;;;12405:30;12471:34;12466:2;12451:18;;12444:62;-1:-1:-1;;;12537:2:8;12522:18;;12515:38;12585:3;12570:19;;12191:404::o;19397:128::-;19437:3;19468:1;19464:6;19461:1;19458:13;19455:39;;;19474:18;;:::i;:::-;-1:-1:-1;19510:9:8;;19397:128::o;19530:217::-;19570:1;19596;19586:132;;19640:10;19635:3;19631:20;19628:1;19621:31;19675:4;19672:1;19665:15;19703:4;19700:1;19693:15;19586:132;-1:-1:-1;19732:9:8;;19530:217::o;19752:168::-;19792:7;19858:1;19854;19850:6;19846:14;19843:1;19840:21;19835:1;19828:9;19821:17;19817:45;19814:71;;;19865:18;;:::i;:::-;-1:-1:-1;19905:9:8;;19752:168::o;19925:125::-;19965:4;19993:1;19990;19987:8;19984:34;;;19998:18;;:::i;:::-;-1:-1:-1;20035:9:8;;19925:125::o;20055:380::-;20134:1;20130:12;;;;20177;;;20198:61;;20252:4;20244:6;20240:17;20230:27;;20198:61;20305:2;20297:6;20294:14;20274:18;20271:38;20268:161;;;20351:10;20346:3;20342:20;20339:1;20332:31;20386:4;20383:1;20376:15;20414:4;20411:1;20404:15;20268:161;;20055:380;;;:::o;20440:135::-;20479:3;-1:-1:-1;;20500:17:8;;20497:43;;;20520:18;;:::i;:::-;-1:-1:-1;20567:1:8;20556:13;;20440:135::o;20580:127::-;20641:10;20636:3;20632:20;20629:1;20622:31;20672:4;20669:1;20662:15;20696:4;20693:1;20686:15;20712:127;20773:10;20768:3;20764:20;20761:1;20754:31;20804:4;20801:1;20794:15;20828:4;20825:1;20818:15;20844:118;20930:5;20923:13;20916:21;20909:5;20906:32;20896:60;;20952:1;20949;20942:12

Swarm Source

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