ETH Price: $3,823.44 (+5.80%)

REMO: Cookie Edition (REM005)
 

Overview

TokenID

38

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
remosworldsubcontract

Compiler Version
v0.8.22+commit.4fc1097e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 4: edition.sol
// SPDX-License-Identifier: MIT

/*
  ____                         
 |  _ \  ___  _ __ ___    ___  
 | |_) |/ _ \| '_ ` _ \  / _ \ 
 |  _ <|  __/| | | | | || (_) |
 |_| \_\\___||_| |_| |_| \___/       
 
   _____               _     _         ______     _  _  _    _               
  / ____|             | |   (_)       |  ____|   | |(_)| |  (_)              
 | |      ___    ___  | | __ _   ___  | |__    __| | _ | |_  _   ___   _ __  
 | |     / _ \  / _ \ | |/ /| | / _ \ |  __|  / _` || || __|| | / _ \ | '_ \ 
 | |____| (_) || (_) ||   < | ||  __/ | |____| (_| || || |_ | || (_) || | | |
  \_____|\___/  \___/ |_|\_\|_| \___| |______|\__,_||_| \__||_| \___/ |_| |_|
                                                                                           
Artist and Founder: Joey Tadiar
Smart Contract: giudev.eth
Technology: Forint Finance Ltd

*/


import "./contract.sol";
import "./library.sol";

pragma solidity ^0.8.14;

contract remosworldsubcontract is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;

    IERC721A public remosAddress;

    string public uriPrefix = "";
    string public uriSuffix = "";

    bool public revealed = false;
    bool public paused = true;
    
    mapping(address => uint) public minted;
    mapping(uint => bool) public idMinted;

    uint256 public maxSupply = 500;
    uint256 public maxWalletAmount;
    

    uint256 public mintedNFT;
    
    uint256 public priceNFT = 0 ether;
    string public hiddenMetadataUri = "ipfs://QmYxR9w6iiawd4DbxwB2xEJzUaX176rpEYPmjVyrQahFdp/";

    string public _name = "REMO: Cookie Edition";
    string public _symbol = "REM005";
    
    constructor() ERC721A(_name, _symbol) {}

    modifier mintCompliance(uint256 _mintAmount) {
        require(msg.value >= priceNFT * _mintAmount, "Insufficient Funds");
        require(totalSupply() + _mintAmount <= maxSupply, "Mintable supply exceeded!");
        require(paused == false, "Contract paused");
        _;}

    function checkBalance(address _addr) public view returns (uint256) {
        uint256 balance = remosAddress.balanceOf(_addr);
        return balance;}

    function checkNFT(uint256[]memory _tokenId) public view returns (uint256[] memory, uint256[] memory) {
        
        uint256 _mintedAmount;
        uint256 _notMintedAmount;

        for (uint256 i = 0; i < _tokenId.length; i++) {
            if (idMinted[_tokenId[i]] == false) {
                _notMintedAmount ++;}
            else {
                _mintedAmount ++;}}

        uint256[] memory _notMintedNFT = new uint256[](_notMintedAmount);
        uint256[] memory _mintedNFT = new uint256[](_mintedAmount);
        uint256 _counterNotMinted;
        uint256 _counterMinted;

        for (uint256 i = 0; i < _tokenId.length; i++) {
            if (idMinted[_tokenId[i]] == false) {
                _notMintedNFT[_counterNotMinted] = _tokenId[i];
                _counterNotMinted ++;}
            else {
                _mintedNFT[_counterMinted] = _tokenId[i];
                _counterMinted ++;}}

        return (_notMintedNFT, _mintedNFT);}

    function setPrice(uint256 _price) public onlyOwner {
        priceNFT = _price;}

    function setNFTAddress(address _addr) public onlyOwner {
        remosAddress = IERC721A(_addr);}

    function ownerBlacklistBatchNFT(uint256[]memory _nftId) public onlyOwner {
        for (uint256 i = 0; i < _nftId.length; i++) {
            idMinted[_nftId[i]] = true;}}

    function blacklistBatchNFT(uint256[]memory _nftId) private {
        for (uint256 i = 0; i < _nftId.length; i++) {
            idMinted[_nftId[i]] = true;}}

    function mint(uint256[] memory _tokenId) public payable mintCompliance(_tokenId.length) nonReentrant {
        for (uint256 i = 0; i < _tokenId.length; i++) {
            require(remosAddress.ownerOf(_tokenId[i]) == _msgSender() && idMinted[_tokenId[i]] == false, "Not NFT owner or NFT not valid");}
        _safeMint(_msgSender(), _tokenId.length);
        blacklistBatchNFT(_tokenId);}

    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;}

    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');
        if (revealed == false) {
            return hiddenMetadataUri;}
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)): '';}
    
    function setRevealed(bool _state) public onlyOwner {
        revealed = _state;}

    function setPause(bool _state) public onlyOwner {
        paused = _state;}

    function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
        hiddenMetadataUri = _hiddenMetadataUri;}

    function setUriPrefix(string memory _uriPrefix) public onlyOwner {
        uriPrefix = _uriPrefix;}

    function _baseURI() internal view virtual override returns (string memory) {
        return uriPrefix;}

    function setUriSuffix(string memory _uriSuffix) public onlyOwner {
        uriSuffix = _uriSuffix;}

    function getMinted() public view returns (uint256, uint256) {
        uint256 _mintedNFT = totalSupply();
        uint256 _totalSupply = maxSupply;
        return (_mintedNFT, _totalSupply);}

    receive() external payable {}

    fallback() external payable {}

    function transferERC20(address _tokenAddr, address _to, uint _amount) public onlyOwner nonReentrant {  
        require(new_type_IERC20(_tokenAddr).transfer(_to, _amount), "Could not transfer out tokens!");}

    function transferERC20O(address _tokenAddr, address _to, uint _amount) public onlyOwner nonReentrant {    
        old_type_IERC20(_tokenAddr).transfer(_to, _amount);}
        
    function withdrawEther(address _to) public onlyOwner nonReentrant {
        (bool os, ) = payable(_to).call{value: address(this).balance}('');
        require(os);}}

File 1 of 4: contract.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.14;

import "./interface.sol";

contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;
    
    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

    // Mapping from token ID to approved address.
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();}

    //Returns the starting token ID
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;}

    //Returns the next token ID to be minted
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;}

    //Returns the total number of tokens in existence
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {return _currentIndex - _burnCounter - _startTokenId();}}

    //Returns the total amount of tokens minted in the contract
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to `_startTokenId()`
        unchecked {
            return _currentIndex - _startTokenId();}}

    //Returns the total number of tokens burned
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;}

    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || interfaceId == 0x80ac58cd || interfaceId == 0x5b5e139f;}

    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;}

    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;}

    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;}

    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);}

    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux}
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;}

    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;
        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];}
                        return packed;}}}
        revert OwnerQueryForNonexistentToken();}

    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;}

    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);}

    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);}}

    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));}

    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));}

    function name() public view virtual override returns (string memory) {
        return _name;}

    function symbol() public view virtual override returns (string memory) {
        return _symbol;}

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';}

    //Base URI for computing {tokenURI}. 
    function _baseURI() internal view virtual returns (string memory) {
        return '';}

    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value}}

    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value}}

    function approve(address to, uint256 tokenId) public override {
        address owner = address(uint160(_packedOwnershipOf(tokenId)));
        if (to == owner) revert ApprovalToCurrentOwner();
        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();}
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);}

    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
        return _tokenApprovals[tokenId];}

    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);}

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];}

    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        _transfer(from, to, tokenId);}

    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
        safeTransferFrom(from, to, tokenId, '');}

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();}}

    //Returns whether `tokenId` exists
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && _packedOwnerships[tokenId] & BITMASK_BURNED == 0;}

    //Equivalent to `_safeMint(to, quantity, '')`
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');}

    //Safely mints `quantity` tokens and transfers them to `to`
    function _safeMint(address to, uint256 quantity, bytes memory _data) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        _beforeTokenTransfers(address(0), to, startTokenId, quantity);
        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);
            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);
            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;
            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();}} 
                while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();} 
                else {
                do {emit Transfer(address(0), to, updatedIndex++);} while (updatedIndex < end);}
            _currentIndex = updatedIndex;}
        _afterTokenTransfers(address(0), to, startTokenId, quantity);}

    //Mints `quantity` tokens and transfers them to `to`
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        _beforeTokenTransfers(address(0), to, startTokenId, quantity);
        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);
            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);
            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;
            do {emit Transfer(address(0), to, updatedIndex++);} while (updatedIndex < end);
            _currentIndex = updatedIndex;}
        _afterTokenTransfers(address(0), to, startTokenId, quantity);}

    //Transfers `tokenId` from `from` to `to`
    function _transfer(address from, address to, uint256 tokenId) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();
        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            getApproved(tokenId) == _msgSenderERC721A());
        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();
        _beforeTokenTransfers(from, to, tokenId, 1);
        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];
        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.
            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;
            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;}}}}
        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);}

    //Equivalent to `_burn(tokenId, false)`
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);}

    //Destroys `tokenId`
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
        address from = address(uint160(prevOwnershipPacked));
        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A());
            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();}
        _beforeTokenTransfers(from, address(0), tokenId, 1);
        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];
        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;
            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;
            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;}}}}
        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);
        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {_burnCounter++;}}

    //Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract
    function _checkContractOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;} 
            catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();} 
            else {
                assembly {revert(add(32, reason), mload(reason))}}}}

    //Hook that is called before a set of serially-ordered token ids are about to be transferred
    function _beforeTokenTransfers(address from, address to, uint256 startTokenId, uint256 quantity) internal virtual {}

    //Hook that is called after a set of serially-ordered token ids have been transferred
    function _afterTokenTransfers(address from, address to, uint256 startTokenId, uint256 quantity) internal virtual {}

    //Returns the message sender (defaults to `msg.sender`)
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;}

    //Converts a `uint256` to its ASCII `string` decimal representation
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), 
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length, 
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for { 
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)} 
            temp { 
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)} { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))}
            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)}}}

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;}

    //Prevents a contract from calling itself, directly or indirectly.
    //Calling a `nonReentrant` function from another `nonReentrant`function is not supported. 
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;}}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;}

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

abstract contract Ownable is Context {

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

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

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

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

    function renounceOwnership() public virtual onlyOwner {
        //Leaves the contract without owner
        _transferOwnership(address(0));}

    function transferOwnership(address newOwner) public virtual onlyOwner {
        //Transfers ownership of the contract to a new account (`newOwner`)
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);}

    function _transferOwnership(address newOwner) internal virtual {
        //Transfers ownership of the contract to a new account (`newOwner`)
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);}}



File 3 of 4: interface.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.14;
                                  
interface IERC721A {

    // The caller must own the token or be an approved operator
    error ApprovalCallerNotOwnerNorApproved();

    //The token does not exist
    error ApprovalQueryForNonexistentToken();

    //The caller cannot approve to their own address
    error ApproveToCaller();

    //The caller cannot approve to the current owner
    error ApprovalToCurrentOwner();

    //Cannot query the balance for the zero address
    error BalanceQueryForZeroAddress();

    //Cannot mint to the zero address
    error MintToZeroAddress();

    //The quantity of tokens minted must be more than zero
    error MintZeroQuantity();

    //The token does not exist
    error OwnerQueryForNonexistentToken();

    //The caller must own the token or be an approved operator.
    error TransferCallerNotOwnerNorApproved();

    ///The token must be owned by `from`
    error TransferFromIncorrectOwner();

    //Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
    error TransferToNonERC721ReceiverImplementer();

    //Cannot transfer to the zero address
    error TransferToZeroAddress();

    //The token does not exist
    error URIQueryForNonexistentToken();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;}

    //Returns the total amount of tokens stored by the contract
    //Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens
    function totalSupply() external view returns (uint256);

    //Returns true if this contract implements the interface defined by `interfaceId`
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    //Emitted when `tokenId` token is transferred from `from` to `to`
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

    //Returns the number of tokens in `owner` account
    function balanceOf(address owner) external view returns (uint256 balance);

    //Returns the owner of the `tokenId` token
    function ownerOf(uint256 tokenId) external view returns (address owner);

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

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

    //Transfers `tokenId` token from `from` to `to`
    //Requirements: `from` cannot be the zero address
    //              `to` cannot be the zero address
    //              `tokenId` token must be owned by `from`
    //              If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}
    function transferFrom(address from, address to, uint256 tokenId) external;

    //Gives permission to `to` to transfer `tokenId` token to another account
    function approve(address to, uint256 tokenId) external;

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

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

    //Returns if the `operator` is allowed to manage all of the assets of `owner`
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    //Returns the token collection name
    function name() external view returns (string memory);

    //Returns the token collection symbol
    function symbol() external view returns (string memory);

    //Returns the Uniform Resource Identifier (URI) for `tokenId` token
    function tokenURI(uint256 tokenId) external view returns (string memory);}

interface ERC721A__IERC721Receiver {
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);}

interface new_type_IERC20 {
    function transfer(address, uint) external returns (bool);}

interface old_type_IERC20 {
    function transfer(address, uint) external;}



