ETH Price: $3,457.93 (+5.09%)

Contract

0x56A50f1C4B4362aeFf1D9c3c1E24562a0D833488
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60806040126412932021-06-15 20:37:301256 days ago1623789450IN
 Create: AsyncArtwork_v2
0 ETH0.3856457781

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AsyncArtwork_v2

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
petersburg EvmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-06-15
*/

// File: @openzeppelin/upgrades/contracts/Initializable.sol

pragma solidity >=0.4.24 <0.7.0;


/**
 * @title Initializable
 *
 * @dev Helper contract to support initializer functions. To use it, replace
 * the constructor with a function that has the `initializer` modifier.
 * WARNING: Unlike constructors, initializer functions must be manually
 * invoked. This applies both to deploying an Initializable contract, as well
 * as extending an Initializable contract via inheritance.
 * WARNING: When used with inheritance, manual care must be taken to not invoke
 * a parent initializer twice, or ensure that all initializers are idempotent,
 * because this is not dealt with automatically as with constructors.
 */
contract Initializable {

  /**
   * @dev Indicates that the contract has been initialized.
   */
  bool private initialized;

  /**
   * @dev Indicates that the contract is in the process of being initialized.
   */
  bool private initializing;

  /**
   * @dev Modifier to use in the initializer function of a contract.
   */
  modifier initializer() {
    require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");

    bool isTopLevelCall = !initializing;
    if (isTopLevelCall) {
      initializing = true;
      initialized = true;
    }

    _;

    if (isTopLevelCall) {
      initializing = false;
    }
  }

  /// @dev Returns true if and only if the function is running in the constructor
  function isConstructor() private view returns (bool) {
    // extcodesize checks the size of the code stored in an address, and
    // address returns the current address. Since the code is still not
    // deployed when running a constructor, any checks on its code size will
    // yield zero, making it an effective way to detect if a contract is
    // under construction or not.
    address self = address(this);
    uint256 cs;
    assembly { cs := extcodesize(self) }
    return cs == 0;
  }

  // Reserved storage space to allow for layout changes in the future.
  uint256[50] private ______gap;
}

// File: @openzeppelin/contracts-ethereum-package/contracts/GSN/Context.sol

pragma solidity ^0.5.0;


/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context is Initializable {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts-ethereum-package/contracts/introspection/IERC165.sol

pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC721/IERC721.sol

pragma solidity ^0.5.0;



/**
 * @dev Required interface of an ERC721 compliant contract.
 */
contract IERC721 is Initializable, 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);

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

    /**
     * @dev Returns the owner of the NFT specified by `tokenId`.
     */
    function ownerOf(uint256 tokenId) public view returns (address owner);

    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     *
     *
     * Requirements:
     * - `from`, `to` cannot be zero.
     * - `tokenId` must be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this
     * NFT by either {approve} or {setApprovalForAll}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public;
    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     * Requirements:
     * - If the caller is not `from`, it must be approved to move this NFT by
     * either {approve} or {setApprovalForAll}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public;
    function approve(address to, uint256 tokenId) public;
    function getApproved(uint256 tokenId) public view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) public;
    function isApprovedForAll(address owner, address operator) public view returns (bool);


    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public;
}

// File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.5.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract IERC721Receiver {
    /**
     * @notice Handle the receipt of an NFT
     * @dev The ERC721 smart contract calls this function on the recipient
     * after a {IERC721-safeTransferFrom}. This function MUST return the function selector,
     * otherwise the caller will revert the transaction. The selector to be
     * returned can be obtained as `this.onERC721Received.selector`. This
     * function MAY throw to revert and reject the transfer.
     * Note: the ERC721 contract address is always the message sender.
     * @param operator The address which called `safeTransferFrom` function
     * @param from The address which previously owned the token
     * @param tokenId The NFT identifier which is being transferred
     * @param data Additional data with no specified format
     * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data)
    public returns (bytes4);
}

// File: @openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin/contracts-ethereum-package/contracts/utils/Address.sol

pragma solidity ^0.5.5;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following 
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     *
     * _Available since v2.4.0._
     */
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     *
     * _Available since v2.4.0._
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call.value(amount)("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}

// File: @openzeppelin/contracts-ethereum-package/contracts/drafts/Counters.sol

pragma solidity ^0.5.0;


/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}
 * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never
 * directly accessed.
 */
library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        // The {SafeMath} overflow check can be skipped here, see the comment at the top
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

// File: @openzeppelin/contracts-ethereum-package/contracts/introspection/ERC165.sol

pragma solidity ^0.5.0;



/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
contract ERC165 is Initializable, IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    function initialize() public initializer {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }

    uint256[50] private ______gap;
}

// File: contracts/ERC721.sol

pragma solidity ^0.5.0;









