Token ELF

 

Overview ERC-721

Total Supply:
0 ELF

Holders:
6,127 addresses

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
Loading

Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ELFCore

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-04
*/

// File: utils/ISpawnContract.sol

pragma solidity >=0.8.0 <0.9.0;

interface ISpawnContract{

    /// @dev This event should be fired whenever the address of CoinB is modified.
    event CoinBChanged(address indexed _from,address indexed _to, uint256 _time);

    /// @dev This event should be fired whenever the address of CoinA is modified.
    event CoinAChanged(address indexed _from,address indexed _to, uint256 _time);

    /// @dev Change CoinA contract.
    ///  Caller should always be superAdmin. _to is the address of new CoinA contract.
    function changeCoinA(address addr) external;

    /// @dev Change CoinB contract.
    ///  Caller should always be superAdmin. _to is the address of new CoinB contract.
    function changeCoinB(address addr) external;

    function setELFCore(address addr) external;

    function spawnEgg(uint256 seed, uint256 momGene, uint256 dadGene, uint256 momChildren, uint256 dadChildren, address caller, bool momFromChaos, bool dadFromChaos) external returns(uint256 gene);
}
// File: utils/IGetter.sol

pragma solidity >=0.8.0 <0.9.0;

interface IGetter {

    /// @dev Interface used by server to check who can use the _tokenId.
    function getUser(address _nftAddress,uint256 _tokenId) external view returns (address);
    
    /// @dev Interface used by server to check who can claim coin B earned by _tokenId.
    function getCoinB(address _nftAddress,uint256 _tokenId) external view returns (address);
}
// File: utils/ICapsuleContract.sol

pragma solidity >=0.8.0 <0.9.0;

interface ICapsuleContract{
    function writePriceInfo(uint256 price) external;
    function getPriceInfo() external view returns(uint256 price,uint256 time);
    function createCapsule(address caller,bool triple) external returns(uint256[] memory, uint256);
    function setELFCoreAddress(address addr) external;
}
// File: utils/Address.sol

pragma solidity >=0.8.0 <0.9.0;

/**
 * @dev Utility library of inline functions on addresses.
 * @notice Based on:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol
 * Requires EIP-1052.
 */
library AddressUtils{

    /**
    * @dev Returns whether the target address is a contract.
    * @param _addr Address to check.
    * @return addressCheck True if _addr is a contract, false if not.
    */
    function isContract(
    address _addr
    )
    internal
    view
    returns (bool addressCheck)
    {
    // This method relies in extcodesize, which returns 0 for contracts in
    // construction, since the code is only stored at the end of the
    // constructor execution.

    // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
    // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
    // for accounts without code, i.e. `keccak256('')`
    bytes32 codehash;
    bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
    assembly { codehash := extcodehash(_addr) } // solhint-disable-line
    addressCheck = (codehash != 0x0 && codehash != accountHash);
    }

}
// File: utils/IERC165.sol

pragma solidity >=0.8.0 <0.9.0;

interface IERC165 {
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
// File: token/IERC721Metadata.sol

pragma solidity >=0.8.0 <0.9.0;

/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x5b5e139f.
interface IERC721Metadata /* is ERC721 */ {
    /// @notice A descriptive name for a collection of NFTs in this contract
    function name() external view returns (string memory _name);

    /// @notice An abbreviated name for NFTs in this contract
    function symbol() external view returns (string memory _symbol);

    /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
    /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
    ///  3986. The URI may point to a JSON file that conforms to the "ERC721
    ///  Metadata JSON Schema".
    function tokenURI(uint256 _tokenId) external view returns (string memory);
}
// File: token/IERC721TokenReceiver.sol

pragma solidity >=0.8.0 <0.9.0;

/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
interface IERC721TokenReceiver {
    /// @notice Handle the receipt of an NFT
    /// @dev The ERC721 smart contract calls this function on the recipient
    ///  after a `transfer`. This function MAY throw to revert and reject the
    ///  transfer. Return of other than the magic value MUST result in the
    ///  transaction being reverted.
    ///  Note: the contract address is always the message sender.
    /// @param _operator The address which called `safeTransferFrom` function
    /// @param _from The address which previously owned the token
    /// @param _tokenId The NFT identifier which is being transferred
    /// @param _data Additional data with no specified format
    /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    ///  unless throwing
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4);
}
// File: token/IERC721.sol

pragma solidity >=0.8.0 <0.9.0;

/// @title ERC-721 Non-Fungible Token Standard
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x80ac58cd.
interface IERC721 /* is ERC165 */ {
    /// @dev This emits when ownership of any NFT changes by any mechanism.
    ///  This event emits when NFTs are created (`from` == 0) and destroyed
    ///  (`to` == 0). Exception: during contract creation, any number of NFTs
    ///  may be created and assigned without emitting Transfer. At the time of
    ///  any transfer, the approved address for that NFT (if any) is reset to none.
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    /// @dev This emits when the approved address for an NFT is changed or
    ///  reaffirmed. The zero address indicates there is no approved address.
    ///  When a Transfer event emits, this also indicates that the approved
    ///  address for that NFT (if any) is reset to none.
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

    /// @dev This emits when an operator is enabled or disabled for an owner.
    ///  The operator can manage all NFTs of the owner.
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /// @notice Count all NFTs assigned to an owner
    /// @dev NFTs assigned to the zero address are considered invalid, and this
    ///  function throws for queries about the zero address.
    /// @param _owner An address for whom to query the balance
    /// @return The number of NFTs owned by `_owner`, possibly zero
    function balanceOf(address _owner) external view returns (uint256);

    /// @notice Find the owner of an NFT
    /// @dev NFTs assigned to zero address are considered invalid, and queries
    ///  about them do throw.
    /// @param _tokenId The identifier for an NFT
    /// @return The address of the owner of the NFT
    function ownerOf(uint256 _tokenId) external view returns (address);

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to "".
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;

    /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
    ///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
    ///  THEY MAY BE PERMANENTLY LOST
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function transferFrom(address _from, address _to, uint256 _tokenId) external payable;

    /// @notice Change or reaffirm the approved address for an NFT
    /// @dev The zero address indicates there is no approved address.
    ///  Throws unless `msg.sender` is the current NFT owner, or an authorized
    ///  operator of the current owner.
    /// @param _approved The new approved NFT controller
    /// @param _tokenId The NFT to approve
    function approve(address _approved, uint256 _tokenId) external payable;

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///  all of `msg.sender`'s assets
    /// @dev Emits the ApprovalForAll event. The contract MUST allow
    ///  multiple operators per owner.
    /// @param _operator Address to add to the set of authorized operators
    /// @param _approved True if the operator is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external;

    /// @notice Get the approved address for a single NFT
    /// @dev Throws if `_tokenId` is not a valid NFT.
    /// @param _tokenId The NFT to find the approved address for
    /// @return The approved address for this NFT, or the zero address if there is none
    function getApproved(uint256 _tokenId) external view returns (address);

    /// @notice Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the NFTs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}
// File: security/AccessControl.sol

pragma solidity >=0.8.0 <0.9.0;

contract AccessControl{

    /// @dev Error message.
    string constant NO_PERMISSION='no permission';
    string constant INVALID_ADDRESS ='invalid address';
    
    /// @dev Administrator with highest authority. Should be a multisig wallet.
    address payable superAdmin;

    /// @dev Administrator of this contract.
    address payable admin;

    /// Sets the original admin and superAdmin of the contract to the sender account.
    constructor(){
        superAdmin=payable(msg.sender);
        admin=payable(msg.sender);
    }

    /// @dev Throws if called by any account other than the superAdmin.
    modifier onlySuperAdmin{
        require(msg.sender==superAdmin,NO_PERMISSION);
        _;
    }

    /// @dev Throws if called by any account other than the admin.
    modifier onlyAdmin{
        require(msg.sender==admin,NO_PERMISSION);
        _;
    }

    /// @dev Allows the current superAdmin to change superAdmin.
    /// @param addr The address to transfer the right of superAdmin to.
    function changeSuperAdmin(address payable addr) external onlySuperAdmin{
        require(addr!=payable(address(0)),INVALID_ADDRESS);
        superAdmin=addr;
    }

    /// @dev Allows the current superAdmin to change admin.
    /// @param addr The address to transfer the right of admin to.
    function changeAdmin(address payable addr) external onlySuperAdmin{
        require(addr!=payable(address(0)),INVALID_ADDRESS);
        admin=addr;
    }

    /// @dev Called by superAdmin to withdraw balance.
    function withdrawBalance(uint256 amount) external onlySuperAdmin{
        superAdmin.transfer(amount);
    }

    fallback() external {}
}
// File: security/Pausable.sol

pragma solidity >=0.8.0 <0.9.0;


contract Pausable is AccessControl{

    /// @dev Error message.
    string constant PAUSED='paused';
    string constant NOT_PAUSED='not paused';

    /// @dev Keeps track whether the contract is paused. When this is true, most actions are blocked.
    bool public paused = false;

    /// @dev Modifier to allow actions only when the contract is not paused
    modifier whenNotPaused {
        require(!paused,PAUSED);
        _;
    }

    /// @dev Modifier to allow actions only when the contract is paused
    modifier whenPaused {
        require(paused,NOT_PAUSED);
        _;
    }

    /// @dev Called by superAdmin to pause the contract. Used when something goes wrong
    ///  and we need to limit damage.
    function pause() external onlySuperAdmin whenNotPaused {
        paused = true;
    }

    /// @dev Unpauses the smart contract. Can only be called by the superAdmin.
    function unpause() external onlySuperAdmin whenPaused {
        paused = false;
    }
}
// File: ELFCore.sol

pragma solidity >=0.8.0 <0.9.0;










contract ELFBase is Pausable, IERC721TokenReceiver, IERC165, IERC721Metadata{

    /// @dev Used for supportsInterface of ERC165.
    bytes4 constant InterfaceSignature_ERC721=0x80ac58cd;
    bytes4 constant InterfaceSignature_ERC165=0x01ffc9a7;
    bytes4 constant InterfaceSignature_ERC721TokenReceiver=0x150b7a02;
    bytes4 constant InterfaceSignature_ERC721Metadata=0x5b5e139f;
    
    /// @dev Value should be returned when we transfer NFT to a contract via safeTransferFrom.
    bytes4 constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

    /// @dev Error message.
    string constant NOT_VALID_NFT ='invalid NFT';

    /// @dev The data type of ELF NFT instance.
    struct ELF{
        uint256 label;
        uint256 dad;
        uint256 mom;
        uint256 gene;
        uint256 bornAt;
    }

    string url='www.roe.com/';

    /// @dev An array contains all existing ELF NFT instances.
    ///  The tokenId of each NFT is actually an index into this array.
    ELF[] ELFs;

    /// @dev Mapping from tokenId to whether it is hatched.
    mapping (uint256 => bool) tokenIdToHatched;

    /// @dev Mapping from tokenId to its children.
    mapping (uint256 => uint256[]) tokenIdToChildren;

    function setURL(string memory _url) external onlyAdmin {
        url=_url;
    }

    /// @notice A descriptive name for a collection of NFTs in this contract
    function name() external pure override returns (string memory _name){
        return 'ELF';
    }

    /// @notice An abbreviated name for NFTs in this contract
    function symbol() external pure override returns (string memory _symbol){
        return 'ELF';
    }

    /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
    /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
    ///  3986. The URI may point to a JSON file that conforms to the "ERC721
    ///  Metadata JSON Schema".
    function tokenURI(uint256 _tokenId) external view override returns (string memory){
        require(_tokenId<ELFs.length && _tokenId!=0,NOT_VALID_NFT);
        uint256 temp = _tokenId;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (_tokenId != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(_tokenId % 10)));
            _tokenId /= 10;
        }
        return string(abi.encodePacked(url,string(buffer)));
    }

    ///  @dev Returns true for any standardized interfaces implemented by this contract. We implement
    ///  ERC-165, ERC721TokenReceiver and ERC-721.
    function supportsInterface(bytes4 _interfaceID) override external pure returns (bool){
        return ((_interfaceID == InterfaceSignature_ERC165)||(_interfaceID == InterfaceSignature_ERC721)||(_interfaceID==InterfaceSignature_ERC721TokenReceiver)||(_interfaceID == InterfaceSignature_ERC721Metadata));
    }

    /// @dev Required for ERC721TokenReceiver compliance.
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) override pure external returns(bytes4){
        return MAGIC_ON_ERC721_RECEIVED;
    }

    /// @dev Gain information of an ELF instance.
    function gainELF(uint256 _tokenId) external view returns(uint256,uint256,uint256,uint256,uint256,uint256[] memory){
        ELF memory _ELF=ELFs[_tokenId];
        uint256 gene=_ELF.gene;
        if (!tokenIdToHatched[_tokenId]){
            gene=(gene/10000000000000000000000000000000000000000000000000000000000000)%10;
        }
        return(_ELF.label,_ELF.dad,_ELF.mom,gene,_ELF.bornAt,tokenIdToChildren[_tokenId]);
    }
}

