ETH Price: $3,419.08 (-2.32%)
Gas: 6 Gwei

Token

archangel (ARCHA)
 

Overview

Max Total Supply

100,000,000,000,000,000 ARCHA

Holders

4,642 (0.00%)

Total Transfers

-

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$54,817.20

Circulating Supply Market Cap

$23,195.00

Other Info

Token Contract (WITH 9 Decimals)

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

OVERVIEW

The ArchAngel Token is a crypto asset focused on providing cryptocurrencies and digital assets with innovative solutions that help reduce risk, increase exposure to markets, and expedite global adoption and usage.

Market

Volume (24H):$14.14
Market Capitalization:$23,195.00
Circulating Supply:42,313,110,841,841,100.00 ARCHA
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ARCHA

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 9: ARCHA.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.2;

import "./Context.sol";
import "./Pausable.sol";
import "./Ownable.sol";
import "./IERC20.sol";

// (Uni|Pancake)Swap libs are interchangeable
import "./IUniswapV2Factory.sol";
import "./IUniswapV2Pair.sol";
import "./IUniswapV2Router01.sol";
import "./IUniswapV2Router02.sol";

/*
    For lines that are marked ERC20 Token Standard, learn more at https://eips.ethereum.org/EIPS/eip-20. 
*/
contract ExtendedReflections is IERC20, Ownable, Pausable {

    // Keeps track of balances for address that are included in receiving reward.
    mapping (address => uint256) private _reflectionBalances;

    // Keeps track of balances for address that are excluded from receiving reward.
    mapping (address => uint256) private _tokenBalances;

    // Keeps track of which address are excluded from fee.
    mapping (address => bool) private _isExcludedFromFee;

    // Keeps track of which address are excluded from reward.
    mapping (address => bool) private _isExcludedFromReward;
    
    // An array of addresses that are excluded from reward.
    address[] private _excludedFromReward;

    // ERC20 Token Standard
    mapping (address => mapping (address => uint256)) private _allowances;

    // Liquidity pool provider router
    IUniswapV2Router02 internal _uniswapV2Router;

    // This Token and WETH pair contract.
    IUniswapV2Pair internal _uniswapV2Pair;

    // Where burnt tokens are sent to. This is an address that no one can have accesses to.
    address private constant burnAccount = 0x000000000000000000000000000000000000dEaD;

    address public marketingAddress;
    
    /*
        Tax rate = (_taxXXX / 10**_tax_XXXDecimals) percent.
        For example: if _taxBurn is 1 and _taxBurnDecimals is 2.
        Tax rate = 0.01%

        If you want tax rate for burn to be 5% for example,
        set _taxBurn to 5 and _taxBurnDecimals to 0.
        5 * (10 ** 0) = 5
    */

    // Decimals of taxBurn. Used for have tax less than 1%.
    uint8 private _taxBurnDecimals;

    // Decimals of taxReward. Used for have tax less than 1%.
    uint8 private _taxRewardDecimals;

    // Decimals of taxLiquify. Used for have tax less than 1%.
    uint8 private _taxLiquifyDecimals;

    // Decimals of taxMarketing. Used for have tax less than 1%.
    uint8 private _taxMarketingDecimals;

    // This percent of a transaction will be burnt.
    uint8 private _taxBurn;

    // This percent of a transaction will be redistribute to all holders.
    uint8 private _taxReward;

    // This percent of a transaction will be added to the liquidity pool. More details at https://github.com/Sheldenshi/ERC20Deflationary.
    uint8 private _taxLiquify;

    // This percent of a transaction will be transferred to Marketing wallet.
    uint8 private _taxMarketing; 

    // ERC20 Token Standard
    uint8 private _decimals;

    // ERC20 Token Standard
    uint256 private _totalSupply;

    // Current supply:= total supply - burnt tokens
    uint256 private _currentSupply;

    // A number that helps distributing fees to all holders respectively.
    uint256 private _reflectionTotal;

    // Total amount of tokens rewarded / distributing. 
    uint256 private _totalRewarded;

    // Total amount of tokens burnt.
    uint256 private _totalBurnt;

    // Total amount of tokens locked in the LP (this token and WETH pair).
    uint256 private _totalTokensLockedInLiquidity;

    // Total amount of ETH locked in the LP (this token and WETH pair).
    uint256 private _totalETHLockedInLiquidity;

    // A threshold for swap and liquify.
    uint256 private _minTokensBeforeSwap;

    uint256 private _marketingTokensToSwap;

    // ERC20 Token Standard
    string private _name;
    // ERC20 Token Standard
    string private _symbol;

    // Whether a previous call of SwapAndLiquify process is still in process.
    bool private _inSwapAndLiquify;

    bool private _autoSwapAndLiquifyEnabled;
    bool private _autoBurnEnabled;
    bool private _rewardEnabled;
    bool private _marketingRewardEnabled;
    
    // Prevent reentrancy.
    modifier lockTheSwap {
        require(!_inSwapAndLiquify, "Currently in swap and liquify.");
        _inSwapAndLiquify = true;
        _;
        _inSwapAndLiquify = false;
    }

    // Return values of _getValues function.
    struct ValuesFromAmount {
        // Amount of tokens for to transfer.
        uint256 amount;
        // Amount tokens charged for burning.
        uint256 tBurnFee;
        // Amount tokens charged to reward.
        uint256 tRewardFee;
        // Amount tokens charged to add to liquidity.
        uint256 tLiquifyFee;

        uint256 tMarketingFee;
        // Amount tokens after fees.
        uint256 tTransferAmount;
        // Reflection of amount.
        uint256 rAmount;
        // Reflection of burn fee.
        uint256 rBurnFee;
        // Reflection of reward fee.
        uint256 rRewardFee;
        // Reflection of liquify fee.
        uint256 rLiquifyFee;

        uint256 rMarketingFee;
        // Reflection of transfer amount.
        uint256 rTransferAmount;
    }

    /*
        Events
    */
    event Burn(address from, uint256 amount);
    event TaxBurnUpdate(uint8 previousTax, uint8 previousDecimals, uint8 currentTax, uint8 currentDecimal);
    event TaxRewardUpdate(uint8 previousTax, uint8 previousDecimals, uint8 currentTax, uint8 currentDecimal);
    event TaxLiquifyUpdate(uint8 previousTax, uint8 previousDecimals, uint8 currentTax, uint8 currentDecimal);
    event TaxMarketingUpdate(uint8 previousTax, uint8 previousDecimals, uint8 currentTax, uint8 currentDecimal);
    event MinTokensBeforeSwapUpdated(uint256 previous, uint256 current);
    event MarketingAddressUpdated(address previous, address current);
    event AMMPairUpdated(address pair, bool value);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensAddedToLiquidity
    );
    event ExcludeAccountFromReward(address account);
    event IncludeAccountInReward(address account);
    event ExcludeAccountFromFee(address account);
    event IncludeAccountInFee(address account);
    event EnabledAutoBurn();
    event EnabledReward();
    event EnabledAutoSwapAndLiquify();
    event EnabledMarketingReward();
    event DisabledAutoBurn();
    event DisabledReward();
    event DisabledAutoSwapAndLiquify();
    event DisabledMarketingReward();
    event Airdrop(uint256 amount);
    
    constructor (string memory name_, string memory symbol_, uint8 decimals_, uint256 tokenSupply_) {
        // Sets the values for `name`, `symbol`, `totalSupply`, `currentSupply`, and `rTotal`.
        _name = name_;
        _symbol = symbol_;
        _decimals = decimals_;
        _totalSupply = tokenSupply_ * (10 ** decimals_);
        _currentSupply = _totalSupply;
        _reflectionTotal = (~uint256(0) - (~uint256(0) % _totalSupply));

        // Mint
        _reflectionBalances[_msgSender()] = _reflectionTotal;

        // exclude owner and this contract from fee.
        excludeAccountFromFee(owner());
        excludeAccountFromFee(address(this));

        // exclude owner, burnAccount, and this contract from receiving rewards.
        excludeAccountFromReward(owner());
        excludeAccountFromReward(burnAccount);
        excludeAccountFromReward(address(this));
        
        emit Transfer(address(0), _msgSender(), _totalSupply);
    }

    // allow the contract to receive ETH
    receive() external payable {}

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

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

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return _decimals;
    }

    /**
     * @dev Returns the address of this token and WETH pair.
     */
    function uniswapV2Pair() public view virtual returns (address) {
        return address(_uniswapV2Pair);
    }

    /**
     * @dev Returns the current burn tax.
     */
    function taxBurn() public view virtual returns (uint8) {
        return _taxBurn;
    }

    /**
     * @dev Returns the current reward tax.
     */
    function taxReward() public view virtual returns (uint8) {
        return _taxReward;
    }

    /**
     * @dev Returns the current liquify tax.
     */
    function taxLiquify() public view virtual returns (uint8) {
        return _taxLiquify;
    }

    function taxMarketing() public view virtual returns (uint8) {
        return _taxMarketing;
    }

    /**
     * @dev Returns the current burn tax decimals.
     */
    function taxBurnDecimals() public view virtual returns (uint8) {
        return _taxBurnDecimals;
    }

    /**
     * @dev Returns the current reward tax decimals.
     */
    function taxRewardDecimals() public view virtual returns (uint8) {
        return _taxRewardDecimals;
    }

    /**
     * @dev Returns the current liquify tax decimals.
     */
    function taxLiquifyDecimals() public view virtual returns (uint8) {
        return _taxLiquifyDecimals;
    }

    function taxMarketingDecimals() public view virtual returns (uint8) {
        return _taxMarketingDecimals;
    }

     /**
     * @dev Returns true if auto burn feature is enabled.
     */
    function autoBurnEnabled() public view virtual returns (bool) {
        return _autoBurnEnabled;
    }

    /**
     * @dev Returns true if reward feature is enabled.
     */
    function rewardEnabled() public view virtual returns (bool) {
        return _rewardEnabled;
    }

    /**
     * @dev Returns true if auto swap and liquify feature is enabled.
     */
    function autoSwapAndLiquifyEnabled() public view virtual returns (bool) {
        return _autoSwapAndLiquifyEnabled;
    }


    function marketingRewardEnabled() public view virtual returns (bool) {
        return _marketingRewardEnabled;
    }

    /**
     * @dev Returns the threshold before swap and liquify.
     */
    function minTokensBeforeSwap() external view virtual returns (uint256) {
        return _minTokensBeforeSwap;
    }

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

    /**
     * @dev Returns current supply of the token. 
     * (currentSupply := totalSupply - totalBurnt)
     */
    function currentSupply() external view virtual returns (uint256) {
        return _currentSupply;
    }

    /**
     * @dev Returns the total number of tokens burnt. 
     */
    function totalBurnt() external view virtual returns (uint256) {
        return _totalBurnt;
    }

    /**
     * @dev Returns the total number of tokens locked in the LP.
     */
    function totalTokensLockedInLiquidity() external view virtual returns (uint256) {
        return _totalTokensLockedInLiquidity;
    }

    /**
     * @dev Returns the total number of ETH locked in the LP.
     */
    function totalETHLockedInLiquidity() external view virtual returns (uint256) {
        return _totalETHLockedInLiquidity;
    }

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

    /**
     * @dev Returns whether an account is excluded from reward. 
     */
    function isExcludedFromReward(address account) external view returns (bool) {
        return _isExcludedFromReward[account];
    }

    /**
     * @dev Returns whether an account is excluded from fee. 
     */
    function isExcludedFromFee(address account) external view returns (bool) {
        return _isExcludedFromFee[account];
    }

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        require(_allowances[sender][_msgSender()] >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - amount);
        return true;
    }

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

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

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

        uint256 accountBalance = balanceOf(account);
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");

        uint256 rAmount = _getRAmount(amount);

        // Transfer from account to the burnAccount
        if (_isExcludedFromReward[account]) {
            _tokenBalances[account] -= amount;
        } 
        _reflectionBalances[account] -= rAmount;

        _tokenBalances[burnAccount] += amount;
        _reflectionBalances[burnAccount] += rAmount;

        _currentSupply -= amount;

        _totalBurnt += amount;

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

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

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

        if (sender != owner() && recipient != owner())
            _beforeTokenTransfer(sender);

        bool buying = false;

        if( // BUY
            AMMPairs[sender] &&
            recipient != address(_uniswapV2Router) //pair -> router is changing liquidity
        ) {
            buying = true;
        }

        bool selling = false;

        if ( // SELL
            AMMPairs[recipient] &&
            !_isExcludedFromFee[sender]
        ) {
            require(amount <= getReservePercent(maxSellAmountPercent), "Sell transfer amount exceeds max limit");

            selling = true;
        }

        ValuesFromAmount memory values = _getValues(
            amount,
            !(!_isExcludedFromFee[sender] || (buying && !_isExcludedFromFee[recipient])),
            selling, 
            buying
        );

        if (_isExcludedFromReward[sender] && !_isExcludedFromReward[recipient]) {
            _transferFromExcluded(sender, recipient, values);
        } else if (!_isExcludedFromReward[sender] && _isExcludedFromReward[recipient]) {
            _transferToExcluded(sender, recipient, values);
        } else if (!_isExcludedFromReward[sender] && !_isExcludedFromReward[recipient]) {
            _transferStandard(sender, recipient, values);
        } else if (_isExcludedFromReward[sender] && _isExcludedFromReward[recipient]) {
            _transferBothExcluded(sender, recipient, values);
        } else {
            _transferStandard(sender, recipient, values);
        }

        emit Transfer(sender, recipient, values.tTransferAmount);

        if (!_isExcludedFromFee[sender] || (buying && !_isExcludedFromFee[recipient])) {
            _afterTokenTransfer(values, selling, buying);
        }
    }

    function _beforeTokenTransfer(address sender) internal virtual {
        if (_marketingRewardEnabled && 
            !_inSwapAndLiquify &&
            !AMMPairs[sender]
            ) {
            sendFeeInEthToAddress(marketingAddress, _marketingTokensToSwap);
            _marketingTokensToSwap = 0;
        }

        if (_autoSwapAndLiquifyEnabled) {
            uint256 contractBalance = _tokenBalances[address(this)];

            // whether the current contract balances makes the threshold to swap and liquify.
            bool overMinTokensBeforeSwap = contractBalance >= _minTokensBeforeSwap;

            if (overMinTokensBeforeSwap &&
                !_inSwapAndLiquify &&
                !AMMPairs[sender]
                ) {
                swapAndLiquify(contractBalance);
            }
        }
    }

    /**
      * @dev Performs all the functionalities that are enabled.
      */
    function _afterTokenTransfer(ValuesFromAmount memory values, bool selling, bool buying) internal virtual {
        
        if (buying || selling) {
            if (_autoBurnEnabled) {
                _tokenBalances[address(this)] += values.tBurnFee;
                _reflectionBalances[address(this)] += values.rBurnFee;
                _approve(address(this), _msgSender(), values.tBurnFee);
                burnFrom(address(this), values.tBurnFee);
            }

            if (_marketingRewardEnabled) {
                _tokenBalances[address(this)] += values.tMarketingFee;
                _reflectionBalances[address(this)] += values.rMarketingFee;

                _marketingTokensToSwap += values.tMarketingFee;
            }

            if (_rewardEnabled) {
                _distributeFee(values.rRewardFee, values.tRewardFee);
            }
        }

        if (!buying && selling && values.amount >= getReservePercent(maxSellAmountNormalTax) && values.amount < getReservePercent(maxSellAmountPercent)) {
            if (_autoSwapAndLiquifyEnabled) {
                // add liquidity fee to this contract.
                _tokenBalances[address(this)] += values.tLiquifyFee;
                _reflectionBalances[address(this)] += values.rLiquifyFee;
            }
        }
    }

    /**
     * @dev Performs transfer between two accounts that are both included in receiving reward.
     */
    function _transferStandard(address sender, address recipient, ValuesFromAmount memory values) private {
        
    
        _reflectionBalances[sender] = _reflectionBalances[sender] - values.rAmount;
        _reflectionBalances[recipient] = _reflectionBalances[recipient] + values.rTransferAmount;   

        
    }

    /**
     * @dev Performs transfer from an included account to an excluded account.
     * (included and excluded from receiving reward.)
     */
    function _transferToExcluded(address sender, address recipient, ValuesFromAmount memory values) private {
        
        _reflectionBalances[sender] = _reflectionBalances[sender] - values.rAmount;
        _tokenBalances[recipient] = _tokenBalances[recipient] + values.tTransferAmount;
        _reflectionBalances[recipient] = _reflectionBalances[recipient] + values.rTransferAmount;    

    }

    /**
     * @dev Performs transfer from an excluded account to an included account.
     * (included and excluded from receiving reward.)
     */
    function _transferFromExcluded(address sender, address recipient, ValuesFromAmount memory values) private {
        
        _tokenBalances[sender] = _tokenBalances[sender] - values.amount;
        _reflectionBalances[sender] = _reflectionBalances[sender] - values.rAmount;
        _reflectionBalances[recipient] = _reflectionBalances[recipient] + values.rTransferAmount;   

    }

    /**
     * @dev Performs transfer between two accounts that are both excluded in receiving reward.
     */
    function _transferBothExcluded(address sender, address recipient, ValuesFromAmount memory values) private {

        _tokenBalances[sender] = _tokenBalances[sender] - values.amount;
        _reflectionBalances[sender] = _reflectionBalances[sender] - values.rAmount;
        _tokenBalances[recipient] = _tokenBalances[recipient] + values.tTransferAmount;
        _reflectionBalances[recipient] = _reflectionBalances[recipient] + values.rTransferAmount;        

    }
    
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

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

    /**
      * @dev Excludes an account from receiving reward.
      *
      * Emits a {ExcludeAccountFromReward} event.
      *
      * Requirements:
      *
      * - `account` is included in receiving reward.
      */
    function excludeAccountFromReward(address account) public onlyOwner {
        if(_reflectionBalances[account] > 0) {
            _tokenBalances[account] = tokenFromReflection(_reflectionBalances[account]);
        }
        _isExcludedFromReward[account] = true;
        _excludedFromReward.push(account);
        
        emit ExcludeAccountFromReward(account);
    }

    /**
      * @dev Includes an account from receiving reward.
      *
      * Emits a {IncludeAccountInReward} event.
      *
      * Requirements:
      *
      * - `account` is excluded in receiving reward.
      */
    function includeAccountInReward(address account) public onlyOwner {
        require(_isExcludedFromReward[account], "Account is already included.");

        for (uint256 i = 0; i < _excludedFromReward.length; i++) {
            if (_excludedFromReward[i] == account) {
                _excludedFromReward[i] = _excludedFromReward[_excludedFromReward.length - 1];
                _tokenBalances[account] = 0;
                _isExcludedFromReward[account] = false;
                _excludedFromReward.pop();
                break;
            }
        }

        emit IncludeAccountInReward(account);
    }

     /**
      * @dev Excludes an account from fee.
      *
      * Emits a {ExcludeAccountFromFee} event.
      *
      * Requirements:
      *
      * - `account` is included in fee.
      */
    function excludeAccountFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;

        emit ExcludeAccountFromFee(account);
    }

    /**
      * @dev Includes an account from fee.
      *
      * Emits a {IncludeAccountFromFee} event.
      *
      * Requirements:
      *
      * - `account` is excluded in fee.
      */
    function includeAccountInFee(address account) public onlyOwner {
        require(_isExcludedFromFee[account], "Account is already included.");

        _isExcludedFromFee[account] = false;
        
        emit IncludeAccountInFee(account);
    }

    /**
     * @dev Airdrop tokens to all holders that are included from reward. 
     *  Requirements:
     * - the caller must have a balance of at least `amount`.
     */
    function airdrop(uint256 amount) public whenNotPaused {
        address sender = _msgSender();
        //require(!_isExcludedFromReward[sender], "Excluded addresses cannot call this function");
        require(!isBlacklisted[_msgSender()], "Blacklisted address");
        require(balanceOf(sender) >= amount, "The caller must have balance >= amount.");

        ValuesFromAmount memory values = _getValues(amount, false, false, false);
        if (_isExcludedFromReward[sender]) {
            _tokenBalances[sender] -= values.amount;
        }
        _reflectionBalances[sender] -= values.rAmount;
        
        _reflectionTotal = _reflectionTotal - values.rAmount;
        _totalRewarded += amount;
        emit Airdrop(amount);
    }

    /**
     * @dev Returns the reflected amount of a token.
     *  Requirements:
     * - `amount` must be less than total supply.
     */
    function reflectionFromToken(uint256 amount, bool deductTransferFee, bool selling, bool buying) internal view returns(uint256) {
        require(amount <= _totalSupply, "Amount must be less than supply");
        ValuesFromAmount memory values = _getValues(amount, deductTransferFee, selling, buying);
        return values.rTransferAmount;
    }

    /**
     * @dev Used to figure out the balance after reflection.
     * Requirements:
     * - `rAmount` must be less than reflectTotal.
     */
    function tokenFromReflection(uint256 rAmount) internal view returns(uint256) {
        require(rAmount <= _reflectionTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount / currentRate;
    }

    /**
     * @dev Swap half of contract's token balance for ETH,
     * and pair it up with the other half to add to the
     * liquidity pool.
     *
     * Emits {SwapAndLiquify} event indicating the amount of tokens swapped to eth,
     * the amount of ETH added to the LP, and the amount of tokens added to the LP.
     */
    function swapAndLiquify(uint256 contractBalance) private lockTheSwap {
        // Split the contract balance into two halves.
        uint256 tokensToSwap = contractBalance / 2;
        uint256 tokensAddToLiquidity = contractBalance - tokensToSwap;

        // Contract's current ETH balance.
        uint256 initialBalance = address(this).balance;

        // Swap half of the tokens to ETH.
        swapTokensForEth(tokensToSwap, address(this));

        // Figure out the exact amount of tokens received from swapping.
        uint256 ethAddToLiquify = address(this).balance - initialBalance;

        // Add to the LP of this token and WETH pair (half ETH and half this token).
        addLiquidity(ethAddToLiquify, tokensAddToLiquidity);

        _totalETHLockedInLiquidity += address(this).balance - initialBalance;
        _totalTokensLockedInLiquidity += contractBalance - balanceOf(address(this));

        emit SwapAndLiquify(tokensToSwap, ethAddToLiquify, tokensAddToLiquidity);
    }


    /**
     * @dev Swap `amount` tokens for ETH and send to `to`
     *
     * Emits {Transfer} event. From this contract to the token and WETH Pair.
     */
    function swapTokensForEth(uint256 amount, address to) private {
        // Generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _uniswapV2Router.WETH();

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


        // Swap tokens to ETH
        _uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount, 
            0, 
            path, 
            to,
            block.timestamp + 60 * 1000
            );
    }
    
    /**
     * @dev Add `ethAmount` of ETH and `tokenAmount` of tokens to the LP.
     * Depends on the current rate for the pair between this token and WETH,
     * `ethAmount` and `tokenAmount` might not match perfectly. 
     * Dust(leftover) ETH or token will be refunded to this contract
     * (usually very small quantity).
     *
     * Emits {Transfer} event. From this contract to the token and WETH Pai.
     */
    function addLiquidity(uint256 ethAmount, uint256 tokenAmount) private {
        _approve(address(this), address(_uniswapV2Router), tokenAmount);

        // Add the ETH and token to LP.
        // The LP tokens will be sent to burnAccount.
        // No one will have access to them, so the liquidity will be locked forever.
        _uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this), 
            tokenAmount, 
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            burnAccount, // the LP is sent to burnAccount. 
            block.timestamp + 60 * 1000
        );
    }

    /**
     * @dev Distribute the `tRewardFee` tokens to all holders that are included in receiving reward.
     * amount received is based on how many token one owns.  
     */
    function _distributeFee(uint256 rRewardFee, uint256 tRewardFee) private {
        // This would decrease rate, thus increase amount reward receive based on one's balance.
        _reflectionTotal = _reflectionTotal - rRewardFee;
        _totalRewarded += tRewardFee;
    }
    
    /**
     * @dev Returns fees and transfer amount in both tokens and reflections.
     * tXXXX stands for tokenXXXX
     * rXXXX stands for reflectionXXXX
     * More details can be found at comments for ValuesForAmount Struct.
     */
    function _getValues(uint256 amount, bool deductTransferFee, bool selling, bool buying) private view returns (ValuesFromAmount memory) {
        ValuesFromAmount memory values;
        values.amount = amount;
        _getTValues(values, deductTransferFee, selling, buying);
        _getRValues(values, deductTransferFee, selling, buying);
        return values;
    }

    /**
     * @dev Adds fees and transfer amount in tokens to `values`.
     * tXXXX stands for tokenXXXX
     * More details can be found at comments for ValuesForAmount Struct.
     */
    function _getTValues(ValuesFromAmount memory values, bool deductTransferFee, bool selling, bool buying) view private {
        
        if (deductTransferFee) {
            values.tTransferAmount = values.amount;
        } else {
            // calculate fee
            if (buying || selling) {
                values.tBurnFee = _calculateTax(values.amount, _taxBurn, _taxBurnDecimals);
                values.tMarketingFee = _calculateTax(values.amount, _taxMarketing, _taxMarketingDecimals);
                values.tRewardFee = _calculateTax(values.amount, _taxReward, _taxRewardDecimals);
            }

            if (!buying && selling && values.amount >= getReservePercent(maxSellAmountNormalTax) && values.amount < getReservePercent(maxSellAmountPercent)) {
                values.tLiquifyFee = _calculateTax(values.amount, _taxLiquify, _taxLiquifyDecimals);
            }
            
            // amount after fee
            values.tTransferAmount = values.amount - values.tBurnFee - values.tRewardFee - values.tLiquifyFee - values.tMarketingFee;
        }
        
    }

    /**
     * @dev Adds fees and transfer amount in reflection to `values`.
     * rXXXX stands for reflectionXXXX
     * More details can be found at comments for ValuesForAmount Struct.
     */
    function _getRValues(ValuesFromAmount memory values, bool deductTransferFee, bool selling, bool buying) view private {
        uint256 currentRate = _getRate();

        values.rAmount = values.amount * currentRate;

        if (deductTransferFee) {
            values.rTransferAmount = values.rAmount;
        } else {
            values.rAmount = values.amount * currentRate;

            if (buying || selling) {
                values.rBurnFee = values.tBurnFee * currentRate;
                values.rMarketingFee = values.tMarketingFee * currentRate;
                values.rRewardFee = values.tRewardFee * currentRate;
            }

            if (!buying && selling && values.amount >= getReservePercent(maxSellAmountNormalTax) && values.amount < getReservePercent(maxSellAmountPercent)) {
                values.rLiquifyFee = values.tLiquifyFee * currentRate;
            }

            values.rTransferAmount = values.rAmount - values.rBurnFee - values.rRewardFee - values.rLiquifyFee - values.rMarketingFee;
        }
        
    }

    /**
     * @dev Returns `amount` in reflection.
     */
    function _getRAmount(uint256 amount) private view returns (uint256) {
        uint256 currentRate = _getRate();
        return amount * currentRate;
    }

    /**
     * @dev Returns the current reflection rate.
     */
    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply / tSupply;
    }

    /**
     * @dev Returns the current reflection supply and token supply.
     */
    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _reflectionTotal;
        uint256 tSupply = _totalSupply;      
        for (uint256 i = 0; i < _excludedFromReward.length; i++) {
            if (_reflectionBalances[_excludedFromReward[i]] > rSupply || _tokenBalances[_excludedFromReward[i]] > tSupply) return (_reflectionTotal, _totalSupply);
            rSupply = rSupply - _reflectionBalances[_excludedFromReward[i]];
            tSupply = tSupply - _tokenBalances[_excludedFromReward[i]];
        }
        if (rSupply < _reflectionTotal / _totalSupply) return (_reflectionTotal, _totalSupply);
        return (rSupply, tSupply);
    }

    /**
     * @dev Returns fee based on `amount` and `taxRate`
     */
    function _calculateTax(uint256 amount, uint8 tax, uint8 taxDecimals_) private pure returns (uint256) {
        return amount * tax / (10 ** taxDecimals_) / (10 ** 2);
    }

    /*
        Owner functions
    */

    /**
     * @dev Enables the auto burn feature.
     * Burn transaction amount * `taxBurn_` amount of tokens each transaction when enabled.
     *
     * Emits a {EnabledAutoBurn} event.
     *
     * Requirements:
     *
     * - auto burn feature mush be disabled.
     * - tax must be greater than 0.
     * - tax decimals + 2 must be less than token decimals. 
     * (because tax rate is in percentage)
     */
    function enableAutoBurn(uint8 taxBurn_, uint8 taxBurnDecimals_) public onlyOwner {
        require(!_autoBurnEnabled, "Auto burn feature is already enabled.");
        require(taxBurn_ > 0, "Tax must be greater than 0.");
        require(taxBurnDecimals_ + 2  <= decimals(), "Tax decimals must be less than token decimals - 2");
        
        _autoBurnEnabled = true;
        setTaxBurn(taxBurn_, taxBurnDecimals_);
        
        emit EnabledAutoBurn();
    }

    /**
     * @dev Enables the reward feature.
     * Distribute transaction amount * `taxReward_` amount of tokens each transaction when enabled.
     *
     * Emits a {EnabledReward} event.
     *
     * Requirements:
     *
     * - reward feature mush be disabled.
     * - tax must be greater than 0.
     * - tax decimals + 2 must be less than token decimals. 
     * (because tax rate is in percentage)
    */
    function enableReward(uint8 taxReward_, uint8 taxRewardDecimals_) public onlyOwner {
        require(!_rewardEnabled, "Reward feature is already enabled.");
        require(taxReward_ > 0, "Tax must be greater than 0.");
        require(taxRewardDecimals_ + 2  <= decimals(), "Tax decimals must be less than token decimals - 2");

        _rewardEnabled = true;
        setTaxReward(taxReward_, taxRewardDecimals_);

        emit EnabledReward();
    }

    function initSwap(address routerAddress) public onlyOwner {
        // init Router
        IUniswapV2Router02 uniswapV2Router = IUniswapV2Router02(routerAddress);

        address uniswapV2Pair_ = IUniswapV2Factory(uniswapV2Router.factory()).getPair(address(this), uniswapV2Router.WETH());

        if (uniswapV2Pair_ == address(0)) {
            uniswapV2Pair_ = IUniswapV2Factory(uniswapV2Router.factory())
                .createPair(address(this), uniswapV2Router.WETH());
        }
        
        _uniswapV2Router = uniswapV2Router;
        _uniswapV2Pair = IUniswapV2Pair(uniswapV2Pair_);

        _setAMMPair(uniswapV2Pair_, true);

        // exclude uniswapV2Router from receiving reward.
        excludeAccountFromReward(address(uniswapV2Router));

        // exclude WETH and this Token Pair from receiving reward.
        // excludeAccountFromReward(uniswapV2Pair_);
        // Account already exluded in _setAMMPair

        // exclude uniswapV2Router from paying fees.
        excludeAccountFromFee(address(uniswapV2Router));
        // exclude WETH and this Token Pair from paying fees.
        // excludeAccountFromFee(uniswapV2Pair_);
        // Account already exluded in _setAMMPair
    }

    /**
      * @dev Enables the auto swap and liquify feature.
      * Swaps half of transaction amount * `taxLiquify_` amount of tokens 
      * to ETH and pair with the other half of tokens to the LP each transaction when enabled.
      *
      * Emits a {EnabledAutoSwapAndLiquify} event.
      *
      * Requirements:
      *
      * - auto swap and liquify feature mush be disabled.
      * - tax must be greater than 0.
      * - tax decimals + 2 must be less than token decimals. 
      * (because tax rate is in percentage)
      */
    function enableAutoSwapAndLiquify(uint8 taxLiquify_, uint8 taxLiquifyDecimals_, address routerAddress, uint256 minTokensBeforeSwap_) public onlyOwner {
        require(!_autoSwapAndLiquifyEnabled, "Auto swap and liquify feature is already enabled.");
        require(taxLiquify_ > 0, "Tax must be greater than 0.");
        require(taxLiquifyDecimals_ + 2  <= decimals(), "Tax decimals must be less than token decimals - 2");

        _minTokensBeforeSwap = minTokensBeforeSwap_;

        initSwap(routerAddress);

        // enable
        _autoSwapAndLiquifyEnabled = true;
        setTaxLiquify(taxLiquify_, taxLiquifyDecimals_);
        
        emit EnabledAutoSwapAndLiquify();
    }

    function enableMarketingTax(uint8 taxMarketing_, uint8 taxMarketingDecimals_, address marketingAddress_) public onlyOwner {
        require(!_marketingRewardEnabled, "Marketing tax feature is already enabled.");
        require(taxMarketing_ > 0, "Tax must be greater than 0.");
        require(taxMarketingDecimals_ + 2  <= decimals(), "Tax decimals must be less than token decimals - 2");

        _marketingRewardEnabled = true;
        setMarketingTax(taxMarketing_, taxMarketingDecimals_);
        setMarketingAddress(marketingAddress_);

        emit EnabledMarketingReward();
    }

    /**
     * @dev Disables the auto burn feature.
     *
     * Emits a {DisabledAutoBurn} event.
     *
     * Requirements:
     *
     * - auto burn feature mush be enabled.
     */
    function disableAutoBurn() public onlyOwner {
        require(_autoBurnEnabled, "Auto burn feature is already disabled.");

        setTaxBurn(0, 0);
        _autoBurnEnabled = false;
        
        emit DisabledAutoBurn();
    }

    /**
      * @dev Disables the reward feature.
      *
      * Emits a {DisabledReward} event.
      *
      * Requirements:
      *
      * - reward feature mush be enabled.
      */
    function disableReward() public onlyOwner {
        require(_rewardEnabled, "Reward feature is already disabled.");

        setTaxReward(0, 0);
        _rewardEnabled = false;
        
        emit DisabledReward();
    }

    /**
      * @dev Disables the auto swap and liquify feature.
      *
      * Emits a {DisabledAutoSwapAndLiquify} event.
      *
      * Requirements:
      *
      * - auto swap and liquify feature mush be enabled.
      */
    function disableAutoSwapAndLiquify() public onlyOwner {
        require(_autoSwapAndLiquifyEnabled, "Auto swap and liquify feature is already disabled.");

        setTaxLiquify(0, 0);
        _autoSwapAndLiquifyEnabled = false;
         
        emit DisabledAutoSwapAndLiquify();
    }


    function disableMarketingTax() public onlyOwner {
        require(_marketingRewardEnabled, "Marketing reward feature is already disabled.");

        setMarketingTax(0, 0);
        setMarketingAddress(address(0x0));
        _marketingRewardEnabled = false;
        
        emit DisabledMarketingReward();
    }

     /**
      * @dev Updates `_minTokensBeforeSwap`
      *
      * Emits a {MinTokensBeforeSwap} event.
      *
      * Requirements:
      *
      * - `minTokensBeforeSwap_` must be less than _currentSupply.
      */
    function setMinTokensBeforeSwap(uint256 minTokensBeforeSwap_) public onlyOwner {
        require(minTokensBeforeSwap_ < _currentSupply, "minTokensBeforeSwap must be lower than current supply.");

        uint256 previous = _minTokensBeforeSwap;
        _minTokensBeforeSwap = minTokensBeforeSwap_;

        emit MinTokensBeforeSwapUpdated(previous, _minTokensBeforeSwap);
    }

    /**
      * @dev Updates taxBurn
      *
      * Emits a {TaxBurnUpdate} event.
      *
      * Requirements:
      *
      * - auto burn feature must be enabled.
      * - total tax rate must be less than 100%.
      */
    function setTaxBurn(uint8 taxBurn_, uint8 taxBurnDecimals_) public onlyOwner {
        require(_autoBurnEnabled, "Auto burn feature must be enabled. Try the EnableAutoBurn function.");

        uint8 previousTax = _taxBurn;
        uint8 previousDecimals = _taxBurnDecimals;
        _taxBurn = taxBurn_;
        _taxBurnDecimals = taxBurnDecimals_;

        emit TaxBurnUpdate(previousTax, previousDecimals, taxBurn_, taxBurnDecimals_);
    }

    /**
      * @dev Updates taxReward
      *
      * Emits a {TaxRewardUpdate} event.
      *
      * Requirements:
      *
      * - reward feature must be enabled.
      * - total tax rate must be less than 100%.
      */
    function setTaxReward(uint8 taxReward_, uint8 taxRewardDecimals_) public onlyOwner {
        require(_rewardEnabled, "Reward feature must be enabled. Try the EnableReward function.");

        uint8 previousTax = _taxReward;
        uint8 previousDecimals = _taxRewardDecimals;
        _taxReward = taxReward_;
        _taxRewardDecimals = taxRewardDecimals_;

        emit TaxRewardUpdate(previousTax, previousDecimals, taxReward_, taxRewardDecimals_);
    }

    /**
      * @dev Updates taxLiquify
      *
      * Emits a {TaxLiquifyUpdate} event.
      *
      * Requirements:
      *
      * - auto swap and liquify feature must be enabled.
      * - total tax rate must be less than 100%.
      */
    function setTaxLiquify(uint8 taxLiquify_, uint8 taxLiquifyDecimals_) public onlyOwner {
        require(_autoSwapAndLiquifyEnabled, "Auto swap and liquify feature must be enabled. Try the EnableAutoSwapAndLiquify function.");

        uint8 previousTax = _taxLiquify;
        uint8 previousDecimals = _taxLiquifyDecimals;
        _taxLiquify = taxLiquify_;
        _taxLiquifyDecimals = taxLiquifyDecimals_;

        emit TaxLiquifyUpdate(previousTax, previousDecimals, taxLiquify_, taxLiquifyDecimals_);
    }

    function setMarketingTax(uint8 taxMarketing_, uint8 taxMarketingDecimals_) public onlyOwner {
        require(_marketingRewardEnabled, "Marketing reward feature must be enabled. Try the enableMarketingTax function.");

        uint8 previousTax = _taxMarketing;
        uint8 previousDecimals = _taxMarketingDecimals;
        _taxMarketing = taxMarketing_;
        _taxMarketingDecimals = taxMarketingDecimals_;

        emit TaxMarketingUpdate(previousTax, previousDecimals, taxMarketing_, taxMarketingDecimals_);
    }

    function setMarketingAddress(address marketingAddress_) public onlyOwner {
        require(marketingAddress != marketingAddress_, "New marketing address must be different than old one.");

        address previous = marketingAddress;
        marketingAddress = marketingAddress_;

        emit MarketingAddressUpdated(previous, marketingAddress_);
    }

    // function sendFeeToAddress(address addr, uint256 rAmount, uint256 tAmount) private {
    //     if (_isExcludedFromReward[addr])
    //         _tokenBalances[addr] += tAmount;

    //     _reflectionBalances[addr] += rAmount;
    // }

    function sendFeeInEthToAddress(address addr, uint256 tAmount) private lockTheSwap {
        if (tAmount>0)
            swapTokensForEth(tAmount, addr);
    }

    // ##############
    // Features added
    // ##############

    uint8 public maxSellAmountPercent;
    uint8 public maxSellAmountNormalTax;

    mapping (address => bool) public AMMPairs;

    mapping(address => bool) public isBlacklisted;

    function setAMMPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair(), "The main pair cannot be removed from AMMPairs.");

        _setAMMPair(pair, value);
    }

    function _setAMMPair(address pair, bool value) private {
        AMMPairs[pair] = value;

        if(value) {
            excludeAccountFromReward(pair);
            excludeAccountFromFee(pair);
        }

        emit AMMPairUpdated(pair, value);
    }

    function changeMaxSellAmountPercent(uint8 amount) public onlyOwner {
        maxSellAmountPercent = amount;
    }

    function changeMaxSellAmountNormalTax(uint8 amount) public onlyOwner {
        maxSellAmountNormalTax = amount;
    }

    function getReservePercent(uint8 percent) public view returns (uint256) {
        uint112 reserve;
        if (_uniswapV2Pair.token0() == address(this))
            (reserve,,) = _uniswapV2Pair.getReserves();
        else
            (,reserve,) = _uniswapV2Pair.getReserves();

        return _calculateTax(uint256(reserve), percent, 0);
    }

    function blacklistAddress(address addr, bool value) external onlyOwner {
        isBlacklisted[addr] = value;
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    /**
     * @dev Remember that only owner can call so be careful when use on contracts generated from other contracts.
     * @param tokenAddress The token contract address
     * @param tokenAmount Number of tokens to be sent
     */
    function recoverERC20(address tokenAddress, uint256 tokenAmount) public virtual onlyOwner {
        require(tokenAddress != address(this), "Cannot withdraw this token");
        IERC20(tokenAddress).transfer(owner(), tokenAmount);
    }

    function recoverETH(uint256 ethAmount) public virtual onlyOwner returns (bool success) {
        (success,) = owner().call{value: ethAmount}("");
    }
}