/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is Initializable, Context, ERC165, IERC721 {
    using SafeMath for uint256;
    using Address for address;
    using Counters for Counters.Counter;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from token ID to owner
    mapping (uint256 => address) private _tokenOwner;

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

    // Mapping from owner to number of owned token
    mapping (address => Counters.Counter) private _ownedTokensCount;

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

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    function initialize() public initializer {
        ERC165.initialize();

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
    }

    function _hasBeenInitialized() internal view returns (bool) {
        return supportsInterface(_INTERFACE_ID_ERC721);
    }

    /**
     * @dev Gets the balance of the specified address.
     * @param owner address to query the balance of
     * @return uint256 representing the amount owned by the passed address
     */
    function balanceOf(address owner) public view returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");

        return _ownedTokensCount[owner].current();
    }

    /**
     * @dev Gets the owner of the specified token ID.
     * @param tokenId uint256 ID of the token to query the owner of
     * @return address currently marked as the owner of the given token ID
     */
    function ownerOf(uint256 tokenId) public view returns (address) {
        address owner = _tokenOwner[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");

        return owner;
    }

    /**
     * @dev Approves another address to transfer the given token ID
     * The zero address indicates there is no approved address.
     * There can only be one approved address per token at a given time.
     * Can only be called by the token owner or an approved operator.
     * @param to address to be approved for the given token ID
     * @param tokenId uint256 ID of the token to be approved
     */
    function approve(address to, uint256 tokenId) public {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Gets the approved address for a token ID, or zero if no address set
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to query the approval of
     * @return address currently approved for the given token ID
     */
    function getApproved(uint256 tokenId) public view returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev Sets or unsets the approval of a given operator
     * An operator is allowed to transfer all tokens of the sender on their behalf.
     * @param to operator address to set the approval
     * @param approved representing the status of the approval to be set
     */
    function setApprovalForAll(address to, bool approved) public {
        require(to != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][to] = approved;
        emit ApprovalForAll(_msgSender(), to, approved);
    }

    /**
     * @dev Tells whether an operator is approved by a given owner.
     * @param owner owner address which you want to query the approval of
     * @param operator operator address which you want to query the approval of
     * @return bool whether the given operator is approved by the given owner
     */
    function isApprovedForAll(address owner, address operator) public view returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev Transfers the ownership of a given token ID to another address.
     * Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     * Requires the msg.sender to be the owner, approved, or operator.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function transferFrom(address from, address to, uint256 tokenId) public {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transferFrom(from, to, tokenId);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the _msgSender() to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransferFrom(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the _msgSender() to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function _safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) internal {
        _transferFrom(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether the specified token exists.
     * @param tokenId uint256 ID of the token to query the existence of
     * @return bool whether the token exists
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        address owner = _tokenOwner[tokenId];
        return owner != address(0);
    }

    /**
     * @dev Returns whether the given spender can transfer a given token ID.
     * @param spender address of the spender to query
     * @param tokenId uint256 ID of the token to be transferred
     * @return bool whether the msg.sender is approved for the given token ID,
     * is an operator of the owner, or is the owner of the token
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Internal function to safely mint a new token.
     * Reverts if the given token ID already exists.
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _safeMint(address to, uint256 tokenId) internal {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Internal function to safely mint a new token.
     * Reverts if the given token ID already exists.
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     * @param _data bytes data to send along with a safe transfer check
     */
    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Internal function to mint a new token.
     * Reverts if the given token ID already exists.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _mint(address to, uint256 tokenId) internal {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _tokenOwner[tokenId] = to;
        _ownedTokensCount[to].increment();

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Internal function to transfer ownership of a given token ID to another address.
     * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(address from, address to, uint256 tokenId) internal {
        require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _clearApproval(tokenId);

        _ownedTokensCount[from].decrement();
        _ownedTokensCount[to].increment();

        _tokenOwner[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * This is an internal detail of the `ERC721` contract and its use is deprecated.
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        internal returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = to.call(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ));
        if (!success) {
            if (returndata.length > 0) {
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert("ERC721: transfer to non ERC721Receiver implementer");
            }
        } else {
            bytes4 retval = abi.decode(returndata, (bytes4));
            return (retval == _ERC721_RECEIVED);
        }
    }

    /**
     * @dev Private function to clear current approval of a given token ID.
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _clearApproval(uint256 tokenId) private {
        if (_tokenApprovals[tokenId] != address(0)) {
            _tokenApprovals[tokenId] = address(0);
        }
    }

    uint256[50] private ______gap;
}

// File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC721/IERC721Enumerable.sol

pragma solidity ^0.5.0;



/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721Enumerable is Initializable, IERC721 {
    function totalSupply() public view returns (uint256);
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId);

    function tokenByIndex(uint256 index) public view returns (uint256);
}

// File: contracts/ERC721Enumerable.sol

pragma solidity ^0.5.0;






/**
 * @title ERC-721 Non-Fungible Token with optional enumeration extension logic
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721Enumerable is Initializable, Context, ERC165, ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => uint256[]) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

    /**
     * @dev Constructor function.
     */
    function initialize() public initializer {
        require(ERC721._hasBeenInitialized());
        // register the supported interface to conform to ERC721Enumerable via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    function _hasBeenInitialized() internal view returns (bool) {
        return supportsInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @dev Gets the token ID at a given index of the tokens list of the requested owner.
     * @param owner address owning the tokens list to be accessed
     * @param index uint256 representing the index to be accessed of the requested tokens list
     * @return uint256 token ID at the given index of the tokens list owned by the requested address
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev Gets the total amount of tokens stored by the contract.
     * @return uint256 representing the total amount of tokens
     */
    function totalSupply() public view returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev Gets the token ID at a given index of all the tokens in this contract
     * Reverts if the index is greater or equal to the total number of tokens.
     * @param index uint256 representing the index to be accessed of the tokens list
     * @return uint256 token ID at the given index of the tokens list
     */
    function tokenByIndex(uint256 index) public view returns (uint256) {
        require(index < totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Internal function to transfer ownership of a given token ID to another address.
     * As opposed to transferFrom, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(address from, address to, uint256 tokenId) internal {
        super._transferFrom(from, to, tokenId);

        _removeTokenFromOwnerEnumeration(from, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);
    }

    /**
     * @dev Internal function to mint a new token.
     * Reverts if the given token ID already exists.
     * @param to address the beneficiary that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _mint(address to, uint256 tokenId) internal {
        super._mint(to, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);

        _addTokenToAllTokensEnumeration(tokenId);
    }

    // /**
    //  * @dev Internal function to burn a specific token.
    //  * Reverts if the token does not exist.
    //  * Deprecated, use {ERC721-_burn} instead.
    //  * @param owner owner of the token to burn
    //  * @param tokenId uint256 ID of the token being burned
    //  */
    // function _burn(address owner, uint256 tokenId) internal {
    //     super._burn(owner, tokenId);

    //     _removeTokenFromOwnerEnumeration(owner, tokenId);
    //     // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund
    //     _ownedTokensIndex[tokenId] = 0;

    //     // _removeTokenFromAllTokensEnumeration(tokenId);
    // }

    /**
     * @dev Gets the list of token IDs of the requested owner.
     * @param owner address owning the tokens
     * @return uint256[] List of token IDs owned by the requested address
     */
    function _tokensOfOwner(address owner) internal view returns (uint256[] storage) {
        return _ownedTokens[owner];
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        _ownedTokensIndex[tokenId] = _ownedTokens[to].length;
        _ownedTokens[to].push(tokenId);
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _ownedTokens[from].length.sub(1);
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        _ownedTokens[from].length--;

        // Note that _ownedTokensIndex[tokenId] hasn't been cleared: it still points to the old slot (now occupied by
        // lastTokenId, or just over the end of the array if the token was the last one).
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    // function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
    //     // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
    //     // then delete the last slot (swap and pop).

    //     uint256 lastTokenIndex = _allTokens.length.sub(1);
    //     uint256 tokenIndex = _allTokensIndex[tokenId];

    //     // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
    //     // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
    //     // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
    //     uint256 lastTokenId = _allTokens[lastTokenIndex];

    //     _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
    //     _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

    //     // This also deletes the contents at the last position of the array
    //     _allTokens.length--;
    //     _allTokensIndex[tokenId] = 0;
    // }

    uint256[50] private ______gap;
}

// File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC721/IERC721Metadata.sol

pragma solidity ^0.5.0;



/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721Metadata is Initializable, IERC721 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: contracts/ERC721Metadata.sol

pragma solidity ^0.5.0;






contract ERC721Metadata is Initializable, Context, ERC165, ERC721, IERC721Metadata {
    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /**
     * @dev Constructor function
     */
    function initialize(string memory name, string memory symbol) public initializer {
        require(ERC721._hasBeenInitialized());

        _name = name;
        _symbol = symbol;

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
    }

    function _hasBeenInitialized() internal view returns (bool) {
        return supportsInterface(_INTERFACE_ID_ERC721_METADATA);
    }

    /**
     * @dev Gets the token name.
     * @return string representing the token name
     */
    function name() external view returns (string memory) {
        return _name;
    }

    /**
     * @dev Gets the token symbol.
     * @return string representing the token symbol
     */
    function symbol() external view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns an URI for a given token ID.
     * Throws if the token ID does not exist. May return an empty string.
     * @param tokenId uint256 ID of the token to query
     */
    function tokenURI(uint256 tokenId) external view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return _tokenURIs[tokenId];
    }

    /**
     * @dev Internal function to set the token URI for a given token.
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to set its URI
     * @param uri string URI to assign
     */
    function _setTokenURI(uint256 tokenId, string memory uri) internal {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = uri;
    }

    // *
    //  * @dev Internal function to burn a specific token.
    //  * Reverts if the token does not exist.
    //  * Deprecated, use _burn(uint256) instead.
    //  * @param owner owner of the token to burn
    //  * @param tokenId uint256 ID of the token being burned by the msg.sender
     
    // function _burn(address owner, uint256 tokenId) internal {
    //     super._burn(owner, tokenId);

    //     // Clear metadata (if any)
    //     if (bytes(_tokenURIs[tokenId]).length != 0) {
    //         delete _tokenURIs[tokenId];
    //     }
    // }

    uint256[50] private ______gap;
}

// File: contracts/AsyncArtwork_v2.sol

pragma solidity ^0.5.12;




// interface for the v1 contract
interface AsyncArtwork_v1 {
    function getControlToken(uint256 controlTokenId)
        external
        view
        returns (int256[] memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// Copyright (C) 2020 Asynchronous Art, Inc.
// GNU General Public License v3.0
// Full notice https://github.com/asyncart/async-contracts/blob/master/LICENSE

contract AsyncArtwork_v2 is
    Initializable,
    ERC721,
    ERC721Enumerable,
    ERC721Metadata
{
    // An event whenever the platform address is updated
    event PlatformAddressUpdated(address platformAddress);

    event PermissionUpdated(
        uint256 tokenId,
        address tokenOwner,
        address permissioned
    );

    // An event whenever a creator is whitelisted with the token id and the layer count
    event CreatorWhitelisted(
        uint256 tokenId,
        uint256 layerCount,
        address creator
    );

    // An event whenever royalty amount for a token is updated
    event PlatformSalePercentageUpdated(
        uint256 tokenId,
        uint256 platformFirstPercentage,
        uint256 platformSecondPercentage
    );

    event DefaultPlatformSalePercentageUpdated(
        uint256 defaultPlatformFirstSalePercentage,
        uint256 defaultPlatformSecondSalePercentage
    );

    // An event whenever artist secondary sale percentage is updated
    event ArtistSecondSalePercentUpdated(uint256 artistSecondPercentage);

    // An event whenever a bid is proposed
    event BidProposed(uint256 tokenId, uint256 bidAmount, address bidder);

    // An event whenever an bid is withdrawn
    event BidWithdrawn(uint256 tokenId);

    // An event whenever a buy now price has been set
    event BuyPriceSet(uint256 tokenId, uint256 price);

    // An event when a token has been sold
    event TokenSale(
        // the id of the token
        uint256 tokenId,
        // the price that the token was sold for
        uint256 salePrice,
        // the address of the buyer
        address buyer
    );

    // An event when a token(s) first sale requirement has been waived
    event FirstSaleWaived(
        // the ids of the token
        uint256[] tokenIds
    );

    // An event whenever a control token has been updated
    event ControlLeverUpdated(
        // the id of the token
        uint256 tokenId,
        // an optional amount that the updater sent to boost priority of the rendering
        uint256 priorityTip,
        // the number of times this control lever can now be updated
        int256 numRemainingUpdates,
        // the ids of the levers that were updated
        uint256[] leverIds,
        // the previous values that the levers had before this update (for clients who want to animate the change)
        int256[] previousValues,
        // the new updated value
        int256[] updatedValues
    );

    // struct for a token that controls part of the artwork
    struct ControlToken {
        // number that tracks how many levers there are
        uint256 numControlLevers;
        // The number of update calls this token has (-1 for infinite)
        int256 numRemainingUpdates;
        // false by default, true once instantiated
        bool exists;
        // false by default, true once setup by the artist
        bool isSetup;
        // the levers that this control token can use
        mapping(uint256 => ControlLever) levers;
    }

    // struct for a lever on a control token that can be changed
    struct ControlLever {
        // // The minimum value this token can have (inclusive)
        int256 minValue;
        // The maximum value this token can have (inclusive)
        int256 maxValue;
        // The current value for this token
        int256 currentValue;
        // false by default, true once instantiated
        bool exists;
    }

    // struct for a pending bid
    struct PendingBid {
        // the address of the bidder
        address payable bidder;
        // the amount that they bid
        uint256 amount;
        // false by default, true once instantiated
        bool exists;
    }

    struct WhitelistReservation {
        // the address of the creator
        address creator;
        // the amount of layers they're expected to mint
        uint256 layerCount;
    }

    // track whether this token was sold the first time or not (used for determining whether to use first or secondary sale percentage)
    mapping(uint256 => bool) public tokenDidHaveFirstSale;
    // if a token's URI has been locked or not
    mapping(uint256 => bool) public tokenURILocked;
    // map control token ID to its buy price
    mapping(uint256 => uint256) public buyPrices;
    // mapping of addresses to credits for failed transfers
    mapping(address => uint256) public failedTransferCredits;
    // mapping of tokenId to percentage of sale that the platform gets on first sales
    mapping(uint256 => uint256) public platformFirstSalePercentages;
    // mapping of tokenId to percentage of sale that the platform gets on secondary sales
    mapping(uint256 => uint256) public platformSecondSalePercentages;
    // what tokenId creators are allowed to mint (and how many layers)
    mapping(uint256 => WhitelistReservation) public creatorWhitelist;
    // for each token, holds an array of the creator collaborators. For layer tokens it will likely just be [artist], for master tokens it may hold multiples
    mapping(uint256 => address payable[]) public uniqueTokenCreators;
    // map a control token ID to its highest bid
    mapping(uint256 => PendingBid) public pendingBids;
    // map a control token id to a control token struct
    mapping(uint256 => ControlToken) public controlTokenMapping;
    // mapping of addresses that are allowed to control tokens on your behalf
    mapping(address => mapping(uint256 => address))
        public permissionedControllers;
    // the percentage of sale that an artist gets on secondary sales
    uint256 public artistSecondSalePercentage;
    // gets incremented to placehold for tokens not minted yet
    uint256 public expectedTokenSupply;
    // the minimum % increase for new bids coming
    uint256 public minBidIncreasePercent;
    // the address of the platform (for receving commissions and royalties)
    address payable public platformAddress;
    // the address of the contract that can upgrade from v1 to v2 tokens
    address public upgraderAddress;
    // the address of the contract that can whitelist artists to mint
    address public minterAddress;

    // v3 vairables
    uint256 public defaultPlatformFirstSalePercentage;
    uint256 public defaultPlatformSecondSalePercentage;

    function setup(
        string memory name,
        string memory symbol,
        uint256 initialExpectedTokenSupply,
        address _upgraderAddress
    ) public initializer {
        ERC721.initialize();
        ERC721Enumerable.initialize();
        ERC721Metadata.initialize(name, symbol);

        // starting royalty amounts
        artistSecondSalePercentage = 10;

        // intitialize the minimum bid increase percent
        minBidIncreasePercent = 1;

        // by default, the platformAddress is the address that mints this contract
        platformAddress = msg.sender;

        // set the upgrader address
        upgraderAddress = _upgraderAddress;

        // set the initial expected token supply
        expectedTokenSupply = initialExpectedTokenSupply;

        require(expectedTokenSupply > 0);
    }

    // modifier for only allowing the platform to make a call
    modifier onlyPlatform() {
        require(msg.sender == platformAddress);
        _;
    }

    // modifier for only allowing the minter to make a call
    modifier onlyMinter() {
        require(msg.sender == minterAddress);
        _;
    }

    modifier onlyWhitelistedCreator(uint256 masterTokenId, uint256 layerCount) {
        require(creatorWhitelist[masterTokenId].creator == msg.sender);
        require(creatorWhitelist[masterTokenId].layerCount == layerCount);
        _;
    }

    function setExpectedTokenSupply(uint256 newExpectedTokenSupply)
        external
        onlyPlatform
    {
        expectedTokenSupply = newExpectedTokenSupply;
    }

    // reserve a tokenID and layer count for a creator. Define a platform royalty percentage per art piece (some pieces have higher or lower amount)
    function whitelistTokenForCreator(
        address creator,
        uint256 masterTokenId,
        uint256 layerCount,
        uint256 platformFirstSalePercentage,
        uint256 platformSecondSalePercentage
    ) external onlyMinter {
        // the tokenID we're reserving must be the current expected token supply
        require(masterTokenId == expectedTokenSupply);
        // reserve the tokenID for this creator
        creatorWhitelist[masterTokenId] = WhitelistReservation(
            creator,
            layerCount
        );
        // increase the expected token supply
        expectedTokenSupply = masterTokenId.add(layerCount).add(1);
        // define the platform percentages for this token here
        platformFirstSalePercentages[
            masterTokenId
        ] = platformFirstSalePercentage;
        platformSecondSalePercentages[
            masterTokenId
        ] = platformSecondSalePercentage;

        emit CreatorWhitelisted(masterTokenId, layerCount, creator);
    }

    // Allows the platform to change the minter address
    function updateMinterAddress(address newMinterAddress)
        external
        onlyPlatform
    {
        minterAddress = newMinterAddress;
    }

    // Allows the current platform address to update to something different
    function updatePlatformAddress(address payable newPlatformAddress)
        external
        onlyPlatform
    {
        platformAddress = newPlatformAddress;

        emit PlatformAddressUpdated(newPlatformAddress);
    }

    // Allows platform to waive the first sale requirement for a token (for charity events, special cases, etc)
    function waiveFirstSaleRequirement(uint256[] calldata tokenIds)
        external
        onlyPlatform
    {
        // This allows the token sale proceeds to go to the current owner (rather than be distributed amongst the token's creators)
        for (uint256 k = 0; k < tokenIds.length; k++) {
            tokenDidHaveFirstSale[tokenIds[k]] = true;
        }

        emit FirstSaleWaived(tokenIds);
    }

    // Allows platform to change the royalty percentage for a specific token
    function updatePlatformSalePercentage(
        uint256 tokenId,
        uint256 platformFirstSalePercentage,
        uint256 platformSecondSalePercentage
    ) external onlyPlatform {
        // set the percentages for this token
        platformFirstSalePercentages[tokenId] = platformFirstSalePercentage;
        platformSecondSalePercentages[tokenId] = platformSecondSalePercentage;
        // emit an event to notify that the platform percent for this token has changed
        emit PlatformSalePercentageUpdated(
            tokenId,
            platformFirstSalePercentage,
            platformSecondSalePercentage
        );
    }

    // Allows platform to change the default sales percentages
    function updateDefaultPlatformSalePercentage(
        uint256 _defaultPlatformFirstSalePercentage,
        uint256 _defaultPlatformSecondSalePercentage
    ) external onlyPlatform {
        defaultPlatformFirstSalePercentage = _defaultPlatformFirstSalePercentage;
        defaultPlatformSecondSalePercentage = _defaultPlatformSecondSalePercentage;

        // emit an event to notify that the platform percent has changed
        emit DefaultPlatformSalePercentageUpdated(
            defaultPlatformFirstSalePercentage,
            defaultPlatformSecondSalePercentage
        );
    }

    // Allows the platform to change the minimum percent increase for incoming bids
    function updateMinimumBidIncreasePercent(uint256 _minBidIncreasePercent)
        external
        onlyPlatform
    {
        require(
            (_minBidIncreasePercent > 0) && (_minBidIncreasePercent <= 50),
            "Bid increases must be within 0-50%"
        );
        // set the new bid increase percent
        minBidIncreasePercent = _minBidIncreasePercent;
    }

    // Allow the platform to update a token's URI if it's not locked yet (for fixing tokens post mint process)
    function updateTokenURI(uint256 tokenId, string calldata tokenURI)
        external
        onlyPlatform
    {
        // ensure that this token exists
        require(_exists(tokenId));
        // ensure that the URI for this token is not locked yet
        require(tokenURILocked[tokenId] == false);
        // update the token URI
        super._setTokenURI(tokenId, tokenURI);
    }

    // Locks a token's URI from being updated
    function lockTokenURI(uint256 tokenId) external onlyPlatform {
        // ensure that this token exists
        require(_exists(tokenId));
        // lock this token's URI from being changed
        tokenURILocked[tokenId] = true;
    }

    // Allows platform to change the percentage that artists receive on secondary sales
    function updateArtistSecondSalePercentage(
        uint256 _artistSecondSalePercentage
    ) external onlyPlatform {
        // update the percentage that artists get on secondary sales
        artistSecondSalePercentage = _artistSecondSalePercentage;
        // emit an event to notify that the artist second sale percent has updated
        emit ArtistSecondSalePercentUpdated(artistSecondSalePercentage);
    }

    function setupControlToken(
        uint256 controlTokenId,
        string calldata controlTokenURI,
        int256[] calldata leverMinValues,
        int256[] calldata leverMaxValues,
        int256[] calldata leverStartValues,
        int256 numAllowedUpdates,
        address payable[] calldata additionalCollaborators
    ) external {
        // Hard cap the number of levers a single control token can have
        require(leverMinValues.length <= 500, "Too many control levers.");
        // Hard cap the number of collaborators a single control token can have
        require(
            additionalCollaborators.length <= 50,
            "Too many collaborators."
        );
        // ensure that this token is not setup yet
        require(
            controlTokenMapping[controlTokenId].isSetup == false,
            "Already setup"
        );
        // ensure that only the control token artist is attempting this mint
        require(
            uniqueTokenCreators[controlTokenId][0] == msg.sender,
            "Must be control token artist"
        );
        // enforce that the length of all the array lengths are equal
        require(
            (leverMinValues.length == leverMaxValues.length) &&
                (leverMaxValues.length == leverStartValues.length),
            "Values array mismatch"
        );
        // require the number of allowed updates to be infinite (-1) or some finite number
        require(
            (numAllowedUpdates == -1) || (numAllowedUpdates > 0),
            "Invalid allowed updates"
        );
        // mint the control token here
        super._safeMint(msg.sender, controlTokenId);
        // set token URI
        super._setTokenURI(controlTokenId, controlTokenURI);
        // create the control token
        controlTokenMapping[controlTokenId] = ControlToken(
            leverStartValues.length,
            numAllowedUpdates,
            true,
            true
        );
        // create the control token levers now
        for (uint256 k = 0; k < leverStartValues.length; k++) {
            // enforce that maxValue is greater than or equal to minValue
            require(
                leverMaxValues[k] >= leverMinValues[k],
                "Max val must >= min"
            );
            // enforce that currentValue is valid
            require(
                (leverStartValues[k] >= leverMinValues[k]) &&
                    (leverStartValues[k] <= leverMaxValues[k]),
                "Invalid start val"
            );
            // add the lever to this token
            controlTokenMapping[controlTokenId].levers[k] = ControlLever(
                leverMinValues[k],
                leverMaxValues[k],
                leverStartValues[k],
                true
            );
        }
        // the control token artist can optionally specify additional collaborators on this layer
        for (uint256 i = 0; i < additionalCollaborators.length; i++) {
            // can't provide burn address as collaborator
            require(additionalCollaborators[i] != address(0));

            uniqueTokenCreators[controlTokenId].push(
                additionalCollaborators[i]
            );
        }
    }

    // upgrade a token from the v1 contract to this v2 version
    function upgradeV1Token(
        uint256 tokenId,
        address v1Address,
        bool isControlToken,
        address to,
        uint256 platformFirstPercentageForToken,
        uint256 platformSecondPercentageForToken,
        bool hasTokenHadFirstSale,
        address payable[] calldata uniqueTokenCreatorsForToken
    ) external {
        // get reference to v1 token contract
        AsyncArtwork_v1 v1Token = AsyncArtwork_v1(v1Address);

        // require that only the upgrader address is calling this method
        require(msg.sender == upgraderAddress, "Only upgrader can call.");
        
        // preserve the unique token creators
        uniqueTokenCreators[tokenId] = uniqueTokenCreatorsForToken;

        if (isControlToken) {
            // preserve the control token details if it's a control token
            int256[] memory controlToken = v1Token.getControlToken(tokenId);
            // Require control token to be a valid size (multiple of 3)
            require(controlToken.length % 3 == 0, "Invalid control token.");
            // Require control token to have at least 1 lever
            require(controlToken.length > 0, "Control token must have levers");
            // Setup the control token
            // Use -1 for numRemainingUpdates since v1 tokens were infinite use
            controlTokenMapping[tokenId] = ControlToken(
                controlToken.length / 3,
                -1,
                true,
                true
            );

            // set each lever for the control token. getControlToken returns levers like:
            // [minValue, maxValue, curValue, minValue, maxValue, curValue, ...] so they always come in groups of 3
            for (uint256 k = 0; k < controlToken.length; k += 3) {
                controlTokenMapping[tokenId].levers[k / 3] = ControlLever(
                    controlToken[k],
                    controlToken[k + 1],
                    controlToken[k + 2],
                    true
                );
            }
        }

        // Set the royalty percentage for this token
        platformFirstSalePercentages[tokenId] = platformFirstPercentageForToken;

        platformSecondSalePercentages[
            tokenId
        ] = platformSecondPercentageForToken;

        // whether this token has already had its first sale
        tokenDidHaveFirstSale[tokenId] = hasTokenHadFirstSale;

        // Mint and transfer the token to the original v1 token owner
        super._safeMint(to, tokenId);

        // set the same token URI
        super._setTokenURI(tokenId, v1Token.tokenURI(tokenId));
    }

    function mintArtwork(
        uint256 masterTokenId,
        string calldata artworkTokenURI,
        address payable[] calldata controlTokenArtists,
        address payable[] calldata uniqueArtists
    )
        external
        onlyWhitelistedCreator(masterTokenId, controlTokenArtists.length)
    {
        // Can't mint a token with ID 0 anymore
        require(masterTokenId > 0);
        // Mint the token that represents ownership of the entire artwork
        super._safeMint(msg.sender, masterTokenId);
        // set the token URI for this art
        super._setTokenURI(masterTokenId, artworkTokenURI);
        // set the unique artists array for future royalties
        uniqueTokenCreators[masterTokenId] = uniqueArtists;
        // iterate through all control token URIs (1 for each control token)
        for (uint256 i = 0; i < controlTokenArtists.length; i++) {
            // can't provide burn address as artist
            require(controlTokenArtists[i] != address(0));
            // determine the tokenID for this control token
            uint256 controlTokenId = masterTokenId + i + 1;
            // add this control token artist to the unique creator list for that control token
            uniqueTokenCreators[controlTokenId].push(controlTokenArtists[i]);
        }
    }

    // Bidder functions
    function bid(uint256 tokenId) external payable {
        // don't allow bids of 0
        require(msg.value > 0);
        // don't let owners/approved bid on their own tokens
        require(_isApprovedOrOwner(msg.sender, tokenId) == false);
        // check if there's a high bid
        if (pendingBids[tokenId].exists) {
            // enforce that this bid is higher by at least the minimum required percent increase
            require(
                msg.value >=
                    (
                        pendingBids[tokenId]
                            .amount
                            .mul(minBidIncreasePercent.add(100))
                            .div(100)
                    ),
                "Bid must increase by min %"
            );
            // Return bid amount back to bidder
            safeFundsTransfer(
                pendingBids[tokenId].bidder,
                pendingBids[tokenId].amount
            );
        }
        // set the new highest bid
        pendingBids[tokenId] = PendingBid(msg.sender, msg.value, true);
        // Emit event for the bid proposal
        emit BidProposed(tokenId, msg.value, msg.sender);
    }

    // allows an address with a pending bid to withdraw it
    function withdrawBid(uint256 tokenId) external {
        // check that there is a bid from the sender to withdraw (also allows platform address to withdraw a bid on someone's behalf)
        require(
            (pendingBids[tokenId].bidder == msg.sender) ||
                (msg.sender == platformAddress)
        );
        // attempt to withdraw the bid
        _withdrawBid(tokenId);
    }

    function _withdrawBid(uint256 tokenId) internal {
        require(pendingBids[tokenId].exists);
        // Return bid amount back to bidder
        safeFundsTransfer(
            pendingBids[tokenId].bidder,
            pendingBids[tokenId].amount
        );
        // clear highest bid
        pendingBids[tokenId] = PendingBid(address(0), 0, false);
        // emit an event when the highest bid is withdrawn
        emit BidWithdrawn(tokenId);
    }

    // Buy the artwork for the currently set price
    // Allows the buyer to specify an expected remaining uses they'll accept
    function takeBuyPrice(uint256 tokenId, int256 expectedRemainingUpdates)
        external
        payable
    {
        // don't let owners/approved buy their own tokens
        require(_isApprovedOrOwner(msg.sender, tokenId) == false);
        // get the sale amount
        uint256 saleAmount = buyPrices[tokenId];
        // check that there is a buy price
        require(saleAmount > 0);
        // check that the buyer sent exact amount to purchase
        require(msg.value == saleAmount);
        // if this is a control token
        if (controlTokenMapping[tokenId].exists) {
            // ensure that the remaining uses on the token is equal to what buyer expects
            require(
                controlTokenMapping[tokenId].numRemainingUpdates ==
                    expectedRemainingUpdates
            );
        }
        // Return all highest bidder's money
        if (pendingBids[tokenId].exists) {
            // Return bid amount back to bidder
            safeFundsTransfer(
                pendingBids[tokenId].bidder,
                pendingBids[tokenId].amount
            );
            // clear highest bid
            pendingBids[tokenId] = PendingBid(address(0), 0, false);
        }
        onTokenSold(tokenId, saleAmount, msg.sender);
    }

    // Take an amount and distribute it evenly amongst a list of creator addresses
    function distributeFundsToCreators(
        uint256 amount,
        address payable[] memory creators
    ) private {
        if (creators.length > 0) {
            uint256 creatorShare = amount.div(creators.length);

            for (uint256 i = 0; i < creators.length; i++) {
                safeFundsTransfer(creators[i], creatorShare);
            }
        }
    }

    // When a token is sold via list price or bid. Distributes the sale amount to the unique token creators and transfer
    // the token to the new owner
    function onTokenSold(
        uint256 tokenId,
        uint256 saleAmount,
        address to
    ) private {
        // if the first sale already happened, then give the artist + platform the secondary royalty percentage
        if (tokenDidHaveFirstSale[tokenId]) {
            // give platform its secondary sale percentage
            uint256 platformAmount;
            if (platformSecondSalePercentages[tokenId] == 0) {
                // default amount
                platformAmount = saleAmount
                    .mul(defaultPlatformSecondSalePercentage)
                    .div(100);
            } else {
                platformAmount = saleAmount
                    .mul(platformSecondSalePercentages[tokenId])
                    .div(100);
            }

            safeFundsTransfer(platformAddress, platformAmount);
            // distribute the creator royalty amongst the creators (all artists involved for a base token, sole artist creator for layer )
            uint256 creatorAmount =
                saleAmount.mul(artistSecondSalePercentage).div(100);
            distributeFundsToCreators(
                creatorAmount,
                uniqueTokenCreators[tokenId]
            );
            // cast the owner to a payable address
            address payable payableOwner = address(uint160(ownerOf(tokenId)));
            // transfer the remaining amount to the owner of the token
            safeFundsTransfer(
                payableOwner,
                saleAmount.sub(platformAmount).sub(creatorAmount)
            );
        } else {
            tokenDidHaveFirstSale[tokenId] = true;

            // give platform its first sale percentage
            uint256 platformAmount;
            if (platformFirstSalePercentages[tokenId] == 0) {
                // default value
                platformAmount = saleAmount
                    .mul(defaultPlatformFirstSalePercentage)
                    .div(100);
            } else {
                platformAmount = saleAmount
                    .mul(platformFirstSalePercentages[tokenId])
                    .div(100);
            }

            safeFundsTransfer(platformAddress, platformAmount);
            // this is a token first sale, so distribute the remaining funds to the unique token creators of this token
            // (if it's a base token it will be all the unique creators, if it's a control token it will be that single artist)
            distributeFundsToCreators(
                saleAmount.sub(platformAmount),
                uniqueTokenCreators[tokenId]
            );
        }
        // clear highest bid
        pendingBids[tokenId] = PendingBid(address(0), 0, false);
        // Transfer token to msg.sender
        _transferFrom(ownerOf(tokenId), to, tokenId);
        // Emit event
        emit TokenSale(tokenId, saleAmount, to);
    }

    // Owner functions
    // Allow owner to accept the highest bid for a token
    function acceptBid(uint256 tokenId, uint256 minAcceptedAmount) external {
        // check if sender is owner/approved of token
        require(_isApprovedOrOwner(msg.sender, tokenId));
        // check if there's a bid to accept
        require(pendingBids[tokenId].exists);
        // check that the current pending bid amount is at least what the accepting owner expects
        require(pendingBids[tokenId].amount >= minAcceptedAmount);
        // process the sale
        onTokenSold(
            tokenId,
            pendingBids[tokenId].amount,
            pendingBids[tokenId].bidder
        );
    }

    // Allows owner of a control token to set an immediate buy price. Set to 0 to reset.
    function makeBuyPrice(uint256 tokenId, uint256 amount) external {
        // check if sender is owner/approved of token
        require(_isApprovedOrOwner(msg.sender, tokenId));
        // set the buy price
        buyPrices[tokenId] = amount;
        // emit event
        emit BuyPriceSet(tokenId, amount);
    }

    // return the number of times that a control token can be used
    function getNumRemainingControlUpdates(uint256 controlTokenId)
        external
        view
        returns (int256)
    {
        require(
            controlTokenMapping[controlTokenId].isSetup,
            "Token does not exist."
        );

        return controlTokenMapping[controlTokenId].numRemainingUpdates;
    }

    // return the min, max, and current value of a control lever
    function getControlToken(uint256 controlTokenId)
        external
        view
        returns (int256[] memory)
    {
        require(
            controlTokenMapping[controlTokenId].isSetup,
            "Token does not exist."
        );

        ControlToken storage controlToken = controlTokenMapping[controlTokenId];

        int256[] memory returnValues =
            new int256[](controlToken.numControlLevers.mul(3));
        uint256 returnValIndex = 0;

        // iterate through all the control levers for this control token
        for (uint256 i = 0; i < controlToken.numControlLevers; i++) {
            returnValues[returnValIndex] = controlToken.levers[i].minValue;
            returnValIndex = returnValIndex.add(1);

            returnValues[returnValIndex] = controlToken.levers[i].maxValue;
            returnValIndex = returnValIndex.add(1);

            returnValues[returnValIndex] = controlToken.levers[i].currentValue;
            returnValIndex = returnValIndex.add(1);
        }

        return returnValues;
    }

    // anyone can grant permission to another address to control a specific token on their behalf. Set to Address(0) to reset.
    function grantControlPermission(uint256 tokenId, address permissioned)
        external
    {
        permissionedControllers[msg.sender][tokenId] = permissioned;

        emit PermissionUpdated(tokenId, msg.sender, permissioned);
    }

    // Allows owner (or permissioned user) of a control token to update its lever values
    // Optionally accept a payment to increase speed of rendering priority
    function useControlToken(
        uint256 controlTokenId,
        uint256[] calldata leverIds,
        int256[] calldata newValues
    ) external payable {
        // check if sender is owner/approved of token OR if they're a permissioned controller for the token owner
        require(
            _isApprovedOrOwner(msg.sender, controlTokenId) ||
                (permissionedControllers[ownerOf(controlTokenId)][
                    controlTokenId
                ] == msg.sender),
            "Owner or permissioned only"
        );
        // check if control exists
        require(
            controlTokenMapping[controlTokenId].isSetup,
            "Token does not exist."
        );
        // get the control token reference
        ControlToken storage controlToken = controlTokenMapping[controlTokenId];
        // check that number of uses for control token is either infinite or is positive
        require(
            (controlToken.numRemainingUpdates == -1) ||
                (controlToken.numRemainingUpdates > 0),
            "No more updates allowed"
        );
        // collect the previous lever values for the event emit below
        int256[] memory previousValues = new int256[](newValues.length);

        for (uint256 i = 0; i < leverIds.length; i++) {
            // get the control lever
            ControlLever storage lever =
                controlTokenMapping[controlTokenId].levers[leverIds[i]];

            // Enforce that the new value is valid
            require(
                (newValues[i] >= lever.minValue) &&
                    (newValues[i] <= lever.maxValue),
                "Invalid val"
            );

            // Enforce that the new value is different
            require(
                newValues[i] != lever.currentValue,
                "Must provide different val"
            );

            // grab previous value for the event emit
            previousValues[i] = lever.currentValue;

            // Update token current value
            lever.currentValue = newValues[i];
        }

        // if there's a payment then send it to the platform (for higher priority updates)
        if (msg.value > 0) {
            safeFundsTransfer(platformAddress, msg.value);
        }

        // if this control token is finite in its uses
        if (controlToken.numRemainingUpdates > 0) {
            // decrease it down by 1
            controlToken.numRemainingUpdates =
                controlToken.numRemainingUpdates -
                1;

            // since we used one of those updates, withdraw any existing bid for this token if exists
            if (pendingBids[controlTokenId].exists) {
                _withdrawBid(controlTokenId);
            }
        }

        // emit event
        emit ControlLeverUpdated(
            controlTokenId,
            msg.value,
            controlToken.numRemainingUpdates,
            leverIds,
            previousValues,
            newValues
        );
    }

    // Allows a user to withdraw all failed transaction credits
    function withdrawAllFailedCredits() external {
        uint256 amount = failedTransferCredits[msg.sender];

        require(amount != 0);
        require(address(this).balance >= amount);

        failedTransferCredits[msg.sender] = 0;

        (bool successfulWithdraw, ) = msg.sender.call.value(amount)("");
        require(successfulWithdraw);
    }

    // Safely transfer funds and if fail then store that amount as credits for a later pull
    function safeFundsTransfer(address payable recipient, uint256 amount)
        internal
    {
        // attempt to send the funds to the recipient
        (bool success, ) = recipient.call.value(amount).gas(2300)("");
        // if it failed, update their credit balance so they can pull it later
        if (success == false) {
            failedTransferCredits[recipient] = failedTransferCredits[recipient]
                .add(amount);
        }
    }

    // override the default transfer
    function _transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) internal {
        // clear a buy now price
        buyPrices[tokenId] = 0;
        // transfer the token
        super._transferFrom(from, to, tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"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":false,"internalType":"uint256","name":"artistSecondPercentage","type":"uint256"}],"name":"ArtistSecondSalePercentUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bidAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"bidder","type":"address"}],"name":"BidProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"BidWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"BuyPriceSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"priorityTip","type":"uint256"},{"indexed":false,"internalType":"int256","name":"numRemainingUpdates","type":"int256"},{"indexed":false,"internalType":"uint256[]","name":"leverIds","type":"uint256[]"},{"indexed":false,"internalType":"int256[]","name":"previousValues","type":"int256[]"},{"indexed":false,"internalType":"int256[]","name":"updatedValues","type":"int256[]"}],"name":"ControlLeverUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"layerCount","type":"uint256"},{"indexed":false,"internalType":"address","name":"creator","type":"address"}],"name":"CreatorWhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"defaultPlatformFirstSalePercentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"defaultPlatformSecondSalePercentage","type":"uint256"}],"name":"DefaultPlatformSalePercentageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"FirstSaleWaived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenOwner","type":"address"},{"indexed":false,"internalType":"address","name":"permissioned","type":"address"}],"name":"PermissionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"platformAddress","type":"address"}],"name":"PlatformAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"platformFirstPercentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"platformSecondPercentage","type":"uint256"}],"name":"PlatformSalePercentageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"salePrice","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"}],"name":"TokenSale","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"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"minAcceptedAmount","type":"uint256"}],"name":"acceptBid","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"artistSecondSalePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"bid","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"buyPrices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"controlTokenMapping","outputs":[{"internalType":"uint256","name":"numControlLevers","type":"uint256"},{"internalType":"int256","name":"numRemainingUpdates","type":"int256"},{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"bool","name":"isSetup","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creatorWhitelist","outputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"layerCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"defaultPlatformFirstSalePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"defaultPlatformSecondSalePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"expectedTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"failedTransferCredits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"controlTokenId","type":"uint256"}],"name":"getControlToken","outputs":[{"internalType":"int256[]","name":"","type":"int256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"controlTokenId","type":"uint256"}],"name":"getNumRemainingControlUpdates","outputs":[{"internalType":"int256","name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"permissioned","type":"address"}],"name":"grantControlPermission","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"lockTokenURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"makeBuyPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minBidIncreasePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"masterTokenId","type":"uint256"},{"internalType":"string","name":"artworkTokenURI","type":"string"},{"internalType":"address payable[]","name":"controlTokenArtists","type":"address[]"},{"internalType":"address payable[]","name":"uniqueArtists","type":"address[]"}],"name":"mintArtwork","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingBids","outputs":[{"internalType":"address payable","name":"bidder","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"permissionedControllers","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"platformAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"platformFirstSalePercentages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"platformSecondSalePercentages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"newExpectedTokenSupply","type":"uint256"}],"name":"setExpectedTokenSupply","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"initialExpectedTokenSupply","type":"uint256"},{"internalType":"address","name":"_upgraderAddress","type":"address"}],"name":"setup","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"controlTokenId","type":"uint256"},{"internalType":"string","name":"controlTokenURI","type":"string"},{"internalType":"int256[]","name":"leverMinValues","type":"int256[]"},{"internalType":"int256[]","name":"leverMaxValues","type":"int256[]"},{"internalType":"int256[]","name":"leverStartValues","type":"int256[]"},{"internalType":"int256","name":"numAllowedUpdates","type":"int256"},{"internalType":"address payable[]","name":"additionalCollaborators","type":"address[]"}],"name":"setupControlToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"int256","name":"expectedRemainingUpdates","type":"int256"}],"name":"takeBuyPrice","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenDidHaveFirstSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenURILocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"uniqueTokenCreators","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_artistSecondSalePercentage","type":"uint256"}],"name":"updateArtistSecondSalePercentage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_defaultPlatformFirstSalePercentage","type":"uint256"},{"internalType":"uint256","name":"_defaultPlatformSecondSalePercentage","type":"uint256"}],"name":"updateDefaultPlatformSalePercentage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_minBidIncreasePercent","type":"uint256"}],"name":"updateMinimumBidIncreasePercent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newMinterAddress","type":"address"}],"name":"updateMinterAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"newPlatformAddress","type":"address"}],"name":"updatePlatformAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"platformFirstSalePercentage","type":"uint256"},{"internalType":"uint256","name":"platformSecondSalePercentage","type":"uint256"}],"name":"updatePlatformSalePercentage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"updateTokenURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"v1Address","type":"address"},{"internalType":"bool","name":"isControlToken","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"platformFirstPercentageForToken","type":"uint256"},{"internalType":"uint256","name":"platformSecondPercentageForToken","type":"uint256"},{"internalType":"bool","name":"hasTokenHadFirstSale","type":"bool"},{"internalType":"address payable[]","name":"uniqueTokenCreatorsForToken","type":"address[]"}],"name":"upgradeV1Token","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"upgraderAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"controlTokenId","type":"uint256"},{"internalType":"uint256[]","name":"leverIds","type":"uint256[]"},{"internalType":"int256[]","name":"newValues","type":"int256[]"}],"name":"useControlToken","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"waiveFirstSaleRequirement","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"masterTokenId","type":"uint256"},{"internalType":"uint256","name":"layerCount","type":"uint256"},{"internalType":"uint256","name":"platformFirstSalePercentage","type":"uint256"},{"internalType":"uint256","name":"platformSecondSalePercentage","type":"uint256"}],"name":"whitelistTokenForCreator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawAllFailedCredits","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawBid","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

608060405261552f806100136000396000f3fe6080604052600436106103ad5760003560e01c8063755db7b3116101e7578063b9bf52fa1161010d578063cf8589b9116100a0578063e6e5113b1161006f578063e6e5113b14611406578063e985e9c51461143c578063ef8a85c814611477578063f83036f0146114a7576103ad565b8063cf8589b914611322578063d91c070c14611376578063dbe55e56146113a6578063e50d48f1146113bb576103ad565b8063c87b56dd116100dc578063c87b56dd14611166578063c9340db914611190578063ca4137c3146111c9578063cd2a16ba1461130d576103ad565b8063b9bf52fa146110c5578063ba56f39314611112578063bab2d1111461113c578063c254e2d414611151576103ad565b80638f9f193f11610185578063a90d6de311610154578063a90d6de314610f85578063a94141a114610faf578063b6ad691414610fdf578063b88d4fde14610ff4576103ad565b80638f9f193f14610e8857806395d89b4114610ebb57806396bc50b014610ed0578063a22cb46514610f4a576103ad565b80638129fc1c116101c15780638129fc1c14610e0a5780638311cd3514610e1f578063892918d414610e345780638e2a9bb014610e5e576103ad565b8063755db7b314610c7857806376012bea14610d3d5780637a718d7114610d8f576103ad565b80632fcfb95a116102d75780634f6ccce71161026a5780635f959c58116102395780635f959c5814610bdc5780636352211e14610bf157806370a0823114610c1b578063734f851e14610c4e576103ad565b80634f6ccce714610a48578063556d862814610a725780635a58226014610a875780635d0a5d9a14610aba576103ad565b806345c0c502116102a657806345c0c50214610894578063462399cd146108be5780634cd88b76146108e85780634dfa810314610a1e576103ad565b80632fcfb95a146107ec57806334d722c91461081f57806342842e0e14610834578063454a2ab314610877576103ad565b8063117cbf1e1161034f5780631b59e3451161031e5780631b59e3451461069557806323b872dd1461074d5780632d4fbf83146107905780632f745c59146107b3576103ad565b8063117cbf1e14610598578063148abbae146105c257806318160ddd146105fe57806318e97fd114610613576103ad565b8063081812fc1161038b578063081812fc146104b6578063095ea7b3146104fc5780630a29bb37146105355780630eaaf4c81461056e576103ad565b806301ffc9a7146103b257806302e9d5e4146103fa57806306fdde031461042c575b600080fd5b3480156103be57600080fd5b506103e6600480360360208110156103d557600080fd5b50356001600160e01b03191661166d565b604080519115158252519081900360200190f35b34801561040657600080fd5b5061042a6004803603604081101561041d57600080fd5b508035906020013561168c565b005b34801561043857600080fd5b5061044161170b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561047b578181015183820152602001610463565b50505050905090810190601f1680156104a85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104c257600080fd5b506104e0600480360360208110156104d957600080fd5b50356117a2565b604080516001600160a01b039092168252519081900360200190f35b34801561050857600080fd5b5061042a6004803603604081101561051f57600080fd5b506001600160a01b038135169060200135611804565b34801561054157600080fd5b5061042a6004803603604081101561055857600080fd5b50803590602001356001600160a01b031661192c565b34801561057a57600080fd5b5061042a6004803603602081101561059157600080fd5b50356119a7565b3480156105a457600080fd5b5061042a600480360360208110156105bb57600080fd5b50356119ed565b3480156105ce57600080fd5b506105ec600480360360208110156105e557600080fd5b5035611a57565b60408051918252519081900360200190f35b34801561060a57600080fd5b506105ec611a6a565b34801561061f57600080fd5b5061042a6004803603604081101561063657600080fd5b81359190810190604081016020820135600160201b81111561065757600080fd5b82018360208201111561066957600080fd5b803590602001918460018302840111600160201b8311171561068a57600080fd5b509092509050611a70565b3480156106a157600080fd5b5061042a60048036036101008110156106b957600080fd5b8135916001600160a01b036020820135811692604083013515159260608101359092169160808101359160a08201359160c0810135151591810190610100810160e0820135600160201b81111561070f57600080fd5b82018360208201111561072157600080fd5b803590602001918460208302840111600160201b8311171561074257600080fd5b509092509050611afc565b34801561075957600080fd5b5061042a6004803603606081101561077057600080fd5b506001600160a01b0381358116916020810135909116906040013561203d565b61042a600480360360408110156107a657600080fd5b5080359060200135612094565b3480156107bf57600080fd5b506105ec600480360360408110156107d657600080fd5b506001600160a01b0381351690602001356121bb565b3480156107f857600080fd5b5061042a6004803603602081101561080f57600080fd5b50356001600160a01b031661223b565b34801561082b57600080fd5b506104e0612276565b34801561084057600080fd5b5061042a6004803603606081101561085757600080fd5b506001600160a01b03813581169160208101359091169060400135612286565b61042a6004803603602081101561088d57600080fd5b50356122a1565b3480156108a057600080fd5b5061042a600480360360208110156108b757600080fd5b5035612447565b3480156108ca57600080fd5b506103e6600480360360208110156108e157600080fd5b503561248d565b3480156108f457600080fd5b5061042a6004803603604081101561090b57600080fd5b810190602081018135600160201b81111561092557600080fd5b82018360208201111561093757600080fd5b803590602001918460018302840111600160201b8311171561095857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156109aa57600080fd5b8201836020820111156109bc57600080fd5b803590602001918460018302840111600160201b831117156109dd57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506124a3945050505050565b348015610a2a57600080fd5b506105ec60048036036020811015610a4157600080fd5b503561258f565b348015610a5457600080fd5b506105ec60048036036020811015610a6b57600080fd5b50356125a2565b348015610a7e57600080fd5b506105ec612608565b348015610a9357600080fd5b506105ec60048036036020811015610aaa57600080fd5b50356001600160a01b031661260f565b348015610ac657600080fd5b5061042a60048036036080811015610add57600080fd5b81359190810190604081016020820135600160201b811115610afe57600080fd5b820183602082011115610b1057600080fd5b803590602001918460018302840111600160201b83111715610b3157600080fd5b919390929091602081019035600160201b811115610b4e57600080fd5b820183602082011115610b6057600080fd5b803590602001918460208302840111600160201b83111715610b8157600080fd5b919390929091602081019035600160201b811115610b9e57600080fd5b820183602082011115610bb057600080fd5b803590602001918460208302840111600160201b83111715610bd157600080fd5b509092509050612622565b348015610be857600080fd5b506105ec612780565b348015610bfd57600080fd5b506104e060048036036020811015610c1457600080fd5b5035612787565b348015610c2757600080fd5b506105ec60048036036020811015610c3e57600080fd5b50356001600160a01b03166127db565b348015610c5a57600080fd5b506103e660048036036020811015610c7157600080fd5b5035612843565b61042a60048036036060811015610c8e57600080fd5b81359190810190604081016020820135600160201b811115610caf57600080fd5b820183602082011115610cc157600080fd5b803590602001918460208302840111600160201b83111715610ce257600080fd5b919390929091602081019035600160201b811115610cff57600080fd5b820183602082011115610d1157600080fd5b803590602001918460208302840111600160201b83111715610d3257600080fd5b509092509050612859565b348015610d4957600080fd5b50610d6760048036036020811015610d6057600080fd5b5035612cc7565b6040805194855260208501939093529015158383015215156060830152519081900360800190f35b348015610d9b57600080fd5b5061042a60048036036020811015610db257600080fd5b810190602081018135600160201b811115610dcc57600080fd5b820183602082011115610dde57600080fd5b803590602001918460208302840111600160201b83111715610dff57600080fd5b509092509050612cf5565b348015610e1657600080fd5b5061042a612dc3565b348015610e2b57600080fd5b506105ec612e85565b348015610e4057600080fd5b5061042a60048036036020811015610e5757600080fd5b5035612e8c565b348015610e6a57600080fd5b506105ec60048036036020811015610e8157600080fd5b5035612eaa565b348015610e9457600080fd5b5061042a60048036036020811015610eab57600080fd5b50356001600160a01b0316612f25565b348015610ec757600080fd5b50610441612f92565b348015610edc57600080fd5b50610efa60048036036020811015610ef357600080fd5b5035612ff3565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610f36578181015183820152602001610f1e565b505050509050019250505060405180910390f35b348015610f5657600080fd5b5061042a60048036036040811015610f6d57600080fd5b506001600160a01b038135169060200135151561318d565b348015610f9157600080fd5b506105ec60048036036020811015610fa857600080fd5b5035613292565b348015610fbb57600080fd5b506104e060048036036040811015610fd257600080fd5b50803590602001356132a5565b348015610feb57600080fd5b5061042a6132db565b34801561100057600080fd5b5061042a6004803603608081101561101757600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561105157600080fd5b82018360208201111561106357600080fd5b803590602001918460018302840111600160201b8311171561108457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613369945050505050565b3480156110d157600080fd5b506110ef600480360360208110156110e857600080fd5b50356133c7565b604080516001600160a01b03909316835260208301919091528051918290030190f35b34801561111e57600080fd5b5061042a6004803603602081101561113557600080fd5b50356133ed565b34801561114857600080fd5b506105ec613441565b34801561115d57600080fd5b506104e0613448565b34801561117257600080fd5b506104416004803603602081101561118957600080fd5b5035613458565b34801561119c57600080fd5b506104e0600480360360408110156111b357600080fd5b506001600160a01b03813516906020013561353d565b3480156111d557600080fd5b5061042a600480360360808110156111ec57600080fd5b810190602081018135600160201b81111561120657600080fd5b82018360208201111561121857600080fd5b803590602001918460018302840111600160201b8311171561123957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561128b57600080fd5b82018360208201111561129d57600080fd5b803590602001918460018302840111600160201b831117156112be57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050823593505050602001356001600160a01b0316613564565b34801561131957600080fd5b506105ec61366b565b34801561132e57600080fd5b5061134c6004803603602081101561134557600080fd5b5035613672565b604080516001600160a01b0390941684526020840192909252151582820152519081900360600190f35b34801561138257600080fd5b5061042a6004803603604081101561139957600080fd5b50803590602001356136a1565b3480156113b257600080fd5b506104e0613706565b3480156113c757600080fd5b5061042a600480360360a08110156113de57600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135613716565b34801561141257600080fd5b5061042a6004803603606081101561142957600080fd5b508035906020810135906040013561380f565b34801561144857600080fd5b506103e66004803603604081101561145f57600080fd5b506001600160a01b038135811691602001351661388a565b34801561148357600080fd5b5061042a6004803603604081101561149a57600080fd5b50803590602001356138b8565b3480156114b357600080fd5b5061042a600480360360e08110156114ca57600080fd5b81359190810190604081016020820135600160201b8111156114eb57600080fd5b8201836020820111156114fd57600080fd5b803590602001918460018302840111600160201b8311171561151e57600080fd5b919390929091602081019035600160201b81111561153b57600080fd5b82018360208201111561154d57600080fd5b803590602001918460208302840111600160201b8311171561156e57600080fd5b919390929091602081019035600160201b81111561158b57600080fd5b82018360208201111561159d57600080fd5b803590602001918460208302840111600160201b831117156115be57600080fd5b919390929091602081019035600160201b8111156115db57600080fd5b8201836020820111156115ed57600080fd5b803590602001918460208302840111600160201b8311171561160e57600080fd5b91939092823592604081019060200135600160201b81111561162f57600080fd5b82018360208201111561164157600080fd5b803590602001918460208302840111600160201b8311171561166257600080fd5b50909250905061391b565b6001600160e01b03191660009081526033602052604090205460ff1690565b6116963383613ed2565b61169f57600080fd5b600082815261010f602052604090206002015460ff166116be57600080fd5b600082815261010f60205260409020600101548111156116dd57600080fd5b600082815261010f60205260409020600181015490546117079184916001600160a01b0316613f76565b5050565b60d28054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156117975780601f1061176c57610100808354040283529160200191611797565b820191906000526020600020905b81548152906001019060200180831161177a57829003601f168201915b505050505090505b90565b60006117ad8261429f565b6117e85760405162461bcd60e51b815260040180806020018281038252602c81526020018061539f602c913960400191505060405180910390fd5b506000908152606760205260409020546001600160a01b031690565b600061180f82612787565b9050806001600160a01b0316836001600160a01b031614156118625760405162461bcd60e51b815260040180806020018281038252602181526020018061547d6021913960400191505060405180910390fd5b806001600160a01b03166118746142bc565b6001600160a01b031614806118955750611895816118906142bc565b61388a565b6118d05760405162461bcd60e51b81526004018080602001828103825260388152602001806152f36038913960400191505060405180910390fd5b60008281526067602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3360008181526101116020908152604080832086845282529182902080546001600160a01b0386166001600160a01b0319909116811790915582518681529182019390935280820192909252517fae354774f370b4f427b85313cddf00365498115aed2003da8f942b64c2c0595d9181900360600190a15050565b600081815261010f60205260409020546001600160a01b03163314806119d85750610115546001600160a01b031633145b6119e157600080fd5b6119ea816142c0565b50565b610115546001600160a01b03163314611a0557600080fd5b600081118015611a16575060328111155b611a515760405162461bcd60e51b81526004018080602001828103825260228152602001806152d16022913960400191505060405180910390fd5b61011455565b61010b6020526000908152604090205481565b609e5490565b610115546001600160a01b03163314611a8857600080fd5b611a918361429f565b611a9a57600080fd5b6000838152610108602052604090205460ff1615611ab757600080fd5b611af78383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061439f92505050565b505050565b6101165488906001600160a01b03163314611b5e576040805162461bcd60e51b815260206004820152601760248201527f4f6e6c792075706772616465722063616e2063616c6c2e000000000000000000604482015290519081900360640190fd5b60008a815261010e60205260409020611b789084846150e4565b508715611ebb576060816001600160a01b03166396bc50b08c6040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015611bc557600080fd5b505afa158015611bd9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611c0257600080fd5b8101908080516040519392919084600160201b821115611c2157600080fd5b908301906020820185811115611c3657600080fd5b82518660208202830111600160201b82111715611c5257600080fd5b82525081516020918201928201910280838360005b83811015611c7f578181015183820152602001611c67565b5050505090500160405250505090506003815181611c9957fe5b0615611ce5576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b21031b7b73a3937b6103a37b5b2b71760511b604482015290519081900360640190fd5b6000815111611d3b576040805162461bcd60e51b815260206004820152601e60248201527f436f6e74726f6c20746f6b656e206d7573742068617665206c65766572730000604482015290519081900360640190fd5b60405180608001604052806003835181611d5157fe5b04815260200160001981526020016001151581526020016001151581525061011060008d8152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690831515021790555060608201518160020160016101000a81548160ff02191690831515021790555090505060008090505b8151811015611eb8576040518060800160405280838381518110611e0057fe5b60200260200101518152602001838360010181518110611e1c57fe5b60200260200101518152602001838360020181518110611e3857fe5b602002602001015181526020016001151581525061011060008e8152602001908152602001600020600301600060038481611e6f57fe5b04815260208082019290925260409081016000208351815591830151600183015582015160028201556060909101516003918201805460ff191691151591909117905501611de0565b50505b60008a815261010b6020908152604080832089905561010c82528083208890556101079091529020805460ff1916851515179055611ef9878b614402565b6120318a826001600160a01b031663c87b56dd8d6040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015611f4157600080fd5b505afa158015611f55573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611f7e57600080fd5b8101908080516040519392919084600160201b821115611f9d57600080fd5b908301906020820185811115611fb257600080fd5b8251600160201b811182820188101715611fcb57600080fd5b82525081516020918201929091019080838360005b83811015611ff8578181015183820152602001611fe0565b50505050905090810190601f1680156120255780820380516001836020036101000a031916815260200191505b5060405250505061439f565b50505050505050505050565b61204e6120486142bc565b82613ed2565b6120895760405162461bcd60e51b815260040180806020018281038252603181526020018061549e6031913960400191505060405180910390fd5b611af783838361441c565b61209e3383613ed2565b156120a857600080fd5b60008281526101096020526040902054806120c257600080fd5b8034146120ce57600080fd5b6000838152610110602052604090206002015460ff16156121075760008381526101106020526040902060010154821461210757600080fd5b600083815261010f602052604090206002015460ff16156121b057600083815261010f60205260409020805460019091015461214c916001600160a01b031690614437565b604080516060810182526000808252602080830182815283850183815288845261010f90925293909120915182546001600160a01b0319166001600160a01b039091161782559151600182015590516002909101805460ff19169115159190911790555b611af7838233613f76565b60006121c6836127db565b82106122035760405162461bcd60e51b815260040180806020018281038252602b815260200180615224602b913960400191505060405180910390fd5b6001600160a01b0383166000908152609c6020526040902080548390811061222757fe5b906000526020600020015490505b92915050565b610115546001600160a01b0316331461225357600080fd5b61011780546001600160a01b0319166001600160a01b0392909216919091179055565b610117546001600160a01b031681565b611af783838360405180602001604052806000815250613369565b600034116122ae57600080fd5b6122b83382613ed2565b156122c257600080fd5b600081815261010f602052604090206002015460ff16156123a557612327606461231b6122fc6064610114546144df90919063ffffffff16565b600085815261010f60205260409020600101549063ffffffff61454016565b9063ffffffff61459916565b34101561237b576040805162461bcd60e51b815260206004820152601a60248201527f426964206d75737420696e637265617365206279206d696e2025000000000000604482015290519081900360640190fd5b600081815261010f6020526040902080546001909101546123a5916001600160a01b031690614437565b604080516060808201835233808352346020808501828152600186880181815260008a815261010f8552899020975188546001600160a01b0319166001600160a01b03909116178855915190870155516002909501805460ff1916951515959095179094558451868152938401528284015291517fcbf61548a249040d379a7f7a4486a18d78824bce978077f4943fb55e111af1c1929181900390910190a150565b610115546001600160a01b0316331461245f57600080fd5b6124688161429f565b61247157600080fd5b600090815261010860205260409020805460ff19166001179055565b6101076020526000908152604090205460ff1681565b600054610100900460ff16806124bc57506124bc6145db565b806124ca575060005460ff16155b6125055760405162461bcd60e51b815260040180806020018281038252602e8152602001806153f7602e913960400191505060405180910390fd5b600054610100900460ff16158015612530576000805460ff1961ff0019909116610100171660011790555b6125386145e1565b61254157600080fd5b82516125549060d2906020860190615147565b5081516125689060d3906020850190615147565b50612579635b5e139f60e01b6145f8565b8015611af7576000805461ff0019169055505050565b61010c6020526000908152604090205481565b60006125ac611a6a565b82106125e95760405162461bcd60e51b815260040180806020018281038252602c8152602001806154cf602c913960400191505060405180910390fd5b609e82815481106125f657fe5b90600052602060002001549050919050565b6101135481565b61010a6020526000908152604090205481565b600087815261010d6020526040902054879084906001600160a01b0316331461264a57600080fd5b600082815261010d6020526040902060010154811461266857600080fd5b6000891161267557600080fd5b61267f338a614402565b6126bf8989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061439f92505050565b600089815261010e602052604090206126d99085856150e4565b5060005b858110156120315760008787838181106126f357fe5b905060200201356001600160a01b03166001600160a01b0316141561271757600080fd5b60018a820101600081815261010e6020526040902088888481811061273857fe5b835460018181018655600095865260209586902090910180546001600160a01b0319166001600160a01b039690930294909401359490941617909155509190910190506126dd565b6101185481565b6000818152606660205260408120546001600160a01b0316806122355760405162461bcd60e51b81526004018080602001828103825260298152602001806153556029913960400191505060405180910390fd5b60006001600160a01b0382166128225760405162461bcd60e51b815260040180806020018281038252602a81526020018061532b602a913960400191505060405180910390fd5b6001600160a01b03821660009081526068602052604090206122359061467c565b6101086020526000908152604090205460ff1681565b6128633386613ed2565b806128a4575033610111600061287888612787565b6001600160a01b039081168252602080830193909352604091820160009081208a825290935291205416145b6128f5576040805162461bcd60e51b815260206004820152601a60248201527f4f776e6572206f72207065726d697373696f6e6564206f6e6c79000000000000604482015290519081900360640190fd5b60008581526101106020526040902060020154610100900460ff16612959576040805162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604482015290519081900360640190fd5b60008581526101106020526040902060018101546000191480612980575060008160010154135b6129d1576040805162461bcd60e51b815260206004820152601760248201527f4e6f206d6f7265207570646174657320616c6c6f776564000000000000000000604482015290519081900360640190fd5b6040805183815260208085028201019091526060908380156129fd578160200160208202803883390190505b50905060005b85811015612b6a5760008881526101106020526040812060030181898985818110612a2a57fe5b90506020020135815260200190815260200160002090508060000154868684818110612a5257fe5b9050602002013512158015612a7d57508060010154868684818110612a7357fe5b9050602002013513155b612abc576040805162461bcd60e51b815260206004820152600b60248201526a125b9d985b1a59081d985b60aa1b604482015290519081900360640190fd5b8060020154868684818110612acd57fe5b905060200201351415612b27576040805162461bcd60e51b815260206004820152601a60248201527f4d7573742070726f7669646520646966666572656e742076616c000000000000604482015290519081900360640190fd5b8060020154838381518110612b3857fe5b602002602001018181525050858583818110612b5057fe5b602002919091013560029092019190915550600101612a03565b503415612b885761011554612b88906001600160a01b031634614437565b600082600101541315612bc557600182018054600019019055600087815261010f602052604090206002015460ff1615612bc557612bc5876142c0565b7ffc1e08f776282b1abf0734388c9042ad8206984bf5d69a721d120c9af38412fc873484600101548989868a8a6040518089815260200188815260200187815260200180602001806020018060200184810384528989828181526020019250602002808284376000838201819052601f909101601f19169092018681038552895181528951602091820193828c0193509102908190849084905b83811015612c77578181015183820152602001612c5f565b505050509050018481038252868682818152602001925060200280828437600083820152604051601f909101601f19169092018290039d50909b505050505050505050505050a150505050505050565b6101106020526000908152604090208054600182015460029092015490919060ff8082169161010090041684565b610115546001600160a01b03163314612d0d57600080fd5b60005b81811015612d5b5760016101076000858585818110612d2b57fe5b60209081029290920135835250810191909152604001600020805460ff1916911515919091179055600101612d10565b507fd1987e98d3ff0b4813b1fd1dd1cf7c12f2edfbc595c5d8b7cc9e9a97e76ef09b828260405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b600054610100900460ff1680612ddc5750612ddc6145db565b80612dea575060005460ff16155b612e255760405162461bcd60e51b815260040180806020018281038252602e8152602001806153f7602e913960400191505060405180910390fd5b600054610100900460ff16158015612e50576000805460ff1961ff0019909116610100171660011790555b612e586145e1565b612e6157600080fd5b612e7163780e9d6360e01b6145f8565b80156119ea576000805461ff001916905550565b6101195481565b610115546001600160a01b03163314612ea457600080fd5b61011355565b60008181526101106020526040812060020154610100900460ff16612f0e576040805162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604482015290519081900360640190fd5b506000908152610110602052604090206001015490565b610115546001600160a01b03163314612f3d57600080fd5b61011580546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fb29030287f33baad1941013143d2e1bd5e66c87318f0bd99bc0fae51fe4b191f9181900360200190a150565b60d38054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156117975780601f1061176c57610100808354040283529160200191611797565b60008181526101106020526040902060020154606090610100900460ff1661305a576040805162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604482015290519081900360640190fd5b600082815261011060205260409020805460609061307f90600363ffffffff61454016565b6040519080825280602002602001820160405280156130a8578160200160208202803883390190505b5090506000805b835481101561318357600081815260038501602052604090205483518490849081106130d757fe5b60209081029190910101526130f382600163ffffffff6144df16565b91508360030160008281526020019081526020016000206001015483838151811061311a57fe5b602090810291909101015261313682600163ffffffff6144df16565b91508360030160008281526020019081526020016000206002015483838151811061315d57fe5b602090810291909101015261317982600163ffffffff6144df16565b91506001016130af565b5090949350505050565b6131956142bc565b6001600160a01b0316826001600160a01b031614156131fb576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b80606960006132086142bc565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561324c6142bc565b60408051841515815290516001600160a01b0392909216917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b6101096020526000908152604090205481565b61010e60205281600052604060002081815481106132bf57fe5b6000918252602090912001546001600160a01b03169150829050565b33600090815261010a6020526040902054806132f657600080fd5b303181111561330457600080fd5b33600081815261010a60205260408082208290555190919083908381818185875af1925050503d8060008114613356576040519150601f19603f3d011682016040523d82523d6000602084013e61335b565b606091505b505090508061170757600080fd5b61337a6133746142bc565b83613ed2565b6133b55760405162461bcd60e51b815260040180806020018281038252603181526020018061549e6031913960400191505060405180910390fd5b6133c184848484614680565b50505050565b61010d60205260009081526040902080546001909101546001600160a01b039091169082565b610115546001600160a01b0316331461340557600080fd5b6101128190556040805182815290517fef33c3f1a71083323b686236e793a53bef4c884ab48f63838d7e6fe9f431e6859181900360200190a150565b6101125481565b610116546001600160a01b031681565b60606134638261429f565b61349e5760405162461bcd60e51b815260040180806020018281038252602f81526020018061544e602f913960400191505060405180910390fd5b600082815260d4602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156135315780601f1061350657610100808354040283529160200191613531565b820191906000526020600020905b81548152906001019060200180831161351457829003601f168201915b50505050509050919050565b6101116020908152600092835260408084209091529082529020546001600160a01b031681565b600054610100900460ff168061357d575061357d6145db565b8061358b575060005460ff16155b6135c65760405162461bcd60e51b815260040180806020018281038252602e8152602001806153f7602e913960400191505060405180910390fd5b600054610100900460ff161580156135f1576000805460ff1961ff0019909116610100171660011790555b6135f96146d2565b613601612dc3565b61360b85856124a3565b600a610112556001610114556101158054336001600160a01b03199182161790915561011680549091166001600160a01b0384161790556101138390558261365257600080fd5b8015613664576000805461ff00191690555b5050505050565b6101145481565b61010f602052600090815260409020805460018201546002909201546001600160a01b03909116919060ff1683565b6136ab3383613ed2565b6136b457600080fd5b60008281526101096020908152604091829020839055815184815290810183905281517fd765eb1cf8aab1a01381fef8dcc9f755ef2d2233849716da96a90e32da84821a929181900390910190a15050565b610115546001600160a01b031681565b610117546001600160a01b0316331461372e57600080fd5b61011354841461373d57600080fd5b6040805180820182526001600160a01b0387811682526020808301878152600089815261010d909252939020915182546001600160a01b0319169116178155905160019182015561379e9061379286866144df565b9063ffffffff6144df16565b61011355600084815261010b6020908152604080832085905561010c82529182902083905581518681529081018590526001600160a01b0387168183015290517f810b7d5e84bcfa3571edbe371ec7fe87f728a2a0d5269e03f3a7ca7ff7f9c3839181900360600190a15050505050565b610115546001600160a01b0316331461382757600080fd5b600083815261010b6020908152604080832085905561010c825291829020839055815185815290810184905280820183905290517fb38317f49b7617179fc92dd57fc71e8c50aad2ab7616736f00e83944a45ca3049181900360600190a1505050565b6001600160a01b03918216600090815260696020908152604080832093909416825291909152205460ff1690565b610115546001600160a01b031633146138d057600080fd5b610118829055610119819055604080518381526020810183905281517fba416d815f76bda1a8c69d8accb121d716340736c5b764c504add4d006b5d276929181900390910190a15050565b6101f4881115613972576040805162461bcd60e51b815260206004820152601860248201527f546f6f206d616e7920636f6e74726f6c206c65766572732e0000000000000000604482015290519081900360640190fd5b60328111156139c8576040805162461bcd60e51b815260206004820152601760248201527f546f6f206d616e7920636f6c6c61626f7261746f72732e000000000000000000604482015290519081900360640190fd5b60008c81526101106020526040902060020154610100900460ff1615613a25576040805162461bcd60e51b815260206004820152600d60248201526c0416c726561647920736574757609c1b604482015290519081900360640190fd5b60008c815261010e602052604081208054339290613a3f57fe5b6000918252602090912001546001600160a01b031614613aa6576040805162461bcd60e51b815260206004820152601c60248201527f4d75737420626520636f6e74726f6c20746f6b656e2061727469737400000000604482015290519081900360640190fd5b8786148015613ab457508584145b613afd576040805162461bcd60e51b81526020600482015260156024820152740acc2d8eacae640c2e4e4c2f240dad2e6dac2e8c6d605b1b604482015290519081900360640190fd5b826000191480613b0d5750600083135b613b5e576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420616c6c6f7765642075706461746573000000000000000000604482015290519081900360640190fd5b613b68338d614402565b613ba88c8c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061439f92505050565b60405180608001604052808686905081526020018481526020016001151581526020016001151581525061011060008e8152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690831515021790555060608201518160020160016101000a81548160ff02191690831515021790555090505060008090505b84811015613e2757898982818110613c5757fe5b90506020020135888883818110613c6a57fe5b905060200201351215613cba576040805162461bcd60e51b815260206004820152601360248201527226b0bc103b30b61036bab9ba101f1e9036b4b760691b604482015290519081900360640190fd5b898982818110613cc657fe5b90506020020135868683818110613cd957fe5b9050602002013512158015613d125750878782818110613cf557fe5b90506020020135868683818110613d0857fe5b9050602002013513155b613d57576040805162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081cdd185c9d081d985b607a1b604482015290519081900360640190fd5b60405180608001604052808b8b84818110613d6e57fe5b905060200201358152602001898984818110613d8657fe5b905060200201358152602001878784818110613d9e57fe5b9050602002013581526020016001151581525061011060008f8152602001908152602001600020600301600083815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055509050508080600101915050613c43565b5060005b81811015613ec3576000838383818110613e4157fe5b905060200201356001600160a01b03166001600160a01b03161415613e6557600080fd5b60008d815261010e60205260409020838383818110613e8057fe5b835460018181018655600095865260209586902090910180546001600160a01b0319166001600160a01b0396909302949094013594909416179091555001613e2b565b50505050505050505050505050565b6000613edd8261429f565b613f185760405162461bcd60e51b815260040180806020018281038252602c8152602001806152a5602c913960400191505060405180910390fd5b6000613f2383612787565b9050806001600160a01b0316846001600160a01b03161480613f5e5750836001600160a01b0316613f53846117a2565b6001600160a01b0316145b80613f6e5750613f6e818561388a565b949350505050565b6000838152610107602052604090205460ff16156140d257600083815261010c6020526040812054613fc457613fbd606461231b610119548661454090919063ffffffff16565b9050613fef565b600084815261010c6020526040902054613fec9060649061231b90869063ffffffff61454016565b90505b61011554614006906001600160a01b031682614437565b6000614023606461231b610112548761454090919063ffffffff16565b600086815261010e602090815260409182902080548351818402810184019094528084529394506140949385939283018282801561408a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161406c575b5050505050614777565b600061409f86612787565b90506140ca816140c5846140b9898863ffffffff6147c716565b9063ffffffff6147c716565b614437565b5050506141dc565b600083815261010760209081526040808320805460ff1916600117905561010b90915281205461411e57614117606461231b610118548661454090919063ffffffff16565b9050614149565b600084815261010b60205260409020546141469060649061231b90869063ffffffff61454016565b90505b61011554614160906001600160a01b031682614437565b6141da614173848363ffffffff6147c716565b600086815261010e60209081526040918290208054835181840281018401909452808452909183018282801561408a576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161406c575050505050614777565b505b604080516060810182526000808252602080830182815283850183815288845261010f90925293909120915182546001600160a01b0319166001600160a01b039091161782559151600182015590516002909101805460ff191691151591909117905561425261424b84612787565b828561441c565b60408051848152602081018490526001600160a01b0383168183015290517fe8038e253f57f3f9c7277af1d801786319db71cc5491fe5db55a0e04f1b3466f9181900360600190a1505050565b6000908152606660205260409020546001600160a01b0316151590565b3390565b600081815261010f602052604090206002015460ff166142df57600080fd5b600081815261010f602052604090208054600190910154614309916001600160a01b031690614437565b604080516060810182526000808252602080830182815283850183815286845261010f835292859020935184546001600160a01b0319166001600160a01b0390911617845551600184015590516002909201805460ff191692151592909217909155815183815291517f99319fa1a5fca42d549d4d49989116496775f906f62e0e2ff2ea3c3aacdefa279281900390910190a150565b6143a88261429f565b6143e35760405162461bcd60e51b815260040180806020018281038252602c8152602001806153cb602c913960400191505060405180910390fd5b600082815260d4602090815260409091208251611af792840190615147565b611707828260405180602001604052806000815250614809565b60008181526101096020526040812055611af783838361485b565b6040516000906001600160a01b038416906108fc90849084818181858888f193505050503d8060008114614487576040519150601f19603f3d011682016040523d82523d6000602084013e61448c565b606091505b509091505080611af7576001600160a01b038316600090815261010a60205260409020546144c0908363ffffffff6144df16565b6001600160a01b038416600090815261010a6020526040902055505050565b600082820183811015614539576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008261454f57506000612235565b8282028284828161455c57fe5b04146145395760405162461bcd60e51b815260040180806020018281038252602181526020018061537e6021913960400191505060405180910390fd5b600061453983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061487a565b303b1590565b60006145f36380ac58cd60e01b61166d565b905090565b6001600160e01b03198082161415614657576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152603360205260409020805460ff19166001179055565b5490565b61468b84848461441c565b6146978484848461491c565b6133c15760405162461bcd60e51b815260040180806020018281038252603281526020018061524f6032913960400191505060405180910390fd5b600054610100900460ff16806146eb57506146eb6145db565b806146f9575060005460ff16155b6147345760405162461bcd60e51b815260040180806020018281038252602e8152602001806153f7602e913960400191505060405180910390fd5b600054610100900460ff1615801561475f576000805460ff1961ff0019909116610100171660011790555b614767614b57565b612e716380ac58cd60e01b6145f8565b80511561170757600061479482518461459990919063ffffffff16565b905060005b82518110156133c1576147bf8382815181106147b157fe5b602002602001015183614437565b600101614799565b600061453983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614bf4565b6148138383614c4e565b614820600084848461491c565b611af75760405162461bcd60e51b815260040180806020018281038252603281526020018061524f6032913960400191505060405180910390fd5b614866838383614c6b565b6148708382614daf565b611af78282614e9d565b600081836149065760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156148cb5781810151838201526020016148b3565b50505050905090810190601f1680156148f85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161491257fe5b0495945050505050565b6000614930846001600160a01b0316614edb565b61493c57506001613f6e565b600060606001600160a01b038616630a85bd0160e11b61495a6142bc565b89888860405160240180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156149d35781810151838201526020016149bb565b50505050905090810190601f168015614a005780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909a16999099178952518151919890975087965094509250829150849050835b60208310614a685780518252601f199092019160209182019101614a49565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614aca576040519150601f19603f3d011682016040523d82523d6000602084013e614acf565b606091505b509150915081614b2057805115614ae95780518082602001fd5b60405162461bcd60e51b815260040180806020018281038252603281526020018061524f6032913960400191505060405180910390fd5b6000818060200190516020811015614b3757600080fd5b50516001600160e01b031916630a85bd0160e11b149350613f6e92505050565b600054610100900460ff1680614b705750614b706145db565b80614b7e575060005460ff16155b614bb95760405162461bcd60e51b815260040180806020018281038252602e8152602001806153f7602e913960400191505060405180910390fd5b600054610100900460ff16158015614be4576000805460ff1961ff0019909116610100171660011790555b612e716301ffc9a760e01b6145f8565b60008184841115614c465760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156148cb5781810151838201526020016148b3565b505050900390565b614c588282614f14565b614c628282614e9d565b61170781615045565b826001600160a01b0316614c7e82612787565b6001600160a01b031614614cc35760405162461bcd60e51b81526004018080602001828103825260298152602001806154256029913960400191505060405180910390fd5b6001600160a01b038216614d085760405162461bcd60e51b81526004018080602001828103825260248152602001806152816024913960400191505060405180910390fd5b614d1181615089565b6001600160a01b0383166000908152606860205260409020614d32906150c4565b6001600160a01b0382166000908152606860205260409020614d53906150db565b60008181526066602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166000908152609c6020526040812054614dd990600163ffffffff6147c716565b6000838152609d6020526040902054909150808214614e74576001600160a01b0384166000908152609c60205260408120805484908110614e1657fe5b9060005260206000200154905080609c6000876001600160a01b03166001600160a01b031681526020019081526020016000208381548110614e5457fe5b6000918252602080832090910192909255918252609d9052604090208190555b6001600160a01b0384166000908152609c602052604090208054906136649060001983016151c1565b6001600160a01b039091166000908152609c602081815260408084208054868652609d84529185208290559282526001810183559183529091200155565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590613f6e575050151592915050565b6001600160a01b038216614f6f576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b614f788161429f565b15614fca576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b600081815260666020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260689091529020615009906150db565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b609e80546000838152609f60205260408120829055600182018355919091527fcfe2a20ff701a1f3e14f63bd70d6c6bc6fba8172ec6d5a505cdab3927c0a9de60155565b6000818152606760205260409020546001600160a01b0316156119ea57600090815260676020526040902080546001600160a01b0319169055565b80546150d790600163ffffffff6147c716565b9055565b80546001019055565b828054828255906000526020600020908101928215615137579160200282015b828111156151375781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190615104565b506151439291506151e5565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061518857805160ff19168380011785556151b5565b828001600101855582156151b5579182015b828111156151b557825182559160200191906001019061519a565b50615143929150615209565b815481835581811115611af757600083815260209020611af7918101908301615209565b61179f91905b808211156151435780546001600160a01b03191681556001016151eb565b61179f91905b80821115615143576000815560010161520f56fe455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e42696420696e63726561736573206d7573742062652077697468696e20302d3530254552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732314d657461646174613a2055524920736574206f66206e6f6e6578697374656e7420746f6b656e436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65644552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e6473a265627a7a723158202bff7765b0ad7a7ca5ccd768115cf47b5a65cdb2e102f8b1d4311de51fd245c264736f6c63430005110032

Deployed Bytecode

0x6080604052600436106103ad5760003560e01c8063755db7b3116101e7578063b9bf52fa1161010d578063cf8589b9116100a0578063e6e5113b1161006f578063e6e5113b14611406578063e985e9c51461143c578063ef8a85c814611477578063f83036f0146114a7576103ad565b8063cf8589b914611322578063d91c070c14611376578063dbe55e56146113a6578063e50d48f1146113bb576103ad565b8063c87b56dd116100dc578063c87b56dd14611166578063c9340db914611190578063ca4137c3146111c9578063cd2a16ba1461130d576103ad565b8063b9bf52fa146110c5578063ba56f39314611112578063bab2d1111461113c578063c254e2d414611151576103ad565b80638f9f193f11610185578063a90d6de311610154578063a90d6de314610f85578063a94141a114610faf578063b6ad691414610fdf578063b88d4fde14610ff4576103ad565b80638f9f193f14610e8857806395d89b4114610ebb57806396bc50b014610ed0578063a22cb46514610f4a576103ad565b80638129fc1c116101c15780638129fc1c14610e0a5780638311cd3514610e1f578063892918d414610e345780638e2a9bb014610e5e576103ad565b8063755db7b314610c7857806376012bea14610d3d5780637a718d7114610d8f576103ad565b80632fcfb95a116102d75780634f6ccce71161026a5780635f959c58116102395780635f959c5814610bdc5780636352211e14610bf157806370a0823114610c1b578063734f851e14610c4e576103ad565b80634f6ccce714610a48578063556d862814610a725780635a58226014610a875780635d0a5d9a14610aba576103ad565b806345c0c502116102a657806345c0c50214610894578063462399cd146108be5780634cd88b76146108e85780634dfa810314610a1e576103ad565b80632fcfb95a146107ec57806334d722c91461081f57806342842e0e14610834578063454a2ab314610877576103ad565b8063117cbf1e1161034f5780631b59e3451161031e5780631b59e3451461069557806323b872dd1461074d5780632d4fbf83146107905780632f745c59146107b3576103ad565b8063117cbf1e14610598578063148abbae146105c257806318160ddd146105fe57806318e97fd114610613576103ad565b8063081812fc1161038b578063081812fc146104b6578063095ea7b3146104fc5780630a29bb37146105355780630eaaf4c81461056e576103ad565b806301ffc9a7146103b257806302e9d5e4146103fa57806306fdde031461042c575b600080fd5b3480156103be57600080fd5b506103e6600480360360208110156103d557600080fd5b50356001600160e01b03191661166d565b604080519115158252519081900360200190f35b34801561040657600080fd5b5061042a6004803603604081101561041d57600080fd5b508035906020013561168c565b005b34801561043857600080fd5b5061044161170b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561047b578181015183820152602001610463565b50505050905090810190601f1680156104a85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104c257600080fd5b506104e0600480360360208110156104d957600080fd5b50356117a2565b604080516001600160a01b039092168252519081900360200190f35b34801561050857600080fd5b5061042a6004803603604081101561051f57600080fd5b506001600160a01b038135169060200135611804565b34801561054157600080fd5b5061042a6004803603604081101561055857600080fd5b50803590602001356001600160a01b031661192c565b34801561057a57600080fd5b5061042a6004803603602081101561059157600080fd5b50356119a7565b3480156105a457600080fd5b5061042a600480360360208110156105bb57600080fd5b50356119ed565b3480156105ce57600080fd5b506105ec600480360360208110156105e557600080fd5b5035611a57565b60408051918252519081900360200190f35b34801561060a57600080fd5b506105ec611a6a565b34801561061f57600080fd5b5061042a6004803603604081101561063657600080fd5b81359190810190604081016020820135600160201b81111561065757600080fd5b82018360208201111561066957600080fd5b803590602001918460018302840111600160201b8311171561068a57600080fd5b509092509050611a70565b3480156106a157600080fd5b5061042a60048036036101008110156106b957600080fd5b8135916001600160a01b036020820135811692604083013515159260608101359092169160808101359160a08201359160c0810135151591810190610100810160e0820135600160201b81111561070f57600080fd5b82018360208201111561072157600080fd5b803590602001918460208302840111600160201b8311171561074257600080fd5b509092509050611afc565b34801561075957600080fd5b5061042a6004803603606081101561077057600080fd5b506001600160a01b0381358116916020810135909116906040013561203d565b61042a600480360360408110156107a657600080fd5b5080359060200135612094565b3480156107bf57600080fd5b506105ec600480360360408110156107d657600080fd5b506001600160a01b0381351690602001356121bb565b3480156107f857600080fd5b5061042a6004803603602081101561080f57600080fd5b50356001600160a01b031661223b565b34801561082b57600080fd5b506104e0612276565b34801561084057600080fd5b5061042a6004803603606081101561085757600080fd5b506001600160a01b03813581169160208101359091169060400135612286565b61042a6004803603602081101561088d57600080fd5b50356122a1565b3480156108a057600080fd5b5061042a600480360360208110156108b757600080fd5b5035612447565b3480156108ca57600080fd5b506103e6600480360360208110156108e157600080fd5b503561248d565b3480156108f457600080fd5b5061042a6004803603604081101561090b57600080fd5b810190602081018135600160201b81111561092557600080fd5b82018360208201111561093757600080fd5b803590602001918460018302840111600160201b8311171561095857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156109aa57600080fd5b8201836020820111156109bc57600080fd5b803590602001918460018302840111600160201b831117156109dd57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506124a3945050505050565b348015610a2a57600080fd5b506105ec60048036036020811015610a4157600080fd5b503561258f565b348015610a5457600080fd5b506105ec60048036036020811015610a6b57600080fd5b50356125a2565b348015610a7e57600080fd5b506105ec612608565b348015610a9357600080fd5b506105ec60048036036020811015610aaa57600080fd5b50356001600160a01b031661260f565b348015610ac657600080fd5b5061042a60048036036080811015610add57600080fd5b81359190810190604081016020820135600160201b811115610afe57600080fd5b820183602082011115610b1057600080fd5b803590602001918460018302840111600160201b83111715610b3157600080fd5b919390929091602081019035600160201b811115610b4e57600080fd5b820183602082011115610b6057600080fd5b803590602001918460208302840111600160201b83111715610b8157600080fd5b919390929091602081019035600160201b811115610b9e57600080fd5b820183602082011115610bb057600080fd5b803590602001918460208302840111600160201b83111715610bd157600080fd5b509092509050612622565b348015610be857600080fd5b506105ec612780565b348015610bfd57600080fd5b506104e060048036036020811015610c1457600080fd5b5035612787565b348015610c2757600080fd5b506105ec60048036036020811015610c3e57600080fd5b50356001600160a01b03166127db565b348015610c5a57600080fd5b506103e660048036036020811015610c7157600080fd5b5035612843565b61042a60048036036060811015610c8e57600080fd5b81359190810190604081016020820135600160201b811115610caf57600080fd5b820183602082011115610cc157600080fd5b803590602001918460208302840111600160201b83111715610ce257600080fd5b919390929091602081019035600160201b811115610cff57600080fd5b820183602082011115610d1157600080fd5b803590602001918460208302840111600160201b83111715610d3257600080fd5b509092509050612859565b348015610d4957600080fd5b50610d6760048036036020811015610d6057600080fd5b5035612cc7565b6040805194855260208501939093529015158383015215156060830152519081900360800190f35b348015610d9b57600080fd5b5061042a60048036036020811015610db257600080fd5b810190602081018135600160201b811115610dcc57600080fd5b820183602082011115610dde57600080fd5b803590602001918460208302840111600160201b83111715610dff57600080fd5b509092509050612cf5565b348015610e1657600080fd5b5061042a612dc3565b348015610e2b57600080fd5b506105ec612e85565b348015610e4057600080fd5b5061042a60048036036020811015610e5757600080fd5b5035612e8c565b348015610e6a57600080fd5b506105ec60048036036020811015610e8157600080fd5b5035612eaa565b348015610e9457600080fd5b5061042a60048036036020811015610eab57600080fd5b50356001600160a01b0316612f25565b348015610ec757600080fd5b50610441612f92565b348015610edc57600080fd5b50610efa60048036036020811015610ef357600080fd5b5035612ff3565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610f36578181015183820152602001610f1e565b505050509050019250505060405180910390f35b348015610f5657600080fd5b5061042a60048036036040811015610f6d57600080fd5b506001600160a01b038135169060200135151561318d565b348015610f9157600080fd5b506105ec60048036036020811015610fa857600080fd5b5035613292565b348015610fbb57600080fd5b506104e060048036036040811015610fd257600080fd5b50803590602001356132a5565b348015610feb57600080fd5b5061042a6132db565b34801561100057600080fd5b5061042a6004803603608081101561101757600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561105157600080fd5b82018360208201111561106357600080fd5b803590602001918460018302840111600160201b8311171561108457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613369945050505050565b3480156110d157600080fd5b506110ef600480360360208110156110e857600080fd5b50356133c7565b604080516001600160a01b03909316835260208301919091528051918290030190f35b34801561111e57600080fd5b5061042a6004803603602081101561113557600080fd5b50356133ed565b34801561114857600080fd5b506105ec613441565b34801561115d57600080fd5b506104e0613448565b34801561117257600080fd5b506104416004803603602081101561118957600080fd5b5035613458565b34801561119c57600080fd5b506104e0600480360360408110156111b357600080fd5b506001600160a01b03813516906020013561353d565b3480156111d557600080fd5b5061042a600480360360808110156111ec57600080fd5b810190602081018135600160201b81111561120657600080fd5b82018360208201111561121857600080fd5b803590602001918460018302840111600160201b8311171561123957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561128b57600080fd5b82018360208201111561129d57600080fd5b803590602001918460018302840111600160201b831117156112be57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050823593505050602001356001600160a01b0316613564565b34801561131957600080fd5b506105ec61366b565b34801561132e57600080fd5b5061134c6004803603602081101561134557600080fd5b5035613672565b604080516001600160a01b0390941684526020840192909252151582820152519081900360600190f35b34801561138257600080fd5b5061042a6004803603604081101561139957600080fd5b50803590602001356136a1565b3480156113b257600080fd5b506104e0613706565b3480156113c757600080fd5b5061042a600480360360a08110156113de57600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135613716565b34801561141257600080fd5b5061042a6004803603606081101561142957600080fd5b508035906020810135906040013561380f565b34801561144857600080fd5b506103e66004803603604081101561145f57600080fd5b506001600160a01b038135811691602001351661388a565b34801561148357600080fd5b5061042a6004803603604081101561149a57600080fd5b50803590602001356138b8565b3480156114b357600080fd5b5061042a600480360360e08110156114ca57600080fd5b81359190810190604081016020820135600160201b8111156114eb57600080fd5b8201836020820111156114fd57600080fd5b803590602001918460018302840111600160201b8311171561151e57600080fd5b919390929091602081019035600160201b81111561153b57600080fd5b82018360208201111561154d57600080fd5b803590602001918460208302840111600160201b8311171561156e57600080fd5b919390929091602081019035600160201b81111561158b57600080fd5b82018360208201111561159d57600080fd5b803590602001918460208302840111600160201b831117156115be57600080fd5b919390929091602081019035600160201b8111156115db57600080fd5b8201836020820111156115ed57600080fd5b803590602001918460208302840111600160201b8311171561160e57600080fd5b91939092823592604081019060200135600160201b81111561162f57600080fd5b82018360208201111561164157600080fd5b803590602001918460208302840111600160201b8311171561166257600080fd5b50909250905061391b565b6001600160e01b03191660009081526033602052604090205460ff1690565b6116963383613ed2565b61169f57600080fd5b600082815261010f602052604090206002015460ff166116be57600080fd5b600082815261010f60205260409020600101548111156116dd57600080fd5b600082815261010f60205260409020600181015490546117079184916001600160a01b0316613f76565b5050565b60d28054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156117975780601f1061176c57610100808354040283529160200191611797565b820191906000526020600020905b81548152906001019060200180831161177a57829003601f168201915b505050505090505b90565b60006117ad8261429f565b6117e85760405162461bcd60e51b815260040180806020018281038252602c81526020018061539f602c913960400191505060405180910390fd5b506000908152606760205260409020546001600160a01b031690565b600061180f82612787565b9050806001600160a01b0316836001600160a01b031614156118625760405162461bcd60e51b815260040180806020018281038252602181526020018061547d6021913960400191505060405180910390fd5b806001600160a01b03166118746142bc565b6001600160a01b031614806118955750611895816118906142bc565b61388a565b6118d05760405162461bcd60e51b81526004018080602001828103825260388152602001806152f36038913960400191505060405180910390fd5b60008281526067602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3360008181526101116020908152604080832086845282529182902080546001600160a01b0386166001600160a01b0319909116811790915582518681529182019390935280820192909252517fae354774f370b4f427b85313cddf00365498115aed2003da8f942b64c2c0595d9181900360600190a15050565b600081815261010f60205260409020546001600160a01b03163314806119d85750610115546001600160a01b031633145b6119e157600080fd5b6119ea816142c0565b50565b610115546001600160a01b03163314611a0557600080fd5b600081118015611a16575060328111155b611a515760405162461bcd60e51b81526004018080602001828103825260228152602001806152d16022913960400191505060405180910390fd5b61011455565b61010b6020526000908152604090205481565b609e5490565b610115546001600160a01b03163314611a8857600080fd5b611a918361429f565b611a9a57600080fd5b6000838152610108602052604090205460ff1615611ab757600080fd5b611af78383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061439f92505050565b505050565b6101165488906001600160a01b03163314611b5e576040805162461bcd60e51b815260206004820152601760248201527f4f6e6c792075706772616465722063616e2063616c6c2e000000000000000000604482015290519081900360640190fd5b60008a815261010e60205260409020611b789084846150e4565b508715611ebb576060816001600160a01b03166396bc50b08c6040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015611bc557600080fd5b505afa158015611bd9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611c0257600080fd5b8101908080516040519392919084600160201b821115611c2157600080fd5b908301906020820185811115611c3657600080fd5b82518660208202830111600160201b82111715611c5257600080fd5b82525081516020918201928201910280838360005b83811015611c7f578181015183820152602001611c67565b5050505090500160405250505090506003815181611c9957fe5b0615611ce5576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b21031b7b73a3937b6103a37b5b2b71760511b604482015290519081900360640190fd5b6000815111611d3b576040805162461bcd60e51b815260206004820152601e60248201527f436f6e74726f6c20746f6b656e206d7573742068617665206c65766572730000604482015290519081900360640190fd5b60405180608001604052806003835181611d5157fe5b04815260200160001981526020016001151581526020016001151581525061011060008d8152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690831515021790555060608201518160020160016101000a81548160ff02191690831515021790555090505060008090505b8151811015611eb8576040518060800160405280838381518110611e0057fe5b60200260200101518152602001838360010181518110611e1c57fe5b60200260200101518152602001838360020181518110611e3857fe5b602002602001015181526020016001151581525061011060008e8152602001908152602001600020600301600060038481611e6f57fe5b04815260208082019290925260409081016000208351815591830151600183015582015160028201556060909101516003918201805460ff191691151591909117905501611de0565b50505b60008a815261010b6020908152604080832089905561010c82528083208890556101079091529020805460ff1916851515179055611ef9878b614402565b6120318a826001600160a01b031663c87b56dd8d6040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015611f4157600080fd5b505afa158015611f55573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611f7e57600080fd5b8101908080516040519392919084600160201b821115611f9d57600080fd5b908301906020820185811115611fb257600080fd5b8251600160201b811182820188101715611fcb57600080fd5b82525081516020918201929091019080838360005b83811015611ff8578181015183820152602001611fe0565b50505050905090810190601f1680156120255780820380516001836020036101000a031916815260200191505b5060405250505061439f565b50505050505050505050565b61204e6120486142bc565b82613ed2565b6120895760405162461bcd60e51b815260040180806020018281038252603181526020018061549e6031913960400191505060405180910390fd5b611af783838361441c565b61209e3383613ed2565b156120a857600080fd5b60008281526101096020526040902054806120c257600080fd5b8034146120ce57600080fd5b6000838152610110602052604090206002015460ff16156121075760008381526101106020526040902060010154821461210757600080fd5b600083815261010f602052604090206002015460ff16156121b057600083815261010f60205260409020805460019091015461214c916001600160a01b031690614437565b604080516060810182526000808252602080830182815283850183815288845261010f90925293909120915182546001600160a01b0319166001600160a01b039091161782559151600182015590516002909101805460ff19169115159190911790555b611af7838233613f76565b60006121c6836127db565b82106122035760405162461bcd60e51b815260040180806020018281038252602b815260200180615224602b913960400191505060405180910390fd5b6001600160a01b0383166000908152609c6020526040902080548390811061222757fe5b906000526020600020015490505b92915050565b610115546001600160a01b0316331461225357600080fd5b61011780546001600160a01b0319166001600160a01b0392909216919091179055565b610117546001600160a01b031681565b611af783838360405180602001604052806000815250613369565b600034116122ae57600080fd5b6122b83382613ed2565b156122c257600080fd5b600081815261010f602052604090206002015460ff16156123a557612327606461231b6122fc6064610114546144df90919063ffffffff16565b600085815261010f60205260409020600101549063ffffffff61454016565b9063ffffffff61459916565b34101561237b576040805162461bcd60e51b815260206004820152601a60248201527f426964206d75737420696e637265617365206279206d696e2025000000000000604482015290519081900360640190fd5b600081815261010f6020526040902080546001909101546123a5916001600160a01b031690614437565b604080516060808201835233808352346020808501828152600186880181815260008a815261010f8552899020975188546001600160a01b0319166001600160a01b03909116178855915190870155516002909501805460ff1916951515959095179094558451868152938401528284015291517fcbf61548a249040d379a7f7a4486a18d78824bce978077f4943fb55e111af1c1929181900390910190a150565b610115546001600160a01b0316331461245f57600080fd5b6124688161429f565b61247157600080fd5b600090815261010860205260409020805460ff19166001179055565b6101076020526000908152604090205460ff1681565b600054610100900460ff16806124bc57506124bc6145db565b806124ca575060005460ff16155b6125055760405162461bcd60e51b815260040180806020018281038252602e8152602001806153f7602e913960400191505060405180910390fd5b600054610100900460ff16158015612530576000805460ff1961ff0019909116610100171660011790555b6125386145e1565b61254157600080fd5b82516125549060d2906020860190615147565b5081516125689060d3906020850190615147565b50612579635b5e139f60e01b6145f8565b8015611af7576000805461ff0019169055505050565b61010c6020526000908152604090205481565b60006125ac611a6a565b82106125e95760405162461bcd60e51b815260040180806020018281038252602c8152602001806154cf602c913960400191505060405180910390fd5b609e82815481106125f657fe5b90600052602060002001549050919050565b6101135481565b61010a6020526000908152604090205481565b600087815261010d6020526040902054879084906001600160a01b0316331461264a57600080fd5b600082815261010d6020526040902060010154811461266857600080fd5b6000891161267557600080fd5b61267f338a614402565b6126bf8989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061439f92505050565b600089815261010e602052604090206126d99085856150e4565b5060005b858110156120315760008787838181106126f357fe5b905060200201356001600160a01b03166001600160a01b0316141561271757600080fd5b60018a820101600081815261010e6020526040902088888481811061273857fe5b835460018181018655600095865260209586902090910180546001600160a01b0319166001600160a01b039690930294909401359490941617909155509190910190506126dd565b6101185481565b6000818152606660205260408120546001600160a01b0316806122355760405162461bcd60e51b81526004018080602001828103825260298152602001806153556029913960400191505060405180910390fd5b60006001600160a01b0382166128225760405162461bcd60e51b815260040180806020018281038252602a81526020018061532b602a913960400191505060405180910390fd5b6001600160a01b03821660009081526068602052604090206122359061467c565b6101086020526000908152604090205460ff1681565b6128633386613ed2565b806128a4575033610111600061287888612787565b6001600160a01b039081168252602080830193909352604091820160009081208a825290935291205416145b6128f5576040805162461bcd60e51b815260206004820152601a60248201527f4f776e6572206f72207065726d697373696f6e6564206f6e6c79000000000000604482015290519081900360640190fd5b60008581526101106020526040902060020154610100900460ff16612959576040805162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604482015290519081900360640190fd5b60008581526101106020526040902060018101546000191480612980575060008160010154135b6129d1576040805162461bcd60e51b815260206004820152601760248201527f4e6f206d6f7265207570646174657320616c6c6f776564000000000000000000604482015290519081900360640190fd5b6040805183815260208085028201019091526060908380156129fd578160200160208202803883390190505b50905060005b85811015612b6a5760008881526101106020526040812060030181898985818110612a2a57fe5b90506020020135815260200190815260200160002090508060000154868684818110612a5257fe5b9050602002013512158015612a7d57508060010154868684818110612a7357fe5b9050602002013513155b612abc576040805162461bcd60e51b815260206004820152600b60248201526a125b9d985b1a59081d985b60aa1b604482015290519081900360640190fd5b8060020154868684818110612acd57fe5b905060200201351415612b27576040805162461bcd60e51b815260206004820152601a60248201527f4d7573742070726f7669646520646966666572656e742076616c000000000000604482015290519081900360640190fd5b8060020154838381518110612b3857fe5b602002602001018181525050858583818110612b5057fe5b602002919091013560029092019190915550600101612a03565b503415612b885761011554612b88906001600160a01b031634614437565b600082600101541315612bc557600182018054600019019055600087815261010f602052604090206002015460ff1615612bc557612bc5876142c0565b7ffc1e08f776282b1abf0734388c9042ad8206984bf5d69a721d120c9af38412fc873484600101548989868a8a6040518089815260200188815260200187815260200180602001806020018060200184810384528989828181526020019250602002808284376000838201819052601f909101601f19169092018681038552895181528951602091820193828c0193509102908190849084905b83811015612c77578181015183820152602001612c5f565b505050509050018481038252868682818152602001925060200280828437600083820152604051601f909101601f19169092018290039d50909b505050505050505050505050a150505050505050565b6101106020526000908152604090208054600182015460029092015490919060ff8082169161010090041684565b610115546001600160a01b03163314612d0d57600080fd5b60005b81811015612d5b5760016101076000858585818110612d2b57fe5b60209081029290920135835250810191909152604001600020805460ff1916911515919091179055600101612d10565b507fd1987e98d3ff0b4813b1fd1dd1cf7c12f2edfbc595c5d8b7cc9e9a97e76ef09b828260405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b600054610100900460ff1680612ddc5750612ddc6145db565b80612dea575060005460ff16155b612e255760405162461bcd60e51b815260040180806020018281038252602e8152602001806153f7602e913960400191505060405180910390fd5b600054610100900460ff16158015612e50576000805460ff1961ff0019909116610100171660011790555b612e586145e1565b612e6157600080fd5b612e7163780e9d6360e01b6145f8565b80156119ea576000805461ff001916905550565b6101195481565b610115546001600160a01b03163314612ea457600080fd5b61011355565b60008181526101106020526040812060020154610100900460ff16612f0e576040805162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604482015290519081900360640190fd5b506000908152610110602052604090206001015490565b610115546001600160a01b03163314612f3d57600080fd5b61011580546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fb29030287f33baad1941013143d2e1bd5e66c87318f0bd99bc0fae51fe4b191f9181900360200190a150565b60d38054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156117975780601f1061176c57610100808354040283529160200191611797565b60008181526101106020526040902060020154606090610100900460ff1661305a576040805162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604482015290519081900360640190fd5b600082815261011060205260409020805460609061307f90600363ffffffff61454016565b6040519080825280602002602001820160405280156130a8578160200160208202803883390190505b5090506000805b835481101561318357600081815260038501602052604090205483518490849081106130d757fe5b60209081029190910101526130f382600163ffffffff6144df16565b91508360030160008281526020019081526020016000206001015483838151811061311a57fe5b602090810291909101015261313682600163ffffffff6144df16565b91508360030160008281526020019081526020016000206002015483838151811061315d57fe5b602090810291909101015261317982600163ffffffff6144df16565b91506001016130af565b5090949350505050565b6131956142bc565b6001600160a01b0316826001600160a01b031614156131fb576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b80606960006132086142bc565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561324c6142bc565b60408051841515815290516001600160a01b0392909216917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b6101096020526000908152604090205481565b61010e60205281600052604060002081815481106132bf57fe5b6000918252602090912001546001600160a01b03169150829050565b33600090815261010a6020526040902054806132f657600080fd5b303181111561330457600080fd5b33600081815261010a60205260408082208290555190919083908381818185875af1925050503d8060008114613356576040519150601f19603f3d011682016040523d82523d6000602084013e61335b565b606091505b505090508061170757600080fd5b61337a6133746142bc565b83613ed2565b6133b55760405162461bcd60e51b815260040180806020018281038252603181526020018061549e6031913960400191505060405180910390fd5b6133c184848484614680565b50505050565b61010d60205260009081526040902080546001909101546001600160a01b039091169082565b610115546001600160a01b0316331461340557600080fd5b6101128190556040805182815290517fef33c3f1a71083323b686236e793a53bef4c884ab48f63838d7e6fe9f431e6859181900360200190a150565b6101125481565b610116546001600160a01b031681565b60606134638261429f565b61349e5760405162461bcd60e51b815260040180806020018281038252602f81526020018061544e602f913960400191505060405180910390fd5b600082815260d4602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156135315780601f1061350657610100808354040283529160200191613531565b820191906000526020600020905b81548152906001019060200180831161351457829003601f168201915b50505050509050919050565b6101116020908152600092835260408084209091529082529020546001600160a01b031681565b600054610100900460ff168061357d575061357d6145db565b8061358b575060005460ff16155b6135c65760405162461bcd60e51b815260040180806020018281038252602e8152602001806153f7602e913960400191505060405180910390fd5b600054610100900460ff161580156135f1576000805460ff1961ff0019909116610100171660011790555b6135f96146d2565b613601612dc3565b61360b85856124a3565b600a610112556001610114556101158054336001600160a01b03199182161790915561011680549091166001600160a01b0384161790556101138390558261365257600080fd5b8015613664576000805461ff00191690555b5050505050565b6101145481565b61010f602052600090815260409020805460018201546002909201546001600160a01b03909116919060ff1683565b6136ab3383613ed2565b6136b457600080fd5b60008281526101096020908152604091829020839055815184815290810183905281517fd765eb1cf8aab1a01381fef8dcc9f755ef2d2233849716da96a90e32da84821a929181900390910190a15050565b610115546001600160a01b031681565b610117546001600160a01b0316331461372e57600080fd5b61011354841461373d57600080fd5b6040805180820182526001600160a01b0387811682526020808301878152600089815261010d909252939020915182546001600160a01b0319169116178155905160019182015561379e9061379286866144df565b9063ffffffff6144df16565b61011355600084815261010b6020908152604080832085905561010c82529182902083905581518681529081018590526001600160a01b0387168183015290517f810b7d5e84bcfa3571edbe371ec7fe87f728a2a0d5269e03f3a7ca7ff7f9c3839181900360600190a15050505050565b610115546001600160a01b0316331461382757600080fd5b600083815261010b6020908152604080832085905561010c825291829020839055815185815290810184905280820183905290517fb38317f49b7617179fc92dd57fc71e8c50aad2ab7616736f00e83944a45ca3049181900360600190a1505050565b6001600160a01b03918216600090815260696020908152604080832093909416825291909152205460ff1690565b610115546001600160a01b031633146138d057600080fd5b610118829055610119819055604080518381526020810183905281517fba416d815f76bda1a8c69d8accb121d716340736c5b764c504add4d006b5d276929181900390910190a15050565b6101f4881115613972576040805162461bcd60e51b815260206004820152601860248201527f546f6f206d616e7920636f6e74726f6c206c65766572732e0000000000000000604482015290519081900360640190fd5b60328111156139c8576040805162461bcd60e51b815260206004820152601760248201527f546f6f206d616e7920636f6c6c61626f7261746f72732e000000000000000000604482015290519081900360640190fd5b60008c81526101106020526040902060020154610100900460ff1615613a25576040805162461bcd60e51b815260206004820152600d60248201526c0416c726561647920736574757609c1b604482015290519081900360640190fd5b60008c815261010e602052604081208054339290613a3f57fe5b6000918252602090912001546001600160a01b031614613aa6576040805162461bcd60e51b815260206004820152601c60248201527f4d75737420626520636f6e74726f6c20746f6b656e2061727469737400000000604482015290519081900360640190fd5b8786148015613ab457508584145b613afd576040805162461bcd60e51b81526020600482015260156024820152740acc2d8eacae640c2e4e4c2f240dad2e6dac2e8c6d605b1b604482015290519081900360640190fd5b826000191480613b0d5750600083135b613b5e576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420616c6c6f7765642075706461746573000000000000000000604482015290519081900360640190fd5b613b68338d614402565b613ba88c8c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061439f92505050565b60405180608001604052808686905081526020018481526020016001151581526020016001151581525061011060008e8152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690831515021790555060608201518160020160016101000a81548160ff02191690831515021790555090505060008090505b84811015613e2757898982818110613c5757fe5b90506020020135888883818110613c6a57fe5b905060200201351215613cba576040805162461bcd60e51b815260206004820152601360248201527226b0bc103b30b61036bab9ba101f1e9036b4b760691b604482015290519081900360640190fd5b898982818110613cc657fe5b90506020020135868683818110613cd957fe5b9050602002013512158015613d125750878782818110613cf557fe5b90506020020135868683818110613d0857fe5b9050602002013513155b613d57576040805162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081cdd185c9d081d985b607a1b604482015290519081900360640190fd5b60405180608001604052808b8b84818110613d6e57fe5b905060200201358152602001898984818110613d8657fe5b905060200201358152602001878784818110613d9e57fe5b9050602002013581526020016001151581525061011060008f8152602001908152602001600020600301600083815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055509050508080600101915050613c43565b5060005b81811015613ec3576000838383818110613e4157fe5b905060200201356001600160a01b03166001600160a01b03161415613e6557600080fd5b60008d815261010e60205260409020838383818110613e8057fe5b835460018181018655600095865260209586902090910180546001600160a01b0319166001600160a01b0396909302949094013594909416179091555001613e2b565b50505050505050505050505050565b6000613edd8261429f565b613f185760405162461bcd60e51b815260040180806020018281038252602c8152602001806152a5602c913960400191505060405180910390fd5b6000613f2383612787565b9050806001600160a01b0316846001600160a01b03161480613f5e5750836001600160a01b0316613f53846117a2565b6001600160a01b0316145b80613f6e5750613f6e818561388a565b949350505050565b6000838152610107602052604090205460ff16156140d257600083815261010c6020526040812054613fc457613fbd606461231b610119548661454090919063ffffffff16565b9050613fef565b600084815261010c6020526040902054613fec9060649061231b90869063ffffffff61454016565b90505b61011554614006906001600160a01b031682614437565b6000614023606461231b610112548761454090919063ffffffff16565b600086815261010e602090815260409182902080548351818402810184019094528084529394506140949385939283018282801561408a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161406c575b5050505050614777565b600061409f86612787565b90506140ca816140c5846140b9898863ffffffff6147c716565b9063ffffffff6147c716565b614437565b5050506141dc565b600083815261010760209081526040808320805460ff1916600117905561010b90915281205461411e57614117606461231b610118548661454090919063ffffffff16565b9050614149565b600084815261010b60205260409020546141469060649061231b90869063ffffffff61454016565b90505b61011554614160906001600160a01b031682614437565b6141da614173848363ffffffff6147c716565b600086815261010e60209081526040918290208054835181840281018401909452808452909183018282801561408a576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161406c575050505050614777565b505b604080516060810182526000808252602080830182815283850183815288845261010f90925293909120915182546001600160a01b0319166001600160a01b039091161782559151600182015590516002909101805460ff191691151591909117905561425261424b84612787565b828561441c565b60408051848152602081018490526001600160a01b0383168183015290517fe8038e253f57f3f9c7277af1d801786319db71cc5491fe5db55a0e04f1b3466f9181900360600190a1505050565b6000908152606660205260409020546001600160a01b0316151590565b3390565b600081815261010f602052604090206002015460ff166142df57600080fd5b600081815261010f602052604090208054600190910154614309916001600160a01b031690614437565b604080516060810182526000808252602080830182815283850183815286845261010f835292859020935184546001600160a01b0319166001600160a01b0390911617845551600184015590516002909201805460ff191692151592909217909155815183815291517f99319fa1a5fca42d549d4d49989116496775f906f62e0e2ff2ea3c3aacdefa279281900390910190a150565b6143a88261429f565b6143e35760405162461bcd60e51b815260040180806020018281038252602c8152602001806153cb602c913960400191505060405180910390fd5b600082815260d4602090815260409091208251611af792840190615147565b611707828260405180602001604052806000815250614809565b60008181526101096020526040812055611af783838361485b565b6040516000906001600160a01b038416906108fc90849084818181858888f193505050503d8060008114614487576040519150601f19603f3d011682016040523d82523d6000602084013e61448c565b606091505b509091505080611af7576001600160a01b038316600090815261010a60205260409020546144c0908363ffffffff6144df16565b6001600160a01b038416600090815261010a6020526040902055505050565b600082820183811015614539576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008261454f57506000612235565b8282028284828161455c57fe5b04146145395760405162461bcd60e51b815260040180806020018281038252602181526020018061537e6021913960400191505060405180910390fd5b600061453983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061487a565b303b1590565b60006145f36380ac58cd60e01b61166d565b905090565b6001600160e01b03198082161415614657576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152603360205260409020805460ff19166001179055565b5490565b61468b84848461441c565b6146978484848461491c565b6133c15760405162461bcd60e51b815260040180806020018281038252603281526020018061524f6032913960400191505060405180910390fd5b600054610100900460ff16806146eb57506146eb6145db565b806146f9575060005460ff16155b6147345760405162461bcd60e51b815260040180806020018281038252602e8152602001806153f7602e913960400191505060405180910390fd5b600054610100900460ff1615801561475f576000805460ff1961ff0019909116610100171660011790555b614767614b57565b612e716380ac58cd60e01b6145f8565b80511561170757600061479482518461459990919063ffffffff16565b905060005b82518110156133c1576147bf8382815181106147b157fe5b602002602001015183614437565b600101614799565b600061453983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614bf4565b6148138383614c4e565b614820600084848461491c565b611af75760405162461bcd60e51b815260040180806020018281038252603281526020018061524f6032913960400191505060405180910390fd5b614866838383614c6b565b6148708382614daf565b611af78282614e9d565b600081836149065760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156148cb5781810151838201526020016148b3565b50505050905090810190601f1680156148f85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161491257fe5b0495945050505050565b6000614930846001600160a01b0316614edb565b61493c57506001613f6e565b600060606001600160a01b038616630a85bd0160e11b61495a6142bc565b89888860405160240180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156149d35781810151838201526020016149bb565b50505050905090810190601f168015614a005780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909a16999099178952518151919890975087965094509250829150849050835b60208310614a685780518252601f199092019160209182019101614a49565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614aca576040519150601f19603f3d011682016040523d82523d6000602084013e614acf565b606091505b509150915081614b2057805115614ae95780518082602001fd5b60405162461bcd60e51b815260040180806020018281038252603281526020018061524f6032913960400191505060405180910390fd5b6000818060200190516020811015614b3757600080fd5b50516001600160e01b031916630a85bd0160e11b149350613f6e92505050565b600054610100900460ff1680614b705750614b706145db565b80614b7e575060005460ff16155b614bb95760405162461bcd60e51b815260040180806020018281038252602e8152602001806153f7602e913960400191505060405180910390fd5b600054610100900460ff16158015614be4576000805460ff1961ff0019909116610100171660011790555b612e716301ffc9a760e01b6145f8565b60008184841115614c465760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156148cb5781810151838201526020016148b3565b505050900390565b614c588282614f14565b614c628282614e9d565b61170781615045565b826001600160a01b0316614c7e82612787565b6001600160a01b031614614cc35760405162461bcd60e51b81526004018080602001828103825260298152602001806154256029913960400191505060405180910390fd5b6001600160a01b038216614d085760405162461bcd60e51b81526004018080602001828103825260248152602001806152816024913960400191505060405180910390fd5b614d1181615089565b6001600160a01b0383166000908152606860205260409020614d32906150c4565b6001600160a01b0382166000908152606860205260409020614d53906150db565b60008181526066602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166000908152609c6020526040812054614dd990600163ffffffff6147c716565b6000838152609d6020526040902054909150808214614e74576001600160a01b0384166000908152609c60205260408120805484908110614e1657fe5b9060005260206000200154905080609c6000876001600160a01b03166001600160a01b031681526020019081526020016000208381548110614e5457fe5b6000918252602080832090910192909255918252609d9052604090208190555b6001600160a01b0384166000908152609c602052604090208054906136649060001983016151c1565b6001600160a01b039091166000908152609c602081815260408084208054868652609d84529185208290559282526001810183559183529091200155565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590613f6e575050151592915050565b6001600160a01b038216614f6f576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b614f788161429f565b15614fca576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b600081815260666020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260689091529020615009906150db565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b609e80546000838152609f60205260408120829055600182018355919091527fcfe2a20ff701a1f3e14f63bd70d6c6bc6fba8172ec6d5a505cdab3927c0a9de60155565b6000818152606760205260409020546001600160a01b0316156119ea57600090815260676020526040902080546001600160a01b0319169055565b80546150d790600163ffffffff6147c716565b9055565b80546001019055565b828054828255906000526020600020908101928215615137579160200282015b828111156151375781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190615104565b506151439291506151e5565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061518857805160ff19168380011785556151b5565b828001600101855582156151b5579182015b828111156151b557825182559160200191906001019061519a565b50615143929150615209565b815481835581811115611af757600083815260209020611af7918101908301615209565b61179f91905b808211156151435780546001600160a01b03191681556001016151eb565b61179f91905b80821115615143576000815560010161520f56fe455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e42696420696e63726561736573206d7573742062652077697468696e20302d3530254552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732314d657461646174613a2055524920736574206f66206e6f6e6578697374656e7420746f6b656e436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65644552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e6473a265627a7a723158202bff7765b0ad7a7ca5ccd768115cf47b5a65cdb2e102f8b1d4311de51fd245c264736f6c63430005110032

Deployed Bytecode Sourcemap

48925:35621:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18916:133;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18916:133:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18916:133:0;-1:-1:-1;;;;;;18916:133:0;;:::i;:::-;;;;;;;;;;;;;;;;;;77030:621;;8:9:-1;5:2;;;30:1;27;20:12;5:2;77030:621:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77030:621:0;;;;;;;:::i;:::-;;46642:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46642:85:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46642:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24088:204;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24088:204:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24088:204:0;;:::i;:::-;;;;-1:-1:-1;;;;;24088:204:0;;;;;;;;;;;;;;23370:425;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23370:425:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23370:425:0;;;;;;;;:::i;79760:242::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;79760:242:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;79760:242:0;;;;;;-1:-1:-1;;;;;79760:242:0;;:::i;71067:401::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;71067:401:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;71067:401:0;;:::i;60705:385::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60705:385:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;60705:385:0;;:::i;53548:63::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53548:63:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53548:63:0;;:::i;:::-;;;;;;;;;;;;;;;;37910:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37910:96:0;;;:::i;61210:396::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61210:396:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;61210:396:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;61210:396:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;61210:396:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;61210:396:0;;-1:-1:-1;61210:396:0;-1:-1:-1;61210:396:0;:::i;65775:2665::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65775:2665:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;65775:2665:0;;;-1:-1:-1;;;;;65775:2665:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;65775:2665:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;65775:2665:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;65775:2665:0;;-1:-1:-1;65775:2665:0;-1:-1:-1;65775:2665:0;:::i;25771:292::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25771:292:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25771:292:0;;;;;;;;;;;;;;;;;:::i;72078:1307::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;72078:1307:0;;;;;;;:::i;37519:232::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37519:232:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37519:232:0;;;;;;;;:::i;58205:151::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58205:151:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58205:151:0;-1:-1:-1;;;;;58205:151:0;;:::i;55176:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55176:28:0;;;:::i;26725:134::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26725:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26725:134:0;;;;;;;;;;;;;;;;;:::i;69805:1194::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;69805:1194:0;;:::i;61661:241::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61661:241:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61661:241:0;;:::i;53079:53::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53079:53:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53079:53:0;;:::i;46060:329::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46060:329:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;46060:329:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;46060:329:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46060:329:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;46060:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46060:329:0;;;;;;;;-1:-1:-1;46060:329:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;46060:329:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46060:329:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;46060:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46060:329:0;;-1:-1:-1;46060:329:0;;-1:-1:-1;;;;;46060:329:0:i;53709:64::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53709:64:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53709:64:0;;:::i;38352:199::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38352:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38352:199:0;;:::i;54737:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54737:34:0;;;:::i;53398:56::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53398:56:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53398:56:0;-1:-1:-1;;;;;53398:56:0;;:::i;68448:1324::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;68448:1324:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;68448:1324:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;68448:1324:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;68448:1324:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;68448:1324:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;68448:1324:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;68448:1324:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;68448:1324:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;68448:1324:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;68448:1324:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;68448:1324:0;;-1:-1:-1;68448:1324:0;-1:-1:-1;68448:1324:0;:::i;55234:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55234:49:0;;;:::i;22711:228::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22711:228:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22711:228:0;;:::i;22274:211::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22274:211:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22274:211:0;-1:-1:-1;;;;;22274:211:0;;:::i;53187:46::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53187:46:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53187:46:0;;:::i;80176:3057::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;80176:3057:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;80176:3057:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;80176:3057:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;80176:3057:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;80176:3057:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;80176:3057:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;80176:3057:0;;-1:-1:-1;80176:3057:0;-1:-1:-1;80176:3057:0;:::i;54316:59::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54316:59:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54316:59:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58789:417;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58789:417:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58789:417:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;58789:417:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;58789:417:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;58789:417:0;;-1:-1:-1;58789:417:0;-1:-1:-1;58789:417:0;:::i;36747:246::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36747:246:0;;;:::i;55290:50::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55290:50:0;;;:::i;56781:172::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56781:172:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56781:172:0;;:::i;78146:334::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;78146:334:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;78146:334:0;;:::i;58441:227::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58441:227:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58441:227:0;-1:-1:-1;;;;;58441:227:0;;:::i;46842:89::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46842:89:0;;;:::i;78554:1070::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;78554:1070:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;78554:1070:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;78554:1070:0;;;;;;;;;;;;;;;;;24593:254;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24593:254:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24593:254:0;;;;;;;;;;:::i;53286:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53286:44:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53286:44:0;;:::i;54082:64::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54082:64:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54082:64:0;;;;;;;:::i;83306:362::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;83306:362:0;;;:::i;27596:272::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27596:272:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;27596:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;27596:272:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;27596:272:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;27596:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;27596:272:0;;-1:-1:-1;27596:272:0;;-1:-1:-1;;;;;27596:272:0:i;53852:64::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53852:64:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53852:64:0;;:::i;:::-;;;;-1:-1:-1;;;;;53852:64:0;;;;;;;;;;;;;;;;;;;;;61999:420;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61999:420:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61999:420:0;;:::i;54625:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54625:41:0;;;:::i;55068:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55068:30:0;;;:::i;47138:205::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47138:205:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47138:205:0;;:::i;54461:87::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54461:87:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;54461:87:0;;;;;;;;:::i;55349:850::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55349:850:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;55349:850:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;55349:850:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;55349:850:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;55349:850:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;55349:850:0;;;;;;;;-1:-1:-1;55349:850:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;55349:850:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;55349:850:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;55349:850:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;55349:850:0;;-1:-1:-1;;55349:850:0;;;-1:-1:-1;;;55349:850:0;;;-1:-1:-1;;;;;55349:850:0;;:::i;54829:36::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54829:36:0;;;:::i;54203:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54203:49:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54203:49:0;;:::i;:::-;;;;-1:-1:-1;;;;;54203:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;77749:321;;8:9:-1;5:2;;;30:1;27;20:12;5:2;77749:321:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77749:321:0;;;;;;;:::i;54949:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54949:38:0;;;:::i;57111:1029::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57111:1029:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;57111:1029:0;;;;;;;;;;;;;;;;;;;;;;;:::i;59292:651::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59292:651:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;59292:651:0;;;;;;;;;;;;:::i;25177:147::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25177:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25177:147:0;;;;;;;;;;:::i;60015:597::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60015:597:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;60015:597:0;;;;;;;:::i;62427:3276::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62427:3276:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;62427:3276:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;62427:3276:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;62427:3276:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;62427:3276:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;62427:3276:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;62427:3276:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;62427:3276:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;62427:3276:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;62427:3276:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;62427:3276:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;62427:3276:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;62427:3276:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;62427:3276:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;62427:3276:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;62427:3276:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;62427:3276:0;;-1:-1:-1;62427:3276:0;-1:-1:-1;62427:3276:0;:::i;18916:133::-;-1:-1:-1;;;;;;19008:33:0;18984:4;19008:33;;;:20;:33;;;;;;;;;18916:133::o;77030:621::-;77176:39;77195:10;77207:7;77176:18;:39::i;:::-;77168:48;;;;;;77280:20;;;;:11;:20;;;;;:27;;;;;77272:36;;;;;;77426:20;;;;:11;:20;;;;;:27;;;:48;-1:-1:-1;77426:48:0;77418:57;;;;;;77563:20;;;;:11;:20;;;;;:27;;;;77605;;77515:128;;77541:7;;-1:-1:-1;;;;;77605:27:0;77515:11;:128::i;:::-;77030:621;;:::o;46642:85::-;46714:5;46707:12;;;;;;;;-1:-1:-1;;46707:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46681:13;;46707:12;;46714:5;;46707:12;;46714:5;46707:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46642:85;;:::o;24088:204::-;24147:7;24175:16;24183:7;24175;:16::i;:::-;24167:73;;;;-1:-1:-1;;;24167:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24260:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24260:24:0;;24088:204::o;23370:425::-;23434:13;23450:16;23458:7;23450;:16::i;:::-;23434:32;;23491:5;-1:-1:-1;;;;;23485:11:0;:2;-1:-1:-1;;;;;23485:11:0;;;23477:57;;;;-1:-1:-1;;;23477:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23571:5;-1:-1:-1;;;;;23555:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;23555:21:0;;:62;;;;23580:37;23597:5;23604:12;:10;:12::i;:::-;23580:16;:37::i;:::-;23547:154;;;;-1:-1:-1;;;23547:154:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23714:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;23714:29:0;-1:-1:-1;;;;;23714:29:0;;;;;;;;;23759:28;;23714:24;;23759:28;;;;;;;23370:425;;;:::o;79760:242::-;79889:10;79865:35;;;;:23;:35;;;;;;;;:44;;;;;;;;;:59;;-1:-1:-1;;;;;79865:59:0;;-1:-1:-1;;;;;;79865:59:0;;;;;;;;79942:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79760:242;;:::o;71067:401::-;71283:20;;;;:11;:20;;;;;:27;-1:-1:-1;;;;;71283:27:0;71314:10;71283:41;;71282:95;;-1:-1:-1;71361:15:0;;-1:-1:-1;;;;;71361:15:0;71347:10;:29;71282:95;71260:128;;;;;;71439:21;71452:7;71439:12;:21::i;:::-;71067:401;:::o;60705:385::-;56327:15;;-1:-1:-1;;;;;56327:15:0;56313:10;:29;56305:38;;;;;;60882:1;60857:22;:26;60856:62;;;;;60915:2;60889:22;:28;;60856:62;60834:146;;;;-1:-1:-1;;;60834:146:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61036:21;:46;60705:385::o;53548:63::-;;;;;;;;;;;;;:::o;37910:96::-;37981:10;:17;37910:96;:::o;61210:396::-;56327:15;;-1:-1:-1;;;;;56327:15:0;56313:10;:29;56305:38;;;;;;61383:16;61391:7;61383;:16::i;:::-;61375:25;;;;;;61484:23;;;;:14;:23;;;;;;;;:32;61476:41;;;;;;61561:37;61580:7;61589:8;;61561:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;61561:18:0;;-1:-1:-1;;;61561:37:0:i;:::-;61210:396;;;:::o;65775:2665::-;66341:15;;66222:9;;-1:-1:-1;;;;;66341:15:0;66327:10;:29;66319:65;;;;;-1:-1:-1;;;66319:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;66452:28;;;;:19;:28;;;;;:58;;66483:27;;66452:58;:::i;:::-;;66527:14;66523:1320;;;66633:28;66664:7;-1:-1:-1;;;;;66664:23:0;;66688:7;66664:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66664:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66664:32:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;66664:32:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;66664:32:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;66664:32:0;;421:4:-1;412:14;;;;66664:32:0;;;;;412:14:-1;66664:32:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;66664:32:0;;;;;;;;;;;66633:63;;66814:1;66792:12;:19;:23;;;;;;:28;66784:63;;;;;-1:-1:-1;;;66784:63:0;;;;;;;;;;;;-1:-1:-1;;;66784:63:0;;;;;;;;;;;;;;;66955:1;66933:12;:19;:23;66925:66;;;;;-1:-1:-1;;;66925:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;67158:136;;;;;;;;67211:1;67189:12;:19;:23;;;;;;67158:136;;;;-1:-1:-1;;67158:136:0;;;;67252:4;67158:136;;;;;;67275:4;67158:136;;;;;67127:19;:28;67147:7;67127:28;;;;;;;;;;;:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67524:9;67536:1;67524:13;;67519:313;67543:12;:19;67539:1;:23;67519:313;;;67636:180;;;;;;;;67671:12;67684:1;67671:15;;;;;;;;;;;;;;67636:180;;;;67709:12;67722:1;67726;67722:5;67709:19;;;;;;;;;;;;;;67636:180;;;;67751:12;67764:1;67768;67764:5;67751:19;;;;;;;;;;;;;;67636:180;;;;67793:4;67636:180;;;;;67591:19;:28;67611:7;67591:28;;;;;;;;;;;:35;;:42;67631:1;67627;:5;;;;;;67591:42;;;;;;;;;;;;;;-1:-1:-1;67591:42:0;:225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67591:225:0;;;;;;;;;;67564:6;67519:313;;;;66523:1320;;67909:37;;;;:28;:37;;;;;;;;:71;;;67993:29;:62;;;;;:97;;;68165:21;:30;;;;;:53;;-1:-1:-1;;68165:53:0;;;;;;;68302:28;68318:2;67909:37;68302:15;:28::i;:::-;68378:54;68397:7;68406;-1:-1:-1;;;;;68406:16:0;;68423:7;68406:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;68406:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;68406:25:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;68406:25:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;68406:25:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;68406:25:0;;420:4:-1;411:14;;;;68406:25:0;;;;;411:14:-1;68406:25:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;68406:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68378:18;:54::i;:::-;65775:2665;;;;;;;;;;:::o;25771:292::-;25915:41;25934:12;:10;:12::i;:::-;25948:7;25915:18;:41::i;:::-;25907:103;;;;-1:-1:-1;;;25907:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26023:32;26037:4;26043:2;26047:7;26023:13;:32::i;72078:1307::-;72268:39;72287:10;72299:7;72268:18;:39::i;:::-;:48;72260:57;;;;;;72360:18;72381;;;:9;:18;;;;;;72462:14;72454:23;;;;;;72572:10;72559:9;:23;72551:32;;;;;;72637:28;;;;:19;:28;;;;;:35;;;;;72633:297;;;72806:28;;;;:19;:28;;;;;:48;;;:97;;72780:138;;;;;;72990:20;;;;:11;:20;;;;;:27;;;;;72986:337;;;73119:20;;;;:11;:20;;;;;:27;;;73165;;;;73083:124;;-1:-1:-1;;;;;73119:27:0;;73083:17;:124::i;:::-;73279:32;;;;;;;;-1:-1:-1;73279:32:0;;;;;;;;;;;;;;;;73256:20;;;:11;:20;;;;;;;:55;;;;-1:-1:-1;;;;;;73256:55:0;-1:-1:-1;;;;;73256:55:0;;;;;;;;-1:-1:-1;73256:55:0;;;;;;;;;;;-1:-1:-1;;73256:55:0;;;;;;;;;;72986:337;73333:44;73345:7;73354:10;73366;73333:11;:44::i;37519:232::-;37599:7;37635:16;37645:5;37635:9;:16::i;:::-;37627:5;:24;37619:80;;;;-1:-1:-1;;;37619:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37717:19:0;;;;;;:12;:19;;;;;:26;;37737:5;;37717:26;;;;;;;;;;;;;;37710:33;;37519:232;;;;;:::o;58205:151::-;56327:15;;-1:-1:-1;;;;;56327:15:0;56313:10;:29;56305:38;;;;;;58316:13;:32;;-1:-1:-1;;;;;;58316:32:0;-1:-1:-1;;;;;58316:32:0;;;;;;;;;;58205:151::o;55176:28::-;;;-1:-1:-1;;;;;55176:28:0;;:::o;26725:134::-;26812:39;26829:4;26835:2;26839:7;26812:39;;;;;;;;;;;;:16;:39::i;69805:1194::-;69917:1;69905:9;:13;69897:22;;;;;;70000:39;70019:10;70031:7;70000:18;:39::i;:::-;:48;69992:57;;;;;;70104:20;;;;:11;:20;;;;;:27;;;;;70100:680;;;70333:162;70491:3;70333:123;70425:30;70451:3;70425:21;;:25;;:30;;;;:::i;:::-;70333:20;;;;:11;:20;;;;;:57;;;;:123;:91;:123;:::i;:::-;:157;:162;:157;:162;:::i;:::-;70272:9;:246;;70246:334;;;;;-1:-1:-1;;;70246:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;70680:20;;;;:11;:20;;;;;:27;;;70726;;;;70644:124;;-1:-1:-1;;;;;70680:27:0;;70644:17;:124::i;:::-;70849:39;;;;;;;;;70860:10;70849:39;;;70872:9;70849:39;;;;;;;70883:4;70849:39;;;;;;-1:-1:-1;70826:20:0;;;:11;:20;;;;;:62;;;;-1:-1:-1;;;;;;70826:62:0;-1:-1:-1;;;;;70826:62:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;70826:62:0;;;;;;;;;;;70948:43;;;;;;;;;;;;;;;;;;;;;;;;;;69805:1194;:::o;61661:241::-;56327:15;;-1:-1:-1;;;;;56327:15:0;56313:10;:29;56305:38;;;;;;61783:16;61791:7;61783;:16::i;:::-;61775:25;;;;;;61864:23;;;;:14;:23;;;;;:30;;-1:-1:-1;;61864:30:0;61890:4;61864:30;;;61661:241::o;53079:53::-;;;;;;;;;;;;;;;:::o;46060:329::-;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;46160:28;:26;:28::i;:::-;46152:37;;;;;;46202:12;;;;:5;;:12;;;;;:::i;:::-;-1:-1:-1;46225:16:0;;;;:7;;:16;;;;;:::i;:::-;-1:-1:-1;46332:49:0;-1:-1:-1;;;46332:18:0;:49::i;:::-;1372:14;1368:57;;;1412:5;1397:20;;-1:-1:-1;;1397:20:0;;;46060:329;;;:::o;53709:64::-;;;;;;;;;;;;;:::o;38352:199::-;38410:7;38446:13;:11;:13::i;:::-;38438:5;:21;38430:78;;;;-1:-1:-1;;;38430:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38526:10;38537:5;38526:17;;;;;;;;;;;;;;;;38519:24;;38352:199;;;:::o;54737:34::-;;;;:::o;53398:56::-;;;;;;;;;;;;;:::o;68448:1324::-;56623:31;;;;:16;:31;;;;;:39;68708:13;;68723:19;;-1:-1:-1;;;;;56623:39:0;56666:10;56623:53;56615:62;;;;;;56696:31;;;;:16;:31;;;;;:42;;;:56;;56688:65;;;;;;68840:1;68824:13;:17;68816:26;;;;;;68928:42;68944:10;68956:13;68928:15;:42::i;:::-;69024:50;69043:13;69058:15;;69024:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;69024:18:0;;-1:-1:-1;;;69024:50:0:i;:::-;69147:34;;;;:19;:34;;;;;:50;;69184:13;;69147:50;:::i;:::-;-1:-1:-1;69291:9:0;69286:479;69306:30;;;69286:479;;;69453:1;69419:19;;69439:1;69419:22;;;;;;;;;;;;;-1:-1:-1;;;;;69419:22:0;-1:-1:-1;;;;;69419:36:0;;;69411:45;;;;;;69577:1;69557:17;;;:21;69532:22;69689:35;;;:19;:35;;;;;69730:19;;69573:1;69730:22;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;-1:-1;69689:64:0;;;69730:22;69689:64;;;;;;;;;-1:-1:-1;;;;;;69689:64:0;-1:-1:-1;;;;;69730:22:0;;;;;;;;;;;;;69689:64;;;;-1:-1:-1;69338:3:0;;;;;-1:-1:-1;69286:479:0;;55234:49;;;;:::o;22711:228::-;22766:7;22802:20;;;:11;:20;;;;;;-1:-1:-1;;;;;22802:20:0;22841:19;22833:73;;;;-1:-1:-1;;;22833:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22274:211;22329:7;-1:-1:-1;;;;;22357:19:0;;22349:74;;;;-1:-1:-1;;;22349:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22443:24:0;;;;;;:17;:24;;;;;:34;;:32;:34::i;53187:46::-;;;;;;;;;;;;;;;:::o;80176:3057::-;80482:46;80501:10;80513:14;80482:18;:46::i;:::-;:187;;;-1:-1:-1;80658:10:0;80550:23;:48;80574:23;80582:14;80574:7;:23::i;:::-;-1:-1:-1;;;;;80550:48:0;;;;;;;;;;;;;;;;;-1:-1:-1;80550:48:0;;;:104;;;;;;;;;;:118;80482:187;80460:263;;;;;-1:-1:-1;;;80460:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;80792:35;;;;:19;:35;;;;;:43;;;;;;;;80770:114;;;;;-1:-1:-1;;;80770:114:0;;;;;;;;;;;;-1:-1:-1;;;80770:114:0;;;;;;;;;;;;;;;80939:33;80975:35;;;:19;:35;;;;;81134:32;;;;-1:-1:-1;;81134:38:0;;81133:99;;;81230:1;81195:12;:32;;;:36;81133:99;81111:172;;;;;-1:-1:-1;;;81111:172:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;81398:30;;;;;;;;;;;;;;;;81365;;81411:9;81398:30;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;81398:30:0;-1:-1:-1;81365:63:0;-1:-1:-1;81446:9:0;81441:841;81461:19;;;81441:841;;;81540:26;81586:35;;;:19;:35;;;;;:42;;81540:26;81629:8;;81638:1;81629:11;;;;;;;;;;;;;81586:55;;;;;;;;;;;81540:101;;81753:5;:14;;;81737:9;;81747:1;81737:12;;;;;;;;;;;;;:30;;81736:89;;;;;81810:5;:14;;;81794:9;;81804:1;81794:12;;;;;;;;;;;;;:30;;81736:89;81710:162;;;;;-1:-1:-1;;;81710:162:0;;;;;;;;;;;;-1:-1:-1;;;81710:162:0;;;;;;;;;;;;;;;81987:5;:18;;;81971:9;;81981:1;81971:12;;;;;;;;;;;;;:34;;81945:122;;;;;-1:-1:-1;;;81945:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;82159:5;:18;;;82139:14;82154:1;82139:17;;;;;;;;;;;;;:38;;;;;82258:9;;82268:1;82258:12;;;;;;;;;;;;;;82237:18;;;;:33;;;;-1:-1:-1;81482:3:0;;81441:841;;;-1:-1:-1;82390:9:0;:13;82386:91;;82438:15;;82420:45;;-1:-1:-1;;;;;82438:15:0;82455:9;82420:17;:45::i;:::-;82584:1;82549:12;:32;;;:36;82545:434;;;82744:1;82692:32;;;;-1:-1:-1;;82692:53:0;82640:105;;-1:-1:-1;82869:27:0;;;:11;:27;;;;;:34;;;;;82865:103;;;82924:28;82937:14;82924:12;:28::i;:::-;83019:206;83053:14;83082:9;83106:12;:32;;;83153:8;;83176:14;83205:9;;83019:206;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;;;137:4;117:14;;;-1:-1;;113:30;157:16;;;83019:206:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;83019:206:0;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;83019:206:0;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;83019:206:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;83019:206:0;;;;-1:-1:-1;83019:206:0;;-1:-1:-1;;;;;;;;;;;;83019:206:0;80176:3057;;;;;;;:::o;54316:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58789:417::-;56327:15;;-1:-1:-1;;;;;56327:15:0;56313:10;:29;56305:38;;;;;;59047:9;59042:114;59062:19;;;59042:114;;;59140:4;59103:21;:34;59125:8;;59134:1;59125:11;;;;;;;;;;;;;;;;59103:34;;-1:-1:-1;59103:34:0;;;;;;;;-1:-1:-1;59103:34:0;:41;;-1:-1:-1;;59103:41:0;;;;;;;;;;-1:-1:-1;59083:3:0;59042:114;;;;59173:25;59189:8;;59173:25;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;59173:25:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;59173:25:0;;;;-1:-1:-1;59173:25:0;;-1:-1:-1;;;;59173:25:0;58789:417;;:::o;36747:246::-;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;36807:28;:26;:28::i;:::-;36799:37;;;;;;36934:51;-1:-1:-1;;;36934:18:0;:51::i;:::-;1372:14;1368:57;;;1412:5;1397:20;;-1:-1:-1;;1397:20:0;;;36747:246;:::o;55290:50::-;;;;:::o;56781:172::-;56327:15;;-1:-1:-1;;;;;56327:15:0;56313:10;:29;56305:38;;;;;;56901:19;:44;56781:172::o;78146:334::-;78259:6;78305:35;;;:19;:35;;;;;:43;;;;;;;;78283:114;;;;;-1:-1:-1;;;78283:114:0;;;;;;;;;;;;-1:-1:-1;;;78283:114:0;;;;;;;;;;;;;;;-1:-1:-1;78417:35:0;;;;:19;:35;;;;;:55;;;;78146:334::o;58441:227::-;56327:15;;-1:-1:-1;;;;;56327:15:0;56313:10;:29;56305:38;;;;;;58564:15;:36;;-1:-1:-1;;;;;58564:36:0;;-1:-1:-1;;;;;;58564:36:0;;;;;;;;58618:42;;;;;;;;;;;;;;;;58441:227;:::o;46842:89::-;46916:7;46909:14;;;;;;;;-1:-1:-1;;46909:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46883:13;;46909:14;;46916:7;;46909:14;;46916:7;46909:14;;;;;;;;;;;;;;;;;;;;;;;;78554:1070;78708:35;;;;:19;:35;;;;;:43;;;78653:15;;78708:43;;;;;78686:114;;;;;-1:-1:-1;;;78686:114:0;;;;;;;;;;;;-1:-1:-1;;;78686:114:0;;;;;;;;;;;;;;;78813:33;78849:35;;;:19;:35;;;;;78954:29;;78897:28;;78954:36;;78988:1;78954:36;:33;:36;:::i;:::-;78941:50;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;78941:50:0;-1:-1:-1;78897:94:0;-1:-1:-1;79002:22:0;;79115:470;79139:29;;79135:33;;79115:470;;;79221:22;;;;:19;;;:22;;;;;:31;79190:28;;:12;;79203:14;;79190:28;;;;;;;;;;;;;;;:62;79284:21;:14;79303:1;79284:21;:18;:21;:::i;:::-;79267:38;;79353:12;:19;;:22;79373:1;79353:22;;;;;;;;;;;:31;;;79322:12;79335:14;79322:28;;;;;;;;;;;;;;;;;:62;79416:21;:14;79435:1;79416:21;:18;:21;:::i;:::-;79399:38;;79485:12;:19;;:22;79505:1;79485:22;;;;;;;;;;;:35;;;79454:12;79467:14;79454:28;;;;;;;;;;;;;;;;;:66;79552:21;:14;79571:1;79552:21;:18;:21;:::i;:::-;79535:38;-1:-1:-1;79170:3:0;;79115:470;;;-1:-1:-1;79604:12:0;;78554:1070;-1:-1:-1;;;;78554:1070:0:o;24593:254::-;24679:12;:10;:12::i;:::-;-1:-1:-1;;;;;24673:18:0;:2;-1:-1:-1;;;;;24673:18:0;;;24665:56;;;;;-1:-1:-1;;;24665:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24773:8;24734:18;:32;24753:12;:10;:12::i;:::-;-1:-1:-1;;;;;24734:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;24734:32:0;;;:36;;;;;;;;;;;;:47;;-1:-1:-1;;24734:47:0;;;;;;;;;;;24812:12;:10;:12::i;:::-;24797:42;;;;;;;;;;-1:-1:-1;;;;;24797:42:0;;;;;;;;;;;;;;24593:254;;:::o;53286:44::-;;;;;;;;;;;;;:::o;54082:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54082:64:0;;-1:-1:-1;54082:64:0;;-1:-1:-1;54082:64:0:o;83306:362::-;83401:10;83362:14;83379:33;;;:21;:33;;;;;;83433:11;83425:20;;;;;;83472:4;83464:21;:31;-1:-1:-1;83464:31:0;83456:40;;;;;;83531:10;83545:1;83509:33;;;:21;:33;;;;;;:37;;;83589:33;83545:1;;83531:10;83611:6;;83545:1;83589:33;83545:1;83589:33;83611:6;83531:10;83589:33;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;83559:63:0;;;83641:18;83633:27;;;;;27596:272;27711:41;27730:12;:10;:12::i;:::-;27744:7;27711:18;:41::i;:::-;27703:103;;;;-1:-1:-1;;;27703:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27817:43;27835:4;27841:2;27845:7;27854:5;27817:17;:43::i;:::-;27596:272;;;;:::o;53852:64::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53852:64:0;;;;;:::o;61999:420::-;56327:15;;-1:-1:-1;;;;;56327:15:0;56313:10;:29;56305:38;;;;;;62197:26;:56;;;62353:58;;;;;;;;;;;;;;;;;61999:420;:::o;54625:41::-;;;;:::o;55068:30::-;;;-1:-1:-1;;;;;55068:30:0;;:::o;47138:205::-;47196:13;47230:16;47238:7;47230;:16::i;:::-;47222:76;;;;-1:-1:-1;;;47222:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47316:19;;;;:10;:19;;;;;;;;;47309:26;;;;;;-1:-1:-1;;47309:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47316:19;;47309:26;;47316:19;47309:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47138:205;;;:::o;54461:87::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54461:87:0;;:::o;55349:850::-;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;55541:19;:17;:19::i;:::-;55571:29;:27;:29::i;:::-;55611:39;55637:4;55643:6;55611:25;:39::i;:::-;55729:2;55700:26;:31;55825:1;55801:21;:25;55923:15;:28;;55941:10;-1:-1:-1;;;;;;55923:28:0;;;;;;;56001:15;:34;;;;;-1:-1:-1;;;;;56001:34:0;;;;;56098:19;:48;;;;56159:32;;;;;;1372:14;1368:57;;;1412:5;1397:20;;-1:-1:-1;;1397:20:0;;;1368:57;55349:850;;;;;:::o;54829:36::-;;;;:::o;54203:49::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54203:49:0;;;;;;;;:::o;77749:321::-;77887:39;77906:10;77918:7;77887:18;:39::i;:::-;77879:48;;;;;;77968:18;;;;:9;:18;;;;;;;;;:27;;;78034:28;;;;;;;;;;;;;;;;;;;;;;;;77749:321;;:::o;54949:38::-;;;-1:-1:-1;;;;;54949:38:0;;:::o;57111:1029::-;56487:13;;-1:-1:-1;;;;;56487:13:0;56473:10;:27;56465:36;;;;;;57470:19;;57453:13;:36;57445:45;;;;;;57584:78;;;;;;;;-1:-1:-1;;;;;57584:78:0;;;;;;;;;;;;-1:-1:-1;57550:31:0;;;:16;:31;;;;;;:112;;;;-1:-1:-1;;;;;;57550:112:0;;;;;;;;-1:-1:-1;57550:112:0;;;;57742:36;;:29;57550:31;57584:78;57742:17;:29::i;:::-;:33;:36;:33;:36;:::i;:::-;57720:19;:58;57853:67;;;;:28;:67;;;;;;;;:97;;;57961:29;:68;;;;;;:99;;;58078:54;;;;;;;;;;;-1:-1:-1;;;;;58078:54:0;;;;;;;;;;;;;;;;;57111:1029;;;;;:::o;59292:651::-;56327:15;;-1:-1:-1;;;;;56327:15:0;56313:10;:29;56305:38;;;;;;59536:37;;;;:28;:37;;;;;;;;:67;;;59614:29;:38;;;;;;:69;;;59788:147;;;;;;;;;;;;;;;;;;;;;;;;;;;;59292:651;;;:::o;25177:147::-;-1:-1:-1;;;;;25281:25:0;;;25257:4;25281:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25177:147::o;60015:597::-;56327:15;;-1:-1:-1;;;;;56327:15:0;56313:10;:29;56305:38;;;;;;60209:34;:72;;;60292:35;:74;;;60458:146;;;;;;;;;;;;;;;;;;;;;;;;;60015:597;;:::o;62427:3276::-;62890:3;62865:28;;;62857:65;;;;;-1:-1:-1;;;62857:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;63070:2;63036:36;;;63014:109;;;;;-1:-1:-1;;;63014:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;63208:35;;;;:19;:35;;;;;:43;;;;;;;;:52;63186:115;;;;;-1:-1:-1;;;63186:115:0;;;;;;;;;;;;-1:-1:-1;;;63186:115:0;;;;;;;;;;;;;;;63412:35;;;;:19;:35;;;;;:38;;63454:10;;63412:35;:38;;;;;;;;;;;;;;-1:-1:-1;;;;;63412:38:0;:52;63390:130;;;;;-1:-1:-1;;;63390:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;63625:46;;;63624:119;;;;-1:-1:-1;63694:48:0;;;63624:119;63602:190;;;;;-1:-1:-1;;;63602:190:0;;;;;;;;;;;;-1:-1:-1;;;63602:190:0;;;;;;;;;;;;;;;63918:17;-1:-1:-1;;63918:23:0;63917:52;;;;63967:1;63947:17;:21;63917:52;63895:125;;;;;-1:-1:-1;;;63895:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;64071:43;64087:10;64099:14;64071:15;:43::i;:::-;64151:51;64170:14;64186:15;;64151:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;64151:18:0;;-1:-1:-1;;;64151:51:0:i;:::-;64288:131;;;;;;;;64315:16;;:23;;64288:131;;;;64353:17;64288:131;;;;64385:4;64288:131;;;;;;64404:4;64288:131;;;;;64250:19;:35;64270:14;64250:35;;;;;;;;;;;:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64483:9;64495:1;64483:13;;64478:796;64498:27;;;64478:796;;;64669:14;;64684:1;64669:17;;;;;;;;;;;;;64648:14;;64663:1;64648:17;;;;;;;;;;;;;:38;;64622:119;;;;;-1:-1:-1;;;64622:119:0;;;;;;;;;;;;-1:-1:-1;;;64622:119:0;;;;;;;;;;;;;;;64857:14;;64872:1;64857:17;;;;;;;;;;;;;64834:16;;64851:1;64834:19;;;;;;;;;;;;;:40;;64833:109;;;;;64924:14;;64939:1;64924:17;;;;;;;;;;;;;64901:16;;64918:1;64901:19;;;;;;;;;;;;;:40;;64833:109;64807:188;;;;;-1:-1:-1;;;64807:188:0;;;;;;;;;;;;-1:-1:-1;;;64807:188:0;;;;;;;;;;;;;;;65102:160;;;;;;;;65133:14;;65148:1;65133:17;;;;;;;;;;;;;65102:160;;;;65169:14;;65184:1;65169:17;;;;;;;;;;;;;65102:160;;;;65205:16;;65222:1;65205:19;;;;;;;;;;;;;65102:160;;;;65243:4;65102:160;;;;;65054:19;:35;65074:14;65054:35;;;;;;;;;;;:42;;:45;65097:1;65054:45;;;;;;;;;;;:208;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64527:3;;;;;;;64478:796;;;-1:-1:-1;65388:9:0;65383:313;65403:34;;;65383:313;;;65564:1;65526:23;;65550:1;65526:26;;;;;;;;;;;;;-1:-1:-1;;;;;65526:26:0;-1:-1:-1;;;;;65526:40:0;;;65518:49;;;;;;65584:35;;;;:19;:35;;;;;65643:23;;65667:1;65643:26;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;-1:-1;65584:100:0;;;65643:26;65584:100;;;;;;;;;-1:-1:-1;;;;;;65584:100:0;-1:-1:-1;;;;;65643:26:0;;;;;;;;;;;;;65584:100;;;;-1:-1:-1;65439:3:0;65383:313;;;;62427:3276;;;;;;;;;;;;:::o;29588:333::-;29673:4;29698:16;29706:7;29698;:16::i;:::-;29690:73;;;;-1:-1:-1;;;29690:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29774:13;29790:16;29798:7;29790;:16::i;:::-;29774:32;;29836:5;-1:-1:-1;;;;;29825:16:0;:7;-1:-1:-1;;;;;29825:16:0;;:51;;;;29869:7;-1:-1:-1;;;;;29845:31:0;:20;29857:7;29845:11;:20::i;:::-;-1:-1:-1;;;;;29845:31:0;;29825:51;:87;;;;29880:32;29897:5;29904:7;29880:16;:32::i;:::-;29817:96;29588:333;-1:-1:-1;;;;29588:333:0:o;74022:2918::-;74262:30;;;;:21;:30;;;;;;;;74258:2410;;;74369:22;74410:38;;;:29;:38;;;;;;74406:405;;74526:104;74626:3;74526:73;74563:35;;74526:10;:36;;:73;;;;:::i;:104::-;74509:121;;74406:405;;;74725:38;;;;:29;:38;;;;;;74688:107;;74791:3;;74688:76;;:10;;:76;:36;:76;:::i;:107::-;74671:124;;74406:405;74845:15;;74827:50;;-1:-1:-1;;;;;74845:15:0;74862:14;74827:17;:50::i;:::-;75032:21;75073:51;75120:3;75073:42;75088:26;;75073:10;:14;;:42;;;;:::i;:51::-;75215:28;;;;:19;:28;;;;;;;;;75139:119;;;;;;;;;;;;;;;;;75032:92;;-1:-1:-1;75139:119:0;;75032:92;;75139:119;;;75215:28;75139:119;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;75139:119:0;;;;;;;;;;;;;;;;;;;;;:25;:119::i;:::-;75325:28;75372:16;75380:7;75372;:16::i;:::-;75325:65;-1:-1:-1;75477:131:0;75325:65;75544:49;75579:13;75544:30;:10;75559:14;75544:30;:14;:30;:::i;:::-;:34;:49;:34;:49;:::i;:::-;75477:17;:131::i;:::-;74258:2410;;;;;;75641:30;;;;:21;:30;;;;;;;;:37;;-1:-1:-1;;75641:37:0;75674:4;75641:37;;;75792:28;:37;;;;;;75788:401;;75906:103;76005:3;75906:72;75943:34;;75906:10;:36;;:72;;;;:::i;:103::-;75889:120;;75788:401;;;76104:37;;;;:28;:37;;;;;;76067:106;;76169:3;;76067:75;;:10;;:75;:36;:75;:::i;:106::-;76050:123;;75788:401;76223:15;;76205:50;;-1:-1:-1;;;;;76223:15:0;76240:14;76205:17;:50::i;:::-;76520:136;76564:30;:10;76579:14;76564:30;:14;:30;:::i;:::-;76613:28;;;;:19;:28;;;;;;;;;76520:136;;;;;;;;;;;;;;;;;76613:28;;76520:136;;76613:28;76520:136;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;76520:136:0;;;;;;;;;;;;;;;;;;;;:25;:136::i;:::-;74258:2410;;76731:32;;;;;;;;-1:-1:-1;76731:32:0;;;;;;;;;;;;;;;;76708:20;;;:11;:20;;;;;;;:55;;;;-1:-1:-1;;;;;;76708:55:0;-1:-1:-1;;;;;76708:55:0;;;;;;;;-1:-1:-1;76708:55:0;;;;;;;;;;;-1:-1:-1;;76708:55:0;;;;;;;;;;76815:44;76829:16;76708:20;76829:7;:16::i;:::-;76847:2;76851:7;76815:13;:44::i;:::-;76898:34;;;;;;;;;;;;-1:-1:-1;;;;;76898:34:0;;;;;;;;;;;;;;;;;74022:2918;;;:::o;29063:155::-;29120:4;29153:20;;;:11;:20;;;;;;-1:-1:-1;;;;;29153:20:0;29191:19;;;29063:155::o;3046:98::-;3126:10;3046:98;:::o;71476:464::-;71543:20;;;;:11;:20;;;;;:27;;;;;71535:36;;;;;;71659:20;;;;:11;:20;;;;;:27;;;71701;;;;71627:112;;-1:-1:-1;;;;;71659:27:0;;71627:17;:112::i;:::-;71803:32;;;;;;;;-1:-1:-1;71803:32:0;;;;;;;;;;;;;;;;71780:20;;;:11;:20;;;;;;:55;;;;-1:-1:-1;;;;;;71780:55:0;-1:-1:-1;;;;;71780:55:0;;;;;;;-1:-1:-1;71780:55:0;;;;;;;;;;;-1:-1:-1;;71780:55:0;;;;;;;;;;;71911:21;;;;;;;;;;;;;;;;;71476:464;:::o;47590:195::-;47676:16;47684:7;47676;:16::i;:::-;47668:73;;;;-1:-1:-1;;;47668:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47752:19;;;;:10;:19;;;;;;;;:25;;;;;;;;:::i;30462:102::-;30530:26;30540:2;30544:7;30530:26;;;;;;;;;;;;:9;:26::i;84279:264::-;84454:1;84433:18;;;:9;:18;;;;;:22;84497:38;84517:4;84523:2;84443:7;84497:19;:38::i;83769:464::-;83947:42;;83929:12;;-1:-1:-1;;;;;83947:14:0;;;83980:4;;83968:6;;83929:12;83947:42;83929:12;83947:42;83968:6;83947:14;83980:4;83947:42;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;83928:61:0;;-1:-1:-1;;84084:16:0;84080:146;;-1:-1:-1;;;;;84152:32:0;;;;;;:21;:32;;;;;;:62;;84207:6;84152:62;:54;:62;:::i;:::-;-1:-1:-1;;;;;84117:32:0;;;;;;:21;:32;;;;;:97;83769:464;;;:::o;8598:181::-;8656:7;8688:5;;;8712:6;;;;8704:46;;;;;-1:-1:-1;;;8704:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8770:1;8598:181;-1:-1:-1;;;8598:181:0:o;9970:471::-;10028:7;10273:6;10269:47;;-1:-1:-1;10303:1:0;10296:8;;10269:47;10340:5;;;10344:1;10340;:5;:1;10364:5;;;;;:10;10356:56;;;;-1:-1:-1;;;10356:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10909:132;10967:7;10994:39;10998:1;11001;10994:39;;;;;;;;;;;;;;;;;:3;:39::i;1519:508::-;1936:4;1982:17;2014:7;1519:508;:::o;21938:125::-;21992:4;22016:39;-1:-1:-1;;;22016:17:0;:39::i;:::-;22009:46;;21938:125;:::o;19456:193::-;-1:-1:-1;;;;;;19532:25:0;;;;;19524:66;;;;;-1:-1:-1;;;19524:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19601:33:0;;;;;:20;:33;;;;;:40;;-1:-1:-1;;19601:40:0;19637:4;19601:40;;;19456:193::o;17444:114::-;17536:14;;17444:114::o;28589:272::-;28699:32;28713:4;28719:2;28723:7;28699:13;:32::i;:::-;28750:48;28773:4;28779:2;28783:7;28792:5;28750:22;:48::i;:::-;28742:111;;;;-1:-1:-1;;;28742:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21720:210;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;21772:19;:17;:19::i;:::-;21882:40;-1:-1:-1;;;21882:18:0;:40::i;73477:380::-;73611:15;;:19;73607:243;;73647:20;73670:27;73681:8;:15;73670:6;:10;;:27;;;;:::i;:::-;73647:50;-1:-1:-1;73719:9:0;73714:125;73738:8;:15;73734:1;:19;73714:125;;;73779:44;73797:8;73806:1;73797:11;;;;;;;;;;;;;;73810:12;73779:17;:44::i;:::-;73755:3;;73714:125;;9054:136;9112:7;9139:43;9143:1;9146;9139:43;;;;;;;;;;;;;;;;;:3;:43::i;31178:242::-;31266:18;31272:2;31276:7;31266:5;:18::i;:::-;31303:54;31334:1;31338:2;31342:7;31351:5;31303:22;:54::i;:::-;31295:117;;;;-1:-1:-1;;;31295:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38935:245;39021:38;39041:4;39047:2;39051:7;39021:19;:38::i;:::-;39072:47;39105:4;39111:7;39072:32;:47::i;:::-;39132:40;39160:2;39164:7;39132:27;:40::i;11571:345::-;11657:7;11759:12;11752:5;11744:28;;;;-1:-1:-1;;;11744:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;11744:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11783:9;11799:1;11795;:5;;;;;;;11571:345;-1:-1:-1;;;;;11571:345:0:o;33505:1079::-;33627:4;33654:15;:2;-1:-1:-1;;;;;33654:13:0;;:15::i;:::-;33649:60;;-1:-1:-1;33693:4:0;33686:11;;33649:60;33780:12;33794:23;-1:-1:-1;;;;;33821:7:0;;-1:-1:-1;;;33926:12:0;:10;:12::i;:::-;33953:4;33972:7;33994:5;33829:181;;;;;;-1:-1:-1;;;;;33829:181:0;-1:-1:-1;;;;;33829:181:0;;;;;;-1:-1:-1;;;;;33829:181:0;-1:-1:-1;;;;;33829:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;33829:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33829:181:0;;;-1:-1:-1;;26:21;;;22:32;6:49;;33829:181:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;33829:181:0;;;179:29:-1;;;;160:49;;33821:190:0;;;33829:181;;33821:190;;-1:-1:-1;33821:190:0;;-1:-1:-1;25:18;-1:-1;33821:190:0;-1:-1:-1;33821:190:0;;-1:-1:-1;33821:190:0;;-1:-1:-1;25:18;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;33821:190:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;33779:232:0;;;;34027:7;34022:555;;34055:17;;:21;34051:384;;34223:10;34217:17;34284:15;34271:10;34267:2;34263:19;34256:44;34171:148;34359:60;;-1:-1:-1;;;34359:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34022:555;34467:13;34494:10;34483:32;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34483:32:0;-1:-1:-1;;;;;;34538:26:0;-1:-1:-1;;;34538:26:0;;-1:-1:-1;34530:35:0;;-1:-1:-1;;;34530:35:0;18521:238;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;18711:40;-1:-1:-1;;;18711:18:0;:40::i;9527:192::-;9613:7;9649:12;9641:6;;;;9633:29;;;;-1:-1:-1;;;9633:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;9633:29:0;-1:-1:-1;;;9685:5:0;;;9527:192::o;39445:202::-;39509:24;39521:2;39525:7;39509:11;:24::i;:::-;39546:40;39574:2;39578:7;39546:27;:40::i;:::-;39599;39631:7;39599:31;:40::i;32394:459::-;32508:4;-1:-1:-1;;;;;32488:24:0;:16;32496:7;32488;:16::i;:::-;-1:-1:-1;;;;;32488:24:0;;32480:78;;;;-1:-1:-1;;;32480:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32577:16:0;;32569:65;;;;-1:-1:-1;;;32569:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32647:23;32662:7;32647:14;:23::i;:::-;-1:-1:-1;;;;;32683:23:0;;;;;;:17;:23;;;;;:35;;:33;:35::i;:::-;-1:-1:-1;;;;;32729:21:0;;;;;;:17;:21;;;;;:33;;:31;:33::i;:::-;32775:20;;;;:11;:20;;;;;;:25;;-1:-1:-1;;;;;;32775:25:0;-1:-1:-1;;;;;32775:25:0;;;;;;;;;32818:27;;32775:20;;32818:27;;;;;;;32394:459;;;:::o;42165:1148::-;-1:-1:-1;;;;;42456:18:0;;42431:22;42456:18;;;:12;:18;;;;;:25;:32;;42486:1;42456:32;:29;:32;:::i;:::-;42499:18;42520:26;;;:17;:26;;;;;;42431:57;;-1:-1:-1;42653:28:0;;;42649:328;;-1:-1:-1;;;;;42720:18:0;;42698:19;42720:18;;;:12;:18;;;;;:34;;42739:14;;42720:34;;;;;;;;;;;;;;42698:56;;42804:11;42771:12;:18;42784:4;-1:-1:-1;;;;;42771:18:0;-1:-1:-1;;;;;42771:18:0;;;;;;;;;;;;42790:10;42771:30;;;;;;;;;;;;;;;;;;;:44;;;;42888:30;;;:17;:30;;;;;:43;;;42649:328;-1:-1:-1;;;;;43066:18:0;;;;;;:12;:18;;;;;:27;;;;;-1:-1:-1;;43066:27:0;;;:::i;40987:186::-;-1:-1:-1;;;;;41101:16:0;;;;;;;:12;:16;;;;;;;;:23;;41072:26;;;:17;:26;;;;;:52;;;41135:16;;;39:1:-1;23:18;;45:23;;41135:30:0;;;;;;;;40987:186::o;13985:619::-;14045:4;14513:20;;14356:66;14553:23;;;;;;:42;;-1:-1:-1;;14580:15:0;;;14545:51;-1:-1:-1;;13985:619:0:o;31673:335::-;-1:-1:-1;;;;;31745:16:0;;31737:61;;;;;-1:-1:-1;;;31737:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31818:16;31826:7;31818;:16::i;:::-;31817:17;31809:58;;;;;-1:-1:-1;;;31809:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31880:20;;;;:11;:20;;;;;;;;:25;;-1:-1:-1;;;;;;31880:25:0;-1:-1:-1;;;;;31880:25:0;;;;;;;;31916:21;;:17;:21;;;;;:33;;:31;:33::i;:::-;31967;;31992:7;;-1:-1:-1;;;;;31967:33:0;;;31984:1;;31967:33;;31984:1;;31967:33;31673:335;;:::o;41374:164::-;41478:10;:17;;41451:24;;;;:15;:24;;;;;:44;;;39:1:-1;23:18;;45:23;;41506:24:0;;;;;;;41374:164::o;34752:175::-;34852:1;34816:24;;;:15;:24;;;;;;-1:-1:-1;;;;;34816:24:0;:38;34812:108;;34906:1;34871:24;;;:15;:24;;;;;:37;;-1:-1:-1;;;;;;34871:37:0;;;34752:175::o;17755:110::-;17836:14;;:21;;17855:1;17836:21;:18;:21;:::i;:::-;17819:38;;17755:110::o;17566:181::-;17720:19;;17738:1;17720:19;;;17566:181::o;48925:35621::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;48925:35621:0;-1:-1:-1;;;;;48925:35621:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;48925:35621:0;;;-1:-1:-1;48925:35621:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48925:35621:0;;;-1:-1:-1;48925:35621:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;;48925:35621:0;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://2bff7765b0ad7a7ca5ccd768115cf47b5a65cdb2e102f8b1d4311de51fd245c2

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  ]

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.