ETH Price: $2,954.14 (+0.08%)

Token

Arbitrum Bitcoin and Staking Token (ABAS)

Overview

Max Total Supply

52,500,001 ABAS

Holders

70

Transfers

-
4 ( 33.33%)

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
ArbitrumBitcoinAndStaking

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Arbitrum Bitcoin and Staking (ABAS) - Token and Mining Contract
//
// Distrubtion of Arbitrum Bitcoin and Staking (ABAS) Token is as follows:
// 40% of ABAS Token is distributed as Liquidiy Pools as rewards in the ABASRewards Contract which distributes tokens to users who deposit the Liquidity Pool tokens into the LPRewards contracts.
// +
// 40% of ABAS Token is distributed using ABAS Contract(this Contract) which distributes tokens to users by using Proof of work. Computers solve a complicated problem to gain tokens!
// +
// 20% of ABAS Token is Auctioned in the ABASAuctions Contract which distributes tokens to users who use Ethereum to buy tokens in fair price. Each auction lasts ~12 days. Using the Auctions contract.
// +
// = 100% Of the Token is distributed to the users! No dev fee or premine!
//
	
// Symbol: ABAS
// Decimals: 18 
//
// Total supply: 52,500,001.000000000000000000
//   =
// 21,000,000 tokens goes to Liquidity Providers of the token over 100+ year using Bitcoin distribution!  Helps prevent LP losses!  Uses the ABASRewards!
//   +
// 21,000,000 Mined over 100+ years using Bitcoins Distrubtion halvings every 4 years @ 360 min solves. Uses Proof-oF-Work to distribute the tokens. Public Miner is available.  Uses this contract.
//   +
// 10,500,000 Auctioned over 100+ years into 4 day auctions split fairly among all buyers. ALL Ethereum proceeds go into THIS contract which it fairly distributes to miners and stakers.  Uses the ABASAuctions contract
//  
//
//      
// 50% of the Ethereum from this contract goes to the Miner to pay for the transaction cost and if the token grows enough earn Ethereum per mint!
// 50% of the Ethereum from this contract goes to the Liquidity Providers via ABASRewards Contract.  Helps prevent Impermant Loss! Larger Liquidity!
//
// Max Difficulty of 4 TH/s
// To prevent hashrate griefing at targetTime it is ~0.0001 Ethereum per Mint
// @ 30x targetTime it is ~0.0000033 Ethereum per Mint
// This is done to thwart ASICs and high hashrate machines from griefing / ramping difficulty up to stop FPGA profits
//
// No premine, dev cut, or advantage taken at launch. Public miner available at launch.  100% of the token is given away fairly over 100+ years using Bitcoins model!
//
// Send this contract any ERC20 token and it will become instantly mineable and able to distribute using proof-of-work!
// Donate this contract any NFT and we will also distribute it via Proof of Work to our miners!  
//  
//* 1 token were burned to create the LP pool.
//
// Credits: 0xBitcoin, Vether, Synethix


pragma solidity ^0.8.11;

contract Ownable {
    address public owner;

    event TransferOwnership(address _from, address _to);

    constructor() {
        owner = msg.sender;
        emit TransferOwnership(address(0), msg.sender);
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "only owner");
        _;
    }

    function setOwner(address _owner) internal onlyOwner {
        emit TransferOwnership(owner, _owner);
        owner = _owner;
    }
}

pragma solidity >=0.4.21 <0.9.0;

/**
* @title Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064. Exposes a variety of system-level functionality.
 */
interface ArbSys {
    /**
    * @notice Get internal version number identifying an ArbOS build
    * @return version number as int
     */
	function arbBlockHash(uint blockNumber) external view returns(bytes32);
    /**
    * @notice Get Arbitrum block number (distinct from L1 block number; Arbitrum genesis block has block number 0)
    * @return block number as int
     */ 
    function arbBlockNumber() external view returns (uint);

    /** 
    * @notice Send given amount of Eth to dest from sender.
    * This is a convenience function, which is equivalent to calling sendTxToL1 with empty calldataForL1.
    * @param destination recipient address on L1
    * @return unique identifier for this L2-to-L1 transaction.
    */
   
}



library IsContract {
    function isContract(address _addr) internal view returns (bool) {
        bytes32 codehash;
        /* solium-disable-next-line */
        assembly { codehash := extcodehash(_addr) }
        return codehash != bytes32(0) && codehash != bytes32(0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470);
    }
}

// File: contracts/utils/SafeMath.sol

library SafeMath2 {
    function add(uint256 x, uint256 y) internal pure returns (uint256) {
        uint256 z = x + y;
        require(z >= x, "Add overflow");
        return z;
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256) {
        require(x >= y, "Sub underflow");
        return x - y;
    }

    function mult(uint256 x, uint256 y) internal pure returns (uint256) {
        if (x == 0) {
            return 0;
        }

        uint256 z = x * y;
        require(z / x == y, "Mult overflow");
        return z;
    }

    function div(uint256 x, uint256 y) internal pure returns (uint256) {
        require(y != 0, "Div by zero");
        return x / y;
    }

    function divRound(uint256 x, uint256 y) internal pure returns (uint256) {
        require(y != 0, "Div by zero");
        uint256 r = x / y;
        if (x % y != 0) {
            r = r + 1;
        }

        return r;
    }
}

// File: contracts/utils/Math.sol

library ExtendedMath2 {


    //return the smaller of the two inputs (a or b)
    function limitLessThan(uint a, uint b) internal pure returns (uint c) {

        if(a > b) return b;

        return a;

    }
}

// File: contracts/interfaces/IERC20.sol

interface IERC20 {
	function totalSupply() external view returns (uint256);
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
    function transfer(address _to, uint _value) external returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);
    function allowance(address _owner, address _spender) external view returns (uint256 remaining);
    function approve(address _spender, uint256 _value) external returns (bool success);
    function balanceOf(address _owner) external view returns (uint256 balance);
    
}



interface IERC721 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

//Recieve NFTs
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
//Main contract


interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC
     5MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

contract ABASAuctionsCT{
    uint256 public totalAuctioned;
    }
    