contract ARCHA is ExtendedReflections {

    uint256 private _tokenSupply = 100000000000000000; // 100Q

    uint8 private _taxBurn = 2;
    uint8 private _taxReward = 2;
    uint8 private _taxMarketing = 2;
    uint8 private _taxLiquifyCustom = 25;

    uint8 private _taxDecimals = 0;
    uint8 private _decimals = 9;

    uint8 private _maxSellAmount = 3; // 3% of total liquidity tokens
    uint8 private _maxSellAmountNormalTax = 2; // 2% of total liquidity tokens
    uint256 private _minTokensBeforeSwap = 1; // Cannot be zero

    /**
     * @dev Choose proper router address according to your network:
     * Ethereum: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D (Uniswap)
     * BSC mainnet: 0x10ED43C718714eb63d5aA57B78B54704E256024E (PancakeSwap)
     * BSC testnet: 0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3
     */
    address private _routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    address private _marketingAddress = _msgSender();

    constructor () ExtendedReflections("archangel", "ARCHA", _decimals, _tokenSupply) {
        enableAutoBurn(_taxBurn, _taxDecimals);
        enableReward(_taxReward, _taxDecimals);
        enableMarketingTax(_taxMarketing, _taxDecimals, _marketingAddress);

        changeMaxSellAmountPercent(_maxSellAmount);
        changeMaxSellAmountNormalTax(_maxSellAmountNormalTax);

        enableAutoSwapAndLiquify(_taxLiquifyCustom, _taxDecimals, _routerAddress, _minTokensBeforeSwap);
    }
}

File 2 of 9: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 3 of 9: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 4 of 9: IUniswapV2Factory.sol
pragma solidity >=0.5.0;

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

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

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

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

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

File 5 of 9: IUniswapV2Pair.sol
pragma solidity >=0.5.0;

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

File 6 of 9: IUniswapV2Router01.sol
pragma solidity >=0.6.2;

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

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

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

File 7 of 9: IUniswapV2Router02.sol
pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

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

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

File 8 of 9: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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

