ETH Price: $2,696.61 (+2.22%)
Gas: 8.14 Gwei

Contract

0x4C77CD2764729D4F4596C420310A2eb89799aE07
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer From135919742021-11-11 1:25:071051 days ago1636593907IN
0x4C77CD27...89799aE07
0 ETH0.01285006126.80904397
Mint131991132021-09-10 16:29:381113 days ago1631291378IN
0x4C77CD27...89799aE07
0.06942 ETH0.0141423764.75626099
Mint131984682021-09-10 14:09:231113 days ago1631282963IN
0x4C77CD27...89799aE07
0.06942 ETH0.0146612468.00394341
Mint131976942021-09-10 11:17:051113 days ago1631272625IN
0x4C77CD27...89799aE07
0.06942 ETH0.0125707458.30750179
Mint131975702021-09-10 10:54:201113 days ago1631271260IN
0x4C77CD27...89799aE07
0.06942 ETH0.0152980970.95787774
Set Approval For...130508642021-08-18 18:35:541136 days ago1629311754IN
0x4C77CD27...89799aE07
0 ETH0.0015795634.32790412
Transfer From130259992021-08-14 22:27:211139 days ago1628980041IN
0x4C77CD27...89799aE07
0 ETH0.0031503735.38390301
Transfer From130259872021-08-14 22:24:381139 days ago1628979878IN
0x4C77CD27...89799aE07
0 ETH0.0041255940.7127965
Mint130161992021-08-13 10:14:151141 days ago1628849655IN
0x4C77CD27...89799aE07
0.06942 ETH0.0068369431.30553515
Mint129762142021-08-07 6:13:371147 days ago1628316817IN
0x4C77CD27...89799aE07
0.06942 ETH0.0081879137.49148005
Mint129725512021-08-06 16:40:381148 days ago1628268038IN
0x4C77CD27...89799aE07
0.06942 ETH0.0138868764.41218038
Mint129725192021-08-06 16:35:121148 days ago1628267712IN
0x4C77CD27...89799aE07
0.13884 ETH0.03721484104
Mint129492372021-08-03 0:42:201151 days ago1627951340IN
0x4C77CD27...89799aE07
0.06942 ETH0.0067702131
Mint129364052021-08-01 0:14:051153 days ago1627776845IN
0x4C77CD27...89799aE07
0.06942 ETH0.0061150328
Mint129355662021-07-31 21:04:261154 days ago1627765466IN
0x4C77CD27...89799aE07
0.90246 ETH0.0807441142
Mint129354872021-07-31 20:46:241154 days ago1627764384IN
0x4C77CD27...89799aE07
0.13884 ETH0.0140647639
Set Approval For...129352812021-07-31 19:52:051154 days ago1627761125IN
0x4C77CD27...89799aE07
0 ETH0.0017485338
Mint129347622021-07-31 17:51:451154 days ago1627753905IN
0x4C77CD27...89799aE07
0.06942 ETH0.0089541541
Mint129347222021-07-31 17:42:301154 days ago1627753350IN
0x4C77CD27...89799aE07
1.3884 ETH0.1313173345
Mint129346382021-07-31 17:23:111154 days ago1627752191IN
0x4C77CD27...89799aE07
0.06942 ETH0.0081925738.00000145
Mint129346362021-07-31 17:22:471154 days ago1627752167IN
0x4C77CD27...89799aE07
0.20826 ETH0.0206177941
Mint129345992021-07-31 17:14:471154 days ago1627751687IN
0x4C77CD27...89799aE07
0.06942 ETH0.0094861344
Mint129345722021-07-31 17:06:591154 days ago1627751219IN
0x4C77CD27...89799aE07
0.13884 ETH0.0150290742
Mint129345692021-07-31 17:06:341154 days ago1627751194IN
0x4C77CD27...89799aE07
0.06942 ETH0.0096093344
Pause Market129345662021-07-31 17:05:491154 days ago1627751149IN
0x4C77CD27...89799aE07
0 ETH0.0006333844
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
131991132021-09-10 16:29:381113 days ago1631291378
0x4C77CD27...89799aE07
0.020826 ETH
131991132021-09-10 16:29:381113 days ago1631291378
0x4C77CD27...89799aE07
0.048594 ETH
131984682021-09-10 14:09:231113 days ago1631282963
0x4C77CD27...89799aE07
0.020826 ETH
131984682021-09-10 14:09:231113 days ago1631282963
0x4C77CD27...89799aE07
0.048594 ETH
131976942021-09-10 11:17:051113 days ago1631272625
0x4C77CD27...89799aE07
0.020826 ETH
131976942021-09-10 11:17:051113 days ago1631272625
0x4C77CD27...89799aE07
0.048594 ETH
131975702021-09-10 10:54:201113 days ago1631271260
0x4C77CD27...89799aE07
0.020826 ETH
131975702021-09-10 10:54:201113 days ago1631271260
0x4C77CD27...89799aE07
0.048594 ETH
130161992021-08-13 10:14:151141 days ago1628849655
0x4C77CD27...89799aE07
0.020826 ETH
130161992021-08-13 10:14:151141 days ago1628849655
0x4C77CD27...89799aE07
0.048594 ETH
129762142021-08-07 6:13:371147 days ago1628316817
0x4C77CD27...89799aE07
0.020826 ETH
129762142021-08-07 6:13:371147 days ago1628316817
0x4C77CD27...89799aE07
0.048594 ETH
129725512021-08-06 16:40:381148 days ago1628268038
0x4C77CD27...89799aE07
0.020826 ETH
129725512021-08-06 16:40:381148 days ago1628268038
0x4C77CD27...89799aE07
0.048594 ETH
129725192021-08-06 16:35:121148 days ago1628267712
0x4C77CD27...89799aE07
0.041652 ETH
129725192021-08-06 16:35:121148 days ago1628267712
0x4C77CD27...89799aE07
0.097188 ETH
129492372021-08-03 0:42:201151 days ago1627951340
0x4C77CD27...89799aE07
0.020826 ETH
129492372021-08-03 0:42:201151 days ago1627951340
0x4C77CD27...89799aE07
0.048594 ETH
129364052021-08-01 0:14:051153 days ago1627776845
0x4C77CD27...89799aE07
0.020826 ETH
129364052021-08-01 0:14:051153 days ago1627776845
0x4C77CD27...89799aE07
0.048594 ETH
129355662021-07-31 21:04:261154 days ago1627765466
0x4C77CD27...89799aE07
0.270738 ETH
129355662021-07-31 21:04:261154 days ago1627765466
0x4C77CD27...89799aE07
0.631722 ETH
129354872021-07-31 20:46:241154 days ago1627764384
0x4C77CD27...89799aE07
0.041652 ETH
129354872021-07-31 20:46:241154 days ago1627764384
0x4C77CD27...89799aE07
0.097188 ETH
129347622021-07-31 17:51:451154 days ago1627753905
0x4C77CD27...89799aE07
0.020826 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RebelPunks

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 100000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 3: RebelPunks.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.7.6;

import './console.sol';

import './UniformRandomNumber.sol';

/**
 *   ____        _            _
 *  |  _ \  ___ | |__    ___ | |
 *  | |_) |/ _ \| '_ \  / _ \| |
 *  |  _ <|  __/| |_) ||  __/| |
 *  |_| \_\\___||_.__/  \___||_|
 *   ____                 _
 *  |  _ \  _   _  _ __  | | __ ___
 *  | |_) || | | || '_ \ | |/ // __|
 *  |  __/ | |_| || | | ||   < \__ \
 *  |_|     \__,_||_| |_||_|\_\|___/
 *
 * An NFT project from Tavatar.io
 *
 */
interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC2981 is IERC165 {
    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _salePrice - the sale price of the NFT asset specified by _tokenId
    /// @return receiver - address of who should be sent the royalty payment
    /// @return royaltyAmount - the royalty payment amount for _salePrice
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount);
}

interface IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    function balanceOf(address owner) external view returns (uint256 balance);
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function safeTransferFrom(address from, address to, uint256 tokenId) external;
    function transferFrom(address from, address to, uint256 tokenId) external;
    function approve(address to, uint256 tokenId) external;
    function getApproved(uint256 tokenId) external view returns (address operator);
    function setApprovalForAll(address operator, bool _approved) external;
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}

interface BokkyDateTime {
    function getYear(uint timestamp) external view returns (uint);
    function getMonth(uint timestamp) external view returns (uint);
    function getDay(uint timestamp) external view returns (uint);
    function getHour(uint timestamp) external view returns (uint);
    function getMinute(uint timestamp) external view returns (uint);
    function timestampFromDateTime(uint year, uint month, uint day, uint hour, uint minute, uint second) external view returns (uint timestamp);
}

interface ERC721TokenReceiver
{
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4);
}