contract ArbitrumBitcoinAndStaking is Ownable, IERC20 {

    function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {
        return IERC721Receiver.onERC721Received.selector;
    }
    
    function onERC1155Received(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4){
	return IERC1155Receiver.onERC1155Received.selector;
	}	
    function onERC1155BatchReceived(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4){
	return IERC1155Receiver.onERC1155Received.selector;
	}
	
    uint public targetTime = 60 * 12;
// SUPPORTING CONTRACTS
    address public AddressAuction;
    ABASAuctionsCT public AuctionsCT;
    address public AddressLPReward;
//Events
    using SafeMath2 for uint256;
    using ExtendedMath2 for uint;
    event Mint(address indexed from, uint reward_amount, uint epochCount, bytes32 newChallengeNumber);
    event MegaMint(address indexed from, uint epochCount, bytes32 newChallengeNumber, uint NumberOfTokensMinted, uint256 TokenMultipler);

// Managment events
    uint256 override public totalSupply = 52500001000000000000000000;
    bytes32 private constant BALANCE_KEY = keccak256("balance");
    //BITCOIN INITALIZE Start
	
    uint _totalSupply = 21000000000000000000000000;
    uint public latestDifficultyPeriodStarted2 = block.timestamp; //BlockTime of last readjustment
    uint public epochCount = 0;//number of 'blocks' mined
	uint public latestreAdjustStarted = block.timestamp; 
    uint public _BLOCKS_PER_READJUSTMENT = 1024; // should be 1024
    uint public  _MAXIMUM_TARGET = 2**234;
    uint public  _MINIMUM_TARGET = _MAXIMUM_TARGET.div(555000000); //Mainnet = 555000000 = 4 TH/s @ 12 minutes
    uint public miningTarget = _MAXIMUM_TARGET.div(200000000000*25);  //1000 million difficulty to start until i enable mining
    
    bytes32 public challengeNumber = ArbSys(0x0000000000000000000000000000000000000064).arbBlockHash( ArbSys(0x0000000000000000000000000000000000000064).arbBlockNumber() - 1);   //generate a new one when a new reward is minted
    uint public rewardEra = 0;
    uint public maxSupplyForEra = (_totalSupply - _totalSupply.div( 2**(rewardEra + 1)));
    uint public reward_amount = 2;
    
    //Stuff for Functions
	uint public sentToLP = 0; //Total ABAS sent to LP pool
    uint public multipler = 0; //Multiplier on held Ethereum (more we hold less % we distribute)
    uint public oldecount = 0; //Previous block count for ArewardSender function
    uint public previousBlockTime  =  block.timestamp; // Previous Blocktime
    uint public Token2Per=           1000000; //Amount of ETH distributed per mint somewhat
    uint public tokensMinted = 0;			//Tokens Minted only for Miners
    mapping(address => uint) balances;
    mapping(address => mapping(address => uint)) allowed;
    uint public slowBlocks = 0; //Number of slow blocks (12+ minutes)
    uint public epochOld = 0;  //Epoch count at each readjustment 
    uint public give0x = 0;
    uint public give = 1;
    // metadata
    string public name = "Arbitrum Bitcoin and Staking Token";
    string public constant symbol = "ABAS";
    uint8 public constant decimals = 18;
	
    uint256 lastrun = block.timestamp;
    uint public latestDifficultyPeriodStarted = ArbSys(0x0000000000000000000000000000000000000064).arbBlockNumber();
    bool initeds = false;
    
    // mint 1 token to setup LPs
	    constructor() {
    balances[msg.sender] = 1000000000000000000;
    emit Transfer(address(0), msg.sender, 1000000000000000000);
	}

function zinit(address AuctionAddress2, address LPGuild2) public onlyOwner{
        uint x = 21000000000000000000000000; 
        // Only init once
        assert(!initeds);
        initeds = true;
	previousBlockTime = block.timestamp;
	reward_amount = 20 * 10**uint(decimals);
    	rewardEra = 0;
	tokensMinted = 0;
	epochCount = 0;
	epochOld = 0;
	multipler = address(this).balance / (1 * 10 ** 18); 	
	Token2Per = (2** rewardEra) * address(this).balance / (250000 + 250000*(multipler)); //aimed to give about 400 days of reserves

    	miningTarget = _MAXIMUM_TARGET.div(1000);
        latestDifficultyPeriodStarted2 = block.timestamp;
    	_startNewMiningEpoch();
        // Init contract variables and mint
        balances[AuctionAddress2] = x/2;
	
        emit Transfer(address(0), AuctionAddress2, x/2);
	
    	AddressAuction = AuctionAddress2;
        AuctionsCT = ABASAuctionsCT(AddressAuction);
        AddressLPReward = payable(LPGuild2);
		slowBlocks = 1;
        oldecount = epochCount;
	
	setOwner(address(0));
     
    }



	///
	// Managment
	///

	function ARewardSender() public {
		//runs every _BLOCKS_PER_READJUSTMENT / 8

		multipler = address(this).balance / (1 * 10 ** 18); 	
		Token2Per = (2** rewardEra) * address(this).balance / (250000 + 250000*(multipler)); //aimed to give about 400 days of reserves

		uint256 runs = block.timestamp - lastrun;

		uint256 epochsPast = epochCount - oldecount; //actually epoch
		uint256 runsperepoch = runs / epochsPast;
		if(rewardEra < 8){
			
			targetTime = ((12 * 60) * 2**rewardEra);
		}else{
			reward_amount = ( 20 * 10**uint(decimals)).div( 2**(rewardEra - 7  ) );
		}
		uint256 x = (runsperepoch * 888).divRound(targetTime);
		uint256 ratio = x * 100 / 888;
		uint256 totalOwed;
		
		 if(ratio < 2000){
			totalOwed = (508606*(15*x**2)).div(888 ** 2)+ (9943920 * (x)).div(888);
		 }else {
			totalOwed = (3200000000);
		} 

		uint totalOwedABAS = (epochsPast * reward_amount * totalOwed).div(100000000);
		balances[AddressLPReward] = balances[AddressLPReward].add(totalOwedABAS);
		emit Transfer(address(0), AddressLPReward, totalOwedABAS);
		sentToLP = sentToLP.add(totalOwedABAS);
		if( address(this).balance > (200 * (Token2Per * _BLOCKS_PER_READJUSTMENT)/4)){  // at least enough blocks to rerun this function for both LPRewards and Users
			//IERC20(AddressZeroXBTC).transfer(AddressLPReward, ((epochsPast) * totalOwed * Token2Per * give0xBTC).div(100000000));
          	 address payable to = payable(AddressLPReward);
			 totalOwed = ((epochsPast) * totalOwed * Token2Per * give0x).div(100000000);
           	to.transfer(totalOwed);
           		 give0x = 1 * give;
		}else{
			give0x = 0;
		}
		
		oldecount = epochCount; //actually epoch

		lastrun = block.timestamp;
	}


	//comability function
	function mint(uint256 nonce, bytes32 challenge_digest) public payable returns (bool success) {
		mintTo(nonce, challenge_digest, msg.sender);
		return true;
	}
	

	function mintNFTGOBlocksUntil() public view returns (uint num) {
		return _BLOCKS_PER_READJUSTMENT/8 - (slowBlocks % (_BLOCKS_PER_READJUSTMENT/8 ));
	}
	
	function mintNFTGO() public view returns (uint num) {
		return slowBlocks % (_BLOCKS_PER_READJUSTMENT/8);
	}
	
	function mintNFT721(address nftaddy, uint nftNumber, uint256 nonce, bytes32 challenge_digest) public payable returns (bool success) {
		require(mintNFTGO() == 0, "Only mint on slowBlocks % _BLOCKS_PER_READJUSTMENT/8 == 0");
		mintTo(nonce, challenge_digest, msg.sender);
		IERC721(nftaddy).safeTransferFrom(address(this), msg.sender, nftNumber, "");
		if(mintNFTGO() == 0){
			slowBlocks = slowBlocks.add(1);
		}
		return true;
	}

	function mintNFT1155(address nftaddy, uint nftNumber, uint256 nonce, bytes32 challenge_digest) public payable returns (bool success) {
		require(mintNFTGO() == 0, "Only mint on slowBlocks % _BLOCKS_PER_READJUSTMENT/8 == 0");
		mintTo(nonce, challenge_digest, msg.sender);
		IERC1155(nftaddy).safeTransferFrom(address(this), msg.sender, nftNumber, 1, "" );
		if(mintNFTGO() == 0){
			slowBlocks = slowBlocks.add(1);
		}
		return true;
	}

	function mintTo(uint256 nonce, bytes32 challenge_digest, address mintToAddress) public payable returns (uint256 totalOwed) {

		bytes32 digest =  keccak256(abi.encodePacked(challengeNumber, msg.sender, nonce));

		//the challenge digest must match the expected
		require(digest == challenge_digest, "Old challenge_digest or wrong challenge_digest");

		//the digest must be smaller than the target
		require(uint256(digest) < miningTarget, "Digest must be smaller than miningTarget");
		_startNewMiningEpoch();

		require(block.timestamp > previousBlockTime, "No same second solves");
		
		//uint diff = block.timestamp - previousBlockTime;
		uint256 x = ((block.timestamp - previousBlockTime) * 888) / targetTime;
		uint ratio = x * 100 / 888 ;
	
		
		if(ratio > 100){
			
			slowBlocks = slowBlocks.add(1);
			
		}
		
		//best @ 3000 ratio totalOwed / 100000000 = 71.6
		if(ratio < 3000){
			totalOwed = (508606*(15*x**2)).div(888 ** 2)+ (9943920 * (x)).div(888);
			require(msg.value >= ((1 * 10**15) / ((ratio+10)/10)), "Must send more ETH because requires eth, check howMuchETH() function to find amount needed");
		}else {
			totalOwed = (24*x*5086060).div(888)+3456750000;
			if(ratio < 6000){
				uint ratioETH = ratio - 2995;
				require(msg.value >= ((1 * 10**15) / (((ratioETH+10) / 10) * 500)), "Must send more ETH because requires eth until 60x targetTime, check howMuchETH() function to find amount needed");
			}
		}

		uint totalOwedABAS = (reward_amount * totalOwed).div(100000000);
		
		balances[mintToAddress] = balances[mintToAddress].add(totalOwedABAS);
		emit Transfer(address(0), mintToAddress, totalOwedABAS);
		
		tokensMinted = tokensMinted.add(totalOwedABAS);
		previousBlockTime = block.timestamp;
		if(give0x > 0){
			if(ratio < 2000){
            			address payable to = payable(mintToAddress);
             			to.transfer((totalOwed * Token2Per * give0x).div(100000000));
				//IERC20(AddressZeroXBTC).transfer(mintTo, (totalOwed * Token2Per * give0xBTC).div(100000000 * 2));
			}else{
               			address payable to = payable(mintToAddress);
               			to.transfer((320 * Token2Per * give0x).div(10));
				//IERC20(AddressZeroXBTC).transfer(mintTo, (40 * Token2Per * give0xBTC).div(10 * 2));
			}
		}

		emit Mint(mintToAddress, totalOwedABAS, epochCount, challengeNumber );

		return totalOwed;

	}
	
	function howMuchETHatTime(uint secondsBetweenEpoch) public view returns (uint totalETHNeeded){
		uint256 x = ((secondsBetweenEpoch) * 888) / targetTime;
		uint ratio = x * 100 / 888;
		
		
		if(ratio >= 3000){
			if(ratio < 6000){
				ratio = ratio - 2995;
				return ((1 * 10**15) / (((ratio+7) / 10) * 500)) ;
			}
			return 0;
		}else if(ratio > 18){
			//A Little behind so we dont bump into error on mint.
			ratio = ratio - 3;
		}
		return (1 * 10**15 / ((ratio+10)/10));
	}

	//A Little ahead so we dont bump into error.
	function howMuchETH() public view returns (uint totalETHNeeded){
		return howMuchETHatTime((block.timestamp - previousBlockTime));
	}
	
	function YourETHBalance() public view returns( uint urTotalETHInWallet){
		return (msg.sender).balance;
	}

	function mintJustABAS(uint256 nonce, bytes32 challenge_digest) public payable returns (bool success){
		mintToJustABAS(nonce, challenge_digest, msg.sender);
		return true;
	}

	function mintToJustABAS(uint256 nonce, bytes32 challenge_digest, address mintToAddress) public payable returns (uint256 totalOwed) {

		bytes32 digest =  keccak256(abi.encodePacked(challengeNumber, msg.sender, nonce));

		//the challenge digest must match the expected
		require(digest == challenge_digest, "Old challenge_digest or wrong challenge_digest");

		//the digest must be smaller than the target
		require(uint256(digest) < miningTarget, "Digest must be smaller than miningTarget");
		_startNewMiningEpoch();

		require(block.timestamp > previousBlockTime, "No solve for first 5 seconds.");
		
		//uint diff = block.timestamp - previousBlockTime;
		uint256 x = ((block.timestamp - previousBlockTime) * 888) / targetTime;
		uint ratio = x * 100 / 888 ;
		
		
		if(ratio > 100){
			
			slowBlocks = slowBlocks.add(1);
			
		}
		
		//best @ 3000 ratio totalOwed / 100000000 = 71.6
		if(ratio < 3000){
			totalOwed = (508606*(15*x**2)).div(888 ** 2)+ (9943920 * (x)).div(888);
			require(msg.value >= ((1 * 10**15) / ((ratio+10)/10)), "Must send more ETH because requires eth, check howMuchETH() function to find amount needed");
		}else {
			totalOwed = (24*x*5086060).div(888)+3456750000;
			if(ratio < 6000){
				ratio = ratio - 2995;
				require(msg.value >= ((1 * 10**15) / (((ratio+10) / 10) * 500)), "Must send more ETH because requires eth until 60x targetTime, check howMuchETH() function to find amount needed");
			}
		}

		uint totalOwedABAS = (reward_amount * totalOwed).div(100000000);
		
		balances[mintToAddress] = balances[mintToAddress].add(totalOwedABAS);
		emit Transfer(address(0), mintToAddress, totalOwedABAS);

		tokensMinted = tokensMinted.add(totalOwedABAS);
		previousBlockTime = block.timestamp;

		emit Mint(mintToAddress, totalOwedABAS, epochCount, challengeNumber );

		return totalOwed;

	}


	function mintTokensArrayTo(uint256 nonce, bytes32 challenge_digest, address[] memory ExtraFunds, address[] memory MintTo) public payable returns (uint256 owed) {
		uint256 totalOd = mintTo(nonce,challenge_digest, MintTo[0]);
		require(totalOd > 0, "mint issue");

		require(MintTo.length == ExtraFunds.length + 1,"MintTo has to have an extra address compared to ExtraFunds");
		uint xy=0;
		for(xy = 0; xy< ExtraFunds.length; xy++)
		{
			if(epochCount % (2**(xy+1)) != 0){
				break;
			}
			for(uint y=xy+1; y< ExtraFunds.length; y++){
				require(ExtraFunds[y] != ExtraFunds[xy], "No printing The same tokens");
			}
		}
		
		uint256 totalOwed = 0;
		uint256 TotalOwned = 0;
		for(uint x=0; x<xy; x++)
		{
			//epoch count must evenly dividable by 2^n in order to get extra mints. 
			//ex. epoch 2 = 1 extramint, epoch 4 = 2 extra, epoch 8 = 3 extra mints, ..., epoch 32 = 5 extra mints w/ a divRound for the 5th mint(allows small balance token minting aka NFTs)
			if(epochCount % (2**(x+1)) == 0){
				TotalOwned = IERC20(ExtraFunds[x]).balanceOf(address(this));
				if(TotalOwned != 0){
					if( x % 3 == 0 && x != 0 && totalOd > 17600000){
						totalOwed = ( (2** rewardEra) *TotalOwned * totalOd).divRound(100000000 * 20000);
						
					}else{
						totalOwed = ( (2** rewardEra) * TotalOwned * totalOd).div(100000000 * 20000);
					}
				}
			    IERC20(ExtraFunds[x]).transfer(MintTo[x+1], totalOwed);
			}
		}
        	
        	
		emit MegaMint(msg.sender, epochCount, challengeNumber, xy, totalOd );

		return totalOd;

    }

	function mintTokensSameAddress(uint256 nonce, bytes32 challenge_digest, address[] memory ExtraFunds, address MintTo) public payable returns (bool success) {
		address[] memory dd = new address[](ExtraFunds.length + 1); 

		for(uint x=0; x< (ExtraFunds.length + 1); x++)
		{
			dd[x] = MintTo;
		}
		
		mintTokensArrayTo(nonce, challenge_digest, ExtraFunds, dd);

		return true;
	}


	function mintTokensArrayToJustABAS(uint256 nonce, bytes32 challenge_digest, address[] memory ExtraFunds, address[] memory MintTo) public payable returns (uint256 owed) {
		uint256 totalOd = mintToJustABAS(nonce,challenge_digest, MintTo[0]);
		require(totalOd > 0, "mint issue");

		require(MintTo.length == ExtraFunds.length + 1,"MintTo has to have an extra address compared to ExtraFunds");
		uint xy=0;
		for(xy = 0; xy< ExtraFunds.length; xy++)
		{
			if(epochCount % (2**(xy+1)) != 0){
				break;
			}
			for(uint y=xy+1; y< ExtraFunds.length; y++){
				require(ExtraFunds[y] != ExtraFunds[xy], "No printing The same tokens");
			}
		}
		
		uint256 totalOwed = 0;
		uint256 TotalOwned = 0;
		for(uint x=0; x<xy; x++)
		{
			//epoch count must evenly dividable by 2^n in order to get extra mints. 
			//ex. epoch 2 = 1 extramint, epoch 4 = 2 extra, epoch 8 = 3 extra mints, ..., epoch 32 = 5 extra mints w/ a divRound for the 5th mint(allows small balance token minting aka NFTs)
			if(epochCount % (2**(x+1)) == 0){
				TotalOwned = IERC20(ExtraFunds[x]).balanceOf(address(this));
				if(TotalOwned != 0){
					if( x % 3 == 0 && x != 0 && totalOd > 17600000){
						totalOwed = ( (2** rewardEra) *TotalOwned * totalOd).divRound(100000000 * 20000);
						
					}else{
						totalOwed = ( (2** rewardEra) * TotalOwned * totalOd).div(100000000 * 20000);
					}
				}
			    IERC20(ExtraFunds[x]).transfer(MintTo[x+1], totalOwed);
			}
		}
        	
        	
		emit MegaMint(msg.sender, epochCount, challengeNumber, xy, totalOd );

		return totalOd;

    }

	function mintTokensSameAddressJustABAS(uint256 nonce, bytes32 challenge_digest, address[] memory ExtraFunds, address MintTo) public payable returns (bool success) {
		address[] memory dd = new address[](ExtraFunds.length + 1); 

		for(uint x=0; x< (ExtraFunds.length + 1); x++)
		{
			dd[x] = MintTo;
		}
		
		mintTokensArrayToJustABAS(nonce, challenge_digest, ExtraFunds, dd);

		return true;
	}













	function empty_mintTo(uint256 nonce, bytes32 challenge_digest, address[] memory ExtraFunds, address[] memory MintTo) public payable returns (uint256 owed) {
		bytes32 digest =  keccak256(abi.encodePacked(challengeNumber, msg.sender, nonce));

		//the challenge digest must match the expected
		require(digest == challenge_digest, "Old challenge_digest or wrong challenge_digest");

		//the digest must be smaller than the target
		require(uint256(digest) < miningTarget, "Digest must be smaller than miningTarget");
		_startNewMiningEpoch();

		require(block.timestamp > previousBlockTime, "No same second solves");
		require(MintTo.length == ExtraFunds.length,"MintTo has to have same number of addressses as ExtraFunds");

		uint xy=0;
		for(xy = 0; xy< ExtraFunds.length; xy++)
		{
			if(epochCount % (2**(xy+1)) != 0){
				break;
			}
			for(uint y=xy+1; y< ExtraFunds.length; y++){
				require(ExtraFunds[y] != ExtraFunds[xy], "No printing The same tokens");
			}
		}

		uint256 x = ((block.timestamp - previousBlockTime) * 888) / targetTime;
		uint ratio = x * 100 / 888 ;
		uint totalOwed = 0;

		
		if(ratio > 100){
			
			slowBlocks = slowBlocks.add(1);
			
		}
	
		//best @ 3000 ratio totalOwed / 100000000 = 71.6
		if(ratio < 3000){
			totalOwed = (508606*(15*x**2)).div(888 ** 2)+ (9943920 * (x)).div(888);
			require(msg.value >= ((1 * 10**15) / ((ratio+10)/10)), "Must send more ETH because requires eth, check howMuchETH() function to find amount needed");
		}else {
			totalOwed = (24*x*5086060).div(888)+3456750000;
			if(ratio < 6000){
				ratio = ratio - 2995;
				require(msg.value >= ((1 * 10**15) / (((ratio+10) / 10) * 500)), "Must send more ETH because requires eth until 60x targetTime, check howMuchETH() function to find amount needed");
			}
		}

		uint256 TotalOwned;
		for(uint z=0; z<xy; z++)
		{
			//epoch count must evenly dividable by 2^n in order to get extra mints. 
			//ex. epoch 2 = 1 extramint, epoch 4 = 2 extra, epoch 8 = 3 extra mints, epoch 16 = 4 extra mints w/ a divRound for the 4th mint(allows small balance token minting aka NFTs)
			if(epochCount % (2**(x+1)) == 0){
				TotalOwned = IERC20(ExtraFunds[x]).balanceOf(address(this));
				if(TotalOwned != 0){
					if( x % 3 == 0 && x != 0 && totalOwed > 17600000){
						totalOwed = ( (2** rewardEra) * TotalOwned * totalOwed).divRound(100000000 * 20000);
					}else{
						totalOwed = ( (2** rewardEra) * TotalOwned * totalOwed).div(100000000 * 20000 );
				    }
			    	IERC20(ExtraFunds[x]).transfer(MintTo[x], totalOwed);

           		}
       		}
		}
		previousBlockTime = block.timestamp;
		return totalOwed;   
	}

	function timeFromLastSolve() public view returns (uint256 time){
		time = block.timestamp - previousBlockTime;
		return time;
	}

	function rewardAtCurrentTime() public view returns (uint256 reward){
		uint256 x = (block.timestamp - previousBlockTime);
		reward = rewardAtTime(x);
		return reward;
	}
	
	function rewardAtTime(uint timeDifference) public view returns (uint256 rewards){
		uint256 x = (timeDifference * 888) / targetTime;
		uint ratio = x * 100 / 888 ;
		uint totalOwed = 0;


		//best @ 3000 ratio totalOwed / 100000000 = 71.6
		if(ratio < 3000){
			totalOwed = (508606*(15*x**2)).div(888 ** 2)+ (9943920 * (x)).div(888);
		}else {
			totalOwed = (24*x*5086060).div(888)+3456750000;
		}

		rewards = (reward_amount * totalOwed).div(100000000);

		return rewards;
	}

	function blocksFromReadjust() public view returns (uint256 blocks){
		blocks = (epochCount - epochOld);
		return blocks;
	}
	
	function blocksToReadjust() public view returns (uint blocks){
		if((epochCount - epochOld) == 0){
			if(give == 1){
				return (_BLOCKS_PER_READJUSTMENT);
			}else{
				return (_BLOCKS_PER_READJUSTMENT / 8);
			}
		}
		uint256 blktimestamp = block.timestamp;
		uint TimeSinceLastDifficultyPeriod2 = blktimestamp - latestreAdjustStarted;
		uint adjusDiffTargetTime = targetTime * ((epochCount - epochOld) % (_BLOCKS_PER_READJUSTMENT/8)); 

		if( TimeSinceLastDifficultyPeriod2 > adjusDiffTargetTime)
		{
				blocks = _BLOCKS_PER_READJUSTMENT/8 - ((epochCount - epochOld) % (_BLOCKS_PER_READJUSTMENT/8));
				return (blocks);
		}else{
			    blocks = _BLOCKS_PER_READJUSTMENT - ((epochCount - epochOld) % _BLOCKS_PER_READJUSTMENT);
			    return (blocks);
		}
	
	}


	function _startNewMiningEpoch() internal {


		//if max supply for the era will be exceeded next reward round then enter the new era before that happens
		//59 is the final reward era, almost all tokens minted
		if( tokensMinted.add(reward_amount) > maxSupplyForEra && rewardEra < 15)
		{
			rewardEra = rewardEra + 1;
			maxSupplyForEra = _totalSupply - _totalSupply.div( 2**(rewardEra + 1));
			if(rewardEra < 8){
				_MINIMUM_TARGET	= _MINIMUM_TARGET.div(2);
				targetTime = ((12 * 60) * 2**rewardEra);
				if(rewardEra < 6){
					if(_BLOCKS_PER_READJUSTMENT <= 16){
						_BLOCKS_PER_READJUSTMENT = 8;
					}else{
						_BLOCKS_PER_READJUSTMENT = _BLOCKS_PER_READJUSTMENT / 2;
					}
				}
			}else{
				reward_amount = ( 20 * 10**uint(decimals)).div( 2**(rewardEra - 7  ) );
			}
		}

		//set the next minted supply at which the era will change
		// total supply of MINED tokens is 21000000000000000000000000  because of 18 decimal places

		epochCount = epochCount.add(1);

		//every so often, readjust difficulty. Dont readjust when deploying
		if((epochCount - epochOld) % (_BLOCKS_PER_READJUSTMENT / 8) == 0)
		{
			ARewardSender();
			maxSupplyForEra = _totalSupply - _totalSupply.div( 2**(rewardEra + 1));

			uint256 blktimestamp = block.timestamp;
			uint TimeSinceLastDifficultyPeriod2 = blktimestamp - latestreAdjustStarted;
			uint adjusDiffTargetTime = targetTime *  (_BLOCKS_PER_READJUSTMENT / 8) ; 
			latestreAdjustStarted = block.timestamp;

			if( TimeSinceLastDifficultyPeriod2 > adjusDiffTargetTime || (epochCount - epochOld) % _BLOCKS_PER_READJUSTMENT == 0) 
			{
				_reAdjustDifficulty();
			}
		}
		challengeNumber = ArbSys(0x0000000000000000000000000000000000000064).arbBlockHash( ArbSys(0x0000000000000000000000000000000000000064).arbBlockNumber() - 1);
 }


	function reAdjustsToWhatDifficulty() public view returns (uint difficulty) {
		if(epochCount - epochOld == 0){
			return _MAXIMUM_TARGET.div(miningTarget);
		}
		uint256 blktimestamp = block.timestamp;
		uint TimeSinceLastDifficultyPeriod2 = blktimestamp - latestDifficultyPeriodStarted2;
		uint epochTotal = epochCount - epochOld;
		uint adjusDiffTargetTime = targetTime *  epochTotal; 
        uint miningTarget2 = 0;
		//if there were less eth blocks passed in time than expected
		if( TimeSinceLastDifficultyPeriod2 < adjusDiffTargetTime )
		{
			uint excess_block_pct = (adjusDiffTargetTime.mult(100)).div( TimeSinceLastDifficultyPeriod2 );
			uint excess_block_pct_extra = excess_block_pct.sub(100).limitLessThan(1000);
			//make it harder 
			miningTarget2 = miningTarget.sub(miningTarget.div(2000).mult(excess_block_pct_extra));   //by up to 50 %
		}else{
			uint shortage_block_pct = (TimeSinceLastDifficultyPeriod2.mult(100)).div( adjusDiffTargetTime );

			uint shortage_block_pct_extra = shortage_block_pct.sub(100).limitLessThan(1000); //always between 0 and 1000
			//make it easier
			miningTarget2 = miningTarget.add(miningTarget.div(500).mult(shortage_block_pct_extra));   //by up to 200 %
		}

		if(miningTarget2 < _MINIMUM_TARGET) //very difficult
		{
			miningTarget2 = _MINIMUM_TARGET;
		}
		if(miningTarget2 > _MAXIMUM_TARGET) //very easy
		{
			miningTarget2 = _MAXIMUM_TARGET;
		}
		difficulty = _MAXIMUM_TARGET.div(miningTarget2);
			return difficulty;
	}


	function _reAdjustDifficulty() internal {
		uint256 blktimestamp = block.timestamp;
		uint TimeSinceLastDifficultyPeriod2 = blktimestamp - latestDifficultyPeriodStarted2;
		uint epochTotal = epochCount - epochOld;
		uint adjusDiffTargetTime = targetTime *  epochTotal; 
		epochOld = epochCount;

		//if there were less eth blocks passed in time than expected
		if( TimeSinceLastDifficultyPeriod2 < adjusDiffTargetTime )
		{
			uint excess_block_pct = (adjusDiffTargetTime.mult(100)).div( TimeSinceLastDifficultyPeriod2 );
			give = 1;
			uint excess_block_pct_extra = excess_block_pct.sub(100).limitLessThan(1000);
			//make it harder 
			miningTarget = miningTarget.sub(miningTarget.div(2000).mult(excess_block_pct_extra));   //by up to 50 %
		}else{
			uint shortage_block_pct = (TimeSinceLastDifficultyPeriod2.mult(100)).div( adjusDiffTargetTime );
			give = 2;
			uint shortage_block_pct_extra = shortage_block_pct.sub(100).limitLessThan(1000); //always between 0 and 1000
			//make it easier
			miningTarget = miningTarget.add(miningTarget.div(500).mult(shortage_block_pct_extra));   //by up to 200 %
		}

		latestDifficultyPeriodStarted2 = blktimestamp;
		latestDifficultyPeriodStarted = ArbSys(0x0000000000000000000000000000000000000064).arbBlockNumber();
		if(miningTarget < _MINIMUM_TARGET) //very difficult
		{
			miningTarget = _MINIMUM_TARGET;
		}
		if(miningTarget > _MAXIMUM_TARGET) //very easy
		{
			miningTarget = _MAXIMUM_TARGET;
		}
		
	}


//Stat Functions

	function inflationMined () public view returns (uint YearlyInflation, uint EpochsPerYear, uint RewardsAtTime, uint TimePerEpoch){
		if(epochCount - epochOld == 0){
			return (0, 0, 0, 0);
		}
		uint256 blktimestamp = block.timestamp;
		uint TimeSinceLastDifficultyPeriod2 = blktimestamp - latestDifficultyPeriodStarted2;

        
		TimePerEpoch = TimeSinceLastDifficultyPeriod2 / blocksFromReadjust(); 
		RewardsAtTime = rewardAtTime(TimePerEpoch);
		uint year = 365 * 24 * 60 * 60;
		EpochsPerYear = year / TimePerEpoch;
		YearlyInflation = RewardsAtTime * EpochsPerYear;
		return (YearlyInflation, EpochsPerYear, RewardsAtTime, TimePerEpoch);
	}

	
	function toNextEraDays () public view returns (uint daysToNextEra, uint _maxSupplyForEra, uint _tokensMinted, uint amtDaily){

        (uint totalamt,,,) = inflationMined();
		(amtDaily) = totalamt / 365;
		if(amtDaily == 0){
			return(0,0,0,0);
		}
		daysToNextEra = (maxSupplyForEra - tokensMinted) / amtDaily;
		return (daysToNextEra, maxSupplyForEra, tokensMinted, amtDaily);
	}
	

	function toNextEraEpochs () public view returns ( uint epochs, uint epochTime, uint daysToNextEra){
		if(blocksFromReadjust() == 0){
			return (0,0,0);
        }
		uint256 blktimestamp = block.timestamp;
        uint TimeSinceLastDifficultyPeriod2 = blktimestamp - latestDifficultyPeriodStarted2;
		uint timePerEpoch = TimeSinceLastDifficultyPeriod2 / blocksFromReadjust();
		(uint daysz,,,) = toNextEraDays();
		uint amt = daysz * (60*60*24) / timePerEpoch;
		return (amt, timePerEpoch, daysz);
	}

	//help debug mining software
	function checkMintSolution(uint256 nonce, bytes32 challenge_digest, bytes32 challenge_number, uint testTarget) public view returns (bool success) {
		bytes32 digest = bytes32(keccak256(abi.encodePacked(challenge_number,msg.sender,nonce)));
		if(uint256(digest) > testTarget) revert();

		return (digest == challenge_digest);
	}

	function checkMintSolutionForAddress(uint256 nonce, bytes32 challenge_digest, bytes32 challenge_number, uint testTarget, address sender) public view returns (bool success) {
		bytes32 digest = bytes32(keccak256(abi.encodePacked(challenge_number,sender,nonce)));
		if(uint256(digest) > testTarget) revert();

		return (digest == challenge_digest);
	}


	//this is a recent ethereum block hash, used to prevent pre-mining future blocks
	function getChallengeNumber() public view returns (bytes32) {

		return challengeNumber;

	}

	
	//the number of zeroes the digest of the PoW solution requires.  Auto adjusts
	function getMiningDifficulty() public view returns (uint) {
			return _MAXIMUM_TARGET.div(miningTarget);
	}


	function getMiningTarget() public view returns (uint) {
			return (miningTarget);
	}


	function getMiningMinted() public view returns (uint) {
		return tokensMinted;
	}

    	function getCirculatingSupply() public view returns (uint) {
        	return tokensMinted + sentToLP + AuctionsCT.totalAuctioned();
    	}

	//~21m coins total in minting
	//reward begins at 20 and the same for the first 8 eras (0-7), targetTime doubles to compensate for first 8 eras
	//After rewardEra = 8 it halves the reward every Era after because no more targetTime is added
	function getMiningReward() public view returns (uint) {
		//once we get half way thru the coins, only get 25 per block
		//every reward era, the reward amount halves.

		if(rewardEra < 8){
			return ( 20 * 10**uint(decimals));
		}else{
			return ( 20 * 10**uint(decimals)).div( 2**(rewardEra - 7  ) );
		}
		}


	function getEpoch() public view returns (uint) {

		return epochCount ;

	}


	//help debug mining software
	function getMintDigest(uint256 nonce, bytes32 challenge_digest, bytes32 challenge_number) public view returns (bytes32 digesttest) {

		bytes32 digest =  keccak256(abi.encodePacked(challengeNumber, msg.sender, nonce));

		return digest;

	}


		// ------------------------------------------------------------------------

		// Get the token balance for account `tokenOwner`

		// ------------------------------------------------------------------------

	function balanceOf(address tokenOwner) public override view returns (uint balance) {

		return balances[tokenOwner];

	}


		// ------------------------------------------------------------------------

		// Transfer the balance from token owner's account to `to` account

		// - Owner's account must have sufficient balance to transfer

		// - 0 value transfers are allowed

		// ------------------------------------------------------------------------


	function transfer(address to, uint tokens) public override returns (bool success) {

		balances[msg.sender] = balances[msg.sender].sub(tokens);
		balances[to] = balances[to].add(tokens);

		emit Transfer(msg.sender, to, tokens);

		return true;

	}


		// ------------------------------------------------------------------------

		// Token owner can approve for `spender` to transferFrom(...) `tokens`

		// from the token owner's account

		//

		// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md

		// recommends that there are no checks for the approval double-spend attack

		// as this should be implemented in user interfaces

		// ------------------------------------------------------------------------


	function approve(address spender, uint tokens) public override returns (bool success) {

		allowed[msg.sender][spender] = tokens;

		emit Approval(msg.sender, spender, tokens);

		return true;

	}


		// ------------------------------------------------------------------------

		// Transfer `tokens` from the `from` account to the `to` account

		//

		// The calling account must already have sufficient tokens approve(...)-d

		// for spending from the `from` account and

		// - From account must have sufficient balance to transfer

		// - Spender must have sufficient allowance to transfer

		// - 0 value transfers are allowed

		// ------------------------------------------------------------------------


	function transferFrom(address from, address to, uint tokens) public override returns (bool success) {

		balances[from] = balances[from].sub(tokens);
		allowed[from][msg.sender] = allowed[from][msg.sender].sub(tokens);
		balances[to] = balances[to].add(tokens);

		emit Transfer(from, to, tokens);

		return true;

	}


		// ------------------------------------------------------------------------

		// Returns the amount of tokens approved by the owner that can be

		// transferred to the spender's account

		// ------------------------------------------------------------------------


	function allowance(address tokenOwner, address spender) public override view returns (uint remaining) {

		return allowed[tokenOwner][spender];

	}




	  //Allow ETH to enter
	receive() external payable {

	}


	fallback() external payable {

	}
}