File 9 of 9: Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (security/Pausable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"AMMPairUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Airdrop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[],"name":"DisabledAutoBurn","type":"event"},{"anonymous":false,"inputs":[],"name":"DisabledAutoSwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[],"name":"DisabledMarketingReward","type":"event"},{"anonymous":false,"inputs":[],"name":"DisabledReward","type":"event"},{"anonymous":false,"inputs":[],"name":"EnabledAutoBurn","type":"event"},{"anonymous":false,"inputs":[],"name":"EnabledAutoSwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[],"name":"EnabledMarketingReward","type":"event"},{"anonymous":false,"inputs":[],"name":"EnabledReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeAccountFromFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeAccountFromReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"IncludeAccountInFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"IncludeAccountInReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previous","type":"address"},{"indexed":false,"internalType":"address","name":"current","type":"address"}],"name":"MarketingAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensAddedToLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"previousTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"previousDecimals","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"currentTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"currentDecimal","type":"uint8"}],"name":"TaxBurnUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"previousTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"previousDecimals","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"currentTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"currentDecimal","type":"uint8"}],"name":"TaxLiquifyUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"previousTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"previousDecimals","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"currentTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"currentDecimal","type":"uint8"}],"name":"TaxMarketingUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"previousTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"previousDecimals","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"currentTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"currentDecimal","type":"uint8"}],"name":"TaxRewardUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"AMMPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoSwapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"blacklistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"amount","type":"uint8"}],"name":"changeMaxSellAmountNormalTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"amount","type":"uint8"}],"name":"changeMaxSellAmountPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableAutoBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableAutoSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableMarketingTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"taxBurn_","type":"uint8"},{"internalType":"uint8","name":"taxBurnDecimals_","type":"uint8"}],"name":"enableAutoBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"taxLiquify_","type":"uint8"},{"internalType":"uint8","name":"taxLiquifyDecimals_","type":"uint8"},{"internalType":"address","name":"routerAddress","type":"address"},{"internalType":"uint256","name":"minTokensBeforeSwap_","type":"uint256"}],"name":"enableAutoSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"taxMarketing_","type":"uint8"},{"internalType":"uint8","name":"taxMarketingDecimals_","type":"uint8"},{"internalType":"address","name":"marketingAddress_","type":"address"}],"name":"enableMarketingTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"taxReward_","type":"uint8"},{"internalType":"uint8","name":"taxRewardDecimals_","type":"uint8"}],"name":"enableReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeAccountFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeAccountFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"percent","type":"uint8"}],"name":"getReservePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeAccountInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeAccountInReward","outputs":[],"stateMutability":"nonpayable","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":"routerAddress","type":"address"}],"name":"initSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingRewardEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmountNormalTax","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmountPercent","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTokensBeforeSwap","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"recoverETH","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAMMPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"marketingAddress_","type":"address"}],"name":"setMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"taxMarketing_","type":"uint8"},{"internalType":"uint8","name":"taxMarketingDecimals_","type":"uint8"}],"name":"setMarketingTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minTokensBeforeSwap_","type":"uint256"}],"name":"setMinTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"taxBurn_","type":"uint8"},{"internalType":"uint8","name":"taxBurnDecimals_","type":"uint8"}],"name":"setTaxBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"taxLiquify_","type":"uint8"},{"internalType":"uint8","name":"taxLiquifyDecimals_","type":"uint8"}],"name":"setTaxLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"taxReward_","type":"uint8"},{"internalType":"uint8","name":"taxRewardDecimals_","type":"uint8"}],"name":"setTaxReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxBurn","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxBurnDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLiquify","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLiquifyDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxMarketing","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxMarketingDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxReward","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxRewardDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurnt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalETHLockedInLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensLockedInLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405267016345785d8a0000601855601980546702030900190202026001600160401b03199091161790556001601a55601b80546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d17909155601c8054909116331790553480156200007257600080fd5b5060405180604001604052806009815260200168185c98da185b99d95b60ba1b81525060405180604001604052806005815260200164415243484160d81b815250601960059054906101000a900460ff16601854620000e0620000da620002ff60201b60201c565b62000303565b6000805460ff60a01b1916905583516200010290601390602087019062001aee565b5082516200011890601490602086019062001aee565b506009805460ff60e01b1916600160e01b60ff8516021790556200013e82600a62001c49565b6200014a908262001d34565b600a819055600b819055620001629060001962001dcb565b620001709060001962001d56565b600c81905533600090815260016020526040812091909155546200019d906001600160a01b031662000353565b620001a83062000353565b620001c5620001bf6000546001600160a01b031690565b620003fd565b620001d261dead620003fd565b620001dd30620003fd565b600a5460405190815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350506019546200023a925060ff8082169250640100000000909104166200053c565b6019546200025b9060ff6101008204811691640100000000900416620006fe565b601954601c546200028b9160ff62010000820481169264010000000090920416906001600160a01b0316620008c0565b601954620002a6906601000000000000900460ff1662000a97565b601954620002c290670100000000000000900460ff1662000b04565b601954601b54601a54620002f99260ff6301000000820481169364010000000090920416916001600160a01b039091169062000b72565b62001e0e565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b03163314620003a25760405162461bcd60e51b8152602060048201819052602482015260008051602062006f5883398151915260448201526064015b60405180910390fd5b6001600160a01b038116600081815260036020908152604091829020805460ff1916600117905590519182527f7e35d6b74d35c333860340884eeca4e63b18cb9d73ce17a147a1952654365b5e91015b60405180910390a150565b6000546001600160a01b03163314620004485760405162461bcd60e51b8152602060048201819052602482015260008051602062006f58833981519152604482015260640162000399565b6001600160a01b03811660009081526001602052604090205415620004a5576001600160a01b0381166000908152600160205260409020546200048b9062000d4f565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b0381166000818152600460209081526040808320805460ff191660019081179091556005805491820181559093527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090920180546001600160a01b0319168417905590519182527fd29a806ac7ba79249e665eb27435d70121361773ea7475dfedd53faf9537782f9101620003f2565b6000546001600160a01b03163314620005875760405162461bcd60e51b8152602060048201819052602482015260008051602062006f58833981519152604482015260640162000399565b60155462010000900460ff1615620005f05760405162461bcd60e51b815260206004820152602560248201527f4175746f206275726e206665617475726520697320616c726561647920656e61604482015264313632b21760d91b606482015260840162000399565b60008260ff1611620006345760405162461bcd60e51b815260206004820152601b602482015260008051602062006f78833981519152604482015260640162000399565b62000648600954600160e01b900460ff1690565b60ff166200065882600262001bbd565b60ff161115620006b45760405162461bcd60e51b8152602060048201526031602482015260008051602062006f3883398151915260448201527037b5b2b7103232b1b4b6b0b6399016901960791b606482015260840162000399565b6015805462ff0000191662010000179055620006d1828262000dd9565b6040517f1ae0c73021a2d0e597101e249754f53e8496443b3820ba2128b562a9873ad0b190600090a15050565b6000546001600160a01b03163314620007495760405162461bcd60e51b8152602060048201819052602482015260008051602062006f58833981519152604482015260640162000399565b6015546301000000900460ff1615620007b05760405162461bcd60e51b815260206004820152602260248201527f526577617264206665617475726520697320616c726561647920656e61626c65604482015261321760f11b606482015260840162000399565b60008260ff1611620007f45760405162461bcd60e51b815260206004820152601b602482015260008051602062006f78833981519152604482015260640162000399565b62000808600954600160e01b900460ff1690565b60ff166200081882600262001bbd565b60ff161115620008745760405162461bcd60e51b8152602060048201526031602482015260008051602062006f3883398151915260448201527037b5b2b7103232b1b4b6b0b6399016901960791b606482015260840162000399565b6015805463ff0000001916630100000017905562000893828262000f45565b6040517fba4445e1bffa6a2c7f9686f9082addd1cbaf92d402889b0c26dcc2aa101f658e90600090a15050565b6000546001600160a01b031633146200090b5760405162461bcd60e51b8152602060048201819052602482015260008051602062006f58833981519152604482015260640162000399565b601554640100000000900460ff16156200097a5760405162461bcd60e51b815260206004820152602960248201527f4d61726b6574696e6720746178206665617475726520697320616c72656164796044820152681032b730b13632b21760b91b606482015260840162000399565b60008360ff1611620009be5760405162461bcd60e51b815260206004820152601b602482015260008051602062006f78833981519152604482015260640162000399565b620009d2600954600160e01b900460ff1690565b60ff16620009e283600262001bbd565b60ff16111562000a3e5760405162461bcd60e51b8152602060048201526031602482015260008051602062006f3883398151915260448201527037b5b2b7103232b1b4b6b0b6399016901960791b606482015260840162000399565b6015805460ff60201b191664010000000017905562000a5e83836200109d565b62000a69816200120d565b6040517fdff025d7b2c180bfe5a540637f1772af5b3b0b67452af47016be16ea128a58e190600090a1505050565b6000546001600160a01b0316331462000ae25760405162461bcd60e51b8152602060048201819052602482015260008051602062006f58833981519152604482015260640162000399565b6015805460ff909216650100000000000260ff60281b19909216919091179055565b6000546001600160a01b0316331462000b4f5760405162461bcd60e51b8152602060048201819052602482015260008051602062006f58833981519152604482015260640162000399565b6015805460ff90921666010000000000000260ff60301b19909216919091179055565b6000546001600160a01b0316331462000bbd5760405162461bcd60e51b8152602060048201819052602482015260008051602062006f58833981519152604482015260640162000399565b601554610100900460ff161562000c315760405162461bcd60e51b815260206004820152603160248201527f4175746f207377617020616e64206c69717569667920666561747572652069736044820152701030b63932b0b23c9032b730b13632b21760791b606482015260840162000399565b60008460ff161162000c755760405162461bcd60e51b815260206004820152601b602482015260008051602062006f78833981519152604482015260640162000399565b62000c89600954600160e01b900460ff1690565b60ff1662000c9984600262001bbd565b60ff16111562000cf55760405162461bcd60e51b8152602060048201526031602482015260008051602062006f3883398151915260448201527037b5b2b7103232b1b4b6b0b6399016901960791b606482015260840162000399565b601181905562000d058262001340565b6015805461ff00191661010017905562000d208484620016f6565b6040517fa00cf3c70c4ccd1ccc7e6403d8e96dc52e5727f0b30bffb4ea2969689fcb600890600090a150505050565b6000600c5482111562000db85760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b606482015260840162000399565b600062000dc462001872565b905062000dd2818462001be5565b9392505050565b6000546001600160a01b0316331462000e245760405162461bcd60e51b8152602060048201819052602482015260008051602062006f58833981519152604482015260640162000399565b60155462010000900460ff1662000eb05760405162461bcd60e51b815260206004820152604360248201527f4175746f206275726e2066656174757265206d75737420626520656e61626c6560448201527f642e205472792074686520456e61626c654175746f4275726e2066756e63746960648201526237b71760e91b608482015260a40162000399565b6009805460ff838116600160a01b81810260ff60a01b19888516600160c01b8181029290921664ff000000ff60a01b19881617929092179096556040805196860485168088529290950490931660208601819052938501929092526060840152917f7934aea8452d2868336870fe7e0784562b6cf5cf909818ca893be463a9c676ff906080015b60405180910390a150505050565b6000546001600160a01b0316331462000f905760405162461bcd60e51b8152602060048201819052602482015260008051602062006f58833981519152604482015260640162000399565b6015546301000000900460ff16620010115760405162461bcd60e51b815260206004820152603e60248201527f5265776172642066656174757265206d75737420626520656e61626c65642e2060448201527f5472792074686520456e61626c655265776172642066756e6374696f6e2e0000606482015260840162000399565b6009805460ff838116600160a81b81810260ff60a81b19888516600160c81b8181029290921664ff000000ff60a81b19881617929092179096556040805196860485168088529290950490931660208601819052938501929092526060840152917f6c039e29b159adea5dd8b7d9d918df95d17403688c82bbb43cee50f0de301fc09060800162000f37565b6000546001600160a01b03163314620010e85760405162461bcd60e51b8152602060048201819052602482015260008051602062006f58833981519152604482015260640162000399565b601554640100000000900460ff16620011815760405162461bcd60e51b815260206004820152604e60248201527f4d61726b6574696e67207265776172642066656174757265206d75737420626560448201527f20656e61626c65642e205472792074686520656e61626c654d61726b6574696e60648201526d33aa30bc10333ab731ba34b7b71760911b608482015260a40162000399565b6009805460ff838116600160b81b81810260ff60b81b19888516600160d81b8181029290921664ff000000ff60b81b19881617929092179096556040805196860485168088529290950490931660208601819052938501929092526060840152917fdcd2565cfbfcaa83e1e5a9a7cd2984c879780e9b88cf198bff8db620df0f41269060800162000f37565b6000546001600160a01b03163314620012585760405162461bcd60e51b8152602060048201819052602482015260008051602062006f58833981519152604482015260640162000399565b6009546001600160a01b0382811691161415620012de5760405162461bcd60e51b815260206004820152603560248201527f4e6577206d61726b6574696e672061646472657373206d75737420626520646960448201527f66666572656e74207468616e206f6c64206f6e652e0000000000000000000000606482015260840162000399565b600980546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa8efc72ed34f90017df79620d1972d42b8e3b17eb0077fc5fc46cbf1a19ed9a991015b60405180910390a15050565b6000546001600160a01b031633146200138b5760405162461bcd60e51b8152602060048201819052602482015260008051602062006f58833981519152604482015260640162000399565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620013cc57600080fd5b505afa158015620013e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001407919062001b94565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200145057600080fd5b505afa15801562001465573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200148b919062001b94565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b158015620014d257600080fd5b505afa158015620014e7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200150d919062001b94565b90506001600160a01b0381166200169e57816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200155857600080fd5b505afa1580156200156d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001593919062001b94565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620015dc57600080fd5b505afa158015620015f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001617919062001b94565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200166057600080fd5b505af115801562001675573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200169b919062001b94565b90505b600780546001600160a01b038085166001600160a01b0319928316179092556008805492841692909116919091179055620016db81600162001898565b620016e682620003fd565b620016f18262000353565b505050565b6000546001600160a01b03163314620017415760405162461bcd60e51b8152602060048201819052602482015260008051602062006f58833981519152604482015260640162000399565b601554610100900460ff16620017e65760405162461bcd60e51b815260206004820152605960248201527f4175746f207377617020616e64206c6971756966792066656174757265206d7560448201527f737420626520656e61626c65642e205472792074686520456e61626c6541757460648201527f6f53776170416e644c6971756966792066756e6374696f6e2e00000000000000608482015260a40162000399565b6009805460ff838116600160b01b81810260ff60b01b19888516600160d01b8181029290921664ff000000ff60b01b19881617929092179096556040805196860485168088529290950490931660208601819052938501929092526060840152917f4ef9498dae4f4f6d32f12de45f94544890db3c4ed687b86b0774a34dd2de317f9060800162000f37565b60008080620018806200191d565b909250905062001891818362001be5565b9250505090565b6001600160a01b0382166000908152601660205260409020805460ff19168215801591909117909155620018dc57620018d182620003fd565b620018dc8262000353565b604080516001600160a01b038416815282151560208201527f9a05f836a81b64d2d3ee62b752e87947ab26a9fdcd5b2572b1744ae8499b3aac910162001334565b600c54600a546000918291825b60055481101562001ab7578260016000600584815481106200195c57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180620019d75750816002600060058481548110620019b057634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15620019f057600c54600a549450945050505062001aea565b600160006005838154811062001a1657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205462001a47908462001d56565b9250600260006005838154811062001a6f57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205462001aa0908362001d56565b91508062001aae8162001dad565b9150506200192a565b50600a54600c5462001aca919062001be5565b82101562001ae457600c54600a5493509350505062001aea565b90925090505b9091565b82805462001afc9062001d70565b90600052602060002090601f01602090048101928262001b20576000855562001b6b565b82601f1062001b3b57805160ff191683800117855562001b6b565b8280016001018555821562001b6b579182015b8281111562001b6b57825182559160200191906001019062001b4e565b5062001b7992915062001b7d565b5090565b5b8082111562001b79576000815560010162001b7e565b60006020828403121562001ba6578081fd5b81516001600160a01b038116811462000dd2578182fd5b600060ff821660ff84168060ff0382111562001bdd5762001bdd62001de2565b019392505050565b60008262001bf75762001bf762001df8565b500490565b80825b600180861162001c10575062001c40565b81870482111562001c255762001c2562001de2565b8086161562001c3357918102915b9490941c93800262001bff565b94509492505050565b600062000dd260001960ff85168460008262001c685750600162000dd2565b8162001c775750600062000dd2565b816001811462001c90576002811462001c9b5762001ccf565b600191505062000dd2565b60ff84111562001caf5762001caf62001de2565b6001841b91508482111562001cc85762001cc862001de2565b5062000dd2565b5060208310610133831016604e8410600b841016171562001d07575081810a8381111562001d015762001d0162001de2565b62000dd2565b62001d16848484600162001bfc565b80860482111562001d2b5762001d2b62001de2565b02949350505050565b600081600019048311821515161562001d515762001d5162001de2565b500290565b60008282101562001d6b5762001d6b62001de2565b500390565b600181811c9082168062001d8557607f821691505b6020821081141562001da757634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141562001dc45762001dc462001de2565b5060010190565b60008262001ddd5762001ddd62001df8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b61511a8062001e1e6000396000f3fe6080604052600436106104145760003560e01c8063768565571161021e578063a9059cbb11610123578063dea126d5116100ab578063f2fde38b1161007a578063f2fde38b14610c64578063f91f054014610c84578063fa6e3f5414610c99578063fbfa089c14610cb9578063fe575a8714610cd95761041b565b8063dea126d514610bef578063e2314bea14610c0f578063e5d41c6b14610c2f578063ea1c38b214610c445761041b565b8063d3f1e9e6116100f2578063d3f1e9e614610b29578063d42ac37714610b49578063d6b4212b14610b69578063daa9334114610b89578063dd62ed3e14610ba95761041b565b8063a9059cbb14610aa9578063ad8e91dd14610ac9578063ce63672614610ae9578063d333555314610b095761041b565b806395d89b41116101a6578063998acc0e11610175578063998acc0e14610a0a5780639d59962314610a2a5780639dd255da14610a4a578063a457c2d714610a69578063a5ece94114610a895761041b565b806395d89b411461099f578063966ff650146109b457806397dc4a13146109c9578063987f1b75146109e95761041b565b80638456cb59116101ed5780638456cb59146108f357806388f82020146109085780638980f11f146109415780638da5cb5b14610961578063906e9dd01461097f5761041b565b8063768565571461086e578063771282f61461089e57806379cc6790146108b357806383972951146108d35761041b565b80633f4ba83a116103245780635c975abb116102ac5780636840be271161027b5780636840be27146107ef5780636e999d361461080f57806370a0823114610824578063715018a6146108445780637656e146146108595761041b565b80635c975abb1461077a5780636049876e1461079a5780636483ea8b146107ba578063681bdc99146107cf5761041b565b8063470d5cbd116102f3578063470d5cbd146106d35780634895c3e6146106e857806348a464731461070857806349bd5a5e146107285780635342acb41461075a5761041b565b80633f4ba83a1461065e578063409701f81461067357806342966c6814610693578063455a4396146106b35761041b565b80631757354e116103a7578063231adda811610376578063231adda8146105be57806323b872dd146105de5780632d99d32e146105fe578063313ce5671461061e578063395093511461063e5761041b565b80631757354e1461054157806317ee69951461056157806318160ddd146105815780631c303495146105a05761041b565b80630eddf46f116103e35780630eddf46f146104c05780631029de0c146104e157806313f426051461050157806313facdb7146105215761041b565b806301b715311461042057806306fdde0314610457578063095ea7b3146104795780630b60e564146104a95761041b565b3661041b57005b600080fd5b34801561042c57600080fd5b50610440600954600160c01b900460ff1690565b60405160ff90911681526020015b60405180910390f35b34801561046357600080fd5b5061046c610d09565b60405161044e9190614cd4565b34801561048557600080fd5b50610499610494366004614b27565b610d9b565b604051901515815260200161044e565b3480156104b557600080fd5b506104be610db1565b005b3480156104cc57600080fd5b5060155461044090600160281b900460ff1681565b3480156104ed57600080fd5b506104be6104fc366004614c01565b610ea1565b34801561050d57600080fd5b50610440600954600160b81b900460ff1690565b34801561052d57600080fd5b50610440600954600160d01b900460ff1690565b34801561054d57600080fd5b50610499601554600160201b900460ff1690565b34801561056d57600080fd5b506104996015546301000000900460ff1690565b34801561058d57600080fd5b50600a545b60405190815260200161044e565b3480156105ac57600080fd5b50610499601554610100900460ff1690565b3480156105ca57600080fd5b506104be6105d9366004614c4d565b610eed565b3480156105ea57600080fd5b506104996105f9366004614aba565b61103d565b34801561060a57600080fd5b506104be610619366004614afa565b611114565b34801561062a57600080fd5b50610440600954600160e01b900460ff1690565b34801561064a57600080fd5b50610499610659366004614b27565b6111c1565b34801561066a57600080fd5b506104be6111f8565b34801561067f57600080fd5b506104be61068e366004614c01565b61122c565b34801561069f57600080fd5b506104be6106ae366004614bbc565b611279565b3480156106bf57600080fd5b506104be6106ce366004614afa565b611286565b3480156106df57600080fd5b506104be6112db565b3480156106f457600080fd5b506104be610703366004614c1b565b6113ad565b34801561071457600080fd5b506104be610723366004614bbc565b6114eb565b34801561073457600080fd5b506008546001600160a01b03165b6040516001600160a01b03909116815260200161044e565b34801561076657600080fd5b50610499610775366004614a4a565b6115cb565b34801561078657600080fd5b50610499600054600160a01b900460ff1690565b3480156107a657600080fd5b506104be6107b5366004614a4a565b6115ed565b3480156107c657600080fd5b506104be61170e565b3480156107db57600080fd5b506104be6107ea366004614c1b565b6117eb565b3480156107fb57600080fd5b506104be61080a366004614c1b565b611934565b34801561081b57600080fd5b50600f54610592565b34801561083057600080fd5b5061059261083f366004614a4a565b611a7f565b34801561085057600080fd5b506104be611ae7565b34801561086557600080fd5b506104be611b1b565b34801561087a57600080fd5b50610499610889366004614a4a565b60166020526000908152604090205460ff1681565b3480156108aa57600080fd5b50600b54610592565b3480156108bf57600080fd5b506104be6108ce366004614b27565b611bee565b3480156108df57600080fd5b506104be6108ee366004614a4a565b611c76565b3480156108ff57600080fd5b506104be611e9c565b34801561091457600080fd5b50610499610923366004614a4a565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561094d57600080fd5b506104be61095c366004614b27565b611ece565b34801561096d57600080fd5b506000546001600160a01b0316610742565b34801561098b57600080fd5b506104be61099a366004614a4a565b611ff2565b3480156109ab57600080fd5b5061046c6120f2565b3480156109c057600080fd5b50600e54610592565b3480156109d557600080fd5b506104be6109e4366004614bbc565b612101565b3480156109f557600080fd5b5060155461044090600160301b900460ff1681565b348015610a1657600080fd5b506104be610a25366004614c1b565b6122c6565b348015610a3657600080fd5b506104be610a45366004614c88565b612404565b348015610a5657600080fd5b5061049960155462010000900460ff1690565b348015610a7557600080fd5b50610499610a84366004614b27565b61255b565b348015610a9557600080fd5b50600954610742906001600160a01b031681565b348015610ab557600080fd5b50610499610ac4366004614b27565b6125ec565b348015610ad557600080fd5b50610440600954600160a81b900460ff1690565b348015610af557600080fd5b506104be610b04366004614a4a565b6125f9565b348015610b1557600080fd5b50610499610b24366004614bbc565b61296a565b348015610b3557600080fd5b506104be610b44366004614c1b565b6129f9565b348015610b5557600080fd5b50610440600954600160c81b900460ff1690565b348015610b7557600080fd5b506104be610b84366004614a4a565b612b51565b348015610b9557600080fd5b506104be610ba4366004614a4a565b612bcf565b348015610bb557600080fd5b50610592610bc4366004614a82565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b348015610bfb57600080fd5b50610592610c0a366004614c01565b612cb2565b348015610c1b57600080fd5b50610440600954600160d81b900460ff1690565b348015610c3b57600080fd5b50601154610592565b348015610c5057600080fd5b50610440600954600160b01b900460ff1690565b348015610c7057600080fd5b506104be610c7f366004614a4a565b612e85565b348015610c9057600080fd5b50601054610592565b348015610ca557600080fd5b506104be610cb4366004614c1b565b612f1d565b348015610cc557600080fd5b50610440600954600160a01b900460ff1690565b348015610ce557600080fd5b50610499610cf4366004614a4a565b60176020526000908152604090205460ff1681565b606060138054610d1890615055565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4490615055565b8015610d915780601f10610d6657610100808354040283529160200191610d91565b820191906000526020600020905b815481529060010190602001808311610d7457829003601f168201915b5050505050905090565b6000610da8338484613051565b50600192915050565b6000546001600160a01b03163314610de45760405162461bcd60e51b8152600401610ddb90614e06565b60405180910390fd5b601554600160201b900460ff16610e535760405162461bcd60e51b815260206004820152602d60248201527f4d61726b6574696e6720726577617264206665617475726520697320616c726560448201526c30b23c903234b9b0b13632b21760991b6064820152608401610ddb565b610e5e600080611934565b610e686000611ff2565b6015805464ff00000000191690556040517fc006fa0ca84a65d09adbbde41e9930dc143f38f39dfc5fde66f1a18c573243e090600090a1565b6000546001600160a01b03163314610ecb5760405162461bcd60e51b8152600401610ddb90614e06565b6015805460ff909216600160281b0265ff000000000019909216919091179055565b6000546001600160a01b03163314610f175760405162461bcd60e51b8152600401610ddb90614e06565b601554600160201b900460ff1615610f835760405162461bcd60e51b815260206004820152602960248201527f4d61726b6574696e6720746178206665617475726520697320616c72656164796044820152681032b730b13632b21760b91b6064820152608401610ddb565b60008360ff1611610fa65760405162461bcd60e51b8152600401610ddb90614dcf565b610fb9600954600160e01b900460ff1690565b60ff16610fc7836002614ec3565b60ff161115610fe85760405162461bcd60e51b8152600401610ddb90614d7e565b6015805464ff000000001916600160201b1790556110068383611934565b61100f81611ff2565b6040517fdff025d7b2c180bfe5a540637f1772af5b3b0b67452af47016be16ea128a58e190600090a1505050565b600061104a848484613175565b6001600160a01b03841660009081526006602090815260408083203384529091529020548211156110ce5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ddb565b6001600160a01b03841660009081526006602090815260408083203380855292529091205461110991869161110490869061503e565b613051565b5060015b9392505050565b6000546001600160a01b0316331461113e5760405162461bcd60e51b8152600401610ddb90614e06565b6008546001600160a01b03838116911614156111b35760405162461bcd60e51b815260206004820152602e60248201527f546865206d61696e20706169722063616e6e6f742062652072656d6f7665642060448201526d333937b69020a6a6a830b4b9399760911b6064820152608401610ddb565b6111bd8282613660565b5050565b3360008181526006602090815260408083206001600160a01b03871684529091528120549091610da8918590611104908690614eab565b6000546001600160a01b031633146112225760405162461bcd60e51b8152600401610ddb90614e06565b61122a6136df565b565b6000546001600160a01b031633146112565760405162461bcd60e51b8152600401610ddb90614e06565b6015805460ff909216600160301b0266ff00000000000019909216919091179055565b6112833382613782565b50565b6000546001600160a01b031633146112b05760405162461bcd60e51b8152600401610ddb90614e06565b6001600160a01b03919091166000908152601760205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146113055760405162461bcd60e51b8152600401610ddb90614e06565b6015546301000000900460ff1661136a5760405162461bcd60e51b815260206004820152602360248201527f526577617264206665617475726520697320616c72656164792064697361626c60448201526232b21760e91b6064820152608401610ddb565b611375600080612f1d565b6015805463ff000000191690556040517f9843194c3ceed34b5019222853f7806a15e8658437ee2a92d9497af23775eb1c90600090a1565b6000546001600160a01b031633146113d75760405162461bcd60e51b8152600401610ddb90614e06565b60155462010000900460ff161561143e5760405162461bcd60e51b815260206004820152602560248201527f4175746f206275726e206665617475726520697320616c726561647920656e61604482015264313632b21760d91b6064820152608401610ddb565b60008260ff16116114615760405162461bcd60e51b8152600401610ddb90614dcf565b611474600954600160e01b900460ff1690565b60ff16611482826002614ec3565b60ff1611156114a35760405162461bcd60e51b8152600401610ddb90614d7e565b6015805462ff00001916620100001790556114be82826117eb565b6040517f1ae0c73021a2d0e597101e249754f53e8496443b3820ba2128b562a9873ad0b190600090a15050565b6000546001600160a01b031633146115155760405162461bcd60e51b8152600401610ddb90614e06565b600b5481106115855760405162461bcd60e51b815260206004820152603660248201527f6d696e546f6b656e734265666f726553776170206d757374206265206c6f776560448201527539103a3430b71031bab93932b73a1039bab838363c9760511b6064820152608401610ddb565b601180549082905560408051828152602081018490527fd2f58a5c369e86bc74f3b5be6f9a34224ebb43d603f7acee04b07ef21c7d14bf91015b60405180910390a15050565b6001600160a01b03811660009081526003602052604090205460ff165b919050565b6000546001600160a01b031633146116175760405162461bcd60e51b8152600401610ddb90614e06565b6001600160a01b03811660009081526001602052604090205415611671576001600160a01b03811660009081526001602052604090205461165790613a84565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b0381166000818152600460209081526040808320805460ff191660019081179091556005805491820181559093527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090920180546001600160a01b0319168417905590519182527fd29a806ac7ba79249e665eb27435d70121361773ea7475dfedd53faf9537782f91015b60405180910390a150565b6000546001600160a01b031633146117385760405162461bcd60e51b8152600401610ddb90614e06565b601554610100900460ff166117aa5760405162461bcd60e51b815260206004820152603260248201527f4175746f207377617020616e64206c69717569667920666561747572652069736044820152711030b63932b0b23c903234b9b0b13632b21760711b6064820152608401610ddb565b6117b56000806129f9565b6015805461ff00191690556040517f8b81884e0d82e2abd8363cce812b78c588d27387411db0470222a728a917783e90600090a1565b6000546001600160a01b031633146118155760405162461bcd60e51b8152600401610ddb90614e06565b60155462010000900460ff1661189f5760405162461bcd60e51b815260206004820152604360248201527f4175746f206275726e2066656174757265206d75737420626520656e61626c6560448201527f642e205472792074686520456e61626c654175746f4275726e2066756e63746960648201526237b71760e91b608482015260a401610ddb565b6009805460ff838116600160a01b81810260ff60a01b19888516600160c01b8181029290921664ff000000ff60a01b19881617929092179096556040805196860485168088529290950490931660208601819052938501929092526060840152917f7934aea8452d2868336870fe7e0784562b6cf5cf909818ca893be463a9c676ff906080015b60405180910390a150505050565b6000546001600160a01b0316331461195e5760405162461bcd60e51b8152600401610ddb90614e06565b601554600160201b900460ff166119f45760405162461bcd60e51b815260206004820152604e60248201527f4d61726b6574696e67207265776172642066656174757265206d75737420626560448201527f20656e61626c65642e205472792074686520656e61626c654d61726b6574696e60648201526d33aa30bc10333ab731ba34b7b71760911b608482015260a401610ddb565b6009805460ff838116600160b81b81810260ff60b81b19888516600160d81b8181029290921664ff000000ff60b81b19881617929092179096556040805196860485168088529290950490931660208601819052938501929092526060840152917fdcd2565cfbfcaa83e1e5a9a7cd2984c879780e9b88cf198bff8db620df0f412690608001611926565b6001600160a01b03811660009081526004602052604081205460ff1615611abf57506001600160a01b0381166000908152600260205260409020546115e8565b6001600160a01b038216600090815260016020526040902054611ae190613a84565b92915050565b6000546001600160a01b03163314611b115760405162461bcd60e51b8152600401610ddb90614e06565b61122a6000613b01565b6000546001600160a01b03163314611b455760405162461bcd60e51b8152600401610ddb90614e06565b60155462010000900460ff16611bac5760405162461bcd60e51b815260206004820152602660248201527f4175746f206275726e206665617475726520697320616c72656164792064697360448201526530b13632b21760d11b6064820152608401610ddb565b611bb76000806117eb565b6015805462ff0000191690556040517f6d4de23ebf419282b51fea4d5ebe9d980cf43df3f9e8ddde137786adfc2c5d6a90600090a1565b6000611bfa8333610bc4565b905081811015611c585760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610ddb565b611c678333611104858561503e565b611c718383613782565b505050565b6000546001600160a01b03163314611ca05760405162461bcd60e51b8152600401610ddb90614e06565b6001600160a01b03811660009081526004602052604090205460ff16611d085760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c726561647920696e636c756465642e000000006044820152606401610ddb565b60005b600554811015611e6257816001600160a01b031660058281548110611d4057634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415611e505760058054611d6b9060019061503e565b81548110611d8957634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600580546001600160a01b039092169183908110611dc357634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600490925220805460ff191690556005805480611e2957634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b0319169055019055611e62565b80611e5a81615090565b915050611d0b565b506040516001600160a01b03821681527f3c472973bf47231ac50dbcc7af709a6d6d07cd00bdfa49413339bb89386dbea990602001611703565b6000546001600160a01b03163314611ec65760405162461bcd60e51b8152600401610ddb90614e06565b61122a613b51565b6000546001600160a01b03163314611ef85760405162461bcd60e51b8152600401610ddb90614e06565b6001600160a01b038216301415611f515760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74207769746864726177207468697320746f6b656e0000000000006044820152606401610ddb565b816001600160a01b031663a9059cbb611f726000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b158015611fba57600080fd5b505af1158015611fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c719190614b52565b6000546001600160a01b0316331461201c5760405162461bcd60e51b8152600401610ddb90614e06565b6009546001600160a01b03828116911614156120985760405162461bcd60e51b815260206004820152603560248201527f4e6577206d61726b6574696e672061646472657373206d757374206265206469604482015274333332b932b73a103a3430b71037b6321037b7329760591b6064820152608401610ddb565b600980546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa8efc72ed34f90017df79620d1972d42b8e3b17eb0077fc5fc46cbf1a19ed9a991016115bf565b606060148054610d1890615055565b612114600054600160a01b900460ff1690565b156121315760405162461bcd60e51b8152600401610ddb90614d27565b3360008181526017602052604090205460ff16156121615760405162461bcd60e51b8152600401610ddb90614d51565b8161216b82611a7f565b10156121c95760405162461bcd60e51b815260206004820152602760248201527f5468652063616c6c6572206d75737420686176652062616c616e6365203e3d2060448201526630b6b7bab73a1760c91b6064820152608401610ddb565b60006121d9836000806000613bbc565b6001600160a01b03831660009081526004602052604090205490915060ff161561222d5780516001600160a01b0383166000908152600260205260408120805490919061222790849061503e565b90915550505b60c08101516001600160a01b0383166000908152600160205260408120805490919061225a90849061503e565b909155505060c0810151600c54612271919061503e565b600c8190555082600d60008282546122899190614eab565b90915550506040518381527fd0ecdf4854f39daba34ba0e2c1ed0132a7023a5434bffc90b24f3335fb90e5e39060200160405180910390a1505050565b6000546001600160a01b031633146122f05760405162461bcd60e51b8152600401610ddb90614e06565b6015546301000000900460ff16156123555760405162461bcd60e51b815260206004820152602260248201527f526577617264206665617475726520697320616c726561647920656e61626c65604482015261321760f11b6064820152608401610ddb565b60008260ff16116123785760405162461bcd60e51b8152600401610ddb90614dcf565b61238b600954600160e01b900460ff1690565b60ff16612399826002614ec3565b60ff1611156123ba5760405162461bcd60e51b8152600401610ddb90614d7e565b6015805463ff000000191663010000001790556123d78282612f1d565b6040517fba4445e1bffa6a2c7f9686f9082addd1cbaf92d402889b0c26dcc2aa101f658e90600090a15050565b6000546001600160a01b0316331461242e5760405162461bcd60e51b8152600401610ddb90614e06565b601554610100900460ff16156124a05760405162461bcd60e51b815260206004820152603160248201527f4175746f207377617020616e64206c69717569667920666561747572652069736044820152701030b63932b0b23c9032b730b13632b21760791b6064820152608401610ddb565b60008460ff16116124c35760405162461bcd60e51b8152600401610ddb90614dcf565b6124d6600954600160e01b900460ff1690565b60ff166124e4846002614ec3565b60ff1611156125055760405162461bcd60e51b8152600401610ddb90614d7e565b6011819055612513826125f9565b6015805461ff00191661010017905561252c84846129f9565b6040517fa00cf3c70c4ccd1ccc7e6403d8e96dc52e5727f0b30bffb4ea2969689fcb600890600090a150505050565b3360009081526006602090815260408083206001600160a01b0386168452909152812054828110156125dd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ddb565b6111093385611104868561503e565b6000610da8338484613175565b6000546001600160a01b031633146126235760405162461bcd60e51b8152600401610ddb90614e06565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561266357600080fd5b505afa158015612677573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269b9190614a66565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156126e357600080fd5b505afa1580156126f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271b9190614a66565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b15801561276157600080fd5b505afa158015612775573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127999190614a66565b90506001600160a01b03811661291d57816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156127e257600080fd5b505afa1580156127f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281a9190614a66565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561286257600080fd5b505afa158015612876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289a9190614a66565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156128e257600080fd5b505af11580156128f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291a9190614a66565b90505b600780546001600160a01b038085166001600160a01b0319928316179092556008805492841692909116919091179055612958816001613660565b612961826115ed565b611c7182612b51565b600080546001600160a01b031633146129955760405162461bcd60e51b8152600401610ddb90614e06565b6000546001600160a01b03166001600160a01b03168260405160006040518083038185875af1925050503d80600081146129eb576040519150601f19603f3d011682016040523d82523d6000602084013e6129f0565b606091505b50909392505050565b6000546001600160a01b03163314612a235760405162461bcd60e51b8152600401610ddb90614e06565b601554610100900460ff16612ac65760405162461bcd60e51b815260206004820152605960248201527f4175746f207377617020616e64206c6971756966792066656174757265206d7560448201527f737420626520656e61626c65642e205472792074686520456e61626c6541757460648201527f6f53776170416e644c6971756966792066756e6374696f6e2e00000000000000608482015260a401610ddb565b6009805460ff838116600160b01b81810260ff60b01b19888516600160d01b8181029290921664ff000000ff60b01b19881617929092179096556040805196860485168088529290950490931660208601819052938501929092526060840152917f4ef9498dae4f4f6d32f12de45f94544890db3c4ed687b86b0774a34dd2de317f90608001611926565b6000546001600160a01b03163314612b7b5760405162461bcd60e51b8152600401610ddb90614e06565b6001600160a01b038116600081815260036020908152604091829020805460ff1916600117905590519182527f7e35d6b74d35c333860340884eeca4e63b18cb9d73ce17a147a1952654365b5e9101611703565b6000546001600160a01b03163314612bf95760405162461bcd60e51b8152600401610ddb90614e06565b6001600160a01b03811660009081526003602052604090205460ff16612c615760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c726561647920696e636c756465642e000000006044820152606401610ddb565b6001600160a01b038116600081815260036020908152604091829020805460ff1916905590519182527fc782889d4eb26c6effaa6305a7075c22c2a6e2919ddf49a4a851fecf59cfc75f9101611703565b600080306001600160a01b0316600860009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015612d0d57600080fd5b505afa158015612d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d459190614a66565b6001600160a01b03161415612de557600860009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612da257600080fd5b505afa158015612db6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dda9190614b6e565b50909150612e709050565b600860009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612e3357600080fd5b505afa158015612e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e6b9190614b6e565b509150505b61110d816001600160701b0316846000613bf0565b6000546001600160a01b03163314612eaf5760405162461bcd60e51b8152600401610ddb90614e06565b6001600160a01b038116612f145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ddb565b61128381613b01565b6000546001600160a01b03163314612f475760405162461bcd60e51b8152600401610ddb90614e06565b6015546301000000900460ff16612fc65760405162461bcd60e51b815260206004820152603e60248201527f5265776172642066656174757265206d75737420626520656e61626c65642e2060448201527f5472792074686520456e61626c655265776172642066756e6374696f6e2e00006064820152608401610ddb565b6009805460ff838116600160a81b81810260ff60a81b19888516600160c81b8181029290921664ff000000ff60a81b19881617929092179096556040805196860485168088529290950490931660208601819052938501929092526060840152917f6c039e29b159adea5dd8b7d9d918df95d17403688c82bbb43cee50f0de301fc090608001611926565b6001600160a01b0383166130b35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ddb565b6001600160a01b0382166131145760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ddb565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b613188600054600160a01b900460ff1690565b156131a55760405162461bcd60e51b8152600401610ddb90614d27565b6001600160a01b0383166132095760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ddb565b6001600160a01b03821661326b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ddb565b6001600160a01b03831660009081526017602052604090205460ff161580156132ad57506001600160a01b03821660009081526017602052604090205460ff16155b6132c95760405162461bcd60e51b8152600401610ddb90614d51565b6000546001600160a01b038481169116148015906132f557506000546001600160a01b03838116911614155b156133035761330383613c28565b6001600160a01b03831660009081526016602052604081205460ff16801561333957506007546001600160a01b03848116911614155b15613342575060015b6001600160a01b03831660009081526016602052604081205460ff16801561338357506001600160a01b03851660009081526003602052604090205460ff16155b156134005760155461339e90600160281b900460ff16612cb2565b8311156133fc5760405162461bcd60e51b815260206004820152602660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473206d6178604482015265081b1a5b5a5d60d21b6064820152608401610ddb565b5060015b6001600160a01b03851660009081526003602052604081205461345790859060ff16158061344f575084801561344f57506001600160a01b03871660009081526003602052604090205460ff16155b158486613bbc565b6001600160a01b03871660009081526004602052604090205490915060ff16801561349b57506001600160a01b03851660009081526004602052604090205460ff16155b156134b0576134ab868683613cf7565b6135ae565b6001600160a01b03861660009081526004602052604090205460ff161580156134f157506001600160a01b03851660009081526004602052604090205460ff165b15613501576134ab868683613dac565b6001600160a01b03861660009081526004602052604090205460ff1615801561354357506001600160a01b03851660009081526004602052604090205460ff16155b15613553576134ab868683613e49565b6001600160a01b03861660009081526004602052604090205460ff16801561359357506001600160a01b03851660009081526004602052604090205460ff165b156135a3576134ab868683613e71565b6135ae868683613e49565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360a001516040516135f791815260200190565b60405180910390a36001600160a01b03861660009081526003602052604090205460ff161580613648575082801561364857506001600160a01b03851660009081526003602052604090205460ff16155b1561365857613658818385613ecd565b505050505050565b6001600160a01b0382166000908152601660205260409020805460ff1916821580159190911790915561369f57613696826115ed565b61369f82612b51565b604080516001600160a01b038416815282151560208201527f9a05f836a81b64d2d3ee62b752e87947ab26a9fdcd5b2572b1744ae8499b3aac91016115bf565b6136f2600054600160a01b900460ff1690565b6137355760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ddb565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b613795600054600160a01b900460ff1690565b156137b25760405162461bcd60e51b8152600401610ddb90614d27565b6001600160a01b03821661dead14156138175760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865206275726e206164647265736044820152607360f81b6064820152608401610ddb565b6001600160a01b03821660009081526017602052604090205460ff16156138505760405162461bcd60e51b8152600401610ddb90614d51565b600061385b83611a7f565b9050818110156138b85760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610ddb565b60006138c3836140c0565b6001600160a01b03851660009081526004602052604090205490915060ff1615613915576001600160a01b0384166000908152600260205260408120805485929061390f90849061503e565b90915550505b6001600160a01b0384166000908152600160205260408120805483929061393d90849061503e565b909155505061dead600090815260026020527f6a9609baa168169acaea398c4407efea4be641bb08e21e88806d9836fd9333cc8054859290613980908490614eab565b909155505061dead600090815260016020527fb34209a263f6c38fe55f099e9e70f9d67e93982480ff3234a5e0108028ad164d80548392906139c3908490614eab565b9250508190555082600b60008282546139dc919061503e565b9250508190555082600e60008282546139f59190614eab565b9091555050604080516001600160a01b0386168152602081018590527fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5910160405180910390a160405183815261dead906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b6000600c54821115613aeb5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610ddb565b6000613af56140d7565b905061110d8184614ee8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b613b64600054600160a01b900460ff1690565b15613b815760405162461bcd60e51b8152600401610ddb90614d27565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137653390565b613bc46149c1565b613bcc6149c1565b858152613bdb818686866140fa565b613be781868686614259565b95945050505050565b60006064613bff83600a614f4e565b613c0c60ff86168761501f565b613c169190614ee8565b613c209190614ee8565b949350505050565b601554600160201b900460ff168015613c44575060155460ff16155b8015613c6957506001600160a01b03811660009081526016602052604090205460ff16155b15613c8d57600954601254613c87916001600160a01b0316906143ac565b60006012555b601554610100900460ff1615611283573060009081526002602052604090205460115481108015908190613cc4575060155460ff16155b8015613ce957506001600160a01b03831660009081526016602052604090205460ff16155b15611c7157611c718261442a565b80516001600160a01b038416600090815260026020526040902054613d1c919061503e565b6001600160a01b03841660009081526002602090815260408083209390935560c0840151600190915291902054613d53919061503e565b6001600160a01b038085166000908152600160205260408082209390935561016084015191851681529190912054613d8b9190614eab565b6001600160a01b039092166000908152600160205260409020919091555050565b60c08101516001600160a01b038416600090815260016020526040902054613dd4919061503e565b6001600160a01b0380851660009081526001602090815260408083209490945560a08501519286168252600290529190912054613e119190614eab565b6001600160a01b038316600090815260026020908152604080832093909355610160840151600190915291902054613d8b9190614eab565b60c08101516001600160a01b038416600090815260016020526040902054613d53919061503e565b80516001600160a01b038416600090815260026020526040902054613e96919061503e565b6001600160a01b03841660009081526002602090815260408083209390935560c0840151600190915291902054613dd4919061503e565b8080613ed65750815b156140055760155462010000900460ff1615613f5e57602080840151306000908152600290925260408220805491929091613f12908490614eab565b909155505060e08301513060009081526001602052604081208054909190613f3b908490614eab565b90915550613f50905030338560200151613051565b613f5e308460200151611bee565b601554600160201b900460ff1615613fe05760808301513060009081526002602052604081208054909190613f94908490614eab565b90915550506101408301513060009081526001602052604081208054909190613fbe908490614eab565b9091555050608083015160128054600090613fda908490614eab565b90915550505b6015546301000000900460ff1615614005576140058361010001518460400151614566565b801580156140105750815b8015614032575060155461402d90600160301b900460ff16612cb2565b835110155b8015614053575060155461404f90600160281b900460ff16612cb2565b8351105b15611c7157601554610100900460ff1615611c71576060830151306000908152600260205260408120805490919061408c908490614eab565b909155505061012083015130600090815260016020526040812080549091906140b6908490614eab565b9091555050505050565b6000806140cb6140d7565b905061110d818461501f565b60008060006140e4614595565b90925090506140f38183614ee8565b9250505090565b821561410c57835160a0850152614253565b80806141155750815b1561419357835160095461413d919060ff600160c01b8204811691600160a01b900416613bf0565b60208501528351600954614165919060ff600160d81b8204811691600160b81b900416613bf0565b6080850152835160095461418d919060ff600160c81b8204811691600160a81b900416613bf0565b60408501525b8015801561419e5750815b80156141c057506015546141bb90600160301b900460ff16612cb2565b845110155b80156141e157506015546141dd90600160281b900460ff16612cb2565b8451105b1561420f578351600954614209919060ff600160d01b8204811691600160b01b900416613bf0565b60608501525b6080840151606085015160408601516020870151875161422f919061503e565b614239919061503e565b614243919061503e565b61424d919061503e565b60a08501525b50505050565b60006142636140d7565b855190915061427390829061501f565b60c0860152831561428e5760c08501516101608601526143a5565b845161429b90829061501f565b60c086015281806142a95750825b156142f0578085602001516142be919061501f565b60e086015260808501516142d390829061501f565b61014086015260408501516142e990829061501f565b6101008601525b811580156142fb5750825b801561431d575060155461431890600160301b900460ff16612cb2565b855110155b801561433e575060155461433a90600160281b900460ff16612cb2565b8551105b1561435a57808560600151614353919061501f565b6101208601525b8461014001518561012001518661010001518760e001518860c00151614380919061503e565b61438a919061503e565b614394919061503e565b61439e919061503e565b6101608601525b5050505050565b60155460ff16156143ff5760405162461bcd60e51b815260206004820152601e60248201527f43757272656e746c7920696e207377617020616e64206c6971756966792e00006044820152606401610ddb565b6015805460ff19166001179055801561441c5761441c8183614753565b50506015805460ff19169055565b60155460ff161561447d5760405162461bcd60e51b815260206004820152601e60248201527f43757272656e746c7920696e207377617020616e64206c6971756966792e00006044820152606401610ddb565b6015805460ff191660011790556000614497600283614ee8565b905060006144a5828461503e565b9050476144b28330614753565b60006144be824761503e565b90506144ca81846148e2565b6144d4824761503e565b601060008282546144e59190614eab565b909155506144f4905030611a7f565b6144fe908661503e565b600f600082825461450f9190614eab565b909155505060408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506015805460ff19169055505050565b81600c54614574919061503e565b600c8190555080600d600082825461458c9190614eab565b90915550505050565b600c54600a546000918291825b600554811015614720578260016000600584815481106145d257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061464b575081600260006005848154811061462457634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561466257600c54600a549450945050505061474f565b600160006005838154811061468757634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020546146b6908461503e565b925060026000600583815481106146dd57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205461470c908361503e565b91508061471881615090565b9150506145a2565b50600a54600c546147319190614ee8565b82101561474957600c54600a5493509350505061474f565b90925090505b9091565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061479657634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156147ea57600080fd5b505afa1580156147fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148229190614a66565b8160018151811061484357634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526007546148699130911685613051565b6007546001600160a01b031663791ac947846000848661488b4261ea60614eab565b6040518663ffffffff1660e01b81526004016148ab959493929190614e3b565b600060405180830381600087803b1580156148c557600080fd5b505af11580156148d9573d6000803e3d6000fd5b50505050505050565b6007546148fa9030906001600160a01b031683613051565b6007546001600160a01b031663f305d71983308460008061dead6149204261ea60614eab565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c4016060604051808303818588803b15801561498857600080fd5b505af115801561499c573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906143a59190614bd4565b6040518061018001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b80516001600160701b03811681146115e857600080fd5b803560ff811681146115e857600080fd5b600060208284031215614a5b578081fd5b813561110d816150c1565b600060208284031215614a77578081fd5b815161110d816150c1565b60008060408385031215614a94578081fd5b8235614a9f816150c1565b91506020830135614aaf816150c1565b809150509250929050565b600080600060608486031215614ace578081fd5b8335614ad9816150c1565b92506020840135614ae9816150c1565b929592945050506040919091013590565b60008060408385031215614b0c578182fd5b8235614b17816150c1565b91506020830135614aaf816150d6565b60008060408385031215614b39578182fd5b8235614b44816150c1565b946020939093013593505050565b600060208284031215614b63578081fd5b815161110d816150d6565b600080600060608486031215614b82578283fd5b614b8b84614a22565b9250614b9960208501614a22565b9150604084015163ffffffff81168114614bb1578182fd5b809150509250925092565b600060208284031215614bcd578081fd5b5035919050565b600080600060608486031215614be8578283fd5b8351925060208401519150604084015190509250925092565b600060208284031215614c12578081fd5b61110d82614a39565b60008060408385031215614c2d578182fd5b614c3683614a39565b9150614c4460208401614a39565b90509250929050565b600080600060608486031215614c61578283fd5b614c6a84614a39565b9250614c7860208501614a39565b91506040840135614bb1816150c1565b60008060008060808587031215614c9d578182fd5b614ca685614a39565b9350614cb460208601614a39565b92506040850135614cc4816150c1565b9396929550929360600135925050565b6000602080835283518082850152825b81811015614d0057858101830151858201604001528201614ce4565b81811115614d115783604083870101525b50601f01601f1916929092016040019392505050565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b602080825260139082015272426c61636b6c6973746564206164647265737360681b604082015260600190565b60208082526031908201527f54617820646563696d616c73206d757374206265206c657373207468616e207460408201527037b5b2b7103232b1b4b6b0b6399016901960791b606082015260800190565b6020808252601b908201527f546178206d7573742062652067726561746572207468616e20302e0000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015614e8a5784516001600160a01b031683529383019391830191600101614e65565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115614ebe57614ebe6150ab565b500190565b600060ff821660ff84168060ff03821115614ee057614ee06150ab565b019392505050565b600082614f0357634e487b7160e01b81526012600452602481fd5b500490565b80825b6001808611614f1a5750614f45565b818704821115614f2c57614f2c6150ab565b80861615614f3957918102915b9490941c938002614f0b565b94509492505050565b600061110d60001960ff851684600082614f6a5750600161110d565b81614f775750600061110d565b8160018114614f8d5760028114614f9757614fc4565b600191505061110d565b60ff841115614fa857614fa86150ab565b6001841b915084821115614fbe57614fbe6150ab565b5061110d565b5060208310610133831016604e8410600b8410161715614ff7575081810a83811115614ff257614ff26150ab565b61110d565b6150048484846001614f08565b808604821115615016576150166150ab565b02949350505050565b6000816000190483118215151615615039576150396150ab565b500290565b600082821015615050576150506150ab565b500390565b600181811c9082168061506957607f821691505b6020821081141561508a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156150a4576150a46150ab565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461128357600080fd5b801515811461128357600080fdfea2646970667358221220ee05e34ef04a8ad003b0495b6d81d6c4c1fe2c53a6906cc514f14747c9c213f964736f6c6343000803003354617820646563696d616c73206d757374206265206c657373207468616e20744f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572546178206d7573742062652067726561746572207468616e20302e0000000000