library SafeMath {

    /**
    * @dev Multiplies two numbers, throws on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        if (a == 0) {
            return 0;
        }
        c = a * b;
        require(c / a == b);
        return c;
    }

    /**
    * @dev Integer division of two numbers, truncating the quotient.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        // uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return a / b;
    }

    /**
    * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        return a - b;
    }

    /**
    * @dev Adds two numbers, throws on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
        c = a + b;
        require(c >= a);
        return c;
    }

    function ceil(uint256 a, uint256 m) internal pure returns (uint256) {
        uint256 c = add(a,m);
        uint256 d = sub(c,1);
        return mul(div(d,m),m);
    }
}

contract RebelPunks is IERC721 {

    using SafeMath for uint256;

    /**
     * Event emitted when minting a new NFT.
     */
    event Mint(uint indexed index, address indexed minter);

    /**
     * Event emitted when the public sale begins.
     */
    event SaleBegins();

    /**
     * Event emitted when a punk rebels.
     */
    event HasRebelled(uint indexed index, address indexed to);

    bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

    uint public constant TOKEN_LIMIT = 10000;
    uint public constant MAX_REBEL_PURCHASE = 20;

    mapping(bytes4 => bool) internal supportedInterfaces;

    mapping (uint256 => address) internal idToOwner;

    mapping (uint256 => address) internal idToApproval;

    mapping (address => mapping (address => bool)) internal ownerToOperators;

    mapping(address => uint256[]) internal ownerToIds;

    mapping(uint256 => uint256) internal idToOwnerIndex;

    string internal nftName = "RebelPunks";
    string internal nftSymbol = unicode"∞PUNK";

    uint internal numTokens = 0;

    address payable internal deployer;
    address payable internal beneficiary1;
    address payable internal beneficiary2;
    bool public publicSale = false;
    uint private price;
    uint public saleStartTime;

    //// Random index assignment
    uint[TOKEN_LIMIT] internal indices;

    //// Secure Minting
    string public baseURI;
    string public uriExtension;
    bool public uriLock = false;

    //// Market
    bool public marketPaused = false;
    bool public contractSealed = false;

    //// Rebellion Mechanic
    mapping(address => uint256) internal rebelLeadersCount;
    uint rebellionNonce;
    bool public rebellionLock = true;
    bool public cannotUpdateRebellionLock = false;

    //// NEW REBELLION
    uint public rebellionPointer = 0;
    uint[TOKEN_LIMIT] internal rebellionStatus;
    mapping(uint => uint) internal rebellionStatusMap;
    uint public rebellionPointerResetDate;

    //// Date Time contract
    address internal dateTime;
    BokkyDateTime internal dateTimeInstance;

    bool private reentrancyLock = false;

    /***********************************|
    |        Modifiers                  |
    |__________________________________*/
    modifier uriIsUnlocked() {
        require(uriLock == false, "URI can no longer be updated.");
        _;
    }

    /**
    * @dev This checks that rebellion() can be fired.
    * It will be up to the community to audit rebellion and choose if it should be activated or not.
    * We will default to activating it unless a glaring bug is found.
    */
    modifier rebellionIsUnlocked() {
        require(rebellionLock == true, "Rebellion is locked.");
        _;
    }

    /**
    * @dev once it's decided to keep rebellion on or off the state will be locked so there is no guessing if it will change.
    */
    modifier rebellionIsUpdateable() {
        require(cannotUpdateRebellionLock == false, "Rebellion state cannot be updated.");
        _;
    }

    modifier onlyDeployer() {
        require(msg.sender == deployer, "Only deployer.");
        _;
    }

    /* Prevent a contract function from being reentrant-called. */
    modifier reentrancyGuard {
        if (reentrancyLock) {
            revert();
        }
        reentrancyLock = true;
        _;
        reentrancyLock = false;
    }

    modifier canOperate(uint256 _tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(tokenOwner == msg.sender || ownerToOperators[tokenOwner][msg.sender], "Cannot operate.");
        _;
    }

    modifier canTransfer(uint256 _tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(
            tokenOwner == msg.sender
            || idToApproval[_tokenId] == msg.sender
            || ownerToOperators[tokenOwner][msg.sender], "Cannot transfer."
        );
        _;
    }

    modifier validNFToken(uint256 _tokenId) {
        require(idToOwner[_tokenId] != address(0), "Invalid token.");
        _;
    }

    modifier onlyOnFourTwenty() {
        uint currentTime = block.timestamp;
        uint currentYear = dateTimeInstance.getYear(currentTime);
        uint begin420Timestamp = dateTimeInstance.timestampFromDateTime(currentYear,4,20,14,0,0); // 10AM EST is 2PM(14:00) UTC
        uint end420Timestamp   = dateTimeInstance.timestampFromDateTime(currentYear,4,21,4,0,0);  // 12AM EST is 4AM UTC
        require((currentTime >= begin420Timestamp && currentTime < end420Timestamp), "Yo, it's not 420. Get back to work.");
        _;
    }

    modifier saleStarted () {
        require(publicSale, "Sale not started.");
        _;
    }

    /***********************************|
    |        Constructor                |
    |__________________________________*/
    constructor(address _dateTime, address payable _beneficiary1, address payable _beneficiary2, string memory _baseURI, string memory _uriExtension) {
        supportedInterfaces[0x01ffc9a7] = true; // ERC165
        supportedInterfaces[0x80ac58cd] = true; // ERC721
        supportedInterfaces[0x780e9d63] = true; // ERC721 Enumerable
        supportedInterfaces[0x5b5e139f] = true; // ERC721 Metadata
        supportedInterfaces[0x2a55205a] = true; // EIP2981 Royalty
        deployer = msg.sender;
        dateTime = _dateTime;
        dateTimeInstance = BokkyDateTime(dateTime);
        beneficiary1 = _beneficiary1;
        beneficiary2 = _beneficiary2;
        baseURI = _baseURI;
        uriExtension = _uriExtension;

        _resetRebellionPointer();
    }

    /***********************************|
    |        Function                   |
    |__________________________________*/
    uint256 public basePercent = 250; //2.5%
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount){
        // _tokenId is unimportant because it's a fixed amount. I can imagine situations where it would not be a fixed amount

        uint256 roundValue = SafeMath.ceil(_salePrice, basePercent);
        console.log(roundValue);
        uint256 twoPtFivePercent = SafeMath.div(SafeMath.mul(roundValue, basePercent), 10000);

        receiver = beneficiary1;
        royaltyAmount = twoPtFivePercent;
    }

    /**
    * @dev Marks all tokens owned by a user compliant for the next 4/20
    */
    function heartBeatOwner() public {
        _heartBeatAddress(msg.sender);
    }

    /**
    * @dev Marks a specific token as compliant for the next 4/20
    * @param _token is the NFT token index
    */
    function heartBeatToken(uint _token) public validNFToken(_token) {
        _heartBeatToken(_token);
    }

    /**
    * @dev Internal function calls _heartBeatToken for each token owned by msg.sender
    * @param _to The address of msg.sender
    */
    function _heartBeatAddress(address _to) internal {
        uint tokensOwned = _getOwnerNFTCount(_to);
        for(uint m = 0; m < tokensOwned; m++) {
            uint tokenId = ownerToIds[_to][m];
            _heartBeatToken(tokenId);
        }
    }

    /**
    * @dev Internal function resets the rebellion pointer the first time _heartBeatToken is called after 4/20. rebellionPointerResetDate is set to midnight EST or 4am UTC.
    * Tokens that heartbeat are compliant until rebellionPointerResetDate.
    */
    function _resetRebellionPointer() internal {
        rebellionPointer = 0;
        uint currentTime = block.timestamp;
        uint currentYear = dateTimeInstance.getYear(currentTime);
        uint endOfRebellion = dateTimeInstance.timestampFromDateTime(currentYear,4,21,4,0,0);  // 12AM EST is 4AM UTC
        if(endOfRebellion < currentTime){
            endOfRebellion = dateTimeInstance.timestampFromDateTime(currentYear+1,4,21,4,0,0);
        }
        rebellionPointerResetDate = endOfRebellion;
    }

    /**
    * @dev for a number of optimization reasons the compliant and rebellious tokens are all stored in a 10,000 length array.  By using 2 pointers: rebellionPointer & numTokens (I know so Leetcode)
    * we're able to sort in place by moving the compliant Punks to the front half of the array.  This allows us to track compliance after each transaction or heartbeat.  Then when reassigning ownership
    * during rebellion we'll have a presorted list of rebellious and compliant punks to choose from.  This optimization allows for O(C) operations where O(N) are not feasable
    * during rebellion due to gas limitations.  Since the array can not be searched in O(C) a map of NFT index to rebellionStatus array position is continuously updated. That map is rebellionStatusMap.
    * @param _token is the NFT token index
    */
    function _heartBeatToken(uint _token) internal validNFToken(_token) {
        // Checks If Pointer Needs to Be Reset
        if(rebellionPointerResetDate < block.timestamp){
            _resetRebellionPointer();
        }
        if(rebellionPointer == TOKEN_LIMIT){
            return; //All Tokens Compliant
        }else if(rebellionStatusMap[_token] == 0 && rebellionStatus[0] != _token){ //This token has not been minted.  rebellionStatus[x] defaults to zero before being set.
            if(rebellionPointer == (numTokens-1)){ //If all are compliant and minting more tokens.
                rebellionStatus[rebellionPointer] = _token;
                rebellionStatusMap[_token] = rebellionPointer;
                rebellionPointer = rebellionPointer.add(1);
            }else{
                rebellionStatus[numTokens-1] = rebellionStatus[rebellionPointer];
                rebellionStatusMap[rebellionStatus[rebellionPointer]] = numTokens-1;
                rebellionStatus[rebellionPointer] = _token;
                rebellionStatusMap[_token] = rebellionPointer;
                rebellionPointer = rebellionPointer.add(1);
            }
        }else if(rebellionStatusMap[_token] < rebellionPointer){ //Compliant
            return;
        }else{ //Token has been minted. Post rebellion.
            //Array in place movement - Moves value in rebellion to pointer tip and moves value at pointer tip to the _tokens previous location.
            rebellionStatus[rebellionStatusMap[_token]] = rebellionStatus[rebellionPointer]; //Push current tip of in rebellion further out in the array.
            rebellionStatusMap[rebellionStatus[rebellionPointer]] = rebellionStatusMap[_token];

            rebellionStatus[rebellionPointer] = _token; //assign _token to current rebelPointer Tip.
            rebellionStatusMap[_token] = rebellionPointer;

            rebellionPointer = rebellionPointer.add(1);
        }
    }

    /**
    * @dev Internal function returns a "pseudo" random number in range 0 to (max - 1).  https://github.com/pooltogether/uniform-random-number
    * @param max is the number of values to choose between. the value returend
    */
    function random(uint max) internal returns (uint _randomNumber) {
        uint256 randomness = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, rebellionNonce)));
        _randomNumber = UniformRandomNumber.uniform(randomness, max);
        rebellionNonce++;
        return _randomNumber;
    }

    /**
    * @dev transfers a rebellious NFT index to a compliant owner.  Completes this transfer by picking a random NFT index in the compliant section of of the rebellionStatus[] array
    *      and assiging the rebellious index to the owner of the selected compliant index.
    * @param indexInRebellion is the NFT index of a rebellious Punk.
    * @param maxCompliant is the number of compliant Punks to choose from for reassignment.
    */
    function _rebel(uint indexInRebellion, uint maxCompliant) private {
        address luckyRandomCompliantOwner = idToOwner[rebellionStatus[random(maxCompliant)]];//get compliant.length, get a number in that range, get the value of compliant at that number, get the address that owns that id.
        _transfer(luckyRandomCompliantOwner, indexInRebellion);
        emit HasRebelled(indexInRebellion, luckyRandomCompliantOwner);
    }

    /**
    * @dev read only function says weather an NFT index will be eligible to rebel in the upcoming 4/20.
    * @param _nftIndex is the NFT token index
    * @return _willRebelBool true == will rebel. false == will not rebel
    */
    function idWillRebel(uint _nftIndex) external view returns(bool _willRebelBool){
        return _idWillRebel(_nftIndex);
    }

    /**
    * @dev internal function calculated weather an NFT index will be eligible to rebel in the upcoming 4/20. Used within idWillRebel() and ownerWillRebel().
    * @param _nftIndex is the NFT token index
    * @return _willRebelBool true == will rebel. false == will not rebel
    */
    function _idWillRebel(uint _nftIndex) internal view returns(bool _willRebelBool){
        if(numTokens == 0){
            _willRebelBool = false;
        }else if(rebellionStatusMap[_nftIndex] < rebellionPointer){
            _willRebelBool = false;
        }else{
            _willRebelBool = true;
        }
    }

    /**
    * @dev Calculates how many of an owners NFT index tokens will be eligible to rebel in the upcoming 4/20.
    * @param _owner the address of a specific token holder
    * @return _willRebelCount the number of an owners tokens that will rebel.
    */
    function ownerWillRebel(address _owner) external view returns(uint _willRebelCount){
        uint counter = 0;
        uint tokensOwned = _getOwnerNFTCount(_owner);
        for(uint m = 0; m < tokensOwned; m++) {
            uint tokenId = ownerToIds[_owner][m];
            if(_idWillRebel(tokenId)){
                counter++;
            }
        }
        return counter;
    }

    /**
    * @dev toggles the ability to call rebellion().  This function is included so that pending public deployment the rebellion function can be turned off until a full review
    * has taken place by the community.  Pending no errors rebellion will be turned on and locked.  Should there be any potential for abuse rebellion may be locked in the off position.
    * @param _rebellionLockState true == rebellion cannot be called. false == rebellion can be called.
    */
    function toggleRebellionLock(bool _rebellionLockState) external onlyDeployer rebellionIsUpdateable {
        rebellionLock = _rebellionLockState;
    }

    /**
    * @dev Once called the rebellionLock will remain forever at its current value. Post community review rebellion() can be locked on or locked off. Either way locking rebellion()
    * removes any doubt as to wether or not the function will or will not be callable in the future.
    */
    function lockRebellionState() external onlyDeployer {
        cannotUpdateRebellionLock = true; //I dont like that this is a negative version of (false == cant update instead of locked == true)
    }

    /**
    * @dev Each year on 4/20 between 10AM-12AM EST rebellion can be called. Each call of rebellion transfers up to 20 NFT tokens from inactive wallets to active token holders.
    * Rebel Punks is a seat at the table. If you don't interact with the contract one per year you risk losing your seat at the table.
    * Those addresses who call rebellion are noted in the rebelLeadersCount map which records how many Punks they have liberated.  High scores gain street cred.
    */
    function rebellion() external saleStarted rebellionIsUnlocked onlyOnFourTwenty reentrancyGuard {
        if(rebellionPointer == 0 && numTokens != 0){ //None Compliant
            return;
        }else if(rebellionPointer == numTokens){ //All Compliant
            return;
        }else{
            uint numberInRebellion = numTokens - rebellionPointer;
            if(numberInRebellion > 20){
                numberInRebellion = 20;
            }
            for (uint z = 0; z < numberInRebellion; z++) {
                _rebel(rebellionStatus[rebellionPointer], rebellionPointer);
            }
            rebelLeadersCount[msg.sender] += numberInRebellion; //DOes this
        }
    }

    /**
    * @dev Returns the number of rebellious Punks liberated by a specific address.
    * @param _rebelLeader address
    * @return _rebelCount the number of rebellious Punks liberated by the specified address.
    */
    function getRebelLeaderCount(address _rebelLeader) external view returns (uint _rebelCount) {
        _rebelCount = rebelLeadersCount[_rebelLeader];
    }

    /**
    * @dev Makes minting available.
    * @param _price the minting cost in Wei.
    */
    function startSale(uint _price) external onlyDeployer {
        _startSale(_price);
    }

    /**
    * @dev Internal function - Makes minting available.
    * @param _price the minting cost in Wei.
    */
    function _startSale(uint _price) private {
        require(!publicSale);
        price = _price;
        saleStartTime = block.timestamp;
        publicSale = true;
        emit SaleBegins();
    }

    /**
    * @dev Pauses and unpauses the minting process.  Provided as a safe guard.
    * @param _paused true == pause, false == unpause.
    */
    function pauseMarket(bool _paused) external onlyDeployer {
        require(!contractSealed, "Contract sealed.");
        marketPaused = _paused;
    }

    /**
    * @dev Locks minting in its current paused or unpaused state.
    */
    function sealContract() external onlyDeployer {
        contractSealed = true;
    }

    //////////////////////////
    //// ERC 721 and 165  ////
    //////////////////////////

    function isContract(address _addr) internal view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(_addr) } // solhint-disable-line
        return size > 0;
    }

    function supportsInterface(bytes4 _interfaceID) external view override returns (bool) {
        return supportedInterfaces[_interfaceID];
    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata _data) external override {
        _safeTransferFrom(_from, _to, _tokenId, _data);
    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external override {
        _safeTransferFrom(_from, _to, _tokenId, "");
    }

    function transferFrom(address _from, address _to, uint256 _tokenId) external override canTransfer(_tokenId) validNFToken(_tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(tokenOwner == _from, "Wrong from address.");
        require(_to != address(0), "Cannot send to 0x0.");
        _transfer(_to, _tokenId);
    }

    function approve(address _approved, uint256 _tokenId) external override canOperate(_tokenId) validNFToken(_tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(_approved != tokenOwner);
        idToApproval[_tokenId] = _approved;
        emit Approval(tokenOwner, _approved, _tokenId);
    }

    function setApprovalForAll(address _operator, bool _approved) external override {
        ownerToOperators[msg.sender][_operator] = _approved;
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

    function balanceOf(address _owner) external view override returns (uint256 _balance) {
        _balance = _getOwnerNFTCount(_owner);
    }

    function ownerOf(uint256 _tokenId) external view override returns (address _owner) {
        require(idToOwner[_tokenId] != address(0));
        _owner = idToOwner[_tokenId];
    }

    function getApproved(uint256 _tokenId) external view override validNFToken(_tokenId) returns (address _approvalAddress) {
        _approvalAddress = idToApproval[_tokenId];
    }

    function isApprovedForAll(address _owner, address _operator) external override view returns (bool _isApprovedForAll) {
        _isApprovedForAll = ownerToOperators[_owner][_operator];
    }

    function _transfer(address _to, uint256 _tokenId) internal {
        address from = idToOwner[_tokenId];

        _clearApproval(_tokenId);

        _removeNFToken(from, _tokenId);
        _addNFToken(_to, _tokenId);
        _heartBeatToken(_tokenId);

        emit Transfer(from, _to, _tokenId);
    }

    function randomIndex() internal returns (uint) {
        uint totalSize = TOKEN_LIMIT - numTokens;
        uint index = random(totalSize);
        uint value = 0;
        if (indices[index] != 0) {
            value = indices[index];
        } else {
            value = index;
        }

        // Move last value to selected position
        if (indices[totalSize - 1] == 0) {
            // Array position not initialized, so use position
            indices[index] = totalSize - 1;
        } else {
            // Array position holds a value so use that
            indices[index] = indices[totalSize - 1];
        }
        // Don't allow a zero index, start counting at 1
        return value.add(1);
    }

    function getPrice() public view saleStarted returns (uint _price) {
        return price;
    }

    function mintsRemaining() external view returns (uint _remaining) {
        _remaining = TOKEN_LIMIT.sub(numTokens);
    }

    /**
    * @dev Public sale minting.
    */
    function mint(uint numberOfTokens) external payable saleStarted reentrancyGuard {
        require(numberOfTokens <= MAX_REBEL_PURCHASE, "Can only mint 20 tokens at a time.");
        require(numberOfTokens > 0, "Must mint at least 1 rebel.");
        require(!marketPaused, "Rebels have paused all operations.");
        require(numTokens.add(numberOfTokens) <= TOKEN_LIMIT, "Purchase would exceed max supply of Rebels.");
        require(price.mul(numberOfTokens) <= msg.value, "Ether value sent is not correct.");
        if (msg.value > price.mul(numberOfTokens)) {
            msg.sender.transfer(msg.value.sub(price.mul(numberOfTokens))); //Refund Excess
        }
        beneficiary1.transfer(numberOfTokens.mul(price.mul(70)).div(100));
        beneficiary2.transfer(numberOfTokens.mul(price.mul(30)).div(100));
        for(uint i = 0; i < numberOfTokens; i++) {
            if (numTokens < TOKEN_LIMIT) {
                _mint(msg.sender);
            }
        }
    }

    function _mint(address _to) internal {
        require(_to != address(0), "Cannot mint to 0x0.");
        require(numTokens < TOKEN_LIMIT, "Token limit reached.");

        uint id = randomIndex();

        numTokens = numTokens + 1;
        _addNFToken(_to, id);
        _heartBeatToken(id);

        emit Mint(id, _to);
        emit Transfer(address(0), _to, id);
    }

    function _addNFToken(address _to, uint256 _tokenId) internal {
        require(idToOwner[_tokenId] == address(0), "Cannot add, already owned.");
        idToOwner[_tokenId] = _to;

        ownerToIds[_to].push(_tokenId);
        idToOwnerIndex[_tokenId] = ownerToIds[_to].length.sub(1);
    }

    function _removeNFToken(address _from, uint256 _tokenId) internal {
        require(idToOwner[_tokenId] == _from, "Incorrect owner.");
        delete idToOwner[_tokenId];

        uint256 tokenToRemoveIndex = idToOwnerIndex[_tokenId];
        uint256 lastTokenIndex = ownerToIds[_from].length.sub(1);

        if (lastTokenIndex != tokenToRemoveIndex) {
            uint256 lastToken = ownerToIds[_from][lastTokenIndex];
            ownerToIds[_from][tokenToRemoveIndex] = lastToken;
            idToOwnerIndex[lastToken] = tokenToRemoveIndex;
        }

        ownerToIds[_from].pop();
    }

    function _getOwnerNFTCount(address _owner) internal view returns (uint256 _count) {
        _count = ownerToIds[_owner].length;
    }

    function _safeTransferFrom(address _from,  address _to,  uint256 _tokenId,  bytes memory _data) private canTransfer(_tokenId) validNFToken(_tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(tokenOwner == _from, "Incorrect owner.");
        require(_to != address(0));

        _transfer(_to, _tokenId);

        if (isContract(_to)) {
            bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
            require(retval == MAGIC_ON_ERC721_RECEIVED);
        }
    }

    function _clearApproval(uint256 _tokenId) private {
        if (idToApproval[_tokenId] != address(0)) {
            delete idToApproval[_tokenId];
        }
    }

    //// Enumerable

    function totalSupply() public view returns (uint256 _total) {
        _total = numTokens;
    }

    function tokenByIndex(uint256 index) public pure returns (uint256 _token) {
        require(index >= 0 && index < TOKEN_LIMIT);
        _token = index + 1;
    }

    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256 _token) {
        require(_index < ownerToIds[_owner].length);
        _token = ownerToIds[_owner][_index];
    }

    //// Metadata

    /**
      * @dev Converts a `uint256` to its ASCII `string` representation.
      */
    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);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = bytes1(uint8(48 + temp % 10));
            temp /= 10;
        }
        return string(buffer);
    }

    /**
      * @dev Returns a descriptive name for a collection of NFTokens.
      * @return _name Representing name.
      */
    function name() external view returns (string memory _name) {
        _name = nftName;
    }

    /**
     * @dev Returns an abbreviated name for NFTokens.
     * @return _symbol Representing symbol.
     */
    function symbol() external view returns (string memory _symbol) {
        _symbol = nftSymbol;
    }

    /**
     * @dev A distinct URI (RFC 3986) for a given NFT.
     * @param _tokenId Id for which we want uri.
     * @return _tokenURI URI of _tokenId.
     */
    function tokenURI(uint256 _tokenId) external view validNFToken(_tokenId) returns (string memory _tokenURI) {
        _tokenURI = string(abi.encodePacked(baseURI, toString(_tokenId), uriExtension));
    }

    /**
     * @dev For public minting uri will be a localized server, after minting uri will be updated to IFPS and locked. Note: all images are already on IFPS
     * @param _newBaseURI is the new base URI, presumable a new IPFS hash to be updated post minting.
     */
    function updateURI(string memory _newBaseURI, string memory _newUriExtension) external onlyDeployer uriIsUnlocked {
        baseURI = _newBaseURI;
        uriExtension = _newUriExtension;
    }

    /**
    * @dev Locks the URI at it's current value. Will be called post minting so that the URI perminently points to IPFS without the possibility of changing.
    */
    function lockURI() external onlyDeployer {
        uriLock = true;
    }
}