File 4 of 4: library.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.14;

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";}
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;}
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;}
        return string(buffer);}
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";}
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;}
        return toHexString(value, length);}
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;}
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);}
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);}}


Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"_name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"checkBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"}],"name":"checkNFT","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"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":[],"name":"getMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_nftId","type":"uint256[]"}],"name":"ownerBlacklistBatchNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remosAddress","outputs":[{"internalType":"contract IERC721A","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","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":"nonpayable","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setNFTAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferERC20O","outputs":[],"stateMutability":"nonpayable","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260405180602001604052805f815250600b908162000023919062000609565b5060405180602001604052805f815250600c908162000043919062000609565b505f600d5f6101000a81548160ff0219169083151502179055506001600d60016101000a81548160ff0219169083151502179055506101f46010555f60135560405180606001604052806036815260200162004ebd6036913960149081620000ac919062000609565b506040518060400160405280601481526020017f52454d4f3a20436f6f6b69652045646974696f6e00000000000000000000000081525060159081620000f3919062000609565b506040518060400160405280600681526020017f52454d3030350000000000000000000000000000000000000000000000000000815250601690816200013a919062000609565b5034801562000147575f80fd5b5060158054620001579062000409565b80601f0160208091040260200160405190810160405280929190818152602001828054620001859062000409565b8015620001d45780601f10620001aa57610100808354040283529160200191620001d4565b820191905f5260205f20905b815481529060010190602001808311620001b657829003601f168201915b505050505060168054620001e89062000409565b80601f0160208091040260200160405190810160405280929190818152602001828054620002169062000409565b8015620002655780601f106200023b5761010080835404028352916020019162000265565b820191905f5260205f20905b8154815290600101906020018083116200024757829003601f168201915b505050505081600290816200027b919062000609565b5080600390816200028d919062000609565b506200029e620002d360201b60201c565b5f819055505050620002c5620002b9620002db60201b60201c565b620002e260201b60201c565b6001600981905550620006ed565b5f6001905090565b5f33905090565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200042157607f821691505b602082108103620004375762000436620003dc565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200049b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200045e565b620004a786836200045e565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004f1620004eb620004e584620004bf565b620004c8565b620004bf565b9050919050565b5f819050919050565b6200050c83620004d1565b620005246200051b82620004f8565b8484546200046a565b825550505050565b5f90565b6200053a6200052c565b6200054781848462000501565b505050565b5b818110156200056e57620005625f8262000530565b6001810190506200054d565b5050565b601f821115620005bd5762000587816200043d565b62000592846200044f565b81016020851015620005a2578190505b620005ba620005b1856200044f565b8301826200054c565b50505b505050565b5f82821c905092915050565b5f620005df5f1984600802620005c2565b1980831691505092915050565b5f620005f98383620005ce565b9150826002028217905092915050565b6200061482620003a5565b67ffffffffffffffff81111562000630576200062f620003af565b5b6200063c825462000409565b6200064982828562000572565b5f60209050601f8311600181146200067f575f84156200066a578287015190505b620006768582620005ec565b865550620006e5565b601f1984166200068f866200043d565b5f5b82811015620006b85784890151825560018201915060208501945060208101905062000691565b86831015620006d85784890151620006d4601f891682620005ce565b8355505b6001600288020188555050505b505050505050565b6147c280620006fb5f395ff3fe608060405260043610610280575f3560e01c80638da5cb5b1161014e578063b09f1266116100c0578063d5abeb0111610079578063d5abeb011461098d578063e0a80853146109b7578063e985e9c5146109df578063f044951314610a1b578063f2fde38b14610a43578063f8e93ef914610a6b57610287565b8063b09f126614610885578063b236ff82146108af578063b88d4fde146108d7578063bedb86fb146108ff578063c87b56dd14610927578063d28d88521461096357610287565b80639db5dbe4116101125780639db5dbe41461078e578063a22cb465146107b6578063a45ba8e7146107de578063aa4bde2814610808578063ac72200d14610832578063af933b571461085d57610287565b80638da5cb5b146106ab5780638e09a116146106d557806391b7f5ed1461071257806395d89b411461073a5780639d03e6d01461076457610287565b806351830227116101f257806365627f15116101ab57806365627f15146105b557806369d03738146105df5780636f0b78711461060757806370a0823114610631578063715018a61461066d5780637ec4a6591461068357610287565b806351830227146104955780635503a0e8146104bf5780635c975abb146104e95780635f5152261461051357806362b99ad41461054f5780636352211e1461057957610287565b806318160ddd1161024457806318160ddd1461037b5780631e7269c5146103a557806323b872dd146103e15780634272f4471461040957806342842e0e146104455780634fdd43cb1461046d57610287565b806301ffc9a71461028957806306fdde03146102c5578063081812fc146102ef578063095ea7b31461032b57806316ba10e01461035357610287565b3661028757005b005b348015610294575f80fd5b506102af60048036038101906102aa919061335c565b610a87565b6040516102bc91906133a1565b60405180910390f35b3480156102d0575f80fd5b506102d9610b18565b6040516102e69190613444565b60405180910390f35b3480156102fa575f80fd5b5061031560048036038101906103109190613497565b610ba8565b6040516103229190613501565b60405180910390f35b348015610336575f80fd5b50610351600480360381019061034c9190613544565b610c20565b005b34801561035e575f80fd5b50610379600480360381019061037491906136ae565b610dc2565b005b348015610386575f80fd5b5061038f610e51565b60405161039c9190613704565b60405180910390f35b3480156103b0575f80fd5b506103cb60048036038101906103c6919061371d565b610e66565b6040516103d89190613704565b60405180910390f35b3480156103ec575f80fd5b5061040760048036038101906104029190613748565b610e7b565b005b348015610414575f80fd5b5061042f600480360381019061042a9190613497565b610e8b565b60405161043c91906133a1565b60405180910390f35b348015610450575f80fd5b5061046b60048036038101906104669190613748565b610ea8565b005b348015610478575f80fd5b50610493600480360381019061048e91906136ae565b610ec7565b005b3480156104a0575f80fd5b506104a9610f56565b6040516104b691906133a1565b60405180910390f35b3480156104ca575f80fd5b506104d3610f68565b6040516104e09190613444565b60405180910390f35b3480156104f4575f80fd5b506104fd610ff4565b60405161050a91906133a1565b60405180910390f35b34801561051e575f80fd5b506105396004803603810190610534919061371d565b611007565b6040516105469190613704565b60405180910390f35b34801561055a575f80fd5b506105636110ad565b6040516105709190613444565b60405180910390f35b348015610584575f80fd5b5061059f600480360381019061059a9190613497565b611139565b6040516105ac9190613501565b60405180910390f35b3480156105c0575f80fd5b506105c961114a565b6040516105d691906137f3565b60405180910390f35b3480156105ea575f80fd5b506106056004803603810190610600919061371d565b61116f565b005b348015610612575f80fd5b5061061b61122e565b6040516106289190613704565b60405180910390f35b34801561063c575f80fd5b506106576004803603810190610652919061371d565b611234565b6040516106649190613704565b60405180910390f35b348015610678575f80fd5b506106816112e9565b005b34801561068e575f80fd5b506106a960048036038101906106a491906136ae565b611370565b005b3480156106b6575f80fd5b506106bf6113ff565b6040516106cc9190613501565b60405180910390f35b3480156106e0575f80fd5b506106fb60048036038101906106f691906138d0565b611427565b6040516107099291906139ce565b60405180910390f35b34801561071d575f80fd5b5061073860048036038101906107339190613497565b611645565b005b348015610745575f80fd5b5061074e6116cb565b60405161075b9190613444565b60405180910390f35b34801561076f575f80fd5b5061077861175b565b6040516107859190613704565b60405180910390f35b348015610799575f80fd5b506107b460048036038101906107af9190613748565b611761565b005b3480156107c1575f80fd5b506107dc60048036038101906107d79190613a2d565b6118f1565b005b3480156107e9575f80fd5b506107f2611a63565b6040516107ff9190613444565b60405180910390f35b348015610813575f80fd5b5061081c611aef565b6040516108299190613704565b60405180910390f35b34801561083d575f80fd5b50610846611af5565b604051610854929190613a6b565b60405180910390f35b348015610868575f80fd5b50610883600480360381019061087e919061371d565b611b14565b005b348015610890575f80fd5b50610899611c5a565b6040516108a69190613444565b60405180910390f35b3480156108ba575f80fd5b506108d560048036038101906108d09190613748565b611ce6565b005b3480156108e2575f80fd5b506108fd60048036038101906108f89190613b30565b611e24565b005b34801561090a575f80fd5b5061092560048036038101906109209190613bb0565b611e96565b005b348015610932575f80fd5b5061094d60048036038101906109489190613497565b611f2f565b60405161095a9190613444565b60405180910390f35b34801561096e575f80fd5b50610977612080565b6040516109849190613444565b60405180910390f35b348015610998575f80fd5b506109a161210c565b6040516109ae9190613704565b60405180910390f35b3480156109c2575f80fd5b506109dd60048036038101906109d89190613bb0565b612112565b005b3480156109ea575f80fd5b50610a056004803603810190610a009190613bdb565b6121aa565b604051610a1291906133a1565b60405180910390f35b348015610a26575f80fd5b50610a416004803603810190610a3c91906138d0565b612238565b005b348015610a4e575f80fd5b50610a696004803603810190610a64919061371d565b612313565b005b610a856004803603810190610a8091906138d0565b612409565b005b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b115750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610b2790613c46565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5390613c46565b8015610b9e5780601f10610b7557610100808354040283529160200191610b9e565b820191905f5260205f20905b815481529060010190602001808311610b8157829003601f168201915b5050505050905090565b5f610bb282612701565b610be8576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610c2a8261275b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c91576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cb061281e565b73ffffffffffffffffffffffffffffffffffffffff1614610d1357610cdc81610cd761281e565b6121aa565b610d12576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610dca612825565b73ffffffffffffffffffffffffffffffffffffffff16610de86113ff565b73ffffffffffffffffffffffffffffffffffffffff1614610e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3590613cc0565b60405180910390fd5b80600c9081610e4d9190613e72565b5050565b5f610e5a61282c565b6001545f540303905090565b600e602052805f5260405f205f915090505481565b610e86838383612834565b505050565b600f602052805f5260405f205f915054906101000a900460ff1681565b610ec283838360405180602001604052805f815250611e24565b505050565b610ecf612825565b73ffffffffffffffffffffffffffffffffffffffff16610eed6113ff565b73ffffffffffffffffffffffffffffffffffffffff1614610f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3a90613cc0565b60405180910390fd5b8060149081610f529190613e72565b5050565b600d5f9054906101000a900460ff1681565b600c8054610f7590613c46565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa190613c46565b8015610fec5780601f10610fc357610100808354040283529160200191610fec565b820191905f5260205f20905b815481529060010190602001808311610fcf57829003601f168201915b505050505081565b600d60019054906101000a900460ff1681565b5f80600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016110639190613501565b602060405180830381865afa15801561107e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a29190613f55565b905080915050919050565b600b80546110ba90613c46565b80601f01602080910402602001604051908101604052809291908181526020018280546110e690613c46565b80156111315780601f1061110857610100808354040283529160200191611131565b820191905f5260205f20905b81548152906001019060200180831161111457829003601f168201915b505050505081565b5f6111438261275b565b9050919050565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611177612825565b73ffffffffffffffffffffffffffffffffffffffff166111956113ff565b73ffffffffffffffffffffffffffffffffffffffff16146111eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e290613cc0565b60405180910390fd5b80600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60125481565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361129a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b6112f1612825565b73ffffffffffffffffffffffffffffffffffffffff1661130f6113ff565b73ffffffffffffffffffffffffffffffffffffffff1614611365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135c90613cc0565b60405180910390fd5b61136e5f612bc5565b565b611378612825565b73ffffffffffffffffffffffffffffffffffffffff166113966113ff565b73ffffffffffffffffffffffffffffffffffffffff16146113ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e390613cc0565b60405180910390fd5b80600b90816113fb9190613e72565b5050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060805f805f5b85518110156114a8575f1515600f5f8884815181106114505761144f613f80565b5b602002602001015181526020019081526020015f205f9054906101000a900460ff1615150361148c57818061148490613fda565b92505061149b565b828061149790613fda565b9350505b808060010191505061142e565b505f8167ffffffffffffffff8111156114c4576114c361358a565b5b6040519080825280602002602001820160405280156114f25781602001602082028036833780820191505090505b5090505f8367ffffffffffffffff8111156115105761150f61358a565b5b60405190808252806020026020018201604052801561153e5781602001602082028036833780820191505090505b5090505f805f5b8951811015611633575f1515600f5f8c848151811061156757611566613f80565b5b602002602001015181526020019081526020015f205f9054906101000a900460ff161515036115dd578981815181106115a3576115a2613f80565b5b60200260200101518584815181106115be576115bd613f80565b5b60200260200101818152505082806115d590613fda565b935050611626565b8981815181106115f0576115ef613f80565b5b602002602001015184838151811061160b5761160a613f80565b5b602002602001018181525050818061162290613fda565b9250505b8080600101915050611545565b50838397509750505050505050915091565b61164d612825565b73ffffffffffffffffffffffffffffffffffffffff1661166b6113ff565b73ffffffffffffffffffffffffffffffffffffffff16146116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b890613cc0565b60405180910390fd5b8060138190555050565b6060600380546116da90613c46565b80601f016020809104026020016040519081016040528092919081815260200182805461170690613c46565b80156117515780601f1061172857610100808354040283529160200191611751565b820191905f5260205f20905b81548152906001019060200180831161173457829003601f168201915b5050505050905090565b60135481565b611769612825565b73ffffffffffffffffffffffffffffffffffffffff166117876113ff565b73ffffffffffffffffffffffffffffffffffffffff16146117dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d490613cc0565b60405180910390fd5b600260095403611822576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118199061406b565b60405180910390fd5b60026009819055508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401611865929190614089565b6020604051808303815f875af1158015611881573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118a591906140c4565b6118e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118db90614139565b60405180910390fd5b6001600981905550505050565b6118f961281e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361195d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060075f61196961281e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a1261281e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a5791906133a1565b60405180910390a35050565b60148054611a7090613c46565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9c90613c46565b8015611ae75780601f10611abe57610100808354040283529160200191611ae7565b820191905f5260205f20905b815481529060010190602001808311611aca57829003601f168201915b505050505081565b60115481565b5f805f611b00610e51565b90505f601054905081819350935050509091565b611b1c612825565b73ffffffffffffffffffffffffffffffffffffffff16611b3a6113ff565b73ffffffffffffffffffffffffffffffffffffffff1614611b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8790613cc0565b60405180910390fd5b600260095403611bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcc9061406b565b60405180910390fd5b60026009819055505f8173ffffffffffffffffffffffffffffffffffffffff1647604051611c0290614184565b5f6040518083038185875af1925050503d805f8114611c3c576040519150601f19603f3d011682016040523d82523d5f602084013e611c41565b606091505b5050905080611c4e575f80fd5b50600160098190555050565b60168054611c6790613c46565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9390613c46565b8015611cde5780601f10611cb557610100808354040283529160200191611cde565b820191905f5260205f20905b815481529060010190602001808311611cc157829003601f168201915b505050505081565b611cee612825565b73ffffffffffffffffffffffffffffffffffffffff16611d0c6113ff565b73ffffffffffffffffffffffffffffffffffffffff1614611d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5990613cc0565b60405180910390fd5b600260095403611da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9e9061406b565b60405180910390fd5b60026009819055508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401611dea929190614089565b5f604051808303815f87803b158015611e01575f80fd5b505af1158015611e13573d5f803e3d5ffd5b505050506001600981905550505050565b611e2f848484612834565b5f8373ffffffffffffffffffffffffffffffffffffffff163b14611e9057611e5984848484612c88565b611e8f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611e9e612825565b73ffffffffffffffffffffffffffffffffffffffff16611ebc6113ff565b73ffffffffffffffffffffffffffffffffffffffff1614611f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0990613cc0565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b6060611f3a82612701565b611f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7090614208565b60405180910390fd5b5f1515600d5f9054906101000a900460ff161515036120225760148054611f9f90613c46565b80601f0160208091040260200160405190810160405280929190818152602001828054611fcb90613c46565b80156120165780601f10611fed57610100808354040283529160200191612016565b820191905f5260205f20905b815481529060010190602001808311611ff957829003601f168201915b5050505050905061207b565b5f61202b612dd3565b90505f8151116120495760405180602001604052805f815250612077565b8061205384612e63565b600c604051602001612067939291906142e0565b6040516020818303038152906040525b9150505b919050565b6015805461208d90613c46565b80601f01602080910402602001604051908101604052809291908181526020018280546120b990613c46565b80156121045780601f106120db57610100808354040283529160200191612104565b820191905f5260205f20905b8154815290600101906020018083116120e757829003601f168201915b505050505081565b60105481565b61211a612825565b73ffffffffffffffffffffffffffffffffffffffff166121386113ff565b73ffffffffffffffffffffffffffffffffffffffff161461218e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218590613cc0565b60405180910390fd5b80600d5f6101000a81548160ff02191690831515021790555050565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b612240612825565b73ffffffffffffffffffffffffffffffffffffffff1661225e6113ff565b73ffffffffffffffffffffffffffffffffffffffff16146122b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ab90613cc0565b60405180910390fd5b5f5b815181101561230f576001600f5f8484815181106122d7576122d6613f80565b5b602002602001015181526020019081526020015f205f6101000a81548160ff02191690831515021790555080806001019150506122b6565b5050565b61231b612825565b73ffffffffffffffffffffffffffffffffffffffff166123396113ff565b73ffffffffffffffffffffffffffffffffffffffff161461238f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238690613cc0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f490614380565b60405180910390fd5b61240681612bc5565b50565b805180601354612419919061439e565b34101561245b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245290614429565b60405180910390fd5b60105481612467610e51565b6124719190614447565b11156124b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a9906144c4565b60405180910390fd5b5f1515600d60019054906101000a900460ff16151514612507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fe9061452c565b60405180910390fd5b60026009540361254c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125439061406b565b60405180910390fd5b60026009819055505f5b82518110156126d957612567612825565b73ffffffffffffffffffffffffffffffffffffffff16600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8584815181106125cd576125cc613f80565b5b60200260200101516040518263ffffffff1660e01b81526004016125f19190613704565b602060405180830381865afa15801561260c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612630919061455e565b73ffffffffffffffffffffffffffffffffffffffff1614801561268d57505f1515600f5f85848151811061266757612666613f80565b5b602002602001015181526020019081526020015f205f9054906101000a900460ff161515145b6126cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c3906145d3565b60405180910390fd5b8080600101915050612556565b506126ec6126e5612825565b8351612fbc565b6126f582612fd9565b60016009819055505050565b5f8161270b61282c565b1115801561271957505f5482105b801561275457505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f808290508061276961282c565b116127e7575f548110156127e6575f60045f8381526020019081526020015f205490505f7c01000000000000000000000000000000000000000000000000000000008216036127e4575b5f81036127da5760045f836001900393508381526020019081526020015f205490506127b3565b8092505050612819565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f33905090565b5f33905090565b5f6001905090565b5f61283e8261275b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146128a5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8473ffffffffffffffffffffffffffffffffffffffff166128c561281e565b73ffffffffffffffffffffffffffffffffffffffff1614806128f457506128f3856128ee61281e565b6121aa565b5b80612939575061290261281e565b73ffffffffffffffffffffffffffffffffffffffff1661292184610ba8565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612972576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036129d7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129e48585856001613038565b60065f8481526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b612ad88661303e565b171760045f8581526020019081526020015f20819055505f7c0200000000000000000000000000000000000000000000000000000000831603612b56575f6001840190505f60045f8381526020019081526020015f205403612b54575f548114612b53578260045f8381526020019081526020015f20819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bbe8585856001613047565b5050505050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612cad61281e565b8786866040518563ffffffff1660e01b8152600401612ccf9493929190614643565b6020604051808303815f875af1925050508015612d0a57506040513d601f19601f82011682018060405250810190612d0791906146a1565b60015b612d80573d805f8114612d38576040519150601f19603f3d011682016040523d82523d5f602084013e612d3d565b606091505b505f815103612d78576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b8054612de290613c46565b80601f0160208091040260200160405190810160405280929190818152602001828054612e0e90613c46565b8015612e595780601f10612e3057610100808354040283529160200191612e59565b820191905f5260205f20905b815481529060010190602001808311612e3c57829003601f168201915b5050505050905090565b60605f8203612ea9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612fb7565b5f8290505f5b5f8214612ed8578080612ec190613fda565b915050600a82612ed191906146f9565b9150612eaf565b5f8167ffffffffffffffff811115612ef357612ef261358a565b5b6040519080825280601f01601f191660200182016040528015612f255781602001600182028036833780820191505090505b5090505b5f8514612fb057600182612f3d9190614729565b9150600a85612f4c919061475c565b6030612f589190614447565b60f81b818381518110612f6e57612f6d613f80565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612fa991906146f9565b9450612f29565b8093505050505b919050565b612fd5828260405180602001604052805f81525061304d565b5050565b5f5b8151811015613034576001600f5f848481518110612ffc57612ffb613f80565b5b602002602001015181526020019081526020015f205f6101000a81548160ff0219169083151502179055508080600101915050612fdb565b5050565b50505050565b5f819050919050565b50505050565b5f805490505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036130b7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f83036130f0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130fc5f858386613038565b600160406001901b17830260055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555060e161315e600185146132ed565b901b60a042901b61316e8661303e565b171760045f8381526020019081526020015f20819055505f8190505f84820190505f8673ffffffffffffffffffffffffffffffffffffffff163b14613269575b818673ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461321b5f878480600101955087612c88565b613251576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106131ae57825f5414613264575f80fd5b6132d3565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061326a575b815f8190555050506132e75f858386613047565b50505050565b5f819050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61333b81613307565b8114613345575f80fd5b50565b5f8135905061335681613332565b92915050565b5f60208284031215613371576133706132ff565b5b5f61337e84828501613348565b91505092915050565b5f8115159050919050565b61339b81613387565b82525050565b5f6020820190506133b45f830184613392565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156133f15780820151818401526020810190506133d6565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613416826133ba565b61342081856133c4565b93506134308185602086016133d4565b613439816133fc565b840191505092915050565b5f6020820190508181035f83015261345c818461340c565b905092915050565b5f819050919050565b61347681613464565b8114613480575f80fd5b50565b5f813590506134918161346d565b92915050565b5f602082840312156134ac576134ab6132ff565b5b5f6134b984828501613483565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6134eb826134c2565b9050919050565b6134fb816134e1565b82525050565b5f6020820190506135145f8301846134f2565b92915050565b613523816134e1565b811461352d575f80fd5b50565b5f8135905061353e8161351a565b92915050565b5f806040838503121561355a576135596132ff565b5b5f61356785828601613530565b925050602061357885828601613483565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6135c0826133fc565b810181811067ffffffffffffffff821117156135df576135de61358a565b5b80604052505050565b5f6135f16132f6565b90506135fd82826135b7565b919050565b5f67ffffffffffffffff82111561361c5761361b61358a565b5b613625826133fc565b9050602081019050919050565b828183375f83830152505050565b5f61365261364d84613602565b6135e8565b90508281526020810184848401111561366e5761366d613586565b5b613679848285613632565b509392505050565b5f82601f83011261369557613694613582565b5b81356136a5848260208601613640565b91505092915050565b5f602082840312156136c3576136c26132ff565b5b5f82013567ffffffffffffffff8111156136e0576136df613303565b5b6136ec84828501613681565b91505092915050565b6136fe81613464565b82525050565b5f6020820190506137175f8301846136f5565b92915050565b5f60208284031215613732576137316132ff565b5b5f61373f84828501613530565b91505092915050565b5f805f6060848603121561375f5761375e6132ff565b5b5f61376c86828701613530565b935050602061377d86828701613530565b925050604061378e86828701613483565b9150509250925092565b5f819050919050565b5f6137bb6137b66137b1846134c2565b613798565b6134c2565b9050919050565b5f6137cc826137a1565b9050919050565b5f6137dd826137c2565b9050919050565b6137ed816137d3565b82525050565b5f6020820190506138065f8301846137e4565b92915050565b5f67ffffffffffffffff8211156138265761382561358a565b5b602082029050602081019050919050565b5f80fd5b5f61384d6138488461380c565b6135e8565b905080838252602082019050602084028301858111156138705761386f613837565b5b835b8181101561389957806138858882613483565b845260208401935050602081019050613872565b5050509392505050565b5f82601f8301126138b7576138b6613582565b5b81356138c784826020860161383b565b91505092915050565b5f602082840312156138e5576138e46132ff565b5b5f82013567ffffffffffffffff81111561390257613901613303565b5b61390e848285016138a3565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61394981613464565b82525050565b5f61395a8383613940565b60208301905092915050565b5f602082019050919050565b5f61397c82613917565b6139868185613921565b935061399183613931565b805f5b838110156139c15781516139a8888261394f565b97506139b383613966565b925050600181019050613994565b5085935050505092915050565b5f6040820190508181035f8301526139e68185613972565b905081810360208301526139fa8184613972565b90509392505050565b613a0c81613387565b8114613a16575f80fd5b50565b5f81359050613a2781613a03565b92915050565b5f8060408385031215613a4357613a426132ff565b5b5f613a5085828601613530565b9250506020613a6185828601613a19565b9150509250929050565b5f604082019050613a7e5f8301856136f5565b613a8b60208301846136f5565b9392505050565b5f67ffffffffffffffff821115613aac57613aab61358a565b5b613ab5826133fc565b9050602081019050919050565b5f613ad4613acf84613a92565b6135e8565b905082815260208101848484011115613af057613aef613586565b5b613afb848285613632565b509392505050565b5f82601f830112613b1757613b16613582565b5b8135613b27848260208601613ac2565b91505092915050565b5f805f8060808587031215613b4857613b476132ff565b5b5f613b5587828801613530565b9450506020613b6687828801613530565b9350506040613b7787828801613483565b925050606085013567ffffffffffffffff811115613b9857613b97613303565b5b613ba487828801613b03565b91505092959194509250565b5f60208284031215613bc557613bc46132ff565b5b5f613bd284828501613a19565b91505092915050565b5f8060408385031215613bf157613bf06132ff565b5b5f613bfe85828601613530565b9250506020613c0f85828601613530565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613c5d57607f821691505b602082108103613c7057613c6f613c19565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613caa6020836133c4565b9150613cb582613c76565b602082019050919050565b5f6020820190508181035f830152613cd781613c9e565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613d3a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613cff565b613d448683613cff565b95508019841693508086168417925050509392505050565b5f613d76613d71613d6c84613464565b613798565b613464565b9050919050565b5f819050919050565b613d8f83613d5c565b613da3613d9b82613d7d565b848454613d0b565b825550505050565b5f90565b613db7613dab565b613dc2818484613d86565b505050565b5b81811015613de557613dda5f82613daf565b600181019050613dc8565b5050565b601f821115613e2a57613dfb81613cde565b613e0484613cf0565b81016020851015613e13578190505b613e27613e1f85613cf0565b830182613dc7565b50505b505050565b5f82821c905092915050565b5f613e4a5f1984600802613e2f565b1980831691505092915050565b5f613e628383613e3b565b9150826002028217905092915050565b613e7b826133ba565b67ffffffffffffffff811115613e9457613e9361358a565b5b613e9e8254613c46565b613ea9828285613de9565b5f60209050601f831160018114613eda575f8415613ec8578287015190505b613ed28582613e57565b865550613f39565b601f198416613ee886613cde565b5f5b82811015613f0f57848901518255600182019150602085019450602081019050613eea565b86831015613f2c5784890151613f28601f891682613e3b565b8355505b6001600288020188555050505b505050505050565b5f81519050613f4f8161346d565b92915050565b5f60208284031215613f6a57613f696132ff565b5b5f613f7784828501613f41565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613fe482613464565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361401657614015613fad565b5b600182019050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f614055601f836133c4565b915061406082614021565b602082019050919050565b5f6020820190508181035f83015261408281614049565b9050919050565b5f60408201905061409c5f8301856134f2565b6140a960208301846136f5565b9392505050565b5f815190506140be81613a03565b92915050565b5f602082840312156140d9576140d86132ff565b5b5f6140e6848285016140b0565b91505092915050565b7f436f756c64206e6f74207472616e73666572206f757420746f6b656e732100005f82015250565b5f614123601e836133c4565b915061412e826140ef565b602082019050919050565b5f6020820190508181035f83015261415081614117565b9050919050565b5f81905092915050565b50565b5f61416f5f83614157565b915061417a82614161565b5f82019050919050565b5f61418e82614164565b9150819050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f6141f2602f836133c4565b91506141fd82614198565b604082019050919050565b5f6020820190508181035f83015261421f816141e6565b9050919050565b5f81905092915050565b5f61423a826133ba565b6142448185614226565b93506142548185602086016133d4565b80840191505092915050565b5f815461426c81613c46565b6142768186614226565b9450600182165f811461429057600181146142a5576142d7565b60ff19831686528115158202860193506142d7565b6142ae85613cde565b5f5b838110156142cf578154818901526001820191506020810190506142b0565b838801955050505b50505092915050565b5f6142eb8286614230565b91506142f78285614230565b91506143038284614260565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61436a6026836133c4565b915061437582614310565b604082019050919050565b5f6020820190508181035f8301526143978161435e565b9050919050565b5f6143a882613464565b91506143b383613464565b92508282026143c181613464565b915082820484148315176143d8576143d7613fad565b5b5092915050565b7f496e73756666696369656e742046756e647300000000000000000000000000005f82015250565b5f6144136012836133c4565b915061441e826143df565b602082019050919050565b5f6020820190508181035f83015261444081614407565b9050919050565b5f61445182613464565b915061445c83613464565b925082820190508082111561447457614473613fad565b5b92915050565b7f4d696e7461626c6520737570706c7920657863656564656421000000000000005f82015250565b5f6144ae6019836133c4565b91506144b98261447a565b602082019050919050565b5f6020820190508181035f8301526144db816144a2565b9050919050565b7f436f6e74726163742070617573656400000000000000000000000000000000005f82015250565b5f614516600f836133c4565b9150614521826144e2565b602082019050919050565b5f6020820190508181035f8301526145438161450a565b9050919050565b5f815190506145588161351a565b92915050565b5f60208284031215614573576145726132ff565b5b5f6145808482850161454a565b91505092915050565b7f4e6f74204e4654206f776e6572206f72204e4654206e6f742076616c696400005f82015250565b5f6145bd601e836133c4565b91506145c882614589565b602082019050919050565b5f6020820190508181035f8301526145ea816145b1565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f614615826145f1565b61461f81856145fb565b935061462f8185602086016133d4565b614638816133fc565b840191505092915050565b5f6080820190506146565f8301876134f2565b61466360208301866134f2565b61467060408301856136f5565b8181036060830152614682818461460b565b905095945050505050565b5f8151905061469b81613332565b92915050565b5f602082840312156146b6576146b56132ff565b5b5f6146c38482850161468d565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61470382613464565b915061470e83613464565b92508261471e5761471d6146cc565b5b828204905092915050565b5f61473382613464565b915061473e83613464565b925082820390508181111561475657614755613fad565b5b92915050565b5f61476682613464565b915061477183613464565b925082614781576147806146cc565b5b82820690509291505056fea2646970667358221220160bdb8133fc2e3b756b755f7103f9cde677375f0856741d8a6a053c933b81f464736f6c63430008160033697066733a2f2f516d59785239773669696177643444627877423278454a7a55615831373672704559506d6a5679725161684664702f

Deployed Bytecode

0x608060405260043610610280575f3560e01c80638da5cb5b1161014e578063b09f1266116100c0578063d5abeb0111610079578063d5abeb011461098d578063e0a80853146109b7578063e985e9c5146109df578063f044951314610a1b578063f2fde38b14610a43578063f8e93ef914610a6b57610287565b8063b09f126614610885578063b236ff82146108af578063b88d4fde146108d7578063bedb86fb146108ff578063c87b56dd14610927578063d28d88521461096357610287565b80639db5dbe4116101125780639db5dbe41461078e578063a22cb465146107b6578063a45ba8e7146107de578063aa4bde2814610808578063ac72200d14610832578063af933b571461085d57610287565b80638da5cb5b146106ab5780638e09a116146106d557806391b7f5ed1461071257806395d89b411461073a5780639d03e6d01461076457610287565b806351830227116101f257806365627f15116101ab57806365627f15146105b557806369d03738146105df5780636f0b78711461060757806370a0823114610631578063715018a61461066d5780637ec4a6591461068357610287565b806351830227146104955780635503a0e8146104bf5780635c975abb146104e95780635f5152261461051357806362b99ad41461054f5780636352211e1461057957610287565b806318160ddd1161024457806318160ddd1461037b5780631e7269c5146103a557806323b872dd146103e15780634272f4471461040957806342842e0e146104455780634fdd43cb1461046d57610287565b806301ffc9a71461028957806306fdde03146102c5578063081812fc146102ef578063095ea7b31461032b57806316ba10e01461035357610287565b3661028757005b005b348015610294575f80fd5b506102af60048036038101906102aa919061335c565b610a87565b6040516102bc91906133a1565b60405180910390f35b3480156102d0575f80fd5b506102d9610b18565b6040516102e69190613444565b60405180910390f35b3480156102fa575f80fd5b5061031560048036038101906103109190613497565b610ba8565b6040516103229190613501565b60405180910390f35b348015610336575f80fd5b50610351600480360381019061034c9190613544565b610c20565b005b34801561035e575f80fd5b50610379600480360381019061037491906136ae565b610dc2565b005b348015610386575f80fd5b5061038f610e51565b60405161039c9190613704565b60405180910390f35b3480156103b0575f80fd5b506103cb60048036038101906103c6919061371d565b610e66565b6040516103d89190613704565b60405180910390f35b3480156103ec575f80fd5b5061040760048036038101906104029190613748565b610e7b565b005b348015610414575f80fd5b5061042f600480360381019061042a9190613497565b610e8b565b60405161043c91906133a1565b60405180910390f35b348015610450575f80fd5b5061046b60048036038101906104669190613748565b610ea8565b005b348015610478575f80fd5b50610493600480360381019061048e91906136ae565b610ec7565b005b3480156104a0575f80fd5b506104a9610f56565b6040516104b691906133a1565b60405180910390f35b3480156104ca575f80fd5b506104d3610f68565b6040516104e09190613444565b60405180910390f35b3480156104f4575f80fd5b506104fd610ff4565b60405161050a91906133a1565b60405180910390f35b34801561051e575f80fd5b506105396004803603810190610534919061371d565b611007565b6040516105469190613704565b60405180910390f35b34801561055a575f80fd5b506105636110ad565b6040516105709190613444565b60405180910390f35b348015610584575f80fd5b5061059f600480360381019061059a9190613497565b611139565b6040516105ac9190613501565b60405180910390f35b3480156105c0575f80fd5b506105c961114a565b6040516105d691906137f3565b60405180910390f35b3480156105ea575f80fd5b506106056004803603810190610600919061371d565b61116f565b005b348015610612575f80fd5b5061061b61122e565b6040516106289190613704565b60405180910390f35b34801561063c575f80fd5b506106576004803603810190610652919061371d565b611234565b6040516106649190613704565b60405180910390f35b348015610678575f80fd5b506106816112e9565b005b34801561068e575f80fd5b506106a960048036038101906106a491906136ae565b611370565b005b3480156106b6575f80fd5b506106bf6113ff565b6040516106cc9190613501565b60405180910390f35b3480156106e0575f80fd5b506106fb60048036038101906106f691906138d0565b611427565b6040516107099291906139ce565b60405180910390f35b34801561071d575f80fd5b5061073860048036038101906107339190613497565b611645565b005b348015610745575f80fd5b5061074e6116cb565b60405161075b9190613444565b60405180910390f35b34801561076f575f80fd5b5061077861175b565b6040516107859190613704565b60405180910390f35b348015610799575f80fd5b506107b460048036038101906107af9190613748565b611761565b005b3480156107c1575f80fd5b506107dc60048036038101906107d79190613a2d565b6118f1565b005b3480156107e9575f80fd5b506107f2611a63565b6040516107ff9190613444565b60405180910390f35b348015610813575f80fd5b5061081c611aef565b6040516108299190613704565b60405180910390f35b34801561083d575f80fd5b50610846611af5565b604051610854929190613a6b565b60405180910390f35b348015610868575f80fd5b50610883600480360381019061087e919061371d565b611b14565b005b348015610890575f80fd5b50610899611c5a565b6040516108a69190613444565b60405180910390f35b3480156108ba575f80fd5b506108d560048036038101906108d09190613748565b611ce6565b005b3480156108e2575f80fd5b506108fd60048036038101906108f89190613b30565b611e24565b005b34801561090a575f80fd5b5061092560048036038101906109209190613bb0565b611e96565b005b348015610932575f80fd5b5061094d60048036038101906109489190613497565b611f2f565b60405161095a9190613444565b60405180910390f35b34801561096e575f80fd5b50610977612080565b6040516109849190613444565b60405180910390f35b348015610998575f80fd5b506109a161210c565b6040516109ae9190613704565b60405180910390f35b3480156109c2575f80fd5b506109dd60048036038101906109d89190613bb0565b612112565b005b3480156109ea575f80fd5b50610a056004803603810190610a009190613bdb565b6121aa565b604051610a1291906133a1565b60405180910390f35b348015610a26575f80fd5b50610a416004803603810190610a3c91906138d0565b612238565b005b348015610a4e575f80fd5b50610a696004803603810190610a64919061371d565b612313565b005b610a856004803603810190610a8091906138d0565b612409565b005b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b115750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610b2790613c46565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5390613c46565b8015610b9e5780601f10610b7557610100808354040283529160200191610b9e565b820191905f5260205f20905b815481529060010190602001808311610b8157829003601f168201915b5050505050905090565b5f610bb282612701565b610be8576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610c2a8261275b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c91576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cb061281e565b73ffffffffffffffffffffffffffffffffffffffff1614610d1357610cdc81610cd761281e565b6121aa565b610d12576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610dca612825565b73ffffffffffffffffffffffffffffffffffffffff16610de86113ff565b73ffffffffffffffffffffffffffffffffffffffff1614610e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3590613cc0565b60405180910390fd5b80600c9081610e4d9190613e72565b5050565b5f610e5a61282c565b6001545f540303905090565b600e602052805f5260405f205f915090505481565b610e86838383612834565b505050565b600f602052805f5260405f205f915054906101000a900460ff1681565b610ec283838360405180602001604052805f815250611e24565b505050565b610ecf612825565b73ffffffffffffffffffffffffffffffffffffffff16610eed6113ff565b73ffffffffffffffffffffffffffffffffffffffff1614610f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3a90613cc0565b60405180910390fd5b8060149081610f529190613e72565b5050565b600d5f9054906101000a900460ff1681565b600c8054610f7590613c46565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa190613c46565b8015610fec5780601f10610fc357610100808354040283529160200191610fec565b820191905f5260205f20905b815481529060010190602001808311610fcf57829003601f168201915b505050505081565b600d60019054906101000a900460ff1681565b5f80600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016110639190613501565b602060405180830381865afa15801561107e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a29190613f55565b905080915050919050565b600b80546110ba90613c46565b80601f01602080910402602001604051908101604052809291908181526020018280546110e690613c46565b80156111315780601f1061110857610100808354040283529160200191611131565b820191905f5260205f20905b81548152906001019060200180831161111457829003601f168201915b505050505081565b5f6111438261275b565b9050919050565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611177612825565b73ffffffffffffffffffffffffffffffffffffffff166111956113ff565b73ffffffffffffffffffffffffffffffffffffffff16146111eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e290613cc0565b60405180910390fd5b80600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60125481565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361129a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b6112f1612825565b73ffffffffffffffffffffffffffffffffffffffff1661130f6113ff565b73ffffffffffffffffffffffffffffffffffffffff1614611365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135c90613cc0565b60405180910390fd5b61136e5f612bc5565b565b611378612825565b73ffffffffffffffffffffffffffffffffffffffff166113966113ff565b73ffffffffffffffffffffffffffffffffffffffff16146113ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e390613cc0565b60405180910390fd5b80600b90816113fb9190613e72565b5050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060805f805f5b85518110156114a8575f1515600f5f8884815181106114505761144f613f80565b5b602002602001015181526020019081526020015f205f9054906101000a900460ff1615150361148c57818061148490613fda565b92505061149b565b828061149790613fda565b9350505b808060010191505061142e565b505f8167ffffffffffffffff8111156114c4576114c361358a565b5b6040519080825280602002602001820160405280156114f25781602001602082028036833780820191505090505b5090505f8367ffffffffffffffff8111156115105761150f61358a565b5b60405190808252806020026020018201604052801561153e5781602001602082028036833780820191505090505b5090505f805f5b8951811015611633575f1515600f5f8c848151811061156757611566613f80565b5b602002602001015181526020019081526020015f205f9054906101000a900460ff161515036115dd578981815181106115a3576115a2613f80565b5b60200260200101518584815181106115be576115bd613f80565b5b60200260200101818152505082806115d590613fda565b935050611626565b8981815181106115f0576115ef613f80565b5b602002602001015184838151811061160b5761160a613f80565b5b602002602001018181525050818061162290613fda565b9250505b8080600101915050611545565b50838397509750505050505050915091565b61164d612825565b73ffffffffffffffffffffffffffffffffffffffff1661166b6113ff565b73ffffffffffffffffffffffffffffffffffffffff16146116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b890613cc0565b60405180910390fd5b8060138190555050565b6060600380546116da90613c46565b80601f016020809104026020016040519081016040528092919081815260200182805461170690613c46565b80156117515780601f1061172857610100808354040283529160200191611751565b820191905f5260205f20905b81548152906001019060200180831161173457829003601f168201915b5050505050905090565b60135481565b611769612825565b73ffffffffffffffffffffffffffffffffffffffff166117876113ff565b73ffffffffffffffffffffffffffffffffffffffff16146117dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d490613cc0565b60405180910390fd5b600260095403611822576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118199061406b565b60405180910390fd5b60026009819055508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401611865929190614089565b6020604051808303815f875af1158015611881573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118a591906140c4565b6118e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118db90614139565b60405180910390fd5b6001600981905550505050565b6118f961281e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361195d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060075f61196961281e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a1261281e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a5791906133a1565b60405180910390a35050565b60148054611a7090613c46565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9c90613c46565b8015611ae75780601f10611abe57610100808354040283529160200191611ae7565b820191905f5260205f20905b815481529060010190602001808311611aca57829003601f168201915b505050505081565b60115481565b5f805f611b00610e51565b90505f601054905081819350935050509091565b611b1c612825565b73ffffffffffffffffffffffffffffffffffffffff16611b3a6113ff565b73ffffffffffffffffffffffffffffffffffffffff1614611b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8790613cc0565b60405180910390fd5b600260095403611bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcc9061406b565b60405180910390fd5b60026009819055505f8173ffffffffffffffffffffffffffffffffffffffff1647604051611c0290614184565b5f6040518083038185875af1925050503d805f8114611c3c576040519150601f19603f3d011682016040523d82523d5f602084013e611c41565b606091505b5050905080611c4e575f80fd5b50600160098190555050565b60168054611c6790613c46565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9390613c46565b8015611cde5780601f10611cb557610100808354040283529160200191611cde565b820191905f5260205f20905b815481529060010190602001808311611cc157829003601f168201915b505050505081565b611cee612825565b73ffffffffffffffffffffffffffffffffffffffff16611d0c6113ff565b73ffffffffffffffffffffffffffffffffffffffff1614611d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5990613cc0565b60405180910390fd5b600260095403611da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9e9061406b565b60405180910390fd5b60026009819055508273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401611dea929190614089565b5f604051808303815f87803b158015611e01575f80fd5b505af1158015611e13573d5f803e3d5ffd5b505050506001600981905550505050565b611e2f848484612834565b5f8373ffffffffffffffffffffffffffffffffffffffff163b14611e9057611e5984848484612c88565b611e8f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611e9e612825565b73ffffffffffffffffffffffffffffffffffffffff16611ebc6113ff565b73ffffffffffffffffffffffffffffffffffffffff1614611f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0990613cc0565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b6060611f3a82612701565b611f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7090614208565b60405180910390fd5b5f1515600d5f9054906101000a900460ff161515036120225760148054611f9f90613c46565b80601f0160208091040260200160405190810160405280929190818152602001828054611fcb90613c46565b80156120165780601f10611fed57610100808354040283529160200191612016565b820191905f5260205f20905b815481529060010190602001808311611ff957829003601f168201915b5050505050905061207b565b5f61202b612dd3565b90505f8151116120495760405180602001604052805f815250612077565b8061205384612e63565b600c604051602001612067939291906142e0565b6040516020818303038152906040525b9150505b919050565b6015805461208d90613c46565b80601f01602080910402602001604051908101604052809291908181526020018280546120b990613c46565b80156121045780601f106120db57610100808354040283529160200191612104565b820191905f5260205f20905b8154815290600101906020018083116120e757829003601f168201915b505050505081565b60105481565b61211a612825565b73ffffffffffffffffffffffffffffffffffffffff166121386113ff565b73ffffffffffffffffffffffffffffffffffffffff161461218e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218590613cc0565b60405180910390fd5b80600d5f6101000a81548160ff02191690831515021790555050565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b612240612825565b73ffffffffffffffffffffffffffffffffffffffff1661225e6113ff565b73ffffffffffffffffffffffffffffffffffffffff16146122b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ab90613cc0565b60405180910390fd5b5f5b815181101561230f576001600f5f8484815181106122d7576122d6613f80565b5b602002602001015181526020019081526020015f205f6101000a81548160ff02191690831515021790555080806001019150506122b6565b5050565b61231b612825565b73ffffffffffffffffffffffffffffffffffffffff166123396113ff565b73ffffffffffffffffffffffffffffffffffffffff161461238f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238690613cc0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f490614380565b60405180910390fd5b61240681612bc5565b50565b805180601354612419919061439e565b34101561245b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245290614429565b60405180910390fd5b60105481612467610e51565b6124719190614447565b11156124b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a9906144c4565b60405180910390fd5b5f1515600d60019054906101000a900460ff16151514612507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fe9061452c565b60405180910390fd5b60026009540361254c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125439061406b565b60405180910390fd5b60026009819055505f5b82518110156126d957612567612825565b73ffffffffffffffffffffffffffffffffffffffff16600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e8584815181106125cd576125cc613f80565b5b60200260200101516040518263ffffffff1660e01b81526004016125f19190613704565b602060405180830381865afa15801561260c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612630919061455e565b73ffffffffffffffffffffffffffffffffffffffff1614801561268d57505f1515600f5f85848151811061266757612666613f80565b5b602002602001015181526020019081526020015f205f9054906101000a900460ff161515145b6126cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c3906145d3565b60405180910390fd5b8080600101915050612556565b506126ec6126e5612825565b8351612fbc565b6126f582612fd9565b60016009819055505050565b5f8161270b61282c565b1115801561271957505f5482105b801561275457505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f808290508061276961282c565b116127e7575f548110156127e6575f60045f8381526020019081526020015f205490505f7c01000000000000000000000000000000000000000000000000000000008216036127e4575b5f81036127da5760045f836001900393508381526020019081526020015f205490506127b3565b8092505050612819565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f33905090565b5f33905090565b5f6001905090565b5f61283e8261275b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146128a5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8473ffffffffffffffffffffffffffffffffffffffff166128c561281e565b73ffffffffffffffffffffffffffffffffffffffff1614806128f457506128f3856128ee61281e565b6121aa565b5b80612939575061290261281e565b73ffffffffffffffffffffffffffffffffffffffff1661292184610ba8565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612972576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036129d7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129e48585856001613038565b60065f8481526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b612ad88661303e565b171760045f8581526020019081526020015f20819055505f7c0200000000000000000000000000000000000000000000000000000000831603612b56575f6001840190505f60045f8381526020019081526020015f205403612b54575f548114612b53578260045f8381526020019081526020015f20819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bbe8585856001613047565b5050505050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612cad61281e565b8786866040518563ffffffff1660e01b8152600401612ccf9493929190614643565b6020604051808303815f875af1925050508015612d0a57506040513d601f19601f82011682018060405250810190612d0791906146a1565b60015b612d80573d805f8114612d38576040519150601f19603f3d011682016040523d82523d5f602084013e612d3d565b606091505b505f815103612d78576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b8054612de290613c46565b80601f0160208091040260200160405190810160405280929190818152602001828054612e0e90613c46565b8015612e595780601f10612e3057610100808354040283529160200191612e59565b820191905f5260205f20905b815481529060010190602001808311612e3c57829003601f168201915b5050505050905090565b60605f8203612ea9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612fb7565b5f8290505f5b5f8214612ed8578080612ec190613fda565b915050600a82612ed191906146f9565b9150612eaf565b5f8167ffffffffffffffff811115612ef357612ef261358a565b5b6040519080825280601f01601f191660200182016040528015612f255781602001600182028036833780820191505090505b5090505b5f8514612fb057600182612f3d9190614729565b9150600a85612f4c919061475c565b6030612f589190614447565b60f81b818381518110612f6e57612f6d613f80565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612fa991906146f9565b9450612f29565b8093505050505b919050565b612fd5828260405180602001604052805f81525061304d565b5050565b5f5b8151811015613034576001600f5f848481518110612ffc57612ffb613f80565b5b602002602001015181526020019081526020015f205f6101000a81548160ff0219169083151502179055508080600101915050612fdb565b5050565b50505050565b5f819050919050565b50505050565b5f805490505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036130b7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f83036130f0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130fc5f858386613038565b600160406001901b17830260055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555060e161315e600185146132ed565b901b60a042901b61316e8661303e565b171760045f8381526020019081526020015f20819055505f8190505f84820190505f8673ffffffffffffffffffffffffffffffffffffffff163b14613269575b818673ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461321b5f878480600101955087612c88565b613251576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106131ae57825f5414613264575f80fd5b6132d3565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061326a575b815f8190555050506132e75f858386613047565b50505050565b5f819050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61333b81613307565b8114613345575f80fd5b50565b5f8135905061335681613332565b92915050565b5f60208284031215613371576133706132ff565b5b5f61337e84828501613348565b91505092915050565b5f8115159050919050565b61339b81613387565b82525050565b5f6020820190506133b45f830184613392565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156133f15780820151818401526020810190506133d6565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613416826133ba565b61342081856133c4565b93506134308185602086016133d4565b613439816133fc565b840191505092915050565b5f6020820190508181035f83015261345c818461340c565b905092915050565b5f819050919050565b61347681613464565b8114613480575f80fd5b50565b5f813590506134918161346d565b92915050565b5f602082840312156134ac576134ab6132ff565b5b5f6134b984828501613483565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6134eb826134c2565b9050919050565b6134fb816134e1565b82525050565b5f6020820190506135145f8301846134f2565b92915050565b613523816134e1565b811461352d575f80fd5b50565b5f8135905061353e8161351a565b92915050565b5f806040838503121561355a576135596132ff565b5b5f61356785828601613530565b925050602061357885828601613483565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6135c0826133fc565b810181811067ffffffffffffffff821117156135df576135de61358a565b5b80604052505050565b5f6135f16132f6565b90506135fd82826135b7565b919050565b5f67ffffffffffffffff82111561361c5761361b61358a565b5b613625826133fc565b9050602081019050919050565b828183375f83830152505050565b5f61365261364d84613602565b6135e8565b90508281526020810184848401111561366e5761366d613586565b5b613679848285613632565b509392505050565b5f82601f83011261369557613694613582565b5b81356136a5848260208601613640565b91505092915050565b5f602082840312156136c3576136c26132ff565b5b5f82013567ffffffffffffffff8111156136e0576136df613303565b5b6136ec84828501613681565b91505092915050565b6136fe81613464565b82525050565b5f6020820190506137175f8301846136f5565b92915050565b5f60208284031215613732576137316132ff565b5b5f61373f84828501613530565b91505092915050565b5f805f6060848603121561375f5761375e6132ff565b5b5f61376c86828701613530565b935050602061377d86828701613530565b925050604061378e86828701613483565b9150509250925092565b5f819050919050565b5f6137bb6137b66137b1846134c2565b613798565b6134c2565b9050919050565b5f6137cc826137a1565b9050919050565b5f6137dd826137c2565b9050919050565b6137ed816137d3565b82525050565b5f6020820190506138065f8301846137e4565b92915050565b5f67ffffffffffffffff8211156138265761382561358a565b5b602082029050602081019050919050565b5f80fd5b5f61384d6138488461380c565b6135e8565b905080838252602082019050602084028301858111156138705761386f613837565b5b835b8181101561389957806138858882613483565b845260208401935050602081019050613872565b5050509392505050565b5f82601f8301126138b7576138b6613582565b5b81356138c784826020860161383b565b91505092915050565b5f602082840312156138e5576138e46132ff565b5b5f82013567ffffffffffffffff81111561390257613901613303565b5b61390e848285016138a3565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61394981613464565b82525050565b5f61395a8383613940565b60208301905092915050565b5f602082019050919050565b5f61397c82613917565b6139868185613921565b935061399183613931565b805f5b838110156139c15781516139a8888261394f565b97506139b383613966565b925050600181019050613994565b5085935050505092915050565b5f6040820190508181035f8301526139e68185613972565b905081810360208301526139fa8184613972565b90509392505050565b613a0c81613387565b8114613a16575f80fd5b50565b5f81359050613a2781613a03565b92915050565b5f8060408385031215613a4357613a426132ff565b5b5f613a5085828601613530565b9250506020613a6185828601613a19565b9150509250929050565b5f604082019050613a7e5f8301856136f5565b613a8b60208301846136f5565b9392505050565b5f67ffffffffffffffff821115613aac57613aab61358a565b5b613ab5826133fc565b9050602081019050919050565b5f613ad4613acf84613a92565b6135e8565b905082815260208101848484011115613af057613aef613586565b5b613afb848285613632565b509392505050565b5f82601f830112613b1757613b16613582565b5b8135613b27848260208601613ac2565b91505092915050565b5f805f8060808587031215613b4857613b476132ff565b5b5f613b5587828801613530565b9450506020613b6687828801613530565b9350506040613b7787828801613483565b925050606085013567ffffffffffffffff811115613b9857613b97613303565b5b613ba487828801613b03565b91505092959194509250565b5f60208284031215613bc557613bc46132ff565b5b5f613bd284828501613a19565b91505092915050565b5f8060408385031215613bf157613bf06132ff565b5b5f613bfe85828601613530565b9250506020613c0f85828601613530565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613c5d57607f821691505b602082108103613c7057613c6f613c19565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613caa6020836133c4565b9150613cb582613c76565b602082019050919050565b5f6020820190508181035f830152613cd781613c9e565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613d3a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613cff565b613d448683613cff565b95508019841693508086168417925050509392505050565b5f613d76613d71613d6c84613464565b613798565b613464565b9050919050565b5f819050919050565b613d8f83613d5c565b613da3613d9b82613d7d565b848454613d0b565b825550505050565b5f90565b613db7613dab565b613dc2818484613d86565b505050565b5b81811015613de557613dda5f82613daf565b600181019050613dc8565b5050565b601f821115613e2a57613dfb81613cde565b613e0484613cf0565b81016020851015613e13578190505b613e27613e1f85613cf0565b830182613dc7565b50505b505050565b5f82821c905092915050565b5f613e4a5f1984600802613e2f565b1980831691505092915050565b5f613e628383613e3b565b9150826002028217905092915050565b613e7b826133ba565b67ffffffffffffffff811115613e9457613e9361358a565b5b613e9e8254613c46565b613ea9828285613de9565b5f60209050601f831160018114613eda575f8415613ec8578287015190505b613ed28582613e57565b865550613f39565b601f198416613ee886613cde565b5f5b82811015613f0f57848901518255600182019150602085019450602081019050613eea565b86831015613f2c5784890151613f28601f891682613e3b565b8355505b6001600288020188555050505b505050505050565b5f81519050613f4f8161346d565b92915050565b5f60208284031215613f6a57613f696132ff565b5b5f613f7784828501613f41565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613fe482613464565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361401657614015613fad565b5b600182019050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f614055601f836133c4565b915061406082614021565b602082019050919050565b5f6020820190508181035f83015261408281614049565b9050919050565b5f60408201905061409c5f8301856134f2565b6140a960208301846136f5565b9392505050565b5f815190506140be81613a03565b92915050565b5f602082840312156140d9576140d86132ff565b5b5f6140e6848285016140b0565b91505092915050565b7f436f756c64206e6f74207472616e73666572206f757420746f6b656e732100005f82015250565b5f614123601e836133c4565b915061412e826140ef565b602082019050919050565b5f6020820190508181035f83015261415081614117565b9050919050565b5f81905092915050565b50565b5f61416f5f83614157565b915061417a82614161565b5f82019050919050565b5f61418e82614164565b9150819050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f6141f2602f836133c4565b91506141fd82614198565b604082019050919050565b5f6020820190508181035f83015261421f816141e6565b9050919050565b5f81905092915050565b5f61423a826133ba565b6142448185614226565b93506142548185602086016133d4565b80840191505092915050565b5f815461426c81613c46565b6142768186614226565b9450600182165f811461429057600181146142a5576142d7565b60ff19831686528115158202860193506142d7565b6142ae85613cde565b5f5b838110156142cf578154818901526001820191506020810190506142b0565b838801955050505b50505092915050565b5f6142eb8286614230565b91506142f78285614230565b91506143038284614260565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61436a6026836133c4565b915061437582614310565b604082019050919050565b5f6020820190508181035f8301526143978161435e565b9050919050565b5f6143a882613464565b91506143b383613464565b92508282026143c181613464565b915082820484148315176143d8576143d7613fad565b5b5092915050565b7f496e73756666696369656e742046756e647300000000000000000000000000005f82015250565b5f6144136012836133c4565b915061441e826143df565b602082019050919050565b5f6020820190508181035f83015261444081614407565b9050919050565b5f61445182613464565b915061445c83613464565b925082820190508082111561447457614473613fad565b5b92915050565b7f4d696e7461626c6520737570706c7920657863656564656421000000000000005f82015250565b5f6144ae6019836133c4565b91506144b98261447a565b602082019050919050565b5f6020820190508181035f8301526144db816144a2565b9050919050565b7f436f6e74726163742070617573656400000000000000000000000000000000005f82015250565b5f614516600f836133c4565b9150614521826144e2565b602082019050919050565b5f6020820190508181035f8301526145438161450a565b9050919050565b5f815190506145588161351a565b92915050565b5f60208284031215614573576145726132ff565b5b5f6145808482850161454a565b91505092915050565b7f4e6f74204e4654206f776e6572206f72204e4654206e6f742076616c696400005f82015250565b5f6145bd601e836133c4565b91506145c882614589565b602082019050919050565b5f6020820190508181035f8301526145ea816145b1565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f614615826145f1565b61461f81856145fb565b935061462f8185602086016133d4565b614638816133fc565b840191505092915050565b5f6080820190506146565f8301876134f2565b61466360208301866134f2565b61467060408301856136f5565b8181036060830152614682818461460b565b905095945050505050565b5f8151905061469b81613332565b92915050565b5f602082840312156146b6576146b56132ff565b5b5f6146c38482850161468d565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61470382613464565b915061470e83613464565b92508261471e5761471d6146cc565b5b828204905092915050565b5f61473382613464565b915061473e83613464565b925082820390508181111561475657614755613fad565b5b92915050565b5f61476682613464565b915061477183613464565b925082614781576147806146cc565b5b82820690509291505056fea2646970667358221220160bdb8133fc2e3b756b755f7103f9cde677375f0856741d8a6a053c933b81f464736f6c63430008160033

Deployed Bytecode Sourcemap

936:5064:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3656:465:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7129:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8494:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8045:443;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5068:99:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2892:282:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1216:38:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9160:129:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1260:37:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9295:144:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4717:131:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1146:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1111;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1180:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1973:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1077:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6986:137:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1042:28:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3177:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1382:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4127:216:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23860:140;;;;;;;;;;;;;:::i;:::-;;4854:99:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23542:131:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2129:956:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;3091:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7228:97:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1417:33:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5441:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8694:297:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1456:90:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1340:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5173:191;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;5835:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1603:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5654:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9445:329:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4636:75:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4111:429;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1553:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1304:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4550:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8997:157:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3280:170:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24006:269:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3618:387:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3656:465:0;3741:4;4051:10;4036:25;;:11;:25;;;;:54;;;;4080:10;4065:25;;:11;:25;;;;4036:54;:83;;;;4109:10;4094:25;;:11;:25;;;;4036:83;4017:102;;3656:465;;;:::o;7129:93::-;7183:13;7215:5;7208:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7129:93;:::o;8494:194::-;8562:7;8586:16;8594:7;8586;:16::i;:::-;8581:64;;8611:34;;;;;;;;;;;;;;8581:64;8662:15;:24;8678:7;8662:24;;;;;;;;;;;;;;;;;;;;;8655:31;;8494:194;;;:::o;8045:443::-;8117:13;8149:27;8168:7;8149:18;:27::i;:::-;8117:61;;8198:5;8192:11;;:2;:11;;;8188:48;;8212:24;;;;;;;;;;;;;;8188:48;8273:5;8250:28;;:19;:17;:19::i;:::-;:28;;;8246:159;;8297:44;8314:5;8321:19;:17;:19::i;:::-;8297:16;:44::i;:::-;8292:113;;8368:35;;;;;;;;;;;;;;8292:113;8246:159;8441:2;8414:15;:24;8430:7;8414:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;8478:7;8474:2;8458:28;;8467:5;8458:28;;;;;;;;;;;;8107:381;8045:443;;:::o;5068:99:1:-;23792:12:0;:10;:12::i;:::-;23781:23;;:7;:5;:7::i;:::-;:23;;;23773:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5155:10:1::1;5143:9;:22;;;;;;:::i;:::-;;5068:99:::0;:::o;2892:282:0:-;2945:7;3156:15;:13;:15::i;:::-;3141:12;;3125:13;;:28;:46;3118:53;;2892:282;:::o;1216:38:1:-;;;;;;;;;;;;;;;;;:::o;9160:129:0:-;9259:28;9269:4;9275:2;9279:7;9259:9;:28::i;:::-;9160:129;;;:::o;1260:37:1:-;;;;;;;;;;;;;;;;;;;;;;:::o;9295:144:0:-;9398:39;9415:4;9421:2;9425:7;9398:39;;;;;;;;;;;;:16;:39::i;:::-;9295:144;;;:::o;4717:131:1:-;23792:12:0;:10;:12::i;:::-;23781:23;;:7;:5;:7::i;:::-;:23;;;23773:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4828:18:1::1;4808:17;:38;;;;;;:::i;:::-;;4717:131:::0;:::o;1146:28::-;;;;;;;;;;;;;:::o;1111:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1180:25::-;;;;;;;;;;;;;:::o;1973:150::-;2031:7;2050:15;2068:12;;;;;;;;;;;:22;;;2091:5;2068:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2050:47;;2114:7;2107:14;;;1973:150;;;:::o;1077:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6986:137:0:-;7050:7;7092:27;7111:7;7092:18;:27::i;:::-;7069:52;;6986:137;;;:::o;1042:28:1:-;;;;;;;;;;;;;:::o;3177:97::-;23792:12:0;:10;:12::i;:::-;23781:23;;:7;:5;:7::i;:::-;:23;;;23773:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3266:5:1::1;3242:12;;:30;;;;;;;;;;;;;;;;;;3177:97:::0;:::o;1382:24::-;;;;:::o;4127:216:0:-;4191:7;4231:1;4214:19;;:5;:19;;;4210:60;;4242:28;;;;;;;;;;;;;;4210:60;223:13;4287:18;:25;4306:5;4287:25;;;;;;;;;;;;;;;;:54;4280:61;;4127:216;;;:::o;23860:140::-;23792:12;:10;:12::i;:::-;23781:23;;:7;:5;:7::i;:::-;:23;;;23773:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23968:30:::1;23995:1;23968:18;:30::i;:::-;23860:140::o:0;4854:99:1:-;23792:12:0;:10;:12::i;:::-;23781:23;;:7;:5;:7::i;:::-;:23;;;23773:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4941:10:1::1;4929:9;:22;;;;;;:::i;:::-;;4854:99:::0;:::o;23542:131:0:-;23588:7;23665:6;;;;;;;;;;;23658:13;;23542:131;:::o;2129:956:1:-;2194:16;2212;2249:21;2280:24;2320:9;2315:190;2339:8;:15;2335:1;:19;2315:190;;;2404:5;2379:30;;:8;:21;2388:8;2397:1;2388:11;;;;;;;;:::i;:::-;;;;;;;;2379:21;;;;;;;;;;;;;;;;;;;;;:30;;;2375:129;;2429:19;;;;;:::i;:::-;;;;2375:129;;;2486:16;;;;;:::i;:::-;;;;2375:129;2356:3;;;;;;;2315:190;;;;2515:30;2562:16;2548:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2515:64;;2589:27;2633:13;2619:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2589:58;;2657:25;2692:22;2730:9;2725:314;2749:8;:15;2745:1;:19;2725:314;;;2814:5;2789:30;;:8;:21;2798:8;2807:1;2798:11;;;;;;;;:::i;:::-;;;;;;;;2789:21;;;;;;;;;;;;;;;;;;;;;:30;;;2785:253;;2874:8;2883:1;2874:11;;;;;;;;:::i;:::-;;;;;;;;2839:13;2853:17;2839:32;;;;;;;;:::i;:::-;;;;;;;:46;;;;;2903:20;;;;;:::i;:::-;;;;2785:253;;;2990:8;2999:1;2990:11;;;;;;;;:::i;:::-;;;;;;;;2961:10;2972:14;2961:26;;;;;;;;:::i;:::-;;;;;;;:40;;;;;3019:17;;;;;:::i;:::-;;;;2785:253;2766:3;;;;;;;2725:314;;;;3057:13;3072:10;3049:34;;;;;;;;;;2129:956;;;:::o;3091:80::-;23792:12:0;:10;:12::i;:::-;23781:23;;:7;:5;:7::i;:::-;:23;;;23773:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3163:6:1::1;3152:8;:17;;;;3091:80:::0;:::o;7228:97:0:-;7284:13;7316:7;7309:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7228:97;:::o;1417:33:1:-;;;;:::o;5441:207::-;23792:12:0;:10;:12::i;:::-;23781:23;;:7;:5;:7::i;:::-;:23;;;23773:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22444:1:::1;22814:7;;:19:::0;22806:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22444:1;22943:7;:18;;;;5577:10:1::2;5561:36;;;5598:3;5603:7;5561:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5553:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;22401:1:0::1;22982:7;:22;;;;5441:207:1::0;;;:::o;8694:297:0:-;8804:19;:17;:19::i;:::-;8792:31;;:8;:31;;;8788:61;;8832:17;;;;;;;;;;;;;;8788:61;8911:8;8859:18;:39;8878:19;:17;:19::i;:::-;8859:39;;;;;;;;;;;;;;;:49;8899:8;8859:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;8970:8;8934:55;;8949:19;:17;:19::i;:::-;8934:55;;;8980:8;8934:55;;;;;;:::i;:::-;;;;;;;;8694:297;;:::o;1456:90:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1340:30::-;;;;:::o;5173:191::-;5215:7;5224;5243:18;5264:13;:11;:13::i;:::-;5243:34;;5287:20;5310:9;;5287:32;;5337:10;5349:12;5329:33;;;;;;5173:191;;:::o;5835:164::-;23792:12:0;:10;:12::i;:::-;23781:23;;:7;:5;:7::i;:::-;:23;;;23773:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22444:1:::1;22814:7;;:19:::0;22806:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22444:1;22943:7;:18;;;;5912:7:1::2;5933:3;5925:17;;5950:21;5925:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5911:65;;;5994:2;5986:11;;;::::0;::::2;;5901:98;22401:1:0::1;22982:7;:22;;;;5835:164:1::0;:::o;1603:32::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5654:167::-;23792:12:0;:10;:12::i;:::-;23781:23;;:7;:5;:7::i;:::-;:23;;;23773:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22444:1:::1;22814:7;;:19:::0;22806:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22444:1;22943:7;:18;;;;5785:10:1::2;5769:36;;;5806:3;5811:7;5769:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;22401:1:0::1;22982:7;:22;;;;5654:167:1::0;;;:::o;9445:329:0:-;9568:28;9578:4;9584:2;9588:7;9568:9;:28::i;:::-;9628:1;9610:2;:14;;;:19;9606:167;;9648:56;9679:4;9685:2;9689:7;9698:5;9648:30;:56::i;:::-;9643:130;;9731:40;;;;;;;;;;;;;;9643:130;9606:167;9445:329;;;;:::o;4636:75:1:-;23792:12:0;:10;:12::i;:::-;23781:23;;:7;:5;:7::i;:::-;:23;;;23773:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4703:6:1::1;4694;;:15;;;;;;;;;;;;;;;;;;4636:75:::0;:::o;4111:429::-;4185:13;4218:17;4226:8;4218:7;:17::i;:::-;4210:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;4313:5;4301:17;;:8;;;;;;;;;;;:17;;;4297:63;;4341:17;4334:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4297:63;4369:28;4400:10;:8;:10::i;:::-;4369:41;;4458:1;4433:14;4427:28;:32;:111;;;;;;;;;;;;;;;;;4486:14;4502:19;:8;:17;:19::i;:::-;4523:9;4469:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4427:111;4420:118;;;4111:429;;;;:::o;1553:44::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1304:30::-;;;;:::o;4550:80::-;23792:12:0;:10;:12::i;:::-;23781:23;;:7;:5;:7::i;:::-;:23;;;23773:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4622:6:1::1;4611:8;;:17;;;;;;;;;;;;;;;;;;4550:80:::0;:::o;8997:157:0:-;9094:4;9117:18;:25;9136:5;9117:25;;;;;;;;;;;;;;;:35;9143:8;9117:35;;;;;;;;;;;;;;;;;;;;;;;;;9110:42;;8997:157;;;;:::o;3280:170:1:-;23792:12:0;:10;:12::i;:::-;23781:23;;:7;:5;:7::i;:::-;:23;;;23773:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3368:9:1::1;3363:86;3387:6;:13;3383:1;:17;3363:86;;;3443:4;3421:8;:19;3430:6;3437:1;3430:9;;;;;;;;:::i;:::-;;;;;;;;3421:19;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;3402:3;;;;;;;3363:86;;;;3280:170:::0;:::o;24006:269:0:-;23792:12;:10;:12::i;:::-;23781:23;;:7;:5;:7::i;:::-;:23;;;23773:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24190:1:::1;24170:22;;:8;:22;;::::0;24162:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;24245:28;24264:8;24245:18;:28::i;:::-;24006:269:::0;:::o;3618:387:1:-;3689:8;:15;1779:11;1768:8;;:22;;;;:::i;:::-;1755:9;:35;;1747:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;1862:9;;1847:11;1831:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;1823:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;1929:5;1919:15;;:6;;;;;;;;;;;:15;;;1911:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;22444:1:0::1;22814:7;;:19:::0;22806:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22444:1;22943:7;:18;;;;3734:9:1::2;3729:188;3753:8;:15;3749:1;:19;3729:188;;;3834:12;:10;:12::i;:::-;3797:49;;:12;;;;;;;;;;;:20;;;3818:8;3827:1;3818:11;;;;;;;;:::i;:::-;;;;;;;;3797:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;;:83;;;;;3875:5;3850:30;;:8;:21;3859:8;3868:1;3859:11;;;;;;;;:::i;:::-;;;;;;;;3850:21;;;;;;;;;;;;;;;;;;;;;:30;;;3797:83;3789:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;3770:3;;;;;;;3729:188;;;;3926:40;3936:12;:10;:12::i;:::-;3950:8;:15;3926:9;:40::i;:::-;3976:27;3994:8;3976:17;:27::i;:::-;22401:1:0::1;22982:7;:22;;;;3618:387:1::0;;:::o;9819:187:0:-;9876:4;9918:7;9899:15;:13;:15::i;:::-;:26;;:53;;;;;9939:13;;9929:7;:23;9899:53;:105;;;;;10003:1;975:8;9956:17;:26;9974:7;9956:26;;;;;;;;;;;;:43;:48;9899:105;9892:112;;9819:187;;;:::o;5176:1027::-;5243:7;5262:12;5277:7;5262:22;;5341:4;5322:15;:13;:15::i;:::-;:23;5318:835;;5374:13;;5367:4;:20;5363:790;;;5411:14;5428:17;:23;5446:4;5428:23;;;;;;;;;;;;5411:40;;5542:1;975:8;5515:6;:23;:28;5511:641;;6026:86;6043:1;6033:6;:11;6026:86;;6085:17;:25;6103:6;;;;;;;6085:25;;;;;;;;;;;;6076:34;;6026:86;;;6144:6;6137:13;;;;;;5511:641;5389:764;5363:790;5318:835;6170:31;;;;;;;;;;;;;;5176:1027;;;;:::o;20275:98::-;20335:7;20361:10;20354:17;;20275:98;:::o;23041:91::-;23094:7;23120:10;23113:17;;23041:91;:::o;4011:94:1:-;4076:7;4102:1;4095:8;;4011:94;:::o;13979:2356:0:-;14059:27;14089;14108:7;14089:18;:27::i;:::-;14059:57;;14171:4;14130:45;;14146:19;14130:45;;;14126:86;;14184:28;;;;;;;;;;;;;;14126:86;14222:22;14271:4;14248:27;;:19;:17;:19::i;:::-;:27;;;:86;;;;14291:43;14308:4;14314:19;:17;:19::i;:::-;14291:16;:43::i;:::-;14248:86;:145;;;;14374:19;:17;:19::i;:::-;14350:43;;:20;14362:7;14350:11;:20::i;:::-;:43;;;14248:145;14222:172;;14409:17;14404:66;;14435:35;;;;;;;;;;;;;;14404:66;14498:1;14484:16;;:2;:16;;;14480:52;;14509:23;;;;;;;;;;;;;;14480:52;14542:43;14564:4;14570:2;14574:7;14583:1;14542:21;:43::i;:::-;14654:15;:24;14670:7;14654:24;;;;;;;;;;;;14647:31;;;;;;;;;;;15038:18;:24;15057:4;15038:24;;;;;;;;;;;;;;;;15036:26;;;;;;;;;;;;15106:18;:22;15125:2;15106:22;;;;;;;;;;;;;;;;15104:24;;;;;;;;;;;1251:8;862:3;15477:15;:41;;15436:21;15454:2;15436:17;:21::i;:::-;:83;:126;15391:17;:26;15409:7;15391:26;;;;;;;;;;;:171;;;;15728:1;1251:8;15678:19;:46;:51;15674:565;;15749:19;15781:1;15771:7;:11;15749:33;;15936:1;15902:17;:30;15920:11;15902:30;;;;;;;;;;;;:35;15898:340;;16038:13;;16023:11;:28;16019:218;;16216:19;16183:17;:30;16201:11;16183:30;;;;;;;;;;;:52;;;;16019:218;15898:340;15731:508;15674:565;16273:7;16269:2;16254:27;;16263:4;16254:27;;;;;;;;;;;;16291:42;16312:4;16318:2;16322:7;16331:1;16291:20;:42::i;:::-;14049:2286;;13979:2356;;;:::o;24281:258::-;24430:16;24449:6;;;;;;;;;;;24430:25;;24474:8;24465:6;;:17;;;;;;;;;;;;;;;;;;24528:8;24497:40;;24518:8;24497:40;;;;;;;;;;;;24344:195;24281:258;:::o;19203:576::-;19323:4;19368:2;19343:45;;;19389:19;:17;:19::i;:::-;19410:4;19416:7;19425:5;19343:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;19339:439;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19620:1;19603:6;:13;:18;19599:178;;19648:40;;;;;;;;;;;;;;19599:178;19767:6;19761:13;19752:6;19748:2;19744:15;19737:38;19339:439;19487:54;;;19477:64;;;:6;:64;;;;19470:71;;;19203:576;;;;;;:::o;4959:103:1:-;5019:13;5051:9;5044:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4959:103;:::o;195:483:3:-;251:13;289:1;280:5;:10;276:42;;306:10;;;;;;;;;;;;;;;;;;;;;276:42;327:12;342:5;327:20;;357:14;381:66;396:1;388:4;:9;381:66;;413:8;;;;;:::i;:::-;;;;443:2;435:10;;;;;:::i;:::-;;;381:66;;;456:19;488:6;478:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;456:39;;505:141;521:1;512:5;:10;505:141;;548:1;538:11;;;;;:::i;:::-;;;614:2;606:5;:10;;;;:::i;:::-;593:2;:24;;;;:::i;:::-;580:39;;563:6;570;563:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;642:2;633:11;;;;;:::i;:::-;;;505:141;;;669:6;655:21;;;;;195:483;;;;:::o;10062:97:0:-;10130:27;10140:2;10144:8;10130:27;;;;;;;;;;;;:9;:27::i;:::-;10062:97;;:::o;3456:156:1:-;3530:9;3525:86;3549:6;:13;3545:1;:17;3525:86;;;3605:4;3583:8;:19;3592:6;3599:1;3592:9;;;;;;;;:::i;:::-;;;;;;;;3583:19;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;3564:3;;;;;;;3525:86;;;;3456:156;:::o;19882:116:0:-;;;;;:::o;7779:130::-;7843:14;7902:5;7892:15;;7779:130;;;:::o;20094:115::-;;;;;:::o;10229:2067::-;10317:20;10340:13;;10317:36;;10381:1;10367:16;;:2;:16;;;10363:48;;10392:19;;;;;;;;;;;;;;10363:48;10437:1;10425:8;:13;10421:44;;10447:18;;;;;;;;;;;;;;10421:44;10475:61;10505:1;10509:2;10513:12;10527:8;10475:21;:61::i;:::-;11067:1;357:2;11038:1;:25;;11037:31;11025:8;:44;10999:18;:22;11018:2;10999:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;1119:3;11457:29;11484:1;11472:8;:13;11457:14;:29::i;:::-;:56;;862:3;11395:15;:41;;11354:21;11372:2;11354:17;:21::i;:::-;:83;:160;11304:17;:31;11322:12;11304:31;;;;;;;;;;;:210;;;;11528:20;11551:12;11528:35;;11577:11;11606:8;11591:12;:23;11577:37;;11650:1;11632:2;:14;;;:19;11628:554;;11671:287;11726:12;11722:2;11701:38;;11718:1;11701:38;;;;;;;;;;;;11766:69;11805:1;11809:2;11813:14;;;;;;11829:5;11766:30;:69::i;:::-;11761:151;;11870:40;;;;;;;;;;;;;;11761:151;11953:3;11938:12;:18;11671:287;;12037:12;12020:13;;:29;12016:43;;12051:8;;;12016:43;11628:554;;;12102:79;12136:14;;;;;;12132:2;12111:40;;12128:1;12111:40;;;;;;;;;;;;12176:3;12161:12;:18;12102:79;;11628:554;12211:12;12195:13;:28;;;;10782:1443;;12234:60;12263:1;12267:2;12271:12;12285:8;12234:20;:60::i;:::-;10307:1989;10229:2067;;;:::o;7915:124::-;7973:14;8032:5;8022:15;;7915:124;;;:::o;7:75:4:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:117::-;4999:1;4996;4989:12;5013:117;5122:1;5119;5112:12;5136:180;5184:77;5181:1;5174:88;5281:4;5278:1;5271:15;5305:4;5302:1;5295:15;5322:281;5405:27;5427:4;5405:27;:::i;:::-;5397:6;5393:40;5535:6;5523:10;5520:22;5499:18;5487:10;5484:34;5481:62;5478:88;;;5546:18;;:::i;:::-;5478:88;5586:10;5582:2;5575:22;5365:238;5322:281;;:::o;5609:129::-;5643:6;5670:20;;:::i;:::-;5660:30;;5699:33;5727:4;5719:6;5699:33;:::i;:::-;5609:129;;;:::o;5744:308::-;5806:4;5896:18;5888:6;5885:30;5882:56;;;5918:18;;:::i;:::-;5882:56;5956:29;5978:6;5956:29;:::i;:::-;5948:37;;6040:4;6034;6030:15;6022:23;;5744:308;;;:::o;6058:146::-;6155:6;6150:3;6145;6132:30;6196:1;6187:6;6182:3;6178:16;6171:27;6058:146;;;:::o;6210:425::-;6288:5;6313:66;6329:49;6371:6;6329:49;:::i;:::-;6313:66;:::i;:::-;6304:75;;6402:6;6395:5;6388:21;6440:4;6433:5;6429:16;6478:3;6469:6;6464:3;6460:16;6457:25;6454:112;;;6485:79;;:::i;:::-;6454:112;6575:54;6622:6;6617:3;6612;6575:54;:::i;:::-;6294:341;6210:425;;;;;:::o;6655:340::-;6711:5;6760:3;6753:4;6745:6;6741:17;6737:27;6727:122;;6768:79;;:::i;:::-;6727:122;6885:6;6872:20;6910:79;6985:3;6977:6;6970:4;6962:6;6958:17;6910:79;:::i;:::-;6901:88;;6717:278;6655:340;;;;:::o;7001:509::-;7070:6;7119:2;7107:9;7098:7;7094:23;7090:32;7087:119;;;7125:79;;:::i;:::-;7087:119;7273:1;7262:9;7258:17;7245:31;7303:18;7295:6;7292:30;7289:117;;;7325:79;;:::i;:::-;7289:117;7430:63;7485:7;7476:6;7465:9;7461:22;7430:63;:::i;:::-;7420:73;;7216:287;7001:509;;;;:::o;7516:118::-;7603:24;7621:5;7603:24;:::i;:::-;7598:3;7591:37;7516:118;;:::o;7640:222::-;7733:4;7771:2;7760:9;7756:18;7748:26;;7784:71;7852:1;7841:9;7837:17;7828:6;7784:71;:::i;:::-;7640:222;;;;:::o;7868:329::-;7927:6;7976:2;7964:9;7955:7;7951:23;7947:32;7944:119;;;7982:79;;:::i;:::-;7944:119;8102:1;8127:53;8172:7;8163:6;8152:9;8148:22;8127:53;:::i;:::-;8117:63;;8073:117;7868:329;;;;:::o;8203:619::-;8280:6;8288;8296;8345:2;8333:9;8324:7;8320:23;8316:32;8313:119;;;8351:79;;:::i;:::-;8313:119;8471:1;8496:53;8541:7;8532:6;8521:9;8517:22;8496:53;:::i;:::-;8486:63;;8442:117;8598:2;8624:53;8669:7;8660:6;8649:9;8645:22;8624:53;:::i;:::-;8614:63;;8569:118;8726:2;8752:53;8797:7;8788:6;8777:9;8773:22;8752:53;:::i;:::-;8742:63;;8697:118;8203:619;;;;;:::o;8828:60::-;8856:3;8877:5;8870:12;;8828:60;;;:::o;8894:142::-;8944:9;8977:53;8995:34;9004:24;9022:5;9004:24;:::i;:::-;8995:34;:::i;:::-;8977:53;:::i;:::-;8964:66;;8894:142;;;:::o;9042:126::-;9092:9;9125:37;9156:5;9125:37;:::i;:::-;9112:50;;9042:126;;;:::o;9174:143::-;9241:9;9274:37;9305:5;9274:37;:::i;:::-;9261:50;;9174:143;;;:::o;9323:165::-;9427:54;9475:5;9427:54;:::i;:::-;9422:3;9415:67;9323:165;;:::o;9494:256::-;9604:4;9642:2;9631:9;9627:18;9619:26;;9655:88;9740:1;9729:9;9725:17;9716:6;9655:88;:::i;:::-;9494:256;;;;:::o;9756:311::-;9833:4;9923:18;9915:6;9912:30;9909:56;;;9945:18;;:::i;:::-;9909:56;9995:4;9987:6;9983:17;9975:25;;10055:4;10049;10045:15;10037:23;;9756:311;;;:::o;10073:117::-;10182:1;10179;10172:12;10213:710;10309:5;10334:81;10350:64;10407:6;10350:64;:::i;:::-;10334:81;:::i;:::-;10325:90;;10435:5;10464:6;10457:5;10450:21;10498:4;10491:5;10487:16;10480:23;;10551:4;10543:6;10539:17;10531:6;10527:30;10580:3;10572:6;10569:15;10566:122;;;10599:79;;:::i;:::-;10566:122;10714:6;10697:220;10731:6;10726:3;10723:15;10697:220;;;10806:3;10835:37;10868:3;10856:10;10835:37;:::i;:::-;10830:3;10823:50;10902:4;10897:3;10893:14;10886:21;;10773:144;10757:4;10752:3;10748:14;10741:21;;10697:220;;;10701:21;10315:608;;10213:710;;;;;:::o;10946:370::-;11017:5;11066:3;11059:4;11051:6;11047:17;11043:27;11033:122;;11074:79;;:::i;:::-;11033:122;11191:6;11178:20;11216:94;11306:3;11298:6;11291:4;11283:6;11279:17;11216:94;:::i;:::-;11207:103;;11023:293;10946:370;;;;:::o;11322:539::-;11406:6;11455:2;11443:9;11434:7;11430:23;11426:32;11423:119;;;11461:79;;:::i;:::-;11423:119;11609:1;11598:9;11594:17;11581:31;11639:18;11631:6;11628:30;11625:117;;;11661:79;;:::i;:::-;11625:117;11766:78;11836:7;11827:6;11816:9;11812:22;11766:78;:::i;:::-;11756:88;;11552:302;11322:539;;;;:::o;11867:114::-;11934:6;11968:5;11962:12;11952:22;;11867:114;;;:::o;11987:184::-;12086:11;12120:6;12115:3;12108:19;12160:4;12155:3;12151:14;12136:29;;11987:184;;;;:::o;12177:132::-;12244:4;12267:3;12259:11;;12297:4;12292:3;12288:14;12280:22;;12177:132;;;:::o;12315:108::-;12392:24;12410:5;12392:24;:::i;:::-;12387:3;12380:37;12315:108;;:::o;12429:179::-;12498:10;12519:46;12561:3;12553:6;12519:46;:::i;:::-;12597:4;12592:3;12588:14;12574:28;;12429:179;;;;:::o;12614:113::-;12684:4;12716;12711:3;12707:14;12699:22;;12614:113;;;:::o;12763:732::-;12882:3;12911:54;12959:5;12911:54;:::i;:::-;12981:86;13060:6;13055:3;12981:86;:::i;:::-;12974:93;;13091:56;13141:5;13091:56;:::i;:::-;13170:7;13201:1;13186:284;13211:6;13208:1;13205:13;13186:284;;;13287:6;13281:13;13314:63;13373:3;13358:13;13314:63;:::i;:::-;13307:70;;13400:60;13453:6;13400:60;:::i;:::-;13390:70;;13246:224;13233:1;13230;13226:9;13221:14;;13186:284;;;13190:14;13486:3;13479:10;;12887:608;;;12763:732;;;;:::o;13501:634::-;13722:4;13760:2;13749:9;13745:18;13737:26;;13809:9;13803:4;13799:20;13795:1;13784:9;13780:17;13773:47;13837:108;13940:4;13931:6;13837:108;:::i;:::-;13829:116;;13992:9;13986:4;13982:20;13977:2;13966:9;13962:18;13955:48;14020:108;14123:4;14114:6;14020:108;:::i;:::-;14012:116;;13501:634;;;;;:::o;14141:116::-;14211:21;14226:5;14211:21;:::i;:::-;14204:5;14201:32;14191:60;;14247:1;14244;14237:12;14191:60;14141:116;:::o;14263:133::-;14306:5;14344:6;14331:20;14322:29;;14360:30;14384:5;14360:30;:::i;:::-;14263:133;;;;:::o;14402:468::-;14467:6;14475;14524:2;14512:9;14503:7;14499:23;14495:32;14492:119;;;14530:79;;:::i;:::-;14492:119;14650:1;14675:53;14720:7;14711:6;14700:9;14696:22;14675:53;:::i;:::-;14665:63;;14621:117;14777:2;14803:50;14845:7;14836:6;14825:9;14821:22;14803:50;:::i;:::-;14793:60;;14748:115;14402:468;;;;;:::o;14876:332::-;14997:4;15035:2;15024:9;15020:18;15012:26;;15048:71;15116:1;15105:9;15101:17;15092:6;15048:71;:::i;:::-;15129:72;15197:2;15186:9;15182:18;15173:6;15129:72;:::i;:::-;14876:332;;;;;:::o;15214:307::-;15275:4;15365:18;15357:6;15354:30;15351:56;;;15387:18;;:::i;:::-;15351:56;15425:29;15447:6;15425:29;:::i;:::-;15417:37;;15509:4;15503;15499:15;15491:23;;15214:307;;;:::o;15527:423::-;15604:5;15629:65;15645:48;15686:6;15645:48;:::i;:::-;15629:65;:::i;:::-;15620:74;;15717:6;15710:5;15703:21;15755:4;15748:5;15744:16;15793:3;15784:6;15779:3;15775:16;15772:25;15769:112;;;15800:79;;:::i;:::-;15769:112;15890:54;15937:6;15932:3;15927;15890:54;:::i;:::-;15610:340;15527:423;;;;;:::o;15969:338::-;16024:5;16073:3;16066:4;16058:6;16054:17;16050:27;16040:122;;16081:79;;:::i;:::-;16040:122;16198:6;16185:20;16223:78;16297:3;16289:6;16282:4;16274:6;16270:17;16223:78;:::i;:::-;16214:87;;16030:277;15969:338;;;;:::o;16313:943::-;16408:6;16416;16424;16432;16481:3;16469:9;16460:7;16456:23;16452:33;16449:120;;;16488:79;;:::i;:::-;16449:120;16608:1;16633:53;16678:7;16669:6;16658:9;16654:22;16633:53;:::i;:::-;16623:63;;16579:117;16735:2;16761:53;16806:7;16797:6;16786:9;16782:22;16761:53;:::i;:::-;16751:63;;16706:118;16863:2;16889:53;16934:7;16925:6;16914:9;16910:22;16889:53;:::i;:::-;16879:63;;16834:118;17019:2;17008:9;17004:18;16991:32;17050:18;17042:6;17039:30;17036:117;;;17072:79;;:::i;:::-;17036:117;17177:62;17231:7;17222:6;17211:9;17207:22;17177:62;:::i;:::-;17167:72;;16962:287;16313:943;;;;;;;:::o;17262:323::-;17318:6;17367:2;17355:9;17346:7;17342:23;17338:32;17335:119;;;17373:79;;:::i;:::-;17335:119;17493:1;17518:50;17560:7;17551:6;17540:9;17536:22;17518:50;:::i;:::-;17508:60;;17464:114;17262:323;;;;:::o;17591:474::-;17659:6;17667;17716:2;17704:9;17695:7;17691:23;17687:32;17684:119;;;17722:79;;:::i;:::-;17684:119;17842:1;17867:53;17912:7;17903:6;17892:9;17888:22;17867:53;:::i;:::-;17857:63;;17813:117;17969:2;17995:53;18040:7;18031:6;18020:9;18016:22;17995:53;:::i;:::-;17985:63;;17940:118;17591:474;;;;;:::o;18071:180::-;18119:77;18116:1;18109:88;18216:4;18213:1;18206:15;18240:4;18237:1;18230:15;18257:320;18301:6;18338:1;18332:4;18328:12;18318:22;;18385:1;18379:4;18375:12;18406:18;18396:81;;18462:4;18454:6;18450:17;18440:27;;18396:81;18524:2;18516:6;18513:14;18493:18;18490:38;18487:84;;18543:18;;:::i;:::-;18487:84;18308:269;18257:320;;;:::o;18583:182::-;18723:34;18719:1;18711:6;18707:14;18700:58;18583:182;:::o;18771:366::-;18913:3;18934:67;18998:2;18993:3;18934:67;:::i;:::-;18927:74;;19010:93;19099:3;19010:93;:::i;:::-;19128:2;19123:3;19119:12;19112:19;;18771:366;;;:::o;19143:419::-;19309:4;19347:2;19336:9;19332:18;19324:26;;19396:9;19390:4;19386:20;19382:1;19371:9;19367:17;19360:47;19424:131;19550:4;19424:131;:::i;:::-;19416:139;;19143:419;;;:::o;19568:141::-;19617:4;19640:3;19632:11;;19663:3;19660:1;19653:14;19697:4;19694:1;19684:18;19676:26;;19568:141;;;:::o;19715:93::-;19752:6;19799:2;19794;19787:5;19783:14;19779:23;19769:33;;19715:93;;;:::o;19814:107::-;19858:8;19908:5;19902:4;19898:16;19877:37;;19814:107;;;;:::o;19927:393::-;19996:6;20046:1;20034:10;20030:18;20069:97;20099:66;20088:9;20069:97;:::i;:::-;20187:39;20217:8;20206:9;20187:39;:::i;:::-;20175:51;;20259:4;20255:9;20248:5;20244:21;20235:30;;20308:4;20298:8;20294:19;20287:5;20284:30;20274:40;;20003:317;;19927:393;;;;;:::o;20326:142::-;20376:9;20409:53;20427:34;20436:24;20454:5;20436:24;:::i;:::-;20427:34;:::i;:::-;20409:53;:::i;:::-;20396:66;;20326:142;;;:::o;20474:75::-;20517:3;20538:5;20531:12;;20474:75;;;:::o;20555:269::-;20665:39;20696:7;20665:39;:::i;:::-;20726:91;20775:41;20799:16;20775:41;:::i;:::-;20767:6;20760:4;20754:11;20726:91;:::i;:::-;20720:4;20713:105;20631:193;20555:269;;;:::o;20830:73::-;20875:3;20830:73;:::o;20909:189::-;20986:32;;:::i;:::-;21027:65;21085:6;21077;21071:4;21027:65;:::i;:::-;20962:136;20909:189;;:::o;21104:186::-;21164:120;21181:3;21174:5;21171:14;21164:120;;;21235:39;21272:1;21265:5;21235:39;:::i;:::-;21208:1;21201:5;21197:13;21188:22;;21164:120;;;21104:186;;:::o;21296:543::-;21397:2;21392:3;21389:11;21386:446;;;21431:38;21463:5;21431:38;:::i;:::-;21515:29;21533:10;21515:29;:::i;:::-;21505:8;21501:44;21698:2;21686:10;21683:18;21680:49;;;21719:8;21704:23;;21680:49;21742:80;21798:22;21816:3;21798:22;:::i;:::-;21788:8;21784:37;21771:11;21742:80;:::i;:::-;21401:431;;21386:446;21296:543;;;:::o;21845:117::-;21899:8;21949:5;21943:4;21939:16;21918:37;;21845:117;;;;:::o;21968:169::-;22012:6;22045:51;22093:1;22089:6;22081:5;22078:1;22074:13;22045:51;:::i;:::-;22041:56;22126:4;22120;22116:15;22106:25;;22019:118;21968:169;;;;:::o;22142:295::-;22218:4;22364:29;22389:3;22383:4;22364:29;:::i;:::-;22356:37;;22426:3;22423:1;22419:11;22413:4;22410:21;22402:29;;22142:295;;;;:::o;22442:1395::-;22559:37;22592:3;22559:37;:::i;:::-;22661:18;22653:6;22650:30;22647:56;;;22683:18;;:::i;:::-;22647:56;22727:38;22759:4;22753:11;22727:38;:::i;:::-;22812:67;22872:6;22864;22858:4;22812:67;:::i;:::-;22906:1;22930:4;22917:17;;22962:2;22954:6;22951:14;22979:1;22974:618;;;;23636:1;23653:6;23650:77;;;23702:9;23697:3;23693:19;23687:26;23678:35;;23650:77;23753:67;23813:6;23806:5;23753:67;:::i;:::-;23747:4;23740:81;23609:222;22944:887;;22974:618;23026:4;23022:9;23014:6;23010:22;23060:37;23092:4;23060:37;:::i;:::-;23119:1;23133:208;23147:7;23144:1;23141:14;23133:208;;;23226:9;23221:3;23217:19;23211:26;23203:6;23196:42;23277:1;23269:6;23265:14;23255:24;;23324:2;23313:9;23309:18;23296:31;;23170:4;23167:1;23163:12;23158:17;;23133:208;;;23369:6;23360:7;23357:19;23354:179;;;23427:9;23422:3;23418:19;23412:26;23470:48;23512:4;23504:6;23500:17;23489:9;23470:48;:::i;:::-;23462:6;23455:64;23377:156;23354:179;23579:1;23575;23567:6;23563:14;23559:22;23553:4;23546:36;22981:611;;;22944:887;;22534:1303;;;22442:1395;;:::o;23843:143::-;23900:5;23931:6;23925:13;23916:22;;23947:33;23974:5;23947:33;:::i;:::-;23843:143;;;;:::o;23992:351::-;24062:6;24111:2;24099:9;24090:7;24086:23;24082:32;24079:119;;;24117:79;;:::i;:::-;24079:119;24237:1;24262:64;24318:7;24309:6;24298:9;24294:22;24262:64;:::i;:::-;24252:74;;24208:128;23992:351;;;;:::o;24349:180::-;24397:77;24394:1;24387:88;24494:4;24491:1;24484:15;24518:4;24515:1;24508:15;24535:180;24583:77;24580:1;24573:88;24680:4;24677:1;24670:15;24704:4;24701:1;24694:15;24721:233;24760:3;24783:24;24801:5;24783:24;:::i;:::-;24774:33;;24829:66;24822:5;24819:77;24816:103;;24899:18;;:::i;:::-;24816:103;24946:1;24939:5;24935:13;24928:20;;24721:233;;;:::o;24960:181::-;25100:33;25096:1;25088:6;25084:14;25077:57;24960:181;:::o;25147:366::-;25289:3;25310:67;25374:2;25369:3;25310:67;:::i;:::-;25303:74;;25386:93;25475:3;25386:93;:::i;:::-;25504:2;25499:3;25495:12;25488:19;;25147:366;;;:::o;25519:419::-;25685:4;25723:2;25712:9;25708:18;25700:26;;25772:9;25766:4;25762:20;25758:1;25747:9;25743:17;25736:47;25800:131;25926:4;25800:131;:::i;:::-;25792:139;;25519:419;;;:::o;25944:332::-;26065:4;26103:2;26092:9;26088:18;26080:26;;26116:71;26184:1;26173:9;26169:17;26160:6;26116:71;:::i;:::-;26197:72;26265:2;26254:9;26250:18;26241:6;26197:72;:::i;:::-;25944:332;;;;;:::o;26282:137::-;26336:5;26367:6;26361:13;26352:22;;26383:30;26407:5;26383:30;:::i;:::-;26282:137;;;;:::o;26425:345::-;26492:6;26541:2;26529:9;26520:7;26516:23;26512:32;26509:119;;;26547:79;;:::i;:::-;26509:119;26667:1;26692:61;26745:7;26736:6;26725:9;26721:22;26692:61;:::i;:::-;26682:71;;26638:125;26425:345;;;;:::o;26776:180::-;26916:32;26912:1;26904:6;26900:14;26893:56;26776:180;:::o;26962:366::-;27104:3;27125:67;27189:2;27184:3;27125:67;:::i;:::-;27118:74;;27201:93;27290:3;27201:93;:::i;:::-;27319:2;27314:3;27310:12;27303:19;;26962:366;;;:::o;27334:419::-;27500:4;27538:2;27527:9;27523:18;27515:26;;27587:9;27581:4;27577:20;27573:1;27562:9;27558:17;27551:47;27615:131;27741:4;27615:131;:::i;:::-;27607:139;;27334:419;;;:::o;27759:147::-;27860:11;27897:3;27882:18;;27759:147;;;;:::o;27912:114::-;;:::o;28032:398::-;28191:3;28212:83;28293:1;28288:3;28212:83;:::i;:::-;28205:90;;28304:93;28393:3;28304:93;:::i;:::-;28422:1;28417:3;28413:11;28406:18;;28032:398;;;:::o;28436:379::-;28620:3;28642:147;28785:3;28642:147;:::i;:::-;28635:154;;28806:3;28799:10;;28436:379;;;:::o;28821:234::-;28961:34;28957:1;28949:6;28945:14;28938:58;29030:17;29025:2;29017:6;29013:15;29006:42;28821:234;:::o;29061:366::-;29203:3;29224:67;29288:2;29283:3;29224:67;:::i;:::-;29217:74;;29300:93;29389:3;29300:93;:::i;:::-;29418:2;29413:3;29409:12;29402:19;;29061:366;;;:::o;29433:419::-;29599:4;29637:2;29626:9;29622:18;29614:26;;29686:9;29680:4;29676:20;29672:1;29661:9;29657:17;29650:47;29714:131;29840:4;29714:131;:::i;:::-;29706:139;;29433:419;;;:::o;29858:148::-;29960:11;29997:3;29982:18;;29858:148;;;;:::o;30012:390::-;30118:3;30146:39;30179:5;30146:39;:::i;:::-;30201:89;30283:6;30278:3;30201:89;:::i;:::-;30194:96;;30299:65;30357:6;30352:3;30345:4;30338:5;30334:16;30299:65;:::i;:::-;30389:6;30384:3;30380:16;30373:23;;30122:280;30012:390;;;;:::o;30432:874::-;30535:3;30572:5;30566:12;30601:36;30627:9;30601:36;:::i;:::-;30653:89;30735:6;30730:3;30653:89;:::i;:::-;30646:96;;30773:1;30762:9;30758:17;30789:1;30784:166;;;;30964:1;30959:341;;;;30751:549;;30784:166;30868:4;30864:9;30853;30849:25;30844:3;30837:38;30930:6;30923:14;30916:22;30908:6;30904:35;30899:3;30895:45;30888:52;;30784:166;;30959:341;31026:38;31058:5;31026:38;:::i;:::-;31086:1;31100:154;31114:6;31111:1;31108:13;31100:154;;;31188:7;31182:14;31178:1;31173:3;31169:11;31162:35;31238:1;31229:7;31225:15;31214:26;;31136:4;31133:1;31129:12;31124:17;;31100:154;;;31283:6;31278:3;31274:16;31267:23;;30966:334;;30751:549;;30539:767;;30432:874;;;;:::o;31312:589::-;31537:3;31559:95;31650:3;31641:6;31559:95;:::i;:::-;31552:102;;31671:95;31762:3;31753:6;31671:95;:::i;:::-;31664:102;;31783:92;31871:3;31862:6;31783:92;:::i;:::-;31776:99;;31892:3;31885:10;;31312:589;;;;;;:::o;31907:225::-;32047:34;32043:1;32035:6;32031:14;32024:58;32116:8;32111:2;32103:6;32099:15;32092:33;31907:225;:::o;32138:366::-;32280:3;32301:67;32365:2;32360:3;32301:67;:::i;:::-;32294:74;;32377:93;32466:3;32377:93;:::i;:::-;32495:2;32490:3;32486:12;32479:19;;32138:366;;;:::o;32510:419::-;32676:4;32714:2;32703:9;32699:18;32691:26;;32763:9;32757:4;32753:20;32749:1;32738:9;32734:17;32727:47;32791:131;32917:4;32791:131;:::i;:::-;32783:139;;32510:419;;;:::o;32935:410::-;32975:7;32998:20;33016:1;32998:20;:::i;:::-;32993:25;;33032:20;33050:1;33032:20;:::i;:::-;33027:25;;33087:1;33084;33080:9;33109:30;33127:11;33109:30;:::i;:::-;33098:41;;33288:1;33279:7;33275:15;33272:1;33269:22;33249:1;33242:9;33222:83;33199:139;;33318:18;;:::i;:::-;33199:139;32983:362;32935:410;;;;:::o;33351:168::-;33491:20;33487:1;33479:6;33475:14;33468:44;33351:168;:::o;33525:366::-;33667:3;33688:67;33752:2;33747:3;33688:67;:::i;:::-;33681:74;;33764:93;33853:3;33764:93;:::i;:::-;33882:2;33877:3;33873:12;33866:19;;33525:366;;;:::o;33897:419::-;34063:4;34101:2;34090:9;34086:18;34078:26;;34150:9;34144:4;34140:20;34136:1;34125:9;34121:17;34114:47;34178:131;34304:4;34178:131;:::i;:::-;34170:139;;33897:419;;;:::o;34322:191::-;34362:3;34381:20;34399:1;34381:20;:::i;:::-;34376:25;;34415:20;34433:1;34415:20;:::i;:::-;34410:25;;34458:1;34455;34451:9;34444:16;;34479:3;34476:1;34473:10;34470:36;;;34486:18;;:::i;:::-;34470:36;34322:191;;;;:::o;34519:175::-;34659:27;34655:1;34647:6;34643:14;34636:51;34519:175;:::o;34700:366::-;34842:3;34863:67;34927:2;34922:3;34863:67;:::i;:::-;34856:74;;34939:93;35028:3;34939:93;:::i;:::-;35057:2;35052:3;35048:12;35041:19;;34700:366;;;:::o;35072:419::-;35238:4;35276:2;35265:9;35261:18;35253:26;;35325:9;35319:4;35315:20;35311:1;35300:9;35296:17;35289:47;35353:131;35479:4;35353:131;:::i;:::-;35345:139;;35072:419;;;:::o;35497:165::-;35637:17;35633:1;35625:6;35621:14;35614:41;35497:165;:::o;35668:366::-;35810:3;35831:67;35895:2;35890:3;35831:67;:::i;:::-;35824:74;;35907:93;35996:3;35907:93;:::i;:::-;36025:2;36020:3;36016:12;36009:19;;35668:366;;;:::o;36040:419::-;36206:4;36244:2;36233:9;36229:18;36221:26;;36293:9;36287:4;36283:20;36279:1;36268:9;36264:17;36257:47;36321:131;36447:4;36321:131;:::i;:::-;36313:139;;36040:419;;;:::o;36465:143::-;36522:5;36553:6;36547:13;36538:22;;36569:33;36596:5;36569:33;:::i;:::-;36465:143;;;;:::o;36614:351::-;36684:6;36733:2;36721:9;36712:7;36708:23;36704:32;36701:119;;;36739:79;;:::i;:::-;36701:119;36859:1;36884:64;36940:7;36931:6;36920:9;36916:22;36884:64;:::i;:::-;36874:74;;36830:128;36614:351;;;;:::o;36971:180::-;37111:32;37107:1;37099:6;37095:14;37088:56;36971:180;:::o;37157:366::-;37299:3;37320:67;37384:2;37379:3;37320:67;:::i;:::-;37313:74;;37396:93;37485:3;37396:93;:::i;:::-;37514:2;37509:3;37505:12;37498:19;;37157:366;;;:::o;37529:419::-;37695:4;37733:2;37722:9;37718:18;37710:26;;37782:9;37776:4;37772:20;37768:1;37757:9;37753:17;37746:47;37810:131;37936:4;37810:131;:::i;:::-;37802:139;;37529:419;;;:::o;37954:98::-;38005:6;38039:5;38033:12;38023:22;;37954:98;;;:::o;38058:168::-;38141:11;38175:6;38170:3;38163:19;38215:4;38210:3;38206:14;38191:29;;38058:168;;;;:::o;38232:373::-;38318:3;38346:38;38378:5;38346:38;:::i;:::-;38400:70;38463:6;38458:3;38400:70;:::i;:::-;38393:77;;38479:65;38537:6;38532:3;38525:4;38518:5;38514:16;38479:65;:::i;:::-;38569:29;38591:6;38569:29;:::i;:::-;38564:3;38560:39;38553:46;;38322:283;38232:373;;;;:::o;38611:640::-;38806:4;38844:3;38833:9;38829:19;38821:27;;38858:71;38926:1;38915:9;38911:17;38902:6;38858:71;:::i;:::-;38939:72;39007:2;38996:9;38992:18;38983:6;38939:72;:::i;:::-;39021;39089:2;39078:9;39074:18;39065:6;39021:72;:::i;:::-;39140:9;39134:4;39130:20;39125:2;39114:9;39110:18;39103:48;39168:76;39239:4;39230:6;39168:76;:::i;:::-;39160:84;;38611:640;;;;;;;:::o;39257:141::-;39313:5;39344:6;39338:13;39329:22;;39360:32;39386:5;39360:32;:::i;:::-;39257:141;;;;:::o;39404:349::-;39473:6;39522:2;39510:9;39501:7;39497:23;39493:32;39490:119;;;39528:79;;:::i;:::-;39490:119;39648:1;39673:63;39728:7;39719:6;39708:9;39704:22;39673:63;:::i;:::-;39663:73;;39619:127;39404:349;;;;:::o;39759:180::-;39807:77;39804:1;39797:88;39904:4;39901:1;39894:15;39928:4;39925:1;39918:15;39945:185;39985:1;40002:20;40020:1;40002:20;:::i;:::-;39997:25;;40036:20;40054:1;40036:20;:::i;:::-;40031:25;;40075:1;40065:35;;40080:18;;:::i;:::-;40065:35;40122:1;40119;40115:9;40110:14;;39945:185;;;;:::o;40136:194::-;40176:4;40196:20;40214:1;40196:20;:::i;:::-;40191:25;;40230:20;40248:1;40230:20;:::i;:::-;40225:25;;40274:1;40271;40267:9;40259:17;;40298:1;40292:4;40289:11;40286:37;;;40303:18;;:::i;:::-;40286:37;40136:194;;;;:::o;40336:176::-;40368:1;40385:20;40403:1;40385:20;:::i;:::-;40380:25;;40419:20;40437:1;40419:20;:::i;:::-;40414:25;;40458:1;40448:35;;40463:18;;:::i;:::-;40448:35;40504:1;40501;40497:9;40492:14;;40336:176;;;;:::o

Swarm Source

ipfs://160bdb8133fc2e3b756b755f7103f9cde677375f0856741d8a6a053c933b81f4
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.