/*
*
* MIT License
* ===========
*
* Copyright (c) 2023 Arbitrum Bitcoin and Staking (ABAS)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.   
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
*/

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"epochCount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newChallengeNumber","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"NumberOfTokensMinted","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"TokenMultipler","type":"uint256"}],"name":"MegaMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochCount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newChallengeNumber","type":"bytes32"}],"name":"Mint","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":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"TransferOwnership","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"ARewardSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"AddressAuction","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AddressLPReward","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AuctionsCT","outputs":[{"internalType":"contract ABASAuctionsCT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Token2Per","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YourETHBalance","outputs":[{"internalType":"uint256","name":"urTotalETHInWallet","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_BLOCKS_PER_READJUSTMENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MAXIMUM_TARGET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MINIMUM_TARGET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"remaining","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blocksFromReadjust","outputs":[{"internalType":"uint256","name":"blocks","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blocksToReadjust","outputs":[{"internalType":"uint256","name":"blocks","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"challengeNumber","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"bytes32","name":"challenge_number","type":"bytes32"},{"internalType":"uint256","name":"testTarget","type":"uint256"}],"name":"checkMintSolution","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"bytes32","name":"challenge_number","type":"bytes32"},{"internalType":"uint256","name":"testTarget","type":"uint256"},{"internalType":"address","name":"sender","type":"address"}],"name":"checkMintSolutionForAddress","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address[]","name":"ExtraFunds","type":"address[]"},{"internalType":"address[]","name":"MintTo","type":"address[]"}],"name":"empty_mintTo","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"epochCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epochOld","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChallengeNumber","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningDifficulty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMiningTarget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"bytes32","name":"challenge_number","type":"bytes32"}],"name":"getMintDigest","outputs":[{"internalType":"bytes32","name":"digesttest","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"give","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"give0x","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"howMuchETH","outputs":[{"internalType":"uint256","name":"totalETHNeeded","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsBetweenEpoch","type":"uint256"}],"name":"howMuchETHatTime","outputs":[{"internalType":"uint256","name":"totalETHNeeded","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inflationMined","outputs":[{"internalType":"uint256","name":"YearlyInflation","type":"uint256"},{"internalType":"uint256","name":"EpochsPerYear","type":"uint256"},{"internalType":"uint256","name":"RewardsAtTime","type":"uint256"},{"internalType":"uint256","name":"TimePerEpoch","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestDifficultyPeriodStarted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestDifficultyPeriodStarted2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestreAdjustStarted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyForEra","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"miningTarget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"}],"name":"mint","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"}],"name":"mintJustABAS","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"nftaddy","type":"address"},{"internalType":"uint256","name":"nftNumber","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"}],"name":"mintNFT1155","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"nftaddy","type":"address"},{"internalType":"uint256","name":"nftNumber","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"}],"name":"mintNFT721","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintNFTGO","outputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintNFTGOBlocksUntil","outputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address","name":"mintToAddress","type":"address"}],"name":"mintTo","outputs":[{"internalType":"uint256","name":"totalOwed","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address","name":"mintToAddress","type":"address"}],"name":"mintToJustABAS","outputs":[{"internalType":"uint256","name":"totalOwed","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address[]","name":"ExtraFunds","type":"address[]"},{"internalType":"address[]","name":"MintTo","type":"address[]"}],"name":"mintTokensArrayTo","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address[]","name":"ExtraFunds","type":"address[]"},{"internalType":"address[]","name":"MintTo","type":"address[]"}],"name":"mintTokensArrayToJustABAS","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address[]","name":"ExtraFunds","type":"address[]"},{"internalType":"address","name":"MintTo","type":"address"}],"name":"mintTokensSameAddress","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"challenge_digest","type":"bytes32"},{"internalType":"address[]","name":"ExtraFunds","type":"address[]"},{"internalType":"address","name":"MintTo","type":"address"}],"name":"mintTokensSameAddressJustABAS","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"multipler","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":"oldecount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousBlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reAdjustsToWhatDifficulty","outputs":[{"internalType":"uint256","name":"difficulty","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardAtCurrentTime","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timeDifference","type":"uint256"}],"name":"rewardAtTime","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardEra","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reward_amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sentToLP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"slowBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeFromLastSolve","outputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toNextEraDays","outputs":[{"internalType":"uint256","name":"daysToNextEra","type":"uint256"},{"internalType":"uint256","name":"_maxSupplyForEra","type":"uint256"},{"internalType":"uint256","name":"_tokensMinted","type":"uint256"},{"internalType":"uint256","name":"amtDaily","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toNextEraEpochs","outputs":[{"internalType":"uint256","name":"epochs","type":"uint256"},{"internalType":"uint256","name":"epochTime","type":"uint256"},{"internalType":"uint256","name":"daysToNextEra","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"AuctionAddress2","type":"address"},{"internalType":"address","name":"LPGuild2","type":"address"}],"name":"zinit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526102d06001556a2b6d4ec1c9bd6f2be400006005556a115eec47f6cf7e3500000060065542600755600060085542600955610400600a55600160ea1b600b5562000063632114a0c0600b546200034f60201b620032251790919060201c565b600c556200008865048c27395000600b546200034f60201b620032251790919060201c565b600d5560646001600160a01b0316632b407a82600160646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001039190620003a9565b6200010f9190620003d9565b6040518263ffffffff1660e01b81526004016200012e91815260200190565b602060405180830381865afa1580156200014c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001729190620003a9565b600e556000600f55620001b3600f5460016200018f9190620003ef565b6200019c90600262000502565b6006546200034f60201b620032251790919060201c565b600654620001c29190620003d9565b601055600260115560006012556000601355600060145542601555620f424060165560006017556000601a556000601b556000601c556001601d5560405180606001604052806022815260200162004a2f60229139601e90620002269082620005b5565b5042601f5560646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200026b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002919190620003a9565b6020556021805460ff19169055348015620002ab57600080fd5b50600080546001600160a01b0319163390811782556040805192835260208301919091527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c910160405180910390a1336000818152601860209081526040808320670de0b6b3a76400009081905590519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3620006a4565b600081600003620003945760405162461bcd60e51b815260206004820152600b60248201526a446976206279207a65726f60a81b604482015260640160405180910390fd5b620003a0828462000681565b90505b92915050565b600060208284031215620003bc57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115620003a357620003a3620003c3565b80820180821115620003a357620003a3620003c3565b600181815b80851115620004465781600019048211156200042a576200042a620003c3565b808516156200043857918102915b93841c93908002906200040a565b509250929050565b6000826200045f57506001620003a3565b816200046e57506000620003a3565b81600181146200048757600281146200049257620004b2565b6001915050620003a3565b60ff841115620004a657620004a6620003c3565b50506001821b620003a3565b5060208310610133831016604e8410600b8410161715620004d7575081810a620003a3565b620004e3838362000405565b8060001904821115620004fa57620004fa620003c3565b029392505050565b6000620003a083836200044e565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200053b57607f821691505b6020821081036200055c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620005b057600081815260208120601f850160051c810160208610156200058b5750805b601f850160051c820191505b81811015620005ac5782815560010162000597565b5050505b505050565b81516001600160401b03811115620005d157620005d162000510565b620005e981620005e2845462000526565b8462000562565b602080601f831160018114620006215760008415620006085750858301515b600019600386901b1c1916600185901b178555620005ac565b600085815260208120601f198616915b82811015620006525788860151825594840194600190910190840162000631565b5085821015620006715787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000826200069f57634e487b7160e01b600052601260045260246000fd5b500490565b61437b80620006b46000396000f3fe60806040526004361061041b5760003560e01c806370a082311161021c578063a7ef6b8f11610122578063d0f66e4b116100b0578063f23a6e6111610077578063f23a6e61146104e9578063f2f3bf2d14610bd5578063f56f8d3614610be8578063f7a5f15514610bfc578063f95d391914610c0f57005b8063d0f66e4b14610b20578063dc6e9cf914610b50578063dd62ed3e14610b66578063ddfbd8dd14610bac578063e932012b14610bbf57005b8063c76ae540116100f4578063c76ae54014610aad578063c8a1465c14610ac2578063cb9ae70714610ad5578063cfcb52d414610aeb578063d0856d1614610b0b57005b8063a7ef6b8f14610a42578063a9059cbb14610a62578063b5ade81b14610a82578063c0abebe014610a9857005b80638ae0368b116101aa57806397566aa01161017157806397566aa0146109c057806399f584b3146109e05780639e96a23a146109f6578063a2ac4c3714610a0c578063a68eb88e14610a2c57005b80638ae0368b146109275780638c0838ab1461093d5780638da5cb5b1461095057806394b939ef1461097057806395d89b411461099057005b8063819c9d9e116101ee578063819c9d9e146108bd578063829965cc146108d257806387a2a9d6146108e85780638a083c98146108fe5780638a769d351461091157005b806370a082311461083f578063757991a81461087557806377ed6b141461088a57806381269a561461089d57005b80632d38bf7a1161032157806345d8a232116102af5780634ef37628116102765780634ef37628146107c95780634fa972e1146107de578063653517ef146107f457806369d3e5df146108095780636de9f32b1461082957005b806345d8a23214610762578063467d809e1461077857806347353b691461078b578063490203a71461079e5780634cbf68fe146107b357005b806334d5b131116102f357806334d5b131146106ec57806335b80bfb146107015780633c953615146107215780633dc8a068146107375780634513e1441461074d57005b80632d38bf7a146106625780632f104e0c14610678578063313ce567146106b057806332e99708146106d757005b80631763a089116103a9578063237ef7db11610370578063237ef7db146105ec5780632381a60e1461060257806323b872dd14610618578063240c3b70146106385780632b112e491461064d57005b80631763a0891461058657806317da485f1461059b5780631801fbe5146105b057806318160ddd146105c35780631fccb33c146105d957005b80630a891b83116103ed5780630a891b83146104b45780630c97e564146104e9578063102943171461052f578063111f95d814610545578063150b7a021461055a57005b8063012d3edf1461042457806305411d881461044d57806306fdde0314610462578063095ea7b31461048457005b3661042257005b005b34801561043057600080fd5b5061043a601b5481565b6040519081526020015b60405180910390f35b34801561045957600080fd5b5061043a610c25565b34801561046e57600080fd5b50610477610c3a565b60405161044491906138e0565b34801561049057600080fd5b506104a461049f36600461394a565b610cc8565b6040519015158152602001610444565b3480156104c057600080fd5b506104c9610d35565b604080519485526020850193909352918301526060820152608001610444565b3480156104f557600080fd5b506105166105043660046139bd565b63f23a6e6160e01b9695505050505050565b6040516001600160e01b03199091168152602001610444565b34801561053b57600080fd5b5061043a60155481565b34801561055157600080fd5b5061043a610dbd565b34801561056657600080fd5b50610516610575366004613a35565b630a85bd0160e11b95945050505050565b34801561059257600080fd5b5061043a610f1c565b3480156105a757600080fd5b5061043a610f53565b6104a46105be366004613aa4565b610f6c565b3480156105cf57600080fd5b5061043a60055481565b6104a46105e7366004613b7e565b610f83565b3480156105f857600080fd5b5061043a60095481565b34801561060e57600080fd5b5061043a60115481565b34801561062457600080fd5b506104a4610633366004613bdf565b611046565b34801561064457600080fd5b506104c9611132565b34801561065957600080fd5b5061043a6111a2565b34801561066e57600080fd5b5061043a600f5481565b34801561068457600080fd5b50600454610698906001600160a01b031681565b6040516001600160a01b039091168152602001610444565b3480156106bc57600080fd5b506106c5601281565b60405160ff9091168152602001610444565b3480156106e357600080fd5b50600d5461043a565b3480156106f857600080fd5b5061043a61122d565b34801561070d57600080fd5b5061043a61071c366004613c1b565b611330565b34801561072d57600080fd5b5061043a601c5481565b34801561074357600080fd5b5061043a60145481565b34801561075957600080fd5b5061043a611414565b34801561076e57600080fd5b5061043a60015481565b6104a4610786366004613aa4565b611427565b6104a4610799366004613c34565b611434565b3480156107aa57600080fd5b5061043a611511565b3480156107bf57600080fd5b5061043a601a5481565b3480156107d557600080fd5b50600e5461043a565b3480156107ea57600080fd5b5061043a60105481565b34801561080057600080fd5b5061043a611569565b34801561081557600080fd5b506104a4610824366004613c6d565b61158b565b34801561083557600080fd5b5061043a60175481565b34801561084b57600080fd5b5061043a61085a366004613cb6565b6001600160a01b031660009081526018602052604090205490565b34801561088157600080fd5b5060085461043a565b6104a4610898366004613c34565b6115d7565b3480156108a957600080fd5b506104a46108b8366004613cd1565b611658565b3480156108c957600080fd5b5061043a6116a3565b3480156108de57600080fd5b5061043a60085481565b3480156108f457600080fd5b5061043a600b5481565b6104a461090c366004613b7e565b6116c1565b34801561091d57600080fd5b5061043a600d5481565b34801561093357600080fd5b5061043a600e5481565b61043a61094b366004613d03565b611777565b34801561095c57600080fd5b50600054610698906001600160a01b031681565b34801561097c57600080fd5b50600254610698906001600160a01b031681565b34801561099c57600080fd5b50610477604051806040016040528060048152602001634142415360e01b81525081565b3480156109cc57600080fd5b5061043a6109db366004613d38565b611aaa565b3480156109ec57600080fd5b5061043a60135481565b348015610a0257600080fd5b5061043a601d5481565b348015610a1857600080fd5b5061043a610a27366004613c1b565b611ae5565b348015610a3857600080fd5b5061043a60165481565b348015610a4e57600080fd5b50600354610698906001600160a01b031681565b348015610a6e57600080fd5b506104a4610a7d36600461394a565b611bb5565b348015610a8e57600080fd5b5061043a600a5481565b348015610aa457600080fd5b5060175461043a565b348015610ab957600080fd5b5061043a611c3a565b61043a610ad0366004613d64565b611c4c565b348015610ae157600080fd5b5061043a60205481565b348015610af757600080fd5b50610422610b06366004613ddb565b61204a565b348015610b1757600080fd5b5061042261220f565b348015610b2c57600080fd5b50610b356124bb565b60408051938452602084019290925290820152606001610444565b348015610b5c57600080fd5b5061043a600c5481565b348015610b7257600080fd5b5061043a610b81366004613ddb565b6001600160a01b03918216600090815260196020908152604080832093909416825291909152205490565b61043a610bba366004613d03565b61253f565b348015610bcb57600080fd5b5061043a60075481565b61043a610be3366004613d64565b612920565b348015610bf457600080fd5b50333161043a565b61043a610c0a366004613d64565b612c92565b348015610c1b57600080fd5b5061043a60125481565b600060155442610c359190613e24565b905090565b601e8054610c4790613e37565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7390613e37565b8015610cc05780601f10610c9557610100808354040283529160200191610cc0565b820191906000526020600020905b815481529060010190602001808311610ca357829003601f168201915b505050505081565b3360008181526019602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610d239086815260200190565b60405180910390a35060015b92915050565b600080600080601b54600854610d4b9190613e24565b600003610d6357506000925082915081905080610db7565b6007544290600090610d759083613e24565b9050610d7f611c3a565b610d899082613e87565b9250610d9483611330565b93506301e13380610da58482613e87565b9550610db18686613e9b565b96505050505b90919293565b6000601b54600854610dcf9190613e24565b600003610de557600d54600b54610c3591613225565b6007544290600090610df79083613e24565b90506000601b54600854610e0b9190613e24565b9050600081600154610e1d9190613e9b565b9050600081841015610e93576000610e4085610e3a856064613276565b90613225565b90506000610e5b6103e8610e558460646132de565b9061332a565b9050610e8a610e8182610e7b6107d0600d5461322590919063ffffffff16565b90613276565b600d54906132de565b92505050610ee7565b6000610ea483610e3a876064613276565b90506000610eb96103e8610e558460646132de565b9050610ee2610ed982610e7b6101f4600d5461322590919063ffffffff16565b600d5490613342565b925050505b600c54811015610ef65750600c545b600b54811115610f055750600b545b600b54610f129082613225565b9550505050505090565b60006008600a54610f2d9190613e87565b601a54610f3a9190613eb2565b6008600a54610f499190613e87565b610c359190613e24565b6000610c35600d54600b5461322590919063ffffffff16565b6000610f7983833361253f565b5060019392505050565b60008083516001610f949190613ec6565b67ffffffffffffffff811115610fac57610fac613ac6565b604051908082528060200260200182016040528015610fd5578160200160208202803683370190505b50905060005b8451610fe8906001613ec6565b81101561102c578382828151811061100257611002613ed9565b6001600160a01b03909216602092830291909101909101528061102481613eef565b915050610fdb565b5061103986868684611c4c565b5060019695505050505050565b6001600160a01b03831660009081526018602052604081205461106990836132de565b6001600160a01b03851660009081526018602090815260408083209390935560198152828220338352905220546110a090836132de565b6001600160a01b0380861660009081526019602090815260408083203384528252808320949094559186168152601890915220546110de9083613342565b6001600160a01b038085166000818152601860205260409081902093909355915190861690600080516020614326833981519152906111209086815260200190565b60405180910390a35060019392505050565b6000806000806000611142610d35565b505050905061016d816111559190613e87565b91508160000361117357600080600080945094509450945050610db7565b816017546010546111849190613e24565b61118e9190613e87565b601054601754919650945092505090919293565b6003546040805160016224c73d60e11b0319815290516000926001600160a01b03169163ffb671869160048083019260209291908290030181865afa1580156111ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112139190613f08565b6012546017546112239190613ec6565b610c359190613ec6565b6000601b5460085461123f9190613e24565b60000361126657601d546001036112575750600a5490565b6008600a54610c359190613e87565b60095442906000906112789083613e24565b905060006008600a5461128b9190613e87565b601b5460085461129b9190613e24565b6112a59190613eb2565b6001546112b29190613e9b565b905080821115611306576008600a546112cb9190613e87565b601b546008546112db9190613e24565b6112e59190613eb2565b6008600a546112f49190613e87565b6112fe9190613e24565b935050505090565b600a54601b546008546113199190613e24565b6113239190613eb2565b600a546112fe9190613e24565b600080600154836103786113449190613e9b565b61134e9190613e87565b90506000610378611360836064613e9b565b61136a9190613e87565b90506000610bb88210156113c65761138b610378610e3a856297bb70613e9b565b6113b5620c084061139d600287614005565b6113a890600f613e9b565b610e3a906207c2be613e9b565b6113bf9190613ec6565b90506113f5565b6113e46103786113d7856018613e9b565b610e3a90624d9b6c613e9b565b6113f29063ce09d1b0613ec6565b90505b61140b6305f5e10082601154610e3a9190613e9b565b95945050505050565b6000610c3560155442610a279190613e24565b6000610f79838333611777565b600061143e6116a3565b156114645760405162461bcd60e51b815260040161145b90614014565b60405180910390fd5b61146f83833361253f565b50604051635c46a7ef60e11b81523060048201523360248201526044810185905260806064820152600060848201526001600160a01b0386169063b88d4fde9060a4015b600060405180830381600087803b1580156114cd57600080fd5b505af11580156114e1573d6000803e3d6000fd5b505050506114ed6116a3565b60000361150657601a54611502906001613342565b601a555b506001949350505050565b60006008600f5410156115355761152a6012600a614071565b610c35906014613e9b565b610c356007600f546115479190613e24565b611552906002614071565b61155e6012600a614071565b610e3a906014613e9b565b6000806015544261157a9190613e24565b905061158581611330565b91505090565b6000808483886040516020016115a39392919061407d565b604051602081830303815290604052805190602001209050838160001c11156115cb57600080fd5b90941495945050505050565b60006115e16116a3565b156115fe5760405162461bcd60e51b815260040161145b90614014565b61160983833361253f565b50604051637921219560e11b8152306004820152336024820152604481018590526001606482015260a06084820152600060a48201526001600160a01b0386169063f242432a9060c4016114b3565b6000808333876040516020016116709392919061407d565b604051602081830303815290604052805190602001209050828160001c111561169857600080fd5b909314949350505050565b60006008600a546116b49190613e87565b601a54610c359190613eb2565b600080835160016116d29190613ec6565b67ffffffffffffffff8111156116ea576116ea613ac6565b604051908082528060200260200182016040528015611713578160200160208202803683370190505b50905060005b8451611726906001613ec6565b81101561176a578382828151811061174057611740613ed9565b6001600160a01b03909216602092830291909101909101528061176281613eef565b915050611719565b5061103986868684612920565b600080600e5433866040516020016117919392919061407d565b6040516020818303038152906040528051906020012090508381146117c85760405162461bcd60e51b815260040161145b906140a5565b600d5481106117e95760405162461bcd60e51b815260040161145b906140f3565b6117f1613390565b60155442116118425760405162461bcd60e51b815260206004820152601d60248201527f4e6f20736f6c766520666f722066697273742035207365636f6e64732e000000604482015260640161145b565b6000600154601554426118559190613e24565b61186190610378613e9b565b61186b9190613e87565b9050600061037861187d836064613e9b565b6118879190613e87565b905060648111156118a457601a546118a0906001613342565b601a555b610bb881101561192a576118c1610378610e3a846297bb70613e9b565b6118d3620c084061139d600286614005565b6118dd9190613ec6565b9350600a6118eb8282613ec6565b6118f59190613e87565b6119069066038d7ea4c68000613e87565b3410156119255760405162461bcd60e51b815260040161145b9061413b565b6119b5565b61193b6103786113d7846018613e9b565b6119499063ce09d1b0613ec6565b93506117708110156119b557611961610bb382613e24565b9050600a61196f8282613ec6565b6119799190613e87565b611985906101f4613e9b565b6119969066038d7ea4c68000613e87565b3410156119b55760405162461bcd60e51b815260040161145b906141be565b60006119cd6305f5e10086601154610e3a9190613e9b565b6001600160a01b0387166000908152601860205260409020549091506119f39082613342565b6001600160a01b03871660008181526018602052604080822093909355915190919060008051602061432683398151915290611a329085815260200190565b60405180910390a3601754611a479082613342565b60175542601555600854600e546040805184815260208101939093528201526001600160a01b038716907fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d906060015b60405180910390a2505050509392505050565b600080600e543386604051602001611ac49392919061407d565b60408051808303601f19018152919052805160209091012095945050505050565b60008060015483610378611af99190613e9b565b611b039190613e87565b90506000610378611b15836064613e9b565b611b1f9190613e87565b9050610bb88110611b8857611770811015611b7e57611b40610bb382613e24565b9050600a611b4f826007613ec6565b611b599190613e87565b611b65906101f4613e9b565b611b769066038d7ea4c68000613e87565b949350505050565b5060009392505050565b6012811115611b9f57611b9c600382613e24565b90505b600a611bab8282613ec6565b611b659190613e87565b33600090815260186020526040812054611bcf90836132de565b33600090815260186020526040808220929092556001600160a01b03851681522054611bfb9083613342565b6001600160a01b03841660008181526018602052604090819020929092559051339060008051602061432683398151915290610d239086815260200190565b6000601b54600854610c359190613e24565b600080611c74868685600081518110611c6757611c67613ed9565b602002602001015161253f565b905060008111611cb35760405162461bcd60e51b815260206004820152600a6024820152696d696e7420697373756560b01b604482015260640161145b565b8351611cc0906001613ec6565b835114611cdf5760405162461bcd60e51b815260040161145b90614259565b60005b8451811015611db657611cf6816001613ec6565b611d01906002614071565b600854611d0e9190613eb2565b600003611db6576000611d22826001613ec6565b90505b8551811015611da357858281518110611d4057611d40613ed9565b60200260200101516001600160a01b0316868281518110611d6357611d63613ed9565b60200260200101516001600160a01b031603611d915760405162461bcd60e51b815260040161145b906142b6565b80611d9b81613eef565b915050611d25565b5080611dae81613eef565b915050611ce2565b60008060005b83811015611fec57611dcf816001613ec6565b611dda906002614071565b600854611de79190613eb2565b600003611fda57878181518110611e0057611e00613ed9565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e749190613f08565b91508115611f1557611e87600382613eb2565b158015611e9357508015155b8015611ea2575063010c8e0085115b15611ee357611edc6501d1a94a20008684600f546002611ec29190614071565b611ecc9190613e9b565b611ed69190613e9b565b90613640565b9250611f15565b611f126501d1a94a20008684600f546002611efe9190614071565b611f089190613e9b565b610e3a9190613e9b565b92505b878181518110611f2757611f27613ed9565b60200260200101516001600160a01b031663a9059cbb88836001611f4b9190613ec6565b81518110611f5b57611f5b613ed9565b6020026020010151856040518363ffffffff1660e01b8152600401611f959291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd891906142ed565b505b80611fe481613eef565b915050611dbc565b50600854600e5460408051928352602083019190915281018490526060810185905233907f87e5a7775b8ac2ead741e32752431bffeff76ec5f347cc202a6bad454653930b9060800160405180910390a25091979650505050505050565b6000546001600160a01b031633146120915760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015260640161145b565b6021546a115eec47f6cf7e350000009060ff16156120b1576120b161430f565b6021805460ff19166001179055426015556120ce6012600a614071565b6120d9906014613e9b565b6011556000600f81905560178190556008819055601b55612102670de0b6b3a764000047613e87565b6013819055612114906203d090613e9b565b612121906203d090613ec6565b47600f5460026121319190614071565b61213b9190613e9b565b6121459190613e87565b601655600b54612157906103e8613225565b600d5542600755612166613390565b612171600282613e87565b6001600160a01b038416600081815260186020526040812092909255906000805160206143268339815191526121a8600285613e87565b60405190815260200160405180910390a3600280546001600160a01b03199081166001600160a01b038681169182179093556003805483169091179055600480549091169184169190911790556001601a5560085460145561220a60006136a8565b505050565b612221670de0b6b3a764000047613e87565b6013819055612233906203d090613e9b565b612240906203d090613ec6565b47600f5460026122509190614071565b61225a9190613e9b565b6122649190613e87565b601655601f546000906122779042613e24565b9050600060145460085461228b9190613e24565b905060006122998284613e87565b90506008600f5410156122c857600f546122b4906002614071565b6122c0906102d0613e9b565b6001556122de565b6122da6007600f546115479190613e24565b6011555b60006122f460015483610378611ed69190613e9b565b90506000610378612306836064613e9b565b6123109190613e87565b905060006107d082101561235457612331610378610e3a856297bb70613e9b565b612343620c084061139d600287614005565b61234d9190613ec6565b905061235b565b5063bebc20005b60006123746305f5e1008360115489611f089190613e9b565b6004546001600160a01b031660009081526018602052604090205490915061239c9082613342565b600480546001600160a01b039081166000908152601860205260408082209490945591549251921691600080516020614326833981519152906123e29085815260200190565b60405180910390a36012546123f79082613342565b601255600a5460165460049161240c91613e9b565b6124179060c8613e9b565b6124219190613e87565b4711156124a257600454601c546016546001600160a01b0390921691612451916305f5e10091611efe878c613e9b565b6040519093506001600160a01b0382169084156108fc029085906000818181858888f1935050505015801561248a573d6000803e3d6000fd5b50601d54612499906001613e9b565b601c55506124a8565b6000601c555b5050600854601455505042601f55505050565b60008060006124c8611c3a565b6000036124db5750600092839250829150565b60075442906000906124ed9083613e24565b905060006124f9611c3a565b6125039083613e87565b9050600061250f611132565b505050905060008282620151806125269190613e9b565b6125309190613e87565b98929750909550909350505050565b600080600e5433866040516020016125599392919061407d565b6040516020818303038152906040528051906020012090508381146125905760405162461bcd60e51b815260040161145b906140a5565b600d5481106125b15760405162461bcd60e51b815260040161145b906140f3565b6125b9613390565b60155442116126025760405162461bcd60e51b81526020600482015260156024820152744e6f2073616d65207365636f6e6420736f6c76657360581b604482015260640161145b565b6000600154601554426126159190613e24565b61262190610378613e9b565b61262b9190613e87565b9050600061037861263d836064613e9b565b6126479190613e87565b9050606481111561266457601a54612660906001613342565b601a555b610bb88110156126ea57612681610378610e3a846297bb70613e9b565b612693620c084061139d600286614005565b61269d9190613ec6565b9350600a6126ab8282613ec6565b6126b59190613e87565b6126c69066038d7ea4c68000613e87565b3410156126e55760405162461bcd60e51b815260040161145b9061413b565b612779565b6126fb6103786113d7846018613e9b565b6127099063ce09d1b0613ec6565b9350611770811015612779576000612723610bb383613e24565b9050600a6127318282613ec6565b61273b9190613e87565b612747906101f4613e9b565b6127589066038d7ea4c68000613e87565b3410156127775760405162461bcd60e51b815260040161145b906141be565b505b60006127916305f5e10086601154610e3a9190613e9b565b6001600160a01b0387166000908152601860205260409020549091506127b79082613342565b6001600160a01b038716600081815260186020526040808220939093559151909190600080516020614326833981519152906127f69085815260200190565b60405180910390a360175461280b9082613342565b60175542601555601c54156128d3576107d082101561287e576000869050806001600160a01b03166108fc61284f6305f5e100601c546016548b611f089190613e9b565b6040518115909202916000818181858888f19350505050158015612877573d6000803e3d6000fd5b50506128d3565b6000869050806001600160a01b03166108fc6128a8600a601c54601654610140611f089190613e9b565b6040518115909202916000818181858888f193505050501580156128d0573d6000803e3d6000fd5b50505b600854600e546040805184815260208101939093528201526001600160a01b038716907fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d90606001611a97565b60008061294886868560008151811061293b5761293b613ed9565b6020026020010151611777565b9050600081116129875760405162461bcd60e51b815260206004820152600a6024820152696d696e7420697373756560b01b604482015260640161145b565b8351612994906001613ec6565b8351146129b35760405162461bcd60e51b815260040161145b90614259565b60005b8451811015612a8a576129ca816001613ec6565b6129d5906002614071565b6008546129e29190613eb2565b600003612a8a5760006129f6826001613ec6565b90505b8551811015612a7757858281518110612a1457612a14613ed9565b60200260200101516001600160a01b0316868281518110612a3757612a37613ed9565b60200260200101516001600160a01b031603612a655760405162461bcd60e51b815260040161145b906142b6565b80612a6f81613eef565b9150506129f9565b5080612a8281613eef565b9150506129b6565b60008060005b83811015611fec57612aa3816001613ec6565b612aae906002614071565b600854612abb9190613eb2565b600003612c8057878181518110612ad457612ad4613ed9565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b489190613f08565b91508115612bbb57612b5b600382613eb2565b158015612b6757508015155b8015612b76575063010c8e0085115b15612b9d57612b966501d1a94a20008684600f546002611ec29190614071565b9250612bbb565b612bb86501d1a94a20008684600f546002611efe9190614071565b92505b878181518110612bcd57612bcd613ed9565b60200260200101516001600160a01b031663a9059cbb88836001612bf19190613ec6565b81518110612c0157612c01613ed9565b6020026020010151856040518363ffffffff1660e01b8152600401612c3b9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015612c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7e91906142ed565b505b80612c8a81613eef565b915050612a90565b600080600e543387604051602001612cac9392919061407d565b604051602081830303815290604052805190602001209050848114612ce35760405162461bcd60e51b815260040161145b906140a5565b600d548110612d045760405162461bcd60e51b815260040161145b906140f3565b612d0c613390565b6015544211612d555760405162461bcd60e51b81526020600482015260156024820152744e6f2073616d65207365636f6e6420736f6c76657360581b604482015260640161145b565b8351835114612dcc5760405162461bcd60e51b815260206004820152603a60248201527f4d696e74546f2068617320746f20686176652073616d65206e756d626572206f60448201527f66206164647265737373657320617320457874726146756e6473000000000000606482015260840161145b565b60005b8451811015612ea357612de3816001613ec6565b612dee906002614071565b600854612dfb9190613eb2565b600003612ea3576000612e0f826001613ec6565b90505b8551811015612e9057858281518110612e2d57612e2d613ed9565b60200260200101516001600160a01b0316868281518110612e5057612e50613ed9565b60200260200101516001600160a01b031603612e7e5760405162461bcd60e51b815260040161145b906142b6565b80612e8881613eef565b915050612e12565b5080612e9b81613eef565b915050612dcf565b600060015460155442612eb69190613e24565b612ec290610378613e9b565b612ecc9190613e87565b90506000610378612ede836064613e9b565b612ee89190613e87565b905060006064821115612f0757601a54612f03906001613342565b601a555b610bb8821015612f8d57612f24610378610e3a856297bb70613e9b565b612f36620c084061139d600287614005565b612f409190613ec6565b9050600a612f4e8382613ec6565b612f589190613e87565b612f699066038d7ea4c68000613e87565b341015612f885760405162461bcd60e51b815260040161145b9061413b565b613018565b612f9e6103786113d7856018613e9b565b612fac9063ce09d1b0613ec6565b905061177082101561301857612fc4610bb383613e24565b9150600a612fd28382613ec6565b612fdc9190613e87565b612fe8906101f4613e9b565b612ff99066038d7ea4c68000613e87565b3410156130185760405162461bcd60e51b815260040161145b906141be565b6000805b858110156132125761302f856001613ec6565b61303a906002614071565b6008546130479190613eb2565b6000036132005789858151811061306057613060613ed9565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156130b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d49190613f08565b91508115613200576130e7600386613eb2565b1580156130f357508415155b8015613102575063010c8e0083115b15613129576131226501d1a94a20008484600f546002611ec29190614071565b9250613147565b6131446501d1a94a20008484600f546002611efe9190614071565b92505b89858151811061315957613159613ed9565b60200260200101516001600160a01b031663a9059cbb8a878151811061318157613181613ed9565b6020026020010151856040518363ffffffff1660e01b81526004016131bb9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156131da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131fe91906142ed565b505b8061320a81613eef565b91505061301c565b5050426015559998505050505050505050565b6000816000036132655760405162461bcd60e51b815260206004820152600b60248201526a446976206279207a65726f60a81b604482015260640161145b565b61326f8284613e87565b9392505050565b60008260000361328857506000610d2f565b60006132948385613e9b565b9050826132a18583613e87565b1461326f5760405162461bcd60e51b815260206004820152600d60248201526c4d756c74206f766572666c6f7760981b604482015260640161145b565b6000818310156133205760405162461bcd60e51b815260206004820152600d60248201526c53756220756e646572666c6f7760981b604482015260640161145b565b61326f8284613e24565b60008183111561333b575080610d2f565b5090919050565b60008061334f8385613ec6565b90508381101561326f5760405162461bcd60e51b815260206004820152600c60248201526b416464206f766572666c6f7760a01b604482015260640161145b565b6010546011546017546133a291613342565b1180156133b05750600f8054105b1561348157600f546133c3906001613ec6565b600f8190556133eb906133d7906001613ec6565b6133e2906002614071565b60065490613225565b6006546133f89190613e24565b601055600f546008111561346b57600c54613414906002613225565b600c55600f54613425906002614071565b613431906102d0613e9b565b600155600f5460061115613466576010600a5411613453576008600a55613481565b6002600a546134629190613e87565b600a555b613481565b61347d6007600f546115479190613e24565b6011555b60085461348f906001613342565b6008908155600a546134a19190613e87565b601b546008546134b19190613e24565b6134bb9190613eb2565b60000361355d576134ca61220f565b6134dc600f5460016133d79190613ec6565b6006546134e99190613e24565b60105560095442906000906134fe9083613e24565b905060006008600a546135119190613e87565b60015461351e9190613e9b565b4260095590508082118061354c5750600a54601b546008546135409190613e24565b61354a9190613eb2565b155b1561355957613559613758565b5050505b60646001600160a01b0316632b407a82600160646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135d29190613f08565b6135dc9190613e24565b6040518263ffffffff1660e01b81526004016135fa91815260200190565b602060405180830381865afa158015613617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061363b9190613f08565b600e55565b6000816000036136805760405162461bcd60e51b815260206004820152600b60248201526a446976206279207a65726f60a81b604482015260640161145b565b600061368c8385613e87565b90506136988385613eb2565b1561326f57611b76816001613ec6565b6000546001600160a01b031633146136ef5760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015260640161145b565b600054604080516001600160a01b03928316815291831660208301527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b600754429060009061376a9083613e24565b90506000601b5460085461377e9190613e24565b90506000816001546137909190613e9b565b600854601b559050808310156137f65760006137b184610e3a846064613276565b6001601d55905060006137cb6103e8610e558460646132de565b90506137eb610e8182610e7b6107d0600d5461322590919063ffffffff16565b600d55506138479050565b600061380782610e3a866064613276565b6002601d55905060006138216103e8610e558460646132de565b9050613841610ed982610e7b6101f4600d5461322590919063ffffffff16565b600d5550505b8360078190555060646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561388d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138b19190613f08565b602055600c54600d5410156138c757600c54600d555b600b54600d5411156138da57600b54600d555b50505050565b600060208083528351808285015260005b8181101561390d578581018301518582016040015282016138f1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461394557600080fd5b919050565b6000806040838503121561395d57600080fd5b6139668361392e565b946020939093013593505050565b60008083601f84011261398657600080fd5b50813567ffffffffffffffff81111561399e57600080fd5b6020830191508360208285010111156139b657600080fd5b9250929050565b60008060008060008060a087890312156139d657600080fd5b6139df8761392e565b95506139ed6020880161392e565b94506040870135935060608701359250608087013567ffffffffffffffff811115613a1757600080fd5b613a2389828a01613974565b979a9699509497509295939492505050565b600080600080600060808688031215613a4d57600080fd5b613a568661392e565b9450613a646020870161392e565b935060408601359250606086013567ffffffffffffffff811115613a8757600080fd5b613a9388828901613974565b969995985093965092949392505050565b60008060408385031215613ab757600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613aed57600080fd5b8135602067ffffffffffffffff80831115613b0a57613b0a613ac6565b8260051b604051601f19603f83011681018181108482111715613b2f57613b2f613ac6565b604052938452858101830193838101925087851115613b4d57600080fd5b83870191505b84821015613b7357613b648261392e565b83529183019190830190613b53565b979650505050505050565b60008060008060808587031215613b9457600080fd5b8435935060208501359250604085013567ffffffffffffffff811115613bb957600080fd5b613bc587828801613adc565b925050613bd46060860161392e565b905092959194509250565b600080600060608486031215613bf457600080fd5b613bfd8461392e565b9250613c0b6020850161392e565b9150604084013590509250925092565b600060208284031215613c2d57600080fd5b5035919050565b60008060008060808587031215613c4a57600080fd5b613c538561392e565b966020860135965060408601359560600135945092505050565b600080600080600060a08688031215613c8557600080fd5b85359450602086013593506040860135925060608601359150613caa6080870161392e565b90509295509295909350565b600060208284031215613cc857600080fd5b61326f8261392e565b60008060008060808587031215613ce757600080fd5b5050823594602084013594506040840135936060013592509050565b600080600060608486031215613d1857600080fd5b8335925060208401359150613d2f6040850161392e565b90509250925092565b600080600060608486031215613d4d57600080fd5b505081359360208301359350604090920135919050565b60008060008060808587031215613d7a57600080fd5b8435935060208501359250604085013567ffffffffffffffff80821115613da057600080fd5b613dac88838901613adc565b93506060870135915080821115613dc257600080fd5b50613dcf87828801613adc565b91505092959194509250565b60008060408385031215613dee57600080fd5b613df78361392e565b9150613e056020840161392e565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610d2f57610d2f613e0e565b600181811c90821680613e4b57607f821691505b602082108103613e6b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601260045260246000fd5b600082613e9657613e96613e71565b500490565b8082028115828204841417610d2f57610d2f613e0e565b600082613ec157613ec1613e71565b500690565b80820180821115610d2f57610d2f613e0e565b634e487b7160e01b600052603260045260246000fd5b600060018201613f0157613f01613e0e565b5060010190565b600060208284031215613f1a57600080fd5b5051919050565b600181815b80851115613f5c578160001904821115613f4257613f42613e0e565b80851615613f4f57918102915b93841c9390800290613f26565b509250929050565b600082613f7357506001610d2f565b81613f8057506000610d2f565b8160018114613f965760028114613fa057613fbc565b6001915050610d2f565b60ff841115613fb157613fb1613e0e565b50506001821b610d2f565b5060208310610133831016604e8410600b8410161715613fdf575081810a610d2f565b613fe98383613f21565b8060001904821115613ffd57613ffd613e0e565b029392505050565b600061326f60ff841683613f64565b60208082526039908201527f4f6e6c79206d696e74206f6e20736c6f77426c6f636b732025205f424c4f434b60408201527f535f5045525f524541444a5553544d454e542f38203d3d203000000000000000606082015260800190565b600061326f8383613f64565b92835260609190911b6bffffffffffffffffffffffff19166020830152603482015260540190565b6020808252602e908201527f4f6c64206368616c6c656e67655f646967657374206f722077726f6e6720636860408201526d185b1b195b99d957d91a59d95cdd60921b606082015260800190565b60208082526028908201527f446967657374206d75737420626520736d616c6c6572207468616e206d696e696040820152671b99d5185c99d95d60c21b606082015260800190565b6020808252605a908201527f4d7573742073656e64206d6f726520455448206265636175736520726571756960408201527f726573206574682c20636865636b20686f774d75636845544828292066756e6360608201527f74696f6e20746f2066696e6420616d6f756e74206e6565646564000000000000608082015260a00190565b6020808252606f908201527f4d7573742073656e64206d6f726520455448206265636175736520726571756960408201527f7265732065746820756e74696c203630782074617267657454696d652c20636860608201527f65636b20686f774d75636845544828292066756e6374696f6e20746f2066696e60808201526e1908185b5bdd5b9d081b9959591959608a1b60a082015260c00190565b6020808252603a908201527f4d696e74546f2068617320746f206861766520616e206578747261206164647260408201527f65737320636f6d706172656420746f20457874726146756e6473000000000000606082015260800190565b6020808252601b908201527f4e6f207072696e74696e67205468652073616d6520746f6b656e730000000000604082015260600190565b6000602082840312156142ff57600080fd5b8151801515811461326f57600080fd5b634e487b7160e01b600052600160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122071e9ef78024eb4834277a390da30104b57ebfd0816c68d6436d099cb420b937c64736f6c63430008110033417262697472756d20426974636f696e20616e64205374616b696e6720546f6b656e