contract ELFTransfer is ELFBase, IERC721{

    using AddressUtils for address;

    /// @dev Error message.
    string constant WRONG_PARAMETER='wrong parameter';
    string constant CANT_RECEIVE_NFT='can not receive NFT';

    /// @dev Mapping from tokenId to the address that owns it. There is a valid owner
    ///  for every ELF.
    mapping (uint256 => address) tokenIdToOwner;

    /// @dev Mapping from tokenId to index of arrary storing it.
    mapping (uint256 => uint256) tokenIdToIndex;

    /// @dev Mapping from owner to list of owned tokenIds.
    mapping (address => uint256[]) ownedTokens;

    /// @dev Mapping from tokenId to an address that has been approved to transfer this NFT. 
    ///  A zero value means no approved address.
    mapping (uint256 => address) tokenIdToApproved;

    /// @dev Mapping from owner address to authorized operators of that owner.
    ///  true means authorized, false means unauthorized.
    mapping (address => mapping (address => bool)) ownerToOperators;

    /// @dev Mapping from address to tokenIds usable by the address but not owned by the address.
    mapping (address => uint256[]) ownedByContractTokens;

    /// @dev When the token is owned by smart contract, mapping from tokenId to its usable address.
    ///  Can only be set by the owned smart contract.  
    mapping (uint256 => address) tokenToUsable;

    /// @dev Mapping from tokenId to its index of ownedByContractTokens.
    mapping (uint256 => uint256) tokenToOwnedByContractTokensIndex;

    /// @dev Whether tokenId has been hatched.
    function isHatched(uint256 _tokenId) public view returns(bool res){
        ownerOf(_tokenId);
        res=tokenIdToHatched[_tokenId];
    }

    /// @dev Return owned tokenIds of an address.
    function gainOwnedTokens(address addr) external view returns(uint256[] memory){
        require(addr!=address(0),INVALID_ADDRESS);
        return(ownedTokens[addr]);
    }

    /// @dev Internal function used to add ELF NFT instance to address _to.
    /// @param _to Add token to _to.
    /// @param _tokenId ELF NFT instance we want to operate.
    function _addTo(address _to, uint256 _tokenId) internal{
        tokenIdToOwner[_tokenId]=_to;
        uint256[] storage _ownedTokens=ownedTokens[_to];
        tokenIdToIndex[_tokenId]=_ownedTokens.length;
        _ownedTokens.push(_tokenId);
    }

    /// @dev Internal function used to remove ELF NFT instance.
    /// @param _tokenId ELF NFT instance we want to operate.
    function _removeFrom(address _from,uint256 _tokenId) internal{
        uint256[] storage _ownedTokens=ownedTokens[_from];
        uint256 lastIndex=_ownedTokens.length-1;
        uint256 lastTokenId=_ownedTokens[lastIndex];
        uint256 tokenIndex=tokenIdToIndex[_tokenId];
        delete tokenIdToOwner[_tokenId];
        delete tokenIdToIndex[_tokenId];
        tokenIdToIndex[lastTokenId]=tokenIndex;
        _ownedTokens[tokenIndex]=lastTokenId;
        _ownedTokens.pop();
        if (tokenToUsable[_tokenId]!=address(0)){
            removeFromOwnedByContractTokens(_tokenId);
            tokenToUsable[_tokenId]=address(0);
        }
    }

    function setTokenToUsable(uint256 tokenId, address addr) external{
        require(msg.sender==ownerOf(tokenId) && msg.sender.isContract(),NO_PERMISSION);
        if (tokenToUsable[tokenId]!=address(0)){
            removeFromOwnedByContractTokens(tokenId);
        }
        tokenToUsable[tokenId]=addr;
        tokenToOwnedByContractTokensIndex[tokenId]=ownedByContractTokens[addr].length;
        ownedByContractTokens[addr].push(tokenId);
    }

    function removeFromOwnedByContractTokens(uint256 tokenId) internal{
        address from=tokenToUsable[tokenId];
        uint256 index=tokenToOwnedByContractTokensIndex[tokenId];
        uint256 l=ownedByContractTokens[from].length;
        uint256 lastTokenId=ownedByContractTokens[from][l-1];
        ownedByContractTokens[from][index]=lastTokenId;
        ownedByContractTokens[from].pop();
        tokenToOwnedByContractTokensIndex[lastTokenId]=index;
        delete tokenToOwnedByContractTokensIndex[tokenId];
    }

    /// @dev Return usable tokens of addr.
    function usableTokens(address addr) external view returns(uint256[] memory){
        require(addr!=address(0),INVALID_ADDRESS);
        uint256[] memory temp1=ownedTokens[addr];
        uint256[] memory temp2=ownedByContractTokens[addr];
        uint256 l1=temp1.length;
        uint256 l2=temp2.length;
        uint256[] memory cache1 = new uint256[](l1);
        uint256[] memory cache2 = new uint256[](l2);
        uint256 count1;
        uint256 count2;
        for (uint256 i=0;i<l1;i++){
            if (tokenIdToHatched[temp1[i]]){
                count1++;
                cache1[i]=temp1[i];
            }
        }
        for (uint256 i=0;i<l2;i++){
            if (tokenIdToHatched[temp2[i]]){
                IGetter contractInstance=IGetter(ownerOf(temp2[i]));
                try contractInstance.getUser(address(this),temp2[i]) returns (address tar){
                    if (tar==addr){
                        count2++;
                        cache2[i]=temp2[i];
                    }
                } catch {}
            }
        }
        uint256 index=0;
        uint256[] memory res = new uint256[](count1+count2);
        for (uint256 i=0;i<l1;i++){
            if (cache1[i]!=0){
                res[index]=cache1[i];
                index++;
            }
        }
        for (uint256 i=0;i<l2;i++){
            if (cache2[i]!=0){
                res[index]=cache2[i];
                index++;
            }
        }
        return res;
    }

    /// @dev Required for ERC-721 compliance.
    function balanceOf(address _owner) override external view returns (uint256){
        require(_owner!=address(0),INVALID_ADDRESS);
        return ownedTokens[_owner].length;
    }

    /// @dev Required for ERC-721 compliance.
    function ownerOf(uint256 _tokenId) override public view returns (address res){
        res=tokenIdToOwner[_tokenId];
        require(res!=address(0),NOT_VALID_NFT);
    }

    /// @dev Required for ERC-721 compliance.
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) override external payable{
        transferFrom(_from, _to, _tokenId);
        if (_to.isContract()){
            bytes4 retval=IERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, data);
            require(retval == MAGIC_ON_ERC721_RECEIVED,CANT_RECEIVE_NFT);
        }
    }

    /// @dev Required for ERC-721 compliance.
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) override external payable{
        transferFrom(_from, _to, _tokenId);
        if (_to.isContract()){
            bytes4 retval=IERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, '');
            require(retval == MAGIC_ON_ERC721_RECEIVED,CANT_RECEIVE_NFT);
        }
    }

    /// @dev Required for ERC-721 compliance.
    function transferFrom(address _from, address _to, uint256 _tokenId) override public payable whenNotPaused{
        address _owner=ownerOf(_tokenId);
        require(msg.sender==_owner||ownerToOperators[_owner][msg.sender]||msg.sender==tokenIdToApproved[_tokenId],NO_PERMISSION);
        require(_from==_owner,WRONG_PARAMETER);
        require(_to!=address(0),INVALID_ADDRESS);
        _removeFrom(_from,_tokenId);
        _addTo(_to,_tokenId);
        if (tokenIdToApproved[_tokenId]!=address(0)){
            delete tokenIdToApproved[_tokenId];
            emit Approval(_from, address(0), _tokenId);
        }
        emit Transfer(_from, _to, _tokenId);
    }

    /// @dev Required for ERC-721 compliance.
    function approve(address _approved, uint256 _tokenId) override external payable whenNotPaused{
        address _owner=ownerOf(_tokenId);
        require(msg.sender==_owner||ownerToOperators[_owner][msg.sender],NO_PERMISSION);
        tokenIdToApproved[_tokenId]=_approved;
        emit Approval(_owner,_approved,_tokenId);
    }

    /// @dev Required for ERC-721 compliance.
    function setApprovalForAll(address _operator, bool _approved) override external whenNotPaused{
        ownerToOperators[msg.sender][_operator]=_approved;
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

    /// @dev Required for ERC-721 compliance.
    function getApproved(uint256 _tokenId) override external view returns (address){
        ownerOf(_tokenId);
        return tokenIdToApproved[_tokenId];
    }

    /// @dev Required for ERC-721 compliance.
    function isApprovedForAll(address _owner, address _operator) override external view returns (bool){
        return ownerToOperators[_owner][_operator];
    }

    ///@dev Only res1 can use tokenId. Coin B earned by tokenId should distribute to res2.
    function userOfCoinBTo(uint256[] memory tokenIds) external view returns (address[] memory,address[] memory){
        uint256 l=tokenIds.length;
        address[] memory res1=new address[](l);
        address[] memory res2=new address[](l);
        address owner;
        uint256 tokenId;
        for (uint256 i=0;i<l;i++){
            tokenId=tokenIds[i];
            owner=ownerOf(tokenId);
            if (tokenIdToHatched[tokenId]){
                if (owner.isContract()){
                    IGetter contractInstance=IGetter(owner);
                    try contractInstance.getUser(address(this),tokenId) returns(address temp){
                        res1[i]=temp;
                    }catch{res1[i]=address(0);}
                    try contractInstance.getCoinB(address(this),tokenId) returns(address temp){
                        res2[i]=temp;
                    }catch{res2[i]=address(0);}
                }
                else{
                    res1[i]=owner;
                    res2[i]=owner;
                }
            }
            else{
                res1[i]=address(0);
                res2[i]=address(0);
            }
        }
        return (res1,res2);
    }

    /// @dev Gain all genes of ELFs in tokenIds.
    function gainGenes(uint256[] memory tokenIds) external view returns(uint256[] memory){
        uint256 l=tokenIds.length;
        uint256[] memory res = new uint256[](l);
        for (uint256 i=0;i<l;i++){
            if (isHatched(tokenIds[i])){
                ELF memory _ELF=ELFs[tokenIds[i]];
                res[i]=_ELF.gene;
            }
            else{
                res[i]=0;
            }
        }
        return res;
    }
}