File 2 of 3: console.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
	}

	function logUint(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
	}

	function logBytes6(bytes6 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
	}

	function logBytes7(bytes7 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
	}

	function logBytes8(bytes8 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
	}

	function logBytes9(bytes9 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
	}

	function logBytes10(bytes10 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
	}

	function logBytes11(bytes11 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
	}

	function logBytes12(bytes12 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
	}

	function logBytes13(bytes13 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
	}

	function logBytes14(bytes14 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
	}

	function logBytes15(bytes15 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
	}

	function logBytes16(bytes16 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
	}

	function logBytes17(bytes17 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
	}

	function logBytes18(bytes18 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
	}

	function logBytes19(bytes19 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
	}

	function logBytes20(bytes20 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
	}

	function logBytes21(bytes21 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
	}

	function logBytes22(bytes22 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
	}

	function logBytes23(bytes23 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
	}

	function logBytes24(bytes24 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
	}

	function logBytes25(bytes25 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
	}

	function logBytes26(bytes26 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
	}

	function logBytes27(bytes27 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
	}

	function logBytes28(bytes28 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
	}

	function logBytes29(bytes29 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
	}

	function logBytes30(bytes30 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
	}

	function logBytes31(bytes31 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
	}

	function logBytes32(bytes32 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
	}

	function log(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function log(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function log(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function log(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function log(uint p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
	}

	function log(uint p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
	}

	function log(uint p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
	}

	function log(uint p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
	}

	function log(string memory p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
	}

	function log(string memory p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
	}

	function log(string memory p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
	}

	function log(string memory p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
	}

	function log(bool p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
	}

	function log(bool p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
	}

	function log(bool p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
	}

	function log(bool p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
	}

	function log(address p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
	}

	function log(address p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
	}

	function log(address p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
	}

	function log(address p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
	}

	function log(uint p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
	}

	function log(uint p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
	}

	function log(uint p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
	}

	function log(uint p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
	}

	function log(uint p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
	}

	function log(uint p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
	}

	function log(uint p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
	}

	function log(uint p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
	}

	function log(uint p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
	}

	function log(uint p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
	}

	function log(uint p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
	}

	function log(uint p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
	}

	function log(string memory p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
	}

	function log(string memory p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
	}

	function log(string memory p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
	}

	function log(string memory p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
	}

	function log(bool p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
	}

	function log(bool p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
	}

	function log(bool p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
	}

	function log(bool p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
	}

	function log(bool p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
	}

	function log(bool p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
	}

	function log(bool p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
	}

	function log(bool p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
	}

	function log(bool p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
	}

	function log(bool p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
	}

	function log(bool p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
	}

	function log(bool p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
	}

	function log(address p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
	}

	function log(address p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
	}

	function log(address p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
	}

	function log(address p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
	}

	function log(address p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
	}

	function log(address p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
	}

	function log(address p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
	}

	function log(address p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
	}

	function log(address p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
	}

	function log(address p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
	}

	function log(address p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
	}

	function log(address p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
	}

	function log(address p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
	}

	function log(address p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
	}

	function log(address p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
	}

	function log(address p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
	}

	function log(uint p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
	}

}

File 3 of 3: UniformRandomNumber.sol
pragma solidity ^0.7.6;

///**
// * @author Brendan Asselstine
// * @notice A library that uses entropy to select a random number within a bound.  Compensates for modulo bias.
// * @dev Thanks to https://medium.com/hownetworks/dont-waste-cycles-with-modulo-bias-35b6fdafcf94
// */
//library UniformRandomNumber {
//  /// @notice Select a random number without modulo bias using a random seed and upper bound
//  /// @param _entropy The seed for randomness
//  /// @param _upperBound The upper bound of the desired number
//  /// @return A random number less than the _upperBound
//  function uniform(uint256 _entropy, uint256 _upperBound) internal pure returns (uint256) {
//    require(_upperBound > 0, "UniformRand/min-bound");
//    uint256 negation = _upperBound & (~_upperBound + 1);
//    uint256 min = negation % _upperBound;
//    uint256 random = _entropy;
//    while (true) {
//      if (random >= min) {
//        break;
//      }
//      random = uint256(keccak256(abi.encodePacked(random)));
//    }
//    return random % _upperBound;
//  }
//}


library UniformRandomNumber {
  /// @notice Select a random number without modulo bias using a random seed and upper bound
  /// @param _entropy The seed for randomness
  /// @param _upperBound The upper bound of the desired number
  /// @return A random number less than the _upperBound
  function uniform(uint256 _entropy, uint256 _upperBound) internal pure returns (uint256) {
    require(_upperBound > 0, "UniformRand/min-bound");
    uint256 min = -_upperBound % _upperBound;
    uint256 random = _entropy;
    while (true) {
      if (random >= min) {
        break;
      }
      random = uint256(keccak256(abi.encodePacked(random)));
    }
    return random % _upperBound;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_dateTime","type":"address"},{"internalType":"address payable","name":"_beneficiary1","type":"address"},{"internalType":"address payable","name":"_beneficiary2","type":"address"},{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"string","name":"_uriExtension","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"HasRebelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"address","name":"minter","type":"address"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[],"name":"SaleBegins","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"},{"inputs":[],"name":"MAX_REBEL_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","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":"_balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"basePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cannotUpdateRebellionLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"_approvalAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rebelLeader","type":"address"}],"name":"getRebelLeaderCount","outputs":[{"internalType":"uint256","name":"_rebelCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"heartBeatOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_token","type":"uint256"}],"name":"heartBeatToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftIndex","type":"uint256"}],"name":"idWillRebel","outputs":[{"internalType":"bool","name":"_willRebelBool","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":"_isApprovedForAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockRebellionState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintsRemaining","outputs":[{"internalType":"uint256","name":"_remaining","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"ownerWillRebel","outputs":[{"internalType":"uint256","name":"_willRebelCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"pauseMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebellion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rebellionLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebellionPointer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebellionPointerResetDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"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":[],"name":"saleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sealContract","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":"uint256","name":"_price","type":"uint256"}],"name":"startSale","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":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_rebellionLockState","type":"bool"}],"name":"toggleRebellionLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"_token","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"_token","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"_total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"},{"internalType":"string","name":"_newUriExtension","type":"string"}],"name":"updateURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60c0604052600a608081905269526562656c50756e6b7360b01b60a09081526200002d9160069190620005bf565b5060408051808201909152600780825266e2889e50554e4b60c81b60209092019182526200005c9181620005bf565b5060006008819055600b805460ff60a01b19908116909155612720805462ffffff19169055612723805460ff191660011761ff001916905561272491909155614e388054909116905560fa614e3955348015620000b857600080fd5b50604051620047f9380380620047f9833981810160405260a0811015620000de57600080fd5b8151602083015160408085015160608601805192519496939591949391820192846401000000008211156200011257600080fd5b9083019060208201858111156200012857600080fd5b82516401000000008111828201881017156200014357600080fd5b82525081516020918201929091019080838360005b838110156200017257818101518382015260200162000158565b50505050905090810190601f168015620001a05780820380516001836020036101000a031916815260200191505b5060405260200180516040519392919084640100000000821115620001c457600080fd5b908301906020820185811115620001da57600080fd5b8251640100000000811182820188101715620001f557600080fd5b82525081516020918201929091019080838360005b83811015620002245781810151838201526020016200020a565b50505050905090810190601f168015620002525780820380516001836020036101000a031916815260200191505b506040525050600060208181527f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c58054600160ff1991821681179092557ff7815fccbf112960a73756e185887fedcb9fc64ca0a16cc5923b7960ed78080080548216831790557f77b7bbe0e49b76487c9476b5db3354cf5270619d0037ccb899c2a4c4a75b431880548216831790557f9562381dfbc2d8b8b66e765249f330164b73e329e5f01670660643571d1974df805482168317905563152a902d60e11b9093527f03d0ca955bb9c0bb876dc6b3ab3a195137821186d57727265025ae8a35da9d8280549093161790915560098054336001600160a01b031991821617909155614e37805482166001600160a01b038a81169190911791829055614e38805492821692841692909217909155600a80548316898316179055600b80549092169087161790558351620003ae925061271e91850190620005bf565b508051620003c59061271f906020840190620005bf565b50620003d0620003db565b50505050506200066b565b6000612724819055614e3854604080516392d6631360e01b8152426004820181905291519193926001600160a01b0316916392d6631391602480820192602092909190829003018186803b1580156200043357600080fd5b505afa15801562000448573d6000803e3d6000fd5b505050506040513d60208110156200045f57600080fd5b5051614e385460408051635e05bd6d60e01b815260048181018590526024820181905260156044830152606482015260006084820181905260a48201819052915193945090926001600160a01b0390921691635e05bd6d9160c480820192602092909190829003018186803b158015620004d857600080fd5b505afa158015620004ed573d6000803e3d6000fd5b505050506040513d60208110156200050457600080fd5b5051905082811015620005b757614e385460408051635e05bd6d60e01b8152600185016004828101919091526024820181905260156044830152606482015260006084820181905260a482015290516001600160a01b0390921691635e05bd6d9160c480820192602092909190829003018186803b1580156200058657600080fd5b505afa1580156200059b573d6000803e3d6000fd5b505050506040513d6020811015620005b257600080fd5b505190505b614e36555050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620005f7576000855562000642565b82601f106200061257805160ff191683800117855562000642565b8280016001018555821562000642579182015b828111156200064257825182559160200191906001019062000625565b506200065092915062000654565b5090565b5b8082111562000650576000815560010162000655565b61417e806200067b6000396000f3fe6080604052600436106103075760003560e01c80635404e6d71161019a57806398d5fdca116100e1578063c5b584131161008a578063e8db40c511610064578063e8db40c514610bd4578063e985e9c514610c14578063fdcce7d514610c5c57610307565b8063c5b5841314610b80578063c87b56dd14610b95578063daf63ed814610bbf57610307565b8063b6501637116100bb578063b650163714610aac578063b88d4fde14610ac1578063c5ac0ded14610b6b57610307565b806398d5fdca14610a32578063a0712d6814610a47578063a22cb46514610a6457610307565b806370a08231116101435780637cd2a0251161011d5780637cd2a025146109dc5780638e021c0614610a0857806395d89b4114610a1d57610307565b806370a0823114610947578063747fb20f14610987578063793d76d9146109c757610307565b806368bd580e1161017457806368bd580e146108f35780636c0360eb14610908578063706ce0301461091d57610307565b80635404e6d7146108885780635ec390d81461089d5780636352211e146108c957610307565b80631cbaee2d1161025e5780633a283bd21161020757806344c66be7116101e157806344c66be7146108345780634f6ccce71461084957806352ee46961461087357610307565b80633a283bd2146107ba57806341388081146107cf57806342842e0e146107e457610307565b80632a55205a116102385780632a55205a146106ff5780632f745c591461075f57806333bc1c5c146107a557610307565b80631cbaee2d146106705780631cd7b8c31461068557806323b872dd146106af57610307565b806306fdde03116102c05780630e3ab61d1161029a5780630e3ab61d146104f75780631789e2d81461052157806318160ddd1461065b57610307565b806306fdde03146103d4578063081812fc1461045e578063095ea7b3146104b157610307565b8063030ba5d9116102f1578063030ba5d914610383578063031bd4c41461039857806305e39833146103bf57610307565b8062e527f71461030c57806301ffc9a714610323575b600080fd5b34801561031857600080fd5b50610321610c71565b005b34801561032f57600080fd5b5061036f6004803603602081101561034657600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610d26565b604080519115158252519081900360200190f35b34801561038f57600080fd5b50610321610d61565b3480156103a457600080fd5b506103ad610d6c565b60408051918252519081900360200190f35b3480156103cb57600080fd5b5061036f610d72565b3480156103e057600080fd5b506103e9610d7c565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561042357818101518382015260200161040b565b50505050905090810190601f1680156104505780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561046a57600080fd5b506104886004803603602081101561048157600080fd5b5035610e30565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156104bd57600080fd5b50610321600480360360408110156104d457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610eec565b34801561050357600080fd5b506103216004803603602081101561051a57600080fd5b5035611108565b34801561052d57600080fd5b506103216004803603604081101561054457600080fd5b81019060208101813564010000000081111561055f57600080fd5b82018360208201111561057157600080fd5b8035906020019184600183028401116401000000008311171561059357600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156105e657600080fd5b8201836020820111156105f857600080fd5b8035906020019184600183028401116401000000008311171561061a57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061119a945050505050565b34801561066757600080fd5b506103ad6112c1565b34801561067c57600080fd5b506103ad6112c7565b34801561069157600080fd5b5061036f600480360360208110156106a857600080fd5b50356112cd565b3480156106bb57600080fd5b50610321600480360360608110156106d257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356112de565b34801561070b57600080fd5b5061072f6004803603604081101561072257600080fd5b508035906020013561159a565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091528051918290030190f35b34801561076b57600080fd5b506103ad6004803603604081101561078257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356115f6565b3480156107b157600080fd5b5061036f61166b565b3480156107c657600080fd5b5061036f61168c565b3480156107db57600080fd5b5061032161169b565b3480156107f057600080fd5b506103216004803603606081101561080757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135611b5c565b34801561084057600080fd5b506103ad611b77565b34801561085557600080fd5b506103ad6004803603602081101561086c57600080fd5b5035611b95565b34801561087f57600080fd5b506103e9611bac565b34801561089457600080fd5b5061036f611c59565b3480156108a957600080fd5b50610321600480360360208110156108c057600080fd5b50351515611c68565b3480156108d557600080fd5b50610488600480360360208110156108ec57600080fd5b5035611d9f565b3480156108ff57600080fd5b50610321611df6565b34801561091457600080fd5b506103e9611eac565b34801561092957600080fd5b506103216004803603602081101561094057600080fd5b5035611f26565b34801561095357600080fd5b506103ad6004803603602081101561096a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611fc5565b34801561099357600080fd5b506103ad600480360360208110156109aa57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611fd0565b3480156109d357600080fd5b506103ad611ff9565b3480156109e857600080fd5b50610321600480360360208110156109ff57600080fd5b50351515612000565b348015610a1457600080fd5b5061032161211a565b348015610a2957600080fd5b506103e96121ce565b348015610a3e57600080fd5b506103ad61224d565b61032160048036036020811015610a5d57600080fd5b50356122e0565b348015610a7057600080fd5b5061032160048036036040811015610a8757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515612763565b348015610ab857600080fd5b5061036f6127fc565b348015610acd57600080fd5b5061032160048036036080811015610ae457600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359190810190608081016060820135640100000000811115610b2c57600080fd5b820183602082011115610b3e57600080fd5b80359060200191846001830284011164010000000083111715610b6057600080fd5b50909250905061280c565b348015610b7757600080fd5b506103ad612855565b348015610b8c57600080fd5b5061036f61285c565b348015610ba157600080fd5b506103e960048036036020811015610bb857600080fd5b5035612866565b348015610bcb57600080fd5b506103ad612a66565b348015610be057600080fd5b506103ad60048036036020811015610bf757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612a6b565b348015610c2057600080fd5b5061036f60048036036040811015610c3757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612aea565b348015610c6857600080fd5b506103ad612b25565b60095473ffffffffffffffffffffffffffffffffffffffff163314610cf757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4f6e6c79206465706c6f7965722e000000000000000000000000000000000000604482015290519081900360640190fd5b61272380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526020819052604090205460ff165b919050565b610d6a33612b2c565b565b61271081565b6127205460ff1681565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e265780601f10610dfb57610100808354040283529160200191610e26565b820191906000526020600020905b815481529060010190602001808311610e0957829003601f168201915b5050505050905090565b600081815260016020526040812054829073ffffffffffffffffffffffffffffffffffffffff16610ec257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e76616c696420746f6b656e2e000000000000000000000000000000000000604482015290519081900360640190fd5b505060009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600081815260016020526040902054819073ffffffffffffffffffffffffffffffffffffffff1633811480610f51575073ffffffffffffffffffffffffffffffffffffffff8116600090815260036020908152604080832033845290915290205460ff165b610fbc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616e6e6f74206f7065726174652e0000000000000000000000000000000000604482015290519081900360640190fd5b600083815260016020526040902054839073ffffffffffffffffffffffffffffffffffffffff1661104e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e76616c696420746f6b656e2e000000000000000000000000000000000000604482015290519081900360640190fd5b60008481526001602052604090205473ffffffffffffffffffffffffffffffffffffffff90811690861681141561108457600080fd5b60008581526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b60095473ffffffffffffffffffffffffffffffffffffffff16331461118e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4f6e6c79206465706c6f7965722e000000000000000000000000000000000000604482015290519081900360640190fd5b61119781612b94565b50565b60095473ffffffffffffffffffffffffffffffffffffffff16331461122057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4f6e6c79206465706c6f7965722e000000000000000000000000000000000000604482015290519081900360640190fd5b6127205460ff161561129357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5552492063616e206e6f206c6f6e67657220626520757064617465642e000000604482015290519081900360640190fd5b81516112a79061271e906020850190613ff3565b5080516112bc9061271f906020840190613ff3565b505050565b60085490565b600d5481565b60006112d882612c30565b92915050565b600081815260016020526040902054819073ffffffffffffffffffffffffffffffffffffffff1633811480611336575060008281526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b80611371575073ffffffffffffffffffffffffffffffffffffffff8116600090815260036020908152604080832033845290915290205460ff165b6113dc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616e6e6f74207472616e736665722e00000000000000000000000000000000604482015290519081900360640190fd5b600083815260016020526040902054839073ffffffffffffffffffffffffffffffffffffffff1661146e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e76616c696420746f6b656e2e000000000000000000000000000000000000604482015290519081900360640190fd5b60008481526001602052604090205473ffffffffffffffffffffffffffffffffffffffff908116908716811461150557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f57726f6e672066726f6d20616464726573732e00000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff861661158757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f43616e6e6f742073656e6420746f203078302e00000000000000000000000000604482015290519081900360640190fd5b6115918686612c6f565b50505050505050565b60008060006115ac84614e3954612d1a565b90506115b781612d54565b60006115d16115c983614e3954612dc3565b612710612deb565b600a5473ffffffffffffffffffffffffffffffffffffffff1697909650945050505050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040812054821061162757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260046020526040902080548390811061165857fe5b9060005260206000200154905092915050565b600b5474010000000000000000000000000000000000000000900460ff1681565b61272054610100900460ff1681565b600b5474010000000000000000000000000000000000000000900460ff1661172457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f53616c65206e6f7420737461727465642e000000000000000000000000000000604482015290519081900360640190fd5b6127235460ff16151560011461179b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f526562656c6c696f6e206973206c6f636b65642e000000000000000000000000604482015290519081900360640190fd5b614e3854604080517f92d6631300000000000000000000000000000000000000000000000000000000815242600482018190529151919260009273ffffffffffffffffffffffffffffffffffffffff909116916392d66313916024808301926020929190829003018186803b15801561181357600080fd5b505afa158015611827573d6000803e3d6000fd5b505050506040513d602081101561183d57600080fd5b5051614e3854604080517f5e05bd6d0000000000000000000000000000000000000000000000000000000081526004818101859052602482015260146044820152600e606482015260006084820181905260a482018190529151939450909273ffffffffffffffffffffffffffffffffffffffff90921691635e05bd6d9160c480820192602092909190829003018186803b1580156118db57600080fd5b505afa1580156118ef573d6000803e3d6000fd5b505050506040513d602081101561190557600080fd5b5051614e3854604080517f5e05bd6d00000000000000000000000000000000000000000000000000000000815260048181018790526024820181905260156044830152606482015260006084820181905260a482018190529151939450909273ffffffffffffffffffffffffffffffffffffffff90921691635e05bd6d9160c480820192602092909190829003018186803b1580156119a357600080fd5b505afa1580156119b7573d6000803e3d6000fd5b505050506040513d60208110156119cd57600080fd5b505190508184108015906119e057508084105b611a35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806141266023913960400191505060405180910390fd5b614e385474010000000000000000000000000000000000000000900460ff1615611a5e57600080fd5b614e3880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905561272454158015611ab0575060085415155b15611aba57611b2d565b600854612724541415611acc57611b2d565b61272454600854036014811115611ae1575060145b60005b81811015611b1457611b0c612725612724546127108110611b0157fe5b015461272454612dfe565b600101611ae4565b5033600090815261272160205260409020805490910190555b5050614e3880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690555050565b6112bc83838360405180602001604052806000815250612e98565b6000611b9060085461271061327a90919063ffffffff16565b905090565b60006127108210611ba557600080fd5b5060010190565b61271f805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015611c515780601f10611c2657610100808354040283529160200191611c51565b820191906000526020600020905b815481529060010190602001808311611c3457829003601f168201915b505050505081565b61272354610100900460ff1681565b60095473ffffffffffffffffffffffffffffffffffffffff163314611cee57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4f6e6c79206465706c6f7965722e000000000000000000000000000000000000604482015290519081900360640190fd5b6127205462010000900460ff1615611d6757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f436f6e7472616374207365616c65642e00000000000000000000000000000000604482015290519081900360640190fd5b6127208054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b60008181526001602052604081205473ffffffffffffffffffffffffffffffffffffffff16611dcd57600080fd5b5060009081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60095473ffffffffffffffffffffffffffffffffffffffff163314611e7c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4f6e6c79206465706c6f7965722e000000000000000000000000000000000000604482015290519081900360640190fd5b61272080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1662010000179055565b61271e805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015611c515780601f10611c2657610100808354040283529160200191611c51565b600081815260016020526040902054819073ffffffffffffffffffffffffffffffffffffffff16611fb857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e76616c696420746f6b656e2e000000000000000000000000000000000000604482015290519081900360640190fd5b611fc18261328f565b5050565b60006112d882613526565b73ffffffffffffffffffffffffffffffffffffffff166000908152612721602052604090205490565b614e365481565b60095473ffffffffffffffffffffffffffffffffffffffff16331461208657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4f6e6c79206465706c6f7965722e000000000000000000000000000000000000604482015290519081900360640190fd5b61272354610100900460ff16156120e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140c06022913960400191505060405180910390fd5b61272380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60095473ffffffffffffffffffffffffffffffffffffffff1633146121a057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4f6e6c79206465706c6f7965722e000000000000000000000000000000000000604482015290519081900360640190fd5b61272080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60078054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e265780601f10610dfb57610100808354040283529160200191610e26565b600b5460009074010000000000000000000000000000000000000000900460ff166122d957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f53616c65206e6f7420737461727465642e000000000000000000000000000000604482015290519081900360640190fd5b50600c5490565b600b5474010000000000000000000000000000000000000000900460ff1661236957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f53616c65206e6f7420737461727465642e000000000000000000000000000000604482015290519081900360640190fd5b614e385474010000000000000000000000000000000000000000900460ff161561239257600080fd5b614e3880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055601481111561242c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140e26022913960400191505060405180910390fd5b6000811161249b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4d757374206d696e74206174206c65617374203120726562656c2e0000000000604482015290519081900360640190fd5b61272054610100900460ff16156124fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806141046022913960400191505060405180910390fd5b6008546127109061250e908361354e565b1115612565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614095602b913960400191505060405180910390fd5b600c5434906125749083612dc3565b11156125e157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563742e604482015290519081900360640190fd5b600c546125ee9082612dc3565b34111561263d57600c5433906108fc906126139061260c9085612dc3565b349061327a565b6040518115909202916000818181858888f1935050505015801561263b573d6000803e3d6000fd5b505b600a54600c5473ffffffffffffffffffffffffffffffffffffffff909116906108fc906126839060649061267d90612676906046612dc3565b8690612dc3565b90612deb565b6040518115909202916000818181858888f193505050501580156126ab573d6000803e3d6000fd5b50600b54600c5473ffffffffffffffffffffffffffffffffffffffff909116906108fc906126e59060649061267d9061267690601e612dc3565b6040518115909202916000818181858888f1935050505015801561270d573d6000803e3d6000fd5b5060005b8181101561273657612710600854101561272e5761272e3361355e565b600101612711565b5050614e3880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055565b33600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6127205462010000900460ff1681565b61284e85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e9892505050565b5050505050565b614e395481565b6127235460ff1681565b600081815260016020526040902054606090829073ffffffffffffffffffffffffffffffffffffffff166128fb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e76616c696420746f6b656e2e000000000000000000000000000000000000604482015290519081900360640190fd5b61271e61290784613706565b61271f60405160200180848054600181600116156101000203166002900480156129685780601f10612946576101008083540402835291820191612968565b820191906000526020600020905b815481529060010190602001808311612954575b5050835160208501908083835b602083106129b257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612975565b6001836020036101000a03801982511681845116808217855250505050505090500182805460018160011615610100020316600290048015612a2b5780601f10612a09576101008083540402835291820191612a2b565b820191906000526020600020905b815481529060010190602001808311612a17575b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052979650505050505050565b601481565b60008080612a7884613526565b905060005b81811015612ae15773ffffffffffffffffffffffffffffffffffffffff85166000908152600460205260408120805483908110612ab657fe5b90600052602060002001549050612acc81612c30565b15612ad8576001909301925b50600101612a7d565b50909392505050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260036020908152604080832093909416825291909152205460ff1690565b6127245481565b6000612b3782613526565b905060005b818110156112bc5773ffffffffffffffffffffffffffffffffffffffff83166000908152600460205260408120805483908110612b7557fe5b90600052602060002001549050612b8b8161328f565b50600101612b3c565b600b5474010000000000000000000000000000000000000000900460ff1615612bbc57600080fd5b600c81905542600d55600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f771cfe172460b7d64cc46cca57a1e1f40f52b47cf1d16fe30c78a2935b3dd58090600090a150565b600060085460001415612c4557506000610d5c565b612724546000838152614e3560205260409020541015612c6757506000610d5c565b506001919050565b60008181526001602052604090205473ffffffffffffffffffffffffffffffffffffffff16612c9d82613833565b612ca78183613893565b612cb18383613a91565b612cba8261328f565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080612d27848461354e565b90506000612d3682600161327a565b9050612d4b612d458286612deb565b85612dc3565b95945050505050565b6040805160248082018490528251808303909101815260449091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff5b1bba90000000000000000000000000000000000000000000000000000000017905261119790613bb2565b600082612dd2575060006112d8565b5081810281838281612de057fe5b04146112d857600080fd5b6000818381612df657fe5b049392505050565b600060016000612725612e1085613bd3565b6127108110612e1b57fe5b0154815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff169050612e508184612c6f565b60405173ffffffffffffffffffffffffffffffffffffffff82169084907fcb45e8ccb1873f0431eec7472d25b75159d1f92672d534868976c70f331d99e490600090a3505050565b600082815260016020526040902054829073ffffffffffffffffffffffffffffffffffffffff1633811480612ef0575060008281526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b80612f2b575073ffffffffffffffffffffffffffffffffffffffff8116600090815260036020908152604080832033845290915290205460ff165b612f9657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616e6e6f74207472616e736665722e00000000000000000000000000000000604482015290519081900360640190fd5b600084815260016020526040902054849073ffffffffffffffffffffffffffffffffffffffff1661302857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e76616c696420746f6b656e2e000000000000000000000000000000000000604482015290519081900360640190fd5b60008581526001602052604090205473ffffffffffffffffffffffffffffffffffffffff90811690881681146130bf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e636f7272656374206f776e65722e00000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff87166130df57600080fd5b6130e98787612c6f565b6130f287613c2b565b156132705760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156131a357818101518382015260200161318b565b50505050905090810190601f1680156131d05780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156131f257600080fd5b505af1158015613206573d6000803e3d6000fd5b505050506040513d602081101561321c57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167f150b7a02000000000000000000000000000000000000000000000000000000001461326e57600080fd5b505b5050505050505050565b60008282111561328957600080fd5b50900390565b600081815260016020526040902054819073ffffffffffffffffffffffffffffffffffffffff1661332157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e76616c696420746f6b656e2e000000000000000000000000000000000000604482015290519081900360640190fd5b42614e3654101561333457613334613c31565b61271061272454141561334657611fc1565b6000828152614e3560205260409020541580156133665750612725548214155b15613458576001600854036127245414156133ba578161272561272454612710811061338e57fe5b0155612724546000838152614e35602052604090208190556133b190600161354e565b61272455613453565b6127256127245461271081106133cc57fe5b015461272560016008540361271081106133e257fe5b0181905550600160085403614e35600061272561272454612710811061340457fe5b01548152602001908152602001600020819055508161272561272454612710811061342b57fe5b0155612724546000838152614e356020526040902081905561344e90600161354e565b612724555b611fc1565b612724546000838152614e356020526040902054101561347757611fc1565b61272561272454612710811061348957fe5b01546000838152614e3560205260409020546127259061271081106134aa57fe5b01556000828152614e3560208190526040822054612724549092906127259061271081106134d457fe5b0154815260200190815260200160002081905550816127256127245461271081106134fb57fe5b0155612724546000838152614e356020526040902081905561351e90600161354e565b612724555050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b818101828110156112d857600080fd5b73ffffffffffffffffffffffffffffffffffffffff81166135e057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f43616e6e6f74206d696e7420746f203078302e00000000000000000000000000604482015290519081900360640190fd5b6127106008541061365257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f546f6b656e206c696d697420726561636865642e000000000000000000000000604482015290519081900360640190fd5b600061365c613e7d565b60088054600101905590506136718282613a91565b61367a8161328f565b60405173ffffffffffffffffffffffffffffffffffffffff83169082907ff3cea5493d790af0133817606f7350a91d7f154ea52eaa79d179d4d231e5010290600090a3604051819073ffffffffffffffffffffffffffffffffffffffff8416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606081613747575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610d5c565b8160005b811561375f57600101600a8204915061374b565b60008167ffffffffffffffff8111801561377857600080fd5b506040519080825280601f01601f1916602001820160405280156137a3576020820181803683370190505b5085935090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b831561382a57600a840660300160f81b828280600190039350815181106137f057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a840493506137cd565b50949350505050565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff161561119757600090815260026020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60008181526001602052604090205473ffffffffffffffffffffffffffffffffffffffff83811691161461392857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e636f7272656374206f776e65722e00000000000000000000000000000000604482015290519081900360640190fd5b600081815260016020818152604080842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600582528084205473ffffffffffffffffffffffffffffffffffffffff871685526004909252832054909291613995919061327a565b9050818114613a475773ffffffffffffffffffffffffffffffffffffffff841660009081526004602052604081208054839081106139cf57fe5b9060005260206000200154905080600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110613a2757fe5b600091825260208083209091019290925591825260059052604090208290555b73ffffffffffffffffffffffffffffffffffffffff84166000908152600460205260409020805480613a7557fe5b6001900381819060005260206000200160009055905550505050565b60008181526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1615613b2257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f43616e6e6f74206164642c20616c7265616479206f776e65642e000000000000604482015290519081900360640190fd5b600081815260016020818152604080842080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff881690811790915580855260048352908420805480850182558186529285209092018590559092529054613b9f9161327a565b6000918252600560205260409091205550565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b6127225460408051426020808301919091523360601b828401526054808301949094528251808303909401845260749091019091528151910120600090613c1a8184613f2b565b612722805460010190559392505050565b3b151590565b6000612724819055614e3854604080517f92d663130000000000000000000000000000000000000000000000000000000081524260048201819052915191939273ffffffffffffffffffffffffffffffffffffffff16916392d6631391602480820192602092909190829003018186803b158015613cae57600080fd5b505afa158015613cc2573d6000803e3d6000fd5b505050506040513d6020811015613cd857600080fd5b5051614e3854604080517f5e05bd6d00000000000000000000000000000000000000000000000000000000815260048181018590526024820181905260156044830152606482015260006084820181905260a482018190529151939450909273ffffffffffffffffffffffffffffffffffffffff90921691635e05bd6d9160c480820192602092909190829003018186803b158015613d7657600080fd5b505afa158015613d8a573d6000803e3d6000fd5b505050506040513d6020811015613da057600080fd5b5051905082811015613e7557614e3854604080517f5e05bd6d000000000000000000000000000000000000000000000000000000008152600185016004828101919091526024820181905260156044830152606482015260006084820181905260a4820152905173ffffffffffffffffffffffffffffffffffffffff90921691635e05bd6d9160c480820192602092909190829003018186803b158015613e4657600080fd5b505afa158015613e5a573d6000803e3d6000fd5b505050506040513d6020811015613e7057600080fd5b505190505b614e36555050565b6008546000906127100381613e9182613bd3565b90506000600e826127108110613ea357fe5b015415613ec157600e826127108110613eb857fe5b01549050613ec4565b50805b600e600184036127108110613ed557fe5b0154613ef45760018303600e836127108110613eed57fe5b0155613f18565b600e600184036127108110613f0557fe5b0154600e836127108110613f1557fe5b01555b613f2381600161354e565b935050505090565b6000808211613f9b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f556e69666f726d52616e642f6d696e2d626f756e640000000000000000000000604482015290519081900360640190fd5b6000828360000381613fa957fe5b069050835b818110613fba57613fe0565b604080516020808201939093528151808203840181529082019091528051910120613fae565b838181613fe957fe5b0695945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282614029576000855561406f565b82601f1061404257805160ff191683800117855561406f565b8280016001018555821561406f579182015b8281111561406f578251825591602001919060010190614054565b5061407b92915061407f565b5090565b5b8082111561407b576000815560010161408056fe507572636861736520776f756c6420657863656564206d617820737570706c79206f6620526562656c732e526562656c6c696f6e2073746174652063616e6e6f7420626520757064617465642e43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d652e526562656c7320686176652070617573656420616c6c206f7065726174696f6e732e596f2c2069742773206e6f74203432302e20476574206261636b20746f20776f726b2ea2646970667358221220efc1e8445e3873e962a9807c1f43d5f0a346de2eaa88cad0bbaffcdc4286130e64736f6c634300070600330000000000000000000000009ca002139899dfa818d3c16175ad698b14c3f4d0000000000000000000000000a04562f2659fa2a49cc2490c9ec9223b7c990bd8000000000000000000000000505d07c4a6605e90300fd81ca6797c17108eba5100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000002368747470733a2f2f7777772e746176617461722e696f2f6170692f7572693f7572693d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103075760003560e01c80635404e6d71161019a57806398d5fdca116100e1578063c5b584131161008a578063e8db40c511610064578063e8db40c514610bd4578063e985e9c514610c14578063fdcce7d514610c5c57610307565b8063c5b5841314610b80578063c87b56dd14610b95578063daf63ed814610bbf57610307565b8063b6501637116100bb578063b650163714610aac578063b88d4fde14610ac1578063c5ac0ded14610b6b57610307565b806398d5fdca14610a32578063a0712d6814610a47578063a22cb46514610a6457610307565b806370a08231116101435780637cd2a0251161011d5780637cd2a025146109dc5780638e021c0614610a0857806395d89b4114610a1d57610307565b806370a0823114610947578063747fb20f14610987578063793d76d9146109c757610307565b806368bd580e1161017457806368bd580e146108f35780636c0360eb14610908578063706ce0301461091d57610307565b80635404e6d7146108885780635ec390d81461089d5780636352211e146108c957610307565b80631cbaee2d1161025e5780633a283bd21161020757806344c66be7116101e157806344c66be7146108345780634f6ccce71461084957806352ee46961461087357610307565b80633a283bd2146107ba57806341388081146107cf57806342842e0e146107e457610307565b80632a55205a116102385780632a55205a146106ff5780632f745c591461075f57806333bc1c5c146107a557610307565b80631cbaee2d146106705780631cd7b8c31461068557806323b872dd146106af57610307565b806306fdde03116102c05780630e3ab61d1161029a5780630e3ab61d146104f75780631789e2d81461052157806318160ddd1461065b57610307565b806306fdde03146103d4578063081812fc1461045e578063095ea7b3146104b157610307565b8063030ba5d9116102f1578063030ba5d914610383578063031bd4c41461039857806305e39833146103bf57610307565b8062e527f71461030c57806301ffc9a714610323575b600080fd5b34801561031857600080fd5b50610321610c71565b005b34801561032f57600080fd5b5061036f6004803603602081101561034657600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610d26565b604080519115158252519081900360200190f35b34801561038f57600080fd5b50610321610d61565b3480156103a457600080fd5b506103ad610d6c565b60408051918252519081900360200190f35b3480156103cb57600080fd5b5061036f610d72565b3480156103e057600080fd5b506103e9610d7c565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561042357818101518382015260200161040b565b50505050905090810190601f1680156104505780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561046a57600080fd5b506104886004803603602081101561048157600080fd5b5035610e30565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156104bd57600080fd5b50610321600480360360408110156104d457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610eec565b34801561050357600080fd5b506103216004803603602081101561051a57600080fd5b5035611108565b34801561052d57600080fd5b506103216004803603604081101561054457600080fd5b81019060208101813564010000000081111561055f57600080fd5b82018360208201111561057157600080fd5b8035906020019184600183028401116401000000008311171561059357600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156105e657600080fd5b8201836020820111156105f857600080fd5b8035906020019184600183028401116401000000008311171561061a57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061119a945050505050565b34801561066757600080fd5b506103ad6112c1565b34801561067c57600080fd5b506103ad6112c7565b34801561069157600080fd5b5061036f600480360360208110156106a857600080fd5b50356112cd565b3480156106bb57600080fd5b50610321600480360360608110156106d257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356112de565b34801561070b57600080fd5b5061072f6004803603604081101561072257600080fd5b508035906020013561159a565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091528051918290030190f35b34801561076b57600080fd5b506103ad6004803603604081101561078257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356115f6565b3480156107b157600080fd5b5061036f61166b565b3480156107c657600080fd5b5061036f61168c565b3480156107db57600080fd5b5061032161169b565b3480156107f057600080fd5b506103216004803603606081101561080757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135611b5c565b34801561084057600080fd5b506103ad611b77565b34801561085557600080fd5b506103ad6004803603602081101561086c57600080fd5b5035611b95565b34801561087f57600080fd5b506103e9611bac565b34801561089457600080fd5b5061036f611c59565b3480156108a957600080fd5b50610321600480360360208110156108c057600080fd5b50351515611c68565b3480156108d557600080fd5b50610488600480360360208110156108ec57600080fd5b5035611d9f565b3480156108ff57600080fd5b50610321611df6565b34801561091457600080fd5b506103e9611eac565b34801561092957600080fd5b506103216004803603602081101561094057600080fd5b5035611f26565b34801561095357600080fd5b506103ad6004803603602081101561096a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611fc5565b34801561099357600080fd5b506103ad600480360360208110156109aa57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611fd0565b3480156109d357600080fd5b506103ad611ff9565b3480156109e857600080fd5b50610321600480360360208110156109ff57600080fd5b50351515612000565b348015610a1457600080fd5b5061032161211a565b348015610a2957600080fd5b506103e96121ce565b348015610a3e57600080fd5b506103ad61224d565b61032160048036036020811015610a5d57600080fd5b50356122e0565b348015610a7057600080fd5b5061032160048036036040811015610a8757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515612763565b348015610ab857600080fd5b5061036f6127fc565b348015610acd57600080fd5b5061032160048036036080811015610ae457600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359190810190608081016060820135640100000000811115610b2c57600080fd5b820183602082011115610b3e57600080fd5b80359060200191846001830284011164010000000083111715610b6057600080fd5b50909250905061280c565b348015610b7757600080fd5b506103ad612855565b348015610b8c57600080fd5b5061036f61285c565b348015610ba157600080fd5b506103e960048036036020811015610bb857600080fd5b5035612866565b348015610bcb57600080fd5b506103ad612a66565b348015610be057600080fd5b506103ad60048036036020811015610bf757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612a6b565b348015610c2057600080fd5b5061036f60048036036040811015610c3757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612aea565b348015610c6857600080fd5b506103ad612b25565b60095473ffffffffffffffffffffffffffffffffffffffff163314610cf757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4f6e6c79206465706c6f7965722e000000000000000000000000000000000000604482015290519081900360640190fd5b61272380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526020819052604090205460ff165b919050565b610d6a33612b2c565b565b61271081565b6127205460ff1681565b60068054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e265780601f10610dfb57610100808354040283529160200191610e26565b820191906000526020600020905b815481529060010190602001808311610e0957829003601f168201915b5050505050905090565b600081815260016020526040812054829073ffffffffffffffffffffffffffffffffffffffff16610ec257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e76616c696420746f6b656e2e000000000000000000000000000000000000604482015290519081900360640190fd5b505060009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600081815260016020526040902054819073ffffffffffffffffffffffffffffffffffffffff1633811480610f51575073ffffffffffffffffffffffffffffffffffffffff8116600090815260036020908152604080832033845290915290205460ff165b610fbc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f43616e6e6f74206f7065726174652e0000000000000000000000000000000000604482015290519081900360640190fd5b600083815260016020526040902054839073ffffffffffffffffffffffffffffffffffffffff1661104e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e76616c696420746f6b656e2e000000000000000000000000000000000000604482015290519081900360640190fd5b60008481526001602052604090205473ffffffffffffffffffffffffffffffffffffffff90811690861681141561108457600080fd5b60008581526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b60095473ffffffffffffffffffffffffffffffffffffffff16331461118e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4f6e6c79206465706c6f7965722e000000000000000000000000000000000000604482015290519081900360640190fd5b61119781612b94565b50565b60095473ffffffffffffffffffffffffffffffffffffffff16331461122057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4f6e6c79206465706c6f7965722e000000000000000000000000000000000000604482015290519081900360640190fd5b6127205460ff161561129357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5552492063616e206e6f206c6f6e67657220626520757064617465642e000000604482015290519081900360640190fd5b81516112a79061271e906020850190613ff3565b5080516112bc9061271f906020840190613ff3565b505050565b60085490565b600d5481565b60006112d882612c30565b92915050565b600081815260016020526040902054819073ffffffffffffffffffffffffffffffffffffffff1633811480611336575060008281526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b80611371575073ffffffffffffffffffffffffffffffffffffffff8116600090815260036020908152604080832033845290915290205460ff165b6113dc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616e6e6f74207472616e736665722e00000000000000000000000000000000604482015290519081900360640190fd5b600083815260016020526040902054839073ffffffffffffffffffffffffffffffffffffffff1661146e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e76616c696420746f6b656e2e000000000000000000000000000000000000604482015290519081900360640190fd5b60008481526001602052604090205473ffffffffffffffffffffffffffffffffffffffff908116908716811461150557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f57726f6e672066726f6d20616464726573732e00000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff861661158757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f43616e6e6f742073656e6420746f203078302e00000000000000000000000000604482015290519081900360640190fd5b6115918686612c6f565b50505050505050565b60008060006115ac84614e3954612d1a565b90506115b781612d54565b60006115d16115c983614e3954612dc3565b612710612deb565b600a5473ffffffffffffffffffffffffffffffffffffffff1697909650945050505050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040812054821061162757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260046020526040902080548390811061165857fe5b9060005260206000200154905092915050565b600b5474010000000000000000000000000000000000000000900460ff1681565b61272054610100900460ff1681565b600b5474010000000000000000000000000000000000000000900460ff1661172457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f53616c65206e6f7420737461727465642e000000000000000000000000000000604482015290519081900360640190fd5b6127235460ff16151560011461179b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f526562656c6c696f6e206973206c6f636b65642e000000000000000000000000604482015290519081900360640190fd5b614e3854604080517f92d6631300000000000000000000000000000000000000000000000000000000815242600482018190529151919260009273ffffffffffffffffffffffffffffffffffffffff909116916392d66313916024808301926020929190829003018186803b15801561181357600080fd5b505afa158015611827573d6000803e3d6000fd5b505050506040513d602081101561183d57600080fd5b5051614e3854604080517f5e05bd6d0000000000000000000000000000000000000000000000000000000081526004818101859052602482015260146044820152600e606482015260006084820181905260a482018190529151939450909273ffffffffffffffffffffffffffffffffffffffff90921691635e05bd6d9160c480820192602092909190829003018186803b1580156118db57600080fd5b505afa1580156118ef573d6000803e3d6000fd5b505050506040513d602081101561190557600080fd5b5051614e3854604080517f5e05bd6d00000000000000000000000000000000000000000000000000000000815260048181018790526024820181905260156044830152606482015260006084820181905260a482018190529151939450909273ffffffffffffffffffffffffffffffffffffffff90921691635e05bd6d9160c480820192602092909190829003018186803b1580156119a357600080fd5b505afa1580156119b7573d6000803e3d6000fd5b505050506040513d60208110156119cd57600080fd5b505190508184108015906119e057508084105b611a35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806141266023913960400191505060405180910390fd5b614e385474010000000000000000000000000000000000000000900460ff1615611a5e57600080fd5b614e3880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905561272454158015611ab0575060085415155b15611aba57611b2d565b600854612724541415611acc57611b2d565b61272454600854036014811115611ae1575060145b60005b81811015611b1457611b0c612725612724546127108110611b0157fe5b015461272454612dfe565b600101611ae4565b5033600090815261272160205260409020805490910190555b5050614e3880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690555050565b6112bc83838360405180602001604052806000815250612e98565b6000611b9060085461271061327a90919063ffffffff16565b905090565b60006127108210611ba557600080fd5b5060010190565b61271f805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015611c515780601f10611c2657610100808354040283529160200191611c51565b820191906000526020600020905b815481529060010190602001808311611c3457829003601f168201915b505050505081565b61272354610100900460ff1681565b60095473ffffffffffffffffffffffffffffffffffffffff163314611cee57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4f6e6c79206465706c6f7965722e000000000000000000000000000000000000604482015290519081900360640190fd5b6127205462010000900460ff1615611d6757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f436f6e7472616374207365616c65642e00000000000000000000000000000000604482015290519081900360640190fd5b6127208054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b60008181526001602052604081205473ffffffffffffffffffffffffffffffffffffffff16611dcd57600080fd5b5060009081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60095473ffffffffffffffffffffffffffffffffffffffff163314611e7c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4f6e6c79206465706c6f7965722e000000000000000000000000000000000000604482015290519081900360640190fd5b61272080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1662010000179055565b61271e805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015611c515780601f10611c2657610100808354040283529160200191611c51565b600081815260016020526040902054819073ffffffffffffffffffffffffffffffffffffffff16611fb857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e76616c696420746f6b656e2e000000000000000000000000000000000000604482015290519081900360640190fd5b611fc18261328f565b5050565b60006112d882613526565b73ffffffffffffffffffffffffffffffffffffffff166000908152612721602052604090205490565b614e365481565b60095473ffffffffffffffffffffffffffffffffffffffff16331461208657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4f6e6c79206465706c6f7965722e000000000000000000000000000000000000604482015290519081900360640190fd5b61272354610100900460ff16156120e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140c06022913960400191505060405180910390fd5b61272380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60095473ffffffffffffffffffffffffffffffffffffffff1633146121a057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4f6e6c79206465706c6f7965722e000000000000000000000000000000000000604482015290519081900360640190fd5b61272080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60078054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e265780601f10610dfb57610100808354040283529160200191610e26565b600b5460009074010000000000000000000000000000000000000000900460ff166122d957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f53616c65206e6f7420737461727465642e000000000000000000000000000000604482015290519081900360640190fd5b50600c5490565b600b5474010000000000000000000000000000000000000000900460ff1661236957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f53616c65206e6f7420737461727465642e000000000000000000000000000000604482015290519081900360640190fd5b614e385474010000000000000000000000000000000000000000900460ff161561239257600080fd5b614e3880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055601481111561242c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140e26022913960400191505060405180910390fd5b6000811161249b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4d757374206d696e74206174206c65617374203120726562656c2e0000000000604482015290519081900360640190fd5b61272054610100900460ff16156124fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806141046022913960400191505060405180910390fd5b6008546127109061250e908361354e565b1115612565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614095602b913960400191505060405180910390fd5b600c5434906125749083612dc3565b11156125e157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563742e604482015290519081900360640190fd5b600c546125ee9082612dc3565b34111561263d57600c5433906108fc906126139061260c9085612dc3565b349061327a565b6040518115909202916000818181858888f1935050505015801561263b573d6000803e3d6000fd5b505b600a54600c5473ffffffffffffffffffffffffffffffffffffffff909116906108fc906126839060649061267d90612676906046612dc3565b8690612dc3565b90612deb565b6040518115909202916000818181858888f193505050501580156126ab573d6000803e3d6000fd5b50600b54600c5473ffffffffffffffffffffffffffffffffffffffff909116906108fc906126e59060649061267d9061267690601e612dc3565b6040518115909202916000818181858888f1935050505015801561270d573d6000803e3d6000fd5b5060005b8181101561273657612710600854101561272e5761272e3361355e565b600101612711565b5050614e3880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055565b33600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6127205462010000900460ff1681565b61284e85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e9892505050565b5050505050565b614e395481565b6127235460ff1681565b600081815260016020526040902054606090829073ffffffffffffffffffffffffffffffffffffffff166128fb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e76616c696420746f6b656e2e000000000000000000000000000000000000604482015290519081900360640190fd5b61271e61290784613706565b61271f60405160200180848054600181600116156101000203166002900480156129685780601f10612946576101008083540402835291820191612968565b820191906000526020600020905b815481529060010190602001808311612954575b5050835160208501908083835b602083106129b257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612975565b6001836020036101000a03801982511681845116808217855250505050505090500182805460018160011615610100020316600290048015612a2b5780601f10612a09576101008083540402835291820191612a2b565b820191906000526020600020905b815481529060010190602001808311612a17575b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052979650505050505050565b601481565b60008080612a7884613526565b905060005b81811015612ae15773ffffffffffffffffffffffffffffffffffffffff85166000908152600460205260408120805483908110612ab657fe5b90600052602060002001549050612acc81612c30565b15612ad8576001909301925b50600101612a7d565b50909392505050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260036020908152604080832093909416825291909152205460ff1690565b6127245481565b6000612b3782613526565b905060005b818110156112bc5773ffffffffffffffffffffffffffffffffffffffff83166000908152600460205260408120805483908110612b7557fe5b90600052602060002001549050612b8b8161328f565b50600101612b3c565b600b5474010000000000000000000000000000000000000000900460ff1615612bbc57600080fd5b600c81905542600d55600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f771cfe172460b7d64cc46cca57a1e1f40f52b47cf1d16fe30c78a2935b3dd58090600090a150565b600060085460001415612c4557506000610d5c565b612724546000838152614e3560205260409020541015612c6757506000610d5c565b506001919050565b60008181526001602052604090205473ffffffffffffffffffffffffffffffffffffffff16612c9d82613833565b612ca78183613893565b612cb18383613a91565b612cba8261328f565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080612d27848461354e565b90506000612d3682600161327a565b9050612d4b612d458286612deb565b85612dc3565b95945050505050565b6040805160248082018490528251808303909101815260449091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff5b1bba90000000000000000000000000000000000000000000000000000000017905261119790613bb2565b600082612dd2575060006112d8565b5081810281838281612de057fe5b04146112d857600080fd5b6000818381612df657fe5b049392505050565b600060016000612725612e1085613bd3565b6127108110612e1b57fe5b0154815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff169050612e508184612c6f565b60405173ffffffffffffffffffffffffffffffffffffffff82169084907fcb45e8ccb1873f0431eec7472d25b75159d1f92672d534868976c70f331d99e490600090a3505050565b600082815260016020526040902054829073ffffffffffffffffffffffffffffffffffffffff1633811480612ef0575060008281526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b80612f2b575073ffffffffffffffffffffffffffffffffffffffff8116600090815260036020908152604080832033845290915290205460ff165b612f9657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616e6e6f74207472616e736665722e00000000000000000000000000000000604482015290519081900360640190fd5b600084815260016020526040902054849073ffffffffffffffffffffffffffffffffffffffff1661302857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e76616c696420746f6b656e2e000000000000000000000000000000000000604482015290519081900360640190fd5b60008581526001602052604090205473ffffffffffffffffffffffffffffffffffffffff90811690881681146130bf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e636f7272656374206f776e65722e00000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff87166130df57600080fd5b6130e98787612c6f565b6130f287613c2b565b156132705760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156131a357818101518382015260200161318b565b50505050905090810190601f1680156131d05780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156131f257600080fd5b505af1158015613206573d6000803e3d6000fd5b505050506040513d602081101561321c57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167f150b7a02000000000000000000000000000000000000000000000000000000001461326e57600080fd5b505b5050505050505050565b60008282111561328957600080fd5b50900390565b600081815260016020526040902054819073ffffffffffffffffffffffffffffffffffffffff1661332157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e76616c696420746f6b656e2e000000000000000000000000000000000000604482015290519081900360640190fd5b42614e3654101561333457613334613c31565b61271061272454141561334657611fc1565b6000828152614e3560205260409020541580156133665750612725548214155b15613458576001600854036127245414156133ba578161272561272454612710811061338e57fe5b0155612724546000838152614e35602052604090208190556133b190600161354e565b61272455613453565b6127256127245461271081106133cc57fe5b015461272560016008540361271081106133e257fe5b0181905550600160085403614e35600061272561272454612710811061340457fe5b01548152602001908152602001600020819055508161272561272454612710811061342b57fe5b0155612724546000838152614e356020526040902081905561344e90600161354e565b612724555b611fc1565b612724546000838152614e356020526040902054101561347757611fc1565b61272561272454612710811061348957fe5b01546000838152614e3560205260409020546127259061271081106134aa57fe5b01556000828152614e3560208190526040822054612724549092906127259061271081106134d457fe5b0154815260200190815260200160002081905550816127256127245461271081106134fb57fe5b0155612724546000838152614e356020526040902081905561351e90600161354e565b612724555050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b818101828110156112d857600080fd5b73ffffffffffffffffffffffffffffffffffffffff81166135e057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f43616e6e6f74206d696e7420746f203078302e00000000000000000000000000604482015290519081900360640190fd5b6127106008541061365257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f546f6b656e206c696d697420726561636865642e000000000000000000000000604482015290519081900360640190fd5b600061365c613e7d565b60088054600101905590506136718282613a91565b61367a8161328f565b60405173ffffffffffffffffffffffffffffffffffffffff83169082907ff3cea5493d790af0133817606f7350a91d7f154ea52eaa79d179d4d231e5010290600090a3604051819073ffffffffffffffffffffffffffffffffffffffff8416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606081613747575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610d5c565b8160005b811561375f57600101600a8204915061374b565b60008167ffffffffffffffff8111801561377857600080fd5b506040519080825280601f01601f1916602001820160405280156137a3576020820181803683370190505b5085935090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b831561382a57600a840660300160f81b828280600190039350815181106137f057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a840493506137cd565b50949350505050565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff161561119757600090815260026020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60008181526001602052604090205473ffffffffffffffffffffffffffffffffffffffff83811691161461392857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e636f7272656374206f776e65722e00000000000000000000000000000000604482015290519081900360640190fd5b600081815260016020818152604080842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600582528084205473ffffffffffffffffffffffffffffffffffffffff871685526004909252832054909291613995919061327a565b9050818114613a475773ffffffffffffffffffffffffffffffffffffffff841660009081526004602052604081208054839081106139cf57fe5b9060005260206000200154905080600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110613a2757fe5b600091825260208083209091019290925591825260059052604090208290555b73ffffffffffffffffffffffffffffffffffffffff84166000908152600460205260409020805480613a7557fe5b6001900381819060005260206000200160009055905550505050565b60008181526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1615613b2257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f43616e6e6f74206164642c20616c7265616479206f776e65642e000000000000604482015290519081900360640190fd5b600081815260016020818152604080842080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff881690811790915580855260048352908420805480850182558186529285209092018590559092529054613b9f9161327a565b6000918252600560205260409091205550565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b6127225460408051426020808301919091523360601b828401526054808301949094528251808303909401845260749091019091528151910120600090613c1a8184613f2b565b612722805460010190559392505050565b3b151590565b6000612724819055614e3854604080517f92d663130000000000000000000000000000000000000000000000000000000081524260048201819052915191939273ffffffffffffffffffffffffffffffffffffffff16916392d6631391602480820192602092909190829003018186803b158015613cae57600080fd5b505afa158015613cc2573d6000803e3d6000fd5b505050506040513d6020811015613cd857600080fd5b5051614e3854604080517f5e05bd6d00000000000000000000000000000000000000000000000000000000815260048181018590526024820181905260156044830152606482015260006084820181905260a482018190529151939450909273ffffffffffffffffffffffffffffffffffffffff90921691635e05bd6d9160c480820192602092909190829003018186803b158015613d7657600080fd5b505afa158015613d8a573d6000803e3d6000fd5b505050506040513d6020811015613da057600080fd5b5051905082811015613e7557614e3854604080517f5e05bd6d000000000000000000000000000000000000000000000000000000008152600185016004828101919091526024820181905260156044830152606482015260006084820181905260a4820152905173ffffffffffffffffffffffffffffffffffffffff90921691635e05bd6d9160c480820192602092909190829003018186803b158015613e4657600080fd5b505afa158015613e5a573d6000803e3d6000fd5b505050506040513d6020811015613e7057600080fd5b505190505b614e36555050565b6008546000906127100381613e9182613bd3565b90506000600e826127108110613ea357fe5b015415613ec157600e826127108110613eb857fe5b01549050613ec4565b50805b600e600184036127108110613ed557fe5b0154613ef45760018303600e836127108110613eed57fe5b0155613f18565b600e600184036127108110613f0557fe5b0154600e836127108110613f1557fe5b01555b613f2381600161354e565b935050505090565b6000808211613f9b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f556e69666f726d52616e642f6d696e2d626f756e640000000000000000000000604482015290519081900360640190fd5b6000828360000381613fa957fe5b069050835b818110613fba57613fe0565b604080516020808201939093528151808203840181529082019091528051910120613fae565b838181613fe957fe5b0695945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282614029576000855561406f565b82601f1061404257805160ff191683800117855561406f565b8280016001018555821561406f579182015b8281111561406f578251825591602001919060010190614054565b5061407b92915061407f565b5090565b5b8082111561407b576000815560010161408056fe507572636861736520776f756c6420657863656564206d617820737570706c79206f6620526562656c732e526562656c6c696f6e2073746174652063616e6e6f7420626520757064617465642e43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d652e526562656c7320686176652070617573656420616c6c206f7065726174696f6e732e596f2c2069742773206e6f74203432302e20476574206261636b20746f20776f726b2ea2646970667358221220efc1e8445e3873e962a9807c1f43d5f0a346de2eaa88cad0bbaffcdc4286130e64736f6c63430007060033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000009ca002139899dfa818d3c16175ad698b14c3f4d0000000000000000000000000a04562f2659fa2a49cc2490c9ec9223b7c990bd8000000000000000000000000505d07c4a6605e90300fd81ca6797c17108eba5100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000002368747470733a2f2f7777772e746176617461722e696f2f6170692f7572693f7572693d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _dateTime (address): 0x9cA002139899DFa818D3C16175aD698B14C3F4d0
Arg [1] : _beneficiary1 (address): 0xA04562f2659fa2A49CC2490c9eC9223b7C990BD8
Arg [2] : _beneficiary2 (address): 0x505D07C4a6605E90300FD81cA6797C17108EBA51
Arg [3] : _baseURI (string): https://www.tavatar.io/api/uri?uri=
Arg [4] : _uriExtension (string):

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000009ca002139899dfa818d3c16175ad698b14c3f4d0
Arg [1] : 000000000000000000000000a04562f2659fa2a49cc2490c9ec9223b7c990bd8
Arg [2] : 000000000000000000000000505d07c4a6605e90300fd81ca6797c17108eba51
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [6] : 68747470733a2f2f7777772e746176617461722e696f2f6170692f7572693f75
Arg [7] : 72693d0000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

4205:26827:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18804:199;;;;;;;;;;;;;:::i;:::-;;21851:143;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21851:143:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;10546:79;;;;;;;;;;;;;:::i;4679:40::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5642:27;;;;;;;;;;;;;:::i;29627:92::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23553:178;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23553:178:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;22685:315;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22685:315:0;;;;;;;;;:::i;20672:89::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20672:89:0;;:::i;30588:193::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30588:193:0;;;;;;;;-1:-1:-1;30588:193:0;;-1:-1:-1;;30588:193:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30588:193:0;;-1:-1:-1;30588:193:0;;-1:-1:-1;;;;;30588:193:0:i;28369:95::-;;;;;;;;;;;;;:::i;5453:25::-;;;;;;;;;;;;;:::i;16481:126::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16481:126:0;;:::i;22337:342::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22337:342:0;;;;;;;;;;;;;;;;;;:::i;9924:529::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9924:529:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;28637:205;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28637:205:0;;;;;;;;;:::i;5393:30::-;;;;;;;;;;;;;:::i;5692:32::-;;;;;;;;;;;;;:::i;19496:689::-;;;;;;;;;;;;;:::i;22181:150::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22181:150:0;;;;;;;;;;;;;;;;;;:::i;25061:122::-;;;;;;;;;;;;;:::i;28470:161::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28470:161:0;;:::i;5610:26::-;;;;;;;;;;;;;:::i;5922:45::-;;;;;;;;;;;;;:::i;21234:150::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21234:150:0;;;;:::i;23367:180::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23367:180:0;;:::i;21471:84::-;;;;;;;;;;;;;:::i;5583:21::-;;;;;;;;;;;;;:::i;10754:105::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10754:105:0;;:::i;23223:138::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23223:138:0;;;;:::i;20416:154::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20416:154:0;;;;:::i;6138:37::-;;;;;;;;;;;;;:::i;18351:151::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18351:151:0;;;;:::i;30958:72::-;;;;;;;;;;;;;:::i;29839:100::-;;;;;;;;;;;;;:::i;24960:95::-;;;;;;;;;;;;;:::i;25236:978::-;;;;;;;;;;;;;;;;-1:-1:-1;25236:978:0;;:::i;23006:211::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23006:211:0;;;;;;;;;;;:::i;5730:34::-;;;;;;;;;;;;;:::i;22000:175::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22000:175:0;;-1:-1:-1;22000:175:0;-1:-1:-1;22000:175:0;:::i;9879:32::-;;;;;;;;;;;;;:::i;5884:::-;;;;;;;;;;;;;:::i;30107:203::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30107:203:0;;:::i;4725:44::-;;;;;;;;;;;;;:::i;17486:382::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17486:382:0;;;;:::i;23737:189::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23737:189:0;;;;;;;;;;;:::i;5997:32::-;;;;;;;;;;;;;:::i;18804:199::-;7275:8;;;;7261:10;:22;7253:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18866:25:::1;:32:::0;;;::::1;;;::::0;;18804:199::o;21851:143::-;21954:33;;;21931:4;21954:33;;;;;;;;;;;;;21851:143;;;;:::o;10546:79::-;10589:29;10607:10;10589:17;:29::i;:::-;10546:79::o;4679:40::-;4714:5;4679:40;:::o;5642:27::-;;;;;;:::o;29627:92::-;29705:7;29697:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29666:19;;29697:15;;29705:7;;29697:15;;29705:7;29697:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29627:92;:::o;23553:178::-;23647:24;8149:19;;;:9;:19;;;;;;23628:8;;8149:33;:19;8141:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23702:22:0::1;::::0;;;:12:::1;:22;::::0;;;;;::::1;;::::0;23553:178::o;22685:315::-;7615:18;7636:19;;;:9;:19;;;;;;22768:8;;7636:19;;7687:10;7673:24;;;:68;;-1:-1:-1;7701:28:0;;;;;;;:16;:28;;;;;;;;7730:10;7701:40;;;;;;;;;;7673:68;7665:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8180:1:::1;8149:19:::0;;;:9:::1;:19;::::0;;;;;22791:8;;8149:33:::1;:19;8141:60;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;22811:18:::2;22832:19:::0;;;:9:::2;:19;::::0;;;;;::::2;::::0;;::::2;::::0;22869:23;::::2;::::0;::::2;;22861:32;;;::::0;::::2;;22903:22;::::0;;;:12:::2;:22;::::0;;;;;:34;;;::::2;;::::0;;::::2;::::0;;::::2;::::0;;;22952:41;;22903:22;;22952:41;;::::2;::::0;::::2;::::0;::::2;8211:1;7771::::1;22685:315:::0;;;;:::o;20672:89::-;7275:8;;;;7261:10;:22;7253:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20736:18:::1;20747:6;20736:10;:18::i;:::-;20672:89:::0;:::o;30588:193::-;7275:8;;;;7261:10;:22;7253:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6498:7:::1;::::0;::::1;;:16;6490:58;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;30712:21:::0;;::::2;::::0;:7:::2;::::0;:21:::2;::::0;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;30743:31:0;;::::2;::::0;:12:::2;::::0;:31:::2;::::0;::::2;::::0;::::2;:::i;:::-;;30588:193:::0;;:::o;28369:95::-;28448:9;;;28369:95::o;5453:25::-;;;;:::o;16481:126::-;16540:19;16577:23;16590:9;16577:12;:23::i;:::-;16570:30;16481:126;-1:-1:-1;;16481:126:0:o;22337:342::-;7834:18;7855:19;;;:9;:19;;;;;;22435:8;;7855:19;;7919:10;7905:24;;;:76;;-1:-1:-1;7945:22:0;;;;:12;:22;;;;;;:36;:22;7971:10;7945:36;7905:76;:132;;;-1:-1:-1;7997:28:0;;;;;;;:16;:28;;;;;;;;8026:10;7997:40;;;;;;;;;;7905:132;7884:183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8180:1:::1;8149:19:::0;;;:9:::1;:19;::::0;;;;;22458:8;;8149:33:::1;:19;8141:60;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;22478:18:::2;22499:19:::0;;;:9:::2;:19;::::0;;;;;::::2;::::0;;::::2;::::0;22536;::::2;::::0;::::2;22528:51;;;::::0;;::::2;::::0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;22597:17;::::0;::::2;22589:49;;;::::0;;::::2;::::0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;22648:24;22658:3;22663:8;22648:9;:24::i;:::-;8211:1;8077::::1;22337:342:::0;;;;;:::o;9924:529::-;10006:16;10024:21;10183:18;10204:38;10218:10;10230:11;;10204:13;:38::i;:::-;10183:59;;10252:23;10264:10;10252:11;:23::i;:::-;10285:24;10312:58;10325:37;10338:10;10350:11;;10325:12;:37::i;:::-;10364:5;10312:12;:58::i;:::-;10392:12;;;;;10285:85;;-1:-1:-1;9924:529:0;-1:-1:-1;;;;;9924:529:0:o;28637:205::-;28764:18;;;28721:14;28764:18;;;:10;:18;;;;;:25;28755:34;;28747:43;;;;;;28809:18;;;;;;;:10;:18;;;;;:26;;28828:6;;28809:26;;;;;;;;;;;;;;28800:35;;28637:205;;;;:::o;5393:30::-;;;;;;;;;:::o;5692:32::-;;;;;;;;;:::o;19496:689::-;8803:10;;;;;;;8795:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6861:13:::1;::::0;::::1;;:21;;:13:::0;:21:::1;6853:54;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;8326:16:::2;::::0;:37:::2;::::0;;;;;8282:15:::2;8326:37;::::0;::::2;::::0;;;;;8282:15;;8263:16:::2;::::0;8326::::2;::::0;;::::2;::::0;:24:::2;::::0;:37;;;;;::::2;::::0;;;;;;;;:16;:37;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;8326:37:0;8398:16:::2;::::0;:63:::2;::::0;;;;;8449:1:::2;8398:63:::0;;::::2;::::0;;;;;;;8451:2:::2;8398:63:::0;;;;8454:2:::2;8398:63:::0;;;;8373:22:::2;8398:63:::0;;;;;;;;;;;;;;8326:37;;-1:-1:-1;8373:22:0;;8398:16:::2;::::0;;::::2;::::0;:38:::2;::::0;:63;;;;;8326:37:::2;::::0;8398:63;;;;;;;;:16;:63;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;8398:63:0;8526:16:::2;::::0;:62:::2;::::0;;;;;8577:1:::2;8526:62:::0;;::::2;::::0;;;;;;;;;8579:2:::2;8526:62:::0;;;;;;;;8501:20:::2;8526:62:::0;;;;;;;;;;;;;;8398:63;;-1:-1:-1;8501:20:0;;8526:16:::2;::::0;;::::2;::::0;:38:::2;::::0;:62;;;;;8398:63:::2;::::0;8526:62;;;;;;;;:16;:62;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;8526:62:0;;-1:-1:-1;8631:32:0;;::::2;::::0;::::2;::::0;:65:::2;;;8681:15;8667:11;:29;8631:65;8622:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7432:14:::3;::::0;;;::::3;;;7428:53;;;7462:8;::::0;::::3;7428:53;7490:14;:21:::0;;;::::3;::::0;::::3;::::0;;19604:16:::4;::::0;:21;:39;::::4;;;-1:-1:-1::0;19629:9:0::4;::::0;:14;::::4;19604:39;19601:578;;;19675:7;;19601:578;19720:9;;19700:16;;:29;19697:482;;;19760:7;;19697:482;19832:16;::::0;19820:9:::4;::::0;:28:::4;19885:2;19865:22:::0;::::4;19862:81;;;-1:-1:-1::0;19926:2:0::4;19862:81;19961:6;19956:137;19977:17;19973:1;:21;19956:137;;;20019:59;20026:15;20042:16;;20026:33;;;;;;;;;20061:16;;20019:6;:59::i;:::-;19996:3;;19956:137;;;-1:-1:-1::0;20124:10:0::4;20106:29;::::0;;;:17:::4;:29;::::0;;;;:50;;;;::::4;::::0;;19697:482:::4;-1:-1:-1::0;;7532:14:0::3;:22:::0;;;::::3;::::0;;-1:-1:-1;;19496:689:0:o;22181:150::-;22281:43;22299:5;22306:3;22311:8;22281:43;;;;;;;;;;;;:17;:43::i;25061:122::-;25110:15;25150:26;25166:9;;4714:5;25150:15;;:26;;;;:::i;:::-;25137:39;;25061:122;:::o;28470:161::-;28528:14;4714:5;28576;:19;28554:42;;;;;;-1:-1:-1;28623:1:0;28615:9;;28470:161::o;5610:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5922:45::-;;;;;;;;;:::o;21234:150::-;7275:8;;;;7261:10;:22;7253:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21310:14:::1;::::0;;;::::1;;;21309:15;21301:44;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;21355:12;:22:::0;;;::::1;;;;::::0;;;::::1;::::0;;;::::1;::::0;;21234:150::o;23367:180::-;23434:14;23468:19;;;:9;:19;;;;;;:33;:19;23460:42;;;;;;-1:-1:-1;23521:19:0;;;;:9;:19;;;;;;;;;23367:180::o;21471:84::-;7275:8;;;;7261:10;:22;7253:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21527:14:::1;:21:::0;;;::::1;::::0;::::1;::::0;;21471:84::o;5583:21::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10754:105;8180:1;8149:19;;;:9;:19;;;;;;10811:6;;8149:33;:19;8141:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10829:23:::1;10845:6;10829:15;:23::i;:::-;10754:105:::0;;:::o;23223:138::-;23290:16;23329:25;23347:6;23329:17;:25::i;20416:154::-;20532:31;;20490:16;20532:31;;;:17;:31;;;;;;;20416:154::o;6138:37::-;;;;:::o;18351:151::-;7275:8;;;;7261:10;:22;7253:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7122:25:::1;::::0;::::1;::::0;::::1;;;:34;7114:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18460:13:::2;:35:::0;;;::::2;::::0;::::2;;::::0;;;::::2;::::0;;18351:151::o;30958:72::-;7275:8;;;;7261:10;:22;7253:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31009:7:::1;:14:::0;;;::::1;31019:4;31009:14;::::0;;30958:72::o;29839:100::-;29923:9;29913:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29880:21;;29913:19;;29923:9;;29913:19;;29923:9;29913:19;;;;;;;;;;;;;;;;;;;;;;;;24960:95;8803:10;;25013:11;;8803:10;;;;;8795:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25043:5:0::1;::::0;24960:95;:::o;25236:978::-;8803:10;;;;;;;8795:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7432:14:::1;::::0;;;::::1;;;7428:53;;;7462:8;::::0;::::1;7428:53;7490:14;:21:::0;;;::::1;::::0;::::1;::::0;;:14:::1;25334:36:::0;::::2;;25326:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25444:1;25427:14;:18;25419:58;;;::::0;;::::2;::::0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;25496:12;::::0;::::2;::::0;::::2;;;25495:13;25487:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25565:9;::::0;4714:5:::2;::::0;25565:29:::2;::::0;25579:14;25565:13:::2;:29::i;:::-;:44;;25557:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25675:5;::::0;25704:9:::2;::::0;25675:25:::2;::::0;25685:14;25675:9:::2;:25::i;:::-;:38;;25667:83;;;::::0;;::::2;::::0;;::::2;;::::0;::::2;::::0;;;;;;;::::2;::::0;;;;;;;;;;;;;::::2;;25776:5;::::0;:25:::2;::::0;25786:14;25776:9:::2;:25::i;:::-;25764:9;:37;25760:145;;;25851:5;::::0;25817:10:::2;::::0;:61:::2;::::0;25837:40:::2;::::0;25851:25:::2;::::0;25861:14;25851:9:::2;:25::i;:::-;25837:9;::::0;:13:::2;:40::i;:::-;25817:61;::::0;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;25760:145;25914:12;::::0;25955:5:::2;::::0;25914:12:::2;::::0;;::::2;::::0;:65:::2;::::0;25936:42:::2;::::0;25974:3:::2;::::0;25936:33:::2;::::0;25955:13:::2;::::0;25965:2:::2;25955:9;:13::i;:::-;25936:14:::0;;:18:::2;:33::i;:::-;:37:::0;::::2;:42::i;:::-;25914:65;::::0;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;25989:12:0::2;::::0;26030:5:::2;::::0;25989:12:::2;::::0;;::::2;::::0;:65:::2;::::0;26011:42:::2;::::0;26049:3:::2;::::0;26011:33:::2;::::0;26030:13:::2;::::0;26040:2:::2;26030:9;:13::i;26011:42::-;25989:65;::::0;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;26068:6;26064:144;26084:14;26080:1;:18;26064:144;;;4714:5;26123:9;;:23;26119:79;;;26166:17;26172:10;26166:5;:17::i;:::-;26100:3;;26064:144;;;-1:-1:-1::0;;7532:14:0::1;:22:::0;;;::::1;::::0;;25236:978::o;23006:211::-;23113:10;23096:28;;;;:16;:28;;;;;;;;;:39;;;;;;;;;;;;:51;;;;;;;;;;;;;23162:48;;;;;;;23096:39;;23113:10;23162:48;;;;;;;;;;;23006:211;;:::o;5730:34::-;;;;;;;;;:::o;22000:175::-;22122:46;22140:5;22147:3;22152:8;22162:5;;22122:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22122:17:0;;-1:-1:-1;;;22122:46:0:i;:::-;22000:175;;;;;:::o;9879:32::-;;;;:::o;5884:::-;;;;;;:::o;30107:203::-;8180:1;8149:19;;;:9;:19;;;;;;30189:23;;30170:8;;8149:33;:19;8141:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30260:7:::1;30269:18;30278:8;30269;:18::i;:::-;30289:12;30243:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;30243:59:0;;::::1;::::0;::::1;::::0;;;;::::1;;;;;;::::0;;;;;;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;30243:59:0::1;::::0;;;;;::::1;::::0;;;;;;;30107:203;-1:-1:-1;;;;;;;30107:203:0:o;4725:44::-;4767:2;4725:44;:::o;17486:382::-;17548:20;;;17624:25;17642:6;17624:17;:25::i;:::-;17605:44;;17663:6;17659:179;17679:11;17675:1;:15;17659:179;;;17726:18;;;17711:12;17726:18;;;:10;:18;;;;;:21;;17745:1;;17726:21;;;;;;;;;;;;;;17711:36;;17764:21;17777:7;17764:12;:21::i;:::-;17761:67;;;17804:9;;;;;17761:67;-1:-1:-1;17692:3:0;;17659:179;;;-1:-1:-1;17854:7:0;;17486:382;-1:-1:-1;;;17486:382:0:o;23737:189::-;23884:24;;;;23830:22;23884:24;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;;;23737:189::o;5997:32::-;;;;:::o;11009:250::-;11068:16;11087:22;11105:3;11087:17;:22::i;:::-;11068:41;;11123:6;11119:134;11139:11;11135:1;:15;11119:134;;;11186:15;;;11171:12;11186:15;;;:10;:15;;;;;:18;;11202:1;;11186:18;;;;;;;;;;;;;;11171:33;;11218:24;11234:7;11218:15;:24::i;:::-;-1:-1:-1;11152:3:0;;11119:134;;20883:197;20943:10;;;;;;;20942:11;20934:20;;;;;;20964:5;:14;;;21004:15;20988:13;:31;21029:10;:17;;;;;;;;21061:12;;;;-1:-1:-1;;21061:12:0;20883:197;:::o;16904:315::-;16964:19;16997:9;;17010:1;16997:14;16994:219;;;-1:-1:-1;17043:5:0;16994:219;;;17099:16;;17067:29;;;;:18;:29;;;;;;:48;17064:149;;;-1:-1:-1;17147:5:0;17064:149;;;-1:-1:-1;17198:4:0;16904:315;;;:::o;23932:302::-;24001:12;24016:19;;;:9;:19;;;;;;;;24046:24;24026:8;24046:14;:24::i;:::-;24081:30;24096:4;24102:8;24081:14;:30::i;:::-;24121:26;24133:3;24138:8;24121:11;:26::i;:::-;24157:25;24173:8;24157:15;:25::i;:::-;24218:8;24213:3;24198:29;;24207:4;24198:29;;;;;;;;;;;;23932:302;;;:::o;4034:167::-;4093:7;4112:9;4124:8;4128:1;4130;4124:3;:8::i;:::-;4112:20;;4142:9;4154:8;4158:1;4160;4154:3;:8::i;:::-;4142:20;;4179:15;4183:8;4187:1;4189;4183:3;:8::i;:::-;4192:1;4179:3;:15::i;:::-;4172:22;4034:167;-1:-1:-1;;;;;4034:167:0:o;4950:101:2:-;5006:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4990:57;;:15;:57::i;3003:196:0:-;3061:9;3086:6;3082:45;;-1:-1:-1;3115:1:0;3108:8;;3082:45;-1:-1:-1;3140:5:0;;;3144:1;3140;:5;:1;3163:5;;;;;:10;3155:19;;;;;3289:290;3347:7;3571:1;3567;:5;;;;;;;3289:290;-1:-1:-1;;;3289:290:0:o;15806:431::-;15882:33;15918:9;:48;15928:15;15944:20;15951:12;15944:6;:20::i;:::-;15928:37;;;;;;;;;15918:48;;;;;;;;;;;-1:-1:-1;15918:48:0;;;;;-1:-1:-1;16105:54:0;15918:48;16142:16;16105:9;:54::i;:::-;16174:56;;;;;;16186:16;;16174:56;;;;;15806:431;;;:::o;27633:541::-;7834:18;7855:19;;;:9;:19;;;;;;27749:8;;7855:19;;7919:10;7905:24;;;:76;;-1:-1:-1;7945:22:0;;;;:12;:22;;;;;;:36;:22;7971:10;7945:36;7905:76;:132;;;-1:-1:-1;7997:28:0;;;;;;;:16;:28;;;;;;;;8026:10;7997:40;;;;;;;;;;7905:132;7884:183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8180:1:::1;8149:19:::0;;;:9:::1;:19;::::0;;;;;27772:8;;8149:33:::1;:19;8141:60;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27792:18:::2;27813:19:::0;;;:9:::2;:19;::::0;;;;;::::2;::::0;;::::2;::::0;27850;::::2;::::0;::::2;27842:48;;;::::0;;::::2;::::0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;27908:17;::::0;::::2;27900:26;;;::::0;::::2;;27937:24;27947:3;27952:8;27937:9;:24::i;:::-;27976:15;27987:3;27976:10;:15::i;:::-;27972:196;;;28007:13;28043:3;28023:41;;;28065:10;28077:5;28084:8;28094:5;28023:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;28023:77:0;;-1:-1:-1;28122:34:0;;::::2;28132:24:::0;28122:34:::2;28114:43;;;::::0;::::2;;27972:196;;8211:1;8077::::1;27633:541:::0;;;;;;:::o;3699:121::-;3757:7;3789:1;3784;:6;;3776:15;;;;;;-1:-1:-1;3808:5:0;;;3699:121::o;12874:1928::-;8180:1;8149:19;;;:9;:19;;;;;;12934:6;;8149:33;:19;8141:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13030:15:::1;13002:25;;:43;12999:96;;;13060:24;:22;:24::i;:::-;4714:5;13107:16;;:31;13104:1692;;;13153:7;;13104:1692;13201:26;::::0;;;:18:::1;:26;::::0;;;;;:31;:63;::::1;;;-1:-1:-1::0;13236:15:0::1;:18:::0;:28;::::1;;13201:63;13198:1598;;;13402:1;13392:9;;:11;13371:16;;:33;13368:652;;;13507:6;13471:15;13487:16;;13471:33;;;;;;;;:42:::0;13560:16:::1;::::0;13531:26:::1;::::0;;;:18:::1;:26;::::0;;;;:45;;;13613:23:::1;::::0;13634:1:::1;13613:20;:23::i;:::-;13594:16;:42:::0;13368:652:::1;;;13704:15;13720:16;;13704:33;;;;;;;;;13673:15;13699:1;13689:9;;:11;13673:28;;;;;;;;:64;;;;13821:1;13811:9;;:11;13755:18;:53;13774:15;13790:16;;13774:33;;;;;;;;;13755:53;;;;;;;;;;;:67;;;;13876:6;13840:15;13856:16;;13840:33;;;;;;;;:42:::0;13929:16:::1;::::0;13900:26:::1;::::0;;;:18:::1;:26;::::0;;;;:45;;;13982:23:::1;::::0;14003:1:::1;13982:20;:23::i;:::-;13963:16;:42:::0;13368:652:::1;13198:1598;;;14067:16;::::0;14038:26:::1;::::0;;;:18:::1;:26;::::0;;;;;:45:::1;14035:761;;;14110:7;;14035:761;14377:15;14393:16;;14377:33;;;;;;;;::::0;14347:26:::1;::::0;;;:18:::1;:26;::::0;;;;;14331:15:::1;::::0;:43:::1;::::0;::::1;;;;;;:79:::0;14541:26:::1;::::0;;;:18:::1;:26;::::0;;;;;;;14520:16:::1;::::0;14541:26;;;14504:15:::1;::::0;:33:::1;::::0;::::1;;;;;;;14485:53;;;;;;;;;;;:82;;;;14618:6;14582:15;14598:16;;14582:33;;;;;;;;:42:::0;14712:16:::1;::::0;14683:26:::1;::::0;;;:18:::1;:26;::::0;;;;:45;;;14762:23:::1;::::0;14783:1:::1;14762:20;:23::i;:::-;14743:16;:42:::0;12874:1928;;:::o;27494:133::-;27595:18;;27560:14;27595:18;;;:10;:18;;;;;:25;;27494:133::o;3890:138::-;3973:5;;;3996:6;;;;3988:15;;;;;26220:371;26275:17;;;26267:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4714:5;26334:9;;:23;26326:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26393:7;26403:13;:11;:13::i;:::-;26439:9;;;26451:1;26439:13;26427:25;;26393:23;-1:-1:-1;26462:20:0;26474:3;26393:23;26462:11;:20::i;:::-;26492:19;26508:2;26492:15;:19::i;:::-;26527:13;;;;;;26532:2;;26527:13;;;;;26555:29;;26581:2;;26555:29;;;;26572:1;;26555:29;;26572:1;;26555:29;26220:371;;:::o;28956:537::-;29012:13;29041:10;29037:51;;-1:-1:-1;29067:10:0;;;;;;;;;;;;;;;;;;;29037:51;29112:5;29097:12;29151:75;29158:9;;29151:75;;29183:8;;29213:2;29205:10;;;;29151:75;;;29235:19;29267:6;29257:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29257:17:0;-1:-1:-1;29327:5:0;;-1:-1:-1;29235:39:0;-1:-1:-1;29300:10:0;;;29342:114;29349:9;;29342:114;;29417:2;29410:4;:9;29405:2;:14;29392:29;;29374:6;29381:7;;;;;;;29374:15;;;;;;;;;;;:47;;;;;;;;;;-1:-1:-1;29443:2:0;29435:10;;;;29342:114;;;-1:-1:-1;29479:6:0;28956:537;-1:-1:-1;;;;28956:537:0:o;28180:162::-;28278:1;28244:22;;;:12;:22;;;;;;:36;:22;:36;28240:96;;28303:22;;;;:12;:22;;;;;28296:29;;;;;;28180:162::o;26895:593::-;26979:19;;;;:9;:19;;;;;;:28;;;;:19;;:28;26971:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27045:19;;;;:9;:19;;;;;;;;27038:26;;;;;;27104:14;:24;;;;;;27038:26;27163:17;;;;:10;:17;;;;;:24;27104;;27045:19;27163:31;;:24;:28;:31::i;:::-;27138:56;;27227:18;27209:14;:36;27205:243;;27281:17;;;27261;27281;;;:10;:17;;;;;:33;;27299:14;;27281:33;;;;;;;;;;;;;;27261:53;;27368:9;27328:10;:17;27339:5;27328:17;;;;;;;;;;;;;;;27346:18;27328:37;;;;;;;;;;;;;;;;;;;:49;;;;27391:25;;;:14;:25;;;;;:46;;;27205:243;27458:17;;;;;;;:10;:17;;;;;:23;;;;;;;;;;;;;;;;;;;;;;;;26895:593;;;;:::o;26597:292::-;26707:1;26676:19;;;:9;:19;;;;;;:33;:19;:33;26668:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26750:19;;;;:9;:19;;;;;;;;:25;;;;;;;;;;;;;26786:15;;;:10;:15;;;;;:30;;;;;;;;;;;;;;;;;;;26853:15;;;:22;;:29;;:26;:29::i;:::-;26826:24;;;;:14;:24;;;;;;:56;-1:-1:-1;26597:292:0:o;176:288:2:-;264:14;;129:42;373:2;360:16;;240:21;;264:14;360:16;129:42;400:5;389:68;380:77;;335:126;;;:::o;15044:309:0:-;15203:14;;15157:61;;;15174:15;15157:61;;;;;;;;15191:10;15157:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15147:72;;;;;15088:18;;15246:44;15147:72;15286:3;15246:27;:44::i;:::-;15300:14;:16;;;;;;15230:60;15044:309;-1:-1:-1;;;15044:309:0:o;21655:190::-;21770:18;21830:8;;;21655:190::o;11527:507::-;11599:1;11580:16;:20;;;11673:16;;:37;;;;;;11629:15;11673:37;;;;;;;;11629:15;;11599:1;11673:16;;;:24;;:37;;;;;;;;;;;;;;;:16;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11673:37:0;11742:16;;:62;;;;;;11793:1;11742:62;;;;;;;;;;;;11795:2;11742:62;;;;;;;;11720:19;11742:62;;;;;;;;;;;;;;11673:37;;-1:-1:-1;11720:19:0;;11742:16;;;;;:38;;:62;;;;;11673:37;;11742:62;;;;;;;;:16;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11742:62:0;;-1:-1:-1;11841:28:0;;;11838:138;;;11901:16;;:64;;;;;;:16;11940:13;;11954:1;11901:64;;;;;;;;;;;;;11956:2;11901:64;;;;;;;;:16;:64;;;;;;;;;;;;:16;;;;;:38;;:64;;;;;;;;;;;;;;;:16;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11901:64:0;;-1:-1:-1;11838:138:0;11985:25;:42;-1:-1:-1;;11527:507:0:o;24240:714::-;24328:9;;24281:4;;4714:5;24314:23;24281:4;24360:17;24314:23;24360:6;:17::i;:::-;24347:30;;24387:10;24415:7;24423:5;24415:14;;;;;;;;;:19;24411:116;;24458:7;24466:5;24458:14;;;;;;;;;24450:22;;24411:116;;;-1:-1:-1;24511:5:0;24411:116;24589:7;24609:1;24597:9;:13;24589:22;;;;;;;;;24585:277;;24724:1;24712:9;:13;24695:7;24703:5;24695:14;;;;;;;;:30;24585:277;;;24829:7;24849:1;24837:9;:13;24829:22;;;;;;;;;24812:7;24820:5;24812:14;;;;;;;;:39;24585:277;24935:12;:5;24945:1;24935:9;:12::i;:::-;24928:19;;;;;24240:714;:::o;1351:394:1:-;1430:7;1467:1;1453:11;:15;1445:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1500:11;1529;1515;1514:12;;:26;;;;;;;-1:-1:-1;1563:8:1;1577:131;1612:3;1602:6;:13;1598:43;;1627:5;;1598:43;1675:24;;;;;;;;;;;;;;;;;;;;;;;;;;1665:35;;;;;1577:131;;;1729:11;1720:6;:20;;;;;;;1351:394;-1:-1:-1;;;;;1351:394:1:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;

Swarm Source

ipfs://efc1e8445e3873e962a9807c1f43d5f0a346de2eaa88cad0bbaffcdc4286130e

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.