Deployed Bytecode

0x60806040526004361061041b5760003560e01c806370a082311161021c578063a7ef6b8f11610122578063d0f66e4b116100b0578063f23a6e6111610077578063f23a6e61146104e9578063f2f3bf2d14610bd5578063f56f8d3614610be8578063f7a5f15514610bfc578063f95d391914610c0f57005b8063d0f66e4b14610b20578063dc6e9cf914610b50578063dd62ed3e14610b66578063ddfbd8dd14610bac578063e932012b14610bbf57005b8063c76ae540116100f4578063c76ae54014610aad578063c8a1465c14610ac2578063cb9ae70714610ad5578063cfcb52d414610aeb578063d0856d1614610b0b57005b8063a7ef6b8f14610a42578063a9059cbb14610a62578063b5ade81b14610a82578063c0abebe014610a9857005b80638ae0368b116101aa57806397566aa01161017157806397566aa0146109c057806399f584b3146109e05780639e96a23a146109f6578063a2ac4c3714610a0c578063a68eb88e14610a2c57005b80638ae0368b146109275780638c0838ab1461093d5780638da5cb5b1461095057806394b939ef1461097057806395d89b411461099057005b8063819c9d9e116101ee578063819c9d9e146108bd578063829965cc146108d257806387a2a9d6146108e85780638a083c98146108fe5780638a769d351461091157005b806370a082311461083f578063757991a81461087557806377ed6b141461088a57806381269a561461089d57005b80632d38bf7a1161032157806345d8a232116102af5780634ef37628116102765780634ef37628146107c95780634fa972e1146107de578063653517ef146107f457806369d3e5df146108095780636de9f32b1461082957005b806345d8a23214610762578063467d809e1461077857806347353b691461078b578063490203a71461079e5780634cbf68fe146107b357005b806334d5b131116102f357806334d5b131146106ec57806335b80bfb146107015780633c953615146107215780633dc8a068146107375780634513e1441461074d57005b80632d38bf7a146106625780632f104e0c14610678578063313ce567146106b057806332e99708146106d757005b80631763a089116103a9578063237ef7db11610370578063237ef7db146105ec5780632381a60e1461060257806323b872dd14610618578063240c3b70146106385780632b112e491461064d57005b80631763a0891461058657806317da485f1461059b5780631801fbe5146105b057806318160ddd146105c35780631fccb33c146105d957005b80630a891b83116103ed5780630a891b83146104b45780630c97e564146104e9578063102943171461052f578063111f95d814610545578063150b7a021461055a57005b8063012d3edf1461042457806305411d881461044d57806306fdde0314610462578063095ea7b31461048457005b3661042257005b005b34801561043057600080fd5b5061043a601b5481565b6040519081526020015b60405180910390f35b34801561045957600080fd5b5061043a610c25565b34801561046e57600080fd5b50610477610c3a565b60405161044491906138e0565b34801561049057600080fd5b506104a461049f36600461394a565b610cc8565b6040519015158152602001610444565b3480156104c057600080fd5b506104c9610d35565b604080519485526020850193909352918301526060820152608001610444565b3480156104f557600080fd5b506105166105043660046139bd565b63f23a6e6160e01b9695505050505050565b6040516001600160e01b03199091168152602001610444565b34801561053b57600080fd5b5061043a60155481565b34801561055157600080fd5b5061043a610dbd565b34801561056657600080fd5b50610516610575366004613a35565b630a85bd0160e11b95945050505050565b34801561059257600080fd5b5061043a610f1c565b3480156105a757600080fd5b5061043a610f53565b6104a46105be366004613aa4565b610f6c565b3480156105cf57600080fd5b5061043a60055481565b6104a46105e7366004613b7e565b610f83565b3480156105f857600080fd5b5061043a60095481565b34801561060e57600080fd5b5061043a60115481565b34801561062457600080fd5b506104a4610633366004613bdf565b611046565b34801561064457600080fd5b506104c9611132565b34801561065957600080fd5b5061043a6111a2565b34801561066e57600080fd5b5061043a600f5481565b34801561068457600080fd5b50600454610698906001600160a01b031681565b6040516001600160a01b039091168152602001610444565b3480156106bc57600080fd5b506106c5601281565b60405160ff9091168152602001610444565b3480156106e357600080fd5b50600d5461043a565b3480156106f857600080fd5b5061043a61122d565b34801561070d57600080fd5b5061043a61071c366004613c1b565b611330565b34801561072d57600080fd5b5061043a601c5481565b34801561074357600080fd5b5061043a60145481565b34801561075957600080fd5b5061043a611414565b34801561076e57600080fd5b5061043a60015481565b6104a4610786366004613aa4565b611427565b6104a4610799366004613c34565b611434565b3480156107aa57600080fd5b5061043a611511565b3480156107bf57600080fd5b5061043a601a5481565b3480156107d557600080fd5b50600e5461043a565b3480156107ea57600080fd5b5061043a60105481565b34801561080057600080fd5b5061043a611569565b34801561081557600080fd5b506104a4610824366004613c6d565b61158b565b34801561083557600080fd5b5061043a60175481565b34801561084b57600080fd5b5061043a61085a366004613cb6565b6001600160a01b031660009081526018602052604090205490565b34801561088157600080fd5b5060085461043a565b6104a4610898366004613c34565b6115d7565b3480156108a957600080fd5b506104a46108b8366004613cd1565b611658565b3480156108c957600080fd5b5061043a6116a3565b3480156108de57600080fd5b5061043a60085481565b3480156108f457600080fd5b5061043a600b5481565b6104a461090c366004613b7e565b6116c1565b34801561091d57600080fd5b5061043a600d5481565b34801561093357600080fd5b5061043a600e5481565b61043a61094b366004613d03565b611777565b34801561095c57600080fd5b50600054610698906001600160a01b031681565b34801561097c57600080fd5b50600254610698906001600160a01b031681565b34801561099c57600080fd5b50610477604051806040016040528060048152602001634142415360e01b81525081565b3480156109cc57600080fd5b5061043a6109db366004613d38565b611aaa565b3480156109ec57600080fd5b5061043a60135481565b348015610a0257600080fd5b5061043a601d5481565b348015610a1857600080fd5b5061043a610a27366004613c1b565b611ae5565b348015610a3857600080fd5b5061043a60165481565b348015610a4e57600080fd5b50600354610698906001600160a01b031681565b348015610a6e57600080fd5b506104a4610a7d36600461394a565b611bb5565b348015610a8e57600080fd5b5061043a600a5481565b348015610aa457600080fd5b5060175461043a565b348015610ab957600080fd5b5061043a611c3a565b61043a610ad0366004613d64565b611c4c565b348015610ae157600080fd5b5061043a60205481565b348015610af757600080fd5b50610422610b06366004613ddb565b61204a565b348015610b1757600080fd5b5061042261220f565b348015610b2c57600080fd5b50610b356124bb565b60408051938452602084019290925290820152606001610444565b348015610b5c57600080fd5b5061043a600c5481565b348015610b7257600080fd5b5061043a610b81366004613ddb565b6001600160a01b03918216600090815260196020908152604080832093909416825291909152205490565b61043a610bba366004613d03565b61253f565b348015610bcb57600080fd5b5061043a60075481565b61043a610be3366004613d64565b612920565b348015610bf457600080fd5b50333161043a565b61043a610c0a366004613d64565b612c92565b348015610c1b57600080fd5b5061043a60125481565b600060155442610c359190613e24565b905090565b601e8054610c4790613e37565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7390613e37565b8015610cc05780601f10610c9557610100808354040283529160200191610cc0565b820191906000526020600020905b815481529060010190602001808311610ca357829003601f168201915b505050505081565b3360008181526019602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610d239086815260200190565b60405180910390a35060015b92915050565b600080600080601b54600854610d4b9190613e24565b600003610d6357506000925082915081905080610db7565b6007544290600090610d759083613e24565b9050610d7f611c3a565b610d899082613e87565b9250610d9483611330565b93506301e13380610da58482613e87565b9550610db18686613e9b565b96505050505b90919293565b6000601b54600854610dcf9190613e24565b600003610de557600d54600b54610c3591613225565b6007544290600090610df79083613e24565b90506000601b54600854610e0b9190613e24565b9050600081600154610e1d9190613e9b565b9050600081841015610e93576000610e4085610e3a856064613276565b90613225565b90506000610e5b6103e8610e558460646132de565b9061332a565b9050610e8a610e8182610e7b6107d0600d5461322590919063ffffffff16565b90613276565b600d54906132de565b92505050610ee7565b6000610ea483610e3a876064613276565b90506000610eb96103e8610e558460646132de565b9050610ee2610ed982610e7b6101f4600d5461322590919063ffffffff16565b600d5490613342565b925050505b600c54811015610ef65750600c545b600b54811115610f055750600b545b600b54610f129082613225565b9550505050505090565b60006008600a54610f2d9190613e87565b601a54610f3a9190613eb2565b6008600a54610f499190613e87565b610c359190613e24565b6000610c35600d54600b5461322590919063ffffffff16565b6000610f7983833361253f565b5060019392505050565b60008083516001610f949190613ec6565b67ffffffffffffffff811115610fac57610fac613ac6565b604051908082528060200260200182016040528015610fd5578160200160208202803683370190505b50905060005b8451610fe8906001613ec6565b81101561102c578382828151811061100257611002613ed9565b6001600160a01b03909216602092830291909101909101528061102481613eef565b915050610fdb565b5061103986868684611c4c565b5060019695505050505050565b6001600160a01b03831660009081526018602052604081205461106990836132de565b6001600160a01b03851660009081526018602090815260408083209390935560198152828220338352905220546110a090836132de565b6001600160a01b0380861660009081526019602090815260408083203384528252808320949094559186168152601890915220546110de9083613342565b6001600160a01b038085166000818152601860205260409081902093909355915190861690600080516020614326833981519152906111209086815260200190565b60405180910390a35060019392505050565b6000806000806000611142610d35565b505050905061016d816111559190613e87565b91508160000361117357600080600080945094509450945050610db7565b816017546010546111849190613e24565b61118e9190613e87565b601054601754919650945092505090919293565b6003546040805160016224c73d60e11b0319815290516000926001600160a01b03169163ffb671869160048083019260209291908290030181865afa1580156111ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112139190613f08565b6012546017546112239190613ec6565b610c359190613ec6565b6000601b5460085461123f9190613e24565b60000361126657601d546001036112575750600a5490565b6008600a54610c359190613e87565b60095442906000906112789083613e24565b905060006008600a5461128b9190613e87565b601b5460085461129b9190613e24565b6112a59190613eb2565b6001546112b29190613e9b565b905080821115611306576008600a546112cb9190613e87565b601b546008546112db9190613e24565b6112e59190613eb2565b6008600a546112f49190613e87565b6112fe9190613e24565b935050505090565b600a54601b546008546113199190613e24565b6113239190613eb2565b600a546112fe9190613e24565b600080600154836103786113449190613e9b565b61134e9190613e87565b90506000610378611360836064613e9b565b61136a9190613e87565b90506000610bb88210156113c65761138b610378610e3a856297bb70613e9b565b6113b5620c084061139d600287614005565b6113a890600f613e9b565b610e3a906207c2be613e9b565b6113bf9190613ec6565b90506113f5565b6113e46103786113d7856018613e9b565b610e3a90624d9b6c613e9b565b6113f29063ce09d1b0613ec6565b90505b61140b6305f5e10082601154610e3a9190613e9b565b95945050505050565b6000610c3560155442610a279190613e24565b6000610f79838333611777565b600061143e6116a3565b156114645760405162461bcd60e51b815260040161145b90614014565b60405180910390fd5b61146f83833361253f565b50604051635c46a7ef60e11b81523060048201523360248201526044810185905260806064820152600060848201526001600160a01b0386169063b88d4fde9060a4015b600060405180830381600087803b1580156114cd57600080fd5b505af11580156114e1573d6000803e3d6000fd5b505050506114ed6116a3565b60000361150657601a54611502906001613342565b601a555b506001949350505050565b60006008600f5410156115355761152a6012600a614071565b610c35906014613e9b565b610c356007600f546115479190613e24565b611552906002614071565b61155e6012600a614071565b610e3a906014613e9b565b6000806015544261157a9190613e24565b905061158581611330565b91505090565b6000808483886040516020016115a39392919061407d565b604051602081830303815290604052805190602001209050838160001c11156115cb57600080fd5b90941495945050505050565b60006115e16116a3565b156115fe5760405162461bcd60e51b815260040161145b90614014565b61160983833361253f565b50604051637921219560e11b8152306004820152336024820152604481018590526001606482015260a06084820152600060a48201526001600160a01b0386169063f242432a9060c4016114b3565b6000808333876040516020016116709392919061407d565b604051602081830303815290604052805190602001209050828160001c111561169857600080fd5b909314949350505050565b60006008600a546116b49190613e87565b601a54610c359190613eb2565b600080835160016116d29190613ec6565b67ffffffffffffffff8111156116ea576116ea613ac6565b604051908082528060200260200182016040528015611713578160200160208202803683370190505b50905060005b8451611726906001613ec6565b81101561176a578382828151811061174057611740613ed9565b6001600160a01b03909216602092830291909101909101528061176281613eef565b915050611719565b5061103986868684612920565b600080600e5433866040516020016117919392919061407d565b6040516020818303038152906040528051906020012090508381146117c85760405162461bcd60e51b815260040161145b906140a5565b600d5481106117e95760405162461bcd60e51b815260040161145b906140f3565b6117f1613390565b60155442116118425760405162461bcd60e51b815260206004820152601d60248201527f4e6f20736f6c766520666f722066697273742035207365636f6e64732e000000604482015260640161145b565b6000600154601554426118559190613e24565b61186190610378613e9b565b61186b9190613e87565b9050600061037861187d836064613e9b565b6118879190613e87565b905060648111156118a457601a546118a0906001613342565b601a555b610bb881101561192a576118c1610378610e3a846297bb70613e9b565b6118d3620c084061139d600286614005565b6118dd9190613ec6565b9350600a6118eb8282613ec6565b6118f59190613e87565b6119069066038d7ea4c68000613e87565b3410156119255760405162461bcd60e51b815260040161145b9061413b565b6119b5565b61193b6103786113d7846018613e9b565b6119499063ce09d1b0613ec6565b93506117708110156119b557611961610bb382613e24565b9050600a61196f8282613ec6565b6119799190613e87565b611985906101f4613e9b565b6119969066038d7ea4c68000613e87565b3410156119b55760405162461bcd60e51b815260040161145b906141be565b60006119cd6305f5e10086601154610e3a9190613e9b565b6001600160a01b0387166000908152601860205260409020549091506119f39082613342565b6001600160a01b03871660008181526018602052604080822093909355915190919060008051602061432683398151915290611a329085815260200190565b60405180910390a3601754611a479082613342565b60175542601555600854600e546040805184815260208101939093528201526001600160a01b038716907fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d906060015b60405180910390a2505050509392505050565b600080600e543386604051602001611ac49392919061407d565b60408051808303601f19018152919052805160209091012095945050505050565b60008060015483610378611af99190613e9b565b611b039190613e87565b90506000610378611b15836064613e9b565b611b1f9190613e87565b9050610bb88110611b8857611770811015611b7e57611b40610bb382613e24565b9050600a611b4f826007613ec6565b611b599190613e87565b611b65906101f4613e9b565b611b769066038d7ea4c68000613e87565b949350505050565b5060009392505050565b6012811115611b9f57611b9c600382613e24565b90505b600a611bab8282613ec6565b611b659190613e87565b33600090815260186020526040812054611bcf90836132de565b33600090815260186020526040808220929092556001600160a01b03851681522054611bfb9083613342565b6001600160a01b03841660008181526018602052604090819020929092559051339060008051602061432683398151915290610d239086815260200190565b6000601b54600854610c359190613e24565b600080611c74868685600081518110611c6757611c67613ed9565b602002602001015161253f565b905060008111611cb35760405162461bcd60e51b815260206004820152600a6024820152696d696e7420697373756560b01b604482015260640161145b565b8351611cc0906001613ec6565b835114611cdf5760405162461bcd60e51b815260040161145b90614259565b60005b8451811015611db657611cf6816001613ec6565b611d01906002614071565b600854611d0e9190613eb2565b600003611db6576000611d22826001613ec6565b90505b8551811015611da357858281518110611d4057611d40613ed9565b60200260200101516001600160a01b0316868281518110611d6357611d63613ed9565b60200260200101516001600160a01b031603611d915760405162461bcd60e51b815260040161145b906142b6565b80611d9b81613eef565b915050611d25565b5080611dae81613eef565b915050611ce2565b60008060005b83811015611fec57611dcf816001613ec6565b611dda906002614071565b600854611de79190613eb2565b600003611fda57878181518110611e0057611e00613ed9565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e749190613f08565b91508115611f1557611e87600382613eb2565b158015611e9357508015155b8015611ea2575063010c8e0085115b15611ee357611edc6501d1a94a20008684600f546002611ec29190614071565b611ecc9190613e9b565b611ed69190613e9b565b90613640565b9250611f15565b611f126501d1a94a20008684600f546002611efe9190614071565b611f089190613e9b565b610e3a9190613e9b565b92505b878181518110611f2757611f27613ed9565b60200260200101516001600160a01b031663a9059cbb88836001611f4b9190613ec6565b81518110611f5b57611f5b613ed9565b6020026020010151856040518363ffffffff1660e01b8152600401611f959291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd891906142ed565b505b80611fe481613eef565b915050611dbc565b50600854600e5460408051928352602083019190915281018490526060810185905233907f87e5a7775b8ac2ead741e32752431bffeff76ec5f347cc202a6bad454653930b9060800160405180910390a25091979650505050505050565b6000546001600160a01b031633146120915760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015260640161145b565b6021546a115eec47f6cf7e350000009060ff16156120b1576120b161430f565b6021805460ff19166001179055426015556120ce6012600a614071565b6120d9906014613e9b565b6011556000600f81905560178190556008819055601b55612102670de0b6b3a764000047613e87565b6013819055612114906203d090613e9b565b612121906203d090613ec6565b47600f5460026121319190614071565b61213b9190613e9b565b6121459190613e87565b601655600b54612157906103e8613225565b600d5542600755612166613390565b612171600282613e87565b6001600160a01b038416600081815260186020526040812092909255906000805160206143268339815191526121a8600285613e87565b60405190815260200160405180910390a3600280546001600160a01b03199081166001600160a01b038681169182179093556003805483169091179055600480549091169184169190911790556001601a5560085460145561220a60006136a8565b505050565b612221670de0b6b3a764000047613e87565b6013819055612233906203d090613e9b565b612240906203d090613ec6565b47600f5460026122509190614071565b61225a9190613e9b565b6122649190613e87565b601655601f546000906122779042613e24565b9050600060145460085461228b9190613e24565b905060006122998284613e87565b90506008600f5410156122c857600f546122b4906002614071565b6122c0906102d0613e9b565b6001556122de565b6122da6007600f546115479190613e24565b6011555b60006122f460015483610378611ed69190613e9b565b90506000610378612306836064613e9b565b6123109190613e87565b905060006107d082101561235457612331610378610e3a856297bb70613e9b565b612343620c084061139d600287614005565b61234d9190613ec6565b905061235b565b5063bebc20005b60006123746305f5e1008360115489611f089190613e9b565b6004546001600160a01b031660009081526018602052604090205490915061239c9082613342565b600480546001600160a01b039081166000908152601860205260408082209490945591549251921691600080516020614326833981519152906123e29085815260200190565b60405180910390a36012546123f79082613342565b601255600a5460165460049161240c91613e9b565b6124179060c8613e9b565b6124219190613e87565b4711156124a257600454601c546016546001600160a01b0390921691612451916305f5e10091611efe878c613e9b565b6040519093506001600160a01b0382169084156108fc029085906000818181858888f1935050505015801561248a573d6000803e3d6000fd5b50601d54612499906001613e9b565b601c55506124a8565b6000601c555b5050600854601455505042601f55505050565b60008060006124c8611c3a565b6000036124db5750600092839250829150565b60075442906000906124ed9083613e24565b905060006124f9611c3a565b6125039083613e87565b9050600061250f611132565b505050905060008282620151806125269190613e9b565b6125309190613e87565b98929750909550909350505050565b600080600e5433866040516020016125599392919061407d565b6040516020818303038152906040528051906020012090508381146125905760405162461bcd60e51b815260040161145b906140a5565b600d5481106125b15760405162461bcd60e51b815260040161145b906140f3565b6125b9613390565b60155442116126025760405162461bcd60e51b81526020600482015260156024820152744e6f2073616d65207365636f6e6420736f6c76657360581b604482015260640161145b565b6000600154601554426126159190613e24565b61262190610378613e9b565b61262b9190613e87565b9050600061037861263d836064613e9b565b6126479190613e87565b9050606481111561266457601a54612660906001613342565b601a555b610bb88110156126ea57612681610378610e3a846297bb70613e9b565b612693620c084061139d600286614005565b61269d9190613ec6565b9350600a6126ab8282613ec6565b6126b59190613e87565b6126c69066038d7ea4c68000613e87565b3410156126e55760405162461bcd60e51b815260040161145b9061413b565b612779565b6126fb6103786113d7846018613e9b565b6127099063ce09d1b0613ec6565b9350611770811015612779576000612723610bb383613e24565b9050600a6127318282613ec6565b61273b9190613e87565b612747906101f4613e9b565b6127589066038d7ea4c68000613e87565b3410156127775760405162461bcd60e51b815260040161145b906141be565b505b60006127916305f5e10086601154610e3a9190613e9b565b6001600160a01b0387166000908152601860205260409020549091506127b79082613342565b6001600160a01b038716600081815260186020526040808220939093559151909190600080516020614326833981519152906127f69085815260200190565b60405180910390a360175461280b9082613342565b60175542601555601c54156128d3576107d082101561287e576000869050806001600160a01b03166108fc61284f6305f5e100601c546016548b611f089190613e9b565b6040518115909202916000818181858888f19350505050158015612877573d6000803e3d6000fd5b50506128d3565b6000869050806001600160a01b03166108fc6128a8600a601c54601654610140611f089190613e9b565b6040518115909202916000818181858888f193505050501580156128d0573d6000803e3d6000fd5b50505b600854600e546040805184815260208101939093528201526001600160a01b038716907fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d90606001611a97565b60008061294886868560008151811061293b5761293b613ed9565b6020026020010151611777565b9050600081116129875760405162461bcd60e51b815260206004820152600a6024820152696d696e7420697373756560b01b604482015260640161145b565b8351612994906001613ec6565b8351146129b35760405162461bcd60e51b815260040161145b90614259565b60005b8451811015612a8a576129ca816001613ec6565b6129d5906002614071565b6008546129e29190613eb2565b600003612a8a5760006129f6826001613ec6565b90505b8551811015612a7757858281518110612a1457612a14613ed9565b60200260200101516001600160a01b0316868281518110612a3757612a37613ed9565b60200260200101516001600160a01b031603612a655760405162461bcd60e51b815260040161145b906142b6565b80612a6f81613eef565b9150506129f9565b5080612a8281613eef565b9150506129b6565b60008060005b83811015611fec57612aa3816001613ec6565b612aae906002614071565b600854612abb9190613eb2565b600003612c8057878181518110612ad457612ad4613ed9565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b489190613f08565b91508115612bbb57612b5b600382613eb2565b158015612b6757508015155b8015612b76575063010c8e0085115b15612b9d57612b966501d1a94a20008684600f546002611ec29190614071565b9250612bbb565b612bb86501d1a94a20008684600f546002611efe9190614071565b92505b878181518110612bcd57612bcd613ed9565b60200260200101516001600160a01b031663a9059cbb88836001612bf19190613ec6565b81518110612c0157612c01613ed9565b6020026020010151856040518363ffffffff1660e01b8152600401612c3b9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015612c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7e91906142ed565b505b80612c8a81613eef565b915050612a90565b600080600e543387604051602001612cac9392919061407d565b604051602081830303815290604052805190602001209050848114612ce35760405162461bcd60e51b815260040161145b906140a5565b600d548110612d045760405162461bcd60e51b815260040161145b906140f3565b612d0c613390565b6015544211612d555760405162461bcd60e51b81526020600482015260156024820152744e6f2073616d65207365636f6e6420736f6c76657360581b604482015260640161145b565b8351835114612dcc5760405162461bcd60e51b815260206004820152603a60248201527f4d696e74546f2068617320746f20686176652073616d65206e756d626572206f60448201527f66206164647265737373657320617320457874726146756e6473000000000000606482015260840161145b565b60005b8451811015612ea357612de3816001613ec6565b612dee906002614071565b600854612dfb9190613eb2565b600003612ea3576000612e0f826001613ec6565b90505b8551811015612e9057858281518110612e2d57612e2d613ed9565b60200260200101516001600160a01b0316868281518110612e5057612e50613ed9565b60200260200101516001600160a01b031603612e7e5760405162461bcd60e51b815260040161145b906142b6565b80612e8881613eef565b915050612e12565b5080612e9b81613eef565b915050612dcf565b600060015460155442612eb69190613e24565b612ec290610378613e9b565b612ecc9190613e87565b90506000610378612ede836064613e9b565b612ee89190613e87565b905060006064821115612f0757601a54612f03906001613342565b601a555b610bb8821015612f8d57612f24610378610e3a856297bb70613e9b565b612f36620c084061139d600287614005565b612f409190613ec6565b9050600a612f4e8382613ec6565b612f589190613e87565b612f699066038d7ea4c68000613e87565b341015612f885760405162461bcd60e51b815260040161145b9061413b565b613018565b612f9e6103786113d7856018613e9b565b612fac9063ce09d1b0613ec6565b905061177082101561301857612fc4610bb383613e24565b9150600a612fd28382613ec6565b612fdc9190613e87565b612fe8906101f4613e9b565b612ff99066038d7ea4c68000613e87565b3410156130185760405162461bcd60e51b815260040161145b906141be565b6000805b858110156132125761302f856001613ec6565b61303a906002614071565b6008546130479190613eb2565b6000036132005789858151811061306057613060613ed9565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156130b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d49190613f08565b91508115613200576130e7600386613eb2565b1580156130f357508415155b8015613102575063010c8e0083115b15613129576131226501d1a94a20008484600f546002611ec29190614071565b9250613147565b6131446501d1a94a20008484600f546002611efe9190614071565b92505b89858151811061315957613159613ed9565b60200260200101516001600160a01b031663a9059cbb8a878151811061318157613181613ed9565b6020026020010151856040518363ffffffff1660e01b81526004016131bb9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156131da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131fe91906142ed565b505b8061320a81613eef565b91505061301c565b5050426015559998505050505050505050565b6000816000036132655760405162461bcd60e51b815260206004820152600b60248201526a446976206279207a65726f60a81b604482015260640161145b565b61326f8284613e87565b9392505050565b60008260000361328857506000610d2f565b60006132948385613e9b565b9050826132a18583613e87565b1461326f5760405162461bcd60e51b815260206004820152600d60248201526c4d756c74206f766572666c6f7760981b604482015260640161145b565b6000818310156133205760405162461bcd60e51b815260206004820152600d60248201526c53756220756e646572666c6f7760981b604482015260640161145b565b61326f8284613e24565b60008183111561333b575080610d2f565b5090919050565b60008061334f8385613ec6565b90508381101561326f5760405162461bcd60e51b815260206004820152600c60248201526b416464206f766572666c6f7760a01b604482015260640161145b565b6010546011546017546133a291613342565b1180156133b05750600f8054105b1561348157600f546133c3906001613ec6565b600f8190556133eb906133d7906001613ec6565b6133e2906002614071565b60065490613225565b6006546133f89190613e24565b601055600f546008111561346b57600c54613414906002613225565b600c55600f54613425906002614071565b613431906102d0613e9b565b600155600f5460061115613466576010600a5411613453576008600a55613481565b6002600a546134629190613e87565b600a555b613481565b61347d6007600f546115479190613e24565b6011555b60085461348f906001613342565b6008908155600a546134a19190613e87565b601b546008546134b19190613e24565b6134bb9190613eb2565b60000361355d576134ca61220f565b6134dc600f5460016133d79190613ec6565b6006546134e99190613e24565b60105560095442906000906134fe9083613e24565b905060006008600a546135119190613e87565b60015461351e9190613e9b565b4260095590508082118061354c5750600a54601b546008546135409190613e24565b61354a9190613eb2565b155b1561355957613559613758565b5050505b60646001600160a01b0316632b407a82600160646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135d29190613f08565b6135dc9190613e24565b6040518263ffffffff1660e01b81526004016135fa91815260200190565b602060405180830381865afa158015613617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061363b9190613f08565b600e55565b6000816000036136805760405162461bcd60e51b815260206004820152600b60248201526a446976206279207a65726f60a81b604482015260640161145b565b600061368c8385613e87565b90506136988385613eb2565b1561326f57611b76816001613ec6565b6000546001600160a01b031633146136ef5760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015260640161145b565b600054604080516001600160a01b03928316815291831660208301527f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b600754429060009061376a9083613e24565b90506000601b5460085461377e9190613e24565b90506000816001546137909190613e9b565b600854601b559050808310156137f65760006137b184610e3a846064613276565b6001601d55905060006137cb6103e8610e558460646132de565b90506137eb610e8182610e7b6107d0600d5461322590919063ffffffff16565b600d55506138479050565b600061380782610e3a866064613276565b6002601d55905060006138216103e8610e558460646132de565b9050613841610ed982610e7b6101f4600d5461322590919063ffffffff16565b600d5550505b8360078190555060646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561388d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138b19190613f08565b602055600c54600d5410156138c757600c54600d555b600b54600d5411156138da57600b54600d555b50505050565b600060208083528351808285015260005b8181101561390d578581018301518582016040015282016138f1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461394557600080fd5b919050565b6000806040838503121561395d57600080fd5b6139668361392e565b946020939093013593505050565b60008083601f84011261398657600080fd5b50813567ffffffffffffffff81111561399e57600080fd5b6020830191508360208285010111156139b657600080fd5b9250929050565b60008060008060008060a087890312156139d657600080fd5b6139df8761392e565b95506139ed6020880161392e565b94506040870135935060608701359250608087013567ffffffffffffffff811115613a1757600080fd5b613a2389828a01613974565b979a9699509497509295939492505050565b600080600080600060808688031215613a4d57600080fd5b613a568661392e565b9450613a646020870161392e565b935060408601359250606086013567ffffffffffffffff811115613a8757600080fd5b613a9388828901613974565b969995985093965092949392505050565b60008060408385031215613ab757600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613aed57600080fd5b8135602067ffffffffffffffff80831115613b0a57613b0a613ac6565b8260051b604051601f19603f83011681018181108482111715613b2f57613b2f613ac6565b604052938452858101830193838101925087851115613b4d57600080fd5b83870191505b84821015613b7357613b648261392e565b83529183019190830190613b53565b979650505050505050565b60008060008060808587031215613b9457600080fd5b8435935060208501359250604085013567ffffffffffffffff811115613bb957600080fd5b613bc587828801613adc565b925050613bd46060860161392e565b905092959194509250565b600080600060608486031215613bf457600080fd5b613bfd8461392e565b9250613c0b6020850161392e565b9150604084013590509250925092565b600060208284031215613c2d57600080fd5b5035919050565b60008060008060808587031215613c4a57600080fd5b613c538561392e565b966020860135965060408601359560600135945092505050565b600080600080600060a08688031215613c8557600080fd5b85359450602086013593506040860135925060608601359150613caa6080870161392e565b90509295509295909350565b600060208284031215613cc857600080fd5b61326f8261392e565b60008060008060808587031215613ce757600080fd5b5050823594602084013594506040840135936060013592509050565b600080600060608486031215613d1857600080fd5b8335925060208401359150613d2f6040850161392e565b90509250925092565b600080600060608486031215613d4d57600080fd5b505081359360208301359350604090920135919050565b60008060008060808587031215613d7a57600080fd5b8435935060208501359250604085013567ffffffffffffffff80821115613da057600080fd5b613dac88838901613adc565b93506060870135915080821115613dc257600080fd5b50613dcf87828801613adc565b91505092959194509250565b60008060408385031215613dee57600080fd5b613df78361392e565b9150613e056020840161392e565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610d2f57610d2f613e0e565b600181811c90821680613e4b57607f821691505b602082108103613e6b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601260045260246000fd5b600082613e9657613e96613e71565b500490565b8082028115828204841417610d2f57610d2f613e0e565b600082613ec157613ec1613e71565b500690565b80820180821115610d2f57610d2f613e0e565b634e487b7160e01b600052603260045260246000fd5b600060018201613f0157613f01613e0e565b5060010190565b600060208284031215613f1a57600080fd5b5051919050565b600181815b80851115613f5c578160001904821115613f4257613f42613e0e565b80851615613f4f57918102915b93841c9390800290613f26565b509250929050565b600082613f7357506001610d2f565b81613f8057506000610d2f565b8160018114613f965760028114613fa057613fbc565b6001915050610d2f565b60ff841115613fb157613fb1613e0e565b50506001821b610d2f565b5060208310610133831016604e8410600b8410161715613fdf575081810a610d2f565b613fe98383613f21565b8060001904821115613ffd57613ffd613e0e565b029392505050565b600061326f60ff841683613f64565b60208082526039908201527f4f6e6c79206d696e74206f6e20736c6f77426c6f636b732025205f424c4f434b60408201527f535f5045525f524541444a5553544d454e542f38203d3d203000000000000000606082015260800190565b600061326f8383613f64565b92835260609190911b6bffffffffffffffffffffffff19166020830152603482015260540190565b6020808252602e908201527f4f6c64206368616c6c656e67655f646967657374206f722077726f6e6720636860408201526d185b1b195b99d957d91a59d95cdd60921b606082015260800190565b60208082526028908201527f446967657374206d75737420626520736d616c6c6572207468616e206d696e696040820152671b99d5185c99d95d60c21b606082015260800190565b6020808252605a908201527f4d7573742073656e64206d6f726520455448206265636175736520726571756960408201527f726573206574682c20636865636b20686f774d75636845544828292066756e6360608201527f74696f6e20746f2066696e6420616d6f756e74206e6565646564000000000000608082015260a00190565b6020808252606f908201527f4d7573742073656e64206d6f726520455448206265636175736520726571756960408201527f7265732065746820756e74696c203630782074617267657454696d652c20636860608201527f65636b20686f774d75636845544828292066756e6374696f6e20746f2066696e60808201526e1908185b5bdd5b9d081b9959591959608a1b60a082015260c00190565b6020808252603a908201527f4d696e74546f2068617320746f206861766520616e206578747261206164647260408201527f65737320636f6d706172656420746f20457874726146756e6473000000000000606082015260800190565b6020808252601b908201527f4e6f207072696e74696e67205468652073616d6520746f6b656e730000000000604082015260600190565b6000602082840312156142ff57600080fd5b8151801515811461326f57600080fd5b634e487b7160e01b600052600160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122071e9ef78024eb4834277a390da30104b57ebfd0816c68d6436d099cb420b937c64736f6c63430008110033