contract ELFCore is ELFTransfer{

    /// @dev This is the spawan of chaos. Whether it is an ELF is still a mystery. 
    ///  No one has the ability to own it.
    constructor(){
        ELF memory _ELF=ELF({
            label:777,
            dad:0,
            mom:0,
            gene:0,
            bornAt:block.timestamp
        });
        ELFs.push(_ELF);
        tokenIdToHatched[0]=true;
    }

    /// @dev Error message.
    string constant WRONG_MONEY='money not enough';
    string constant EXCEED_MAX_SPAWN_TIMES ='exceed maximum spawan time';
    string constant CLOSE_BREEDING='close breeding';
    string constant NOT_MATURE='egg not mature';
    string constant HATCHED='egg hatched';

    /// @dev This event should be fired whenever the address of capsule contract is modified.
    event CapsuleContractChanged(address indexed _from,address indexed _to, uint256 _time);

    /// @dev The address of current capsule contract.
    address public capsuleContractAddress;

    /// @dev Total capsule number. Can't bigger than 5000.
    uint256 public capsuleCount;

    /// @dev Change capsule contract.
    ///  Caller should always be administrator. addr is the address of new capsule contract.
    function changeCapsuleContract(address addr) external onlySuperAdmin{
        require(addr!=address(0),INVALID_ADDRESS);
        emit CapsuleContractChanged(capsuleContractAddress,addr,block.timestamp);
        capsuleContractAddress=addr;
    }

    /// @dev Capsule machine. Capsule contract is assigned by superAdmin, 
    ///  so we do not have to worry about reentrancy attack here.
    function capsuleMachine(bool triple) external payable whenNotPaused {
        uint256 count=1;
        if (triple){
            count=3;
        }
        capsuleCount+=count;
        require(capsuleCount<=5000,'capsule limit exceeded');
        ICapsuleContract capsuleContractInstance=ICapsuleContract(capsuleContractAddress);
        (uint256 price,)=capsuleContractInstance.getPriceInfo();
        require(msg.value>=price*count,WRONG_MONEY);
        uint256 label;
        uint256[] memory genes = new uint256[](count);
        (genes,label)=capsuleContractInstance.createCapsule(msg.sender,triple);
        for(uint256 i=0;i<count;i++){
            ELF memory _ELF=ELF({
                label:label,
                dad:0,
                mom:0,
                gene:genes[i],
                bornAt:block.timestamp+432000
            });
            _addTo(msg.sender,ELFs.length);
            emit Transfer(address(0),msg.sender,ELFs.length);
            ELFs.push(_ELF);
        }
        if (msg.value>price*count){
            payable(msg.sender).transfer(msg.value-price*count);
        }
    }

    /// @dev This event should be fired whenever the address of SpawnContract is modified.
    event SpawnContractChanged(address indexed _from,address indexed _to, uint256 _time);

    /// @dev The address of SpawnContract.
    address public SpawnContractAddress;

    /// @dev Change SpawnContract address. 
    ///  Caller should always be superAdmin. addr is the address of new SpawnContract address.
    function changeSpawnContract(address addr) external onlySuperAdmin{
        require(addr!=address(0),INVALID_ADDRESS);
        emit SpawnContractChanged(SpawnContractAddress,addr,block.timestamp);
        SpawnContractAddress=addr;
    }

    /// @dev Maximun spawning time of an ELF.
    uint256 public constant maxSpawnTimes=7;
    
    /// @dev Spawn an egg of ELF. Mint NFT. Spawn contract is assigned by superAdmin, 
    ///  so we do not have to worry about reentrancy attack here.
    /// @param momTokenId tokenId of one of parent of new ELF. ELF has no gender, mom and dad is used for convinience.
    /// @param dadTokenId tokenId of one of parent of new ELF.
    function spawnEgg(uint256 momTokenId,uint256 dadTokenId) external whenNotPaused returns (uint256 tokenId){
        require(msg.sender==ownerOf(momTokenId),NO_PERMISSION);
        require(msg.sender==ownerOf(dadTokenId),NO_PERMISSION);
        uint256 dadChildrenCount=tokenIdToChildren[dadTokenId].length;
        uint256 momChildrenCount=tokenIdToChildren[momTokenId].length;
        require(momChildrenCount<maxSpawnTimes,EXCEED_MAX_SPAWN_TIMES);
        require(dadChildrenCount<maxSpawnTimes,EXCEED_MAX_SPAWN_TIMES);
        require(tokenIdToHatched[momTokenId]&&tokenIdToHatched[dadTokenId],WRONG_PARAMETER);
        require(momTokenId!=dadTokenId,WRONG_PARAMETER);
        ELF memory _mom=ELFs[momTokenId];
        ELF memory _dad=ELFs[dadTokenId];
        if (!(fromChaos(_mom) && fromChaos(_dad))){
            require(_mom.mom!=dadTokenId,CLOSE_BREEDING);
            require(_mom.dad!=dadTokenId,CLOSE_BREEDING);
            require(_dad.mom!=momTokenId,CLOSE_BREEDING);
            require(_dad.dad!=momTokenId,CLOSE_BREEDING);
        }
        if (!fromChaos(_mom) && !fromChaos(_dad)){
            require(_mom.mom!=_dad.mom,CLOSE_BREEDING);
            require(_mom.mom!=_dad.dad,CLOSE_BREEDING);
            require(_mom.dad!=_dad.mom,CLOSE_BREEDING);
            require(_mom.dad!=_dad.dad,CLOSE_BREEDING);
        } 
        uint256 seed=block.timestamp+dadChildrenCount+momChildrenCount;
        uint256 gene=ISpawnContract(SpawnContractAddress).spawnEgg(seed,_mom.gene,_dad.gene,momChildrenCount,dadChildrenCount,msg.sender,fromChaos(_mom),fromChaos(_dad));
        ELF memory _ELF=ELF({
            label:0,
            dad:dadTokenId,
            mom:momTokenId,
            gene:gene,
            bornAt:seed+432000
        });
        tokenId=ELFs.length;
        ELFs.push(_ELF);
        _addTo(msg.sender,tokenId);
        tokenIdToChildren[momTokenId].push(tokenId);
        tokenIdToChildren[dadTokenId].push(tokenId);
        emit Transfer(address(0),msg.sender,tokenId);
    }

    /// @dev Hatch an egg.
    function hatchELF(uint256 tokenId) external whenNotPaused{
        ELF memory _ELF=ELFs[tokenId];
        require(!tokenIdToHatched[tokenId],HATCHED);
        require(msg.sender==ownerOf(tokenId),NO_PERMISSION);
        require(block.timestamp>=_ELF.bornAt,NOT_MATURE);
        tokenIdToHatched[tokenId]=true;
    }

    /// @dev Whether the given ELF is from chaos.
    function fromChaos(ELF memory _ELF) internal pure returns(bool){
        return _ELF.mom==0;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","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":"_time","type":"uint256"}],"name":"CapsuleContractChanged","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":"_time","type":"uint256"}],"name":"SpawnContractChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"SpawnContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"capsuleContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"capsuleCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"triple","type":"bool"}],"name":"capsuleMachine","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"addr","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"changeCapsuleContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"changeSpawnContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"addr","type":"address"}],"name":"changeSuperAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"gainELF","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"gainGenes","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"gainOwnedTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"hatchELF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isHatched","outputs":[{"internalType":"bool","name":"res","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSpawnTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"res","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"addr","type":"address"}],"name":"setTokenToUsable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_url","type":"string"}],"name":"setURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"momTokenId","type":"uint256"},{"internalType":"uint256","name":"dadTokenId","type":"uint256"}],"name":"spawnEgg","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"usableTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"userOfCoinBTo","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6001805460ff60a01b1916905560c0604052600c60808190526b7777772e726f652e636f6d2f60a01b60a09081526200003c9160029190620001a0565b503480156200004a57600080fd5b5060008054336001600160a01b031991821681178355600180549092161781556040805160a0810182526103098152602080820185815292820185815260608301868152426080850190815260038054808901825590895294517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b60059096029586015594517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c85015590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d840155517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e83015591517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85f9091015591805260049091527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec805460ff1916909117905562000283565b828054620001ae9062000246565b90600052602060002090601f016020900481019282620001d257600085556200021d565b82601f10620001ed57805160ff19168380011785556200021d565b828001600101855582156200021d579182015b828111156200021d57825182559160200191906001019062000200565b506200022b9291506200022f565b5090565b5b808211156200022b576000815560010162000230565b600181811c908216806200025b57607f821691505b602082108114156200027d57634e487b7160e01b600052602260045260246000fd5b50919050565b6140c880620002936000396000f3fe60806040526004361061021a5760003560e01c80638456cb5911610123578063bcd193b3116100ab578063d6fe1e2f1161006f578063d6fe1e2f1461063b578063da76d5cd1461065b578063e985e9c51461067b578063ed62e452146106c4578063f8fe3714146106f65761021a565b8063bcd193b31461059b578063c87b56dd146105bb578063ccf3fbb3146105db578063ced3e3f1146105fb578063d3f673301461061b5761021a565b80639b3b6197116100f25780639b3b6197146104fa5780639bbdc8731461051a578063a22cb46514610548578063b2b783b714610568578063b88d4fde146105885761021a565b80638456cb59146104a55780638f283970146104ba57806395d89b4114610282578063962a5ff2146104da5761021a565b80633f4ba83a116101a657806351b421e21161017557806351b421e2146104115780635c975abb146104245780636352211e1461044557806370a082311461046557806377343408146104855761021a565b80633f4ba83a146103a957806341858c4b146103be57806342842e0e146103de57806346095c60146103f15761021a565b8063095ea7b3116101ed578063095ea7b3146102ef578063150b7a021461030457806323b872dd146103495780632ed7cbf91461035c57806335025eb4146103895761021a565b806301ffc9a71461022957806305dc03941461025e57806306fdde0314610282578063081812fc146102b7575b34801561022657600080fd5b50005b34801561023557600080fd5b50610249610244366004613b50565b61070b565b60405190151581526020015b60405180910390f35b34801561026a57600080fd5b50610274600f5481565b604051908152602001610255565b34801561028e57600080fd5b5060408051808201909152600381526222a62360e91b60208201525b6040516102559190613e69565b3480156102c357600080fd5b506102d76102d2366004613c14565b610778565b6040516001600160a01b039091168152602001610255565b6103026102fd3660046139da565b6107a0565b005b34801561031057600080fd5b5061033061031f36600461390d565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610255565b6103026103573660046138cd565b6108db565b34801561036857600080fd5b5061037c610377366004613856565b610b46565b6040516102559190613e56565b34801561039557600080fd5b506103026103a4366004613856565b610c01565b3480156103b557600080fd5b50610302610d06565b3480156103ca57600080fd5b506103026103d9366004613856565b610db3565b6103026103ec3660046138cd565b610e74565b3480156103fd57600080fd5b5061030261040c366004613c44565b610f96565b61030261041f366004613b36565b611087565b34801561043057600080fd5b5060015461024990600160a01b900460ff1681565b34801561045157600080fd5b506102d7610460366004613c14565b6114f0565b34801561047157600080fd5b50610274610480366004613856565b611553565b34801561049157600080fd5b506103026104a0366004613b88565b6115c0565b3480156104b157600080fd5b50610302611628565b3480156104c657600080fd5b506103026104d5366004613856565b6116d8565b3480156104e657600080fd5b506102746104f5366004613c68565b611799565b34801561050657600080fd5b50600e546102d7906001600160a01b031681565b34801561052657600080fd5b5061053a610535366004613a05565b612052565b604051610255929190613e31565b34801561055457600080fd5b506103026105633660046139a6565b6124b3565b34801561057457600080fd5b5061037c610583366004613a05565b612569565b61030261059636600461390d565b612719565b3480156105a757600080fd5b5061037c6105b6366004613856565b612822565b3480156105c757600080fd5b506102aa6105d6366004613c14565b612e59565b3480156105e757600080fd5b506103026105f6366004613856565b612fd1565b34801561060757600080fd5b50610249610616366004613c14565b6130d6565b34801561062757600080fd5b506010546102d7906001600160a01b031681565b34801561064757600080fd5b50610302610656366004613c14565b6130f8565b34801561066757600080fd5b50610302610676366004613c14565b6132c9565b34801561068757600080fd5b50610249610696366004613895565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b3480156106d057600080fd5b506106e46106df366004613c14565b613353565b60405161025596959493929190613e9c565b34801561070257600080fd5b50610274600781565b60006001600160e01b031982166301ffc9a760e01b148061073c57506001600160e01b031982166380ac58cd60e01b145b8061075757506001600160e01b03198216630a85bd0160e11b145b8061077257506001600160e01b03198216635b5e139f60e01b145b92915050565b6000610783826114f0565b50506000908152600960205260409020546001600160a01b031690565b6001546040805180820190915260068152651c185d5cd95960d21b602082015290600160a01b900460ff16156107f25760405162461bcd60e51b81526004016107e99190613e69565b60405180910390fd5b5060006107fe826114f0565b9050336001600160a01b038216148061083a57506001600160a01b0381166000908152600a6020908152604080832033845290915290205460ff165b6040518060400160405280600d81526020016c3737903832b936b4b9b9b4b7b760991b8152509061087e5760405162461bcd60e51b81526004016107e99190613e69565b5060008281526009602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6001546040805180820190915260068152651c185d5cd95960d21b602082015290600160a01b900460ff16156109245760405162461bcd60e51b81526004016107e99190613e69565b506000610930826114f0565b9050336001600160a01b038216148061096c57506001600160a01b0381166000908152600a6020908152604080832033845290915290205460ff165b8061098d57506000828152600960205260409020546001600160a01b031633145b6040518060400160405280600d81526020016c3737903832b936b4b9b9b4b7b760991b815250906109d15760405162461bcd60e51b81526004016107e99190613e69565b50806001600160a01b0316846001600160a01b0316146040518060400160405280600f81526020016e3bb937b733903830b930b6b2ba32b960891b81525090610a2d5760405162461bcd60e51b81526004016107e99190613e69565b5060408051808201909152600f81526e696e76616c6964206164647265737360881b60208201526001600160a01b038416610a7b5760405162461bcd60e51b81526004016107e99190613e69565b50610a8684836134a0565b610a9083836135e6565b6000828152600960205260409020546001600160a01b031615610aff5760008281526009602052604080822080546001600160a01b0319169055518391906001600160a01b038716907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45b81836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b60408051808201909152600f81526e696e76616c6964206164647265737360881b60208201526060906001600160a01b038316610b965760405162461bcd60e51b81526004016107e99190613e69565b506001600160a01b03821660009081526008602090815260409182902080548351818402810184019094528084529091830182828015610bf557602002820191906000526020600020905b815481526020019060010190808311610be1575b50505050509050919050565b60005460408051808201909152600d81526c3737903832b936b4b9b9b4b7b760991b6020820152906001600160a01b03163314610c515760405162461bcd60e51b81526004016107e99190613e69565b5060408051808201909152600f81526e696e76616c6964206164647265737360881b60208201526001600160a01b038216610c9f5760405162461bcd60e51b81526004016107e99190613e69565b50600e546040514281526001600160a01b038381169216907f2cdc7beeffb8d8d7142dab79535fb5af62a52e2a4d5ad26fbc67bf6326ae29129060200160405180910390a3600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60005460408051808201909152600d81526c3737903832b936b4b9b9b4b7b760991b6020820152906001600160a01b03163314610d565760405162461bcd60e51b81526004016107e99190613e69565b5060015460408051808201909152600a8152691b9bdd081c185d5cd95960b21b602082015290600160a01b900460ff16610da35760405162461bcd60e51b81526004016107e99190613e69565b506001805460ff60a01b19169055565b60005460408051808201909152600d81526c3737903832b936b4b9b9b4b7b760991b6020820152906001600160a01b03163314610e035760405162461bcd60e51b81526004016107e99190613e69565b5060408051808201909152600f81526e696e76616c6964206164647265737360881b60208201526001600160a01b038216610e515760405162461bcd60e51b81526004016107e99190613e69565b50600080546001600160a01b0319166001600160a01b0392909216919091179055565b610e7f8383836108db565b610e91826001600160a01b031661363d565b15610f9157604051630a85bd0160e11b81523360048201526001600160a01b0384811660248301526044820183905260806064830152600060848301819052919084169063150b7a029060a401602060405180830381600087803b158015610ef857600080fd5b505af1158015610f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f309190613b6c565b60408051808201909152601381527218d85b881b9bdd081c9958d95a5d9948139195606a1b60208201529091506001600160e01b03198216630a85bd0160e11b14610f8e5760405162461bcd60e51b81526004016107e99190613e69565b50505b505050565b610f9f826114f0565b6001600160a01b0316336001600160a01b0316148015610fc35750610fc33361363d565b6040518060400160405280600d81526020016c3737903832b936b4b9b9b4b7b760991b815250906110075760405162461bcd60e51b81526004016107e99190613e69565b506000828152600c60205260409020546001600160a01b03161561102e5761102e82613679565b6000828152600c6020908152604080832080546001600160a01b039095166001600160a01b031990951685179055928252600b8082528383208054868552600d8452948420859055908252600184018155825290200155565b6001546040805180820190915260068152651c185d5cd95960d21b602082015290600160a01b900460ff16156110d05760405162461bcd60e51b81526004016107e99190613e69565b50600181156110dd575060035b80600f60008282546110ef9190613f2c565b9091555050600f5461138810156111415760405162461bcd60e51b815260206004820152601660248201527518d85c1cdd5b19481b1a5b5a5d08195e18d95959195960521b60448201526064016107e9565b600e546040805163330227bf60e01b815281516001600160a01b0390931692600092849263330227bf9260048083019392829003018186803b15801561118657600080fd5b505afa15801561119a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111be9190613c89565b5090506111cb8382613f58565b3410156040518060400160405280601081526020016f0dadedccaf240dcdee840cadcdeeaced60831b815250906112155760405162461bcd60e51b81526004016107e99190613e69565b50600080846001600160401b0381111561123f57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611268578160200160208202803683370190505b50604051630b71abb160e01b815233600482015287151560248201529091506001600160a01b03851690630b71abb190604401600060405180830381600087803b1580156112b557600080fd5b505af11580156112c9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112f19190810190613a9c565b9250905060005b858110156114945760006040518060a00160405280858152602001600081526020016000815260200184848151811061134157634e487b7160e01b600052603260045260246000fd5b60200260200101518152602001426206978061135d9190613f2c565b90526003549091506113709033906135e6565b60035460405133906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46003805460018101825560009190915281517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b60059092029182015560208201517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c82015560408201517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d82015560608201517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e8201556080909101517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85f909101558061148c81613ff3565b9150506112f8565b5061149f8584613f58565b3411156114e857336108fc6114b48786613f58565b6114be9034613f77565b6040518115909202916000818181858888f193505050501580156114e6573d6000803e3d6000fd5b505b505050505050565b600081815260066020908152604091829020548251808401909352600b83526a1a5b9d985b1a590813919560aa1b918301919091526001600160a01b0316908161154d5760405162461bcd60e51b81526004016107e99190613e69565b50919050565b60408051808201909152600f81526e696e76616c6964206164647265737360881b60208201526000906001600160a01b0383166115a35760405162461bcd60e51b81526004016107e99190613e69565b50506001600160a01b031660009081526008602052604090205490565b60015460408051808201909152600d81526c3737903832b936b4b9b9b4b7b760991b6020820152906001600160a01b031633146116105760405162461bcd60e51b81526004016107e99190613e69565b5080516116249060029060208401906137a8565b5050565b60005460408051808201909152600d81526c3737903832b936b4b9b9b4b7b760991b6020820152906001600160a01b031633146116785760405162461bcd60e51b81526004016107e99190613e69565b506001546040805180820190915260068152651c185d5cd95960d21b602082015290600160a01b900460ff16156116c25760405162461bcd60e51b81526004016107e99190613e69565b506001805460ff60a01b1916600160a01b179055565b60005460408051808201909152600d81526c3737903832b936b4b9b9b4b7b760991b6020820152906001600160a01b031633146117285760405162461bcd60e51b81526004016107e99190613e69565b5060408051808201909152600f81526e696e76616c6964206164647265737360881b60208201526001600160a01b0382166117765760405162461bcd60e51b81526004016107e99190613e69565b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546040805180820190915260068152651c185d5cd95960d21b6020820152600091600160a01b900460ff16156117e45760405162461bcd60e51b81526004016107e99190613e69565b506117ee836114f0565b6001600160a01b0316336001600160a01b0316146040518060400160405280600d81526020016c3737903832b936b4b9b9b4b7b760991b815250906118465760405162461bcd60e51b81526004016107e99190613e69565b50611850826114f0565b6001600160a01b0316336001600160a01b0316146040518060400160405280600d81526020016c3737903832b936b4b9b9b4b7b760991b815250906118a85760405162461bcd60e51b81526004016107e99190613e69565b5060008281526005602090815260408083205486845292819020548151808301909252601a82527f657863656564206d6178696d756d2073706177616e2074696d6500000000000092820192909252600782106119185760405162461bcd60e51b81526004016107e99190613e69565b5060408051808201909152601a81527f657863656564206d6178696d756d2073706177616e2074696d6500000000000060208201526007831061196e5760405162461bcd60e51b81526004016107e99190613e69565b5060008581526004602052604090205460ff16801561199b575060008481526004602052604090205460ff165b6040518060400160405280600f81526020016e3bb937b733903830b930b6b2ba32b960891b815250906119e15760405162461bcd60e51b81526004016107e99190613e69565b5060408051808201909152600f81526e3bb937b733903830b930b6b2ba32b960891b602082015285851415611a295760405162461bcd60e51b81526004016107e99190613e69565b50600060038681548110611a4d57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050600060038681548110611abd57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050611b1682604001511590565b8015611b2457506040810151155b611c59576040808301518151808301909252600e82526d636c6f7365206272656564696e6760901b6020830152871415611b715760405162461bcd60e51b81526004016107e99190613e69565b5085826020015114156040518060400160405280600e81526020016d636c6f7365206272656564696e6760901b81525090611bbf5760405162461bcd60e51b81526004016107e99190613e69565b506040808201518151808301909252600e82526d636c6f7365206272656564696e6760901b6020830152881415611c095760405162461bcd60e51b81526004016107e99190613e69565b5086816020015114156040518060400160405280600e81526020016d636c6f7365206272656564696e6760901b81525090611c575760405162461bcd60e51b81526004016107e99190613e69565b505b604082015115158015611c6f5750604081015115155b15611db857604080820151838201518251808401909352600e83526d636c6f7365206272656564696e6760901b60208401521415611cc05760405162461bcd60e51b81526004016107e99190613e69565b508060200151826040015114156040518060400160405280600e81526020016d636c6f7365206272656564696e6760901b81525090611d125760405162461bcd60e51b81526004016107e99190613e69565b508060400151826020015114156040518060400160405280600e81526020016d636c6f7365206272656564696e6760901b81525090611d645760405162461bcd60e51b81526004016107e99190613e69565b508060200151826020015114156040518060400160405280600e81526020016d636c6f7365206272656564696e6760901b81525090611db65760405162461bcd60e51b81526004016107e99190613e69565b505b600083611dc58642613f2c565b611dcf9190613f2c565b601054606080860151908501519293506000926001600160a01b0390921691636ea911ce918591898b33611e058c604001511590565b60408c0151156040516001600160e01b031960e08b901b168152600481019890985260248801969096526044870194909452606486019290925260848501526001600160a01b031660a4840152151560c4830152151560e482015261010401602060405180830381600087803b158015611e7e57600080fd5b505af1158015611e92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb69190613c2c565b905060006040518060a00160405280600081526020018a81526020018b81526020018381526020018462069780611eed9190613f2c565b9052600380546001810182556000919091528151600582027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b81019190915560208301517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c82015560408301517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d82015560608301517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e82015560808301517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85f9091015598509050611fdf33896135e6565b60008a8152600560209081526040808320805460018181018355918552838520018c90558c84528184208054918201815584529183209091018a905551899133917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050505050505092915050565b805160609081906000816001600160401b0381111561208157634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156120aa578160200160208202803683370190505b5090506000826001600160401b038111156120d557634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156120fe578160200160208202803683370190505b50905060008060005b858110156124a45788818151811061212f57634e487b7160e01b600052603260045260246000fd5b60200260200101519150612142826114f0565b60008381526004602052604090205490935060ff161561240d5761216e836001600160a01b031661363d565b1561238657604051600162d409b160e01b031981523060048201526024810183905283906001600160a01b0382169063ff2bf64f9060440160206040518083038186803b1580156121be57600080fd5b505afa9250505080156121ee575060408051601f3d908101601f191682019092526121eb91810190613879565b60015b61223957600086838151811061221457634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505061227c565b8087848151811061225a57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050505b604051638f89451360e01b8152306004820152602481018490526001600160a01b03821690638f8945139060440160206040518083038186803b1580156122c257600080fd5b505afa9250505080156122f2575060408051601f3d908101601f191682019092526122ef91810190613879565b60015b61233d57600085838151811061231857634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050612380565b8086848151811061235e57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050505b50612492565b828582815181106123a757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050828482815181106123e857634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050612492565b600085828151811061242f57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050600084828151811061247157634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250505b8061249c81613ff3565b915050612107565b50929791965090945050505050565b6001546040805180820190915260068152651c185d5cd95960d21b602082015290600160a01b900460ff16156124fc5760405162461bcd60e51b81526004016107e99190613e69565b50336000818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b80516060906000816001600160401b0381111561259657634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156125bf578160200160208202803683370190505b50905060005b82811015612711576125fd8582815181106125f057634e487b7160e01b600052603260045260246000fd5b60200260200101516130d6565b156126d0576000600386838151811061262657634e487b7160e01b600052603260045260246000fd5b60200260200101518154811061264c57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050905080606001518383815181106126be57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050506126ff565b60008282815181106126f257634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b8061270981613ff3565b9150506125c5565b509392505050565b6127248585856108db565b612736846001600160a01b031661363d565b15610f8e57604051630a85bd0160e11b81526000906001600160a01b0386169063150b7a02906127729033908a90899089908990600401613de0565b602060405180830381600087803b15801561278c57600080fd5b505af11580156127a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127c49190613b6c565b60408051808201909152601381527218d85b881b9bdd081c9958d95a5d9948139195606a1b60208201529091506001600160e01b03198216630a85bd0160e11b146114e65760405162461bcd60e51b81526004016107e99190613e69565b60408051808201909152600f81526e696e76616c6964206164647265737360881b60208201526060906001600160a01b0383166128725760405162461bcd60e51b81526004016107e99190613e69565b506001600160a01b0382166000908152600860209081526040808320805482518185028101850190935280835291929091908301828280156128d357602002820191906000526020600020905b8154815260200190600101908083116128bf575b505050506001600160a01b0385166000908152600b60209081526040808320805482518185028101850190935280835295965092949093509083018282801561293b57602002820191906000526020600020905b815481526020019060010190808311612927575b505085518451949550939250600091508390506001600160401b0381111561297357634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561299c578160200160208202803683370190505b5090506000826001600160401b038111156129c757634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156129f0578160200160208202803683370190505b50905060008060005b86811015612abc57600460008a8381518110612a2557634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182528101919091526040016000205460ff1615612aaa5782612a5281613ff3565b935050888181518110612a7557634e487b7160e01b600052603260045260246000fd5b6020026020010151858281518110612a9d57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b80612ab481613ff3565b9150506129f9565b5060005b85811015612c8f5760046000898381518110612aec57634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182528101919091526040016000205460ff1615612c7d576000612b41898381518110612b3457634e487b7160e01b600052603260045260246000fd5b60200260200101516114f0565b9050806001600160a01b031663ff2bf64f308b8581518110612b7357634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401612bac9291906001600160a01b03929092168252602082015260400190565b60206040518083038186803b158015612bc457600080fd5b505afa925050508015612bf4575060408051601f3d908101601f19168201909252612bf191810190613879565b60015b612bfd57612c7b565b8c6001600160a01b0316816001600160a01b03161415612c795783612c2181613ff3565b945050898381518110612c4457634e487b7160e01b600052603260045260246000fd5b6020026020010151868481518110612c6c57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b505b505b80612c8781613ff3565b915050612ac0565b50600080612c9d8385613f2c565b6001600160401b03811115612cc257634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612ceb578160200160208202803683370190505b50905060005b88811015612d9b57868181518110612d1957634e487b7160e01b600052603260045260246000fd5b6020026020010151600014612d8957868181518110612d4857634e487b7160e01b600052603260045260246000fd5b6020026020010151828481518110612d7057634e487b7160e01b600052603260045260246000fd5b602090810291909101015282612d8581613ff3565b9350505b80612d9381613ff3565b915050612cf1565b5060005b87811015612e4957858181518110612dc757634e487b7160e01b600052603260045260246000fd5b6020026020010151600014612e3757858181518110612df657634e487b7160e01b600052603260045260246000fd5b6020026020010151828481518110612e1e57634e487b7160e01b600052603260045260246000fd5b602090810291909101015282612e3381613ff3565b9350505b80612e4181613ff3565b915050612d9f565b509b9a5050505050505050505050565b60035460609082108015612e6c57508115155b6040518060400160405280600b81526020016a1a5b9d985b1a590813919560aa1b81525090612eae5760405162461bcd60e51b81526004016107e99190613e69565b508160005b8115612ed95780612ec381613ff3565b9150612ed29050600a83613f44565b9150612eb3565b6000816001600160401b03811115612f0157634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f2b576020820181803683370190505b5090505b8415612fa457612f40600183613f77565b9150612f4d600a8661400e565b612f58906030613f2c565b60f81b818381518110612f7b57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612f9d600a86613f44565b9450612f2f565b600281604051602001612fb8929190613d3a565b6040516020818303038152906040529350505050919050565b60005460408051808201909152600d81526c3737903832b936b4b9b9b4b7b760991b6020820152906001600160a01b031633146130215760405162461bcd60e51b81526004016107e99190613e69565b5060408051808201909152600f81526e696e76616c6964206164647265737360881b60208201526001600160a01b03821661306f5760405162461bcd60e51b81526004016107e99190613e69565b506010546040514281526001600160a01b038381169216907f20fcc83ec3de5329943007221745d246cfc2b6f97492a88cbaa0f691216c5f6c9060200160405180910390a3601080546001600160a01b0319166001600160a01b0392909216919091179055565b60006130e1826114f0565b505060009081526004602052604090205460ff1690565b6001546040805180820190915260068152651c185d5cd95960d21b602082015290600160a01b900460ff16156131415760405162461bcd60e51b81526004016107e99190613e69565b5060006003828154811061316557634e487b7160e01b600052603260045260246000fd5b600091825260208083206040805160a081018252600590940290910180548452600181015484840152600281015484830152600381015460608501526004908101546080850152868552825292839020548351808501909452600b84526a1959d9c81a185d18da195960aa1b9184019190915290925060ff16156131fc5760405162461bcd60e51b81526004016107e99190613e69565b50613206826114f0565b6001600160a01b0316336001600160a01b0316146040518060400160405280600d81526020016c3737903832b936b4b9b9b4b7b760991b8152509061325e5760405162461bcd60e51b81526004016107e99190613e69565b5080608001514210156040518060400160405280600e81526020016d656767206e6f74206d617475726560901b815250906132ac5760405162461bcd60e51b81526004016107e99190613e69565b50506000908152600460205260409020805460ff19166001179055565b60005460408051808201909152600d81526c3737903832b936b4b9b9b4b7b760991b6020820152906001600160a01b031633146133195760405162461bcd60e51b81526004016107e99190613e69565b50600080546040516001600160a01b039091169183156108fc02918491818181858888f19350505050158015611624573d6000803e3d6000fd5b6000806000806000606060006003888154811061338057634e487b7160e01b600052603260045260246000fd5b600091825260208083206040805160a08101825260059094029091018054845260018101548484015260028101548483015260038101546060850181905260049182015460808601528d865292529092205490925060ff1661340f57600a61340279063917877cec0556b21269d695bdcbf7a87aa00000000000000083613f44565b61340c919061400e565b90505b816000015182602001518360400151838560800151600560008f81526020019081526020016000208080548060200260200160405190810160405280929190818152602001828054801561348257602002820191906000526020600020905b81548152602001906001019080831161346e575b50505050509050975097509750975097509750505091939550919395565b6001600160a01b038216600090815260086020526040812080549091906134c990600190613f77565b905060008282815481106134ed57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101548683526007808352604080852080546006865282872080546001600160a01b0319169055929094529284905581845291909220819055845491925090829085908390811061355957634e487b7160e01b600052603260045260246000fd5b90600052602060002001819055508380548061358557634e487b7160e01b600052603160045260246000fd5b600082815260208082208301600019908101839055909201909255868252600c905260409020546001600160a01b0316156114e8576135c385613679565b505050600091825250600c6020526040902080546001600160a01b031916905550565b600081815260066020908152604080832080546001600160a01b039096166001600160a01b031990961686179055938252600881528382208054848452600783529483208590556001850181558252902090910155565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906136715750808214155b949350505050565b6000818152600c6020908152604080832054600d8352818420546001600160a01b03909116808552600b90935290832080549293919291906136bc600184613f77565b815481106136da57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600b6000866001600160a01b03166001600160a01b03168152602001908152602001600020848154811061372c57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092556001600160a01b0386168152600b9091526040902080548061376f57634e487b7160e01b600052603160045260246000fd5b600082815260208082208301600019908101839055909201909255918152600d9091526040808220939093559384525082209190915550565b8280546137b490613fbe565b90600052602060002090601f0160209004810192826137d6576000855561381c565b82601f106137ef57805160ff191683800117855561381c565b8280016001018555821561381c579182015b8281111561381c578251825591602001919060010190613801565b5061382892915061382c565b5090565b5b80821115613828576000815560010161382d565b8035801515811461385157600080fd5b919050565b600060208284031215613867578081fd5b813561387281614064565b9392505050565b60006020828403121561388a578081fd5b815161387281614064565b600080604083850312156138a7578081fd5b82356138b281614064565b915060208301356138c281614064565b809150509250929050565b6000806000606084860312156138e1578081fd5b83356138ec81614064565b925060208401356138fc81614064565b929592945050506040919091013590565b600080600080600060808688031215613924578081fd5b853561392f81614064565b9450602086013561393f81614064565b93506040860135925060608601356001600160401b0380821115613961578283fd5b818801915088601f830112613974578283fd5b813581811115613982578384fd5b896020828501011115613993578384fd5b9699959850939650602001949392505050565b600080604083850312156139b8578182fd5b82356139c381614064565b91506139d160208401613841565b90509250929050565b600080604083850312156139ec578182fd5b82356139f781614064565b946020939093013593505050565b60006020808385031215613a17578182fd5b82356001600160401b03811115613a2c578283fd5b8301601f81018513613a3c578283fd5b8035613a4f613a4a82613f09565b613ed9565b80828252848201915084840188868560051b8701011115613a6e578687fd5b8694505b83851015613a90578035835260019490940193918501918501613a72565b50979650505050505050565b60008060408385031215613aae578182fd5b82516001600160401b03811115613ac3578283fd5b8301601f81018513613ad3578283fd5b80516020613ae3613a4a83613f09565b80838252828201915082850189848660051b8801011115613b02578788fd5b8795505b84861015613b24578051835260019590950194918301918301613b06565b50969091015195979596505050505050565b600060208284031215613b47578081fd5b61387282613841565b600060208284031215613b61578081fd5b81356138728161407c565b600060208284031215613b7d578081fd5b81516138728161407c565b60006020808385031215613b9a578182fd5b82356001600160401b0380821115613bb0578384fd5b818501915085601f830112613bc3578384fd5b813581811115613bd557613bd561404e565b613be7601f8201601f19168501613ed9565b91508082528684828501011115613bfc578485fd5b80848401858401378101909201929092529392505050565b600060208284031215613c25578081fd5b5035919050565b600060208284031215613c3d578081fd5b5051919050565b60008060408385031215613c56578182fd5b8235915060208301356138c281614064565b60008060408385031215613c7a578182fd5b50508035926020909101359150565b60008060408385031215613c9b578182fd5b505080516020909101519092909150565b6000815180845260208085019450808401835b83811015613ce45781516001600160a01b031687529582019590820190600101613cbf565b509495945050505050565b6000815180845260208085019450808401835b83811015613ce457815187529582019590820190600101613d02565b60008151613d30818560208601613f8e565b9290920192915050565b600080845482600182811c915080831680613d5657607f831692505b6020808410821415613d7657634e487b7160e01b87526022600452602487fd5b818015613d8a5760018114613d9b57613dc7565b60ff19861689528489019650613dc7565b60008b815260209020885b86811015613dbf5781548b820152908501908301613da6565b505084890196505b505050505050613dd78185613d1e565b95945050505050565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a084013781830160a090810191909152601f909201601f19160101949350505050565b604081526000613e446040830185613cac565b8281036020840152613dd78185613cac565b6020815260006138726020830184613cef565b6020815260008251806020840152613e88816040850160208701613f8e565b601f01601f19169190910160400192915050565b86815285602082015284604082015283606082015282608082015260c060a08201526000613ecd60c0830184613cef565b98975050505050505050565b604051601f8201601f191681016001600160401b0381118282101715613f0157613f0161404e565b604052919050565b60006001600160401b03821115613f2257613f2261404e565b5060051b60200190565b60008219821115613f3f57613f3f614022565b500190565b600082613f5357613f53614038565b500490565b6000816000190483118215151615613f7257613f72614022565b500290565b600082821015613f8957613f89614022565b500390565b60005b83811015613fa9578181015183820152602001613f91565b83811115613fb8576000848401525b50505050565b600181811c90821680613fd257607f821691505b6020821081141561154d57634e487b7160e01b600052602260045260246000fd5b600060001982141561400757614007614022565b5060010190565b60008261401d5761401d614038565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461407957600080fd5b50565b6001600160e01b03198116811461407957600080fdfea264697066735822122040c97a41f9a2d3ab5fe92798e5e972d8c276fd1f78c1c05961798d04e5d699d664736f6c63430008040033

