Source Code
Latest 13 from a total of 13 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Safe Transfer Fr... | 28733680 | 1014 days ago | IN | 0 XDAI | 0.00008045 | ||||
| Safe Transfer Fr... | 28163593 | 1049 days ago | IN | 0 XDAI | 0.00009461 | ||||
| Safe Transfer Fr... | 28163567 | 1049 days ago | IN | 0 XDAI | 0.00006436 | ||||
| Safe Transfer Fr... | 27986892 | 1059 days ago | IN | 0 XDAI | 0.00006436 | ||||
| Safe Transfer Fr... | 27986850 | 1059 days ago | IN | 0 XDAI | 0.00015545 | ||||
| Add Event Minter | 27415234 | 1094 days ago | IN | 0 XDAI | 0.00005355 | ||||
| Mint Token | 27415194 | 1094 days ago | IN | 0 XDAI | 0.00005795 | ||||
| Transfer From | 25895659 | 1186 days ago | IN | 0 XDAI | 0.00002993 | ||||
| Safe Transfer Fr... | 25895639 | 1186 days ago | IN | 0 XDAI | 0.00003246 | ||||
| Renounce Admin | 25371679 | 1218 days ago | IN | 0 XDAI | 0.00002329 | ||||
| Initialize | 25371665 | 1218 days ago | IN | 0 XDAI | 0.00006958 | ||||
| Safe Transfer Fr... | 22813691 | 1387 days ago | IN | 0 XDAI | 0.00008117 | ||||
| Set Approval For... | 22141128 | 1427 days ago | IN | 0 XDAI | 0.00012094 |
View more zero value Internal Transactions in Advanced View mode
Cross-Chain Transactions
Loading...
Loading
Contract Name:
XPoap
Compiler Version
v0.5.2+commit.1df8f40c
Contract Source Code (Solidity)
/**
*Submitted for verification at gnosisscan.io on 2022-08-24
*/
pragma solidity >=0.4.24 <0.6.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 wasInitializing = initializing;
initializing = true;
initialized = true;
_;
initializing = wasInitializing;
}
/// @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.
uint256 cs;
assembly { cs := extcodesize(address) }
return cs == 0;
}
// Reserved storage space to allow for layout changes in the future.
uint256[50] private ______gap;
}
/**
* Utility library of inline functions on addresses
*/
library Address {
/**
* Returns whether the target address is a contract
* @dev This function will return false if invoked during the constructor of a contract,
* as the code is not actually created until after the constructor finishes.
* @param account address of the account to check
* @return whether the target address is a contract
*/
function isContract(address account) internal view returns (bool) {
uint256 size;
// XXX Currently there is no better way to check if there is a contract in an address
// than to check the size of the code at that address.
// See https://ethereum.stackexchange.com/a/14016/36603
// for more details about how this works.
// TODO Check this again before the Serenity release, because all addresses will be
// contracts then.
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
}
/**
* @title IERC165
* @dev https://eips.ethereum.org/EIPS/eip-165
*/
interface IERC165 {
/**
* @notice Query if a contract implements an interface
* @param interfaceId The interface identifier, as specified in ERC-165
* @dev Interface identification is specified in ERC-165. This function
* uses less than 30,000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
/**
* @title ERC165
* @author Matt Condon (@shrugs)
* @dev Implements ERC165 using a lookup table.
*/
contract ERC165 is Initializable, IERC165 {
bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
/*
* 0x01ffc9a7 ===
* bytes4(keccak256('supportsInterface(bytes4)'))
*/
/**
* @dev a mapping of interface id to whether or not it's supported
*/
mapping(bytes4 => bool) private _supportedInterfaces;
/**
* @dev A contract implementing SupportsInterfaceWithLookup
* implement ERC165 itself
*/
function initialize() public initializer {
_registerInterface(_INTERFACE_ID_ERC165);
}
/**
* @dev implement supportsInterface(bytes4) using a lookup table
*/
function supportsInterface(bytes4 interfaceId) public view returns (bool) {
return _supportedInterfaces[interfaceId];
}
/**
* @dev internal method for registering an interface
*/
function _registerInterface(bytes4 interfaceId) internal {
require(interfaceId != 0xffffffff);
_supportedInterfaces[interfaceId] = true;
}
uint256[50] private ______gap;
}
/**
* @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 `safeTransfer`. 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);
}
/**
* @title ERC721 Non-Fungible Token Standard basic interface
* @dev see https://eips.ethereum.org/EIPS/eip-721
*/
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);
function balanceOf(address owner) public view returns (uint256 balance);
function ownerOf(uint256 tokenId) public view returns (address owner);
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 transferFrom(address from, address to, uint256 tokenId) public;
function safeTransferFrom(address from, address to, uint256 tokenId) public;
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public;
}
/**
* @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);
}
/**
* @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);
}
/**
* @title ERC721 Non-Fungible Token Standard basic implementation
* @dev see https://eips.ethereum.org/EIPS/eip-721
*/
contract ERC721 is Initializable, 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 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;
/*
* 0x80ac58cd ===
* bytes4(keccak256('balanceOf(address)')) ^
* bytes4(keccak256('ownerOf(uint256)')) ^
* bytes4(keccak256('approve(address,uint256)')) ^
* bytes4(keccak256('getApproved(uint256)')) ^
* bytes4(keccak256('setApprovalForAll(address,bool)')) ^
* bytes4(keccak256('isApprovedForAll(address,address)')) ^
* bytes4(keccak256('transferFrom(address,address,uint256)')) ^
* bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^
* bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)'))
*/
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));
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));
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);
require(msg.sender == owner || isApprovedForAll(owner, msg.sender));
_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));
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 != msg.sender);
_operatorApprovals[msg.sender][to] = approved;
emit ApprovalForAll(msg.sender, 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 {
require(_isApprovedOrOwner(msg.sender, tokenId));
_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 `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 `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
* @param _data bytes data to send along with a safe transfer check
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public {
transferFrom(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, _data));
}
/**
* @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) {
address owner = ownerOf(tokenId);
return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
}
/**
* @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));
require(!_exists(tokenId));
_tokenOwner[tokenId] = to;
_ownedTokensCount[to].increment();
emit Transfer(address(0), to, tokenId);
}
/**
* @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
*/
function _burn(address owner, uint256 tokenId) internal {
require(ownerOf(tokenId) == owner);
_clearApproval(tokenId);
_ownedTokensCount[owner].decrement();
_tokenOwner[tokenId] = address(0);
emit Transfer(owner, address(0), tokenId);
}
/**
* @dev Internal function to burn a specific token
* Reverts if the token does not exist
* @param tokenId uint256 ID of the token being burned
*/
function _burn(uint256 tokenId) internal {
_burn(ownerOf(tokenId), 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);
require(to != address(0));
_clearApproval(tokenId);
_ownedTokensCount[from].decrement();
_ownedTokensCount[to].increment();
_tokenOwner[tokenId] = to;
emit Transfer(from, to, tokenId);
}
/**
* @dev Internal function to invoke `onERC721Received` on a target address
* The call is not executed if the target address is not a contract
* @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;
}
bytes4 retval = IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data);
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;
}
/**
* @title SafeMath
* @dev Unsigned math operations with safety checks that revert on error
*/
library SafeMath {
/**
* @dev Multiplies two unsigned integers, reverts on 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-solidity/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b);
return c;
}
/**
* @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a);
uint256 c = a - b;
return c;
}
/**
* @dev Adds two unsigned integers, reverts on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a);
return c;
}
/**
* @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
* reverts when dividing by zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b != 0);
return a % b;
}
}
/**
* @title ERC-721 Non-Fungible Token with optional enumeration extension logic
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
contract ERC721Enumerable is Initializable, 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 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;
/*
* 0x780e9d63 ===
* bytes4(keccak256('totalSupply()')) ^
* bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) ^
* bytes4(keccak256('tokenByIndex(uint256)'))
*/
/**
* @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));
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());
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 _burn(uint256) 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;
}
/**
* @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 {
counter._value += 1;
}
function decrement(Counter storage counter) internal {
counter._value = counter._value.sub(1);
}
}
/**
* @title Roles
* @dev Library for managing addresses assigned to a Role.
*/
library Roles {
struct Role {
mapping (address => bool) bearer;
}
/**
* @dev give an account access to this role
*/
function add(Role storage role, address account) internal {
require(account != address(0));
require(!has(role, account));
role.bearer[account] = true;
}
/**
* @dev remove an account's access to this role
*/
function remove(Role storage role, address account) internal {
require(account != address(0));
require(has(role, account));
role.bearer[account] = false;
}
/**
* @dev check if an account has this role
* @return bool
*/
function has(Role storage role, address account) internal view returns (bool) {
require(account != address(0));
return role.bearer[account];
}
}
/**
* @title Roles contract
* @dev Base contract which allows children to implement role system.
* - Users can:
* # Add event minter if Event Minter or Admin
* # Add Admin if Admin
* # Check if addr is Admin
* # Check if addr is Event Minter for Event ID
* # Renounce Admin role
* # Renounce Event Minter role
* # Remove Event Minter if Admin
* @author POAP
* - Developers:
* # Agustin Lavarello
* # Rodrigo Manuel Navarro Lajous
* # Ramiro Gonzales
**/
contract PoapRoles is Initializable {
using Roles for Roles.Role;
/**
* @dev Emmited when an Admin is added
*/
event AdminAdded(address indexed account);
/**
* @dev Emmited when an Admin is removed
*/
event AdminRemoved(address indexed account);
/**
* @dev Emmited when an Event Minter is added
*/
event EventMinterAdded(uint256 indexed eventId, address indexed account);
/**
* @dev Emmited when an Event Minter is removed
*/
event EventMinterRemoved(uint256 indexed eventId, address indexed account);
Roles.Role private _admins;
mapping(uint256 => Roles.Role) private _minters;
function initialize(address sender) public initializer {
if (!isAdmin(sender)) {
_addAdmin(sender);
}
}
/**
* @dev Modifier to make a function callable only by the Admin.
*/
modifier onlyAdmin() {
require(isAdmin(msg.sender), "Sender is not Admin");
_;
}
/**
* @dev Modifier to make a function callable only by the Event Minter for especific Event Id.
* @param eventId ( uint256 ) The Event Id to check.
*/
modifier onlyEventMinter(uint256 eventId) {
require(isEventMinter(eventId, msg.sender), "Sender is not Event Minter");
_;
}
/**
* @dev Checks if address is Admin.
* @param account ( address ) The address to be checked.
* @return bool representing if the adddress is admin.
*/
function isAdmin(address account) public view returns (bool) {
return _admins.has(account);
}
/**
* @dev Checks if address is Event Minter for especific Event.
* @param eventId ( uint256 ) The Event ID to check.
* @param account ( address ) The address to be checked.
* @return bool representing if the adddress is Event Minter.
*/
function isEventMinter(uint256 eventId, address account) public view returns (bool) {
return isAdmin(account) || _minters[eventId].has(account);
}
/**
* @dev Function to add an Event Minter for especefic Event ID
* Requires
* - The msg sender to be the admin or Event Minter for the especific Event ID
* @param eventId ( uint256 ) The ID of the Event.
* @param account ( address ) The Address that will be granted permissions on the Event.
*/
function addEventMinter(uint256 eventId, address account) public onlyEventMinter(eventId) {
_addEventMinter(eventId, account);
}
/**
* @dev Function to add an Admin.
* Requires
* - The msg sender to be the admin.
* @param account ( address ) The Address that will be granted permissions as Admin.
*/
function addAdmin(address account) public onlyAdmin {
_addAdmin(account);
}
/**
* @dev Function renounce as Event Minter for especefic Event ID
* Requires
* - The msg sender to be an Event Minter for the especific Event ID
* @param eventId ( uint256 ) The ID of the Event.
*/
function renounceEventMinter(uint256 eventId) public {
_removeEventMinter(eventId, msg.sender);
}
/**
* @dev Function renounce as Admin
* Requires
* - The msg sender to be an Admin
*/
function renounceAdmin() public {
_removeAdmin(msg.sender);
}
/**
* @dev Function remove Event Minter for especif Event ID
* Requires
* - The msg sender to be an Admin
* @param eventId ( uint256 ) The ID of the Event.
* @param account ( address ) The Address that will be removed permissions as Event Minter for especific ID.
*/
function removeEventMinter(uint256 eventId, address account) public onlyAdmin {
_removeEventMinter(eventId, account);
}
/**
* @dev Internal function to add Event Minter
* @param eventId ( uint256 ) The ID of the Event.
* @param account ( address ) The Address that will be granted permissions on the Event.
*/
function _addEventMinter(uint256 eventId, address account) internal {
_minters[eventId].add(account);
emit EventMinterAdded(eventId, account);
}
/**
* @dev Internal function to add Admin
* @param account ( address ) The Address that will be granted permissions as Admin.
*/
function _addAdmin(address account) internal {
_admins.add(account);
emit AdminAdded(account);
}
/**
* @dev Internal function to remove Event Minter for especif Event ID
* @param eventId ( uint256 ) The ID of the Event.
* @param account ( address ) The Address that will be removed permissions as Event Minter for especific ID.
*/
function _removeEventMinter(uint256 eventId, address account) internal {
_minters[eventId].remove(account);
emit EventMinterRemoved(eventId, account);
}
/**
* @dev Internal function to remove an Admin
* @param account ( address ) The Address that will be removed permissions as Admin.
*/
function _removeAdmin(address account) internal {
_admins.remove(account);
emit AdminRemoved(account);
}
// For future extensions
uint256[50] private ______gap;
}
/**
* @title Pausable contract
* @dev Base contract which allows children to implement an emergency stop mechanism.
* - Users can:
* # Pause contract if admin
* # Unpause contract if admin
* @author POAP
* - Developers:
* # Agustin Lavarello
* # Rodrigo Manuel Navarro Lajous
* # Ramiro Gonzales
**/
contract PoapPausable is Initializable, PoapRoles {
/**
* @dev Emmited when contract is paused
*/
event Paused(address account);
/**
* @dev Emmited when contract is unpaused
*/
event Unpaused(address account);
// Boolean to save if contract is paused
bool private _paused;
function initialize() public initializer {
_paused = false;
}
/**
* @dev Get if contract is paused
* @return ( bool ) If contract is paused
*/
function paused() public view returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*/
modifier whenNotPaused() {
require(!_paused, "Contract is Paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*/
modifier whenPaused() {
require(_paused, "Contract is not Paused");
_;
}
/**
* @dev Called by the owner to pause, triggers stopped state.
* Requires
* - The msg sender to be the admin
* - The contract does not have to be paused
*/
function pause() public onlyAdmin whenNotPaused {
_paused = true;
emit Paused(msg.sender);
}
/**
* @dev Called by the owner to pause, triggers unstopped state.
* Requires
* - The msg sender to be the admin
* - The contract does not have to be paused
*/
function unpause() public onlyAdmin whenPaused {
_paused = false;
emit Unpaused(msg.sender);
}
// For future extensions
uint256[50] private ______gap;
}
/**
* @title POAP contract in xDai
* @dev Main point of interaction with POAP
* - Users can:
* # Add Event Organizer
* # Mint token for an event
* # Freeze token
* # Batch Mint
* # Burn Tokens if admin
* # Pause contract if admin
* # Unpause contract if admin
* # ERC721 full interface (base, metadata, enumerable)
* - To be covered by a proxy contract
* @author POAP
* - Developers:
* # Agustin Lavarello
* # Rodrigo Manuel Navarro Lajous
* # Ramiro Gonzales
**/
contract XPoap is Initializable, ERC721, ERC721Enumerable, PoapRoles, PoapPausable {
/**
* @dev Emmited when token is created
*/
event EventToken(uint256 indexed eventId, uint256 tokenId);
/**
* @dev Emmited when token is frozen
*/
event Frozen(uint256 id);
/**
* @dev Emmited when token is unfrozen by function call
*/
event Unfrozen(uint256 id);
// Token name
string private _name;
// Token symbol
string private _symbol;
// Base token URI
string private _baseURI;
// Last Used id (used to generate new ids)
uint256 public lastId;
// Event Id for each token
mapping(uint256 => uint256) private _tokenEvent;
bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;
// Frozen time for each token in seconds
mapping(uint256 => uint256) private _tokenFrozen;
// Frozen time for a token
uint256 public freezeDuration;
/**
* @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 Gets the Event Id for the token
* @param tokenId ( uint256 ) The Token Id you want to query
* @return ( uint256 ) representing the Event id for the token
*/
function tokenEvent(uint256 tokenId) public view returns (uint256) {
return _tokenEvent[tokenId];
}
/**
* @dev Gets the Token Id and Event Id for a given index of the tokens list of the requested owner
* @param owner ( address ) Owner address of the token list to be queried
* @param index ( uint256 ) Index to be accessed of the requested tokens list
* @return ( uint256, uint256 ) Token Id and Event Id for the given index of the tokens list owned by the requested address
*/
function tokenDetailsOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId, uint256 eventId) {
tokenId = tokenOfOwnerByIndex(owner, index);
eventId = tokenEvent(tokenId);
}
/**
* @dev Gets URI for the token metadata
* @param tokenId ( uint256 ) The Token Id you want to get the URI
* @return ( string ) URI for the token metadata
*/
function tokenURI(uint256 tokenId) external view returns (string memory) {
uint eventId = _tokenEvent[tokenId];
return _strConcat(_baseURI, _uint2str(eventId), "/", _uint2str(tokenId), "");
}
/**
* @dev Sets Base URI for the token metadata.
* Requires
* - The msg sender to be the admin
* - The contract does not have to be paused
* @param baseURI ( string ) The base URI to change
*/
function setBaseURI(string memory baseURI) public onlyAdmin whenNotPaused {
_baseURI = baseURI;
}
/**
* @dev Sets Last Id for minting.
* Requires
* - The msg sender to be the admin
* - The contract does not have to be paused
* @param newLastId ( uint256 ) The new Last Id
*/
function setLastId(uint256 newLastId) public onlyAdmin whenNotPaused {
require(lastId < newLastId, "New Id has to be higher");
lastId = newLastId;
}
/**
* @dev Approves another address to transfer the given token ID (Implements ERC71)
* Wrapper for function extended from ERC721 ( https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol )
* Requires
* - The msg sender to be the owner, approved, or operator
* - The contract does not have to be paused
* @param to ( address ) The addres 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 whenNotPaused {
super.approve(to, tokenId);
}
/**
* @dev Sets or unsets the approval of a given operator (Implements ERC71)
* Wrapper for function extended from ERC721 ( https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol )
* Requires
* - The msg sender to be the owner, approved, or operator
* - The contract does not have to be paused
* @param to ( address ) The address of the operator to set the approval
* @param approved ( bool ) Represents the status of the approval to be set
*/
function setApprovalForAll(address to, bool approved) public whenNotPaused {
super.setApprovalForAll(to, approved);
}
/**
* @dev Transfers the ownership of a given token ID to another address (Implements ERC71)
* Wrapper for function extended from ERC721 ( https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol )
* Requires
* - The msg sender to be the owner, approved, or operator
* - The contract does not have to be paused
* - The token to be transferred must not be frozen.
* @param from ( address ) The address of the current owner of the token
* @param to ( address ) The 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 whenNotPaused whenNotFrozen(tokenId) {
super.transferFrom(from, to, tokenId);
}
/**
* @dev Safely transfers the ownership of a given token ID to another address (Implements ERC71)
* Wrapper for function extended from ERC721 ( https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol )
* Requires
* - The msg sender to be the owner, approved, or operator
* - The contract does not have to be paused
* - The token to be transferred must not be frozen.
* @param from ( address ) The address of the current owner of the token
* @param to ( address ) The 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 whenNotPaused whenNotFrozen(tokenId) {
super.safeTransferFrom(from, to, tokenId);
}
/**
* @dev Safely transfers the ownership of a given token ID to another address (Implements ERC71)
* Wrapper for function extended from ERC721 ( https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol )
* Requires
* - The msg sender to be the owner, approved, or operator
* - The contract does not have to be paused
* - The token to be transferred must not be frozen.
* @param from ( address ) The address of the current owner of the token
* @param to ( address ) The 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 whenNotPaused whenNotFrozen(tokenId) {
super.safeTransferFrom(from, to, tokenId, _data);
}
/**
* @dev Mint token to address.
* Requires
* - The msg sender to be the admin, or event minter for the specific event Id
* - The contract does not have to be paused
* @param eventId ( uint256 ) EventId for the new token
* @param to ( address ) The address that will receive the minted tokens.
* @return A boolean that indicates if the operation was successful.
*/
function mintToken(uint256 eventId, address to)
public whenNotPaused onlyEventMinter(eventId) returns (bool)
{
// Updates Last Id first to not overlap
lastId += 1;
return _mintToken(eventId, lastId, to);
}
/**
* @dev Mint token to many addresses.
* Requires
* - The msg sender to be the admin, or event minter for the specific event Id
* - The contract does not have to be paused
* @param eventId ( uint256 ) EventId for the new token
* @param to ( array of address ) The addresses that will receive the minted tokens.
* @return A boolean that indicates if the operation was successful.
*/
function mintEventToManyUsers(uint256 eventId, address[] memory to)
public whenNotPaused onlyEventMinter(eventId) returns (bool)
{
// First mint all tokens
for (uint256 i = 0; i < to.length; ++i) {
_mintToken(eventId, lastId + 1 + i, to[i]);
}
// Last update Last Id with the Events Id
lastId += to.length;
return true;
}
/**
* @dev Mint many tokens to address.
* Requires
* - The msg sender to be the admin
* - The contract does not have to be paused
* @param eventIds ( array uint256 ) Event Ids to assing to user
* @param to ( address ) The address that will receive the minted tokens.
* @return A boolean that indicates if the operation was successful.
*/
function mintUserToManyEvents(uint256[] memory eventIds, address to)
public whenNotPaused onlyAdmin() returns (bool)
{
// First mint all tokens
for (uint256 i = 0; i < eventIds.length; ++i) {
_mintToken(eventIds[i], lastId + 1 + i, to);
}
// Last update Last Id with the Events Id
lastId += eventIds.length;
return true;
}
/**
* @dev Burns a specific ERC721 token.
* Requires
* - The msg sender to be the owner, approved, or admin
* @param tokenId ( uint256 ) Id of the ERC721 token to be burned.
*/
function burn(uint256 tokenId) public {
require(_isApprovedOrOwner(msg.sender, tokenId) || isAdmin(msg.sender), "Sender doesn't have permission");
_burn(tokenId);
}
function initialize(string memory __name, string memory __symbol, string memory __baseURI, address[] memory admins)
public initializer
{
ERC721.initialize();
ERC721Enumerable.initialize();
PoapRoles.initialize(msg.sender);
PoapPausable.initialize();
// Add the requested admins
for (uint256 i = 0; i < admins.length; ++i) {
_addAdmin(admins[i]);
}
_name = __name;
_symbol = __symbol;
_baseURI = __baseURI;
// Register the supported interfaces to conform to ERC721 via ERC165
_registerInterface(_INTERFACE_ID_ERC721_METADATA);
}
/**
* @dev Internal function to burn a specific token
* - Reverts if the token does not exist
* @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);
delete _tokenEvent[tokenId];
delete _tokenFrozen[tokenId];
}
/**
* @dev Internal function to mint tokens
* @param eventId ( uint256 ) EventId for the new token
* @param tokenId ( uint256 ) The token id to mint.
* @param to ( address ) The address that will receive the minted tokens.
* @return A boolean that indicates if the operation was successful.
*/
function _mintToken(uint256 eventId, uint256 tokenId, address to) internal returns (bool) {
_mint(to, tokenId);
_tokenEvent[tokenId] = eventId;
emit EventToken(eventId, tokenId);
return true;
}
/**
* @dev Function to convert uint to string
* Taken from https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol
*/
function _uint2str(uint _i) internal pure returns (string memory _uintAsString) {
if (_i == 0) {
return "0";
}
uint j = _i;
uint len;
while (j != 0) {
len++;
j /= 10;
}
bytes memory bstr = new bytes(len);
uint k = len - 1;
while (_i != 0) {
bstr[k--] = byte(uint8(48 + _i % 10));
_i /= 10;
}
return string(bstr);
}
/**
* @dev Function to concat strings
* Taken from https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol
*/
function _strConcat(string memory _a, string memory _b, string memory _c, string memory _d, string memory _e)
internal pure returns (string memory _concatenatedString)
{
bytes memory _ba = bytes(_a);
bytes memory _bb = bytes(_b);
bytes memory _bc = bytes(_c);
bytes memory _bd = bytes(_d);
bytes memory _be = bytes(_e);
string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
bytes memory babcde = bytes(abcde);
uint k = 0;
uint i = 0;
for (i = 0; i < _ba.length; i++) {
babcde[k++] = _ba[i];
}
for (i = 0; i < _bb.length; i++) {
babcde[k++] = _bb[i];
}
for (i = 0; i < _bc.length; i++) {
babcde[k++] = _bc[i];
}
for (i = 0; i < _bd.length; i++) {
babcde[k++] = _bd[i];
}
for (i = 0; i < _be.length; i++) {
babcde[k++] = _be[i];
}
return string(babcde);
}
/**
* @dev Gets the freeze time for the token
* @param tokenId ( uint256 ) The token id to freeze.
* @return uint256 representing the token freeze time
*/
function getFreezeTime(uint256 tokenId) public view returns (uint256) {
return _tokenFrozen[tokenId];
}
/**
* @dev Gets the token freeze status
* @param tokenId ( uint256 ) The token id to freeze.
* @return bool representing the token freeze status
*/
function isFrozen(uint256 tokenId) external view returns (bool) {
return _tokenFrozen[tokenId] >= block.timestamp;
}
/**
* @dev Modifier to make a function callable only when the toke is not frozen.
* @param tokenId ( uint256 ) The token id to check.
*/
modifier whenNotFrozen(uint256 tokenId) {
require(!this.isFrozen(tokenId), "Token is frozen");
_;
}
/**
* @dev Modifier to make a function callable only when the token is frozen.
* @param tokenId ( uint256 ) The token id to check.
*/
modifier whenFrozen(uint256 tokenId) {
require(this.isFrozen(tokenId), "Token is not frozen");
_;
}
/**
* @dev Called by the owner to set the time a token can be frozen.
* Requires
* - The msg sender to be the admin
* - The contract does not have to be paused
* @param time ( uint256 ) Time that the token will be frozen.
*/
function setFreezeDuration(uint256 time) public onlyAdmin whenNotPaused {
freezeDuration = time * 1 seconds;
}
/**
* @dev Freeze a specific ERC721 token.
* Requires
* - The msg sender to be the admin, owner, approved, or operator
* - The contract does not have to be paused
* - The token does not have to be frozen
* @param tokenId ( uint256 ) Id of the ERC721 token to be frozen.
*/
function freeze(uint256 tokenId) public whenNotPaused whenNotFrozen(tokenId) {
require(_isApprovedOrOwner(msg.sender, tokenId) || isAdmin(msg.sender), "Sender doesn't have permission");
_freeze(tokenId);
}
/**
* @dev Unfreeze a specific ERC721 token.
* Requires
* - The msg sender to be the admin
* - The contract does not have to be paused
* - The token must be frozen
* @param tokenId ( uint256 ) Id of the ERC721 token to be unfrozen.
*/
function unfreeze(uint256 tokenId) public onlyAdmin() whenNotPaused whenFrozen(tokenId) {
_unfreeze(tokenId);
}
/**
* @dev Internal function to freeze a specific token
* @param tokenId ( uint256 ) Id of the token being frozen by the msg.sender
*/
function _freeze(uint256 tokenId) internal {
_tokenFrozen[tokenId] = block.timestamp + freezeDuration;
emit Frozen(tokenId);
}
/**
* @dev Internal function to freeze a specific token
* @param tokenId ( uint256 ) Id of the token being frozen by the msg.sender
*/
function _unfreeze(uint256 tokenId) internal {
delete _tokenFrozen[tokenId];
emit Unfrozen(tokenId);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":true,"inputs":[{"name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"eventId","type":"uint256"}],"name":"renounceEventMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"tokenEvent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"eventId","type":"uint256"},{"name":"account","type":"address"}],"name":"removeEventMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newLastId","type":"uint256"}],"name":"setLastId","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isAdmin","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"eventId","type":"uint256"},{"name":"to","type":"address[]"}],"name":"mintEventToManyUsers","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"eventId","type":"uint256"},{"name":"account","type":"address"}],"name":"isEventMinter","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"freezeDuration","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"unfreeze","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"index","type":"uint256"}],"name":"tokenDetailsOfOwnerByIndex","outputs":[{"name":"tokenId","type":"uint256"},{"name":"eventId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"time","type":"uint256"}],"name":"setFreezeDuration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"__name","type":"string"},{"name":"__symbol","type":"string"},{"name":"__baseURI","type":"string"},{"name":"admins","type":"address[]"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"getFreezeTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"eventId","type":"uint256"},{"name":"account","type":"address"}],"name":"addEventMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"isFrozen","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"eventId","type":"uint256"},{"name":"to","type":"address"}],"name":"mintToken","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lastId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"freeze","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"eventIds","type":"uint256[]"},{"name":"to","type":"address"}],"name":"mintUserToManyEvents","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"eventId","type":"uint256"},{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"EventToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint256"}],"name":"Frozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint256"}],"name":"Unfrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"AdminRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"eventId","type":"uint256"},{"indexed":true,"name":"account","type":"address"}],"name":"EventMinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"eventId","type":"uint256"},{"indexed":true,"name":"account","type":"address"}],"name":"EventMinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]Contract Creation Code
608060405234801561001057600080fd5b5061556f806100206000396000f3fe608060405234801561001057600080fd5b5060043610610291576000357c0100000000000000000000000000000000000000000000000000000000900480636623fc461161016e5780639cd3cad6116100e0578063c1292cc3116100a4578063c1292cc314611111578063c4d66de81461112f578063c87b56dd14611173578063d7a78db81461121a578063e985e9c514611248578063f980f3dc146112c457610291565b80639cd3cad614610ec2578063a089479914610f10578063a140ae2314610f56578063a22cb46514610fbc578063b88d4fde1461100c57610291565b80638129fc1c116101325780638129fc1c14610b625780638456cb5914610b6c5780638bad0c0a14610b765780638d23209414610b8057806390fdd89714610dfd57806395d89b4114610e3f57610291565b80636623fc4614610a0157806367e971ce14610a2f5780636ca2aa9514610a985780637048027514610ac657806370a0823114610b0a57610291565b8063278d9c411161020757806342966c68116101cb57806342966c6814610828578063440991bd146108565780634f6ccce71461087457806355f804b3146108b65780635c975abb146109715780636352211e1461099357610291565b8063278d9c411461060e57806328db38b4146106e85780632f745c591461074e5780633f4ba83a146107b057806342842e0e146107ba57610291565b8063127a529811610259578063127a529814610468578063166c4b05146104aa57806318160ddd146104f85780631a27e85f1461051657806323b872dd1461054457806324d7806c146105b257610291565b806301ffc9a71461029657806302c37ddc146102fb57806306fdde0314610329578063081812fc146103ac578063095ea7b31461041a575b600080fd5b6102e1600480360360208110156102ac57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506113b4565b604051808215151515815260200191505060405180910390f35b6103276004803603602081101561031157600080fd5b810190808035906020019092919050505061141c565b005b610331611429565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610371578082015181840152602081019050610356565b50505050905090810190601f16801561039e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103d8600480360360208110156103c257600080fd5b81019080803590602001909291905050506114cc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104666004803603604081101561043057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061151d565b005b6104946004803603602081101561047e57600080fd5b81019080803590602001909291905050506115b1565b6040518082815260200191505060405180910390f35b6104f6600480360360408110156104c057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115cf565b005b61050061165a565b6040518082815260200191505060405180910390f35b6105426004803603602081101561052c57600080fd5b8101908080359060200190929190505050611667565b005b6105b06004803603606081101561055a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ef565b005b6105f4600480360360208110156105c857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a4565b604051808215151515815260200191505060405180910390f35b6106ce6004803603604081101561062457600080fd5b81019080803590602001909291908035906020019064010000000081111561064b57600080fd5b82018360208201111561065d57600080fd5b8035906020019184602083028401116401000000008311171561067f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506119c1565b604051808215151515815260200191505060405180910390f35b610734600480360360408110156106fe57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b2b565b604051808215151515815260200191505060405180910390f35b61079a6004803603604081101561076457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b6a565b6040518082815260200191505060405180910390f35b6107b8611be1565b005b610826600480360360608110156107d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d64565b005b6108546004803603602081101561083e57600080fd5b8101908080359060200190929190505050611f19565b005b61085e611fb3565b6040518082815260200191505060405180910390f35b6108a06004803603602081101561088a57600080fd5b8101908080359060200190929190505050611fba565b6040518082815260200191505060405180910390f35b61096f600480360360208110156108cc57600080fd5b81019080803590602001906401000000008111156108e957600080fd5b8201836020820111156108fb57600080fd5b8035906020019184600183028401116401000000008311171561091d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611ff2565b005b610979612110565b604051808215151515815260200191505060405180910390f35b6109bf600480360360208110156109a957600080fd5b8101908080359060200190929190505050612128565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a2d60048036036020811015610a1757600080fd5b81019080803590602001909291905050506121a6565b005b610a7b60048036036040811015610a4557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506123d3565b604051808381526020018281526020019250505060405180910390f35b610ac460048036036020811015610aae57600080fd5b81019080803590602001909291905050506123f4565b005b610b0860048036036020811015610adc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612505565b005b610b4c60048036036020811015610b2057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061258e565b6040518082815260200191505060405180910390f35b610b6a612619565b005b610b74612727565b005b610b7e6128ab565b005b610dfb60048036036080811015610b9657600080fd5b8101908080359060200190640100000000811115610bb357600080fd5b820183602082011115610bc557600080fd5b80359060200191846001830284011164010000000083111715610be757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b80359060200191846001830284011164010000000083111715610c7e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ce157600080fd5b820183602082011115610cf357600080fd5b80359060200191846001830284011164010000000083111715610d1557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610d7857600080fd5b820183602082011115610d8a57600080fd5b80359060200191846020830284011164010000000083111715610dac57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506128b6565b005b610e2960048036036020811015610e1357600080fd5b8101908080359060200190929190505050612a7c565b6040518082815260200191505060405180910390f35b610e47612a9a565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e87578082015181840152602081019050610e6c565b50505050905090810190601f168015610eb45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610f0e60048036036040811015610ed857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b3d565b005b610f3c60048036036020811015610f2657600080fd5b8101908080359060200190929190505050612bcb565b604051808215151515815260200191505060405180910390f35b610fa260048036036040811015610f6c57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612bec565b604051808215151515815260200191505060405180910390f35b61100a60048036036040811015610fd257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612d1c565b005b61110f6004803603608081101561102257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108957600080fd5b82018360208201111561109b57600080fd5b803590602001918460018302840111640100000000831117156110bd57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612db0565b005b611119612f67565b6040518082815260200191505060405180910390f35b6111716004803603602081101561114557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f6e565b005b61119f6004803603602081101561118957600080fd5b810190808035906020019092919050505061307a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156111df5780820151818401526020810190506111c4565b50505050905090810190601f16801561120c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6112466004803603602081101561123057600080fd5b810190808035906020019092919050505061319a565b005b6112aa6004803603604081101561125e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133d9565b604051808215151515815260200191505060405180910390f35b61139a600480360360408110156112da57600080fd5b81019080803590602001906401000000008111156112f757600080fd5b82018360208201111561130957600080fd5b8035906020019184602083028401116401000000008311171561132b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061346d565b604051808215151515815260200191505060405180910390f35b600060336000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b61142681336135d4565b50565b60606101398054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c25780601f10611497576101008083540402835291602001916114c2565b820191906000526020600020905b8154815290600101906020018083116114a557829003601f168201915b5050505050905090565b60006114d782613641565b15156114e257600080fd5b6067600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61010660009054906101000a900460ff161515156115a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b6115ad82826136b3565b5050565b600061013d6000838152602001908152602001600020549050919050565b6115d8336119a4565b151561164c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742041646d696e0000000000000000000000000081525060200191505060405180910390fd5b61165682826135d4565b5050565b6000609e80549050905090565b611670336119a4565b15156116e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742041646d696e0000000000000000000000000081525060200191505060405180910390fd5b61010660009054906101000a900460ff1615151561176a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b8061013c541015156117e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e65772049642068617320746f2062652068696768657200000000000000000081525060200191505060405180910390fd5b8061013c8190555050565b61010660009054906101000a900460ff16151515611875576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b803073ffffffffffffffffffffffffffffffffffffffff1663a0894799826040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b1580156118e357600080fd5b505afa1580156118f7573d6000803e3d6000fd5b505050506040513d602081101561190d57600080fd5b8101908080519060200190929190505050151515611993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f546f6b656e2069732066726f7a656e000000000000000000000000000000000081525060200191505060405180910390fd5b61199e8484846137f8565b50505050565b60006119ba8260d261381d90919063ffffffff16565b9050919050565b600061010660009054906101000a900460ff16151515611a49576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b82611a548133611b2b565b1515611ac8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f53656e646572206973206e6f74204576656e74204d696e74657200000000000081525060200191505060405180910390fd5b60008090505b8351811015611b0d57611b018582600161013c5401018684815181101515611af257fe5b906020019060200201516138b1565b50806001019050611ace565b50825161013c60008282540192505081905550600191505092915050565b6000611b36826119a4565b80611b625750611b618260d3600086815260200190815260200160002061381d90919063ffffffff16565b5b905092915050565b6000611b758361258e565b82101515611b8257600080fd5b609c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515611bce57fe5b9060005260206000200154905092915050565b611bea336119a4565b1515611c5e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742041646d696e0000000000000000000000000081525060200191505060405180910390fd5b61010660009054906101000a900460ff161515611ce3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f436f6e7472616374206973206e6f74205061757365640000000000000000000081525060200191505060405180910390fd5b600061010660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b61010660009054906101000a900460ff16151515611dea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b803073ffffffffffffffffffffffffffffffffffffffff1663a0894799826040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b158015611e5857600080fd5b505afa158015611e6c573d6000803e3d6000fd5b505050506040513d6020811015611e8257600080fd5b8101908080519060200190929190505050151515611f08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f546f6b656e2069732066726f7a656e000000000000000000000000000000000081525060200191505060405180910390fd5b611f13848484613919565b50505050565b611f23338261393a565b80611f335750611f32336119a4565b5b1515611fa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f53656e64657220646f65736e27742068617665207065726d697373696f6e000081525060200191505060405180910390fd5b611fb0816139cf565b50565b61013f5481565b6000611fc461165a565b82101515611fd157600080fd5b609e82815481101515611fe057fe5b90600052602060002001549050919050565b611ffb336119a4565b151561206f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742041646d696e0000000000000000000000000081525060200191505060405180910390fd5b61010660009054906101000a900460ff161515156120f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b8061013b908051906020019061210c929190615444565b5050565b600061010660009054906101000a900460ff16905090565b6000806066600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561219d57600080fd5b80915050919050565b6121af336119a4565b1515612223576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742041646d696e0000000000000000000000000081525060200191505060405180910390fd5b61010660009054906101000a900460ff161515156122a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b803073ffffffffffffffffffffffffffffffffffffffff1663a0894799826040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b15801561231757600080fd5b505afa15801561232b573d6000803e3d6000fd5b505050506040513d602081101561234157600080fd5b810190808051906020019092919050505015156123c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f546f6b656e206973206e6f742066726f7a656e0000000000000000000000000081525060200191505060405180910390fd5b6123cf826139e4565b5050565b6000806123e08484611b6a565b91506123eb826115b1565b90509250929050565b6123fd336119a4565b1515612471576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742041646d696e0000000000000000000000000081525060200191505060405180910390fd5b61010660009054906101000a900460ff161515156124f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b6001810261013f8190555050565b61250e336119a4565b1515612582576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742041646d696e0000000000000000000000000081525060200191505060405180910390fd5b61258b81613a36565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156125cb57600080fd5b612612606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613a90565b9050919050565b600060019054906101000a900460ff16806126385750612637613a9e565b5b8061264f57506000809054906101000a900460ff16155b15156126a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615516602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1690506001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff021916908315150217905550600061010660006101000a81548160ff02191690831515021790555080600060016101000a81548160ff02191690831515021790555050565b612730336119a4565b15156127a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742041646d696e0000000000000000000000000081525060200191505060405180910390fd5b61010660009054906101000a900460ff1615151561282a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b600161010660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6128b433613aaf565b565b600060019054906101000a900460ff16806128d557506128d4613a9e565b5b806128ec57506000809054906101000a900460ff16155b1515612943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615516602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1690506001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff021916908315150217905550612993613b09565b61299b613c2f565b6129a433612f6e565b6129ac612619565b60008090505b82518110156129e6576129db83828151811015156129cc57fe5b90602001906020020151613a36565b8060010190506129b2565b508461013990805190602001906129fe929190615444565b508361013a9080519060200190612a16929190615444565b508261013b9080519060200190612a2e929190615444565b50612a5b635b5e139f7c010000000000000000000000000000000000000000000000000000000002613d60565b80600060016101000a81548160ff0219169083151502179055505050505050565b600061013e6000838152602001908152602001600020549050919050565b606061013a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b335780601f10612b0857610100808354040283529160200191612b33565b820191906000526020600020905b815481529060010190602001808311612b1657829003601f168201915b5050505050905090565b81612b488133611b2b565b1515612bbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f53656e646572206973206e6f74204576656e74204d696e74657200000000000081525060200191505060405180910390fd5b612bc68383613e1e565b505050565b60004261013e60008481526020019081526020016000205410159050919050565b600061010660009054906101000a900460ff16151515612c74576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b82612c7f8133611b2b565b1515612cf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f53656e646572206973206e6f74204576656e74204d696e74657200000000000081525060200191505060405180910390fd5b600161013c60008282540192505081905550612d138461013c54856138b1565b91505092915050565b61010660009054906101000a900460ff16151515612da2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b612dac8282613e8b565b5050565b61010660009054906101000a900460ff16151515612e36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff1663a0894799826040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b158015612ea457600080fd5b505afa158015612eb8573d6000803e3d6000fd5b505050506040513d6020811015612ece57600080fd5b8101908080519060200190929190505050151515612f54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f546f6b656e2069732066726f7a656e000000000000000000000000000000000081525060200191505060405180910390fd5b612f6085858585613fc7565b5050505050565b61013c5481565b600060019054906101000a900460ff1680612f8d5750612f8c613a9e565b5b80612fa457506000809054906101000a900460ff16155b1515612ffb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615516602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1690506001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff02191690831515021790555061304c826119a4565b151561305c5761305b82613a36565b5b80600060016101000a81548160ff0219169083151502179055505050565b6060600061013d600084815260200190815260200160002054905061319261013b8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561312f5780601f106131045761010080835404028352916020019161312f565b820191906000526020600020905b81548152906001019060200180831161311257829003601f168201915b505050505061313d83613fef565b6040805190810160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061317c87613fef565b6020604051908101604052806000815250614148565b915050919050565b61010660009054906101000a900460ff16151515613220576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b803073ffffffffffffffffffffffffffffffffffffffff1663a0894799826040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b15801561328e57600080fd5b505afa1580156132a2573d6000803e3d6000fd5b505050506040513d60208110156132b857600080fd5b810190808051906020019092919050505015151561333e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f546f6b656e2069732066726f7a656e000000000000000000000000000000000081525060200191505060405180910390fd5b613348338361393a565b806133585750613357336119a4565b5b15156133cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f53656e64657220646f65736e27742068617665207065726d697373696f6e000081525060200191505060405180910390fd5b6133d582614563565b5050565b6000606960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600061010660009054906101000a900460ff161515156134f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b6134fe336119a4565b1515613572576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742041646d696e0000000000000000000000000081525060200191505060405180910390fd5b60008090505b83518110156135b7576135ab848281518110151561359257fe5b9060200190602002015182600161013c540101856138b1565b50806001019050613578565b50825161013c600082825401925050819055506001905092915050565b6135f98160d360008581526020019081526020016000206145bb90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff16827fb6882c4d609d560f6d57e78e73dd96027f0d9852739b0b922537a6dd3c8e944c60405160405180910390a35050565b6000806066600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b60006136be82612128565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156136fb57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061373b575061373a81336133d9565b5b151561374657600080fd5b826067600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b613802338261393a565b151561380d57600080fd5b61381883838361466a565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561385a57600080fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006138bd828461468e565b8361013d600085815260200190815260200160002081905550837f4b3711cd7ece062b0828c1b6e08d814a72d4c003383a016c833cbb1b45956e34846040518082815260200191505060405180910390a2600190509392505050565b6139358383836020604051908101604052806000815250612db0565b505050565b60008061394683612128565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806139b557508373ffffffffffffffffffffffffffffffffffffffff1661399d846114cc565b73ffffffffffffffffffffffffffffffffffffffff16145b806139c657506139c581856133d9565b5b91505092915050565b6139e16139db82612128565b826146af565b50565b61013e6000828152602001908152602001600020600090557f083eea12772ab70fba01c8212d02f3bc5dc29b8540dcdc84298e5dfa22731b92816040518082815260200191505060405180910390a150565b613a4a8160d26146ed90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33960405160405180910390a250565b600081600001549050919050565b600080303b90506000811491505090565b613ac38160d26145bb90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f60405160405180910390a250565b600060019054906101000a900460ff1680613b285750613b27613a9e565b5b80613b3f57506000809054906101000a900460ff16155b1515613b96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615516602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1690506001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff021916908315150217905550613be661479d565b613c126380ac58cd7c010000000000000000000000000000000000000000000000000000000002613d60565b80600060016101000a81548160ff02191690831515021790555050565b600060019054906101000a900460ff1680613c4e5750613c4d613a9e565b5b80613c6557506000809054906101000a900460ff16155b1515613cbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615516602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1690506001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff021916908315150217905550613d0c6148bb565b1515613d1757600080fd5b613d4363780e9d637c010000000000000000000000000000000000000000000000000000000002613d60565b80600060016101000a81548160ff02191690831515021790555050565b63ffffffff7c010000000000000000000000000000000000000000000000000000000002817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614151515613db157600080fd5b600160336000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b613e438160d360008581526020019081526020016000206146ed90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff16827fe1bd660d9f7c60e6fb12dd6479fdde12d21fc96385dc7b9b022c0b2f319e739160405160405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613ec657600080fd5b80606960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b613fd28484846117ef565b613fde848484846148ee565b1515613fe957600080fd5b50505050565b60606000821415614037576040805190810160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614143565b600082905060005b600082141515614065578080600101915050600a8281151561405d57fe5b04915061403f565b6060816040519080825280601f01601f19166020018201604052801561409a5781602001600182028038833980820191505090505b50905060006001830390505b60008614151561413b57600a868115156140bc57fe5b066030017f0100000000000000000000000000000000000000000000000000000000000000028282806001900393508151811015156140f757fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8681151561413357fe5b0495506140a6565b819450505050505b919050565b6060808690506060869050606086905060608690506060869050606081518351855187518951010101016040519080825280601f01601f1916602001820160405280156141a45781602001600182028038833980820191505090505b509050606081905060008090506000809050600090505b885181101561426e5788818151811015156141d257fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838380600101945081518110151561423157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506141bb565b600090505b875181101561432657878181518110151561428a57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000283838060010194508151811015156142e957fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050614273565b600090505b86518110156143de57868181518110151561434257fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000283838060010194508151811015156143a157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505061432b565b600090505b85518110156144965785818151811015156143fa57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838380600101945081518110151561445957fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506143e3565b600090505b845181101561454e5784818151811015156144b257fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838380600101945081518110151561451157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505061449b565b82995050505050505050505095945050505050565b61013f54420161013e6000838152602001908152602001600020819055507f4d69b51fee53c28bd8b61fe008151577ca65160b5248f6225e74d64fd4cf7328816040518082815260200191505060405180910390a150565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156145f757600080fd5b614601828261381d565b151561460c57600080fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b614675838383614b11565b61467f8382614cd8565b6146898282614e7c565b505050565b6146988282614f43565b6146a28282614e7c565b6146ab8161508d565b5050565b6146b982826150d9565b61013d60008281526020019081526020016000206000905561013e6000828152602001908152602001600020600090555050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561472957600080fd5b614733828261381d565b15151561473f57600080fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600060019054906101000a900460ff16806147bc57506147bb613a9e565b5b806147d357506000809054906101000a900460ff16155b151561482a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615516602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1690506001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff02191690831515021790555061489e6301ffc9a77c010000000000000000000000000000000000000000000000000000000002613d60565b80600060016101000a81548160ff02191690831515021790555050565b60006148e96380ac58cd7c0100000000000000000000000000000000000000000000000000000000026113b4565b905090565b600061490f8473ffffffffffffffffffffffffffffffffffffffff16615113565b151561491e5760019050614b09565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a02338887876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614a155780820151818401526020810190506149fa565b50505050905090810190601f168015614a425780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015614a6457600080fd5b505af1158015614a78573d6000803e3d6000fd5b505050506040513d6020811015614a8e57600080fd5b8101908080519060200190929190505050905063150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16614b3182612128565b73ffffffffffffffffffffffffffffffffffffffff16141515614b5357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614b8f57600080fd5b614b9881615126565b614bdf606860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206151e6565b614c26606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020615209565b816066600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000614d306001609c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061521f90919063ffffffff16565b90506000609d60008481526020019081526020016000205490508181141515614e23576000609c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515614da157fe5b9060005260206000200154905080609c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515614dfb57fe5b906000526020600020018190555081609d600083815260200190815260200160002081905550505b609c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003614e7591906154c4565b5050505050565b609c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050609d600083815260200190815260200160002081905550609c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614f7f57600080fd5b614f8881613641565b151515614f9457600080fd5b816066600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061502d606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020615209565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b609e80549050609f600083815260200190815260200160002081905550609e81908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b6150e38282615241565b6150ed8282614cd8565b6000609d60008381526020019081526020016000208190555061510f81615386565b5050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff166067600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156151e35760006067600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6151fe6001826000015461521f90919063ffffffff16565b816000018190555050565b6001816000016000828254019250508190555050565b600082821115151561523057600080fd5b600082840390508091505092915050565b8173ffffffffffffffffffffffffffffffffffffffff1661526182612128565b73ffffffffffffffffffffffffffffffffffffffff1614151561528357600080fd5b61528c81615126565b6152d3606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206151e6565b60006066600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006153a16001609e8054905061521f90919063ffffffff16565b90506000609f60008481526020019081526020016000205490506000609e838154811015156153cc57fe5b9060005260206000200154905080609e838154811015156153e957fe5b906000526020600020018190555081609f600083815260200190815260200160002081905550609e80548091906001900361542491906154c4565b506000609f60008681526020019081526020016000208190555050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061548557805160ff19168380011785556154b3565b828001600101855582156154b3579182015b828111156154b2578251825591602001919060010190615497565b5b5090506154c091906154f0565b5090565b8154818355818111156154eb578183600052602060002091820191016154ea91906154f0565b5b505050565b61551291905b8082111561550e5760008160009055506001016154f6565b5090565b9056fe436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564a165627a7a72305820961e4e74587f02dad4bdd3586dfc026793bb8815fa11cb7b3788b3395ae3b6da0029
Deployed Bytecode
0x608060405234801561001057600080fd5b5060043610610291576000357c0100000000000000000000000000000000000000000000000000000000900480636623fc461161016e5780639cd3cad6116100e0578063c1292cc3116100a4578063c1292cc314611111578063c4d66de81461112f578063c87b56dd14611173578063d7a78db81461121a578063e985e9c514611248578063f980f3dc146112c457610291565b80639cd3cad614610ec2578063a089479914610f10578063a140ae2314610f56578063a22cb46514610fbc578063b88d4fde1461100c57610291565b80638129fc1c116101325780638129fc1c14610b625780638456cb5914610b6c5780638bad0c0a14610b765780638d23209414610b8057806390fdd89714610dfd57806395d89b4114610e3f57610291565b80636623fc4614610a0157806367e971ce14610a2f5780636ca2aa9514610a985780637048027514610ac657806370a0823114610b0a57610291565b8063278d9c411161020757806342966c68116101cb57806342966c6814610828578063440991bd146108565780634f6ccce71461087457806355f804b3146108b65780635c975abb146109715780636352211e1461099357610291565b8063278d9c411461060e57806328db38b4146106e85780632f745c591461074e5780633f4ba83a146107b057806342842e0e146107ba57610291565b8063127a529811610259578063127a529814610468578063166c4b05146104aa57806318160ddd146104f85780631a27e85f1461051657806323b872dd1461054457806324d7806c146105b257610291565b806301ffc9a71461029657806302c37ddc146102fb57806306fdde0314610329578063081812fc146103ac578063095ea7b31461041a575b600080fd5b6102e1600480360360208110156102ac57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506113b4565b604051808215151515815260200191505060405180910390f35b6103276004803603602081101561031157600080fd5b810190808035906020019092919050505061141c565b005b610331611429565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610371578082015181840152602081019050610356565b50505050905090810190601f16801561039e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103d8600480360360208110156103c257600080fd5b81019080803590602001909291905050506114cc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104666004803603604081101561043057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061151d565b005b6104946004803603602081101561047e57600080fd5b81019080803590602001909291905050506115b1565b6040518082815260200191505060405180910390f35b6104f6600480360360408110156104c057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115cf565b005b61050061165a565b6040518082815260200191505060405180910390f35b6105426004803603602081101561052c57600080fd5b8101908080359060200190929190505050611667565b005b6105b06004803603606081101561055a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117ef565b005b6105f4600480360360208110156105c857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a4565b604051808215151515815260200191505060405180910390f35b6106ce6004803603604081101561062457600080fd5b81019080803590602001909291908035906020019064010000000081111561064b57600080fd5b82018360208201111561065d57600080fd5b8035906020019184602083028401116401000000008311171561067f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506119c1565b604051808215151515815260200191505060405180910390f35b610734600480360360408110156106fe57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b2b565b604051808215151515815260200191505060405180910390f35b61079a6004803603604081101561076457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b6a565b6040518082815260200191505060405180910390f35b6107b8611be1565b005b610826600480360360608110156107d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d64565b005b6108546004803603602081101561083e57600080fd5b8101908080359060200190929190505050611f19565b005b61085e611fb3565b6040518082815260200191505060405180910390f35b6108a06004803603602081101561088a57600080fd5b8101908080359060200190929190505050611fba565b6040518082815260200191505060405180910390f35b61096f600480360360208110156108cc57600080fd5b81019080803590602001906401000000008111156108e957600080fd5b8201836020820111156108fb57600080fd5b8035906020019184600183028401116401000000008311171561091d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611ff2565b005b610979612110565b604051808215151515815260200191505060405180910390f35b6109bf600480360360208110156109a957600080fd5b8101908080359060200190929190505050612128565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a2d60048036036020811015610a1757600080fd5b81019080803590602001909291905050506121a6565b005b610a7b60048036036040811015610a4557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506123d3565b604051808381526020018281526020019250505060405180910390f35b610ac460048036036020811015610aae57600080fd5b81019080803590602001909291905050506123f4565b005b610b0860048036036020811015610adc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612505565b005b610b4c60048036036020811015610b2057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061258e565b6040518082815260200191505060405180910390f35b610b6a612619565b005b610b74612727565b005b610b7e6128ab565b005b610dfb60048036036080811015610b9657600080fd5b8101908080359060200190640100000000811115610bb357600080fd5b820183602082011115610bc557600080fd5b80359060200191846001830284011164010000000083111715610be757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b80359060200191846001830284011164010000000083111715610c7e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610ce157600080fd5b820183602082011115610cf357600080fd5b80359060200191846001830284011164010000000083111715610d1557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610d7857600080fd5b820183602082011115610d8a57600080fd5b80359060200191846020830284011164010000000083111715610dac57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506128b6565b005b610e2960048036036020811015610e1357600080fd5b8101908080359060200190929190505050612a7c565b6040518082815260200191505060405180910390f35b610e47612a9a565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e87578082015181840152602081019050610e6c565b50505050905090810190601f168015610eb45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610f0e60048036036040811015610ed857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b3d565b005b610f3c60048036036020811015610f2657600080fd5b8101908080359060200190929190505050612bcb565b604051808215151515815260200191505060405180910390f35b610fa260048036036040811015610f6c57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612bec565b604051808215151515815260200191505060405180910390f35b61100a60048036036040811015610fd257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612d1c565b005b61110f6004803603608081101561102257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561108957600080fd5b82018360208201111561109b57600080fd5b803590602001918460018302840111640100000000831117156110bd57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612db0565b005b611119612f67565b6040518082815260200191505060405180910390f35b6111716004803603602081101561114557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f6e565b005b61119f6004803603602081101561118957600080fd5b810190808035906020019092919050505061307a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156111df5780820151818401526020810190506111c4565b50505050905090810190601f16801561120c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6112466004803603602081101561123057600080fd5b810190808035906020019092919050505061319a565b005b6112aa6004803603604081101561125e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133d9565b604051808215151515815260200191505060405180910390f35b61139a600480360360408110156112da57600080fd5b81019080803590602001906401000000008111156112f757600080fd5b82018360208201111561130957600080fd5b8035906020019184602083028401116401000000008311171561132b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061346d565b604051808215151515815260200191505060405180910390f35b600060336000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b61142681336135d4565b50565b60606101398054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c25780601f10611497576101008083540402835291602001916114c2565b820191906000526020600020905b8154815290600101906020018083116114a557829003601f168201915b5050505050905090565b60006114d782613641565b15156114e257600080fd5b6067600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61010660009054906101000a900460ff161515156115a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b6115ad82826136b3565b5050565b600061013d6000838152602001908152602001600020549050919050565b6115d8336119a4565b151561164c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742041646d696e0000000000000000000000000081525060200191505060405180910390fd5b61165682826135d4565b5050565b6000609e80549050905090565b611670336119a4565b15156116e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742041646d696e0000000000000000000000000081525060200191505060405180910390fd5b61010660009054906101000a900460ff1615151561176a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b8061013c541015156117e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e65772049642068617320746f2062652068696768657200000000000000000081525060200191505060405180910390fd5b8061013c8190555050565b61010660009054906101000a900460ff16151515611875576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b803073ffffffffffffffffffffffffffffffffffffffff1663a0894799826040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b1580156118e357600080fd5b505afa1580156118f7573d6000803e3d6000fd5b505050506040513d602081101561190d57600080fd5b8101908080519060200190929190505050151515611993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f546f6b656e2069732066726f7a656e000000000000000000000000000000000081525060200191505060405180910390fd5b61199e8484846137f8565b50505050565b60006119ba8260d261381d90919063ffffffff16565b9050919050565b600061010660009054906101000a900460ff16151515611a49576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b82611a548133611b2b565b1515611ac8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f53656e646572206973206e6f74204576656e74204d696e74657200000000000081525060200191505060405180910390fd5b60008090505b8351811015611b0d57611b018582600161013c5401018684815181101515611af257fe5b906020019060200201516138b1565b50806001019050611ace565b50825161013c60008282540192505081905550600191505092915050565b6000611b36826119a4565b80611b625750611b618260d3600086815260200190815260200160002061381d90919063ffffffff16565b5b905092915050565b6000611b758361258e565b82101515611b8257600080fd5b609c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515611bce57fe5b9060005260206000200154905092915050565b611bea336119a4565b1515611c5e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742041646d696e0000000000000000000000000081525060200191505060405180910390fd5b61010660009054906101000a900460ff161515611ce3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f436f6e7472616374206973206e6f74205061757365640000000000000000000081525060200191505060405180910390fd5b600061010660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b61010660009054906101000a900460ff16151515611dea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b803073ffffffffffffffffffffffffffffffffffffffff1663a0894799826040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b158015611e5857600080fd5b505afa158015611e6c573d6000803e3d6000fd5b505050506040513d6020811015611e8257600080fd5b8101908080519060200190929190505050151515611f08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f546f6b656e2069732066726f7a656e000000000000000000000000000000000081525060200191505060405180910390fd5b611f13848484613919565b50505050565b611f23338261393a565b80611f335750611f32336119a4565b5b1515611fa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f53656e64657220646f65736e27742068617665207065726d697373696f6e000081525060200191505060405180910390fd5b611fb0816139cf565b50565b61013f5481565b6000611fc461165a565b82101515611fd157600080fd5b609e82815481101515611fe057fe5b90600052602060002001549050919050565b611ffb336119a4565b151561206f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742041646d696e0000000000000000000000000081525060200191505060405180910390fd5b61010660009054906101000a900460ff161515156120f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b8061013b908051906020019061210c929190615444565b5050565b600061010660009054906101000a900460ff16905090565b6000806066600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561219d57600080fd5b80915050919050565b6121af336119a4565b1515612223576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742041646d696e0000000000000000000000000081525060200191505060405180910390fd5b61010660009054906101000a900460ff161515156122a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b803073ffffffffffffffffffffffffffffffffffffffff1663a0894799826040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b15801561231757600080fd5b505afa15801561232b573d6000803e3d6000fd5b505050506040513d602081101561234157600080fd5b810190808051906020019092919050505015156123c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f546f6b656e206973206e6f742066726f7a656e0000000000000000000000000081525060200191505060405180910390fd5b6123cf826139e4565b5050565b6000806123e08484611b6a565b91506123eb826115b1565b90509250929050565b6123fd336119a4565b1515612471576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742041646d696e0000000000000000000000000081525060200191505060405180910390fd5b61010660009054906101000a900460ff161515156124f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b6001810261013f8190555050565b61250e336119a4565b1515612582576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742041646d696e0000000000000000000000000081525060200191505060405180910390fd5b61258b81613a36565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156125cb57600080fd5b612612606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613a90565b9050919050565b600060019054906101000a900460ff16806126385750612637613a9e565b5b8061264f57506000809054906101000a900460ff16155b15156126a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615516602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1690506001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff021916908315150217905550600061010660006101000a81548160ff02191690831515021790555080600060016101000a81548160ff02191690831515021790555050565b612730336119a4565b15156127a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742041646d696e0000000000000000000000000081525060200191505060405180910390fd5b61010660009054906101000a900460ff1615151561282a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b600161010660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6128b433613aaf565b565b600060019054906101000a900460ff16806128d557506128d4613a9e565b5b806128ec57506000809054906101000a900460ff16155b1515612943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615516602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1690506001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff021916908315150217905550612993613b09565b61299b613c2f565b6129a433612f6e565b6129ac612619565b60008090505b82518110156129e6576129db83828151811015156129cc57fe5b90602001906020020151613a36565b8060010190506129b2565b508461013990805190602001906129fe929190615444565b508361013a9080519060200190612a16929190615444565b508261013b9080519060200190612a2e929190615444565b50612a5b635b5e139f7c010000000000000000000000000000000000000000000000000000000002613d60565b80600060016101000a81548160ff0219169083151502179055505050505050565b600061013e6000838152602001908152602001600020549050919050565b606061013a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b335780601f10612b0857610100808354040283529160200191612b33565b820191906000526020600020905b815481529060010190602001808311612b1657829003601f168201915b5050505050905090565b81612b488133611b2b565b1515612bbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f53656e646572206973206e6f74204576656e74204d696e74657200000000000081525060200191505060405180910390fd5b612bc68383613e1e565b505050565b60004261013e60008481526020019081526020016000205410159050919050565b600061010660009054906101000a900460ff16151515612c74576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b82612c7f8133611b2b565b1515612cf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f53656e646572206973206e6f74204576656e74204d696e74657200000000000081525060200191505060405180910390fd5b600161013c60008282540192505081905550612d138461013c54856138b1565b91505092915050565b61010660009054906101000a900460ff16151515612da2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b612dac8282613e8b565b5050565b61010660009054906101000a900460ff16151515612e36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff1663a0894799826040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b158015612ea457600080fd5b505afa158015612eb8573d6000803e3d6000fd5b505050506040513d6020811015612ece57600080fd5b8101908080519060200190929190505050151515612f54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f546f6b656e2069732066726f7a656e000000000000000000000000000000000081525060200191505060405180910390fd5b612f6085858585613fc7565b5050505050565b61013c5481565b600060019054906101000a900460ff1680612f8d5750612f8c613a9e565b5b80612fa457506000809054906101000a900460ff16155b1515612ffb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615516602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1690506001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff02191690831515021790555061304c826119a4565b151561305c5761305b82613a36565b5b80600060016101000a81548160ff0219169083151502179055505050565b6060600061013d600084815260200190815260200160002054905061319261013b8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561312f5780601f106131045761010080835404028352916020019161312f565b820191906000526020600020905b81548152906001019060200180831161311257829003601f168201915b505050505061313d83613fef565b6040805190810160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061317c87613fef565b6020604051908101604052806000815250614148565b915050919050565b61010660009054906101000a900460ff16151515613220576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b803073ffffffffffffffffffffffffffffffffffffffff1663a0894799826040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b15801561328e57600080fd5b505afa1580156132a2573d6000803e3d6000fd5b505050506040513d60208110156132b857600080fd5b810190808051906020019092919050505015151561333e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f546f6b656e2069732066726f7a656e000000000000000000000000000000000081525060200191505060405180910390fd5b613348338361393a565b806133585750613357336119a4565b5b15156133cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f53656e64657220646f65736e27742068617665207065726d697373696f6e000081525060200191505060405180910390fd5b6133d582614563565b5050565b6000606960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600061010660009054906101000a900460ff161515156134f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f436f6e747261637420697320506175736564000000000000000000000000000081525060200191505060405180910390fd5b6134fe336119a4565b1515613572576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742041646d696e0000000000000000000000000081525060200191505060405180910390fd5b60008090505b83518110156135b7576135ab848281518110151561359257fe5b9060200190602002015182600161013c540101856138b1565b50806001019050613578565b50825161013c600082825401925050819055506001905092915050565b6135f98160d360008581526020019081526020016000206145bb90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff16827fb6882c4d609d560f6d57e78e73dd96027f0d9852739b0b922537a6dd3c8e944c60405160405180910390a35050565b6000806066600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b60006136be82612128565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156136fb57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061373b575061373a81336133d9565b5b151561374657600080fd5b826067600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b613802338261393a565b151561380d57600080fd5b61381883838361466a565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561385a57600080fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006138bd828461468e565b8361013d600085815260200190815260200160002081905550837f4b3711cd7ece062b0828c1b6e08d814a72d4c003383a016c833cbb1b45956e34846040518082815260200191505060405180910390a2600190509392505050565b6139358383836020604051908101604052806000815250612db0565b505050565b60008061394683612128565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806139b557508373ffffffffffffffffffffffffffffffffffffffff1661399d846114cc565b73ffffffffffffffffffffffffffffffffffffffff16145b806139c657506139c581856133d9565b5b91505092915050565b6139e16139db82612128565b826146af565b50565b61013e6000828152602001908152602001600020600090557f083eea12772ab70fba01c8212d02f3bc5dc29b8540dcdc84298e5dfa22731b92816040518082815260200191505060405180910390a150565b613a4a8160d26146ed90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33960405160405180910390a250565b600081600001549050919050565b600080303b90506000811491505090565b613ac38160d26145bb90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f60405160405180910390a250565b600060019054906101000a900460ff1680613b285750613b27613a9e565b5b80613b3f57506000809054906101000a900460ff16155b1515613b96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615516602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1690506001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff021916908315150217905550613be661479d565b613c126380ac58cd7c010000000000000000000000000000000000000000000000000000000002613d60565b80600060016101000a81548160ff02191690831515021790555050565b600060019054906101000a900460ff1680613c4e5750613c4d613a9e565b5b80613c6557506000809054906101000a900460ff16155b1515613cbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615516602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1690506001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff021916908315150217905550613d0c6148bb565b1515613d1757600080fd5b613d4363780e9d637c010000000000000000000000000000000000000000000000000000000002613d60565b80600060016101000a81548160ff02191690831515021790555050565b63ffffffff7c010000000000000000000000000000000000000000000000000000000002817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614151515613db157600080fd5b600160336000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b613e438160d360008581526020019081526020016000206146ed90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff16827fe1bd660d9f7c60e6fb12dd6479fdde12d21fc96385dc7b9b022c0b2f319e739160405160405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515613ec657600080fd5b80606960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b613fd28484846117ef565b613fde848484846148ee565b1515613fe957600080fd5b50505050565b60606000821415614037576040805190810160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614143565b600082905060005b600082141515614065578080600101915050600a8281151561405d57fe5b04915061403f565b6060816040519080825280601f01601f19166020018201604052801561409a5781602001600182028038833980820191505090505b50905060006001830390505b60008614151561413b57600a868115156140bc57fe5b066030017f0100000000000000000000000000000000000000000000000000000000000000028282806001900393508151811015156140f757fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8681151561413357fe5b0495506140a6565b819450505050505b919050565b6060808690506060869050606086905060608690506060869050606081518351855187518951010101016040519080825280601f01601f1916602001820160405280156141a45781602001600182028038833980820191505090505b509050606081905060008090506000809050600090505b885181101561426e5788818151811015156141d257fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838380600101945081518110151561423157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506141bb565b600090505b875181101561432657878181518110151561428a57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000283838060010194508151811015156142e957fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050614273565b600090505b86518110156143de57868181518110151561434257fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000283838060010194508151811015156143a157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505061432b565b600090505b85518110156144965785818151811015156143fa57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838380600101945081518110151561445957fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506143e3565b600090505b845181101561454e5784818151811015156144b257fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838380600101945081518110151561451157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505061449b565b82995050505050505050505095945050505050565b61013f54420161013e6000838152602001908152602001600020819055507f4d69b51fee53c28bd8b61fe008151577ca65160b5248f6225e74d64fd4cf7328816040518082815260200191505060405180910390a150565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156145f757600080fd5b614601828261381d565b151561460c57600080fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b614675838383614b11565b61467f8382614cd8565b6146898282614e7c565b505050565b6146988282614f43565b6146a28282614e7c565b6146ab8161508d565b5050565b6146b982826150d9565b61013d60008281526020019081526020016000206000905561013e6000828152602001908152602001600020600090555050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561472957600080fd5b614733828261381d565b15151561473f57600080fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600060019054906101000a900460ff16806147bc57506147bb613a9e565b5b806147d357506000809054906101000a900460ff16155b151561482a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180615516602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1690506001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff02191690831515021790555061489e6301ffc9a77c010000000000000000000000000000000000000000000000000000000002613d60565b80600060016101000a81548160ff02191690831515021790555050565b60006148e96380ac58cd7c0100000000000000000000000000000000000000000000000000000000026113b4565b905090565b600061490f8473ffffffffffffffffffffffffffffffffffffffff16615113565b151561491e5760019050614b09565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a02338887876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614a155780820151818401526020810190506149fa565b50505050905090810190601f168015614a425780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015614a6457600080fd5b505af1158015614a78573d6000803e3d6000fd5b505050506040513d6020811015614a8e57600080fd5b8101908080519060200190929190505050905063150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16614b3182612128565b73ffffffffffffffffffffffffffffffffffffffff16141515614b5357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614b8f57600080fd5b614b9881615126565b614bdf606860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206151e6565b614c26606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020615209565b816066600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000614d306001609c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061521f90919063ffffffff16565b90506000609d60008481526020019081526020016000205490508181141515614e23576000609c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515614da157fe5b9060005260206000200154905080609c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515614dfb57fe5b906000526020600020018190555081609d600083815260200190815260200160002081905550505b609c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003614e7591906154c4565b5050505050565b609c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050609d600083815260200190815260200160002081905550609c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614f7f57600080fd5b614f8881613641565b151515614f9457600080fd5b816066600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061502d606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020615209565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b609e80549050609f600083815260200190815260200160002081905550609e81908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b6150e38282615241565b6150ed8282614cd8565b6000609d60008381526020019081526020016000208190555061510f81615386565b5050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff166067600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156151e35760006067600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6151fe6001826000015461521f90919063ffffffff16565b816000018190555050565b6001816000016000828254019250508190555050565b600082821115151561523057600080fd5b600082840390508091505092915050565b8173ffffffffffffffffffffffffffffffffffffffff1661526182612128565b73ffffffffffffffffffffffffffffffffffffffff1614151561528357600080fd5b61528c81615126565b6152d3606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206151e6565b60006066600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006153a16001609e8054905061521f90919063ffffffff16565b90506000609f60008481526020019081526020016000205490506000609e838154811015156153cc57fe5b9060005260206000200154905080609e838154811015156153e957fe5b906000526020600020018190555081609f600083815260200190815260200160002081905550609e80548091906001900361542491906154c4565b506000609f60008681526020019081526020016000208190555050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061548557805160ff19168380011785556154b3565b828001600101855582156154b3579182015b828111156154b2578251825591602001919060010190615497565b5b5090506154c091906154f0565b5090565b8154818355818111156154eb578183600052602060002091820191016154ea91906154f0565b5b505050565b61551291905b8082111561550e5760008160009055506001016154f6565b5090565b9056fe436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564a165627a7a72305820961e4e74587f02dad4bdd3586dfc026793bb8815fa11cb7b3788b3395ae3b6da0029
Deployed Bytecode Sourcemap
41382:17081:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41382:17081:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4341:133;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4341:133:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36527:111;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36527:111:0;;;;;;;;;;;;;;;;;:::i;:::-;;42496:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;42496:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11857:154;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11857:154:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;45457:112;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;45457:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42989:113;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42989:113:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37154:133;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37154:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23786:96;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44739:171;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44739:171:0;;;;;;;;;;;;;;;;;:::i;:::-;;46955:165;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;46955:165:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34943:107;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34943:107:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;50109:403;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;50109:403:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;50109:403:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;50109:403:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;50109:403:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;50109:403:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35331:160;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35331:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23443:185;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23443:185:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40657:117;;;:::i;:::-;;47829:173;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;47829:173:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;51537:187;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;51537:187:0;;;;;;;;;;;;;;;;;:::i;:::-;;42356:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24227:151;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24227:151:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44401:111;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44401:111:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;44401:111:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;44401:111:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;44401:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;44401:111:0;;;;;;;;;;;;;;;:::i;:::-;;39643:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10653:181;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10653:181:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;57729:125;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57729:125:0;;;;;;;;;;;;;;;;;:::i;:::-;;43523:223;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43523:223:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;56757:124;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;56757:124:0;;;;;;;;;;;;;;;;;:::i;:::-;;36194:89;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36194:89:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;10265:163;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10265:163:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39456:75;;;:::i;:::-;;40337:115;;;:::i;:::-;;36762:75;;;:::i;:::-;;51732:669;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;51732:669:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;51732:669:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;51732:669:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;51732:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;51732:669:0;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;51732:669:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;51732:669:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;51732:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;51732:669:0;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;51732:669:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;51732:669:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;51732:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;51732:669:0;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;51732:669:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;51732:669:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;51732:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;51732:669:0;;;;;;;;;;;;;;;:::i;:::-;;55469:117;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;55469:117:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42695:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;42695:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35837:142;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35837:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55771:130;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;55771:130:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;49416:247;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;49416:247:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;46122:131;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;46122:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;48788:200;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;48788:200:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;48788:200:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;48788:200:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;48788:200:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;48788:200:0;;;;;;;;;;;;;;;:::i;:::-;;42024:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34088:139;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34088:139:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;43944:214;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43944:214:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;43944:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57210:228;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57210:228:0;;;;;;;;;;;;;;;;;:::i;:::-;;12857:147;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12857:147:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;50912:404;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;50912:404:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;50912:404:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;50912:404:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;50912:404:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;50912:404:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;4341:133;4409:4;4433:20;:33;4454:11;4433:33;;;;;;;;;;;;;;;;;;;;;;;;;;;4426:40;;4341:133;;;:::o;36527:111::-;36591:39;36610:7;36619:10;36591:18;:39::i;:::-;36527:111;:::o;42496:85::-;42535:13;42568:5;42561:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42496:85;:::o;11857:154::-;11916:7;11944:16;11952:7;11944;:16::i;:::-;11936:25;;;;;;;;11979:15;:24;11995:7;11979:24;;;;;;;;;;;;;;;;;;;;;11972:31;;11857:154;;;:::o;45457:112::-;39880:7;;;;;;;;;;;39879:8;39871:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45535:26;45549:2;45553:7;45535:13;:26::i;:::-;45457:112;;:::o;42989:113::-;43047:7;43074:11;:20;43086:7;43074:20;;;;;;;;;;;;43067:27;;42989:113;;;:::o;37154:133::-;34362:19;34370:10;34362:7;:19::i;:::-;34354:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37243:36;37262:7;37271;37243:18;:36::i;:::-;37154:133;;:::o;23786:96::-;23830:7;23857:10;:17;;;;23850:24;;23786:96;:::o;44739:171::-;34362:19;34370:10;34362:7;:19::i;:::-;34354:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39880:7;;;;;;;;;;;39879:8;39871:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44836:9;44827:6;;:18;44819:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44893:9;44884:6;:18;;;;44739:171;:::o;46955:165::-;39880:7;;;;;;;;;;;39879:8;39871:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47055:7;56129:4;:13;;;56143:7;56129:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56129:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56129:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;56129:22:0;;;;;;;;;;;;;;;;56128:23;56120:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47075:37;47094:4;47100:2;47104:7;47075:18;:37::i;:::-;39921:1;46955:165;;;:::o;34943:107::-;34998:4;35022:20;35034:7;35022;:11;;:20;;;;:::i;:::-;35015:27;;34943:107;;;:::o;50109:403::-;50237:4;39880:7;;;;;;;;;;;39879:8;39871:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50219:7;34669:34;34683:7;34692:10;34669:13;:34::i;:::-;34661:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50298:9;50310:1;50298:13;;50293:109;50317:2;:9;50313:1;:13;50293:109;;;50348:42;50359:7;50381:1;50377;50368:6;;:10;:14;50384:2;50387:1;50384:5;;;;;;;;;;;;;;;;;;50348:10;:42::i;:::-;;50328:3;;;;;50293:109;;;;50473:2;:9;50463:6;;:19;;;;;;;;;;;50500:4;50493:11;;39921:1;50109:403;;;;:::o;35331:160::-;35409:4;35433:16;35441:7;35433;:16::i;:::-;:50;;;;35453:30;35475:7;35453:8;:17;35462:7;35453:17;;;;;;;;;;;:21;;:30;;;;:::i;:::-;35433:50;35426:57;;35331:160;;;;:::o;23443:185::-;23523:7;23559:16;23569:5;23559:9;:16::i;:::-;23551:5;:24;23543:33;;;;;;;;23594:12;:19;23607:5;23594:19;;;;;;;;;;;;;;;23614:5;23594:26;;;;;;;;;;;;;;;;;;23587:33;;23443:185;;;;:::o;40657:117::-;34362:19;34370:10;34362:7;:19::i;:::-;34354:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40081:7;;;;;;;;;;;40073:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40725:5;40715:7;;:15;;;;;;;;;;;;;;;;;;40746:20;40755:10;40746:20;;;;;;;;;;;;;;;;;;;;;;40657:117::o;47829:173::-;39880:7;;;;;;;;;;;39879:8;39871:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47933:7;56129:4;:13;;;56143:7;56129:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56129:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56129:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;56129:22:0;;;;;;;;;;;;;;;;56128:23;56120:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47953:41;47976:4;47982:2;47986:7;47953:22;:41::i;:::-;39921:1;47829:173;;;:::o;51537:187::-;51594:39;51613:10;51625:7;51594:18;:39::i;:::-;:62;;;;51637:19;51645:10;51637:7;:19::i;:::-;51594:62;51586:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51702:14;51708:7;51702:5;:14::i;:::-;51537:187;:::o;42356:29::-;;;;:::o;24227:151::-;24285:7;24321:13;:11;:13::i;:::-;24313:5;:21;24305:30;;;;;;;;24353:10;24364:5;24353:17;;;;;;;;;;;;;;;;;;24346:24;;24227:151;;;:::o;44401:111::-;34362:19;34370:10;34362:7;:19::i;:::-;34354:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39880:7;;;;;;;;;;;39879:8;39871:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44497:7;44486:8;:18;;;;;;;;;;;;:::i;:::-;;44401:111;:::o;39643:78::-;39682:4;39706:7;;;;;;;;;;;39699:14;;39643:78;:::o;10653:181::-;10708:7;10728:13;10744:11;:20;10756:7;10744:20;;;;;;;;;;;;;;;;;;;;;10728:36;;10800:1;10783:19;;:5;:19;;;;10775:28;;;;;;;;10821:5;10814:12;;;10653:181;;;:::o;57729:125::-;34362:19;34370:10;34362:7;:19::i;:::-;34354:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39880:7;;;;;;;;;;;39879:8;39871:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57808:7;56412:4;:13;;;56426:7;56412:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56412:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56412:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;56412:22:0;;;;;;;;;;;;;;;;56404:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57828:18;57838:7;57828:9;:18::i;:::-;39921:1;57729:125;:::o;43523:223::-;43610:15;43627;43665:33;43685:5;43692;43665:19;:33::i;:::-;43655:43;;43719:19;43730:7;43719:10;:19::i;:::-;43709:29;;43523:223;;;;;:::o;56757:124::-;34362:19;34370:10;34362:7;:19::i;:::-;34354:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39880:7;;;;;;;;;;;39879:8;39871:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56864:9;56857:4;:16;56840:14;:33;;;;56757:124;:::o;36194:89::-;34362:19;34370:10;34362:7;:19::i;:::-;34354:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36257:18;36267:7;36257:9;:18::i;:::-;36194:89;:::o;10265:163::-;10320:7;10365:1;10348:19;;:5;:19;;;;10340:28;;;;;;;;10386:34;:17;:24;10404:5;10386:24;;;;;;;;;;;;;;;:32;:34::i;:::-;10379:41;;10265:163;;;:::o;39456:75::-;1055:12;;;;;;;;;;;:31;;;;1071:15;:13;:15::i;:::-;1055:31;:47;;;;1091:11;;;;;;;;;;;1090:12;1055:47;1047:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1162:20;1185:12;;;;;;;;;;;1162:35;;1219:4;1204:12;;:19;;;;;;;;;;;;;;;;;;1244:4;1230:11;;:18;;;;;;;;;;;;;;;;;;39518:5;39508:7;;:15;;;;;;;;;;;;;;;;;;1282;1267:12;;:30;;;;;;;;;;;;;;;;;;39456:75;:::o;40337:115::-;34362:19;34370:10;34362:7;:19::i;:::-;34354:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39880:7;;;;;;;;;;;39879:8;39871:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40406:4;40396:7;;:14;;;;;;;;;;;;;;;;;;40426:18;40433:10;40426:18;;;;;;;;;;;;;;;;;;;;;;40337:115::o;36762:75::-;36805:24;36818:10;36805:12;:24::i;:::-;36762:75::o;51732:669::-;1055:12;;;;;;;;;;;:31;;;;1071:15;:13;:15::i;:::-;1055:31;:47;;;;1091:11;;;;;;;;;;;1090:12;1055:47;1047:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1162:20;1185:12;;;;;;;;;;;1162:35;;1219:4;1204:12;;:19;;;;;;;;;;;;;;;;;;1244:4;1230:11;;:18;;;;;;;;;;;;;;;;;;51888:19;:17;:19::i;:::-;51918:29;:27;:29::i;:::-;51958:32;51979:10;51958:20;:32::i;:::-;52001:25;:23;:25::i;:::-;52081:9;52093:1;52081:13;;52076:91;52100:6;:13;52096:1;:17;52076:91;;;52135:20;52145:6;52152:1;52145:9;;;;;;;;;;;;;;;;;;52135;:20::i;:::-;52115:3;;;;;52076:91;;;;52187:6;52179:5;:14;;;;;;;;;;;;:::i;:::-;;52214:8;52204:7;:18;;;;;;;;;;;;:::i;:::-;;52244:9;52233:8;:20;;;;;;;;;;;;:::i;:::-;;52344:49;42198:10;52363:29;;52344:18;:49::i;:::-;1282:15;1267:12;;:30;;;;;;;;;;;;;;;;;;51732:669;;;;;:::o;55469:117::-;55530:7;55557:12;:21;55570:7;55557:21;;;;;;;;;;;;55550:28;;55469:117;;;:::o;42695:89::-;42736:13;42769:7;42762:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42695:89;:::o;35837:142::-;35918:7;34669:34;34683:7;34692:10;34669:13;:34::i;:::-;34661:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35938:33;35954:7;35963;35938:15;:33::i;:::-;35837:142;;;:::o;55771:130::-;55829:4;55878:15;55853:12;:21;55866:7;55853:21;;;;;;;;;;;;:40;;55846:47;;55771:130;;;:::o;49416:247::-;49524:4;39880:7;;;;;;;;;;;39879:8;39871:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49506:7;34669:34;34683:7;34692:10;34669:13;:34::i;:::-;34661:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49605:1;49595:6;;:11;;;;;;;;;;;49624:31;49635:7;49644:6;;49652:2;49624:10;:31::i;:::-;49617:38;;39921:1;49416:247;;;;:::o;46122:131::-;39880:7;;;;;;;;;;;39879:8;39871:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46208:37;46232:2;46236:8;46208:23;:37::i;:::-;46122:131;;:::o;48788:200::-;39880:7;;;;;;;;;;;39879:8;39871:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48912:7;56129:4;:13;;;56143:7;56129:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56129:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56129:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;56129:22:0;;;;;;;;;;;;;;;;56128:23;56120:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48932:48;48955:4;48961:2;48965:7;48974:5;48932:22;:48::i;:::-;39921:1;48788:200;;;;:::o;42024:21::-;;;;:::o;34088:139::-;1055:12;;;;;;;;;;;:31;;;;1071:15;:13;:15::i;:::-;1055:31;:47;;;;1091:11;;;;;;;;;;;1090:12;1055:47;1047:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1162:20;1185:12;;;;;;;;;;;1162:35;;1219:4;1204:12;;:19;;;;;;;;;;;;;;;;;;1244:4;1230:11;;:18;;;;;;;;;;;;;;;;;;34159:15;34167:6;34159:7;:15::i;:::-;34158:16;34154:66;;;34191:17;34201:6;34191:9;:17::i;:::-;34154:66;1282:15;1267:12;;:30;;;;;;;;;;;;;;;;;;34088:139;;:::o;43944:214::-;44002:13;44028:12;44043:11;:20;44055:7;44043:20;;;;;;;;;;;;44028:35;;44081:69;44092:8;44081:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44102:18;44112:7;44102:9;:18::i;:::-;44081:69;;;;;;;;;;;;;;;;;;44127:18;44137:7;44127:9;:18::i;:::-;44081:69;;;;;;;;;;;;;:10;:69::i;:::-;44074:76;;;43944:214;;;:::o;57210:228::-;39880:7;;;;;;;;;;;39879:8;39871:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57278:7;56129:4;:13;;;56143:7;56129:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56129:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56129:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;56129:22:0;;;;;;;;;;;;;;;;56128:23;56120:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57306:39;57325:10;57337:7;57306:18;:39::i;:::-;:62;;;;57349:19;57357:10;57349:7;:19::i;:::-;57306:62;57298:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57414:16;57422:7;57414;:16::i;:::-;39921:1;57210:228;:::o;12857:147::-;12937:4;12961:18;:25;12980:5;12961:25;;;;;;;;;;;;;;;:35;12987:8;12961:35;;;;;;;;;;;;;;;;;;;;;;;;;12954:42;;12857:147;;;;:::o;50912:404::-;51028:4;39880:7;;;;;;;;;;;39879:8;39871:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34362:19;34370:10;34362:7;:19::i;:::-;34354:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51089:9;51101:1;51089:13;;51084:116;51108:8;:15;51104:1;:19;51084:116;;;51145:43;51156:8;51165:1;51156:11;;;;;;;;;;;;;;;;;;51182:1;51178;51169:6;;:10;:14;51185:2;51145:10;:43::i;:::-;;51125:3;;;;;51084:116;;;;51271:8;:15;51261:6;;:25;;;;;;;;;;;51304:4;51297:11;;50912:404;;;;:::o;38231:175::-;38313:33;38338:7;38313:8;:17;38322:7;38313:17;;;;;;;;;;;:24;;:33;;;;:::i;:::-;38390:7;38362:36;;38381:7;38362:36;;;;;;;;;;38231:175;;:::o;15546:155::-;15603:4;15620:13;15636:11;:20;15648:7;15636:20;;;;;;;;;;;;;;;;;;;;;15620:36;;15691:1;15674:19;;:5;:19;;;;15667:26;;;15546:155;;;:::o;11265:299::-;11329:13;11345:16;11353:7;11345;:16::i;:::-;11329:32;;11386:5;11380:11;;:2;:11;;;;11372:20;;;;;;;;11425:5;11411:19;;:10;:19;;;:58;;;;11434:35;11451:5;11458:10;11434:16;:35::i;:::-;11411:58;11403:67;;;;;;;;11510:2;11483:15;:24;11499:7;11483:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11548:7;11544:2;11528:28;;11537:5;11528:28;;;;;;;;;;;;11265:299;;;:::o;13448:184::-;13539:39;13558:10;13570:7;13539:18;:39::i;:::-;13531:48;;;;;;;;13592:32;13606:4;13612:2;13616:7;13592:13;:32::i;:::-;13448:184;;;:::o;32689:165::-;32761:4;32805:1;32786:21;;:7;:21;;;;32778:30;;;;;;;;32826:4;:11;;:20;32838:7;32826:20;;;;;;;;;;;;;;;;;;;;;;;;;32819:27;;32689:165;;;;:::o;53179:234::-;53263:4;53280:18;53286:2;53290:7;53280:5;:18::i;:::-;53332:7;53309:11;:20;53321:7;53309:20;;;;;;;;;;;:30;;;;53366:7;53355:28;53375:7;53355:28;;;;;;;;;;;;;;;;;;53401:4;53394:11;;53179:234;;;;;:::o;14278:134::-;14365:39;14382:4;14388:2;14392:7;14365:39;;;;;;;;;;;;;:16;:39::i;:::-;14278:134;;;:::o;16070:249::-;16155:4;16172:13;16188:16;16196:7;16188;:16::i;:::-;16172:32;;16234:5;16223:16;;:7;:16;;;:51;;;;16267:7;16243:31;;:20;16255:7;16243:11;:20::i;:::-;:31;;;16223:51;:87;;;;16278:32;16295:5;16302:7;16278:16;:32::i;:::-;16223:87;16215:96;;;16070:249;;;;:::o;17597:92::-;17649:32;17655:16;17663:7;17655;:16::i;:::-;17673:7;17649:5;:32::i;:::-;17597:92;:::o;58335:125::-;58398:12;:21;58411:7;58398:21;;;;;;;;;;;58391:28;;;58435:17;58444:7;58435:17;;;;;;;;;;;;;;;;;;58335:125;:::o;37841:119::-;37897:20;37909:7;37897;:11;;:20;;;;:::i;:::-;37944:7;37933:19;;;;;;;;;;;;37841:119;:::o;31545:114::-;31610:7;31637;:14;;;31630:21;;31545:114;;;:::o;1392:476::-;1439:4;1786:10;1832:7;1820:20;1814:26;;1861:1;1855:2;:7;1848:14;;;1392:476;:::o;38572:127::-;38631:23;38646:7;38631;:14;;:23;;;;:::i;:::-;38683:7;38670:21;;;;;;;;;;;;38572:127;:::o;9712:210::-;1055:12;;;;;;;;;;;:31;;;;1071:15;:13;:15::i;:::-;1055:31;:47;;;;1091:11;;;;;;;;;;;1090:12;1055:47;1047:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1162:20;1185:12;;;;;;;;;;;1162:35;;1219:4;1204:12;;:19;;;;;;;;;;;;;;;;;;1244:4;1230:11;;:18;;;;;;;;;;;;;;;;;;9764:19;:17;:19::i;:::-;9874:40;9064:10;9893:20;;9874:18;:40::i;:::-;1282:15;1267:12;;:30;;;;;;;;;;;;;;;;;;9712:210;:::o;22672:246::-;1055:12;;;;;;;;;;;:31;;;;1071:15;:13;:15::i;:::-;1055:31;:47;;;;1091:11;;;;;;;;;;;1090:12;1055:47;1047:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1162:20;1185:12;;;;;;;;;;;1162:35;;1219:4;1204:12;;:19;;;;;;;;;;;;;;;;;;1244:4;1230:11;;:18;;;;;;;;;;;;;;;;;;22732:28;:26;:28::i;:::-;22724:37;;;;;;;;22859:51;22385:10;22878:31;;22859:18;:51::i;:::-;1282:15;1267:12;;:30;;;;;;;;;;;;;;;;;;22672:246;:::o;4558:161::-;4649:10;4634:25;;:11;:25;;;;;4626:34;;;;;;;;4707:4;4671:20;:33;4692:11;4671:33;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;4558:161;:::o;37514:167::-;37593:30;37615:7;37593:8;:17;37602:7;37593:17;;;;;;;;;;;:21;;:30;;;;:::i;:::-;37665:7;37639:34;;37656:7;37639:34;;;;;;;;;;37514:167;;:::o;12311:217::-;12397:10;12391:16;;:2;:16;;;;12383:25;;;;;;;;12456:8;12419:18;:30;12438:10;12419:30;;;;;;;;;;;;;;;:34;12450:2;12419:34;;;;;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;12507:2;12480:40;;12495:10;12480:40;;;12511:8;12480:40;;;;;;;;;;;;;;;;;;;;;;12311:217;;:::o;15131:214::-;15238:31;15251:4;15257:2;15261:7;15238:12;:31::i;:::-;15288:48;15311:4;15317:2;15321:7;15330:5;15288:22;:48::i;:::-;15280:57;;;;;;;;15131:214;;;;:::o;53579:483::-;53630:27;53680:1;53674:2;:7;53670:50;;;53698:10;;;;;;;;;;;;;;;;;;;;;;53670:50;53730:6;53739:2;53730:11;;53752:8;53771:69;53783:1;53778;:6;;53771:69;;;53801:5;;;;;;;53826:2;53821:7;;;;;;;;;;;53771:69;;;53850:17;53880:3;53870:14;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;53870:14:0;;;;53850:34;;53895:6;53910:1;53904:3;:7;53895:16;;53922:103;53935:1;53929:2;:7;;53922:103;;;53986:2;53981;:7;;;;;;;;53976:2;:12;53965:25;;53953:4;53958:3;;;;;;;53953:9;;;;;;;;;;;;;;:37;;;;;;;;;;;54011:2;54005:8;;;;;;;;;;;53922:103;;;54049:4;54035:19;;;;;;53579:483;;;;:::o;54220:1057::-;54358:33;54409:16;54434:2;54409:28;;54448:16;54473:2;54448:28;;54487:16;54512:2;54487:28;;54526:16;54551:2;54526:28;;54565:16;54590:2;54565:28;;54604:19;54689:3;:10;54676:3;:10;54663:3;:10;54650:3;:10;54637:3;:10;:23;:36;:49;:62;54626:74;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;54626:74:0;;;;54604:96;;54711:19;54739:5;54711:34;;54756:6;54765:1;54756:10;;54777:6;54786:1;54777:10;;54807:1;54803:5;;54798:80;54814:3;:10;54810:1;:14;54798:80;;;54860:3;54864:1;54860:6;;;;;;;;;;;;;;;;;;;;54846;54853:3;;;;;;54846:11;;;;;;;;;;;;;;:20;;;;;;;;;;;54826:3;;;;;;;54798:80;;;54897:1;54893:5;;54888:80;54904:3;:10;54900:1;:14;54888:80;;;54950:3;54954:1;54950:6;;;;;;;;;;;;;;;;;;;;54936;54943:3;;;;;;54936:11;;;;;;;;;;;;;;:20;;;;;;;;;;;54916:3;;;;;;;54888:80;;;54987:1;54983:5;;54978:80;54994:3;:10;54990:1;:14;54978:80;;;55040:3;55044:1;55040:6;;;;;;;;;;;;;;;;;;;;55026;55033:3;;;;;;55026:11;;;;;;;;;;;;;;:20;;;;;;;;;;;55006:3;;;;;;;54978:80;;;55077:1;55073:5;;55068:80;55084:3;:10;55080:1;:14;55068:80;;;55130:3;55134:1;55130:6;;;;;;;;;;;;;;;;;;;;55116;55123:3;;;;;;55116:11;;;;;;;;;;;;;;:20;;;;;;;;;;;55096:3;;;;;;;55068:80;;;55167:1;55163:5;;55158:80;55174:3;:10;55170:1;:14;55158:80;;;55220:3;55224:1;55220:6;;;;;;;;;;;;;;;;;;;;55206;55213:3;;;;;;55206:11;;;;;;;;;;;;;;:20;;;;;;;;;;;55186:3;;;;;;;55158:80;;;55262:6;55248:21;;;;;;;;;;;54220:1057;;;;;;;:::o;58020:149::-;58116:14;;58098:15;:32;58074:12;:21;58087:7;58074:21;;;;;;;;;;;:56;;;;58146:15;58153:7;58146:15;;;;;;;;;;;;;;;;;;58020:149;:::o;32406:189::-;32505:1;32486:21;;:7;:21;;;;32478:30;;;;;;;;32527:18;32531:4;32537:7;32527:3;:18::i;:::-;32519:27;;;;;;;;32582:5;32559:4;:11;;:20;32571:7;32559:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;32406:189;;:::o;24762:245::-;24848:38;24868:4;24874:2;24878:7;24848:19;:38::i;:::-;24899:47;24932:4;24938:7;24899:32;:47::i;:::-;24959:40;24987:2;24991:7;24959:27;:40::i;:::-;24762:245;;;:::o;25270:202::-;25334:24;25346:2;25350:7;25334:11;:24::i;:::-;25371:40;25399:2;25403:7;25371:27;:40::i;:::-;25424;25456:7;25424:31;:40::i;:::-;25270:202;;:::o;52655:181::-;52722:27;52734:5;52741:7;52722:11;:27::i;:::-;52769:11;:20;52781:7;52769:20;;;;;;;;;;;52762:27;;;52807:12;:21;52820:7;52807:21;;;;;;;;;;;52800:28;;;52655:181;;:::o;32141:186::-;32237:1;32218:21;;:7;:21;;;;32210:30;;;;;;;;32260:18;32264:4;32270:7;32260:3;:18::i;:::-;32259:19;32251:28;;;;;;;;32315:4;32292;:11;;:20;32304:7;32292:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;32141:186;;:::o;4145:100::-;1055:12;;;;;;;;;;;:31;;;;1071:15;:13;:15::i;:::-;1055:31;:47;;;;1091:11;;;;;;;;;;;1090:12;1055:47;1047:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1162:20;1185:12;;;;;;;;;;;1162:35;;1219:4;1204:12;;:19;;;;;;;;;;;;;;;;;;1244:4;1230:11;;:18;;;;;;;;;;;;;;;;;;4197:40;3761:10;4216:20;;4197:18;:40::i;:::-;1282:15;1267:12;;:30;;;;;;;;;;;;;;;;;;4145:100;:::o;9930:125::-;9984:4;10008:39;9064:10;10026:20;;10008:17;:39::i;:::-;10001:46;;9930:125;:::o;18986:356::-;19108:4;19135:15;:2;:13;;;:15::i;:::-;19134:16;19130:60;;;19174:4;19167:11;;;;19130:60;19202:13;19234:2;19218:36;;;19255:10;19267:4;19273:7;19282:5;19218:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;19218:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19218:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19218:70:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19218:70:0;;;;;;;;;;;;;;;;19202:86;;8536:10;19317:16;;19307:26;;;:6;:26;;;;19299:35;;;18986:356;;;;;;;:::o;18073:374::-;18187:4;18167:24;;:16;18175:7;18167;:16::i;:::-;:24;;;18159:33;;;;;;;;18225:1;18211:16;;:2;:16;;;;18203:25;;;;;;;;18241:23;18256:7;18241:14;:23::i;:::-;18277:35;:17;:23;18295:4;18277:23;;;;;;;;;;;;;;;:33;:35::i;:::-;18323:33;:17;:21;18341:2;18323:21;;;;;;;;;;;;;;;:31;:33::i;:::-;18392:2;18369:11;:20;18381:7;18369:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;18431:7;18427:2;18412:27;;18421:4;18412:27;;;;;;;;;;;;18073:374;;;:::o;27939:1148::-;28205:22;28230:32;28260:1;28230:12;:18;28243:4;28230:18;;;;;;;;;;;;;;;:25;;;;:29;;:32;;;;:::i;:::-;28205:57;;28273:18;28294:17;:26;28312:7;28294:26;;;;;;;;;;;;28273:47;;28441:14;28427:10;:28;;28423:328;;;28472:19;28494:12;:18;28507:4;28494:18;;;;;;;;;;;;;;;28513:14;28494:34;;;;;;;;;;;;;;;;;;28472:56;;28578:11;28545:12;:18;28558:4;28545:18;;;;;;;;;;;;;;;28564:10;28545:30;;;;;;;;;;;;;;;;;:44;;;;28695:10;28662:17;:30;28680:11;28662:30;;;;;;;;;;;:43;;;;28423:328;;28840:12;:18;28853:4;28840:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;27939:1148;;;;:::o;26763:186::-;26877:12;:16;26890:2;26877:16;;;;;;;;;;;;;;;:23;;;;26848:17;:26;26866:7;26848:26;;;;;;;;;;;:52;;;;26911:12;:16;26924:2;26911:16;;;;;;;;;;;;;;;26933:7;26911:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;26911:30:0;;;;;;;;;;;;;;;;;;;;;;26763:186;;:::o;16570:267::-;16656:1;16642:16;;:2;:16;;;;16634:25;;;;;;;;16679:16;16687:7;16679;:16::i;:::-;16678:17;16670:26;;;;;;;;16732:2;16709:11;:20;16721:7;16709:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;16745:33;:17;:21;16763:2;16745:21;;;;;;;;;;;;;;;:31;:33::i;:::-;16821:7;16817:2;16796:33;;16813:1;16796:33;;;;;;;;;;;;16570:267;;:::o;27150:164::-;27254:10;:17;;;;27227:15;:24;27243:7;27227:24;;;;;;;;;;;:44;;;;27282:10;27298:7;27282:24;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27282:24:0;;;;;;;;;;;;;;;;;;;;;;27150:164;:::o;25753:372::-;25820:27;25832:5;25839:7;25820:11;:27::i;:::-;25860:48;25893:5;25900:7;25860:32;:48::i;:::-;26058:1;26029:17;:26;26047:7;26029:26;;;;;;;;;;;:30;;;;26072:45;26109:7;26072:36;:45::i;:::-;25753:372;;:::o;2444:627::-;2504:4;2521:12;3028:7;3016:20;3008:28;;3062:1;3055:4;:8;3048:15;;;2444:627;;;:::o;19509:175::-;19609:1;19573:38;;:15;:24;19589:7;19573:24;;;;;;;;;;;;;;;;;;;;;:38;;;;19569:108;;;19663:1;19628:15;:24;19644:7;19628:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;19569:108;19509:175;:::o;31766:110::-;31847:21;31866:1;31847:7;:14;;;:18;;:21;;;;:::i;:::-;31830:7;:14;;:38;;;;31766:110;:::o;31667:91::-;31749:1;31731:7;:14;;;:19;;;;;;;;;;;31667:91;:::o;20964:150::-;21022:7;21055:1;21050;:6;;21042:15;;;;;;;;21068:9;21084:1;21080;:5;21068:17;;21105:1;21098:8;;;20964:150;;;;:::o;17119:292::-;17214:5;17194:25;;:16;17202:7;17194;:16::i;:::-;:25;;;17186:34;;;;;;;;17233:23;17248:7;17233:14;:23::i;:::-;17269:36;:17;:24;17287:5;17269:24;;;;;;;;;;;;;;;:34;:36::i;:::-;17347:1;17316:11;:20;17328:7;17316:20;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;17395:7;17391:1;17367:36;;17376:5;17367:36;;;;;;;;;;;;17119:292;;:::o;29382:1082::-;29635:22;29660:24;29682:1;29660:10;:17;;;;:21;;:24;;;;:::i;:::-;29635:49;;29695:18;29716:15;:24;29732:7;29716:24;;;;;;;;;;;;29695:45;;30067:19;30089:10;30100:14;30089:26;;;;;;;;;;;;;;;;;;30067:48;;30153:11;30128:10;30139;30128:22;;;;;;;;;;;;;;;;;:36;;;;30264:10;30233:15;:28;30249:11;30233:28;;;;;;;;;;;:41;;;;30398:10;:19;;;;;;;;;;;;:::i;:::-;;30455:1;30428:15;:24;30444:7;30428:24;;;;;;;;;;;:28;;;;29382:1082;;;;:::o;41382:17081::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://961e4e74587f02dad4bdd3586dfc026793bb8815fa11cb7b3788b3395ae3b6da
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in XDAI
Multichain Portfolio | 32 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.