Deployed Bytecode Sourcemap

18565:33506:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21549:24;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;21549:24:0;;;;;;;;38404:131;;;;;;;;;;;;;:::i;21690:57::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;50445:204::-;;;;;;;;;;-1:-1:-1;50445:204:0;;;;;:::i;:::-;;:::i;:::-;;;1351:14:1;;1344:22;1326:41;;1314:2;1299:18;50445:204:0;1186:187:1;45019:662:0;;;;;;;;;;;;;:::i;:::-;;;;1609:25:1;;;1665:2;1650:18;;1643:34;;;;1693:18;;;1686:34;1751:2;1736:18;;1729:34;1596:3;1581:19;45019:662:0;1378:391:1;18982:173:0;;;;;;;;;;-1:-1:-1;18982:173:0;;;;;:::i;:::-;-1:-1:-1;;;18982:173:0;;;;;;;;;;;;-1:-1:-1;;;;;;2988:33:1;;;2970:52;;2958:2;2943:18;18982:173:0;2826:202:1;21139:49:0;;;;;;;;;;;;;;;;41980:1514;;;;;;;;;;;;;:::i;18628:167::-;;;;;;;;;;-1:-1:-1;18628:167:0;;;;;:::i;:::-;-1:-1:-1;;;18628:167:0;;;;;;;;25244:153;;;;;;;;;;;;;:::i;47597:109::-;;;;;;;;;;;;;:::i;25074:162::-;;;;;;:::i;:::-;;:::i;19685:64::-;;;;;;;;;;;;;;;;33274:391;;;;;;:::i;:::-;;:::i;20065:51::-;;;;;;;;;;;;;;;;20833:29;;;;;;;;;;;;;;;;51191:327;;;;;;;;;;-1:-1:-1;51191:327:0;;;;;:::i;:::-;;:::i;45689:391::-;;;;;;;;;;;;;:::i;47898:140::-;;;;;;;;;;;;;:::i;20710:25::-;;;;;;;;;;;;;;;;19303:30;;;;;;;;;;-1:-1:-1;19303:30:0;;;;-1:-1:-1;;;;;19303:30:0;;;;;;-1:-1:-1;;;;;6023:32:1;;;6005:51;;5993:2;5978:18;19303:30:0;5859:203:1;21799:35:0;;;;;;;;;;;;21832:2;21799:35;;;;;6239:4:1;6227:17;;;6209:36;;6197:2;6182:18;21799:35:0;6067:184:1;47713:86:0;;;;;;;;;;-1:-1:-1;47781:12:0;;47713:86;;39349:784;;;;;;;;;;;;;:::i;38719:493::-;;;;;;;;;;-1:-1:-1;38719:493:0;;;;;:::i;:::-;;:::i;21617:22::-;;;;;;;;;;;;;;;;21057:25;;;;;;;;;;;;;;;;29368:135;;;;;;;;;;;;;:::i;19164:32::-;;;;;;;;;;;;;;;;29622:177;;;;;;:::i;:::-;;:::i;25519:438::-;;;;;;:::i;:::-;;:::i;48287:318::-;;;;;;;;;;;;;:::i;21478:26::-;;;;;;;;;;;;;;;;47413:96;;;;;;;;;;-1:-1:-1;47487:15:0;;47413:96;;20742:84;;;;;;;;;;;;;;;;38540:173;;;;;;;;;;;;;:::i;46969:354::-;;;;;;;;;;-1:-1:-1;46969:354:0;;;;;:::i;:::-;;:::i;21310:28::-;;;;;;;;;;;;;;;;49199:124;;;;;;;;;;-1:-1:-1;49199:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;49296:20:0;49268:12;49296:20;;;:8;:20;;;;;;;49199:124;48612:79;;;;;;;;;;-1:-1:-1;48673:10:0;;48612:79;;25962:444;;;;;;:::i;:::-;;:::i;46632:332::-;;;;;;;;;;-1:-1:-1;46632:332:0;;;;;:::i;:::-;;:::i;25403:110::-;;;;;;;;;;;;;:::i;20009:26::-;;;;;;;;;;;;;;;;20192:37;;;;;;;;;;;;;;;;35275:407;;;;;;:::i;:::-;;:::i;20348:63::-;;;;;;;;;;;;;;;;20482:170;;;;;;;;;;;;;;;;29804:1876;;;;;;:::i;:::-;;:::i;2668:20::-;;;;;;;;;;-1:-1:-1;2668:20:0;;;;-1:-1:-1;;;;;2668:20:0;;;19228:29;;;;;;;;;;-1:-1:-1;19228:29:0;;;;-1:-1:-1;;;;;19228:29:0;;;21754:38;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21754:38:0;;;;;48729:246;;;;;;;;;;-1:-1:-1;48729:246:0;;;;;:::i;:::-;;:::i;20959:25::-;;;;;;;;;;;;;;;;21646:20;;;;;;;;;;;;;;;;28820:496;;;;;;;;;;-1:-1:-1;28820:496:0;;;;;:::i;:::-;;:::i;21217:40::-;;;;;;;;;;;;;;;;19264:32;;;;;;;;;;-1:-1:-1;19264:32:0;;;;-1:-1:-1;;;;;19264:32:0;;;49673:257;;;;;;;;;;-1:-1:-1;49673:257:0;;;;;:::i;:::-;;:::i;20124:43::-;;;;;;;;;;;;;;;;47806:83;;;;;;;;;;-1:-1:-1;47872:12:0;;47806:83;;39217:126;;;;;;;;;;;;;:::i;31687:1582::-;;;;;;:::i;:::-;;:::i;21884:111::-;;;;;;;;;;;;;;;;22207:1067;;;;;;;;;;-1:-1:-1;22207:1067:0;;;;;:::i;:::-;;:::i;23312:1731::-;;;;;;;;;;;;;:::i;46088:508::-;;;;;;;;;;;;;:::i;:::-;;;;10147:25:1;;;10203:2;10188:18;;10181:34;;;;10231:18;;;10224:34;10135:2;10120:18;46088:508:0;9945:319:1;20236:61:0;;;;;;;;;;;;;;;;51805:151;;;;;;;;;;-1:-1:-1;51805:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;51921:19:0;;;51891:14;51921:19;;;:7;:19;;;;;;;;:28;;;;;;;;;;;;;51805:151;26411:2403;;;;;;:::i;:::-;;:::i;19909:60::-;;;;;;;;;;;;;;;;33672:1598;;;;;;:::i;:::-;;:::i;29509:108::-;;;;;;;;;;-1:-1:-1;29593:10:0;29592:20;29509:108;;35711:2688;;;;;;:::i;:::-;;:::i;20899:24::-;;;;;;;;;;;;;;;;38404:131;38454:12;38497:17;;38479:15;:35;;;;:::i;:::-;38472:42;;38404:131;:::o;21690:57::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50445:204::-;50546:10;50517:12;50538:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;50538:28:0;;;;;;;;;;:37;;;50587;50517:12;;50538:28;;50587:37;;;;50569:6;160:25:1;;148:2;133:18;;14:177;50587:37:0;;;;;;;;-1:-1:-1;50638:4:0;50445:204;;;;;:::o;45019:662::-;45067:20;45089:18;45109;45129:17;45168:8;;45155:10;;:21;;;;:::i;:::-;45180:1;45155:26;45152:61;;-1:-1:-1;45196:1:0;;-1:-1:-1;45196:1:0;;-1:-1:-1;45196:1:0;;-1:-1:-1;45196:1:0;45188:19;;45152:61;45313:30;;45240:15;;45217:20;;45298:45;;45240:15;45298:45;:::i;:::-;45260:83;;45408:20;:18;:20::i;:::-;45375:53;;:30;:53;:::i;:::-;45360:68;;45450:26;45463:12;45450;:26::i;:::-;45434:42;-1:-1:-1;45493:18:0;45532:19;45539:12;45493:18;45532:19;:::i;:::-;45516:35;-1:-1:-1;45574:29:0;45516:35;45574:13;:29;:::i;:::-;45556:47;;45608:68;;;45019:662;;;;;:::o;41980:1514::-;42038:15;42076:8;;42063:10;;:21;;;;:::i;:::-;42088:1;42063:26;42060:82;;42123:12;;42103:15;;:33;;:19;:33::i;42060:82::-;42242:30;;42169:15;;42146:20;;42227:45;;42169:15;42227:45;:::i;:::-;42189:83;;42277:15;42308:8;;42295:10;;:21;;;;:::i;:::-;42277:39;;42321:24;42362:10;42348;;:24;;;;:::i;:::-;42321:51;;42384:18;42512:19;42479:30;:52;42475:737;;;42543:21;42567:69;42604:30;42568:29;:19;42593:3;42568:24;:29::i;:::-;42567:35;;:69::i;:::-;42543:93;-1:-1:-1;42642:27:0;42672:45;42712:4;42672:25;42543:93;42693:3;42672:20;:25::i;:::-;:39;;:45::i;:::-;42642:75;;42761:69;42778:51;42806:22;42778;42795:4;42778:12;;:16;;:22;;;;:::i;:::-;:27;;:51::i;:::-;42761:12;;;:16;:69::i;:::-;42745:85;;42537:317;;42475:737;;;42864:23;42890:69;42938:19;42891:40;:30;42927:3;42891:35;:40::i;42890:69::-;42864:95;-1:-1:-1;42967:29:0;42999:47;43041:4;42999:27;42864:95;43022:3;42999:22;:27::i;:47::-;42967:79;;43117:70;43134:52;43161:24;43134:21;43151:3;43134:12;;:16;;:21;;;;:::i;:52::-;43117:12;;;:16;:70::i;:::-;43101:86;;42858:354;;42475:737;43237:15;;43221:13;:31;43218:99;;;-1:-1:-1;43296:15:0;;43218:99;43340:15;;43324:13;:31;43321:94;;;-1:-1:-1;43394:15:0;;43321:94;43432:15;;:34;;43452:13;43432:19;:34::i;:::-;43419:47;;43472:17;;;;;41980:1514;:::o;25244:153::-;25297:8;25388:1;25363:24;;:26;;;;:::i;:::-;25349:10;;:42;;;;:::i;:::-;25344:1;25319:24;;:26;;;;:::i;:::-;:73;;;;:::i;47597:109::-;47649:4;47668:33;47688:12;;47668:15;;:19;;:33;;;;:::i;25074:162::-;25153:12;25172:43;25179:5;25186:16;25204:10;25172:6;:43::i;:::-;-1:-1:-1;25227:4:0;;25074:162;-1:-1:-1;;;25074:162:0:o;33274:391::-;33415:12;33434:19;33470:10;:17;33490:1;33470:21;;;;:::i;:::-;33456:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33456:36:0;;33434:58;;33504:6;33500:76;33518:17;;:21;;33538:1;33518:21;:::i;:::-;33514:1;:26;33500:76;;;33564:6;33556:2;33559:1;33556:5;;;;;;;;:::i;:::-;-1:-1:-1;;;;;33556:14:0;;;:5;;;;;;;;;;;:14;33542:3;;;;:::i;:::-;;;;33500:76;;;;33584:58;33602:5;33609:16;33627:10;33639:2;33584:17;:58::i;:::-;-1:-1:-1;33656:4:0;;33274:391;-1:-1:-1;;;;;;33274:391:0:o;51191:327::-;-1:-1:-1;;;;;51315:14:0;;51277:12;51315:14;;;:8;:14;;;;;;:26;;51334:6;51315:18;:26::i;:::-;-1:-1:-1;;;;;51298:14:0;;;;;;:8;:14;;;;;;;;:43;;;;51374:7;:13;;;;;51388:10;51374:25;;;;;;:37;;51404:6;51374:29;:37::i;:::-;-1:-1:-1;;;;;51346:13:0;;;;;;;:7;:13;;;;;;;;51360:10;51346:25;;;;;;;:65;;;;51431:12;;;;;:8;:12;;;;;:24;;51448:6;51431:16;:24::i;:::-;-1:-1:-1;;;;;51416:12:0;;;;;;;:8;:12;;;;;;;:39;;;;51467:26;;;;;;-1:-1:-1;;;;;;;;;;;51467:26:0;;;51486:6;160:25:1;;148:2;133:18;;14:177;51467:26:0;;;;;;;;-1:-1:-1;51507:4:0;51191:327;;;;;:::o;45689:391::-;45736:18;45756:21;45779:18;45799:13;45827;45847:16;:14;:16::i;:::-;45826:37;;;;;45892:3;45881:8;:14;;;;:::i;:::-;45868:27;;45903:8;45915:1;45903:13;45900:44;;45930:1;45932;45934;45936;45923:15;;;;;;;;;;;45900:44;45999:8;45983:12;;45965:15;;:30;;;;:::i;:::-;45964:43;;;;:::i;:::-;46035:15;;46052:12;;45948:59;;-1:-1:-1;46035:15:0;-1:-1:-1;46052:12:0;-1:-1:-1;;45689:391:0;;;;:::o;47898:140::-;48002:10;;:27;;;-1:-1:-1;;;;;;48002:27:0;;;;47951:4;;-1:-1:-1;;;;;48002:10:0;;:25;;:27;;;;;;;;;;;;;;:10;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47991:8;;47976:12;;:23;;;;:::i;:::-;:53;;;;:::i;39349:784::-;39398:11;39432:8;;39419:10;;:21;;;;:::i;:::-;39445:1;39418:28;39415:158;;39456:4;;39464:1;39456:9;39453:115;;-1:-1:-1;39481:24:0;;;39349:784::o;39453:115::-;39559:1;39532:24;;:28;;;;:::i;39453:115::-;39673:21;;39600:15;;39577:20;;39658:36;;39600:15;39658:36;:::i;:::-;39620:74;;39699:24;39792:1;39767:24;;:26;;;;:::i;:::-;39754:8;;39741:10;;:21;;;;:::i;:::-;39740:54;;;;:::i;:::-;39726:10;;:69;;;;:::i;:::-;39699:96;;39840:19;39807:30;:52;39803:323;;;39962:1;39937:24;;:26;;;;:::i;:::-;39924:8;;39911:10;;:21;;;;:::i;:::-;39910:54;;;;:::i;:::-;39905:1;39880:24;;:26;;;;:::i;:::-;:85;;;;:::i;:::-;39871:94;;39972:15;;;39349:784;:::o;39803:323::-;40070:24;;40058:8;;40045:10;;:21;;;;:::i;:::-;40044:50;;;;:::i;:::-;40016:24;;:79;;;;:::i;38719:493::-;38783:15;38804:9;38841:10;;38817:14;38834:3;38817:20;;;;:::i;:::-;38816:35;;;;:::i;:::-;38804:47;-1:-1:-1;38856:10:0;38879:3;38869:7;38804:47;38873:3;38869:7;:::i;:::-;:13;;;;:::i;:::-;38856:26;;38888:14;38978:4;38970:5;:12;38967:161;;;39035:24;39055:3;39036:13;39047:1;39036:7;:13;:::i;39035:24::-;39001:32;39024:8;39013:4;39016:1;39013;:4;:::i;:::-;39010:7;;:2;:7;:::i;:::-;39002:16;;:6;:16;:::i;39001:32::-;:58;;;;:::i;:::-;38989:70;;38967:161;;;39088:23;39107:3;39089:4;39092:1;39089:2;:4;:::i;:::-;:12;;39094:7;39089:12;:::i;39088:23::-;:34;;39112:10;39088:34;:::i;:::-;39076:46;;38967:161;39144:42;39176:9;39161;39145:13;;:25;;;;:::i;39144:42::-;39134:52;38719:493;-1:-1:-1;;;;;38719:493:0:o;29368:135::-;29411:19;29443:55;29479:17;;29461:15;:35;;;;:::i;29622:177::-;29709:12;29727:51;29742:5;29749:16;29767:10;29727:14;:51::i;25519:438::-;25637:12;25664:11;:9;:11::i;:::-;:16;25656:86;;;;-1:-1:-1;;;25656:86:0;;;;;;;:::i;:::-;;;;;;;;;25747:43;25754:5;25761:16;25779:10;25747:6;:43::i;:::-;-1:-1:-1;25795:75:0;;-1:-1:-1;;;25795:75:0;;25837:4;25795:75;;;14171:34:1;25844:10:0;14221:18:1;;;14214:43;14273:18;;;14266:34;;;14336:3;14316:18;;;14309:31;-1:-1:-1;14356:19:1;;;14349:30;-1:-1:-1;;;;;25795:33:0;;;;;14396:19:1;;25795:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25878:11;:9;:11::i;:::-;25893:1;25878:16;25875:62;;25914:10;;:17;;25929:1;25914:14;:17::i;:::-;25901:10;:30;25875:62;-1:-1:-1;25948:4:0;25519:438;;;;;;:::o;48287:318::-;48335:4;48476:1;48464:9;;:13;48461:139;;;48498:18;21832:2;48498;:18;:::i;:::-;48493:23;;:2;:23;:::i;48461:139::-;48540:54;48588:1;48576:9;;:13;;;;:::i;:::-;48572:20;;:1;:20;:::i;:::-;48547:18;21832:2;48547;:18;:::i;:::-;48542:23;;:2;:23;:::i;38540:173::-;38592:14;38612:9;38643:17;;38625:15;:35;;;;:::i;:::-;38612:49;;38675:15;38688:1;38675:12;:15::i;:::-;38666:24;;38695:13;38540:173;:::o;46969:354::-;47127:12;47146:14;47198:16;47215:6;47222:5;47181:47;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47171:58;;;;;;47146:84;;47256:10;47246:6;47238:15;;:28;47235:41;;;47268:8;;;47235:41;47291:26;;;;46969:354;-1:-1:-1;;;;;46969:354:0:o;25962:444::-;26081:12;26108:11;:9;:11::i;:::-;:16;26100:86;;;;-1:-1:-1;;;26100:86:0;;;;;;;:::i;:::-;26191:43;26198:5;26205:16;26223:10;26191:6;:43::i;:::-;-1:-1:-1;26239:80:0;;-1:-1:-1;;;26239:80:0;;26282:4;26239:80;;;15267:34:1;26289:10:0;15317:18:1;;;15310:43;15369:18;;;15362:34;;;26312:1:0;15412:18:1;;;15405:34;15247:3;15455:19;;;15448:32;-1:-1:-1;15496:19:1;;;15489:30;-1:-1:-1;;;;;26239:34:0;;;;;15536:19:1;;26239:80:0;14926:635:1;46632:332:0;46764:12;46783:14;46835:16;46852:10;46863:5;46818:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46808:62;;;;;;46783:88;;46897:10;46887:6;46879:15;;:28;46876:41;;;46909:8;;;46876:41;46932:26;;;;46632:332;-1:-1:-1;;;;46632:332:0:o;25403:110::-;25445:8;25506:1;25481:24;;:26;;;;:::i;:::-;25467:10;;:41;;;;:::i;35275:407::-;35424:12;35443:19;35479:10;:17;35499:1;35479:21;;;;:::i;:::-;35465:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35465:36:0;;35443:58;;35513:6;35509:76;35527:17;;:21;;35547:1;35527:21;:::i;:::-;35523:1;:26;35509:76;;;35573:6;35565:2;35568:1;35565:5;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35565:14:0;;;:5;;;;;;;;;;;:14;35551:3;;;;:::i;:::-;;;;35509:76;;;;35593:66;35619:5;35626:16;35644:10;35656:2;35593:25;:66::i;29804:1876::-;29916:17;29942:14;29987:15;;30004:10;30016:5;29970:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29960:63;;;;;;29942:81;;30098:16;30088:6;:26;30080:85;;;;-1:-1:-1;;;30080:85:0;;;;;;;:::i;:::-;30246:12;;30228:30;;30220:83;;;;-1:-1:-1;;;30220:83:0;;;;;;;:::i;:::-;30308:22;:20;:22::i;:::-;30363:17;;30345:15;:35;30337:77;;;;-1:-1:-1;;;30337:77:0;;16592:2:1;30337:77:0;;;16574:21:1;16631:2;16611:18;;;16604:30;16670:31;16650:18;;;16643:59;16719:18;;30337:77:0;16390:353:1;30337:77:0;30477:9;30537:10;;30509:17;;30491:15;:35;;;;:::i;:::-;30490:43;;30530:3;30490:43;:::i;:::-;30489:58;;;;:::i;:::-;30477:70;-1:-1:-1;30552:10:0;30575:3;30565:7;30477:70;30569:3;30565:7;:::i;:::-;:13;;;;:::i;:::-;30552:26;;30603:3;30595:5;:11;30592:67;;;30631:10;;:17;;30646:1;30631:14;:17::i;:::-;30618:10;:30;30592:67;30730:4;30722:5;:12;30719:556;;;30787:24;30807:3;30788:13;30799:1;30788:7;:13;:::i;30787:24::-;30753:32;30776:8;30765:4;30768:1;30765;:4;:::i;30753:32::-;:58;;;;:::i;:::-;30741:70;-1:-1:-1;30866:2:0;30856:8;:5;30866:2;30856:8;:::i;:::-;30855:13;;;;:::i;:::-;30839:30;;30840:10;30839:30;:::i;:::-;30825:9;:45;;30817:148;;;;-1:-1:-1;;;30817:148:0;;;;;;;:::i;:::-;30719:556;;;30994:23;31013:3;30995:4;30998:1;30995:2;:4;:::i;30994:23::-;:34;;31018:10;30994:34;:::i;:::-;30982:46;;31045:4;31037:5;:12;31034:236;;;31065:12;31073:4;31065:5;:12;:::i;:::-;31057:20;-1:-1:-1;31136:2:0;31124:8;31057:20;31136:2;31124:8;:::i;:::-;31123:15;;;;:::i;:::-;31122:23;;31142:3;31122:23;:::i;:::-;31106:40;;31107:10;31106:40;:::i;:::-;31092:9;:55;;31084:179;;;;-1:-1:-1;;;31084:179:0;;;;;;;:::i;:::-;31281:18;31302:42;31334:9;31319;31303:13;;:25;;;;:::i;31302:42::-;-1:-1:-1;;;;;31379:23:0;;;;;;:8;:23;;;;;;31281:63;;-1:-1:-1;31379:42:0;;31281:63;31379:27;:42::i;:::-;-1:-1:-1;;;;;31353:23:0;;;;;;:8;:23;;;;;;:68;;;;31431:50;;31353:23;;;-1:-1:-1;;;;;;;;;;;31431:50:0;;;31467:13;160:25:1;;148:2;133:18;;14:177;31431:50:0;;;;;;;;31503:12;;:31;;31520:13;31503:16;:31::i;:::-;31488:12;:46;31559:15;31539:17;:35;31621:10;;31633:15;;31586:64;;;10147:25:1;;;10203:2;10188:18;;10181:34;;;;10231:18;;10224:34;-1:-1:-1;;;;;31586:64:0;;;;;10135:2:1;10120:18;31586:64:0;;;;;;;;31657:16;;;;29804:1876;;;;;:::o;48729:246::-;48840:18;48867:14;48912:15;;48929:10;48941:5;48895:52;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;48895:52:0;;;;;;48885:63;;48895:52;48885:63;;;;;48729:246;-1:-1:-1;;;;;48729:246:0:o;28820:496::-;28893:19;28918:9;28962:10;;28932:19;28955:3;28931:27;;;;:::i;:::-;28930:42;;;;:::i;:::-;28918:54;-1:-1:-1;28977:10:0;29000:3;28990:7;28918:54;28994:3;28990:7;:::i;:::-;:13;;;;:::i;:::-;28977:26;;29028:4;29019:5;:13;29016:254;;29050:4;29042:5;:12;29039:106;;;29070:12;29078:4;29070:5;:12;:::i;:::-;29062:20;-1:-1:-1;29126:2:0;29115:7;29062:20;29121:1;29115:7;:::i;:::-;29114:14;;;;:::i;:::-;29113:22;;29132:3;29113:22;:::i;:::-;29097:39;;29098:10;29097:39;:::i;:::-;29089:48;28820:496;-1:-1:-1;;;;28820:496:0:o;29039:106::-;-1:-1:-1;29157:1:0;;28820:496;-1:-1:-1;;;28820:496:0:o;29016:254::-;29180:2;29172:5;:10;29169:101;;;29255:9;29263:1;29255:5;:9;:::i;:::-;29247:17;;29169:101;29307:2;29297:8;:5;29307:2;29297:8;:::i;:::-;29296:13;;;;:::i;49673:257::-;49794:10;49741:12;49785:20;;;:8;:20;;;;;;:32;;49810:6;49785:24;:32::i;:::-;49771:10;49762:20;;;;:8;:20;;;;;;:55;;;;-1:-1:-1;;;;;49837:12:0;;;;;;:24;;49854:6;49837:16;:24::i;:::-;-1:-1:-1;;;;;49822:12:0;;;;;;:8;:12;;;;;;;:39;;;;49873:32;;49882:10;;-1:-1:-1;;;;;;;;;;;49873:32:0;;;49898:6;160:25:1;;148:2;133:18;;14:177;39217:126:0;39268:14;39311:8;;39298:10;;:21;;;;:::i;31687:1582::-;31833:12;31852:15;31870:41;31877:5;31883:16;31901:6;31908:1;31901:9;;;;;;;;:::i;:::-;;;;;;;31870:6;:41::i;:::-;31852:59;;31934:1;31924:7;:11;31916:34;;;;-1:-1:-1;;;31916:34:0;;18334:2:1;31916:34:0;;;18316:21:1;18373:2;18353:18;;;18346:30;-1:-1:-1;;;18392:18:1;;;18385:40;18442:18;;31916:34:0;18132:334:1;31916:34:0;31982:17;;:21;;32002:1;31982:21;:::i;:::-;31965:6;:13;:38;31957:108;;;;-1:-1:-1;;;31957:108:0;;;;;;;:::i;:::-;32070:7;32084:240;32100:10;:17;32096:2;:21;32084:240;;;32155:4;:2;32158:1;32155:4;:::i;:::-;32151:9;;:1;:9;:::i;:::-;32137:10;;:24;;;;:::i;:::-;32165:1;32137:29;32174:5;32134:52;32195:6;32202:4;:2;32205:1;32202:4;:::i;:::-;32195:11;;32191:128;32211:10;:17;32208:1;:20;32191:128;;;32266:10;32277:2;32266:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;32249:31:0;:10;32260:1;32249:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;32249:31:0;;32241:71;;;;-1:-1:-1;;;32241:71:0;;;;;;;:::i;:::-;32230:3;;;;:::i;:::-;;;;32191:128;;;-1:-1:-1;32119:4:0;;;;:::i;:::-;;;;32084:240;;;32332:17;32358:18;32389:6;32385:759;32401:2;32399:1;:4;32385:759;;;32700:3;:1;32702;32700:3;:::i;:::-;32696:8;;:1;:8;:::i;:::-;32682:10;;:23;;;;:::i;:::-;32709:1;32682:28;32679:460;;32738:10;32749:1;32738:13;;;;;;;;:::i;:::-;;;;;;;;;;;32731:46;;-1:-1:-1;;;32731:46:0;;32771:4;32731:46;;;6005:51:1;-1:-1:-1;;;;;32731:31:0;;;;;;5978:18:1;;32731:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32718:59;-1:-1:-1;32787:15:0;;32784:285;;32815:5;32819:1;32815;:5;:::i;:::-;:10;:20;;;;-1:-1:-1;32829:6:0;;;32815:20;:42;;;;;32849:8;32839:7;:18;32815:42;32811:251;;;32879:68;32929:17;32911:7;32898:10;32886:9;;32882:1;:13;;;;:::i;:::-;32881:27;;;;:::i;:::-;:37;;;;:::i;:::-;32879:49;;:68::i;:::-;32867:80;;32811:251;;;32989:64;33035:17;33022:7;33009:10;32996:9;;32992:1;:13;;;;:::i;:::-;32991:28;;;;:::i;:::-;:38;;;;:::i;32989:64::-;32977:76;;32811:251;33085:10;33096:1;33085:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;33078:30:0;;33109:6;33116:1;33118;33116:3;;;;:::i;:::-;33109:11;;;;;;;;:::i;:::-;;;;;;;33122:9;33078:54;;;;;;;;;;;;;;;-1:-1:-1;;;;;19446:32:1;;;;19428:51;;19510:2;19495:18;;19488:34;19416:2;19401:18;;19254:274;33078:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32679:460;32405:3;;;;:::i;:::-;;;;32385:759;;;-1:-1:-1;33196:10:0;;33208:15;;33175:63;;;1609:25:1;;;1665:2;1650:18;;1643:34;;;;1693:18;;1686:34;;;1751:2;1736:18;;1729:34;;;33184:10:0;;33175:63;;1596:3:1;1581:19;33175:63:0;;;;;;;-1:-1:-1;33252:7:0;;31687:1582;-1:-1:-1;;;;;;;31687:1582:0:o;22207:1067::-;2927:5;;-1:-1:-1;;;;;2927:5:0;2913:10;:19;2905:42;;;;-1:-1:-1;;;2905:42:0;;20413:2:1;2905:42:0;;;20395:21:1;20452:2;20432:18;;;20425:30;-1:-1:-1;;;20471:18:1;;;20464:40;20521:18;;2905:42:0;20211:334:1;2905:42:0;22374:7:::1;::::0;22301:26:::1;::::0;22374:7:::1;;22373:8;22366:16;;;;:::i;:::-;22393:7;:14:::0;;-1:-1:-1;;22393:14:0::1;22403:4;22393:14;::::0;;22431:15:::1;22411:17;:35:::0;22471:18:::1;21832:2;22471;:18;:::i;:::-;22466:23;::::0;:2:::1;:23;:::i;:::-;22450:13;:39:::0;22509:1:::1;22497:9;:13:::0;;;22514:12:::1;:16:::0;;;22534:10:::1;:14:::0;;;22552:8:::1;:12:::0;22580:38:::1;22605:12;22580:21;:38;:::i;:::-;22568:9;:50:::0;;;22688:18:::1;::::0;:6:::1;:18;:::i;:::-;22679:27;::::0;:6:::1;:27;:::i;:::-;22654:21;22641:9;;22637:1;:13;;;;:::i;:::-;22636:39;;;;:::i;:::-;:71;;;;:::i;:::-;22624:9;:83:::0;22775:15:::1;::::0;:25:::1;::::0;22795:4:::1;22775:19;:25::i;:::-;22760:12;:40:::0;22844:15:::1;22811:30;:48:::0;22867:22:::1;:20;:22::i;:::-;22973:3;22975:1;22973::::0;:3:::1;:::i;:::-;-1:-1:-1::0;;;;;22945:25:0;::::1;;::::0;;;:8:::1;:25;::::0;;;;:31;;;;:25;-1:-1:-1;;;;;;;;;;;23033:3:0::1;23035:1;23033::::0;:3:::1;:::i;:::-;22995:42;::::0;160:25:1;;;148:2;133:18;22995:42:0::1;;;;;;;23048:14;:32:::0;;-1:-1:-1;;;;;;23048:32:0;;::::1;-1:-1:-1::0;;;;;23048:32:0;;::::1;::::0;;::::1;::::0;;;23091:10:::1;:43:::0;;;::::1;::::0;;::::1;::::0;;23145:15:::1;:35:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;23185:10:0::1;:14:::0;23222:10:::1;::::0;23210:9:::1;:22:::0;23239:20:::1;-1:-1:-1::0;23239:8:0::1;:20::i;:::-;22281:993;22207:1067:::0;;:::o;23312:1731::-;23408:38;23433:12;23408:21;:38;:::i;:::-;23396:9;:50;;;23517:18;;:6;:18;:::i;:::-;23508:27;;:6;:27;:::i;:::-;23483:21;23470:9;;23466:1;:13;;;;:::i;:::-;23465:39;;;;:::i;:::-;:71;;;;:::i;:::-;23453:9;:83;23619:7;;23586:12;;23601:25;;:15;:25;:::i;:::-;23586:40;;23633:18;23667:9;;23654:10;;:22;;;;:::i;:::-;23633:43;-1:-1:-1;23698:20:0;23721:17;23633:43;23721:4;:17;:::i;:::-;23698:40;;23758:1;23746:9;;:13;23743:159;;;23800:9;;23797:12;;:1;:12;:::i;:::-;23785:24;;23786:7;23785:24;:::i;:::-;23771:10;:39;23743:159;;;23842:54;23890:1;23878:9;;:13;;;;:::i;23842:54::-;23826:13;:70;23743:159;23906:9;23918:41;23948:10;;23919:12;23934:3;23919:18;;;;:::i;23918:41::-;23906:53;-1:-1:-1;23964:13:0;23990:3;23980:7;23906:53;23984:3;23980:7;:::i;:::-;:13;;;;:::i;:::-;23964:29;;23998:17;24036:4;24028:5;:12;24025:140;;;24093:24;24113:3;24094:13;24105:1;24094:7;:13;:::i;24093:24::-;24059:32;24082:8;24071:4;24074:1;24071;:4;:::i;24059:32::-;:58;;;;:::i;:::-;24047:70;;24025:140;;;-1:-1:-1;24148:10:0;24025:140;24172:18;24193:55;24238:9;24223;24207:13;;24194:10;:26;;;;:::i;24193:55::-;24290:15;;-1:-1:-1;;;;;24290:15:0;24281:25;;;;:8;:25;;;;;;24172:76;;-1:-1:-1;24281:44:0;;24172:76;24281:29;:44::i;:::-;24262:15;;;-1:-1:-1;;;;;24262:15:0;;;24253:25;;;;:8;:25;;;;;;:72;;;;24356:15;;24335:52;;24356:15;;;-1:-1:-1;;;;;;;;;;;24335:52:0;;;24373:13;160:25:1;;148:2;133:18;;14:177;24335:52:0;;;;;;;;24403:8;;:27;;24416:13;24403:12;:27::i;:::-;24392:8;:38;24483:24;;24471:9;;24509:1;;24471:36;;;:::i;:::-;24464:44;;:3;:44;:::i;:::-;:46;;;;:::i;:::-;24439:21;:72;24435:524;;;24759:15;;24834:6;;24822:9;;-1:-1:-1;;;;;24759:15:0;;;;24794:62;;24846:9;;24795:24;24810:9;24796:10;24795:24;:::i;24794:62::-;24871:22;;24782:74;;-1:-1:-1;;;;;;24871:11:0;;;:22;;;;;24782:74;;24871:22;;;;24782:74;24871:11;:22;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24923:4:0;;24919:8;;:1;:8;:::i;:::-;24910:6;:17;-1:-1:-1;24435:524:0;;;24952:1;24943:6;:10;24435:524;-1:-1:-1;;24979:10:0;;24967:9;:22;-1:-1:-1;;25023:15:0;25013:7;:25;-1:-1:-1;;;23312:1731:0:o;46088:508::-;46138:11;46151:14;46167:18;46194:20;:18;:20::i;:::-;46218:1;46194:25;46191:61;;-1:-1:-1;46234:1:0;;;;-1:-1:-1;46234:1:0;;-1:-1:-1;46088:508:0:o;46191:61::-;46358:30;;46279:15;;46256:20;;46343:45;;46279:15;46343:45;:::i;:::-;46305:83;;46393:17;46446:20;:18;:20::i;:::-;46413:53;;:30;:53;:::i;:::-;46393:73;;46472:10;46489:15;:13;:15::i;:::-;46471:33;;;;;46509:8;46541:12;46520:5;46529:8;46520:18;;;;:::i;:::-;:33;;;;:::i;:::-;46509:44;46571:12;;-1:-1:-1;46585:5:0;;-1:-1:-1;46088:508:0;;-1:-1:-1;;;;46088:508:0:o;26411:2403::-;26515:17;26541:14;26586:15;;26603:10;26615:5;26569:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26559:63;;;;;;26541:81;;26697:16;26687:6;:26;26679:85;;;;-1:-1:-1;;;26679:85:0;;;;;;;:::i;:::-;26845:12;;26827:30;;26819:83;;;;-1:-1:-1;;;26819:83:0;;;;;;;:::i;:::-;26907:22;:20;:22::i;:::-;26962:17;;26944:15;:35;26936:69;;;;-1:-1:-1;;;26936:69:0;;20884:2:1;26936:69:0;;;20866:21:1;20923:2;20903:18;;;20896:30;-1:-1:-1;;;20942:18:1;;;20935:51;21003:18;;26936:69:0;20682:345:1;26936:69:0;27068:9;27128:10;;27100:17;;27082:15;:35;;;;:::i;:::-;27081:43;;27121:3;27081:43;:::i;:::-;27080:58;;;;:::i;:::-;27068:70;-1:-1:-1;27143:10:0;27166:3;27156:7;27068:70;27160:3;27156:7;:::i;:::-;:13;;;;:::i;:::-;27143:26;;27193:3;27185:5;:11;27182:67;;;27221:10;;:17;;27236:1;27221:14;:17::i;:::-;27208:10;:30;27182:67;27320:4;27312:5;:12;27309:567;;;27377:24;27397:3;27378:13;27389:1;27378:7;:13;:::i;27377:24::-;27343:32;27366:8;27355:4;27358:1;27355;:4;:::i;27343:32::-;:58;;;;:::i;:::-;27331:70;-1:-1:-1;27456:2:0;27446:8;:5;27456:2;27446:8;:::i;:::-;27445:13;;;;:::i;:::-;27429:30;;27430:10;27429:30;:::i;:::-;27415:9;:45;;27407:148;;;;-1:-1:-1;;;27407:148:0;;;;;;;:::i;:::-;27309:567;;;27584:23;27603:3;27585:4;27588:1;27585:2;:4;:::i;27584:23::-;:34;;27608:10;27584:34;:::i;:::-;27572:46;;27635:4;27627:5;:12;27624:247;;;27647:13;27663:12;27671:4;27663:5;:12;:::i;:::-;27647:28;-1:-1:-1;27737:2:0;27722:11;27647:28;27737:2;27722:11;:::i;:::-;27721:18;;;;:::i;:::-;27720:26;;27743:3;27720:26;:::i;:::-;27704:43;;27705:10;27704:43;:::i;:::-;27690:9;:58;;27682:182;;;;-1:-1:-1;;;27682:182:0;;;;;;;:::i;:::-;27640:231;27624:247;27882:18;27903:42;27935:9;27920;27904:13;;:25;;;;:::i;27903:42::-;-1:-1:-1;;;;;27980:23:0;;;;;;:8;:23;;;;;;27882:63;;-1:-1:-1;27980:42:0;;27882:63;27980:27;:42::i;:::-;-1:-1:-1;;;;;27954:23:0;;;;;;:8;:23;;;;;;:68;;;;28032:50;;27954:23;;;-1:-1:-1;;;;;;;;;;;28032:50:0;;;28068:13;160:25:1;;148:2;133:18;;14:177;28032:50:0;;;;;;;;28106:12;;:31;;28123:13;28106:16;:31::i;:::-;28091:12;:46;28162:15;28142:17;:35;28185:6;;:10;28182:527;;28213:4;28205:5;:12;28202:502;;;28236:18;28265:13;28236:43;;28298:2;-1:-1:-1;;;;;28298:11:0;:60;28310:47;28347:9;28335:6;;28323:9;;28311;:21;;;;:::i;28310:47::-;28298:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28218:252;28202:502;;;28495:18;28524:13;28495:43;;28559:2;-1:-1:-1;;;;;28559:11:0;:47;28571:34;28602:2;28590:6;;28578:9;;28572:3;:15;;;;:::i;28571:34::-;28559:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28474:230;28202:502;28755:10;;28767:15;;28720:64;;;10147:25:1;;;10203:2;10188:18;;10181:34;;;;10231:18;;10224:34;-1:-1:-1;;;;;28720:64:0;;;;;10135:2:1;10120:18;28720:64:0;9945:319:1;33672:1598:0;33826:12;33845:15;33863:49;33878:5;33884:16;33902:6;33909:1;33902:9;;;;;;;;:::i;:::-;;;;;;;33863:14;:49::i;:::-;33845:67;;33935:1;33925:7;:11;33917:34;;;;-1:-1:-1;;;33917:34:0;;18334:2:1;33917:34:0;;;18316:21:1;18373:2;18353:18;;;18346:30;-1:-1:-1;;;18392:18:1;;;18385:40;18442:18;;33917:34:0;18132:334:1;33917:34:0;33983:17;;:21;;34003:1;33983:21;:::i;:::-;33966:6;:13;:38;33958:108;;;;-1:-1:-1;;;33958:108:0;;;;;;;:::i;:::-;34071:7;34085:240;34101:10;:17;34097:2;:21;34085:240;;;34156:4;:2;34159:1;34156:4;:::i;:::-;34152:9;;:1;:9;:::i;:::-;34138:10;;:24;;;;:::i;:::-;34166:1;34138:29;34175:5;34135:52;34196:6;34203:4;:2;34206:1;34203:4;:::i;:::-;34196:11;;34192:128;34212:10;:17;34209:1;:20;34192:128;;;34267:10;34278:2;34267:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;34250:31:0;:10;34261:1;34250:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;34250:31:0;;34242:71;;;;-1:-1:-1;;;34242:71:0;;;;;;;:::i;:::-;34231:3;;;;:::i;:::-;;;;34192:128;;;-1:-1:-1;34120:4:0;;;;:::i;:::-;;;;34085:240;;;34333:17;34359:18;34390:6;34386:759;34402:2;34400:1;:4;34386:759;;;34701:3;:1;34703;34701:3;:::i;:::-;34697:8;;:1;:8;:::i;:::-;34683:10;;:23;;;;:::i;:::-;34710:1;34683:28;34680:460;;34739:10;34750:1;34739:13;;;;;;;;:::i;:::-;;;;;;;;;;;34732:46;;-1:-1:-1;;;34732:46:0;;34772:4;34732:46;;;6005:51:1;-1:-1:-1;;;;;34732:31:0;;;;;;5978:18:1;;34732:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34719:59;-1:-1:-1;34788:15:0;;34785:285;;34816:5;34820:1;34816;:5;:::i;:::-;:10;:20;;;;-1:-1:-1;34830:6:0;;;34816:20;:42;;;;;34850:8;34840:7;:18;34816:42;34812:251;;;34880:68;34930:17;34912:7;34899:10;34887:9;;34883:1;:13;;;;:::i;34880:68::-;34868:80;;34812:251;;;34990:64;35036:17;35023:7;35010:10;34997:9;;34993:1;:13;;;;:::i;34990:64::-;34978:76;;34812:251;35086:10;35097:1;35086:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;35079:30:0;;35110:6;35117:1;35119;35117:3;;;;:::i;:::-;35110:11;;;;;;;;:::i;:::-;;;;;;;35123:9;35079:54;;;;;;;;;;;;;;;-1:-1:-1;;;;;19446:32:1;;;;19428:51;;19510:2;19495:18;;19488:34;19416:2;19401:18;;19254:274;35079:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34680:460;34406:3;;;;:::i;:::-;;;;34386:759;;35711:2688;35852:12;35871:14;35916:15;;35933:10;35945:5;35899:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35889:63;;;;;;35871:81;;36027:16;36017:6;:26;36009:85;;;;-1:-1:-1;;;36009:85:0;;;;;;;:::i;:::-;36175:12;;36157:30;;36149:83;;;;-1:-1:-1;;;36149:83:0;;;;;;;:::i;:::-;36237:22;:20;:22::i;:::-;36292:17;;36274:15;:35;36266:69;;;;-1:-1:-1;;;36266:69:0;;20884:2:1;36266:69:0;;;20866:21:1;20923:2;20903:18;;;20896:30;-1:-1:-1;;;20942:18:1;;;20935:51;21003:18;;36266:69:0;20682:345:1;36266:69:0;36365:10;:17;36348:6;:13;:34;36340:104;;;;-1:-1:-1;;;36340:104:0;;21234:2:1;36340:104:0;;;21216:21:1;21273:2;21253:18;;;21246:30;21312:34;21292:18;;;21285:62;21383:28;21363:18;;;21356:56;21429:19;;36340:104:0;21032:422:1;36340:104:0;36451:7;36465:240;36481:10;:17;36477:2;:21;36465:240;;;36536:4;:2;36539:1;36536:4;:::i;:::-;36532:9;;:1;:9;:::i;:::-;36518:10;;:24;;;;:::i;:::-;36546:1;36518:29;36555:5;36515:52;36576:6;36583:4;:2;36586:1;36583:4;:::i;:::-;36576:11;;36572:128;36592:10;:17;36589:1;:20;36572:128;;;36647:10;36658:2;36647:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;36630:31:0;:10;36641:1;36630:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;36630:31:0;;36622:71;;;;-1:-1:-1;;;36622:71:0;;;;;;;:::i;:::-;36611:3;;;;:::i;:::-;;;;36572:128;;;-1:-1:-1;36500:4:0;;;;:::i;:::-;;;;36465:240;;;36711:9;36771:10;;36743:17;;36725:15;:35;;;;:::i;:::-;36724:43;;36764:3;36724:43;:::i;:::-;36723:58;;;;:::i;:::-;36711:70;-1:-1:-1;36786:10:0;36809:3;36799:7;36711:70;36803:3;36799:7;:::i;:::-;:13;;;;:::i;:::-;36786:26;;36818:14;36858:3;36850:5;:11;36847:67;;;36886:10;;:17;;36901:1;36886:14;:17::i;:::-;36873:10;:30;36847:67;36984:4;36976:5;:12;36973:556;;;37041:24;37061:3;37042:13;37053:1;37042:7;:13;:::i;37041:24::-;37007:32;37030:8;37019:4;37022:1;37019;:4;:::i;37007:32::-;:58;;;;:::i;:::-;36995:70;-1:-1:-1;37120:2:0;37110:8;:5;37120:2;37110:8;:::i;:::-;37109:13;;;;:::i;:::-;37093:30;;37094:10;37093:30;:::i;:::-;37079:9;:45;;37071:148;;;;-1:-1:-1;;;37071:148:0;;;;;;;:::i;:::-;36973:556;;;37248:23;37267:3;37249:4;37252:1;37249:2;:4;:::i;37248:23::-;:34;;37272:10;37248:34;:::i;:::-;37236:46;;37299:4;37291:5;:12;37288:236;;;37319:12;37327:4;37319:5;:12;:::i;:::-;37311:20;-1:-1:-1;37390:2:0;37378:8;37311:20;37390:2;37378:8;:::i;:::-;37377:15;;;;:::i;:::-;37376:23;;37396:3;37376:23;:::i;:::-;37360:40;;37361:10;37360:40;:::i;:::-;37346:9;:55;;37338:179;;;;-1:-1:-1;;;37338:179:0;;;;;;;:::i;:::-;37535:18;;37558:773;37574:2;37572:1;:4;37558:773;;;37868:3;:1;37870;37868:3;:::i;:::-;37864:8;;:1;:8;:::i;:::-;37850:10;;:23;;;;:::i;:::-;37877:1;37850:28;37847:479;;37906:10;37917:1;37906:13;;;;;;;;:::i;:::-;;;;;;;;;;;37899:46;;-1:-1:-1;;;37899:46:0;;37939:4;37899:46;;;6005:51:1;-1:-1:-1;;;;;37899:31:0;;;;;;5978:18:1;;37899:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37886:59;-1:-1:-1;37955:15:0;;37952:362;;37983:5;37987:1;37983;:5;:::i;:::-;:10;:20;;;;-1:-1:-1;37997:6:0;;;37983:20;:44;;;;;38019:8;38007:9;:20;37983:44;37979:254;;;38049:71;38102:17;38082:9;38069:10;38056:9;;38052:1;:13;;;;:::i;38049:71::-;38037:83;;37979:254;;;38154:67;38202:17;38187:9;38174:10;38161:9;;38157:1;:13;;;;:::i;38154:67::-;38142:79;;37979:254;38250:10;38261:1;38250:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;38243:30:0;;38274:6;38281:1;38274:9;;;;;;;;:::i;:::-;;;;;;;38285;38243:52;;;;;;;;;;;;;;;-1:-1:-1;;;;;19446:32:1;;;;19428:51;;19510:2;19495:18;;19488:34;19416:2;19401:18;;19254:274;38243:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37952:362;37578:3;;;;:::i;:::-;;;;37558:773;;;-1:-1:-1;;38355:15:0;38335:17;:35;38382:9;35711:2688;-1:-1:-1;;;;;;;;;35711:2688:0:o;5085:139::-;5143:7;5171:1;5176;5171:6;5163:30;;;;-1:-1:-1;;;5163:30:0;;21661:2:1;5163:30:0;;;21643:21:1;21700:2;21680:18;;;21673:30;-1:-1:-1;;;21719:18:1;;;21712:41;21770:18;;5163:30:0;21459:335:1;5163:30:0;5211:5;5215:1;5211;:5;:::i;:::-;5204:12;5085:139;-1:-1:-1;;;5085:139:0:o;4848:229::-;4907:7;4931:1;4936;4931:6;4927:47;;-1:-1:-1;4961:1:0;4954:8;;4927:47;4986:9;4998:5;5002:1;4998;:5;:::i;:::-;4986:17;-1:-1:-1;5031:1:0;5022:5;5026:1;4986:17;5022:5;:::i;:::-;:10;5014:36;;;;-1:-1:-1;;;5014:36:0;;22001:2:1;5014:36:0;;;21983:21:1;22040:2;22020:18;;;22013:30;-1:-1:-1;;;22059:18:1;;;22052:43;22112:18;;5014:36:0;21799:337:1;4699:141:0;4757:7;4790:1;4785;:6;;4777:32;;;;-1:-1:-1;;;4777:32:0;;22343:2:1;4777:32:0;;;22325:21:1;22382:2;22362:18;;;22355:30;-1:-1:-1;;;22401:18:1;;;22394:43;22454:18;;4777:32:0;22141:337:1;4777:32:0;4827:5;4831:1;4827;:5;:::i;5594:132::-;5656:6;5684:1;5680;:5;5677:18;;;-1:-1:-1;5694:1:0;5687:8;;5677:18;-1:-1:-1;5715:1:0;;5594:132;-1:-1:-1;5594:132:0:o;4527:164::-;4585:7;;4617:5;4621:1;4617;:5;:::i;:::-;4605:17;;4646:1;4641;:6;;4633:31;;;;-1:-1:-1;;;4633:31:0;;22685:2:1;4633:31:0;;;22667:21:1;22724:2;22704:18;;;22697:30;-1:-1:-1;;;22743:18:1;;;22736:42;22795:18;;4633:31:0;22483:336:1;40140:1833:0;40395:15;;40378:13;;40361:12;;:31;;:16;:31::i;:::-;:49;:67;;;;;40426:2;40414:9;;:14;40361:67;40357:594;;;40451:9;;:13;;40463:1;40451:13;:::i;:::-;40439:9;:25;;;40503:37;;40525:13;;40537:1;40525:13;:::i;:::-;40521:18;;:1;:18;:::i;:::-;40503:12;;;:16;:37::i;:::-;40488:12;;:52;;;;:::i;:::-;40470:15;:70;40549:9;;40561:1;-1:-1:-1;40546:400:0;;;40588:15;;:22;;40608:1;40588:19;:22::i;:::-;40570:15;:40;40646:9;;40643:12;;:1;:12;:::i;:::-;40631:24;;40632:7;40631:24;:::i;:::-;40617:10;:39;40666:9;;40678:1;-1:-1:-1;40663:189:0;;;40719:2;40691:24;;:30;40688:157;;40758:1;40731:24;:28;40546:400;;40688:157;40835:1;40808:24;;:28;;;;:::i;:::-;40781:24;:55;40688:157;40546:400;;;40885:54;40933:1;40921:9;;:13;;;;:::i;40885:54::-;40869:13;:70;40546:400;41128:10;;:17;;41143:1;41128:14;:17::i;:::-;41115:10;:30;;;41253:24;;:28;;41115:10;41253:28;:::i;:::-;41240:8;;41227:10;;:21;;;;:::i;:::-;41226:56;;;;:::i;:::-;41286:1;41226:61;41223:586;;41298:15;:13;:15::i;:::-;41352:37;41374:9;;41386:1;41374:13;;;;:::i;41352:37::-;41337:12;;:52;;;;:::i;:::-;41319:15;:70;41494:21;;41420:15;;41397:20;;41479:36;;41420:15;41479:36;:::i;:::-;41441:74;;41521:24;41590:1;41563:24;;:28;;;;:::i;:::-;41548:10;;:44;;;;:::i;:::-;41624:15;41600:21;:39;41521:71;-1:-1:-1;41651:52:0;;;;:111;;;41733:24;;41721:8;;41708:10;;:21;;;;:::i;:::-;41707:50;;;;:::i;:::-;:55;41651:111;41647:157;;;41776:21;:19;:21::i;:::-;41292:517;;;41223:586;41838:42;-1:-1:-1;;;;;41831:63:0;;41966:1;41903:42;-1:-1:-1;;;;;41896:65:0;;:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;;;;:::i;:::-;41831:137;;;;;;;;;;;;;160:25:1;;148:2;133:18;;14:177;41831:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41813:15;:155;40140:1833::o;5232:232::-;5295:7;5323:1;5328;5323:6;5315:30;;;;-1:-1:-1;;;5315:30:0;;21661:2:1;5315:30:0;;;21643:21:1;21700:2;21680:18;;;21673:30;-1:-1:-1;;;21719:18:1;;;21712:41;21770:18;;5315:30:0;21459:335:1;5315:30:0;5356:9;5368:5;5372:1;5368;:5;:::i;:::-;5356:17;-1:-1:-1;5388:5:0;5392:1;5388;:5;:::i;:::-;:10;5384:52;;5419:5;:1;5423;5419:5;:::i;2975:134::-;2927:5;;-1:-1:-1;;;;;2927:5:0;2913:10;:19;2905:42;;;;-1:-1:-1;;;2905:42:0;;20413:2:1;2905:42:0;;;20395:21:1;20452:2;20432:18;;;20425:30;-1:-1:-1;;;20471:18:1;;;20464:40;20521:18;;2905:42:0;20211:334:1;2905:42:0;3062:5:::1;::::0;3044:32:::1;::::0;;-1:-1:-1;;;;;3062:5:0;;::::1;23225:34:1::0;;23295:15;;;23290:2;23275:18;;23268:43;3044:32:0::1;::::0;23160:18:1;3044:32:0::1;;;;;;;3087:5;:14:::0;;-1:-1:-1;;;;;;3087:14:0::1;-1:-1:-1::0;;;;;3087:14:0;;;::::1;::::0;;;::::1;::::0;;2975:134::o;43501:1491::-;43642:30;;43569:15;;43546:20;;43627:45;;43569:15;43627:45;:::i;:::-;43589:83;;43677:15;43708:8;;43695:10;;:21;;;;:::i;:::-;43677:39;;43721:24;43762:10;43748;;:24;;;;:::i;:::-;43789:10;;43778:8;:21;43721:51;-1:-1:-1;43874:52:0;;;43870:761;;;43938:21;43962:69;43999:30;43963:29;:19;43988:3;43963:24;:29::i;43962:69::-;44044:1;44037:4;:8;43938:93;-1:-1:-1;44051:27:0;44081:45;44121:4;44081:25;43938:93;44102:3;44081:20;:25::i;:45::-;44051:75;;44169:69;44186:51;44214:22;44186;44203:4;44186:12;;:16;;:22;;;;:::i;44169:69::-;44154:12;:84;-1:-1:-1;43870:761:0;;-1:-1:-1;43870:761:0;;44272:23;44298:69;44346:19;44299:40;:30;44335:3;44299:35;:40::i;44298:69::-;44380:1;44373:4;:8;44272:95;-1:-1:-1;44387:29:0;44419:47;44461:4;44419:27;44272:95;44442:3;44419:22;:27::i;:47::-;44387:79;;44536:70;44553:52;44580:24;44553:21;44570:3;44553:12;;:16;;:21;;;;:::i;44536:70::-;44521:12;:85;-1:-1:-1;;43870:761:0;44670:12;44637:30;:45;;;;44726:42;-1:-1:-1;;;;;44719:65:0;;:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44687:29;:99;44809:15;;44794:12;;:30;44791:97;;;44867:15;;44852:12;:30;44791:97;44910:15;;44895:12;;:30;44892:92;;;44963:15;;44948:12;:30;44892:92;43541:1451;;;;43501:1491::o;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:173::-;817:20;;-1:-1:-1;;;;;866:31:1;;856:42;;846:70;;912:1;909;902:12;846:70;749:173;;;:::o;927:254::-;995:6;1003;1056:2;1044:9;1035:7;1031:23;1027:32;1024:52;;;1072:1;1069;1062:12;1024:52;1095:29;1114:9;1095:29;:::i;:::-;1085:39;1171:2;1156:18;;;;1143:32;;-1:-1:-1;;;927:254:1:o;1774:347::-;1825:8;1835:6;1889:3;1882:4;1874:6;1870:17;1866:27;1856:55;;1907:1;1904;1897:12;1856:55;-1:-1:-1;1930:20:1;;1973:18;1962:30;;1959:50;;;2005:1;2002;1995:12;1959:50;2042:4;2034:6;2030:17;2018:29;;2094:3;2087:4;2078:6;2070;2066:19;2062:30;2059:39;2056:59;;;2111:1;2108;2101:12;2056:59;1774:347;;;;;:::o;2126:695::-;2232:6;2240;2248;2256;2264;2272;2325:3;2313:9;2304:7;2300:23;2296:33;2293:53;;;2342:1;2339;2332:12;2293:53;2365:29;2384:9;2365:29;:::i;:::-;2355:39;;2413:38;2447:2;2436:9;2432:18;2413:38;:::i;:::-;2403:48;;2498:2;2487:9;2483:18;2470:32;2460:42;;2549:2;2538:9;2534:18;2521:32;2511:42;;2604:3;2593:9;2589:19;2576:33;2632:18;2624:6;2621:30;2618:50;;;2664:1;2661;2654:12;2618:50;2703:58;2753:7;2744:6;2733:9;2729:22;2703:58;:::i;:::-;2126:695;;;;-1:-1:-1;2126:695:1;;-1:-1:-1;2126:695:1;;2780:8;;2126:695;-1:-1:-1;;;2126:695:1:o;3033:626::-;3130:6;3138;3146;3154;3162;3215:3;3203:9;3194:7;3190:23;3186:33;3183:53;;;3232:1;3229;3222:12;3183:53;3255:29;3274:9;3255:29;:::i;:::-;3245:39;;3303:38;3337:2;3326:9;3322:18;3303:38;:::i;:::-;3293:48;;3388:2;3377:9;3373:18;3360:32;3350:42;;3443:2;3432:9;3428:18;3415:32;3470:18;3462:6;3459:30;3456:50;;;3502:1;3499;3492:12;3456:50;3541:58;3591:7;3582:6;3571:9;3567:22;3541:58;:::i;:::-;3033:626;;;;-1:-1:-1;3033:626:1;;-1:-1:-1;3618:8:1;;3515:84;3033:626;-1:-1:-1;;;3033:626:1:o;3664:248::-;3732:6;3740;3793:2;3781:9;3772:7;3768:23;3764:32;3761:52;;;3809:1;3806;3799:12;3761:52;-1:-1:-1;;3832:23:1;;;3902:2;3887:18;;;3874:32;;-1:-1:-1;3664:248:1:o;3917:127::-;3978:10;3973:3;3969:20;3966:1;3959:31;4009:4;4006:1;3999:15;4033:4;4030:1;4023:15;4049:908;4103:5;4156:3;4149:4;4141:6;4137:17;4133:27;4123:55;;4174:1;4171;4164:12;4123:55;4210:6;4197:20;4236:4;4259:18;4296:2;4292;4289:10;4286:36;;;4302:18;;:::i;:::-;4348:2;4345:1;4341:10;4380:2;4374:9;4443:2;4439:7;4434:2;4430;4426:11;4422:25;4414:6;4410:38;4498:6;4486:10;4483:22;4478:2;4466:10;4463:18;4460:46;4457:72;;;4509:18;;:::i;:::-;4545:2;4538:22;4595:18;;;4671:15;;;4667:24;;;4629:15;;;;-1:-1:-1;4703:15:1;;;4700:35;;;4731:1;4728;4721:12;4700:35;4767:2;4759:6;4755:15;4744:26;;4779:148;4795:6;4790:3;4787:15;4779:148;;;4861:23;4880:3;4861:23;:::i;:::-;4849:36;;4905:12;;;;4812;;;;4779:148;;;4945:6;4049:908;-1:-1:-1;;;;;;;4049:908:1:o;4962:559::-;5073:6;5081;5089;5097;5150:3;5138:9;5129:7;5125:23;5121:33;5118:53;;;5167:1;5164;5157:12;5118:53;5203:9;5190:23;5180:33;;5260:2;5249:9;5245:18;5232:32;5222:42;;5315:2;5304:9;5300:18;5287:32;5342:18;5334:6;5331:30;5328:50;;;5374:1;5371;5364:12;5328:50;5397:61;5450:7;5441:6;5430:9;5426:22;5397:61;:::i;:::-;5387:71;;;5477:38;5511:2;5500:9;5496:18;5477:38;:::i;:::-;5467:48;;4962:559;;;;;;;:::o;5526:328::-;5603:6;5611;5619;5672:2;5660:9;5651:7;5647:23;5643:32;5640:52;;;5688:1;5685;5678:12;5640:52;5711:29;5730:9;5711:29;:::i;:::-;5701:39;;5759:38;5793:2;5782:9;5778:18;5759:38;:::i;:::-;5749:48;;5844:2;5833:9;5829:18;5816:32;5806:42;;5526:328;;;;;:::o;6256:180::-;6315:6;6368:2;6356:9;6347:7;6343:23;6339:32;6336:52;;;6384:1;6381;6374:12;6336:52;-1:-1:-1;6407:23:1;;6256:180;-1:-1:-1;6256:180:1:o;6441:391::-;6527:6;6535;6543;6551;6604:3;6592:9;6583:7;6579:23;6575:33;6572:53;;;6621:1;6618;6611:12;6572:53;6644:29;6663:9;6644:29;:::i;:::-;6634:39;6720:2;6705:18;;6692:32;;-1:-1:-1;6771:2:1;6756:18;;6743:32;;6822:2;6807:18;6794:32;;-1:-1:-1;6441:391:1;-1:-1:-1;;;6441:391:1:o;7019:460::-;7114:6;7122;7130;7138;7146;7199:3;7187:9;7178:7;7174:23;7170:33;7167:53;;;7216:1;7213;7206:12;7167:53;7252:9;7239:23;7229:33;;7309:2;7298:9;7294:18;7281:32;7271:42;;7360:2;7349:9;7345:18;7332:32;7322:42;;7411:2;7400:9;7396:18;7383:32;7373:42;;7434:39;7468:3;7457:9;7453:19;7434:39;:::i;:::-;7424:49;;7019:460;;;;;;;;:::o;7484:186::-;7543:6;7596:2;7584:9;7575:7;7571:23;7567:32;7564:52;;;7612:1;7609;7602:12;7564:52;7635:29;7654:9;7635:29;:::i;7675:385::-;7761:6;7769;7777;7785;7838:3;7826:9;7817:7;7813:23;7809:33;7806:53;;;7855:1;7852;7845:12;7806:53;-1:-1:-1;;7878:23:1;;;7948:2;7933:18;;7920:32;;-1:-1:-1;7999:2:1;7984:18;;7971:32;;8050:2;8035:18;8022:32;;-1:-1:-1;7675:385:1;-1:-1:-1;7675:385:1:o;8065:322::-;8142:6;8150;8158;8211:2;8199:9;8190:7;8186:23;8182:32;8179:52;;;8227:1;8224;8217:12;8179:52;8263:9;8250:23;8240:33;;8320:2;8309:9;8305:18;8292:32;8282:42;;8343:38;8377:2;8366:9;8362:18;8343:38;:::i;:::-;8333:48;;8065:322;;;;;:::o;8392:316::-;8469:6;8477;8485;8538:2;8526:9;8517:7;8513:23;8509:32;8506:52;;;8554:1;8551;8544:12;8506:52;-1:-1:-1;;8577:23:1;;;8647:2;8632:18;;8619:32;;-1:-1:-1;8698:2:1;8683:18;;;8670:32;;8392:316;-1:-1:-1;8392:316:1:o;8943:732::-;9079:6;9087;9095;9103;9156:3;9144:9;9135:7;9131:23;9127:33;9124:53;;;9173:1;9170;9163:12;9124:53;9209:9;9196:23;9186:33;;9266:2;9255:9;9251:18;9238:32;9228:42;;9321:2;9310:9;9306:18;9293:32;9344:18;9385:2;9377:6;9374:14;9371:34;;;9401:1;9398;9391:12;9371:34;9424:61;9477:7;9468:6;9457:9;9453:22;9424:61;:::i;:::-;9414:71;;9538:2;9527:9;9523:18;9510:32;9494:48;;9567:2;9557:8;9554:16;9551:36;;;9583:1;9580;9573:12;9551:36;;9606:63;9661:7;9650:8;9639:9;9635:24;9606:63;:::i;:::-;9596:73;;;8943:732;;;;;;;:::o;9680:260::-;9748:6;9756;9809:2;9797:9;9788:7;9784:23;9780:32;9777:52;;;9825:1;9822;9815:12;9777:52;9848:29;9867:9;9848:29;:::i;:::-;9838:39;;9896:38;9930:2;9919:9;9915:18;9896:38;:::i;:::-;9886:48;;9680:260;;;;;:::o;10269:127::-;10330:10;10325:3;10321:20;10318:1;10311:31;10361:4;10358:1;10351:15;10385:4;10382:1;10375:15;10401:128;10468:9;;;10489:11;;;10486:37;;;10503:18;;:::i;10534:380::-;10613:1;10609:12;;;;10656;;;10677:61;;10731:4;10723:6;10719:17;10709:27;;10677:61;10784:2;10776:6;10773:14;10753:18;10750:38;10747:161;;10830:10;10825:3;10821:20;10818:1;10811:31;10865:4;10862:1;10855:15;10893:4;10890:1;10883:15;10747:161;;10534:380;;;:::o;10919:127::-;10980:10;10975:3;10971:20;10968:1;10961:31;11011:4;11008:1;11001:15;11035:4;11032:1;11025:15;11051:120;11091:1;11117;11107:35;;11122:18;;:::i;:::-;-1:-1:-1;11156:9:1;;11051:120::o;11176:168::-;11249:9;;;11280;;11297:15;;;11291:22;;11277:37;11267:71;;11318:18;;:::i;11349:112::-;11381:1;11407;11397:35;;11412:18;;:::i;:::-;-1:-1:-1;11446:9:1;;11349:112::o;11466:125::-;11531:9;;;11552:10;;;11549:36;;;11565:18;;:::i;11596:127::-;11657:10;11652:3;11648:20;11645:1;11638:31;11688:4;11685:1;11678:15;11712:4;11709:1;11702:15;11728:135;11767:3;11788:17;;;11785:43;;11808:18;;:::i;:::-;-1:-1:-1;11855:1:1;11844:13;;11728:135::o;11868:184::-;11938:6;11991:2;11979:9;11970:7;11966:23;11962:32;11959:52;;;12007:1;12004;11997:12;11959:52;-1:-1:-1;12030:16:1;;11868:184;-1:-1:-1;11868:184:1:o;12057:422::-;12146:1;12189:5;12146:1;12203:270;12224:7;12214:8;12211:21;12203:270;;;12283:4;12279:1;12275:6;12271:17;12265:4;12262:27;12259:53;;;12292:18;;:::i;:::-;12342:7;12332:8;12328:22;12325:55;;;12362:16;;;;12325:55;12441:22;;;;12401:15;;;;12203:270;;;12207:3;12057:422;;;;;:::o;12484:806::-;12533:5;12563:8;12553:80;;-1:-1:-1;12604:1:1;12618:5;;12553:80;12652:4;12642:76;;-1:-1:-1;12689:1:1;12703:5;;12642:76;12734:4;12752:1;12747:59;;;;12820:1;12815:130;;;;12727:218;;12747:59;12777:1;12768:10;;12791:5;;;12815:130;12852:3;12842:8;12839:17;12836:43;;;12859:18;;:::i;:::-;-1:-1:-1;;12915:1:1;12901:16;;12930:5;;12727:218;;13029:2;13019:8;13016:16;13010:3;13004:4;13001:13;12997:36;12991:2;12981:8;12978:16;12973:2;12967:4;12964:12;12960:35;12957:77;12954:159;;;-1:-1:-1;13066:19:1;;;13098:5;;12954:159;13145:34;13170:8;13164:4;13145:34;:::i;:::-;13215:6;13211:1;13207:6;13203:19;13194:7;13191:32;13188:58;;;13226:18;;:::i;:::-;13264:20;;12484:806;-1:-1:-1;;;12484:806:1:o;13295:140::-;13353:5;13382:47;13423:4;13413:8;13409:19;13403:4;13382:47;:::i;13440:421::-;13642:2;13624:21;;;13681:2;13661:18;;;13654:30;13720:34;13715:2;13700:18;;13693:62;13791:27;13786:2;13771:18;;13764:55;13851:3;13836:19;;13440:421::o;14426:131::-;14486:5;14515:36;14542:8;14536:4;14515:36;:::i;14562:359::-;14747:19;;;14804:2;14800:15;;;;-1:-1:-1;;14796:53:1;14791:2;14782:12;;14775:75;14875:2;14866:12;;14859:28;14912:2;14903:12;;14562:359::o;15566:410::-;15768:2;15750:21;;;15807:2;15787:18;;;15780:30;15846:34;15841:2;15826:18;;15819:62;-1:-1:-1;;;15912:2:1;15897:18;;15890:44;15966:3;15951:19;;15566:410::o;15981:404::-;16183:2;16165:21;;;16222:2;16202:18;;;16195:30;16261:34;16256:2;16241:18;;16234:62;-1:-1:-1;;;16327:2:1;16312:18;;16305:38;16375:3;16360:19;;15981:404::o;16748:494::-;16950:2;16932:21;;;16989:2;16969:18;;;16962:30;17028:34;17023:2;17008:18;;17001:62;17099:34;17094:2;17079:18;;17072:62;17171:28;17165:3;17150:19;;17143:57;17232:3;17217:19;;16748:494::o;17247:556::-;17449:2;17431:21;;;17488:3;17468:18;;;17461:31;17528:34;17523:2;17508:18;;17501:62;17599:34;17594:2;17579:18;;17572:62;17671:34;17665:3;17650:19;;17643:63;-1:-1:-1;;;17737:3:1;17722:19;;17715:46;17793:3;17778:19;;17247:556::o;18471:422::-;18673:2;18655:21;;;18712:2;18692:18;;;18685:30;18751:34;18746:2;18731:18;;18724:62;18822:28;18817:2;18802:18;;18795:56;18883:3;18868:19;;18471:422::o;18898:351::-;19100:2;19082:21;;;19139:2;19119:18;;;19112:30;19178:29;19173:2;19158:18;;19151:57;19240:2;19225:18;;18898:351::o;19533:277::-;19600:6;19653:2;19641:9;19632:7;19628:23;19624:32;19621:52;;;19669:1;19666;19659:12;19621:52;19701:9;19695:16;19754:5;19747:13;19740:21;19733:5;19730:32;19720:60;;19776:1;19773;19766:12;20550:127;20611:10;20606:3;20602:20;20599:1;20592:31;20642:4;20639:1;20632:15;20666:4;20663:1;20656:15

Swarm Source

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