Deployed Bytecode

0x6080604052600436106104145760003560e01c8063768565571161021e578063a9059cbb11610123578063dea126d5116100ab578063f2fde38b1161007a578063f2fde38b14610c64578063f91f054014610c84578063fa6e3f5414610c99578063fbfa089c14610cb9578063fe575a8714610cd95761041b565b8063dea126d514610bef578063e2314bea14610c0f578063e5d41c6b14610c2f578063ea1c38b214610c445761041b565b8063d3f1e9e6116100f2578063d3f1e9e614610b29578063d42ac37714610b49578063d6b4212b14610b69578063daa9334114610b89578063dd62ed3e14610ba95761041b565b8063a9059cbb14610aa9578063ad8e91dd14610ac9578063ce63672614610ae9578063d333555314610b095761041b565b806395d89b41116101a6578063998acc0e11610175578063998acc0e14610a0a5780639d59962314610a2a5780639dd255da14610a4a578063a457c2d714610a69578063a5ece94114610a895761041b565b806395d89b411461099f578063966ff650146109b457806397dc4a13146109c9578063987f1b75146109e95761041b565b80638456cb59116101ed5780638456cb59146108f357806388f82020146109085780638980f11f146109415780638da5cb5b14610961578063906e9dd01461097f5761041b565b8063768565571461086e578063771282f61461089e57806379cc6790146108b357806383972951146108d35761041b565b80633f4ba83a116103245780635c975abb116102ac5780636840be271161027b5780636840be27146107ef5780636e999d361461080f57806370a0823114610824578063715018a6146108445780637656e146146108595761041b565b80635c975abb1461077a5780636049876e1461079a5780636483ea8b146107ba578063681bdc99146107cf5761041b565b8063470d5cbd116102f3578063470d5cbd146106d35780634895c3e6146106e857806348a464731461070857806349bd5a5e146107285780635342acb41461075a5761041b565b80633f4ba83a1461065e578063409701f81461067357806342966c6814610693578063455a4396146106b35761041b565b80631757354e116103a7578063231adda811610376578063231adda8146105be57806323b872dd146105de5780632d99d32e146105fe578063313ce5671461061e578063395093511461063e5761041b565b80631757354e1461054157806317ee69951461056157806318160ddd146105815780631c303495146105a05761041b565b80630eddf46f116103e35780630eddf46f146104c05780631029de0c146104e157806313f426051461050157806313facdb7146105215761041b565b806301b715311461042057806306fdde0314610457578063095ea7b3146104795780630b60e564146104a95761041b565b3661041b57005b600080fd5b34801561042c57600080fd5b50610440600954600160c01b900460ff1690565b60405160ff90911681526020015b60405180910390f35b34801561046357600080fd5b5061046c610d09565b60405161044e9190614cd4565b34801561048557600080fd5b50610499610494366004614b27565b610d9b565b604051901515815260200161044e565b3480156104b557600080fd5b506104be610db1565b005b3480156104cc57600080fd5b5060155461044090600160281b900460ff1681565b3480156104ed57600080fd5b506104be6104fc366004614c01565b610ea1565b34801561050d57600080fd5b50610440600954600160b81b900460ff1690565b34801561052d57600080fd5b50610440600954600160d01b900460ff1690565b34801561054d57600080fd5b50610499601554600160201b900460ff1690565b34801561056d57600080fd5b506104996015546301000000900460ff1690565b34801561058d57600080fd5b50600a545b60405190815260200161044e565b3480156105ac57600080fd5b50610499601554610100900460ff1690565b3480156105ca57600080fd5b506104be6105d9366004614c4d565b610eed565b3480156105ea57600080fd5b506104996105f9366004614aba565b61103d565b34801561060a57600080fd5b506104be610619366004614afa565b611114565b34801561062a57600080fd5b50610440600954600160e01b900460ff1690565b34801561064a57600080fd5b50610499610659366004614b27565b6111c1565b34801561066a57600080fd5b506104be6111f8565b34801561067f57600080fd5b506104be61068e366004614c01565b61122c565b34801561069f57600080fd5b506104be6106ae366004614bbc565b611279565b3480156106bf57600080fd5b506104be6106ce366004614afa565b611286565b3480156106df57600080fd5b506104be6112db565b3480156106f457600080fd5b506104be610703366004614c1b565b6113ad565b34801561071457600080fd5b506104be610723366004614bbc565b6114eb565b34801561073457600080fd5b506008546001600160a01b03165b6040516001600160a01b03909116815260200161044e565b34801561076657600080fd5b50610499610775366004614a4a565b6115cb565b34801561078657600080fd5b50610499600054600160a01b900460ff1690565b3480156107a657600080fd5b506104be6107b5366004614a4a565b6115ed565b3480156107c657600080fd5b506104be61170e565b3480156107db57600080fd5b506104be6107ea366004614c1b565b6117eb565b3480156107fb57600080fd5b506104be61080a366004614c1b565b611934565b34801561081b57600080fd5b50600f54610592565b34801561083057600080fd5b5061059261083f366004614a4a565b611a7f565b34801561085057600080fd5b506104be611ae7565b34801561086557600080fd5b506104be611b1b565b34801561087a57600080fd5b50610499610889366004614a4a565b60166020526000908152604090205460ff1681565b3480156108aa57600080fd5b50600b54610592565b3480156108bf57600080fd5b506104be6108ce366004614b27565b611bee565b3480156108df57600080fd5b506104be6108ee366004614a4a565b611c76565b3480156108ff57600080fd5b506104be611e9c565b34801561091457600080fd5b50610499610923366004614a4a565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561094d57600080fd5b506104be61095c366004614b27565b611ece565b34801561096d57600080fd5b506000546001600160a01b0316610742565b34801561098b57600080fd5b506104be61099a366004614a4a565b611ff2565b3480156109ab57600080fd5b5061046c6120f2565b3480156109c057600080fd5b50600e54610592565b3480156109d557600080fd5b506104be6109e4366004614bbc565b612101565b3480156109f557600080fd5b5060155461044090600160301b900460ff1681565b348015610a1657600080fd5b506104be610a25366004614c1b565b6122c6565b348015610a3657600080fd5b506104be610a45366004614c88565b612404565b348015610a5657600080fd5b5061049960155462010000900460ff1690565b348015610a7557600080fd5b50610499610a84366004614b27565b61255b565b348015610a9557600080fd5b50600954610742906001600160a01b031681565b348015610ab557600080fd5b50610499610ac4366004614b27565b6125ec565b348015610ad557600080fd5b50610440600954600160a81b900460ff1690565b348015610af557600080fd5b506104be610b04366004614a4a565b6125f9565b348015610b1557600080fd5b50610499610b24366004614bbc565b61296a565b348015610b3557600080fd5b506104be610b44366004614c1b565b6129f9565b348015610b5557600080fd5b50610440600954600160c81b900460ff1690565b348015610b7557600080fd5b506104be610b84366004614a4a565b612b51565b348015610b9557600080fd5b506104be610ba4366004614a4a565b612bcf565b348015610bb557600080fd5b50610592610bc4366004614a82565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b348015610bfb57600080fd5b50610592610c0a366004614c01565b612cb2565b348015610c1b57600080fd5b50610440600954600160d81b900460ff1690565b348015610c3b57600080fd5b50601154610592565b348015610c5057600080fd5b50610440600954600160b01b900460ff1690565b348015610c7057600080fd5b506104be610c7f366004614a4a565b612e85565b348015610c9057600080fd5b50601054610592565b348015610ca557600080fd5b506104be610cb4366004614c1b565b612f1d565b348015610cc557600080fd5b50610440600954600160a01b900460ff1690565b348015610ce557600080fd5b50610499610cf4366004614a4a565b60176020526000908152604090205460ff1681565b606060138054610d1890615055565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4490615055565b8015610d915780601f10610d6657610100808354040283529160200191610d91565b820191906000526020600020905b815481529060010190602001808311610d7457829003601f168201915b5050505050905090565b6000610da8338484613051565b50600192915050565b6000546001600160a01b03163314610de45760405162461bcd60e51b8152600401610ddb90614e06565b60405180910390fd5b601554600160201b900460ff16610e535760405162461bcd60e51b815260206004820152602d60248201527f4d61726b6574696e6720726577617264206665617475726520697320616c726560448201526c30b23c903234b9b0b13632b21760991b6064820152608401610ddb565b610e5e600080611934565b610e686000611ff2565b6015805464ff00000000191690556040517fc006fa0ca84a65d09adbbde41e9930dc143f38f39dfc5fde66f1a18c573243e090600090a1565b6000546001600160a01b03163314610ecb5760405162461bcd60e51b8152600401610ddb90614e06565b6015805460ff909216600160281b0265ff000000000019909216919091179055565b6000546001600160a01b03163314610f175760405162461bcd60e51b8152600401610ddb90614e06565b601554600160201b900460ff1615610f835760405162461bcd60e51b815260206004820152602960248201527f4d61726b6574696e6720746178206665617475726520697320616c72656164796044820152681032b730b13632b21760b91b6064820152608401610ddb565b60008360ff1611610fa65760405162461bcd60e51b8152600401610ddb90614dcf565b610fb9600954600160e01b900460ff1690565b60ff16610fc7836002614ec3565b60ff161115610fe85760405162461bcd60e51b8152600401610ddb90614d7e565b6015805464ff000000001916600160201b1790556110068383611934565b61100f81611ff2565b6040517fdff025d7b2c180bfe5a540637f1772af5b3b0b67452af47016be16ea128a58e190600090a1505050565b600061104a848484613175565b6001600160a01b03841660009081526006602090815260408083203384529091529020548211156110ce5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ddb565b6001600160a01b03841660009081526006602090815260408083203380855292529091205461110991869161110490869061503e565b613051565b5060015b9392505050565b6000546001600160a01b0316331461113e5760405162461bcd60e51b8152600401610ddb90614e06565b6008546001600160a01b03838116911614156111b35760405162461bcd60e51b815260206004820152602e60248201527f546865206d61696e20706169722063616e6e6f742062652072656d6f7665642060448201526d333937b69020a6a6a830b4b9399760911b6064820152608401610ddb565b6111bd8282613660565b5050565b3360008181526006602090815260408083206001600160a01b03871684529091528120549091610da8918590611104908690614eab565b6000546001600160a01b031633146112225760405162461bcd60e51b8152600401610ddb90614e06565b61122a6136df565b565b6000546001600160a01b031633146112565760405162461bcd60e51b8152600401610ddb90614e06565b6015805460ff909216600160301b0266ff00000000000019909216919091179055565b6112833382613782565b50565b6000546001600160a01b031633146112b05760405162461bcd60e51b8152600401610ddb90614e06565b6001600160a01b03919091166000908152601760205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146113055760405162461bcd60e51b8152600401610ddb90614e06565b6015546301000000900460ff1661136a5760405162461bcd60e51b815260206004820152602360248201527f526577617264206665617475726520697320616c72656164792064697361626c60448201526232b21760e91b6064820152608401610ddb565b611375600080612f1d565b6015805463ff000000191690556040517f9843194c3ceed34b5019222853f7806a15e8658437ee2a92d9497af23775eb1c90600090a1565b6000546001600160a01b031633146113d75760405162461bcd60e51b8152600401610ddb90614e06565b60155462010000900460ff161561143e5760405162461bcd60e51b815260206004820152602560248201527f4175746f206275726e206665617475726520697320616c726561647920656e61604482015264313632b21760d91b6064820152608401610ddb565b60008260ff16116114615760405162461bcd60e51b8152600401610ddb90614dcf565b611474600954600160e01b900460ff1690565b60ff16611482826002614ec3565b60ff1611156114a35760405162461bcd60e51b8152600401610ddb90614d7e565b6015805462ff00001916620100001790556114be82826117eb565b6040517f1ae0c73021a2d0e597101e249754f53e8496443b3820ba2128b562a9873ad0b190600090a15050565b6000546001600160a01b031633146115155760405162461bcd60e51b8152600401610ddb90614e06565b600b5481106115855760405162461bcd60e51b815260206004820152603660248201527f6d696e546f6b656e734265666f726553776170206d757374206265206c6f776560448201527539103a3430b71031bab93932b73a1039bab838363c9760511b6064820152608401610ddb565b601180549082905560408051828152602081018490527fd2f58a5c369e86bc74f3b5be6f9a34224ebb43d603f7acee04b07ef21c7d14bf91015b60405180910390a15050565b6001600160a01b03811660009081526003602052604090205460ff165b919050565b6000546001600160a01b031633146116175760405162461bcd60e51b8152600401610ddb90614e06565b6001600160a01b03811660009081526001602052604090205415611671576001600160a01b03811660009081526001602052604090205461165790613a84565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b0381166000818152600460209081526040808320805460ff191660019081179091556005805491820181559093527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090920180546001600160a01b0319168417905590519182527fd29a806ac7ba79249e665eb27435d70121361773ea7475dfedd53faf9537782f91015b60405180910390a150565b6000546001600160a01b031633146117385760405162461bcd60e51b8152600401610ddb90614e06565b601554610100900460ff166117aa5760405162461bcd60e51b815260206004820152603260248201527f4175746f207377617020616e64206c69717569667920666561747572652069736044820152711030b63932b0b23c903234b9b0b13632b21760711b6064820152608401610ddb565b6117b56000806129f9565b6015805461ff00191690556040517f8b81884e0d82e2abd8363cce812b78c588d27387411db0470222a728a917783e90600090a1565b6000546001600160a01b031633146118155760405162461bcd60e51b8152600401610ddb90614e06565b60155462010000900460ff1661189f5760405162461bcd60e51b815260206004820152604360248201527f4175746f206275726e2066656174757265206d75737420626520656e61626c6560448201527f642e205472792074686520456e61626c654175746f4275726e2066756e63746960648201526237b71760e91b608482015260a401610ddb565b6009805460ff838116600160a01b81810260ff60a01b19888516600160c01b8181029290921664ff000000ff60a01b19881617929092179096556040805196860485168088529290950490931660208601819052938501929092526060840152917f7934aea8452d2868336870fe7e0784562b6cf5cf909818ca893be463a9c676ff906080015b60405180910390a150505050565b6000546001600160a01b0316331461195e5760405162461bcd60e51b8152600401610ddb90614e06565b601554600160201b900460ff166119f45760405162461bcd60e51b815260206004820152604e60248201527f4d61726b6574696e67207265776172642066656174757265206d75737420626560448201527f20656e61626c65642e205472792074686520656e61626c654d61726b6574696e60648201526d33aa30bc10333ab731ba34b7b71760911b608482015260a401610ddb565b6009805460ff838116600160b81b81810260ff60b81b19888516600160d81b8181029290921664ff000000ff60b81b19881617929092179096556040805196860485168088529290950490931660208601819052938501929092526060840152917fdcd2565cfbfcaa83e1e5a9a7cd2984c879780e9b88cf198bff8db620df0f412690608001611926565b6001600160a01b03811660009081526004602052604081205460ff1615611abf57506001600160a01b0381166000908152600260205260409020546115e8565b6001600160a01b038216600090815260016020526040902054611ae190613a84565b92915050565b6000546001600160a01b03163314611b115760405162461bcd60e51b8152600401610ddb90614e06565b61122a6000613b01565b6000546001600160a01b03163314611b455760405162461bcd60e51b8152600401610ddb90614e06565b60155462010000900460ff16611bac5760405162461bcd60e51b815260206004820152602660248201527f4175746f206275726e206665617475726520697320616c72656164792064697360448201526530b13632b21760d11b6064820152608401610ddb565b611bb76000806117eb565b6015805462ff0000191690556040517f6d4de23ebf419282b51fea4d5ebe9d980cf43df3f9e8ddde137786adfc2c5d6a90600090a1565b6000611bfa8333610bc4565b905081811015611c585760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610ddb565b611c678333611104858561503e565b611c718383613782565b505050565b6000546001600160a01b03163314611ca05760405162461bcd60e51b8152600401610ddb90614e06565b6001600160a01b03811660009081526004602052604090205460ff16611d085760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c726561647920696e636c756465642e000000006044820152606401610ddb565b60005b600554811015611e6257816001600160a01b031660058281548110611d4057634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415611e505760058054611d6b9060019061503e565b81548110611d8957634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600580546001600160a01b039092169183908110611dc357634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600490925220805460ff191690556005805480611e2957634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b0319169055019055611e62565b80611e5a81615090565b915050611d0b565b506040516001600160a01b03821681527f3c472973bf47231ac50dbcc7af709a6d6d07cd00bdfa49413339bb89386dbea990602001611703565b6000546001600160a01b03163314611ec65760405162461bcd60e51b8152600401610ddb90614e06565b61122a613b51565b6000546001600160a01b03163314611ef85760405162461bcd60e51b8152600401610ddb90614e06565b6001600160a01b038216301415611f515760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74207769746864726177207468697320746f6b656e0000000000006044820152606401610ddb565b816001600160a01b031663a9059cbb611f726000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b158015611fba57600080fd5b505af1158015611fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c719190614b52565b6000546001600160a01b0316331461201c5760405162461bcd60e51b8152600401610ddb90614e06565b6009546001600160a01b03828116911614156120985760405162461bcd60e51b815260206004820152603560248201527f4e6577206d61726b6574696e672061646472657373206d757374206265206469604482015274333332b932b73a103a3430b71037b6321037b7329760591b6064820152608401610ddb565b600980546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa8efc72ed34f90017df79620d1972d42b8e3b17eb0077fc5fc46cbf1a19ed9a991016115bf565b606060148054610d1890615055565b612114600054600160a01b900460ff1690565b156121315760405162461bcd60e51b8152600401610ddb90614d27565b3360008181526017602052604090205460ff16156121615760405162461bcd60e51b8152600401610ddb90614d51565b8161216b82611a7f565b10156121c95760405162461bcd60e51b815260206004820152602760248201527f5468652063616c6c6572206d75737420686176652062616c616e6365203e3d2060448201526630b6b7bab73a1760c91b6064820152608401610ddb565b60006121d9836000806000613bbc565b6001600160a01b03831660009081526004602052604090205490915060ff161561222d5780516001600160a01b0383166000908152600260205260408120805490919061222790849061503e565b90915550505b60c08101516001600160a01b0383166000908152600160205260408120805490919061225a90849061503e565b909155505060c0810151600c54612271919061503e565b600c8190555082600d60008282546122899190614eab565b90915550506040518381527fd0ecdf4854f39daba34ba0e2c1ed0132a7023a5434bffc90b24f3335fb90e5e39060200160405180910390a1505050565b6000546001600160a01b031633146122f05760405162461bcd60e51b8152600401610ddb90614e06565b6015546301000000900460ff16156123555760405162461bcd60e51b815260206004820152602260248201527f526577617264206665617475726520697320616c726561647920656e61626c65604482015261321760f11b6064820152608401610ddb565b60008260ff16116123785760405162461bcd60e51b8152600401610ddb90614dcf565b61238b600954600160e01b900460ff1690565b60ff16612399826002614ec3565b60ff1611156123ba5760405162461bcd60e51b8152600401610ddb90614d7e565b6015805463ff000000191663010000001790556123d78282612f1d565b6040517fba4445e1bffa6a2c7f9686f9082addd1cbaf92d402889b0c26dcc2aa101f658e90600090a15050565b6000546001600160a01b0316331461242e5760405162461bcd60e51b8152600401610ddb90614e06565b601554610100900460ff16156124a05760405162461bcd60e51b815260206004820152603160248201527f4175746f207377617020616e64206c69717569667920666561747572652069736044820152701030b63932b0b23c9032b730b13632b21760791b6064820152608401610ddb565b60008460ff16116124c35760405162461bcd60e51b8152600401610ddb90614dcf565b6124d6600954600160e01b900460ff1690565b60ff166124e4846002614ec3565b60ff1611156125055760405162461bcd60e51b8152600401610ddb90614d7e565b6011819055612513826125f9565b6015805461ff00191661010017905561252c84846129f9565b6040517fa00cf3c70c4ccd1ccc7e6403d8e96dc52e5727f0b30bffb4ea2969689fcb600890600090a150505050565b3360009081526006602090815260408083206001600160a01b0386168452909152812054828110156125dd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ddb565b6111093385611104868561503e565b6000610da8338484613175565b6000546001600160a01b031633146126235760405162461bcd60e51b8152600401610ddb90614e06565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561266357600080fd5b505afa158015612677573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269b9190614a66565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156126e357600080fd5b505afa1580156126f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271b9190614a66565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b15801561276157600080fd5b505afa158015612775573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127999190614a66565b90506001600160a01b03811661291d57816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156127e257600080fd5b505afa1580156127f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281a9190614a66565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561286257600080fd5b505afa158015612876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289a9190614a66565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156128e257600080fd5b505af11580156128f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291a9190614a66565b90505b600780546001600160a01b038085166001600160a01b0319928316179092556008805492841692909116919091179055612958816001613660565b612961826115ed565b611c7182612b51565b600080546001600160a01b031633146129955760405162461bcd60e51b8152600401610ddb90614e06565b6000546001600160a01b03166001600160a01b03168260405160006040518083038185875af1925050503d80600081146129eb576040519150601f19603f3d011682016040523d82523d6000602084013e6129f0565b606091505b50909392505050565b6000546001600160a01b03163314612a235760405162461bcd60e51b8152600401610ddb90614e06565b601554610100900460ff16612ac65760405162461bcd60e51b815260206004820152605960248201527f4175746f207377617020616e64206c6971756966792066656174757265206d7560448201527f737420626520656e61626c65642e205472792074686520456e61626c6541757460648201527f6f53776170416e644c6971756966792066756e6374696f6e2e00000000000000608482015260a401610ddb565b6009805460ff838116600160b01b81810260ff60b01b19888516600160d01b8181029290921664ff000000ff60b01b19881617929092179096556040805196860485168088529290950490931660208601819052938501929092526060840152917f4ef9498dae4f4f6d32f12de45f94544890db3c4ed687b86b0774a34dd2de317f90608001611926565b6000546001600160a01b03163314612b7b5760405162461bcd60e51b8152600401610ddb90614e06565b6001600160a01b038116600081815260036020908152604091829020805460ff1916600117905590519182527f7e35d6b74d35c333860340884eeca4e63b18cb9d73ce17a147a1952654365b5e9101611703565b6000546001600160a01b03163314612bf95760405162461bcd60e51b8152600401610ddb90614e06565b6001600160a01b03811660009081526003602052604090205460ff16612c615760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c726561647920696e636c756465642e000000006044820152606401610ddb565b6001600160a01b038116600081815260036020908152604091829020805460ff1916905590519182527fc782889d4eb26c6effaa6305a7075c22c2a6e2919ddf49a4a851fecf59cfc75f9101611703565b600080306001600160a01b0316600860009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015612d0d57600080fd5b505afa158015612d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d459190614a66565b6001600160a01b03161415612de557600860009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612da257600080fd5b505afa158015612db6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dda9190614b6e565b50909150612e709050565b600860009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612e3357600080fd5b505afa158015612e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e6b9190614b6e565b509150505b61110d816001600160701b0316846000613bf0565b6000546001600160a01b03163314612eaf5760405162461bcd60e51b8152600401610ddb90614e06565b6001600160a01b038116612f145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ddb565b61128381613b01565b6000546001600160a01b03163314612f475760405162461bcd60e51b8152600401610ddb90614e06565b6015546301000000900460ff16612fc65760405162461bcd60e51b815260206004820152603e60248201527f5265776172642066656174757265206d75737420626520656e61626c65642e2060448201527f5472792074686520456e61626c655265776172642066756e6374696f6e2e00006064820152608401610ddb565b6009805460ff838116600160a81b81810260ff60a81b19888516600160c81b8181029290921664ff000000ff60a81b19881617929092179096556040805196860485168088529290950490931660208601819052938501929092526060840152917f6c039e29b159adea5dd8b7d9d918df95d17403688c82bbb43cee50f0de301fc090608001611926565b6001600160a01b0383166130b35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ddb565b6001600160a01b0382166131145760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ddb565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b613188600054600160a01b900460ff1690565b156131a55760405162461bcd60e51b8152600401610ddb90614d27565b6001600160a01b0383166132095760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ddb565b6001600160a01b03821661326b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ddb565b6001600160a01b03831660009081526017602052604090205460ff161580156132ad57506001600160a01b03821660009081526017602052604090205460ff16155b6132c95760405162461bcd60e51b8152600401610ddb90614d51565b6000546001600160a01b038481169116148015906132f557506000546001600160a01b03838116911614155b156133035761330383613c28565b6001600160a01b03831660009081526016602052604081205460ff16801561333957506007546001600160a01b03848116911614155b15613342575060015b6001600160a01b03831660009081526016602052604081205460ff16801561338357506001600160a01b03851660009081526003602052604090205460ff16155b156134005760155461339e90600160281b900460ff16612cb2565b8311156133fc5760405162461bcd60e51b815260206004820152602660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473206d6178604482015265081b1a5b5a5d60d21b6064820152608401610ddb565b5060015b6001600160a01b03851660009081526003602052604081205461345790859060ff16158061344f575084801561344f57506001600160a01b03871660009081526003602052604090205460ff16155b158486613bbc565b6001600160a01b03871660009081526004602052604090205490915060ff16801561349b57506001600160a01b03851660009081526004602052604090205460ff16155b156134b0576134ab868683613cf7565b6135ae565b6001600160a01b03861660009081526004602052604090205460ff161580156134f157506001600160a01b03851660009081526004602052604090205460ff165b15613501576134ab868683613dac565b6001600160a01b03861660009081526004602052604090205460ff1615801561354357506001600160a01b03851660009081526004602052604090205460ff16155b15613553576134ab868683613e49565b6001600160a01b03861660009081526004602052604090205460ff16801561359357506001600160a01b03851660009081526004602052604090205460ff165b156135a3576134ab868683613e71565b6135ae868683613e49565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360a001516040516135f791815260200190565b60405180910390a36001600160a01b03861660009081526003602052604090205460ff161580613648575082801561364857506001600160a01b03851660009081526003602052604090205460ff16155b1561365857613658818385613ecd565b505050505050565b6001600160a01b0382166000908152601660205260409020805460ff1916821580159190911790915561369f57613696826115ed565b61369f82612b51565b604080516001600160a01b038416815282151560208201527f9a05f836a81b64d2d3ee62b752e87947ab26a9fdcd5b2572b1744ae8499b3aac91016115bf565b6136f2600054600160a01b900460ff1690565b6137355760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ddb565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b613795600054600160a01b900460ff1690565b156137b25760405162461bcd60e51b8152600401610ddb90614d27565b6001600160a01b03821661dead14156138175760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865206275726e206164647265736044820152607360f81b6064820152608401610ddb565b6001600160a01b03821660009081526017602052604090205460ff16156138505760405162461bcd60e51b8152600401610ddb90614d51565b600061385b83611a7f565b9050818110156138b85760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610ddb565b60006138c3836140c0565b6001600160a01b03851660009081526004602052604090205490915060ff1615613915576001600160a01b0384166000908152600260205260408120805485929061390f90849061503e565b90915550505b6001600160a01b0384166000908152600160205260408120805483929061393d90849061503e565b909155505061dead600090815260026020527f6a9609baa168169acaea398c4407efea4be641bb08e21e88806d9836fd9333cc8054859290613980908490614eab565b909155505061dead600090815260016020527fb34209a263f6c38fe55f099e9e70f9d67e93982480ff3234a5e0108028ad164d80548392906139c3908490614eab565b9250508190555082600b60008282546139dc919061503e565b9250508190555082600e60008282546139f59190614eab565b9091555050604080516001600160a01b0386168152602081018590527fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5910160405180910390a160405183815261dead906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b6000600c54821115613aeb5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610ddb565b6000613af56140d7565b905061110d8184614ee8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b613b64600054600160a01b900460ff1690565b15613b815760405162461bcd60e51b8152600401610ddb90614d27565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137653390565b613bc46149c1565b613bcc6149c1565b858152613bdb818686866140fa565b613be781868686614259565b95945050505050565b60006064613bff83600a614f4e565b613c0c60ff86168761501f565b613c169190614ee8565b613c209190614ee8565b949350505050565b601554600160201b900460ff168015613c44575060155460ff16155b8015613c6957506001600160a01b03811660009081526016602052604090205460ff16155b15613c8d57600954601254613c87916001600160a01b0316906143ac565b60006012555b601554610100900460ff1615611283573060009081526002602052604090205460115481108015908190613cc4575060155460ff16155b8015613ce957506001600160a01b03831660009081526016602052604090205460ff16155b15611c7157611c718261442a565b80516001600160a01b038416600090815260026020526040902054613d1c919061503e565b6001600160a01b03841660009081526002602090815260408083209390935560c0840151600190915291902054613d53919061503e565b6001600160a01b038085166000908152600160205260408082209390935561016084015191851681529190912054613d8b9190614eab565b6001600160a01b039092166000908152600160205260409020919091555050565b60c08101516001600160a01b038416600090815260016020526040902054613dd4919061503e565b6001600160a01b0380851660009081526001602090815260408083209490945560a08501519286168252600290529190912054613e119190614eab565b6001600160a01b038316600090815260026020908152604080832093909355610160840151600190915291902054613d8b9190614eab565b60c08101516001600160a01b038416600090815260016020526040902054613d53919061503e565b80516001600160a01b038416600090815260026020526040902054613e96919061503e565b6001600160a01b03841660009081526002602090815260408083209390935560c0840151600190915291902054613dd4919061503e565b8080613ed65750815b156140055760155462010000900460ff1615613f5e57602080840151306000908152600290925260408220805491929091613f12908490614eab565b909155505060e08301513060009081526001602052604081208054909190613f3b908490614eab565b90915550613f50905030338560200151613051565b613f5e308460200151611bee565b601554600160201b900460ff1615613fe05760808301513060009081526002602052604081208054909190613f94908490614eab565b90915550506101408301513060009081526001602052604081208054909190613fbe908490614eab565b9091555050608083015160128054600090613fda908490614eab565b90915550505b6015546301000000900460ff1615614005576140058361010001518460400151614566565b801580156140105750815b8015614032575060155461402d90600160301b900460ff16612cb2565b835110155b8015614053575060155461404f90600160281b900460ff16612cb2565b8351105b15611c7157601554610100900460ff1615611c71576060830151306000908152600260205260408120805490919061408c908490614eab565b909155505061012083015130600090815260016020526040812080549091906140b6908490614eab565b9091555050505050565b6000806140cb6140d7565b905061110d818461501f565b60008060006140e4614595565b90925090506140f38183614ee8565b9250505090565b821561410c57835160a0850152614253565b80806141155750815b1561419357835160095461413d919060ff600160c01b8204811691600160a01b900416613bf0565b60208501528351600954614165919060ff600160d81b8204811691600160b81b900416613bf0565b6080850152835160095461418d919060ff600160c81b8204811691600160a81b900416613bf0565b60408501525b8015801561419e5750815b80156141c057506015546141bb90600160301b900460ff16612cb2565b845110155b80156141e157506015546141dd90600160281b900460ff16612cb2565b8451105b1561420f578351600954614209919060ff600160d01b8204811691600160b01b900416613bf0565b60608501525b6080840151606085015160408601516020870151875161422f919061503e565b614239919061503e565b614243919061503e565b61424d919061503e565b60a08501525b50505050565b60006142636140d7565b855190915061427390829061501f565b60c0860152831561428e5760c08501516101608601526143a5565b845161429b90829061501f565b60c086015281806142a95750825b156142f0578085602001516142be919061501f565b60e086015260808501516142d390829061501f565b61014086015260408501516142e990829061501f565b6101008601525b811580156142fb5750825b801561431d575060155461431890600160301b900460ff16612cb2565b855110155b801561433e575060155461433a90600160281b900460ff16612cb2565b8551105b1561435a57808560600151614353919061501f565b6101208601525b8461014001518561012001518661010001518760e001518860c00151614380919061503e565b61438a919061503e565b614394919061503e565b61439e919061503e565b6101608601525b5050505050565b60155460ff16156143ff5760405162461bcd60e51b815260206004820152601e60248201527f43757272656e746c7920696e207377617020616e64206c6971756966792e00006044820152606401610ddb565b6015805460ff19166001179055801561441c5761441c8183614753565b50506015805460ff19169055565b60155460ff161561447d5760405162461bcd60e51b815260206004820152601e60248201527f43757272656e746c7920696e207377617020616e64206c6971756966792e00006044820152606401610ddb565b6015805460ff191660011790556000614497600283614ee8565b905060006144a5828461503e565b9050476144b28330614753565b60006144be824761503e565b90506144ca81846148e2565b6144d4824761503e565b601060008282546144e59190614eab565b909155506144f4905030611a7f565b6144fe908661503e565b600f600082825461450f9190614eab565b909155505060408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506015805460ff19169055505050565b81600c54614574919061503e565b600c8190555080600d600082825461458c9190614eab565b90915550505050565b600c54600a546000918291825b600554811015614720578260016000600584815481106145d257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061464b575081600260006005848154811061462457634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561466257600c54600a549450945050505061474f565b600160006005838154811061468757634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020546146b6908461503e565b925060026000600583815481106146dd57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205461470c908361503e565b91508061471881615090565b9150506145a2565b50600a54600c546147319190614ee8565b82101561474957600c54600a5493509350505061474f565b90925090505b9091565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061479657634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156147ea57600080fd5b505afa1580156147fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148229190614a66565b8160018151811061484357634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526007546148699130911685613051565b6007546001600160a01b031663791ac947846000848661488b4261ea60614eab565b6040518663ffffffff1660e01b81526004016148ab959493929190614e3b565b600060405180830381600087803b1580156148c557600080fd5b505af11580156148d9573d6000803e3d6000fd5b50505050505050565b6007546148fa9030906001600160a01b031683613051565b6007546001600160a01b031663f305d71983308460008061dead6149204261ea60614eab565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c4016060604051808303818588803b15801561498857600080fd5b505af115801561499c573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906143a59190614bd4565b6040518061018001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b80516001600160701b03811681146115e857600080fd5b803560ff811681146115e857600080fd5b600060208284031215614a5b578081fd5b813561110d816150c1565b600060208284031215614a77578081fd5b815161110d816150c1565b60008060408385031215614a94578081fd5b8235614a9f816150c1565b91506020830135614aaf816150c1565b809150509250929050565b600080600060608486031215614ace578081fd5b8335614ad9816150c1565b92506020840135614ae9816150c1565b929592945050506040919091013590565b60008060408385031215614b0c578182fd5b8235614b17816150c1565b91506020830135614aaf816150d6565b60008060408385031215614b39578182fd5b8235614b44816150c1565b946020939093013593505050565b600060208284031215614b63578081fd5b815161110d816150d6565b600080600060608486031215614b82578283fd5b614b8b84614a22565b9250614b9960208501614a22565b9150604084015163ffffffff81168114614bb1578182fd5b809150509250925092565b600060208284031215614bcd578081fd5b5035919050565b600080600060608486031215614be8578283fd5b8351925060208401519150604084015190509250925092565b600060208284031215614c12578081fd5b61110d82614a39565b60008060408385031215614c2d578182fd5b614c3683614a39565b9150614c4460208401614a39565b90509250929050565b600080600060608486031215614c61578283fd5b614c6a84614a39565b9250614c7860208501614a39565b91506040840135614bb1816150c1565b60008060008060808587031215614c9d578182fd5b614ca685614a39565b9350614cb460208601614a39565b92506040850135614cc4816150c1565b9396929550929360600135925050565b6000602080835283518082850152825b81811015614d0057858101830151858201604001528201614ce4565b81811115614d115783604083870101525b50601f01601f1916929092016040019392505050565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b602080825260139082015272426c61636b6c6973746564206164647265737360681b604082015260600190565b60208082526031908201527f54617820646563696d616c73206d757374206265206c657373207468616e207460408201527037b5b2b7103232b1b4b6b0b6399016901960791b606082015260800190565b6020808252601b908201527f546178206d7573742062652067726561746572207468616e20302e0000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015614e8a5784516001600160a01b031683529383019391830191600101614e65565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115614ebe57614ebe6150ab565b500190565b600060ff821660ff84168060ff03821115614ee057614ee06150ab565b019392505050565b600082614f0357634e487b7160e01b81526012600452602481fd5b500490565b80825b6001808611614f1a5750614f45565b818704821115614f2c57614f2c6150ab565b80861615614f3957918102915b9490941c938002614f0b565b94509492505050565b600061110d60001960ff851684600082614f6a5750600161110d565b81614f775750600061110d565b8160018114614f8d5760028114614f9757614fc4565b600191505061110d565b60ff841115614fa857614fa86150ab565b6001841b915084821115614fbe57614fbe6150ab565b5061110d565b5060208310610133831016604e8410600b8410161715614ff7575081810a83811115614ff257614ff26150ab565b61110d565b6150048484846001614f08565b808604821115615016576150166150ab565b02949350505050565b6000816000190483118215151615615039576150396150ab565b500290565b600082821015615050576150506150ab565b500390565b600181811c9082168061506957607f821691505b6020821081141561508a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156150a4576150a46150ab565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461128357600080fd5b801515811461128357600080fdfea2646970667358221220ee05e34ef04a8ad003b0495b6d81d6c4c1fe2c53a6906cc514f14747c9c213f964736f6c63430008030033