Deployed ByteCode Sourcemap

29189:6457:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17338:310;;;;;;;;;;-1:-1:-1;17338:310:0;;;;;:::i;:::-;;:::i;:::-;;;13432:14:1;;13425:22;13407:41;;13395:2;13380:18;17338:310:0;;;;;;;;30271:27;;;;;;;;;;;;;;;;;;;14551:25:1;;;14539:2;14524:18;30271:27:0;14506:76:1;16032:99:0;;;;;;;;;;-1:-1:-1;16111:12:0;;;;;;;;;;;;-1:-1:-1;;;16111:12:0;;;;16032:99;;;;;;;:::i;26978:160::-;;;;;;;;;;-1:-1:-1;26978:160:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10686:32:1;;;10668:51;;10656:2;10641:18;26978:160:0;10623:102:1;26310:333:0;;;;;;:::i;:::-;;:::i;:::-;;17715:188;;;;;;;;;;-1:-1:-1;17715:188:0;;;;;:::i;:::-;-1:-1:-1;;;17715:188:0;;;;;;;;;;;-1:-1:-1;;;;;;13621:33:1;;;13603:52;;13591:2;13576:18;17715:188:0;13558:103:1;25581:674:0;;;;;;:::i;:::-;;:::i;20207:174::-;;;;;;;;;;-1:-1:-1;20207:174:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30440:249::-;;;;;;;;;;-1:-1:-1;30440:249:0;;;;;:::i;:::-;;:::i;14454:87::-;;;;;;;;;;;;;:::i;12795:166::-;;;;;;;;;;-1:-1:-1;12795:166:0;;;;;:::i;:::-;;:::i;25154:372::-;;;;;;:::i;:::-;;:::i;21625:456::-;;;;;;;;;;-1:-1:-1;21625:456:0;;;;;:::i;:::-;;:::i;30840:1134::-;;;;;;:::i;:::-;;:::i;13795:26::-;;;;;;;;;;-1:-1:-1;13795:26:0;;;;-1:-1:-1;;;13795:26:0;;;;;;24476:173;;;;;;;;;;-1:-1:-1;24476:173:0;;;;;:::i;:::-;;:::i;24240:181::-;;;;;;;;;;-1:-1:-1;24240:181:0;;;;;:::i;:::-;;:::i;15864:82::-;;;;;;;;;;-1:-1:-1;15864:82:0;;;;;:::i;:::-;;:::i;14278:87::-;;;;;;;;;;;;;:::i;13098:156::-;;;;;;;;;;-1:-1:-1;13098:156:0;;;;;:::i;:::-;;:::i;33083:2044::-;;;;;;;;;;-1:-1:-1;33083:2044:0;;;;;:::i;:::-;;:::i;30165:37::-;;;;;;;;;;-1:-1:-1;30165:37:0;;;;-1:-1:-1;;;;;30165:37:0;;;27452:1220;;;;;;;;;;-1:-1:-1;27452:1220:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;26698:225::-;;;;;;;;;;-1:-1:-1;26698:225:0;;;;;:::i;:::-;;:::i;28730:452::-;;;;;;;;;;-1:-1:-1;28730:452:0;;;;;:::i;:::-;;:::i;24704:395::-;;;;;;:::i;:::-;;:::i;22670:1515::-;;;;;;;;;;-1:-1:-1;22670:1515:0;;;;;:::i;:::-;;:::i;16584:591::-;;;;;;;;;;-1:-1:-1;16584:591:0;;;;;:::i;:::-;;:::i;32396:241::-;;;;;;;;;;-1:-1:-1;32396:241:0;;;;;:::i;:::-;;:::i;20005:143::-;;;;;;;;;;-1:-1:-1;20005:143:0;;;;;:::i;:::-;;:::i;32211:35::-;;;;;;;;;;-1:-1:-1;32211:35:0;;;;-1:-1:-1;;;;;32211:35:0;;;35163:321;;;;;;;;;;-1:-1:-1;35163:321:0;;;;;:::i;:::-;;:::i;13318:110::-;;;;;;;;;;-1:-1:-1;13318:110:0;;;;;:::i;:::-;;:::i;27193:159::-;;;;;;;;;;-1:-1:-1;27193:159:0;;;;;:::i;:::-;-1:-1:-1;;;;;27309:24:0;;;27286:4;27309:24;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;;;27193:159;17962:434;;;;;;;;;;-1:-1:-1;17962:434:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;32692:39::-;;;;;;;;;;;;32730:1;32692:39;;17338:310;17418:4;-1:-1:-1;;;;;;17443:41:0;;-1:-1:-1;;;17443:41:0;;17442:88;;-1:-1:-1;;;;;;;17488:41:0;;-1:-1:-1;;;17488:41:0;17442:88;:144;;;-1:-1:-1;;;;;;;17533:52:0;;-1:-1:-1;;;17533:52:0;17442:144;:197;;;-1:-1:-1;;;;;;;17589:49:0;;-1:-1:-1;;;17589:49:0;17442:197;17434:206;17338:310;-1:-1:-1;;17338:310:0:o;26978:160::-;27049:7;27068:17;27076:8;27068:7;:17::i;:::-;-1:-1:-1;;27103:27:0;;;;:17;:27;;;;;;-1:-1:-1;;;;;27103:27:0;;26978:160::o;26310:333::-;13950:6;;13957;;;;;;;;;;;;-1:-1:-1;;;13957:6:0;;;;;-1:-1:-1;;;13950:6:0;;;;13949:7;13941:23;;;;-1:-1:-1;;;13941:23:0;;;;;;;;:::i;:::-;;;;;;;;;;26414:14:::1;26429:17;26437:8;26429:7;:17::i;:::-;26414:32:::0;-1:-1:-1;26465:10:0::1;-1:-1:-1::0;;;;;26465:18:0;::::1;;::::0;:56:::1;;-1:-1:-1::0;;;;;;26485:24:0;::::1;;::::0;;;:16:::1;:24;::::0;;;;;;;26510:10:::1;26485:36:::0;;;;;;;;::::1;;26465:56;26522:13;;;;;;;;;;;;;-1:-1:-1::0;;;26522:13:0::1;;::::0;26457:79:::1;;;;;-1:-1:-1::0;;;26457:79:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;26547:27:0::1;::::0;;;:17:::1;:27;::::0;;;;;:37;;-1:-1:-1;;;;;;26547:37:0::1;-1:-1:-1::0;;;;;26547:37:0;;::::1;::::0;;::::1;::::0;;;26600:35;;26547:27;;26600:35;;::::1;::::0;::::1;::::0;::::1;13975:1;26310:333:::0;;:::o;25581:674::-;13950:6;;13957;;;;;;;;;;;;-1:-1:-1;;;13957:6:0;;;;;-1:-1:-1;;;13950:6:0;;;;13949:7;13941:23;;;;-1:-1:-1;;;13941:23:0;;;;;;;;:::i;:::-;;25697:14:::1;25712:17;25720:8;25712:7;:17::i;:::-;25697:32:::0;-1:-1:-1;25748:10:0::1;-1:-1:-1::0;;;;;25748:18:0;::::1;;::::0;:56:::1;;-1:-1:-1::0;;;;;;25768:24:0;::::1;;::::0;;;:16:::1;:24;::::0;;;;;;;25793:10:::1;25768:36:::0;;;;;;;;::::1;;25748:56;:97;;;-1:-1:-1::0;25818:27:0::1;::::0;;;:17:::1;:27;::::0;;;;;-1:-1:-1;;;;;25818:27:0::1;25806:10;:39;25748:97;25846:13;;;;;;;;;;;;;-1:-1:-1::0;;;25846:13:0::1;;::::0;25740:120:::1;;;;;-1:-1:-1::0;;;25740:120:0::1;;;;;;;;:::i;:::-;;25886:6;-1:-1:-1::0;;;;;25879:13:0::1;:5;-1:-1:-1::0;;;;;25879:13:0::1;;25893:15;;;;;;;;;;;;;-1:-1:-1::0;;;25893:15:0::1;;::::0;25871:38:::1;;;;;-1:-1:-1::0;;;25871:38:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;25944:15:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;25944:15:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;25928:15:0;::::1;25920:40;;;;-1:-1:-1::0;;;25920:40:0::1;;;;;;;;:::i;:::-;;25971:27;25983:5;25989:8;25971:11;:27::i;:::-;26009:20;26016:3;26020:8;26009:6;:20::i;:::-;26081:1;26044:27:::0;;;:17:::1;:27;::::0;;;;;-1:-1:-1;;;;;26044:27:0::1;:39:::0;26040:162:::1;;26106:27;::::0;;;:17:::1;:27;::::0;;;;;26099:34;;-1:-1:-1;;;;;;26099:34:0::1;::::0;;26153:37;26124:8;;26106:27;-1:-1:-1;;;;;26153:37:0;::::1;::::0;::::1;::::0;26106:27;;26153:37:::1;26040:162;26238:8;26233:3;-1:-1:-1::0;;;;;26217:30:0::1;26226:5;-1:-1:-1::0;;;;;26217:30:0::1;;;;;;;;;;;13975:1;25581:674:::0;;;:::o;20207:174::-;20321:15;;;;;;;;;;;;-1:-1:-1;;;20321:15:0;;;;20268:16;;-1:-1:-1;;;;;20304:16:0;;20296:41;;;;-1:-1:-1;;;20296:41:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;20355:17:0;;;;;;:11;:17;;;;;;;;;20348:25;;;;;;;;;;;;;;;;;20355:17;;20348:25;;20355:17;20348:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20207:174;;;:::o;30440:249::-;12438:10;;12449:13;;;;;;;;;;;;-1:-1:-1;;;12449:13:0;;;;;-1:-1:-1;;;;;12438:10:0;12426;:22;12418:45;;;;-1:-1:-1;;;12418:45:0;;;;;;;;:::i;:::-;-1:-1:-1;30544:15:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;30544:15:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;30527:16:0;::::1;30519:41;;;;-1:-1:-1::0;;;30519:41:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;30599:22:0::1;::::0;30576:67:::1;::::0;30627:15:::1;14551:25:1::0;;-1:-1:-1;;;;;30576:67:0;;::::1;::::0;30599:22:::1;::::0;30576:67:::1;::::0;14539:2:1;14524:18;30576:67:0::1;;;;;;;30654:22;:27:::0;;-1:-1:-1;;;;;;30654:27:0::1;-1:-1:-1::0;;;;;30654:27:0;;;::::1;::::0;;;::::1;::::0;;30440:249::o;14454:87::-;12438:10;;12449:13;;;;;;;;;;;;-1:-1:-1;;;12449:13:0;;;;;-1:-1:-1;;;;;12438:10:0;12426;:22;12418:45;;;;-1:-1:-1;;;12418:45:0;;;;;;;;:::i;:::-;-1:-1:-1;14104:6:0::1;::::0;14111:10:::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;14111:10:0::1;::::0;::::1;::::0;;-1:-1:-1;;;14104:6:0;::::1;;;14096:26;;;;-1:-1:-1::0;;;14096:26:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;14519:6:0::2;:14:::0;;-1:-1:-1;;;;14519:14:0::2;::::0;;14454:87::o;12795:166::-;12438:10;;12449:13;;;;;;;;;;;;-1:-1:-1;;;12449:13:0;;;;;-1:-1:-1;;;;;12438:10:0;12426;:22;12418:45;;;;-1:-1:-1;;;12418:45:0;;;;;;;;:::i;:::-;-1:-1:-1;12911:15:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;12911:15:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;12885:25:0;::::1;12877:50;;;;-1:-1:-1::0;;;12877:50:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;12938:10:0::1;:15:::0;;-1:-1:-1;;;;;;12938:15:0::1;-1:-1:-1::0;;;;;12938:15:0;;;::::1;::::0;;;::::1;::::0;;12795:166::o;25154:372::-;25262:34;25275:5;25282:3;25287:8;25262:12;:34::i;:::-;25311:16;:3;-1:-1:-1;;;;;25311:14:0;;:16::i;:::-;25307:212;;;25357:75;;-1:-1:-1;;;25357:75:0;;25400:10;25357:75;;;11705:34:1;-1:-1:-1;;;;;11775:15:1;;;11755:18;;;11748:43;11807:18;;;11800:34;;;11870:3;11850:18;;;11843:31;25343:13:0;11890:19:1;;;11883:33;;;25343:13:0;25357:42;;;;;;11933:19:1;;25357:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25490:16;;;;;;;;;;;;-1:-1:-1;;;25490:16:0;;;;25343:89;;-1:-1:-1;;;;;;;25455:34:0;;-1:-1:-1;;;25455:34:0;25447:60;;;;-1:-1:-1;;;25447:60:0;;;;;;;;:::i;:::-;;25307:212;;25154:372;;;:::o;21625:456::-;21721:16;21729:7;21721;:16::i;:::-;-1:-1:-1;;;;;21709:28:0;:10;-1:-1:-1;;;;;21709:28:0;;:55;;;;-1:-1:-1;21741:23:0;:10;:21;:23::i;:::-;21765:13;;;;;;;;;;;;;-1:-1:-1;;;21765:13:0;;;21701:78;;;;;-1:-1:-1;;;21701:78:0;;;;;;;;:::i;:::-;-1:-1:-1;21826:1:0;21794:22;;;:13;:22;;;;;;-1:-1:-1;;;;;21794:22:0;:34;21790:106;;21844:40;21876:7;21844:31;:40::i;:::-;21906:22;;;;:13;:22;;;;;;;;:27;;-1:-1:-1;;;;;21906:27:0;;;-1:-1:-1;;;;;;21906:27:0;;;;;;;21987;;;:21;:27;;;;;;:34;;21944:42;;;:33;:42;;;;;:77;;;22032:27;;;21906;22032:41;;;;;;;;;;21625:456::o;30840:1134::-;13950:6;;13957;;;;;;;;;;;;-1:-1:-1;;;13957:6:0;;;;;-1:-1:-1;;;13950:6:0;;;;13949:7;13941:23;;;;-1:-1:-1;;;13941:23:0;;;;;;;;:::i;:::-;-1:-1:-1;30933:1:0::1;30945:45:::0;::::1;;;-1:-1:-1::0;30977:1:0::1;30945:45;31014:5;31000:12;;:19;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;31038:12:0::1;::::0;31052:4:::1;-1:-1:-1::0;31038:18:0::1;31030:52;;;::::0;-1:-1:-1;;;31030:52:0;;14256:2:1;31030:52:0::1;::::0;::::1;14238:21:1::0;14295:2;14275:18;;;14268:30;-1:-1:-1;;;14314:18:1;;;14307:52;14376:18;;31030:52:0::1;14228:172:1::0;31030:52:0::1;31151:22;::::0;31202:38:::1;::::0;;-1:-1:-1;;;31202:38:0;;;;-1:-1:-1;;;;;31151:22:0;;::::1;::::0;31093:40:::1;::::0;31151:22;;31202:36:::1;::::0;:38:::1;::::0;;::::1;::::0;;;;;;;31151:22;31202:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;31185:55:0;-1:-1:-1;31270:11:0::1;31276:5:::0;31185:55;31270:11:::1;:::i;:::-;31259:9;:22;;31282:11;;;;;;;;;;;;;-1:-1:-1::0;;;31282:11:0::1;;::::0;31251:43:::1;;;;;-1:-1:-1::0;;;31251:43:0::1;;;;;;;;:::i;:::-;;31305:13;31329:22:::0;31368:5:::1;-1:-1:-1::0;;;;;31354:20:0::1;;;;;-1:-1:-1::0;;;31354:20:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;31354:20:0::1;-1:-1:-1::0;31399:56:0::1;::::0;-1:-1:-1;;;31399:56:0;;31437:10:::1;31399:56;::::0;::::1;12131:51:1::0;12225:14;;12218:22;12198:18;;;12191:50;31329:45:0;;-1:-1:-1;;;;;;31399:37:0;::::1;::::0;::::1;::::0;12104:18:1;;31399:56:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;31399:56:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;31385:70:::0;-1:-1:-1;31385:70:0;-1:-1:-1;31470:9:0::1;31466:387;31484:5;31482:1;:7;31466:387;;;31509:15;31525:178;;;;;;;;31554:5;31525:178;;;;31582:1;31525:178;;;;31606:1;31525:178;;;;31631:5;31637:1;31631:8;;;;;;-1:-1:-1::0;;;31631:8:0::1;;;;;;;;;;;;;;;31525:178;;;;31665:15;31681:6;31665:22;;;;:::i;:::-;31525:178:::0;;31736:4:::1;:11:::0;31509:194;;-1:-1:-1;31718:30:0::1;::::0;31725:10:::1;::::0;31718:6:::1;:30::i;:::-;31799:4;:11:::0;31768:43:::1;::::0;31788:10:::1;::::0;31785:1:::1;::::0;31768:43:::1;::::0;31785:1;;31768:43:::1;31826:4;:15:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;31826:15:0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;31490:3;::::1;::::0;::::1;:::i;:::-;;;;31466:387;;;-1:-1:-1::0;31877:11:0::1;31883:5:::0;31877;:11:::1;:::i;:::-;31867:9;:21;31863:104;;;31912:10;31904:51;31943:11;31949:5:::0;31943;:11:::1;:::i;:::-;31933:21;::::0;:9:::1;:21;:::i;:::-;31904:51;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;31863:104;13975:1;;;;;30840:1134:::0;:::o;24476:173::-;24541:11;24568:24;;;:14;:24;;;;;;;;;;24627:13;;;;;;;;;;;-1:-1:-1;;;24627:13:0;;;;;;;-1:-1:-1;;;;;24568:24:0;;24611:15;24603:38;;;;-1:-1:-1;;;24603:38:0;;;;;;;;:::i;:::-;;24476:173;;;:::o;24240:181::-;24353:15;;;;;;;;;;;;-1:-1:-1;;;24353:15:0;;;;24307:7;;-1:-1:-1;;;;;24334:18:0;;24326:43;;;;-1:-1:-1;;;24326:43:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;24387:19:0;;;;;:11;:19;;;;;:26;;24240:181::o;15864:82::-;12608:5;;12614:13;;;;;;;;;;;;-1:-1:-1;;;12614:13:0;;;;;-1:-1:-1;;;;;12608:5:0;12596:10;:17;12588:40;;;;-1:-1:-1;;;12588:40:0;;;;;;;;:::i;:::-;-1:-1:-1;15930:8:0;;::::1;::::0;:3:::1;::::0;:8:::1;::::0;::::1;::::0;::::1;:::i;:::-;;15864:82:::0;:::o;14278:87::-;12438:10;;12449:13;;;;;;;;;;;;-1:-1:-1;;;12449:13:0;;;;;-1:-1:-1;;;;;12438:10:0;12426;:22;12418:45;;;;-1:-1:-1;;;12418:45:0;;;;;;;;:::i;:::-;-1:-1:-1;13950:6:0::1;::::0;13957::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;13957:6:0::1;::::0;::::1;::::0;;-1:-1:-1;;;13950:6:0;::::1;;;13949:7;13941:23;;;;-1:-1:-1::0;;;13941:23:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;14353:4:0::2;14344:13:::0;;-1:-1:-1;;;;14344:13:0::2;-1:-1:-1::0;;;14344:13:0::2;::::0;;14278:87::o;13098:156::-;12438:10;;12449:13;;;;;;;;;;;;-1:-1:-1;;;12449:13:0;;;;;-1:-1:-1;;;;;12438:10:0;12426;:22;12418:45;;;;-1:-1:-1;;;12418:45:0;;;;;;;;:::i;:::-;-1:-1:-1;13209:15:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;13209:15:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;13183:25:0;::::1;13175:50;;;;-1:-1:-1::0;;;13175:50:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;13236:5:0::1;:10:::0;;-1:-1:-1;;;;;;13236:10:0::1;-1:-1:-1::0;;;;;13236:10:0;;;::::1;::::0;;;::::1;::::0;;13098:156::o;33083:2044::-;13950:6;;13957;;;;;;;;;;;;-1:-1:-1;;;13957:6:0;;;;-1:-1:-1;;;;;13950:6:0;;;;13949:7;13941:23;;;;-1:-1:-1;;;13941:23:0;;;;;;;;:::i;:::-;;33219:19:::1;33227:10;33219:7;:19::i;:::-;-1:-1:-1::0;;;;;33207:31:0::1;:10;-1:-1:-1::0;;;;;33207:31:0::1;;33239:13;;;;;;;;;;;;;-1:-1:-1::0;;;33239:13:0::1;;::::0;33199:54:::1;;;;;-1:-1:-1::0;;;33199:54:0::1;;;;;;;;:::i;:::-;;33284:19;33292:10;33284:7;:19::i;:::-;-1:-1:-1::0;;;;;33272:31:0::1;:10;-1:-1:-1::0;;;;;33272:31:0::1;;33304:13;;;;;;;;;;;;;-1:-1:-1::0;;;33304:13:0::1;;::::0;33264:54:::1;;;;;-1:-1:-1::0;;;33264:54:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;33329:24:0::1;33354:29:::0;;;:17:::1;:29;::::0;;;;;;;:36;33426:29;;;;;;;:36;33512:22;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;32730:1:::1;33481:30:::0;::::1;33473:62;;;;-1:-1:-1::0;;;33473:62:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;33585:22:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;;::::0;::::1;::::0;32730:1:::1;33554:30:::0;::::1;33546:62;;;;-1:-1:-1::0;;;33546:62:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;33627:28:0::1;::::0;;;:16:::1;:28;::::0;;;;;::::1;;:58:::0;::::1;;;-1:-1:-1::0;33657:28:0::1;::::0;;;:16:::1;:28;::::0;;;;;::::1;;33627:58;33686:15;;;;;;;;;;;;;-1:-1:-1::0;;;33686:15:0::1;;::::0;33619:83:::1;;;;;-1:-1:-1::0;;;33619:83:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;33744:15:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;33744:15:0::1;::::0;::::1;::::0;33721:22;;::::1;;33713:47;;;;-1:-1:-1::0;;;33713:47:0::1;;;;;;;;:::i;:::-;;33771:15;33787:4;33792:10;33787:16;;;;;;-1:-1:-1::0;;;33787:16:0::1;;;;;;;;;;;;;;;;;;;33771:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;33814:15;33830:4;33835:10;33830:16;;;;;;-1:-1:-1::0;;;33830:16:0::1;;;;;;;;;;;;;;;;;;;33814:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;33863:15;33873:4;35624:8:::0;;;:11;;35543:100;33863:15:::1;:34;;;;-1:-1:-1::0;35624:8:0;;;;:11;33882:15:::1;33857:290;;33922:8;::::0;;::::1;::::0;33943:14;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;33943:14:0::1;::::0;::::1;::::0;33922:20;::::1;;33914:44;;;;-1:-1:-1::0;;;33914:44:0::1;;;;;;;;:::i;:::-;;33991:10;33981:4;:8;;;:20;;34002:14;;;;;;;;;;;;;-1:-1:-1::0;;;34002:14:0::1;;::::0;33973:44:::1;;;;;-1:-1:-1::0;;;33973:44:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;34040:8:0::1;::::0;;::::1;::::0;34061:14;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;34061:14:0::1;::::0;::::1;::::0;34040:20;::::1;;34032:44;;;;-1:-1:-1::0;;;34032:44:0::1;;;;;;;;:::i;:::-;;34109:10;34099:4;:8;;;:20;;34120:14;;;;;;;;;;;;;-1:-1:-1::0;;;34120:14:0::1;;::::0;34091:44:::1;;;;;-1:-1:-1::0;;;34091:44:0::1;;;;;;;;:::i;:::-;;33857:290;35624:8:::0;;;;:11;34161:16:::1;:36;;;;-1:-1:-1::0;35624:8:0;;;;:11;34181:16:::1;34161:36;34157:281;;;34231:8;::::0;;::::1;::::0;34221;;::::1;::::0;34240:14;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;34240:14:0::1;::::0;::::1;::::0;34221:18:::1;;34213:42;;;;-1:-1:-1::0;;;34213:42:0::1;;;;;;;;:::i;:::-;;34288:4;:8;;;34278:4;:8;;;:18;;34297:14;;;;;;;;;;;;;-1:-1:-1::0;;;34297:14:0::1;;::::0;34270:42:::1;;;;;-1:-1:-1::0;;;34270:42:0::1;;;;;;;;:::i;:::-;;34345:4;:8;;;34335:4;:8;;;:18;;34354:14;;;;;;;;;;;;;-1:-1:-1::0;;;34354:14:0::1;;::::0;34327:42:::1;;;;;-1:-1:-1::0;;;34327:42:0::1;;;;;;;;:::i;:::-;;34402:4;:8;;;34392:4;:8;;;:18;;34411:14;;;;;;;;;;;;;-1:-1:-1::0;;;34411:14:0::1;;::::0;34384:42:::1;;;;;-1:-1:-1::0;;;34384:42:0::1;;;;;;;;:::i;:::-;;34157:281;34449:12;34495:16:::0;34462:32:::1;34478:16:::0;34462:15:::1;:32;:::i;:::-;:49;;;;:::i;:::-;34550:20;::::0;34586:9:::1;::::0;;::::1;::::0;34596;;::::1;::::0;34449:62;;-1:-1:-1;34522:12:0::1;::::0;-1:-1:-1;;;;;34550:20:0;;::::1;::::0;34535:45:::1;::::0;34449:62;;34606:16;34623;34640:10:::1;34651:15;34586:4:::0;35624:8;;;:11;;35543:100;34651:15:::1;35624:8:::0;;;;:11;34535:148:::1;::::0;-1:-1:-1;;;;;;34535:148:0::1;::::0;;;;;;::::1;::::0;::::1;14918:25:1::0;;;;14959:18;;;14952:34;;;;15002:18;;;14995:34;;;;15045:18;;;15038:34;;;;15088:19;;;15081:35;-1:-1:-1;;;;;15153:32:1;15132:19;;;15125:61;15230:14;15223:22;15202:19;;;15195:51;15290:14;15283:22;15262:19;;;15255:51;14890:19;;34535:148:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34522:161;;34694:15;34710:153;;;;;;;;34735:1;34710:153;;;;34755:10;34710:153;;;;34784:10;34710:153;;;;34814:4;34710:153;;;;34840:4;34845:6;34840:11;;;;:::i;:::-;34710:153:::0;;34882:4:::1;:11:::0;;34904:15:::1;::::0;::::1;::::0;;-1:-1:-1;34904:15:0;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;34882:11;-1:-1:-1;34694:169:0;-1:-1:-1;34930:26:0::1;34937:10;34882:11:::0;34930:6:::1;:26::i;:::-;34967:29;::::0;;;:17:::1;:29;::::0;;;;;;;:43;;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;35021:29;;;;;;:43;;;;::::1;::::0;;;;;;;;;::::1;::::0;;;35080:39;35002:7;;35100:10:::1;::::0;35080:39:::1;::::0;34967:29;;35080:39:::1;13975:1;;;;;;;33083:2044:::0;;;;:::o;27452:1220::-;27580:15;;27525:16;;;;27570:9;27580:15;-1:-1:-1;;;;;27628:16:0;;;;;-1:-1:-1;;;27628:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27628:16:0;;27606:38;;27655:21;27691:1;-1:-1:-1;;;;;27677:16:0;;;;;-1:-1:-1;;;27677:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27677:16:0;;27655:38;;27704:13;27728:15;27759:9;27754:882;27773:1;27771;:3;27754:882;;;27802:8;27811:1;27802:11;;;;;;-1:-1:-1;;;27802:11:0;;;;;;;;;;;;;;;27794:19;;27834:16;27842:7;27834;:16::i;:::-;27869:25;;;;:16;:25;;;;;;27828:22;;-1:-1:-1;27869:25:0;;27865:760;;;27918:18;:5;-1:-1:-1;;;;;27918:16:0;;:18::i;:::-;27914:588;;;28026:47;;-1:-1:-1;;;;;;28026:47:0;;28059:4;28026:47;;;12426:51:1;12493:18;;;12486:34;;;27993:5:0;;-1:-1:-1;;;;;28026:24:0;;;;;12399:18:1;;28026:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28026:47:0;;;;;;;;-1:-1:-1;;28026:47:0;;;;;;;;;;;;:::i;:::-;;;28022:162;;28180:1;28164:4;28169:1;28164:7;;;;;;-1:-1:-1;;;28164:7:0;;;;;;;;;;;;;;:18;-1:-1:-1;;;;;28164:18:0;;;-1:-1:-1;;;;;28164:18:0;;;;;28022:162;;;28130:4;28122;28127:1;28122:7;;;;;;-1:-1:-1;;;28122:7:0;;;;;;;;;;;;;;:12;-1:-1:-1;;;;;28122:12:0;;;-1:-1:-1;;;;;28122:12:0;;;;;28074:84;28022:162;28210:48;;-1:-1:-1;;;28210:48:0;;28244:4;28210:48;;;12426:51:1;12493:18;;;12486:34;;;-1:-1:-1;;;;;28210:25:0;;;;;12399:18:1;;28210:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28210:48:0;;;;;;;;-1:-1:-1;;28210:48:0;;;;;;;;;;;;:::i;:::-;;;28206:163;;28365:1;28349:4;28354:1;28349:7;;;;;;-1:-1:-1;;;28349:7:0;;;;;;;;;;;;;;:18;-1:-1:-1;;;;;28349:18:0;;;-1:-1:-1;;;;;28349:18:0;;;;;28206:163;;;28315:4;28307;28312:1;28307:7;;;;;;-1:-1:-1;;;28307:7:0;;;;;;;;;;;;;;:12;-1:-1:-1;;;;;28307:12:0;;;-1:-1:-1;;;;;28307:12:0;;;;;28259:84;28206:163;27914:588;27865:760;;27914:588;28441:5;28433:4;28438:1;28433:7;;;;;;-1:-1:-1;;;28433:7:0;;;;;;;;;;;;;;:13;-1:-1:-1;;;;;28433:13:0;;;-1:-1:-1;;;;;28433:13:0;;;;;28477:5;28469:4;28474:1;28469:7;;;;;;-1:-1:-1;;;28469:7:0;;;;;;;;;;;;;;:13;-1:-1:-1;;;;;28469:13:0;;;-1:-1:-1;;;;;28469:13:0;;;;;27865:760;;;28570:1;28554:4;28559:1;28554:7;;;;;;-1:-1:-1;;;28554:7:0;;;;;;;;;;;;;;:18;-1:-1:-1;;;;;28554:18:0;;;-1:-1:-1;;;;;28554:18:0;;;;;28607:1;28591:4;28596:1;28591:7;;;;;;-1:-1:-1;;;28591:7:0;;;;;;;;;;;;;;:18;-1:-1:-1;;;;;28591:18:0;;;-1:-1:-1;;;;;28591:18:0;;;;;27865:760;27775:3;;;;:::i;:::-;;;;27754:882;;;-1:-1:-1;28654:4:0;;28659;;-1:-1:-1;27452:1220:0;;-1:-1:-1;;;;;27452:1220:0:o;26698:225::-;13950:6;;13957;;;;;;;;;;;;-1:-1:-1;;;13957:6:0;;;;;-1:-1:-1;;;13950:6:0;;;;13949:7;13941:23;;;;-1:-1:-1;;;13941:23:0;;;;;;;;:::i;:::-;-1:-1:-1;26819:10:0::1;26802:28;::::0;;;:16:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;26802:39:0;::::1;::::0;;;;;;;;;;:49;;-1:-1:-1;;26802:49:0::1;::::0;::::1;;::::0;;::::1;::::0;;;26867:48;;13407:41:1;;;26802:39:0;;26819:10;26867:48:::1;::::0;13380:18:1;26867:48:0::1;;;;;;;26698:225:::0;;:::o;28730:452::-;28836:15;;28798:16;;28826:9;28836:15;-1:-1:-1;;;;;28885:16:0;;;;;-1:-1:-1;;;28885:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28885:16:0;;28862:39;;28917:9;28912:242;28931:1;28929;:3;28912:242;;;28956:22;28966:8;28975:1;28966:11;;;;;;-1:-1:-1;;;28966:11:0;;;;;;;;;;;;;;;28956:9;:22::i;:::-;28952:191;;;28998:15;29014:4;29019:8;29028:1;29019:11;;;;;;-1:-1:-1;;;29019:11:0;;;;;;;;;;;;;;;29014:17;;;;;;-1:-1:-1;;;29014:17:0;;;;;;;;;;;;;;;;;;;28998:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29057:4;:9;;;29050:3;29054:1;29050:6;;;;;;-1:-1:-1;;;29050:6:0;;;;;;;;;;;;;;:16;;;;;28952:191;;;;29126:1;29119:3;29123:1;29119:6;;;;;;-1:-1:-1;;;29119:6:0;;;;;;;;;;;;;;:8;;;;;28952:191;28933:3;;;;:::i;:::-;;;;28912:242;;;-1:-1:-1;29171:3:0;28730:452;-1:-1:-1;;;28730:452:0:o;24704:395::-;24833:34;24846:5;24853:3;24858:8;24833:12;:34::i;:::-;24882:16;:3;-1:-1:-1;;;;;24882:14:0;;:16::i;:::-;24878:214;;;24928:77;;-1:-1:-1;;;24928:77:0;;24914:13;;-1:-1:-1;;;;;24928:42:0;;;;;:77;;24971:10;;24983:5;;24990:8;;25000:4;;;;24928:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25063:16;;;;;;;;;;;;-1:-1:-1;;;25063:16:0;;;;24914:91;;-1:-1:-1;;;;;;;25028:34:0;;-1:-1:-1;;;25028:34:0;25020:60;;;;-1:-1:-1;;;25020:60:0;;;;;;;;:::i;22670:1515::-;22781:15;;;;;;;;;;;;-1:-1:-1;;;22781:15:0;;;;22728:16;;-1:-1:-1;;;;;22764:16:0;;22756:41;;;;-1:-1:-1;;;22756:41:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;22831:17:0;;22808:22;22831:17;;;:11;:17;;;;;;;;22808:40;;;;;;;;;;;;;;;;;;;22831:17;;22808:40;;;22831:17;22808:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;22882:27:0;;22859:22;22882:27;;;:21;:27;;;;;;;;22859:50;;;;;;;;;;;;;;;;;22808:40;;-1:-1:-1;22859:22:0;;:50;;-1:-1:-1;22859:50:0;;;22882:27;22859:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22931:12:0;;22965;;22859:50;;-1:-1:-1;22931:12:0;22965;-1:-1:-1;22920:10:0;;-1:-1:-1;22931:12:0;;-1:-1:-1;;;;;;23014:17:0;;;;;-1:-1:-1;;;23014:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23014:17:0;;22988:43;;23042:23;23082:2;-1:-1:-1;;;;;23068:17:0;;;;;-1:-1:-1;;;23068:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23068:17:0;;23042:43;;23096:14;23121;23151:9;23146:163;23165:2;23163:1;:4;23146:163;;;23191:16;:26;23208:5;23214:1;23208:8;;;;;;-1:-1:-1;;;23208:8:0;;;;;;;;;;;;;;;;;;;;23191:26;;;;;;;;;;-1:-1:-1;23191:26:0;;;;23187:111;;;23237:8;;;;:::i;:::-;;;;23274:5;23280:1;23274:8;;;;;;-1:-1:-1;;;23274:8:0;;;;;;;;;;;;;;;23264:6;23271:1;23264:9;;;;;;-1:-1:-1;;;23264:9:0;;;;;;;;;;;;;;:18;;;;;23187:111;23168:3;;;;:::i;:::-;;;;23146:163;;;;23324:9;23319:430;23338:2;23336:1;:4;23319:430;;;23364:16;:26;23381:5;23387:1;23381:8;;;;;;-1:-1:-1;;;23381:8:0;;;;;;;;;;;;;;;;;;;;23364:26;;;;;;;;;;-1:-1:-1;23364:26:0;;;;23360:378;;;23410:24;23443:17;23451:5;23457:1;23451:8;;;;;;-1:-1:-1;;;23451:8:0;;;;;;;;;;;;;;;23443:7;:17::i;:::-;23410:51;;23484:16;-1:-1:-1;;;;;23484:24:0;;23517:4;23523:5;23529:1;23523:8;;;;;;-1:-1:-1;;;23523:8:0;;;;;;;;;;;;;;;23484:48;;;;;;;;;;;;;;;-1:-1:-1;;;;;12444:32:1;;;;12426:51;;12508:2;12493:18;;12486:34;12414:2;12399:18;;12381:145;23484:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23484:48:0;;;;;;;;-1:-1:-1;;23484:48:0;;;;;;;;;;;;:::i;:::-;;;23480:243;;;;;23586:4;-1:-1:-1;;;;;23581:9:0;:3;-1:-1:-1;;;;;23581:9:0;;23577:118;;;23618:8;;;;:::i;:::-;;;;23663:5;23669:1;23663:8;;;;;;-1:-1:-1;;;23663:8:0;;;;;;;;;;;;;;;23653:6;23660:1;23653:9;;;;;;-1:-1:-1;;;23653:9:0;;;;;;;;;;;;;;:18;;;;;23577:118;23533:181;23480:243;23360:378;;23341:3;;;;:::i;:::-;;;;23319:430;;;-1:-1:-1;23759:13:0;;23822;23829:6;23822;:13;:::i;:::-;-1:-1:-1;;;;;23808:28:0;;;;;-1:-1:-1;;;23808:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23808:28:0;;23785:51;;23852:9;23847:150;23866:2;23864:1;:4;23847:150;;;23892:6;23899:1;23892:9;;;;;;-1:-1:-1;;;23892:9:0;;;;;;;;;;;;;;;23903:1;23892:12;23888:98;;23935:6;23942:1;23935:9;;;;;;-1:-1:-1;;;23935:9:0;;;;;;;;;;;;;;;23924:3;23928:5;23924:10;;;;;;-1:-1:-1;;;23924:10:0;;;;;;;;;;;;;;;;;;:20;23963:7;;;;:::i;:::-;;;;23888:98;23869:3;;;;:::i;:::-;;;;23847:150;;;;24012:9;24007:150;24026:2;24024:1;:4;24007:150;;;24052:6;24059:1;24052:9;;;;;;-1:-1:-1;;;24052:9:0;;;;;;;;;;;;;;;24063:1;24052:12;24048:98;;24095:6;24102:1;24095:9;;;;;;-1:-1:-1;;;24095:9:0;;;;;;;;;;;;;;;24084:3;24088:5;24084:10;;;;;;-1:-1:-1;;;24084:10:0;;;;;;;;;;;;;;;;;;:20;24123:7;;;;:::i;:::-;;;;24048:98;24029:3;;;;:::i;:::-;;;;24007:150;;;-1:-1:-1;24174:3:0;22670:1515;-1:-1:-1;;;;;;;;;;;22670:1515:0:o;16584:591::-;16694:4;:11;16652:13;;16685:20;;:35;;;;-1:-1:-1;16709:11:0;;;16685:35;16721:13;;;;;;;;;;;;;-1:-1:-1;;;16721:13:0;;;16677:58;;;;;-1:-1:-1;;;16677:58:0;;;;;;;;:::i;:::-;-1:-1:-1;16761:8:0;16746:12;16805:78;16812:9;;16805:78;;16838:8;;;;:::i;:::-;;-1:-1:-1;16861:10:0;;-1:-1:-1;16869:2:0;16861:10;;:::i;:::-;;;16805:78;;;16893:19;16925:6;-1:-1:-1;;;;;16915:17:0;;;;;-1:-1:-1;;;16915:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16915:17:0;;16893:39;;16943:163;16950:13;;16943:163;;16980:11;16990:1;16980:11;;:::i;:::-;;-1:-1:-1;17049:13:0;17060:2;17049:8;:13;:::i;:::-;17036:27;;:2;:27;:::i;:::-;17023:42;;17006:6;17013;17006:14;;;;;;-1:-1:-1;;;17006:14:0;;;;;;;;;;;;:59;-1:-1:-1;;;;;17006:59:0;;;;;;;;-1:-1:-1;17080:14:0;17092:2;17080:14;;:::i;:::-;;;16943:163;;;17147:3;17158:6;17130:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;17116:51;;;;;16584:591;;;:::o;32396:241::-;12438:10;;12449:13;;;;;;;;;;;;-1:-1:-1;;;12449:13:0;;;;;-1:-1:-1;;;;;12438:10:0;12426;:22;12418:45;;;;-1:-1:-1;;;12418:45:0;;;;;;;;:::i;:::-;-1:-1:-1;32498:15:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;32498:15:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;32481:16:0;::::1;32473:41;;;;-1:-1:-1::0;;;32473:41:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;32551:20:0::1;::::0;32530:63:::1;::::0;32577:15:::1;14551:25:1::0;;-1:-1:-1;;;;;32530:63:0;;::::1;::::0;32551:20:::1;::::0;32530:63:::1;::::0;14539:2:1;14524:18;32530:63:0::1;;;;;;;32604:20;:25:::0;;-1:-1:-1;;;;;;32604:25:0::1;-1:-1:-1::0;;;;;32604:25:0;;;::::1;::::0;;;::::1;::::0;;32396:241::o;20005:143::-;20062:8;20082:17;20090:8;20082:7;:17::i;:::-;-1:-1:-1;;20114:26:0;;;;:16;:26;;;;;;;;;20005:143::o;35163:321::-;13950:6;;13957;;;;;;;;;;;;-1:-1:-1;;;13957:6:0;;;;;-1:-1:-1;;;13950:6:0;;;;13949:7;13941:23;;;;-1:-1:-1;;;13941:23:0;;;;;;;;:::i;:::-;;35231:15:::1;35247:4;35252:7;35247:13;;;;;;-1:-1:-1::0;;;35247:13:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;35231:29:::1;::::0;;::::1;::::0;::::1;::::0;;35247:13:::1;::::0;;::::1;::::0;;::::1;35231:29:::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;35280:25;;;;;;;;;;35306:7;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;35306:7:0;;::::1;::::0;;;;35231:29;;-1:-1:-1;35280:25:0::1;;35279:26;35271:43;;;;-1:-1:-1::0;;;35271:43:0::1;;;;;;;;:::i;:::-;;35345:16;35353:7;35345;:16::i;:::-;-1:-1:-1::0;;;;;35333:28:0::1;:10;-1:-1:-1::0;;;;;35333:28:0::1;;35362:13;;;;;;;;;;;;;-1:-1:-1::0;;;35362:13:0::1;;::::0;35325:51:::1;;;;;-1:-1:-1::0;;;35325:51:0::1;;;;;;;;:::i;:::-;;35412:4;:11;;;35395:15;:28;;35424:10;;;;;;;;;;;;;-1:-1:-1::0;;;35424:10:0::1;;::::0;35387:48:::1;;;;;-1:-1:-1::0;;;35387:48:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;;35446:25:0::1;::::0;;;:16:::1;:25;::::0;;;;:30;;-1:-1:-1;;35446:30:0::1;35472:4;35446:30;::::0;;35163:321::o;13318:110::-;12438:10;;12449:13;;;;;;;;;;;;-1:-1:-1;;;12449:13:0;;;;;-1:-1:-1;;;;;12438:10:0;12426;:22;12418:45;;;;-1:-1:-1;;;12418:45:0;;;;;;;;:::i;:::-;-1:-1:-1;13393:10:0::1;::::0;;:27:::1;::::0;-1:-1:-1;;;;;13393:10:0;;::::1;::::0;:27;::::1;;;::::0;13413:6;;13393:27;:10;:27;13413:6;13393:10;:27;::::1;;;;;;;;;;;;;::::0;::::1;;;;17962:434:::0;18019:7;18027;18035;18043;18051;18059:16;18087:15;18103:4;18108:8;18103:14;;;;;;-1:-1:-1;;;18103:14:0;;;;;;;;;;;;;;;;;18087:30;;;;;;;;18103:14;;;;;;;18087:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18166:26;;;;;;;;;18087:30;;-1:-1:-1;18166:26:0;;18161:136;;18283:2;18214:67;18219:62;18214:4;:67;:::i;:::-;18213:72;;;;:::i;:::-;18208:77;;18161:136;18314:4;:10;;;18325:4;:8;;;18334:4;:8;;;18343:4;18348;:11;;;18360:17;:27;18378:8;18360:27;;;;;;;;;;;18307:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17962:434;;;;;;;:::o;20954:663::-;-1:-1:-1;;;;;21057:18:0;;21026:30;21057:18;;;:11;:18;;;;;21104:19;;21057:18;;21026:30;21104:21;;21124:1;;21104:21;:::i;:::-;21086:39;;21136:19;21156:12;21169:9;21156:23;;;;;;-1:-1:-1;;;21156:23:0;;;;;;;;;;;;;;;;;;;;;21209:24;;;:14;:24;;;;;;;;;21251:14;:24;;;;;21244:31;;-1:-1:-1;;;;;;21244:31:0;;;21293:24;;;;21286:31;;;;21328:27;;;;;;;:38;;;21377:24;;21156:23;;-1:-1:-1;21209:24:0;21156:23;;21377:12;;21209:24;;21377;;;;-1:-1:-1;;;21377:24:0;;;;;;;;;;;;;;;;:36;;;;21424:12;:18;;;;;-1:-1:-1;;;21424:18:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21424:18:0;;;;;;;;;;;;21457:23;;;:13;:23;;;;;;-1:-1:-1;;;;;21457:23:0;:35;21453:157;;21508:41;21540:8;21508:31;:41::i;:::-;-1:-1:-1;;;21596:1:0;21564:23;;;-1:-1:-1;21564:13:0;:23;;;;;:34;;-1:-1:-1;;;;;;21564:34:0;;;-1:-1:-1;20954:663:0:o;20566:253::-;20632:24;;;;:14;:24;;;;;;;;:28;;-1:-1:-1;;;;;20632:28:0;;;-1:-1:-1;;;;;;20632:28:0;;;;;;;20702:16;;;:11;:16;;;;;20754:19;;20729:24;;;:14;:24;;;;;:44;;;20632:28;20784:27;;;;;;;;;;;;20566:253::o;2385:786::-;2470:17;3054:18;;2958:66;3120:15;;;;;:42;;;3151:11;3139:8;:23;;3120:42;3104:59;2385:786;-1:-1:-1;;;;2385:786:0:o;22089:529::-;22166:12;22179:22;;;:13;:22;;;;;;;;;22226:33;:42;;;;;;-1:-1:-1;;;;;22179:22:0;;;22289:27;;;:21;:27;;;;;;:34;;22179:22;;22226:42;;22289:34;22166:12;22382:3;22179:22;22289:34;22382:3;:::i;:::-;22354:32;;;;;;-1:-1:-1;;;22354:32:0;;;;;;;;;;;;;;;;;22334:52;;22432:11;22397:21;:27;22419:4;-1:-1:-1;;;;;22397:27:0;-1:-1:-1;;;;;22397:27:0;;;;;;;;;;;;22425:5;22397:34;;;;;;-1:-1:-1;;;22397:34:0;;;;;;;;;;;;;;;;;;;;:46;;;;-1:-1:-1;;;;;22454:27:0;;;;:21;:27;;;;;;:33;;;;;-1:-1:-1;;;22454:33:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22454:33:0;;;;;;;;;;;;22498:46;;;:33;:46;;;;;;;:52;;;;22568:42;;;-1:-1:-1;22568:42:0;;22561:49;;;;-1:-1:-1;22089:529:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:160:1;79:20;;135:13;;128:21;118:32;;108:2;;164:1;161;154:12;108:2;60:114;;;:::o;179:257::-;238:6;291:2;279:9;270:7;266:23;262:32;259:2;;;312:6;304;297:22;259:2;356:9;343:23;375:31;400:5;375:31;:::i;:::-;425:5;249:187;-1:-1:-1;;;249:187:1:o;441:261::-;511:6;564:2;552:9;543:7;539:23;535:32;532:2;;;585:6;577;570:22;532:2;622:9;616:16;641:31;666:5;641:31;:::i;977:398::-;1045:6;1053;1106:2;1094:9;1085:7;1081:23;1077:32;1074:2;;;1127:6;1119;1112:22;1074:2;1171:9;1158:23;1190:31;1215:5;1190:31;:::i;:::-;1240:5;-1:-1:-1;1297:2:1;1282:18;;1269:32;1310:33;1269:32;1310:33;:::i;:::-;1362:7;1352:17;;;1064:311;;;;;:::o;1380:466::-;1457:6;1465;1473;1526:2;1514:9;1505:7;1501:23;1497:32;1494:2;;;1547:6;1539;1532:22;1494:2;1591:9;1578:23;1610:31;1635:5;1610:31;:::i;:::-;1660:5;-1:-1:-1;1717:2:1;1702:18;;1689:32;1730:33;1689:32;1730:33;:::i;:::-;1484:362;;1782:7;;-1:-1:-1;;;1836:2:1;1821:18;;;;1808:32;;1484:362::o;1851:986::-;1948:6;1956;1964;1972;1980;2033:3;2021:9;2012:7;2008:23;2004:33;2001:2;;;2055:6;2047;2040:22;2001:2;2099:9;2086:23;2118:31;2143:5;2118:31;:::i;:::-;2168:5;-1:-1:-1;2225:2:1;2210:18;;2197:32;2238:33;2197:32;2238:33;:::i;:::-;2290:7;-1:-1:-1;2344:2:1;2329:18;;2316:32;;-1:-1:-1;2399:2:1;2384:18;;2371:32;-1:-1:-1;;;;;2452:14:1;;;2449:2;;;2484:6;2476;2469:22;2449:2;2527:6;2516:9;2512:22;2502:32;;2572:7;2565:4;2561:2;2557:13;2553:27;2543:2;;2599:6;2591;2584:22;2543:2;2644;2631:16;2670:2;2662:6;2659:14;2656:2;;;2691:6;2683;2676:22;2656:2;2741:7;2736:2;2727:6;2723:2;2719:15;2715:24;2712:37;2709:2;;;2767:6;2759;2752:22;2709:2;1991:846;;;;-1:-1:-1;1991:846:1;;-1:-1:-1;2803:2:1;2795:11;;2825:6;1991:846;-1:-1:-1;;;1991:846:1:o;2842:325::-;2907:6;2915;2968:2;2956:9;2947:7;2943:23;2939:32;2936:2;;;2989:6;2981;2974:22;2936:2;3033:9;3020:23;3052:31;3077:5;3052:31;:::i;:::-;3102:5;-1:-1:-1;3126:35:1;3157:2;3142:18;;3126:35;:::i;:::-;3116:45;;2926:241;;;;;:::o;3172:325::-;3240:6;3248;3301:2;3289:9;3280:7;3276:23;3272:32;3269:2;;;3322:6;3314;3307:22;3269:2;3366:9;3353:23;3385:31;3410:5;3385:31;:::i;:::-;3435:5;3487:2;3472:18;;;;3459:32;;-1:-1:-1;;;3259:238:1:o;3502:947::-;3586:6;3617:2;3660;3648:9;3639:7;3635:23;3631:32;3628:2;;;3681:6;3673;3666:22;3628:2;3726:9;3713:23;-1:-1:-1;;;;;3751:6:1;3748:30;3745:2;;;3796:6;3788;3781:22;3745:2;3824:22;;3877:4;3869:13;;3865:27;-1:-1:-1;3855:2:1;;3911:6;3903;3896:22;3855:2;3952;3939:16;3975:60;3991:43;4031:2;3991:43;:::i;:::-;3975:60;:::i;:::-;4057:3;4081:2;4076:3;4069:15;4109:2;4104:3;4100:12;4093:19;;4140:2;4136;4132:11;4188:7;4183:2;4177;4174:1;4170:10;4166:2;4162:19;4158:28;4155:41;4152:2;;;4214:6;4206;4199:22;4152:2;4241:6;4232:15;;4256:163;4270:2;4267:1;4264:9;4256:163;;;4327:17;;4315:30;;4288:1;4281:9;;;;;4365:12;;;;4397;;4256:163;;;-1:-1:-1;4438:5:1;3597:852;-1:-1:-1;;;;;;;3597:852:1:o;4454:1000::-;4558:6;4566;4619:2;4607:9;4598:7;4594:23;4590:32;4587:2;;;4640:6;4632;4625:22;4587:2;4678:9;4672:16;-1:-1:-1;;;;;4703:6:1;4700:30;4697:2;;;4748:6;4740;4733:22;4697:2;4776:22;;4829:4;4821:13;;4817:27;-1:-1:-1;4807:2:1;;4863:6;4855;4848:22;4807:2;4897;4891:9;4919:4;4943:60;4959:43;4999:2;4959:43;:::i;4943:60::-;5025:3;5049:2;5044:3;5037:15;5077:2;5072:3;5068:12;5061:19;;5108:2;5104;5100:11;5156:7;5151:2;5145;5142:1;5138:10;5134:2;5130:19;5126:28;5123:41;5120:2;;;5182:6;5174;5167:22;5120:2;5209:6;5200:15;;5224:156;5238:2;5235:1;5232:9;5224:156;;;5295:10;;5283:23;;5256:1;5249:9;;;;;5326:12;;;;5358;;5224:156;;;-1:-1:-1;5429:18:1;;;;5423:25;5399:5;;5423:25;;-1:-1:-1;;;;;;4577:877:1:o;5459:190::-;5515:6;5568:2;5556:9;5547:7;5543:23;5539:32;5536:2;;;5589:6;5581;5574:22;5536:2;5617:26;5633:9;5617:26;:::i;5654:255::-;5712:6;5765:2;5753:9;5744:7;5740:23;5736:32;5733:2;;;5786:6;5778;5771:22;5733:2;5830:9;5817:23;5849:30;5873:5;5849:30;:::i;5914:259::-;5983:6;6036:2;6024:9;6015:7;6011:23;6007:32;6004:2;;;6057:6;6049;6042:22;6004:2;6094:9;6088:16;6113:30;6137:5;6113:30;:::i;6178:809::-;6247:6;6278:2;6321;6309:9;6300:7;6296:23;6292:32;6289:2;;;6342:6;6334;6327:22;6289:2;6387:9;6374:23;-1:-1:-1;;;;;6457:2:1;6449:6;6446:14;6443:2;;;6478:6;6470;6463:22;6443:2;6521:6;6510:9;6506:22;6496:32;;6566:7;6559:4;6555:2;6551:13;6547:27;6537:2;;6593:6;6585;6578:22;6537:2;6634;6621:16;6656:2;6652;6649:10;6646:2;;;6662:18;;:::i;:::-;6704:53;6747:2;6728:13;;-1:-1:-1;;6724:27:1;6720:36;;6704:53;:::i;:::-;6691:66;;6780:2;6773:5;6766:17;6820:7;6815:2;6810;6806;6802:11;6798:20;6795:33;6792:2;;;6846:6;6838;6831:22;6792:2;6906;6901;6897;6893:11;6888:2;6881:5;6877:14;6864:45;6929:14;;6925:23;;;6918:39;;;;6933:5;6258:729;-1:-1:-1;;;6258:729:1:o;6992:190::-;7051:6;7104:2;7092:9;7083:7;7079:23;7075:32;7072:2;;;7125:6;7117;7110:22;7072:2;-1:-1:-1;7153:23:1;;7062:120;-1:-1:-1;7062:120:1:o;7187:194::-;7257:6;7310:2;7298:9;7289:7;7285:23;7281:32;7278:2;;;7331:6;7323;7316:22;7278:2;-1:-1:-1;7359:16:1;;7268:113;-1:-1:-1;7268:113:1:o;7386:325::-;7454:6;7462;7515:2;7503:9;7494:7;7490:23;7486:32;7483:2;;;7536:6;7528;7521:22;7483:2;7577:9;7564:23;7554:33;;7637:2;7626:9;7622:18;7609:32;7650:31;7675:5;7650:31;:::i;7716:258::-;7784:6;7792;7845:2;7833:9;7824:7;7820:23;7816:32;7813:2;;;7866:6;7858;7851:22;7813:2;-1:-1:-1;;7894:23:1;;;7964:2;7949:18;;;7936:32;;-1:-1:-1;7803:171:1:o;7979:255::-;8058:6;8066;8119:2;8107:9;8098:7;8094:23;8090:32;8087:2;;;8140:6;8132;8125:22;8087:2;-1:-1:-1;;8168:16:1;;8224:2;8209:18;;;8203:25;8168:16;;8203:25;;-1:-1:-1;8077:157:1:o;8239:463::-;8292:3;8330:5;8324:12;8357:6;8352:3;8345:19;8383:4;8412:2;8407:3;8403:12;8396:19;;8449:2;8442:5;8438:14;8470:3;8482:195;8496:6;8493:1;8490:13;8482:195;;;8561:13;;-1:-1:-1;;;;;8557:39:1;8545:52;;8617:12;;;;8652:15;;;;8593:1;8511:9;8482:195;;;-1:-1:-1;8693:3:1;;8300:402;-1:-1:-1;;;;;8300:402:1:o;8707:437::-;8760:3;8798:5;8792:12;8825:6;8820:3;8813:19;8851:4;8880:2;8875:3;8871:12;8864:19;;8917:2;8910:5;8906:14;8938:3;8950:169;8964:6;8961:1;8958:13;8950:169;;;9025:13;;9013:26;;9059:12;;;;9094:15;;;;8986:1;8979:9;8950:169;;9149:185;9191:3;9229:5;9223:12;9244:52;9289:6;9284:3;9277:4;9270:5;9266:16;9244:52;:::i;:::-;9312:16;;;;;9199:135;-1:-1:-1;;9199:135:1:o;9339:1178::-;9515:3;9544;9579:6;9573:13;9609:3;9631:1;9659:9;9655:2;9651:18;9641:28;;9719:2;9708:9;9704:18;9741;9731:2;;9785:4;9777:6;9773:17;9763:27;;9731:2;9811;9859;9851:6;9848:14;9828:18;9825:38;9822:2;;;-1:-1:-1;;;9886:33:1;;9942:4;9939:1;9932:15;9972:4;9893:3;9960:17;9822:2;10003:18;10030:104;;;;10148:1;10143:322;;;;9996:469;;10030:104;-1:-1:-1;;10063:24:1;;10051:37;;10108:16;;;;-1:-1:-1;10030:104:1;;10143:322;16457:4;16476:17;;;16526:4;16510:21;;10238:3;10254:165;10268:6;10265:1;10262:13;10254:165;;;10346:14;;10333:11;;;10326:35;10389:16;;;;10283:10;;10254:165;;;10258:3;;10448:6;10443:3;10439:16;10432:23;;9996:469;;;;;;;10481:30;10507:3;10499:6;10481:30;:::i;:::-;10474:37;9523:994;-1:-1:-1;;;;;9523:994:1:o;10730:665::-;-1:-1:-1;;;;;11009:15:1;;;10991:34;;11061:15;;11056:2;11041:18;;11034:43;11108:2;11093:18;;11086:34;;;11156:3;11151:2;11136:18;;11129:31;;;11176:19;;11169:35;;;10934:4;11197:6;11247;10971:3;11226:19;;11213:49;11282:22;;;11306:3;11278:32;;;11271:46;;;;11378:2;11357:15;;;-1:-1:-1;;11353:29:1;11338:45;11334:55;;10943:452;-1:-1:-1;;;;10943:452:1:o;12531:465::-;12788:2;12777:9;12770:21;12751:4;12814:56;12866:2;12855:9;12851:18;12843:6;12814:56;:::i;:::-;12918:9;12910:6;12906:22;12901:2;12890:9;12886:18;12879:50;12946:44;12983:6;12975;12946:44;:::i;13001:261::-;13180:2;13169:9;13162:21;13143:4;13200:56;13252:2;13241:9;13237:18;13229:6;13200:56;:::i;13666:383::-;13815:2;13804:9;13797:21;13778:4;13847:6;13841:13;13890:6;13885:2;13874:9;13870:18;13863:34;13906:66;13965:6;13960:2;13949:9;13945:18;13940:2;13932:6;13928:15;13906:66;:::i;:::-;14033:2;14012:15;-1:-1:-1;;14008:29:1;13993:45;;;;14040:2;13989:54;;13787:262;-1:-1:-1;;13787:262:1:o;15317:620::-;15636:6;15625:9;15618:25;15679:6;15674:2;15663:9;15659:18;15652:34;15722:6;15717:2;15706:9;15702:18;15695:34;15765:6;15760:2;15749:9;15745:18;15738:34;15809:6;15803:3;15792:9;15788:19;15781:35;15853:3;15847;15836:9;15832:19;15825:32;15599:4;15874:57;15926:3;15915:9;15911:19;15903:6;15874:57;:::i;:::-;15866:65;15608:329;-1:-1:-1;;;;;;;;15608:329:1:o;15942:275::-;16013:2;16007:9;16078:2;16059:13;;-1:-1:-1;;16055:27:1;16043:40;;-1:-1:-1;;;;;16098:34:1;;16134:22;;;16095:62;16092:2;;;16160:18;;:::i;:::-;16196:2;16189:22;15987:230;;-1:-1:-1;15987:230:1:o;16222:183::-;16282:4;-1:-1:-1;;;;;16307:6:1;16304:30;16301:2;;;16337:18;;:::i;:::-;-1:-1:-1;16382:1:1;16378:14;16394:4;16374:25;;16291:114::o;16542:128::-;16582:3;16613:1;16609:6;16606:1;16603:13;16600:2;;;16619:18;;:::i;:::-;-1:-1:-1;16655:9:1;;16590:80::o;16675:120::-;16715:1;16741;16731:2;;16746:18;;:::i;:::-;-1:-1:-1;16780:9:1;;16721:74::o;16800:168::-;16840:7;16906:1;16902;16898:6;16894:14;16891:1;16888:21;16883:1;16876:9;16869:17;16865:45;16862:2;;;16913:18;;:::i;:::-;-1:-1:-1;16953:9:1;;16852:116::o;16973:125::-;17013:4;17041:1;17038;17035:8;17032:2;;;17046:18;;:::i;:::-;-1:-1:-1;17083:9:1;;17022:76::o;17103:258::-;17175:1;17185:113;17199:6;17196:1;17193:13;17185:113;;;17275:11;;;17269:18;17256:11;;;17249:39;17221:2;17214:10;17185:113;;;17316:6;17313:1;17310:13;17307:2;;;17351:1;17342:6;17337:3;17333:16;17326:27;17307:2;;17156:205;;;:::o;17366:380::-;17445:1;17441:12;;;;17488;;;17509:2;;17563:4;17555:6;17551:17;17541:27;;17509:2;17616;17608:6;17605:14;17585:18;17582:38;17579:2;;;17662:10;17657:3;17653:20;17650:1;17643:31;17697:4;17694:1;17687:15;17725:4;17722:1;17715:15;17751:135;17790:3;-1:-1:-1;;17811:17:1;;17808:2;;;17831:18;;:::i;:::-;-1:-1:-1;17878:1:1;17867:13;;17798:88::o;17891:112::-;17923:1;17949;17939:2;;17954:18;;:::i;:::-;-1:-1:-1;17988:9:1;;17929:74::o;18008:127::-;18069:10;18064:3;18060:20;18057:1;18050:31;18100:4;18097:1;18090:15;18124:4;18121:1;18114:15;18140:127;18201:10;18196:3;18192:20;18189:1;18182:31;18232:4;18229:1;18222:15;18256:4;18253:1;18246:15;18272:127;18333:10;18328:3;18324:20;18321:1;18314:31;18364:4;18361:1;18354:15;18388:4;18385:1;18378:15;18404:131;-1:-1:-1;;;;;18479:31:1;;18469:42;;18459:2;;18525:1;18522;18515:12;18459:2;18449:86;:::o;18540:131::-;-1:-1:-1;;;;;;18614:32:1;;18604:43;;18594:2;;18661:1;18658;18651:12

Swarm Source

ipfs://40c97a41f9a2d3ab5fe92798e5e972d8c276fd1f78c1c05961798d04e5d699d6
Loading