Deployed Bytecode Sourcemap

50347:1455:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8671:87;;;;;;;;;;;;8743:8;;-1:-1:-1;;;8743:8:0;;;;;8671:87;;;;24668:4:9;24656:17;;;24638:36;;24626:2;24611:18;8671:87:0;;;;;;;;7590:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;13165:166::-;;;;;;;;;;-1:-1:-1;13165:166:0;;;;;:::i;:::-;;:::i;:::-;;;7157:14:9;;7150:22;7132:41;;7120:2;7105:18;13165:166:0;7087:92:9;43821:311:0;;;;;;;;;;;;;:::i;:::-;;48222:33;;;;;;;;;;-1:-1:-1;48222:33:0;;;;-1:-1:-1;;;48222:33:0;;;;;;48865:113;;;;;;;;;;-1:-1:-1;48865:113:0;;;;;:::i;:::-;;:::i;9727:::-;;;;;;;;;;;;9812:21;;-1:-1:-1;;;9812:21:0;;;;;9727:113;8982:93;;;;;;;;;;;;9057:11;;-1:-1:-1;;;9057:11:0;;;;;8982:93;10419:116;;;;;;;;;;;;10505:23;;-1:-1:-1;;;10505:23:0;;;;;10419:116;10100:98;;;;;;;;;;;;10177:14;;;;;;;;10100:98;10791:108;;;;;;;;;;-1:-1:-1;10880:12:0;;10791:108;;;22895:25:9;;;22883:2;22868:18;10791:108:0;22850:76:9;10290:122:0;;;;;;;;;;;;10379:26;;;;;;;;10290:122;41865:588;;;;;;;;;;-1:-1:-1;41865:588:0;;;;;:::i;:::-;;:::i;13798:376::-;;;;;;;;;;-1:-1:-1;13798:376:0;;;;;:::i;:::-;;:::i;48403:197::-;;;;;;;;;;-1:-1:-1;48403:197:0;;;;;:::i;:::-;;:::i;8325:89::-;;;;;;;;;;;;8398:9;;-1:-1:-1;;;8398:9:0;;;;;8325:89;14569:212;;;;;;;;;;-1:-1:-1;14569:212:0;;;;;:::i;:::-;;:::i;49643:63::-;;;;;;;;;;;;;:::i;48984:117::-;;;;;;;;;;-1:-1:-1;48984:117:0;;;;;:::i;:::-;;:::i;24621:89::-;;;;;;;;;;-1:-1:-1;24621:89:0;;;;;:::i;:::-;;:::i;49457:115::-;;;;;;;;;;-1:-1:-1;49457:115:0;;;;;:::i;:::-;;:::i;43070:222::-;;;;;;;;;;;;;:::i;38066:465::-;;;;;;;;;;-1:-1:-1;38066:465:0;;;;;:::i;:::-;;:::i;44358:377::-;;;;;;;;;;-1:-1:-1;44358:377:0;;;;;:::i;:::-;;:::i;8497:110::-;;;;;;;;;;-1:-1:-1;8585:14:0;;-1:-1:-1;;;;;8585:14:0;8497:110;;;-1:-1:-1;;;;;5459:32:9;;;5441:51;;5429:2;5414:18;8497:110:0;5396:102:9;12321:124:0;;;;;;;;;;-1:-1:-1;12321:124:0;;;;;:::i;:::-;;:::i;1091:84:8:-;;;;;;;;;;;;1138:4;1161:7;-1:-1:-1;;;1161:7:8;;;;;1091:84;25571:368:0;;;;;;;;;;-1:-1:-1;25571:368:0;;;;;:::i;:::-;;:::i;43527:287::-;;;;;;;;;;;;;:::i;44966:442::-;;;;;;;;;;-1:-1:-1;44966:442:0;;;;;:::i;:::-;;:::i;46864:520::-;;;;;;;;;;-1:-1:-1;46864:520:0;;;;;:::i;:::-;;:::i;11386:133::-;;;;;;;;;;-1:-1:-1;11483:29:0;;11386:133;;11788:232;;;;;;;;;;-1:-1:-1;11788:232:0;;;;;:::i;:::-;;:::i;1661:101:7:-;;;;;;;;;;;;;:::i;42646:231:0:-;;;;;;;;;;;;;:::i;48303:41::-;;;;;;;;;;-1:-1:-1;48303:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;11022:103;;;;;;;;;;-1:-1:-1;11104:14:0;;11022:103;;25016:327;;;;;;;;;;-1:-1:-1;25016:327:0;;;;;:::i;:::-;;:::i;26165:607::-;;;;;;;;;;-1:-1:-1;26165:607:0;;;;;:::i;:::-;;:::i;49578:59::-;;;;;;;;;;;;;:::i;12107:130::-;;;;;;;;;;-1:-1:-1;12107:130:0;;;;;:::i;:::-;-1:-1:-1;;;;;12200:30:0;12177:4;12200:30;;;:21;:30;;;;;;;;;12107:130;49950:236;;;;;;;;;;-1:-1:-1;49950:236:0;;;;;:::i;:::-;;:::i;1029:85:7:-;;;;;;;;;;-1:-1:-1;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;1029:85;;47390:353:0;;;;;;;;;;-1:-1:-1;47390:353:0;;;;;:::i;:::-;;:::i;7792:93::-;;;;;;;;;;;;;:::i;11202:97::-;;;;;;;;;;-1:-1:-1;11281:11:0;;11202:97;;27759:739;;;;;;;;;;-1:-1:-1;27759:739:0;;;;;:::i;:::-;;:::i;48261:35::-;;;;;;;;;;-1:-1:-1;48261:35:0;;;;-1:-1:-1;;;48261:35:0;;;;;;38955:452;;;;;;;;;;-1:-1:-1;38955:452:0;;;;;:::i;:::-;;:::i;41170:689::-;;;;;;;;;;-1:-1:-1;41170:689:0;;;;;:::i;:::-;;:::i;9921:102::-;;;;;;;;;;;;10000:16;;;;;;;;9921:102;15268:370;;;;;;;;;;-1:-1:-1;15268:370:0;;;;;:::i;:::-;;:::i;1611:31::-;;;;;;;;;;-1:-1:-1;1611:31:0;;;;-1:-1:-1;;;;;1611:31:0;;;12648:172;;;;;;;;;;-1:-1:-1;12648:172:0;;;;;:::i;:::-;;:::i;9429:107::-;;;;;;;;;;;;9511:18;;-1:-1:-1;;;9511:18:0;;;;;9429:107;39413:1209;;;;;;;;;;-1:-1:-1;39413:1209:0;;;;;:::i;:::-;;:::i;50192:151::-;;;;;;;;;;-1:-1:-1;50192:151:0;;;;;:::i;:::-;;:::i;46348:510::-;;;;;;;;;;-1:-1:-1;46348:510:0;;;;;:::i;:::-;;:::i;8824:91::-;;;;;;;;;;;;8898:10;;-1:-1:-1;;;8898:10:0;;;;;8824:91;26972:162;;;;;;;;;;-1:-1:-1;26972:162:0;;;;;:::i;:::-;;:::i;27333:246::-;;;;;;;;;;-1:-1:-1;27333:246:0;;;;;:::i;:::-;;:::i;12878:149::-;;;;;;;;;;-1:-1:-1;12878:149:0;;;;;:::i;:::-;-1:-1:-1;;;;;12993:18:0;;;12967:7;12993:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;12878:149;49107:344;;;;;;;;;;-1:-1:-1;49107:344:0;;;;;:::i;:::-;;:::i;9081:97::-;;;;;;;;;;;;9158:13;;-1:-1:-1;;;9158:13:0;;;;;9081:97;10616:115;;;;;;;;;;-1:-1:-1;10704:20:0;;10616:115;;9612:109;;;;;;;;;;;;9695:19;;-1:-1:-1;;;9695:19:0;;;;;9612:109;1911:198:7;;;;;;;;;;-1:-1:-1;1911:198:7;;;;;:::i;:::-;;:::i;11603:127:0:-;;;;;;;;;;-1:-1:-1;11697:26:0;;11603:127;;45640:459;;;;;;;;;;-1:-1:-1;45640:459:0;;;;;:::i;:::-;;:::i;9251:103::-;;;;;;;;;;;;9331:16;;-1:-1:-1;;;9331:16:0;;;;;9251:103;48351:45;;;;;;;;;;-1:-1:-1;48351:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;7590:89;7635:13;7667:5;7660:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7590:89;:::o;13165:166::-;13248:4;13264:39;719:10:1;13287:7:0;13296:6;13264:8;:39::i;:::-;-1:-1:-1;13320:4:0;13165:166;;;;:::o;43821:311::-;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;;;;;;;;;43887:23:0::1;::::0;-1:-1:-1;;;43887:23:0;::::1;;;43879:81;;;::::0;-1:-1:-1;;;43879:81:0;;14853:2:9;43879:81:0::1;::::0;::::1;14835:21:9::0;14892:2;14872:18;;;14865:30;14931:34;14911:18;;;14904:62;-1:-1:-1;;;14982:18:9;;;14975:43;15035:19;;43879:81:0::1;14825:235:9::0;43879:81:0::1;43971:21;43987:1;43990::::0;43971:15:::1;:21::i;:::-;44002:33;44030:3;44002:19;:33::i;:::-;44045:23;:31:::0;;-1:-1:-1;;44045:31:0::1;::::0;;44100:25:::1;::::0;::::1;::::0;44071:5:::1;::::0;44100:25:::1;43821:311::o:0;48865:113::-;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;48942:20:0::1;:29:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;48942:29:0::1;-1:-1:-1::0;;48942:29:0;;::::1;::::0;;;::::1;::::0;;48865:113::o;41865:588::-;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;42006:23:0::1;::::0;-1:-1:-1;;;42006:23:0;::::1;;;42005:24;41997:78;;;::::0;-1:-1:-1;;;41997:78:0;;20010:2:9;41997:78:0::1;::::0;::::1;19992:21:9::0;20049:2;20029:18;;;20022:30;20088:34;20068:18;;;20061:62;-1:-1:-1;;;20139:18:9;;;20132:39;20188:19;;41997:78:0::1;19982:231:9::0;41997:78:0::1;42109:1;42093:13;:17;;;42085:57;;;;-1:-1:-1::0;;;42085:57:0::1;;;;;;;:::i;:::-;42190:10;8398:9:::0;;-1:-1:-1;;;8398:9:0;;;;;8325:89;42190:10:::1;42160:40;;:25;:21:::0;42184:1:::1;42160:25;:::i;:::-;:40;;;;42152:102;;;;-1:-1:-1::0;;;42152:102:0::1;;;;;;;:::i;:::-;42265:23;:30:::0;;-1:-1:-1;;42265:30:0::1;-1:-1:-1::0;;;42265:30:0::1;::::0;;42305:53:::1;42321:13:::0;42336:21;42305:15:::1;:53::i;:::-;42368:38;42388:17;42368:19;:38::i;:::-;42422:24;::::0;::::1;::::0;;;::::1;41865:588:::0;;;:::o;13798:376::-;13904:4;13920:36;13930:6;13938:9;13949:6;13920:9;:36::i;:::-;-1:-1:-1;;;;;13974:19:0;;;;;;:11;:19;;;;;;;;719:10:1;13974:33:0;;;;;;;;:43;-1:-1:-1;13974:43:0;13966:96;;;;-1:-1:-1;;;13966:96:0;;16822:2:9;13966:96:0;;;16804:21:9;16861:2;16841:18;;;16834:30;16900:34;16880:18;;;16873:62;-1:-1:-1;;;16951:18:9;;;16944:38;16999:19;;13966:96:0;16794:230:9;13966:96:0;-1:-1:-1;;;;;14103:19:0;;;;;;:11;:19;;;;;;;;719:10:1;14103:33:0;;;;;;;;;14072:74;;14081:6;;14103:42;;14139:6;;14103:42;:::i;:::-;14072:8;:74::i;:::-;-1:-1:-1;14163:4:0;13798:376;;;;;;:::o;48403:197::-;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;8585:14:0;;-1:-1:-1;;;;;48484:23:0;;::::1;8585:14:::0;;48484:23:::1;;48476:82;;;::::0;-1:-1:-1;;;48476:82:0;;7994:2:9;48476:82:0::1;::::0;::::1;7976:21:9::0;8033:2;8013:18;;;8006:30;8072:34;8052:18;;;8045:62;-1:-1:-1;;;8123:18:9;;;8116:44;8177:19;;48476:82:0::1;7966:236:9::0;48476:82:0::1;48569:24;48581:4;48587:5;48569:11;:24::i;:::-;48403:197:::0;;:::o;14569:212::-;719:10:1;14657:4:0;14705:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;14705:34:0;;;;;;;;;;14657:4;;14673:80;;14696:7;;14705:47;;14742:10;;14705:47;:::i;49643:63::-;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;49689:10:0::1;:8;:10::i;:::-;49643:63::o:0;48984:117::-;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;49063:22:0::1;:31:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;49063:31:0::1;-1:-1:-1::0;;49063:31:0;;::::1;::::0;;;::::1;::::0;;48984:117::o;24621:89::-;24676:27;719:10:1;24696:6:0;24676:5;:27::i;:::-;24621:89;:::o;49457:115::-;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;49538:19:0;;;::::1;;::::0;;;:13:::1;:19;::::0;;;;:27;;-1:-1:-1;;49538:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49457:115::o;43070:222::-;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;43130:14:0::1;::::0;;;::::1;;;43122:62;;;::::0;-1:-1:-1;;;43122:62:0;;14449:2:9;43122:62:0::1;::::0;::::1;14431:21:9::0;14488:2;14468:18;;;14461:30;14527:34;14507:18;;;14500:62;-1:-1:-1;;;14578:18:9;;;14571:33;14621:19;;43122:62:0::1;14421:225:9::0;43122:62:0::1;43195:18;43208:1;43211::::0;43195:12:::1;:18::i;:::-;43223:14;:22:::0;;-1:-1:-1;;43223:22:0::1;::::0;;43269:16:::1;::::0;::::1;::::0;43240:5:::1;::::0;43269:16:::1;43070:222::o:0;38066:465::-;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;38166:16:0::1;::::0;;;::::1;;;38165:17;38157:67;;;::::0;-1:-1:-1;;;38157:67:0;;10063:2:9;38157:67:0::1;::::0;::::1;10045:21:9::0;10102:2;10082:18;;;10075:30;10141:34;10121:18;;;10114:62;-1:-1:-1;;;10192:18:9;;;10185:35;10237:19;;38157:67:0::1;10035:227:9::0;38157:67:0::1;38253:1;38242:8;:12;;;38234:52;;;;-1:-1:-1::0;;;38234:52:0::1;;;;;;;:::i;:::-;38329:10;8398:9:::0;;-1:-1:-1;;;8398:9:0;;;;;8325:89;38329:10:::1;38304:35;;:20;:16:::0;38323:1:::1;38304:20;:::i;:::-;:35;;;;38296:97;;;;-1:-1:-1::0;;;38296:97:0::1;;;;;;;:::i;:::-;38412:16;:23:::0;;-1:-1:-1;;38412:23:0::1;::::0;::::1;::::0;;38445:38:::1;38456:8:::0;38466:16;38445:10:::1;:38::i;:::-;38507:17;::::0;::::1;::::0;;;::::1;38066:465:::0;;:::o;44358:377::-;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;44478:14:0::1;;44455:20;:37;44447:104;;;::::0;-1:-1:-1;;;44447:104:0;;21719:2:9;44447:104:0::1;::::0;::::1;21701:21:9::0;21758:2;21738:18;;;21731:30;21797:34;21777:18;;;21770:62;-1:-1:-1;;;21848:18:9;;;21841:52;21910:19;;44447:104:0::1;21691:244:9::0;44447:104:0::1;44581:20;::::0;;44611:43;;;;44670:58:::1;::::0;;24093:25:9;;;24149:2;24134:18;;24127:34;;;44670:58:0::1;::::0;24066:18:9;44670:58:0::1;;;;;;;;1311:1:7;44358:377:0::0;:::o;12321:124::-;-1:-1:-1;;;;;12411:27:0;;12388:4;12411:27;;;:18;:27;;;;;;;;12321:124;;;;:::o;25571:368::-;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;25652:28:0;::::1;25683:1;25652:28:::0;;;:19:::1;:28;::::0;;;;;:32;25649:137:::1;;-1:-1:-1::0;;;;;25746:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;25726:49:::1;::::0;:19:::1;:49::i;:::-;-1:-1:-1::0;;;;;25700:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;:75;25649:137:::1;-1:-1:-1::0;;;;;25795:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;;;:37;;-1:-1:-1;;25795:37:0::1;25828:4;25795:37:::0;;::::1;::::0;;;25842:19:::1;:33:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;25842:33:0::1;::::0;::::1;::::0;;25899;;5441:51:9;;;25899:33:0::1;::::0;5414:18:9;25899:33:0::1;;;;;;;;25571:368:::0;:::o;43527:287::-;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;43599:26:0::1;::::0;::::1;::::0;::::1;;;43591:89;;;::::0;-1:-1:-1;;;43591:89:0;;17947:2:9;43591:89:0::1;::::0;::::1;17929:21:9::0;17986:2;17966:18;;;17959:30;18025:34;18005:18;;;17998:62;-1:-1:-1;;;18076:18:9;;;18069:48;18134:19;;43591:89:0::1;17919:240:9::0;43591:89:0::1;43691:19;43705:1;43708::::0;43691:13:::1;:19::i;:::-;43720:26;:34:::0;;-1:-1:-1;;43720:34:0::1;::::0;;43779:28:::1;::::0;::::1;::::0;43749:5:::1;::::0;43779:28:::1;43527:287::o:0;44966:442::-;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;45061:16:0::1;::::0;;;::::1;;;45053:96;;;::::0;-1:-1:-1;;;45053:96:0;;13280:2:9;45053:96:0::1;::::0;::::1;13262:21:9::0;13319:2;13299:18;;;13292:30;13358:34;13338:18;;;13331:62;13429:34;13409:18;;;13402:62;-1:-1:-1;;;13480:19:9;;;13473:34;13524:19;;45053:96:0::1;13252:297:9::0;45053:96:0::1;45180:8;::::0;;::::1;45278:35:::0;;::::1;-1:-1:-1::0;;;45278:35:0;;::::1;-1:-1:-1::0;;;;45249:19:0;;::::1;-1:-1:-1::0;;;45249:19:0;;::::1;45278:35:::0;;;;-1:-1:-1;;;;45278:35:0;;;;;;::::1;::::0;;;45329:72:::1;::::0;;45180:8;;::::1;::::0;::::1;24900:36:9::0;;;45223:16:0;;;::::1;::::0;;::::1;24967:2:9::0;24952:18;;24945:45;;;25006:18;;;24999:45;;;;25075:2;25060:18;;25053:45;45180:8:0;45329:72:::1;::::0;24887:3:9;24872:19;45329:72:0::1;;;;;;;;1311:1:7;;44966:442:0::0;;:::o;46864:520::-;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;46974:23:0::1;::::0;-1:-1:-1;;;46974:23:0;::::1;;;46966:114;;;::::0;-1:-1:-1;;;46966:114:0;;20827:2:9;46966:114:0::1;::::0;::::1;20809:21:9::0;20866:2;20846:18;;;20839:30;20905:34;20885:18;;;20878:62;20976:34;20956:18;;;20949:62;-1:-1:-1;;;21027:19:9;;;21020:45;21082:19;;46966:114:0::1;20799:308:9::0;46966:114:0::1;47111:13;::::0;;::::1;47229:45:::0;;::::1;-1:-1:-1::0;;;47229:45:0;;::::1;-1:-1:-1::0;;;;47190:29:0;;::::1;-1:-1:-1::0;;;47190:29:0;;::::1;47229:45:::0;;;;-1:-1:-1;;;;47229:45:0;;;;;;::::1;::::0;;;47290:87:::1;::::0;;47111:13;;::::1;::::0;::::1;24900:36:9::0;;;47159:21:0;;;::::1;::::0;;::::1;24967:2:9::0;24952:18;;24945:45;;;25006:18;;;24999:45;;;;25075:2;25060:18;;25053:45;47111:13:0;47290:87:::1;::::0;24887:3:9;24872:19;47290:87:0::1;24854:250:9::0;11788:232:0;-1:-1:-1;;;;;11885:30:0;;11862:7;11885:30;;;:21;:30;;;;;;;;11881:66;;;-1:-1:-1;;;;;;11924:23:0;;;;;;:14;:23;;;;;;11917:30;;11881:66;-1:-1:-1;;;;;11984:28:0;;;;;;:19;:28;;;;;;11964:49;;:19;:49::i;:::-;11957:56;11788:232;-1:-1:-1;;11788:232:0:o;1661:101:7:-;1075:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;1725:30:::1;1752:1;1725:18;:30::i;42646:231:0:-:0;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;42708:16:0::1;::::0;;;::::1;;;42700:67;;;::::0;-1:-1:-1;;;42700:67:0;;20420:2:9;42700:67:0::1;::::0;::::1;20402:21:9::0;20459:2;20439:18;;;20432:30;20498:34;20478:18;;;20471:62;-1:-1:-1;;;20549:18:9;;;20542:36;20595:19;;42700:67:0::1;20392:228:9::0;42700:67:0::1;42778:16;42789:1;42792::::0;42778:10:::1;:16::i;:::-;42804;:24:::0;;-1:-1:-1;;42804:24:0::1;::::0;;42852:18:::1;::::0;::::1;::::0;42823:5:::1;::::0;42852:18:::1;42646:231::o:0;25016:327::-;25092:24;25119:32;25129:7;719:10:1;25138:12:0;640:96:1;25119:32:0;25092:59;;25189:6;25169:16;:26;;25161:75;;;;-1:-1:-1;;;25161:75:0;;19199:2:9;25161:75:0;;;19181:21:9;19238:2;19218:18;;;19211:30;19277:34;19257:18;;;19250:62;-1:-1:-1;;;19328:18:9;;;19321:34;19372:19;;25161:75:0;19171:226:9;25161:75:0;25246:58;25255:7;719:10:1;25278:25:0;25297:6;25278:16;:25;:::i;25246:58::-;25314:22;25320:7;25329:6;25314:5;:22::i;:::-;25016:327;;;:::o;26165:607::-;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;26249:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;26241:71;;;::::0;-1:-1:-1;;;26241:71:0;;11690:2:9;26241:71:0::1;::::0;::::1;11672:21:9::0;11729:2;11709:18;;;11702:30;11768;11748:18;;;11741:58;11816:18;;26241:71:0::1;11662:178:9::0;26241:71:0::1;26328:9;26323:396;26347:19;:26:::0;26343:30;::::1;26323:396;;;26424:7;-1:-1:-1::0;;;;;26398:33:0::1;:19;26418:1;26398:22;;;;;;-1:-1:-1::0;;;26398:22:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;26398:22:0::1;:33;26394:315;;;26476:19;26496:26:::0;;:30:::1;::::0;26525:1:::1;::::0;26496:30:::1;:::i;:::-;26476:51;;;;;;-1:-1:-1::0;;;26476:51:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;26451:19:::1;:22:::0;;-1:-1:-1;;;;;26476:51:0;;::::1;::::0;26471:1;;26451:22;::::1;;;-1:-1:-1::0;;;26451:22:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;:76:::0;;-1:-1:-1;;;;;;26451:76:0::1;-1:-1:-1::0;;;;;26451:76:0;;::::1;;::::0;;26545:23;;::::1;::::0;;:14:::1;:23:::0;;;;;;:27;;;26590:21:::1;:30:::0;;;;:38;;-1:-1:-1;;26590:38:0::1;::::0;;26646:19:::1;:25:::0;;;::::1;;-1:-1:-1::0;;;26646:25:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;26646:25:0;;;;;-1:-1:-1;;;;;;26646:25:0::1;::::0;;;;;26689:5:::1;;26394:315;26375:3:::0;::::1;::::0;::::1;:::i;:::-;;;;26323:396;;;-1:-1:-1::0;26734:31:0::1;::::0;-1:-1:-1;;;;;5459:32:9;;5441:51;;26734:31:0::1;::::0;5429:2:9;5414:18;26734:31:0::1;5396:102:9::0;49578:59:0;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;49622:8:0::1;:6;:8::i;49950:236::-:0;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;50058:29:0;::::1;50082:4;50058:29;;50050:68;;;::::0;-1:-1:-1;;;50050:68:0;;17592:2:9;50050:68:0::1;::::0;::::1;17574:21:9::0;17631:2;17611:18;;;17604:30;17670:28;17650:18;;;17643:56;17716:18;;50050:68:0::1;17564:176:9::0;50050:68:0::1;50135:12;-1:-1:-1::0;;;;;50128:29:0::1;;50158:7;1075::7::0;1101:6;-1:-1:-1;;;;;1101:6:7;1029:85;;50158:7:0::1;50128:51;::::0;-1:-1:-1;;;;;;50128:51:0::1;::::0;;;;;;-1:-1:-1;;;;;6293:32:9;;;50128:51:0::1;::::0;::::1;6275::9::0;6342:18;;;6335:34;;;6248:18;;50128:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;47390:353::-:0;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;47481:16:0::1;::::0;-1:-1:-1;;;;;47481:37:0;;::::1;:16:::0;::::1;:37;;47473:103;;;::::0;-1:-1:-1;;;47473:103:0;;16044:2:9;47473:103:0::1;::::0;::::1;16026:21:9::0;16083:2;16063:18;;;16056:30;16122:34;16102:18;;;16095:62;-1:-1:-1;;;16173:18:9;;;16166:51;16234:19;;47473:103:0::1;16016:243:9::0;47473:103:0::1;47606:16;::::0;;-1:-1:-1;;;;;47632:36:0;;::::1;-1:-1:-1::0;;;;;;47632:36:0;::::1;::::0;::::1;::::0;;;47684:52:::1;::::0;;47606:16;;;::::1;5715:34:9::0;;;5780:2;5765:18;;5758:43;;;;47684:52:0::1;::::0;5650:18:9;47684:52:0::1;5632:175:9::0;7792:93:0;7839:13;7871:7;7864:14;;;;;:::i;27759:739::-;1405:8:8;1138:4;1161:7;-1:-1:-1;;;1161:7:8;;;;;1091:84;1405:8;1404:9;1396:38;;;;-1:-1:-1;;;1396:38:8;;;;;;;:::i;:::-;719:10:1;27823:14:0::1;27970:27:::0;;;:13:::1;:27;::::0;;;;;::::1;;27969:28;27961:60;;;;-1:-1:-1::0;;;27961:60:0::1;;;;;;;:::i;:::-;28060:6;28039:17;28049:6;28039:9;:17::i;:::-;:27;;28031:79;;;::::0;-1:-1:-1;;;28031:79:0;;12047:2:9;28031:79:0::1;::::0;::::1;12029:21:9::0;12086:2;12066:18;;;12059:30;12125:34;12105:18;;;12098:62;-1:-1:-1;;;12176:18:9;;;12169:37;12223:19;;28031:79:0::1;12019:229:9::0;28031:79:0::1;28121:30;28154:39;28165:6;28173:5;28180::::0;28187::::1;28154:10;:39::i;:::-;-1:-1:-1::0;;;;;28207:29:0;::::1;;::::0;;;:21:::1;:29;::::0;;;;;28121:72;;-1:-1:-1;28207:29:0::1;;28203:99;;;28278:13:::0;;-1:-1:-1;;;;;28252:22:0;::::1;28278:13;28252:22:::0;;;:14:::1;:22;::::0;;;;:39;;:22;;28278:13;28252:39:::1;::::0;28278:13;;28252:39:::1;:::i;:::-;::::0;;;-1:-1:-1;;28203:99:0::1;28342:14;::::0;::::1;::::0;-1:-1:-1;;;;;28311:27:0;::::1;;::::0;;;:19:::1;:27;::::0;;;;:45;;:27;;;:45:::1;::::0;28342:14;;28311:45:::1;:::i;:::-;::::0;;;-1:-1:-1;;28413:14:0::1;::::0;::::1;::::0;28394:16:::1;::::0;:33:::1;::::0;28413:14;28394:33:::1;:::i;:::-;28375:16;:52;;;;28455:6;28437:14;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;28476:15:0::1;::::0;22895:25:9;;;28476:15:0::1;::::0;22883:2:9;22868:18;28476:15:0::1;;;;;;;1444:1:8;;27759:739:0::0;:::o;38955:452::-;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;39057:14:0::1;::::0;;;::::1;;;39056:15;39048:62;;;::::0;-1:-1:-1;;;39048:62:0;;22142:2:9;39048:62:0::1;::::0;::::1;22124:21:9::0;22181:2;22161:18;;;22154:30;22220:34;22200:18;;;22193:62;-1:-1:-1;;;22271:18:9;;;22264:32;22313:19;;39048:62:0::1;22114:224:9::0;39048:62:0::1;39141:1;39128:10;:14;;;39120:54;;;;-1:-1:-1::0;;;39120:54:0::1;;;;;;;:::i;:::-;39219:10;8398:9:::0;;-1:-1:-1;;;8398:9:0;;;;;8325:89;39219:10:::1;39192:37;;:22;:18:::0;39213:1:::1;39192:22;:::i;:::-;:37;;;;39184:99;;;;-1:-1:-1::0;;;39184:99:0::1;;;;;;;:::i;:::-;39294:14;:21:::0;;-1:-1:-1;;39294:21:0::1;::::0;::::1;::::0;;39325:44:::1;39338:10:::0;39350:18;39325:12:::1;:44::i;:::-;39385:15;::::0;::::1;::::0;;;::::1;38955:452:::0;;:::o;41170:689::-;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;41339:26:0::1;::::0;::::1;::::0;::::1;;;41338:27;41330:89;;;::::0;-1:-1:-1;;;41330:89:0;;12455:2:9;41330:89:0::1;::::0;::::1;12437:21:9::0;12494:2;12474:18;;;12467:30;12533:34;12513:18;;;12506:62;-1:-1:-1;;;12584:18:9;;;12577:47;12641:19;;41330:89:0::1;12427:239:9::0;41330:89:0::1;41451:1;41437:11;:15;;;41429:55;;;;-1:-1:-1::0;;;41429:55:0::1;;;;;;;:::i;:::-;41530:10;8398:9:::0;;-1:-1:-1;;;8398:9:0;;;;;8325:89;41530:10:::1;41502:38;;:23;:19:::0;41524:1:::1;41502:23;:::i;:::-;:38;;;;41494:100;;;;-1:-1:-1::0;;;41494:100:0::1;;;;;;;:::i;:::-;41605:20;:43:::0;;;41659:23:::1;41668:13:::0;41659:8:::1;:23::i;:::-;41711:26;:33:::0;;-1:-1:-1;;41711:33:0::1;;;::::0;;41754:47:::1;41768:11:::0;41781:19;41754:13:::1;:47::i;:::-;41825:27;::::0;::::1;::::0;;;::::1;41170:689:::0;;;;:::o;15268:370::-;719:10:1;15361:4:0;15404:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;15404:34:0;;;;;;;;;;15456:35;;;;15448:85;;;;-1:-1:-1;;;15448:85:0;;22545:2:9;15448:85:0;;;22527:21:9;22584:2;22564:18;;;22557:30;22623:34;22603:18;;;22596:62;-1:-1:-1;;;22674:18:9;;;22667:35;22719:19;;15448:85:0;22517:227:9;15448:85:0;15543:67;719:10:1;15566:7:0;15575:34;15594:15;15575:16;:34;:::i;12648:172::-;12734:4;12750:42;719:10:1;12774:9:0;12785:6;12750:9;:42::i;39413:1209::-;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;39504:34:0::1;39560:13;39504:70;;39585:22;39628:15;-1:-1:-1::0;;;;;39628:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39610:52:0::1;;39671:4;39678:15;-1:-1:-1::0;;;;;39678:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39610:91;::::0;-1:-1:-1;;;;;;39610:91:0::1;::::0;;;;;;-1:-1:-1;;;;;5733:15:9;;;39610:91:0::1;::::0;::::1;5715:34:9::0;5785:15;;5765:18;;;5758:43;5650:18;;39610:91:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39585:116:::0;-1:-1:-1;;;;;;39716:28:0;::::1;39712:187;;39795:15;-1:-1:-1::0;;;;;39795:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39777:72:0::1;;39858:4;39865:15;-1:-1:-1::0;;;;;39865:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39777:111;::::0;-1:-1:-1;;;;;;39777:111:0::1;::::0;;;;;;-1:-1:-1;;;;;5733:15:9;;;39777:111:0::1;::::0;::::1;5715:34:9::0;5785:15;;5765:18;;;5758:43;5650:18;;39777:111:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39760:128;;39712:187;39917:16;:34:::0;;-1:-1:-1;;;;;39917:34:0;;::::1;-1:-1:-1::0;;;;;;39917:34:0;;::::1;;::::0;;;39961:14:::1;:47:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;40019:33:::1;39993:14:::0;39917:34;40019:11:::1;:33::i;:::-;40121:50;40154:15;40121:24;:50::i;:::-;40406:47;40436:15;40406:21;:47::i;50192:151::-:0;50265:12;1101:6:7;;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;1075:7;1101:6;-1:-1:-1;;;;;1101:6:7;-1:-1:-1;;;;;50302:12:0::1;50322:9;50302:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;50289:47:0;;50192:151;-1:-1:-1;;;50192:151:0:o;46348:510::-;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;46452:26:0::1;::::0;::::1;::::0;::::1;;;46444:128;;;::::0;-1:-1:-1;;;46444:128:0;;9565:2:9;46444:128:0::1;::::0;::::1;9547:21:9::0;9604:2;9584:18;;;9577:30;9643:34;9623:18;;;9616:62;9714:34;9694:18;;;9687:62;9786:27;9765:19;;;9758:56;9831:19;;46444:128:0::1;9537:319:9::0;46444:128:0::1;46603:11;::::0;;::::1;46713:41:::0;;::::1;-1:-1:-1::0;;;46713:41:0;;::::1;-1:-1:-1::0;;;;46678:25:0;;::::1;-1:-1:-1::0;;;46678:25:0;;::::1;46713:41:::0;;;;-1:-1:-1;;;;46713:41:0;;;;;;::::1;::::0;;;46770:81:::1;::::0;;46603:11;;::::1;::::0;::::1;24900:36:9::0;;;46649:19:0;;;::::1;::::0;;::::1;24967:2:9::0;24952:18;;24945:45;;;25006:18;;;24999:45;;;;25075:2;25060:18;;25053:45;46603:11:0;46770:81:::1;::::0;24887:3:9;24872:19;46770:81:0::1;24854:250:9::0;26972:162:0;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;27047:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;27047:34:0::1;27077:4;27047:34;::::0;;27097:30;;5441:51:9;;;27097:30:0::1;::::0;5414:18:9;27097:30:0::1;5396:102:9::0;27333:246:0;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;27414:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;27406:68;;;::::0;-1:-1:-1;;;27406:68:0;;11690:2:9;27406:68:0::1;::::0;::::1;11672:21:9::0;11729:2;11709:18;;;11702:30;11768;11748:18;;;11741:58;11816:18;;27406:68:0::1;11662:178:9::0;27406:68:0::1;-1:-1:-1::0;;;;;27485:27:0;::::1;27515:5;27485:27:::0;;;:18:::1;:27;::::0;;;;;;;;:35;;-1:-1:-1;;27485:35:0::1;::::0;;27544:28;;5441:51:9;;;27544:28:0::1;::::0;5414:18:9;27544:28:0::1;5396:102:9::0;49107:344:0;49170:7;49189:15;49253:4;-1:-1:-1;;;;;49218:40:0;:14;;;;;;;;;-1:-1:-1;;;;;49218:14:0;-1:-1:-1;;;;;49218:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49218:40:0;;49214:169;;;49286:14;;;;;;;;;-1:-1:-1;;;;;49286:14:0;-1:-1:-1;;;;;49286:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;49272:42:0;;-1:-1:-1;49214:169:0;;-1:-1:-1;49214:169:0;;49355:14;;;;;;;;;-1:-1:-1;;;;;49355:14:0;-1:-1:-1;;;;;49355:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;49341:42:0;-1:-1:-1;;49214:169:0;49401:43;49423:7;-1:-1:-1;;;;;49415:16:0;49433:7;49442:1;49401:13;:43::i;1911:198:7:-;1075:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;1999:22:7;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:7;;10880:2:9;1991:73:7::1;::::0;::::1;10862:21:9::0;10919:2;10899:18;;;10892:30;10958:34;10938:18;;;10931:62;-1:-1:-1;;;11009:18:9;;;11002:36;11055:19;;1991:73:7::1;10852:228:9::0;1991:73:7::1;2074:28;2093:8;2074:18;:28::i;45640:459:0:-:0;1075:7:7;1101:6;-1:-1:-1;;;;;1101:6:7;719:10:1;1241:23:7;1233:68;;;;-1:-1:-1;;;1233:68:7;;;;;;;:::i;:::-;45741:14:0::1;::::0;;;::::1;;;45733:89;;;::::0;-1:-1:-1;;;45733:89:0;;18366:2:9;45733:89:0::1;::::0;::::1;18348:21:9::0;18405:2;18385:18;;;18378:30;18444:34;18424:18;;;18417:62;18515:32;18495:18;;;18488:60;18565:19;;45733:89:0::1;18338:252:9::0;45733:89:0::1;45853:10;::::0;;::::1;45959:39:::0;;::::1;-1:-1:-1::0;;;45959:39:0;;::::1;-1:-1:-1::0;;;;45926:23:0;;::::1;-1:-1:-1::0;;;45926:23:0;;::::1;45959:39:::0;;;;-1:-1:-1;;;;45959:39:0;;;;;;::::1;::::0;;;46014:78:::1;::::0;;45853:10;;::::1;::::0;::::1;24900:36:9::0;;;45898:18:0;;;::::1;::::0;;::::1;24967:2:9::0;24952:18;;24945:45;;;25006:18;;;24999:45;;;;25075:2;25060:18;;25053:45;45853:10:0;46014:78:::1;::::0;24887:3:9;24872:19;46014:78:0::1;24854:250:9::0;17320:340:0;-1:-1:-1;;;;;17421:19:0;;17413:68;;;;-1:-1:-1;;;17413:68:0;;21314:2:9;17413:68:0;;;21296:21:9;21353:2;21333:18;;;21326:30;21392:34;21372:18;;;21365:62;-1:-1:-1;;;21443:18:9;;;21436:34;21487:19;;17413:68:0;21286:226:9;17413:68:0;-1:-1:-1;;;;;17499:21:0;;17491:68;;;;-1:-1:-1;;;17491:68:0;;11287:2:9;17491:68:0;;;11269:21:9;11326:2;11306:18;;;11299:30;11365:34;11345:18;;;11338:62;-1:-1:-1;;;11416:18:9;;;11409:32;11458:19;;17491:68:0;11259:224:9;17491:68:0;-1:-1:-1;;;;;17570:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17621:32;;22895:25:9;;;17621:32:0;;22868:18:9;17621:32:0;;;;;;;17320:340;;;:::o;18134:2092::-;1405:8:8;1138:4;1161:7;-1:-1:-1;;;1161:7:8;;;;;1091:84;1405:8;1404:9;1396:38;;;;-1:-1:-1;;;1396:38:8;;;;;;;:::i;:::-;-1:-1:-1;;;;;18253:20:0;::::1;18245:70;;;::::0;-1:-1:-1;;;18245:70:0;;19604:2:9;18245:70:0::1;::::0;::::1;19586:21:9::0;19643:2;19623:18;;;19616:30;19682:34;19662:18;;;19655:62;-1:-1:-1;;;19733:18:9;;;19726:35;19778:19;;18245:70:0::1;19576:227:9::0;18245:70:0::1;-1:-1:-1::0;;;;;18333:23:0;::::1;18325:71;;;::::0;-1:-1:-1;;;18325:71:0;;8409:2:9;18325:71:0::1;::::0;::::1;8391:21:9::0;8448:2;8428:18;;;8421:30;8487:34;8467:18;;;8460:62;-1:-1:-1;;;8538:18:9;;;8531:33;8581:19;;18325:71:0::1;8381:225:9::0;18325:71:0::1;-1:-1:-1::0;;;;;18415:21:0;::::1;;::::0;;;:13:::1;:21;::::0;;;;;::::1;;18414:22;:51:::0;::::1;;;-1:-1:-1::0;;;;;;18441:24:0;::::1;;::::0;;;:13:::1;:24;::::0;;;;;::::1;;18440:25;18414:51;18406:83;;;;-1:-1:-1::0;;;18406:83:0::1;;;;;;;:::i;:::-;1075:7:7::0;1101:6;-1:-1:-1;;;;;18504:17:0;;::::1;1101:6:7::0;;18504:17:0::1;::::0;::::1;::::0;:41:::1;;-1:-1:-1::0;1075:7:7;1101:6;-1:-1:-1;;;;;18525:20:0;;::::1;1101:6:7::0;;18525:20:0::1;;18504:41;18500:87;;;18559:28;18580:6;18559:20;:28::i;:::-;-1:-1:-1::0;;;;;18651:16:0;::::1;18598:11;18651:16:::0;;;:8:::1;:16;::::0;;;;;::::1;;:70:::0;::::1;;;-1:-1:-1::0;18704:16:0::1;::::0;-1:-1:-1;;;;;18683:38:0;;::::1;18704:16:::0;::::1;18683:38;;18651:70;18628:181;;;-1:-1:-1::0;18794:4:0::1;18628:181;-1:-1:-1::0;;;;;18875:19:0;::::1;18819:12;18875:19:::0;;;:8:::1;:19;::::0;;;;;::::1;;:62:::0;::::1;;;-1:-1:-1::0;;;;;;18911:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;;::::1;;18910:27;18875:62;18850:252;;;18998:20;::::0;18980:39:::1;::::0;-1:-1:-1;;;18998:20:0;::::1;;;18980:17;:39::i;:::-;18970:6;:49;;18962:100;;;::::0;-1:-1:-1;;;18962:100:0;;12873:2:9;18962:100:0::1;::::0;::::1;12855:21:9::0;12912:2;12892:18;;;12885:30;12951:34;12931:18;;;12924:62;-1:-1:-1;;;13002:18:9;;;12995:36;13048:19;;18962:100:0::1;12845:228:9::0;18962:100:0::1;-1:-1:-1::0;19087:4:0::1;18850:252;-1:-1:-1::0;;;;;19192:26:0;::::1;19112:30;19192:26:::0;;;:18:::1;:26;::::0;;;;;19145:172:::1;::::0;19169:6;;19192:26:::1;;19191:27;::::0;:73:::1;;;19223:6;:40;;;;-1:-1:-1::0;;;;;;19234:29:0;::::1;;::::0;;;:18:::1;:29;::::0;;;;;::::1;;19233:30;19223:40;19189:76;19279:7;19301:6;19145:10;:172::i;:::-;-1:-1:-1::0;;;;;19332:29:0;::::1;;::::0;;;:21:::1;:29;::::0;;;;;19112:205;;-1:-1:-1;19332:29:0::1;;:66:::0;::::1;;;-1:-1:-1::0;;;;;;19366:32:0;::::1;;::::0;;;:21:::1;:32;::::0;;;;;::::1;;19365:33;19332:66;19328:667;;;19414:48;19436:6;19444:9;19455:6;19414:21;:48::i;:::-;19328:667;;;-1:-1:-1::0;;;;;19484:29:0;::::1;;::::0;;;:21:::1;:29;::::0;;;;;::::1;;19483:30;:66:::0;::::1;;;-1:-1:-1::0;;;;;;19517:32:0;::::1;;::::0;;;:21:::1;:32;::::0;;;;;::::1;;19483:66;19479:516;;;19565:46;19585:6;19593:9;19604:6;19565:19;:46::i;19479:516::-;-1:-1:-1::0;;;;;19633:29:0;::::1;;::::0;;;:21:::1;:29;::::0;;;;;::::1;;19632:30;:67:::0;::::1;;;-1:-1:-1::0;;;;;;19667:32:0;::::1;;::::0;;;:21:::1;:32;::::0;;;;;::::1;;19666:33;19632:67;19628:367;;;19715:44;19733:6;19741:9;19752:6;19715:17;:44::i;19628:367::-;-1:-1:-1::0;;;;;19780:29:0;::::1;;::::0;;;:21:::1;:29;::::0;;;;;::::1;;:65:::0;::::1;;;-1:-1:-1::0;;;;;;19813:32:0;::::1;;::::0;;;:21:::1;:32;::::0;;;;;::::1;;19780:65;19776:219;;;19861:48;19883:6;19891:9;19902:6;19861:21;:48::i;19776:219::-;19940:44;19958:6;19966:9;19977:6;19940:17;:44::i;:::-;20027:9;-1:-1:-1::0;;;;;20010:51:0::1;20019:6;-1:-1:-1::0;;;;;20010:51:0::1;;20038:6;:22;;;20010:51;;;;22895:25:9::0;;22883:2;22868:18;;22850:76;20010:51:0::1;;;;;;;;-1:-1:-1::0;;;;;20077:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;;::::1;;20076:27;::::0;:73:::1;;;20108:6;:40;;;;-1:-1:-1::0;;;;;;20119:29:0;::::1;;::::0;;;:18:::1;:29;::::0;;;;;::::1;;20118:30;20108:40;20072:148;;;20165:44;20185:6;20193:7;20202:6;20165:19;:44::i;:::-;1444:1:8;;;18134:2092:0::0;;;:::o;48606:253::-;-1:-1:-1;;;;;48671:14:0;;;;;;:8;:14;;;;;:22;;-1:-1:-1;;48671:22:0;;;;;;;;;;;;48704:106;;48728:30;48753:4;48728:24;:30::i;:::-;48772:27;48794:4;48772:21;:27::i;:::-;48825;;;-1:-1:-1;;;;;5998:32:9;;5980:51;;6074:14;;6067:22;6062:2;6047:18;;6040:50;48825:27:0;;5953:18:9;48825:27:0;5935:161:9;2103:117:8;1670:8;1138:4;1161:7;-1:-1:-1;;;1161:7:8;;;;;1091:84;1670:8;1662:41;;;;-1:-1:-1;;;1662:41:8;;8813:2:9;1662:41:8;;;8795:21:9;8852:2;8832:18;;;8825:30;-1:-1:-1;;;8871:18:9;;;8864:50;8931:18;;1662:41:8;8785:170:9;1662:41:8;2171:5:::1;2161:15:::0;;-1:-1:-1;;;;2161:15:8::1;::::0;;2191:22:::1;719:10:1::0;2200:12:8::1;2191:22;::::0;-1:-1:-1;;;;;5459:32:9;;;5441:51;;5429:2;5414:18;2191:22:8::1;;;;;;;2103:117::o:0;16015:876:0:-;1405:8:8;1138:4;1161:7;-1:-1:-1;;;1161:7:8;;;;;1091:84;1405:8;1404:9;1396:38;;;;-1:-1:-1;;;1396:38:8;;;;;;;:::i;:::-;-1:-1:-1;;;;;16112:22:0;::::1;1562:42;16112:22;;16104:68;;;::::0;-1:-1:-1;;;16104:68:0;;18797:2:9;16104:68:0::1;::::0;::::1;18779:21:9::0;18836:2;18816:18;;;18809:30;18875:34;18855:18;;;18848:62;-1:-1:-1;;;18926:18:9;;;18919:31;18967:19;;16104:68:0::1;18769:223:9::0;16104:68:0::1;-1:-1:-1::0;;;;;16191:22:0;::::1;;::::0;;;:13:::1;:22;::::0;;;;;::::1;;16190:23;16182:55;;;;-1:-1:-1::0;;;16182:55:0::1;;;;;;;:::i;:::-;16248:22;16273:18;16283:7;16273:9;:18::i;:::-;16248:43;;16327:6;16309:14;:24;;16301:71;;;::::0;-1:-1:-1;;;16301:71:0;;9162:2:9;16301:71:0::1;::::0;::::1;9144:21:9::0;9201:2;9181:18;;;9174:30;9240:34;9220:18;;;9213:62;-1:-1:-1;;;9291:18:9;;;9284:32;9333:19;;16301:71:0::1;9134:224:9::0;16301:71:0::1;16383:15;16401:19;16413:6;16401:11;:19::i;:::-;-1:-1:-1::0;;;;;16487:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;16383:37;;-1:-1:-1;16487:30:0::1;;16483:94;;;-1:-1:-1::0;;;;;16533:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;:33;;16560:6;;16533:23;:33:::1;::::0;16560:6;;16533:33:::1;:::i;:::-;::::0;;;-1:-1:-1;;16483:94:0::1;-1:-1:-1::0;;;;;16587:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;:39;;16619:7;;16587:28;:39:::1;::::0;16619:7;;16587:39:::1;:::i;:::-;::::0;;;-1:-1:-1;;1562:42:0::1;16637:27;::::0;;;:14:::1;:27;::::0;;:37;;16668:6;;16637:27;:37:::1;::::0;16668:6;;16637:37:::1;:::i;:::-;::::0;;;-1:-1:-1;;1562:42:0::1;16684:32;::::0;;;:19:::1;:32;::::0;;:43;;16720:7;;16684:32;:43:::1;::::0;16720:7;;16684:43:::1;:::i;:::-;;;;;;;;16756:6;16738:14;;:24;;;;;;;:::i;:::-;;;;;;;;16788:6;16773:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;16810:21:0::1;::::0;;-1:-1:-1;;;;;6293:32:9;;6275:51;;6357:2;6342:18;;6335:34;;;16810:21:0::1;::::0;6248:18:9;16810:21:0::1;;;;;;;16846:38;::::0;22895:25:9;;;1562:42:0::1;::::0;-1:-1:-1;;;;;16846:38:0;::::1;::::0;::::1;::::0;22883:2:9;22868:18;16846:38:0::1;;;;;;;1444:1:8;;16015:876:0::0;;:::o;29146:257::-;29214:7;29252:16;;29241:7;:27;;29233:82;;;;-1:-1:-1;;;29233:82:0;;10469:2:9;29233:82:0;;;10451:21:9;10508:2;10488:18;;;10481:30;10547:34;10527:18;;;10520:62;-1:-1:-1;;;10598:18:9;;;10591:40;10648:19;;29233:82:0;10441:232:9;29233:82:0;29325:19;29348:10;:8;:10::i;:::-;29325:33;-1:-1:-1;29375:21:0;29325:33;29375:7;:21;:::i;2263:187:7:-;2336:16;2355:6;;-1:-1:-1;;;;;2371:17:7;;;-1:-1:-1;;;;;;2371:17:7;;;;;;2403:40;;2355:6;;;;;;;2403:40;;2336:16;2403:40;2263:187;;:::o;1856:115:8:-;1405:8;1138:4;1161:7;-1:-1:-1;;;1161:7:8;;;;;1091:84;1405:8;1404:9;1396:38;;;;-1:-1:-1;;;1396:38:8;;;;;;;:::i;:::-;1915:7:::1;:14:::0;;-1:-1:-1;;;;1915:14:8::1;-1:-1:-1::0;;;1915:14:8::1;::::0;;1944:20:::1;1951:12;719:10:1::0;640:96;;33236:366:0;33345:23;;:::i;:::-;33380:30;;:::i;:::-;33420:22;;;33452:55;33420:6;33472:17;33491:7;33500:6;33452:11;:55::i;:::-;33517;33529:6;33537:17;33556:7;33565:6;33517:11;:55::i;:::-;33589:6;33236:366;-1:-1:-1;;;;;33236:366:0:o;37430:172::-;37522:7;37587;37564:18;37570:12;37564:2;:18;:::i;:::-;37548:12;;;;:6;:12;:::i;:::-;:35;;;;:::i;:::-;:47;;;;:::i;:::-;37541:54;37430:172;-1:-1:-1;;;;37430:172:0:o;20232:817::-;20309:23;;-1:-1:-1;;;20309:23:0;;;;:58;;;;-1:-1:-1;20350:17:0;;;;20349:18;20309:58;:91;;;;-1:-1:-1;;;;;;20384:16:0;;;;;;:8;:16;;;;;;;;20383:17;20309:91;20305:238;;;20451:16;;20469:22;;20429:63;;-1:-1:-1;;;;;20451:16:0;;20429:21;:63::i;:::-;20531:1;20506:22;:26;20305:238;20557:26;;;;;;;20553:490;;;20648:4;20599:23;20625:29;;;:14;:29;;;;;;20813:20;;20794:39;;;;;;;20852:61;;-1:-1:-1;20896:17:0;;;;20895:18;20852:61;:98;;;;-1:-1:-1;;;;;;20934:16:0;;;;;;:8;:16;;;;;;;;20933:17;20852:98;20848:185;;;20987:31;21002:15;20987:14;:31::i;23570:381::-;23745:13;;-1:-1:-1;;;;;23720:22:0;;23745:13;23720:22;;;:14;:22;;;;;;:38;;23745:13;23720:38;:::i;:::-;-1:-1:-1;;;;;23695:22:0;;;;;;:14;:22;;;;;;;;:63;;;;23828:14;;;;23798:19;:27;;;;;;;:44;;23828:14;23798:44;:::i;:::-;-1:-1:-1;;;;;23768:27:0;;;;;;;:19;:27;;;;;;:74;;;;23918:22;;;;23885:30;;;;;;;;;;:55;;23918:22;23885:55;:::i;:::-;-1:-1:-1;;;;;23852:30:0;;;;;;;:19;:30;;;;;:88;;;;-1:-1:-1;;23570:381:0:o;23020:395::-;23203:14;;;;-1:-1:-1;;;;;23173:27:0;;;;;;:19;:27;;;;;;:44;;23203:14;23173:44;:::i;:::-;-1:-1:-1;;;;;23143:27:0;;;;;;;:19;:27;;;;;;;;:74;;;;23283:22;;;;23255:25;;;;;:14;:25;;;;;;;:50;;23283:22;23255:50;:::i;:::-;-1:-1:-1;;;;;23227:25:0;;;;;;:14;:25;;;;;;;;:78;;;;23381:22;;;;23348:19;:30;;;;;;;:55;;23381:22;23348:55;:::i;22547:318::-;22733:14;;;;-1:-1:-1;;;;;22703:27:0;;;;;;:19;:27;;;;;;:44;;22733:14;22703:44;:::i;24068:466::-;24235:13;;-1:-1:-1;;;;;24210:22:0;;24235:13;24210:22;;;:14;:22;;;;;;:38;;24235:13;24210:38;:::i;:::-;-1:-1:-1;;;;;24185:22:0;;;;;;:14;:22;;;;;;;;:63;;;;24318:14;;;;24288:19;:27;;;;;;;:44;;24318:14;24288:44;:::i;21136:1294::-;21264:6;:17;;;;21274:7;21264:17;21260:740;;;21301:16;;;;;;;21297:304;;;21370:15;;;;;21360:4;21337:29;;;;:14;:29;;;;;;:48;;21370:15;;21337:29;;:48;;21370:15;;21337:48;:::i;:::-;;;;-1:-1:-1;;21441:15:0;;;;21431:4;21403:34;;;;:19;:34;;;;;:53;;:34;;;:53;;21441:15;;21403:53;:::i;:::-;;;;-1:-1:-1;21474:54:0;;-1:-1:-1;21491:4:0;719:10:1;21512:6:0;:15;;;21474:8;:54::i;:::-;21546:40;21563:4;21570:6;:15;;;21546:8;:40::i;:::-;21619:23;;-1:-1:-1;;;21619:23:0;;;;21615:256;;;21695:20;;;;21685:4;21662:29;;;;:14;:29;;;;;:53;;:29;;;:53;;21695:20;;21662:53;:::i;:::-;;;;-1:-1:-1;;21771:20:0;;;;21761:4;21733:34;;;;:19;:34;;;;;:58;;:34;;;:58;;21771:20;;21733:58;:::i;:::-;;;;-1:-1:-1;;21836:20:0;;;;21810:22;:46;;:22;;:46;;21836:20;;21810:46;:::i;:::-;;;;-1:-1:-1;;21615:256:0;21889:14;;;;;;;21885:105;;;21923:52;21938:6;:17;;;21957:6;:17;;;21923:14;:52::i;:::-;22015:6;22014:7;:18;;;;;22025:7;22014:18;:80;;;;-1:-1:-1;22071:22:0;;22053:41;;-1:-1:-1;;;22071:22:0;;;;22053:17;:41::i;:::-;22036:13;;:58;;22014:80;:139;;;;-1:-1:-1;22132:20:0;;22114:39;;-1:-1:-1;;;22132:20:0;;;;22114:17;:39::i;:::-;22098:13;;:55;22014:139;22010:414;;;22173:26;;;;;;;22169:245;;;22307:18;;;;22297:4;22274:29;;;;:14;:29;;;;;:51;;:29;;;:51;;22307:18;;22274:51;:::i;:::-;;;;-1:-1:-1;;22381:18:0;;;;22371:4;22343:34;;;;:19;:34;;;;;:56;;:34;;;:56;;22381:18;;22343:56;:::i;:::-;;;;-1:-1:-1;;21136:1294:0;;;:::o;36194:154::-;36253:7;36272:19;36294:10;:8;:10::i;:::-;36272:32;-1:-1:-1;36321:20:0;36272:32;36321:6;:20;:::i;36419:157::-;36460:7;36480:15;36497;36516:19;:17;:19::i;:::-;36479:56;;-1:-1:-1;36479:56:0;-1:-1:-1;36552:17:0;36479:56;;36552:17;:::i;:::-;36545:24;;;;36419:157;:::o;33796:1085::-;33936:17;33932:934;;;33994:13;;33969:22;;;:38;33932:934;;;34071:6;:17;;;;34081:7;34071:17;34067:335;;;34140:13;;34155:8;;34126:56;;34140:13;34155:8;-1:-1:-1;;;34155:8:0;;;;;-1:-1:-1;;;34165:16:0;;;34126:13;:56::i;:::-;34108:15;;;:74;34237:13;;34252;;34223:66;;34237:13;34252;-1:-1:-1;;;34252:13:0;;;;;-1:-1:-1;;;34267:21:0;;;34223:13;:66::i;:::-;34200:20;;;:89;34341:13;;34356:10;;34327:60;;34341:13;34356:10;-1:-1:-1;;;34356:10:0;;;;;-1:-1:-1;;;34368:18:0;;;34327:13;:60::i;:::-;34307:17;;;:80;34067:335;34421:6;34420:7;:18;;;;;34431:7;34420:18;:80;;;;-1:-1:-1;34477:22:0;;34459:41;;-1:-1:-1;;;34477:22:0;;;;34459:17;:41::i;:::-;34442:13;;:58;;34420:80;:139;;;;-1:-1:-1;34538:20:0;;34520:39;;-1:-1:-1;;;34538:20:0;;;;34520:17;:39::i;:::-;34504:13;;:55;34420:139;34416:261;;;34614:13;;34629:11;;34600:62;;34614:13;34629:11;-1:-1:-1;;;34629:11:0;;;;;-1:-1:-1;;;34642:19:0;;;34600:13;:62::i;:::-;34579:18;;;:83;34416:261;34835:20;;;;34814:18;;;;34794:17;;;;34776:15;;;;34760:13;;:31;;34776:15;34760:31;:::i;:::-;:51;;;;:::i;:::-;:72;;;;:::i;:::-;:95;;;;:::i;:::-;34735:22;;;:120;33932:934;33796:1085;;;;:::o;35084:1044::-;35211:19;35233:10;:8;:10::i;:::-;35271:13;;35211:32;;-1:-1:-1;35271:27:0;;35211:32;;35271:27;:::i;:::-;35254:14;;;:44;35309:804;;;;35371:14;;;;35346:22;;;:39;35309:804;;;35433:13;;:27;;35449:11;;35433:27;:::i;:::-;35416:14;;;:44;35479:6;;:17;;;35489:7;35479:17;35475:247;;;35552:11;35534:6;:15;;;:29;;;;:::i;:::-;35516:15;;;:47;35604:20;;;;:34;;35627:11;;35604:34;:::i;:::-;35581:20;;;:57;35676:17;;;;:31;;35696:11;;35676:31;:::i;:::-;35656:17;;;:51;35475:247;35741:6;35740:7;:18;;;;;35751:7;35740:18;:80;;;;-1:-1:-1;35797:22:0;;35779:41;;-1:-1:-1;;;35797:22:0;;;;35779:17;:41::i;:::-;35762:13;;:58;;35740:80;:139;;;;-1:-1:-1;35858:20:0;;35840:39;;-1:-1:-1;;;35858:20:0;;;;35840:17;:39::i;:::-;35824:13;;:55;35740:139;35736:231;;;35941:11;35920:6;:18;;;:32;;;;:::i;:::-;35899:18;;;:53;35736:231;36082:6;:20;;;36061:6;:18;;;36041:6;:17;;;36023:6;:15;;;36006:6;:14;;;:32;;;;:::i;:::-;:52;;;;:::i;:::-;:73;;;;:::i;:::-;:96;;;;:::i;:::-;35981:22;;;:121;35309:804;35084:1044;;;;;:::o;47992:157::-;4154:17;;;;4153:18;4145:61;;;;-1:-1:-1;;;4145:61:0;;15267:2:9;4145:61:0;;;15249:21:9;15306:2;15286:18;;;15279:30;15345:32;15325:18;;;15318:60;15395:18;;4145:61:0;15239:180:9;4145:61:0;4216:17;:24;;-1:-1:-1;;4216:24:0;4236:4;4216:24;;;48088:9;;48084:58:::1;;48111:31;48128:7;48137:4;48111:16;:31::i;:::-;-1:-1:-1::0;;4261:17:0;:25;;-1:-1:-1;;4261:25:0;;;47992:157::o;29738:995::-;4154:17;;;;4153:18;4145:61;;;;-1:-1:-1;;;4145:61:0;;15267:2:9;4145:61:0;;;15249:21:9;15306:2;15286:18;;;15279:30;15345:32;15325:18;;;15318:60;15395:18;;4145:61:0;15239:180:9;4145:61:0;4216:17;:24;;-1:-1:-1;;4216:24:0;4236:4;4216:24;;;:17;29895:19:::1;29913:1;29895:15:::0;:19:::1;:::i;:::-;29872:42:::0;-1:-1:-1;29924:28:0::1;29955:30;29872:42:::0;29955:15;:30:::1;:::i;:::-;29924:61:::0;-1:-1:-1;30064:21:0::1;30139:45;30156:12:::0;30178:4:::1;30139:16;:45::i;:::-;30268:23;30294:38;30318:14:::0;30294:21:::1;:38;:::i;:::-;30268:64;;30428:51;30441:15;30458:20;30428:12;:51::i;:::-;30520:38;30544:14:::0;30520:21:::1;:38;:::i;:::-;30490:26;;:68;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;30619:24:0::1;::::0;-1:-1:-1;30637:4:0::1;30619:9;:24::i;:::-;30601:42;::::0;:15;:42:::1;:::i;:::-;30568:29;;:75;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;30659:67:0::1;::::0;;24374:25:9;;;24430:2;24415:18;;24408:34;;;24458:18;;;24451:34;;;30659:67:0::1;::::0;24362:2:9;24347:18;30659:67:0::1;;;;;;;-1:-1:-1::0;;4261:17:0;:25;;-1:-1:-1;;4261:25:0;;;-1:-1:-1;;;29738:995:0:o;32715:272::-;32932:10;32913:16;;:29;;;;:::i;:::-;32894:16;:48;;;;32970:10;32952:14;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;32715:272:0:o;36666:686::-;36762:16;;36806:12;;36716:7;;;;;36834:381;36858:19;:26;36854:30;;36834:381;;;36955:7;36909:19;:43;36929:19;36949:1;36929:22;;;;;;-1:-1:-1;;;36929:22:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36929:22:0;36909:43;;;;;;;;;;;;;:53;;:105;;;37007:7;36966:14;:38;36981:19;37001:1;36981:22;;;;;;-1:-1:-1;;;36981:22:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36981:22:0;36966:38;;;;;;;;;;;;;:48;36909:105;36905:150;;;37024:16;;37042:12;;37016:39;;;;;;;;;36905:150;37089:19;:43;37109:19;37129:1;37109:22;;;;;;-1:-1:-1;;;37109:22:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37109:22:0;37089:43;;;;;;;;;;;;;37079:53;;:7;:53;:::i;:::-;37069:63;;37166:14;:38;37181:19;37201:1;37181:22;;;;;;-1:-1:-1;;;37181:22:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37181:22:0;37166:38;;;;;;;;;;;;;37156:48;;:7;:48;:::i;:::-;37146:58;-1:-1:-1;36886:3:0;;;;:::i;:::-;;;;36834:381;;;;37257:12;;37238:16;;:31;;;;:::i;:::-;37228:7;:41;37224:86;;;37279:16;;37297:12;;37271:39;;;;;;;;37224:86;37328:7;;-1:-1:-1;37337:7:0;-1:-1:-1;36666:686:0;;;:::o;30899:559::-;31054:16;;;31068:1;31054:16;;;;;;;;31030:21;;31054:16;;;;;;;;;;-1:-1:-1;31054:16:0;31030:40;;31098:4;31080;31085:1;31080:7;;;;;;-1:-1:-1;;;31080:7:0;;;;;;;;;-1:-1:-1;;;;;31080:23:0;;;:7;;;;;;;;;;:23;;;;31123:16;;:23;;;-1:-1:-1;;;31123:23:0;;;;:16;;;;;:21;;:23;;;;;31080:7;;31123:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31113:4;31118:1;31113:7;;;;;;-1:-1:-1;;;31113:7:0;;;;;;;;;-1:-1:-1;;;;;31113:33:0;;;:7;;;;;;;;;:33;31189:16;;31157:58;;31174:4;;31189:16;31208:6;31157:8;:58::i;:::-;31257:16;;-1:-1:-1;;;;;31257:16:0;:67;31338:6;31257:16;31375:4;31394:2;31410:27;:15;31428:9;31410:27;:::i;:::-;31257:194;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30899:559;;;:::o;31891:639::-;32003:16;;31971:63;;31988:4;;-1:-1:-1;;;;;32003:16:0;32022:11;31971:8;:63::i;:::-;32224:16;;-1:-1:-1;;;;;32224:16:0;:32;32264:9;32296:4;32316:11;32224:16;;1562:42;32486:27;:15;32504:9;32486:27;:::i;:::-;32224:299;;;;;;-1:-1:-1;;;;;;32224:299:0;;;-1:-1:-1;;;;;6739:15:9;;;32224:299:0;;;6721:34:9;6771:18;;;6764:34;;;;6814:18;;;6807:34;;;;6857:18;;;6850:34;;;;6921:15;;;6900:19;;;6893:44;6953:19;;;6946:35;;;;6655:19;;32224:299:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:188:9:-;93:13;;-1:-1:-1;;;;;135:42:9;;125:53;;115:2;;192:1;189;182:12;207:156;273:20;;333:4;322:16;;312:27;;302:2;;353:1;350;343:12;368:257;;480:2;468:9;459:7;455:23;451:32;448:2;;;501:6;493;486:22;448:2;545:9;532:23;564:31;589:5;564:31;:::i;630:261::-;;753:2;741:9;732:7;728:23;724:32;721:2;;;774:6;766;759:22;721:2;811:9;805:16;830:31;855:5;830:31;:::i;896:398::-;;;1025:2;1013:9;1004:7;1000:23;996:32;993:2;;;1046:6;1038;1031:22;993:2;1090:9;1077:23;1109:31;1134:5;1109:31;:::i;:::-;1159:5;-1:-1:-1;1216:2:9;1201:18;;1188:32;1229:33;1188:32;1229:33;:::i;:::-;1281:7;1271:17;;;983:311;;;;;:::o;1299:466::-;;;;1445:2;1433:9;1424:7;1420:23;1416:32;1413:2;;;1466:6;1458;1451:22;1413:2;1510:9;1497:23;1529:31;1554:5;1529:31;:::i;:::-;1579:5;-1:-1:-1;1636:2:9;1621:18;;1608:32;1649:33;1608:32;1649:33;:::i;:::-;1403:362;;1701:7;;-1:-1:-1;;;1755:2:9;1740:18;;;;1727:32;;1403:362::o;1770:392::-;;;1896:2;1884:9;1875:7;1871:23;1867:32;1864:2;;;1917:6;1909;1902:22;1864:2;1961:9;1948:23;1980:31;2005:5;1980:31;:::i;:::-;2030:5;-1:-1:-1;2087:2:9;2072:18;;2059:32;2100:30;2059:32;2100:30;:::i;2167:325::-;;;2296:2;2284:9;2275:7;2271:23;2267:32;2264:2;;;2317:6;2309;2302:22;2264:2;2361:9;2348:23;2380:31;2405:5;2380:31;:::i;:::-;2430:5;2482:2;2467:18;;;;2454:32;;-1:-1:-1;;;2254:238:9:o;2497:255::-;;2617:2;2605:9;2596:7;2592:23;2588:32;2585:2;;;2638:6;2630;2623:22;2585:2;2675:9;2669:16;2694:28;2716:5;2694:28;:::i;2757:470::-;;;;2913:2;2901:9;2892:7;2888:23;2884:32;2881:2;;;2934:6;2926;2919:22;2881:2;2962:40;2992:9;2962:40;:::i;:::-;2952:50;;3021:49;3066:2;3055:9;3051:18;3021:49;:::i;:::-;3011:59;;3113:2;3102:9;3098:18;3092:25;3157:10;3150:5;3146:22;3139:5;3136:33;3126:2;;3188:6;3180;3173:22;3126:2;3216:5;3206:15;;;2871:356;;;;;:::o;3232:190::-;;3344:2;3332:9;3323:7;3319:23;3315:32;3312:2;;;3365:6;3357;3350:22;3312:2;-1:-1:-1;3393:23:9;;3302:120;-1:-1:-1;3302:120:9:o;3427:316::-;;;;3584:2;3572:9;3563:7;3559:23;3555:32;3552:2;;;3605:6;3597;3590:22;3552:2;3639:9;3633:16;3623:26;;3689:2;3678:9;3674:18;3668:25;3658:35;;3733:2;3722:9;3718:18;3712:25;3702:35;;3542:201;;;;;:::o;3748:192::-;;3858:2;3846:9;3837:7;3833:23;3829:32;3826:2;;;3879:6;3871;3864:22;3826:2;3907:27;3924:9;3907:27;:::i;3945:262::-;;;4070:2;4058:9;4049:7;4045:23;4041:32;4038:2;;;4091:6;4083;4076:22;4038:2;4119:27;4136:9;4119:27;:::i;:::-;4109:37;;4165:36;4197:2;4186:9;4182:18;4165:36;:::i;:::-;4155:46;;4028:179;;;;;:::o;4212:397::-;;;;4354:2;4342:9;4333:7;4329:23;4325:32;4322:2;;;4375:6;4367;4360:22;4322:2;4403:27;4420:9;4403:27;:::i;:::-;4393:37;;4449:36;4481:2;4470:9;4466:18;4449:36;:::i;:::-;4439:46;;4535:2;4524:9;4520:18;4507:32;4548:31;4573:5;4548:31;:::i;4614:466::-;;;;;4773:3;4761:9;4752:7;4748:23;4744:33;4741:2;;;4795:6;4787;4780:22;4741:2;4823:27;4840:9;4823:27;:::i;:::-;4813:37;;4869:36;4901:2;4890:9;4886:18;4869:36;:::i;:::-;4859:46;;4955:2;4944:9;4940:18;4927:32;4968:31;4993:5;4968:31;:::i;:::-;4731:349;;;;-1:-1:-1;5018:5:9;;5070:2;5055:18;5042:32;;-1:-1:-1;;4731:349:9:o;7184:603::-;;7325:2;7354;7343:9;7336:21;7386:6;7380:13;7429:6;7424:2;7413:9;7409:18;7402:34;7454:4;7467:140;7481:6;7478:1;7475:13;7467:140;;;7576:14;;;7572:23;;7566:30;7542:17;;;7561:2;7538:26;7531:66;7496:10;;7467:140;;;7625:6;7622:1;7619:13;7616:2;;;7695:4;7690:2;7681:6;7670:9;7666:22;7662:31;7655:45;7616:2;-1:-1:-1;7771:2:9;7750:15;-1:-1:-1;;7746:29:9;7731:45;;;;7778:2;7727:54;;7305:482;-1:-1:-1;;;7305:482:9:o;13554:340::-;13756:2;13738:21;;;13795:2;13775:18;;;13768:30;-1:-1:-1;;;13829:2:9;13814:18;;13807:46;13885:2;13870:18;;13728:166::o;13899:343::-;14101:2;14083:21;;;14140:2;14120:18;;;14113:30;-1:-1:-1;;;14174:2:9;14159:18;;14152:49;14233:2;14218:18;;14073:169::o;15424:413::-;15626:2;15608:21;;;15665:2;15645:18;;;15638:30;15704:34;15699:2;15684:18;;15677:62;-1:-1:-1;;;15770:2:9;15755:18;;15748:47;15827:3;15812:19;;15598:239::o;16264:351::-;16466:2;16448:21;;;16505:2;16485:18;;;16478:30;16544:29;16539:2;16524:18;;16517:57;16606:2;16591:18;;16438:177::o;17029:356::-;17231:2;17213:21;;;17250:18;;;17243:30;17309:34;17304:2;17289:18;;17282:62;17376:2;17361:18;;17203:182::o;22931:983::-;;23241:3;23230:9;23226:19;23272:6;23261:9;23254:25;23298:2;23336:6;23331:2;23320:9;23316:18;23309:34;23379:3;23374:2;23363:9;23359:18;23352:31;23403:6;23438;23432:13;23469:6;23461;23454:22;23507:3;23496:9;23492:19;23485:26;;23546:2;23538:6;23534:15;23520:29;;23567:4;23580:195;23594:6;23591:1;23588:13;23580:195;;;23659:13;;-1:-1:-1;;;;;23655:39:9;23643:52;;23750:15;;;;23715:12;;;;23691:1;23609:9;23580:195;;;-1:-1:-1;;;;;;;23831:32:9;;;;23826:2;23811:18;;23804:60;-1:-1:-1;;;23895:3:9;23880:19;23873:35;23792:3;23202:712;-1:-1:-1;;;23202:712:9:o;25109:128::-;;25180:1;25176:6;25173:1;25170:13;25167:2;;;25186:18;;:::i;:::-;-1:-1:-1;25222:9:9;;25157:80::o;25242:204::-;;25316:4;25313:1;25309:12;25348:4;25345:1;25341:12;25383:3;25377:4;25373:14;25368:3;25365:23;25362:2;;;25391:18;;:::i;:::-;25427:13;;25288:158;-1:-1:-1;;;25288:158:9:o;25451:217::-;;25517:1;25507:2;;-1:-1:-1;;;25542:31:9;;25596:4;25593:1;25586:15;25624:4;25549:1;25614:15;25507:2;-1:-1:-1;25653:9:9;;25497:171::o;25673:453::-;25769:6;25792:5;25806:314;25855:1;25892:2;25882:8;25879:16;25869:2;;25899:5;;;25869:2;25940:4;25935:3;25931:14;25925:4;25922:24;25919:2;;;25949:18;;:::i;:::-;25999:2;25989:8;25985:17;25982:2;;;26014:16;;;;25982:2;26093:17;;;;;26053:15;;25806:314;;;25750:376;;;;;;;:::o;26131:148::-;;26218:55;-1:-1:-1;;26259:4:9;26245:19;;26239:4;26284:922;26368:8;26358:2;;-1:-1:-1;26409:1:9;26423:5;;26358:2;26457:4;26447:2;;-1:-1:-1;26494:1:9;26508:5;;26447:2;26539:4;26557:1;26552:59;;;;26625:1;26620:183;;;;26532:271;;26552:59;26582:1;26573:10;;26596:5;;;26620:183;26657:3;26647:8;26644:17;26641:2;;;26664:18;;:::i;:::-;26720:1;26710:8;26706:16;26697:25;;26748:3;26741:5;26738:14;26735:2;;;26755:18;;:::i;:::-;26788:5;;;26532:271;;26887:2;26877:8;26874:16;26868:3;26862:4;26859:13;26855:36;26849:2;26839:8;26836:16;26831:2;26825:4;26822:12;26818:35;26815:77;26812:2;;;-1:-1:-1;26924:19:9;;;26959:14;;;26956:2;;;26976:18;;:::i;:::-;27009:5;;26812:2;27056:42;27094:3;27084:8;27078:4;27075:1;27056:42;:::i;:::-;27131:6;27126:3;27122:16;27113:7;27110:29;27107:2;;;27142:18;;:::i;:::-;27180:20;;26348:858;-1:-1:-1;;;;26348:858:9:o;27211:168::-;;27317:1;27313;27309:6;27305:14;27302:1;27299:21;27294:1;27287:9;27280:17;27276:45;27273:2;;;27324:18;;:::i;:::-;-1:-1:-1;27364:9:9;;27263:116::o;27384:125::-;;27452:1;27449;27446:8;27443:2;;;27457:18;;:::i;:::-;-1:-1:-1;27494:9:9;;27433:76::o;27514:380::-;27593:1;27589:12;;;;27636;;;27657:2;;27711:4;27703:6;27699:17;27689:27;;27657:2;27764;27756:6;27753:14;27733:18;27730:38;27727:2;;;27810:10;27805:3;27801:20;27798:1;27791:31;27845:4;27842:1;27835:15;27873:4;27870:1;27863:15;27727:2;;27569:325;;;:::o;27899:135::-;;-1:-1:-1;;27959:17:9;;27956:2;;;27979:18;;:::i;:::-;-1:-1:-1;28026:1:9;28015:13;;27946:88::o;28039:127::-;28100:10;28095:3;28091:20;28088:1;28081:31;28131:4;28128:1;28121:15;28155:4;28152:1;28145:15;28171:131;-1:-1:-1;;;;;28246:31:9;;28236:42;;28226:2;;28292:1;28289;28282:12;28307:118;28393:5;28386:13;28379:21;28372:5;28369:32;28359:2;;28415:1;28412;28405:12

Swarm Source

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