ERC-1155
NFT
Overview
Max Total Supply
9,890 PPA
Holders
4,951
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PPAShuttlepass
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0 <0.9.0; import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; library OpenSeaGasFreeListing { /** @notice Returns whether the operator is an OpenSea proxy for the owner, thus allowing it to list without the token owner paying gas. @dev ERC{721,1155}.isApprovedForAll should be overriden to also check if this function returns true. */ function isApprovedForAll(address owner, address operator) internal view returns (bool) { ProxyRegistry registry; assembly { switch chainid() case 1 { // mainnet registry := 0xa5409ec958c83c3f309868babaca7c86dcb077c1 } case 4 { // rinkeby registry := 0xf57b2c51ded3a29e6891aba85459d600256cf317 } } return address(registry) != address(0) && address(registry.proxies(owner)) == operator; } } contract OwnableDelegateProxy {} contract ProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; } contract PPAShuttlepass is ERC1155, Ownable { uint public constant GOLD = 0; uint public constant SILVER = 1; uint public constant BRONZE = 2; uint public constant MAX_TOKENS = 9890; uint public numMinted = 0; uint public goldPriceWei = 0.2 ether; uint public silverPriceWei = 0.12 ether; uint public bronzePriceWei = 0.07 ether; // All members of First Buyer whitelist. bytes32 public firstBuyersMerkleRoot; // All members of OG/Passengers whitelist. bytes32 public ogAndPassengersMerkleRoot; mapping (address => uint) public sale1NumMinted; mapping (address => uint) public sale2NumMinted; mapping (address => uint) public publicNumMinted; // Whitelist types (which whitelist is the caller on). uint public constant FIRST_BUYERS = 1; uint public constant OG_PASSENGERS = 2; // Sale state: // 0: Closed // 1: Open to First Buyer whitelist. Each address can mint 1. // 2: Open to First Buyer + OG/Passenger whitelists. Each address can mint 3. // 3: Open to Public. Each address can mint 5. uint256 public saleState = 0; string private _contractUri = "https://assets.jointheppa.com/shuttlepasses/metadata/contract.json"; string public name = "PPA Shuttlepasses"; string public symbol = "PPA"; constructor() public ERC1155("https://assets.jointheppa.com/shuttlepasses/metadata/{id}.json") {} function mint(uint passType, uint amount) public payable { require(saleState == 3, "Public mint is not open"); /** * Sale 3: * Public. 5 per address. */ publicNumMinted[msg.sender] = publicNumMinted[msg.sender] + amount; require(publicNumMinted[msg.sender] <= 5, "Cannot mint more than 5 per address in this phase"); _internalMint(passType, amount); } function earlyMint(uint passType, uint amount, uint whitelistType, bytes32[] calldata merkleProof) public payable { require(saleState > 0, "Sale is not open"); if (saleState == 1) { /** * Sale 1: * First Buyers only. 1 per address. */ sale1NumMinted[msg.sender] = sale1NumMinted[msg.sender] + amount; require(sale1NumMinted[msg.sender] == 1, "Cannot mint more than 1 per address in this phase."); require(whitelistType == FIRST_BUYERS, "Must use First Buyers whitelist"); verifyMerkle(msg.sender, merkleProof, FIRST_BUYERS); } else if (saleState == 2) { /** * Sale 2: * First Buyers or OG/Passengers. 3 per address. */ sale2NumMinted[msg.sender] = sale2NumMinted[msg.sender] + amount; require(sale2NumMinted[msg.sender] <= 3, "Cannot mint more than 3 per address in this phase."); verifyMerkle(msg.sender, merkleProof, whitelistType); } else { revert("The early sale is over. Use the public mint function instead."); } _internalMint(passType, amount); } function _internalMint(uint passType, uint amount) internal { incrementNumMinted(amount); if (passType == GOLD) { checkPayment(goldPriceWei * amount); } else if (passType == SILVER) { checkPayment(silverPriceWei * amount); } else if (passType == BRONZE) { checkPayment(bronzePriceWei * amount); } else { revert("Invalid pass type"); } _mint(msg.sender, passType, amount, ""); } function ownerMint(uint passType, uint amount) public onlyOwner { incrementNumMinted(amount); require(passType == GOLD || passType == SILVER || passType == BRONZE, "Invalid passType"); _mint(msg.sender, passType, amount, ""); } function incrementNumMinted(uint amount) internal { numMinted = numMinted + amount; require(numMinted <= MAX_TOKENS, "Minting would exceed max tokens"); } function verifyMerkle(address addr, bytes32[] calldata proof, uint whitelistType) internal view { require(isOnWhitelist(addr, proof, whitelistType), "User is not on whitelist"); } function isOnWhitelist(address addr, bytes32[] calldata proof, uint whitelistType) public view returns (bool) { bytes32 root; if (whitelistType == FIRST_BUYERS) { root = firstBuyersMerkleRoot; } else if (whitelistType == OG_PASSENGERS) { root = ogAndPassengersMerkleRoot; } else { revert("Invalid whitelistType, must be 1 or 2"); } bytes32 leaf = keccak256(abi.encodePacked(addr)); return MerkleProof.verify(proof, root, leaf); } function checkPayment(uint amountRequired) internal { require(msg.value >= amountRequired, "Not enough funds sent"); } function setFirstBuyersMerkleRoot(bytes32 newMerkle) public onlyOwner { firstBuyersMerkleRoot = newMerkle; } function setOgAndPassengersMerkleRoot(bytes32 newMerkle) public onlyOwner { ogAndPassengersMerkleRoot = newMerkle; } function setSaleState(uint newState) public onlyOwner { require(newState >= 0 && newState <= 3, "Invalid state"); saleState = newState; } function withdraw() public onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } function setBaseUri(string calldata newUri) public onlyOwner { _setURI(newUri); } function setContractUri(string calldata newUri) public onlyOwner { _contractUri = newUri; } function setGoldPriceWei(uint newPrice) public onlyOwner { goldPriceWei = newPrice; } function setSilverPriceWei(uint newPrice) public onlyOwner { silverPriceWei = newPrice; } function setBronzePriceWei(uint newPrice) public onlyOwner { bronzePriceWei = newPrice; } function isApprovedForAll(address owner, address operator) public view override returns (bool) { return OpenSeaGasFreeListing.isApprovedForAll(owner, operator) || super.isApprovedForAll(owner, operator); } function contractURI() public view returns (string memory) { return _contractUri; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; import "../IERC1155.sol"; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; import "./IERC1155.sol"; import "./IERC1155Receiver.sol"; import "./extensions/IERC1155MetadataURI.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
{ "remappings": [], "optimizer": { "enabled": false, "runs": 200 }, "evmVersion": "london", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"BRONZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FIRST_BUYERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OG_PASSENGERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SILVER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bronzePriceWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"passType","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"whitelistType","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"earlyMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"firstBuyersMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"goldPriceWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"whitelistType","type":"uint256"}],"name":"isOnWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"passType","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogAndPassengersMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"passType","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicNumMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"sale1NumMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"sale2NumMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setBronzePriceWei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"}],"name":"setContractUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkle","type":"bytes32"}],"name":"setFirstBuyersMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setGoldPriceWei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkle","type":"bytes32"}],"name":"setOgAndPassengersMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newState","type":"uint256"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setSilverPriceWei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"silverPriceWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006004556702c68af0bb1400006005556701aa535d3d0c000060065566f8b0a10e4700006007556000600d556040518060800160405280604281526020016200557c60429139600e90805190602001906200006292919062000249565b506040518060400160405280601181526020017f5050412053687574746c65706173736573000000000000000000000000000000815250600f9080519060200190620000b092919062000249565b506040518060400160405280600381526020017f505041000000000000000000000000000000000000000000000000000000000081525060109080519060200190620000fe92919062000249565b503480156200010c57600080fd5b506040518060600160405280603e8152602001620055be603e913962000138816200015f60201b60201c565b50620001596200014d6200017b60201b60201c565b6200018360201b60201c565b6200035e565b80600290805190602001906200017792919062000249565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025790620002f9565b90600052602060002090601f0160209004810192826200027b5760008555620002c7565b82601f106200029657805160ff1916838001178555620002c7565b82800160010185558215620002c7579182015b82811115620002c6578251825591602001919060010190620002a9565b5b509050620002d69190620002da565b5090565b5b80821115620002f5576000816000905550600101620002db565b5090565b600060028204905060018216806200031257607f821691505b602082108114156200032957620003286200032f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61520e806200036e6000396000f3fe60806040526004361061025b5760003560e01c806395d89b4111610144578063cf14b283116100b6578063e3e55f081161007a578063e3e55f08146108cb578063e8a3d485146108f6578063e985e9c514610921578063f242432a1461095e578063f2fde38b14610987578063f47c84c5146109b05761025b565b8063cf14b283146107f6578063d47573d414610821578063d52079b41461084a578063dd22c20b14610875578063e00fd543146108a05761025b565b8063bba767f911610108578063bba767f9146106f5578063c2de8f2b1461071e578063c7f9378514610749578063c813cfd414610774578063ccb4807b14610790578063cee26885146107b95761025b565b806395d89b411461062457806399b7b0e31461064f578063a0bcfc7f1461067a578063a22cb465146106a3578063a961b162146106cc5761025b565b80632eb2c2d6116101dd5780634e1273f4116101a15780634e1273f414610528578063603f4d5214610565578063715018a6146105905780637708c027146105a75780638c25de60146105d05780638da5cb5b146105f95761025b565b80632eb2c2d6146104695780633ca1fca7146104925780633ccfd60b146104bb5780633e4bee38146104d25780633e5517d4146104fd5761025b565b80630f420d9b116102245780630f420d9b1461036b57806312fd93d5146103a85780631a58f3ca146103e55780631b1081fa146104225780631b2ef1ca1461044d5761025b565b8062fdd58e1461026057806301ffc9a71461029d57806306fdde03146102da578063084c4088146103055780630e89341c1461032e575b600080fd5b34801561026c57600080fd5b5061028760048036038101906102829190613804565b6109db565b60405161029491906144f9565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf91906138e9565b610aa4565b6040516102d19190614141565b60405180910390f35b3480156102e657600080fd5b506102ef610b86565b6040516102fc9190614177565b60405180910390f35b34801561031157600080fd5b5061032c600480360381019061032791906139bd565b610c14565b005b34801561033a57600080fd5b50610355600480360381019061035091906139bd565b610ceb565b6040516103629190614177565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d919061357d565b610d7f565b60405161039f91906144f9565b60405180910390f35b3480156103b457600080fd5b506103cf60048036038101906103ca919061357d565b610d97565b6040516103dc91906144f9565b60405180910390f35b3480156103f157600080fd5b5061040c60048036038101906104079190613750565b610daf565b6040516104199190614141565b60405180910390f35b34801561042e57600080fd5b50610437610e97565b60405161044491906144f9565b60405180910390f35b610467600480360381019061046291906139ea565b610e9d565b005b34801561047557600080fd5b50610490600480360381019061048b91906135ea565b611001565b005b34801561049e57600080fd5b506104b960048036038101906104b491906138bc565b6110a2565b005b3480156104c757600080fd5b506104d0611128565b005b3480156104de57600080fd5b506104e76111f3565b6040516104f491906144f9565b60405180910390f35b34801561050957600080fd5b506105126111f8565b60405161051f91906144f9565b60405180910390f35b34801561053457600080fd5b5061054f600480360381019061054a9190613844565b6111fd565b60405161055c91906140e8565b60405180910390f35b34801561057157600080fd5b5061057a611316565b60405161058791906144f9565b60405180910390f35b34801561059c57600080fd5b506105a561131c565b005b3480156105b357600080fd5b506105ce60048036038101906105c991906139bd565b6113a4565b005b3480156105dc57600080fd5b506105f760048036038101906105f291906138bc565b61142a565b005b34801561060557600080fd5b5061060e6114b0565b60405161061b919061400b565b60405180910390f35b34801561063057600080fd5b506106396114da565b6040516106469190614177565b60405180910390f35b34801561065b57600080fd5b50610664611568565b604051610671919061415c565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613970565b61156e565b005b3480156106af57600080fd5b506106ca60048036038101906106c591906137c4565b61163b565b005b3480156106d857600080fd5b506106f360048036038101906106ee91906139bd565b611651565b005b34801561070157600080fd5b5061071c600480360381019061071791906139bd565b6116d7565b005b34801561072a57600080fd5b5061073361175d565b604051610740919061415c565b60405180910390f35b34801561075557600080fd5b5061075e611763565b60405161076b91906144f9565b60405180910390f35b61078e60048036038101906107899190613a2a565b611769565b005b34801561079c57600080fd5b506107b760048036038101906107b29190613970565b611a98565b005b3480156107c557600080fd5b506107e060048036038101906107db919061357d565b611b2a565b6040516107ed91906144f9565b60405180910390f35b34801561080257600080fd5b5061080b611b42565b60405161081891906144f9565b60405180910390f35b34801561082d57600080fd5b50610848600480360381019061084391906139ea565b611b48565b005b34801561085657600080fd5b5061085f611c45565b60405161086c91906144f9565b60405180910390f35b34801561088157600080fd5b5061088a611c4b565b60405161089791906144f9565b60405180910390f35b3480156108ac57600080fd5b506108b5611c50565b6040516108c291906144f9565b60405180910390f35b3480156108d757600080fd5b506108e0611c55565b6040516108ed91906144f9565b60405180910390f35b34801561090257600080fd5b5061090b611c5a565b6040516109189190614177565b60405180910390f35b34801561092d57600080fd5b50610948600480360381019061094391906135aa565b611cec565b6040516109559190614141565b60405180910390f35b34801561096a57600080fd5b50610985600480360381019061098091906136b9565b611d11565b005b34801561099357600080fd5b506109ae60048036038101906109a9919061357d565b611db2565b005b3480156109bc57600080fd5b506109c5611eaa565b6040516109d291906144f9565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a43906141f9565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b6f57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b7f5750610b7e82611eb0565b5b9050919050565b600f8054610b93906147de565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbf906147de565b8015610c0c5780601f10610be157610100808354040283529160200191610c0c565b820191906000526020600020905b815481529060010190602001808311610bef57829003601f168201915b505050505081565b610c1c611f1a565b73ffffffffffffffffffffffffffffffffffffffff16610c3a6114b0565b73ffffffffffffffffffffffffffffffffffffffff1614610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c87906143b9565b60405180910390fd5b60008110158015610ca2575060038111155b610ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd890614399565b60405180910390fd5b80600d8190555050565b606060028054610cfa906147de565b80601f0160208091040260200160405190810160405280929190818152602001828054610d26906147de565b8015610d735780601f10610d4857610100808354040283529160200191610d73565b820191906000526020600020905b815481529060010190602001808311610d5657829003601f168201915b50505050509050919050565b600a6020528060005260406000206000915090505481565b600c6020528060005260406000206000915090505481565b6000806001831415610dc5576008549050610e14565b6002831415610dd8576009549050610e13565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0a90614459565b60405180910390fd5b5b600086604051602001610e279190613fc4565b604051602081830303815290604052805190602001209050610e8b868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508383611f22565b92505050949350505050565b60075481565b6003600d5414610ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed990614339565b60405180910390fd5b80600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f2d919061465c565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506005600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea906143d9565b60405180910390fd5b610ffd8282611f39565b5050565b611009611f1a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061104f575061104e85611049611f1a565b611cec565b5b61108e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611085906142d9565b60405180910390fd5b61109b858585858561200a565b5050505050565b6110aa611f1a565b73ffffffffffffffffffffffffffffffffffffffff166110c86114b0565b73ffffffffffffffffffffffffffffffffffffffff161461111e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611115906143b9565b60405180910390fd5b8060098190555050565b611130611f1a565b73ffffffffffffffffffffffffffffffffffffffff1661114e6114b0565b73ffffffffffffffffffffffffffffffffffffffff16146111a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119b906143b9565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111ef573d6000803e3d6000fd5b5050565b600081565b600281565b60608151835114611243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123a90614499565b60405180910390fd5b6000835167ffffffffffffffff8111156112605761125f614945565b5b60405190808252806020026020018201604052801561128e5781602001602082028036833780820191505090505b50905060005b845181101561130b576112db8582815181106112b3576112b2614916565b5b60200260200101518583815181106112ce576112cd614916565b5b60200260200101516109db565b8282815181106112ee576112ed614916565b5b6020026020010181815250508061130490614841565b9050611294565b508091505092915050565b600d5481565b611324611f1a565b73ffffffffffffffffffffffffffffffffffffffff166113426114b0565b73ffffffffffffffffffffffffffffffffffffffff1614611398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138f906143b9565b60405180910390fd5b6113a2600061231e565b565b6113ac611f1a565b73ffffffffffffffffffffffffffffffffffffffff166113ca6114b0565b73ffffffffffffffffffffffffffffffffffffffff1614611420576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611417906143b9565b60405180910390fd5b8060078190555050565b611432611f1a565b73ffffffffffffffffffffffffffffffffffffffff166114506114b0565b73ffffffffffffffffffffffffffffffffffffffff16146114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d906143b9565b60405180910390fd5b8060088190555050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601080546114e7906147de565b80601f0160208091040260200160405190810160405280929190818152602001828054611513906147de565b80156115605780601f1061153557610100808354040283529160200191611560565b820191906000526020600020905b81548152906001019060200180831161154357829003601f168201915b505050505081565b60095481565b611576611f1a565b73ffffffffffffffffffffffffffffffffffffffff166115946114b0565b73ffffffffffffffffffffffffffffffffffffffff16146115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e1906143b9565b60405180910390fd5b61163782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506123e4565b5050565b61164d611646611f1a565b83836123fe565b5050565b611659611f1a565b73ffffffffffffffffffffffffffffffffffffffff166116776114b0565b73ffffffffffffffffffffffffffffffffffffffff16146116cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c4906143b9565b60405180910390fd5b8060068190555050565b6116df611f1a565b73ffffffffffffffffffffffffffffffffffffffff166116fd6114b0565b73ffffffffffffffffffffffffffffffffffffffff1614611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a906143b9565b60405180910390fd5b8060058190555050565b60085481565b60055481565b6000600d54116117ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a590614439565b60405180910390fd5b6001600d54141561191e5783600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611804919061465c565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146118c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c090614419565b60405180910390fd5b6001831461190c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190390614379565b60405180910390fd5b611919338383600161256b565b611a87565b6002600d541415611a4b5783600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611974919061465c565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506003600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3190614319565b60405180910390fd5b611a463383838661256b565b611a86565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7d906142f9565b60405180910390fd5b5b611a918585611f39565b5050505050565b611aa0611f1a565b73ffffffffffffffffffffffffffffffffffffffff16611abe6114b0565b73ffffffffffffffffffffffffffffffffffffffff1614611b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0b906143b9565b60405180910390fd5b8181600e9190611b25929190613169565b505050565b600b6020528060005260406000206000915090505481565b60065481565b611b50611f1a565b73ffffffffffffffffffffffffffffffffffffffff16611b6e6114b0565b73ffffffffffffffffffffffffffffffffffffffff1614611bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbb906143b9565b60405180910390fd5b611bcd816125bc565b6000821480611bdc5750600182145b80611be75750600282145b611c26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1d90614239565b60405180910390fd5b611c413383836040518060200160405280600081525061261a565b5050565b60045481565b600181565b600281565b600181565b6060600e8054611c69906147de565b80601f0160208091040260200160405190810160405280929190818152602001828054611c95906147de565b8015611ce25780601f10611cb757610100808354040283529160200191611ce2565b820191906000526020600020905b815481529060010190602001808311611cc557829003601f168201915b5050505050905090565b6000611cf883836127b0565b80611d095750611d0883836128f7565b5b905092915050565b611d19611f1a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611d5f5750611d5e85611d59611f1a565b611cec565b5b611d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9590614279565b60405180910390fd5b611dab858585858561298b565b5050505050565b611dba611f1a565b73ffffffffffffffffffffffffffffffffffffffff16611dd86114b0565b73ffffffffffffffffffffffffffffffffffffffff1614611e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e25906143b9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9590614219565b60405180910390fd5b611ea78161231e565b50565b6126a281565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600082611f2f8584612c0d565b1490509392505050565b611f42816125bc565b6000821415611f6657611f6181600554611f5c91906146b2565b612cc0565b611feb565b6001821415611f8a57611f8581600654611f8091906146b2565b612cc0565b611fea565b6002821415611fae57611fa981600754611fa491906146b2565b612cc0565b611fe9565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe090614299565b60405180910390fd5b5b5b6120063383836040518060200160405280600081525061261a565b5050565b815183511461204e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612045906144b9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156120be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b5906142b9565b60405180910390fd5b60006120c8611f1a565b90506120d8818787878787612d06565b60005b84518110156122895760008582815181106120f9576120f8614916565b5b60200260200101519050600085838151811061211857612117614916565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156121b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b090614359565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461226e919061465c565b925050819055505050508061228290614841565b90506120db565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161230092919061410a565b60405180910390a4612316818787878787612d0e565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600290805190602001906123fa9291906131ef565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561246d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246490614479565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161255e9190614141565b60405180910390a3505050565b61257784848484610daf565b6125b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ad90614259565b60405180910390fd5b50505050565b806004546125ca919061465c565b6004819055506126a26004541115612617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260e906143f9565b60405180910390fd5b50565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561268a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612681906144d9565b60405180910390fd5b6000612694611f1a565b90506126b5816000876126a688612ef5565b6126af88612ef5565b87612d06565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612714919061465c565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612792929190614514565b60405180910390a46127a981600087878787612f6f565b5050505050565b60008046600181146127c957600481146127e5576127fd565b73a5409ec958c83c3f309868babaca7c86dcb077c191506127fd565b73f57b2c51ded3a29e6891aba85459d600256cf31791505b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156128ee57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401612886919061400b565b60206040518083038186803b15801561289e57600080fd5b505afa1580156128b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d69190613943565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156129fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f2906142b9565b60405180910390fd5b6000612a05611f1a565b9050612a25818787612a1688612ef5565b612a1f88612ef5565b87612d06565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab390614359565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b71919061465c565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051612bee929190614514565b60405180910390a4612c04828888888888612f6f565b50505050505050565b60008082905060005b8451811015612cb5576000858281518110612c3457612c33614916565b5b60200260200101519050808311612c75578281604051602001612c58929190613fdf565b604051602081830303815290604052805190602001209250612ca1565b8083604051602001612c88929190613fdf565b6040516020818303038152906040528051906020012092505b508080612cad90614841565b915050612c16565b508091505092915050565b80341015612d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfa906141d9565b60405180910390fd5b50565b505050505050565b612d2d8473ffffffffffffffffffffffffffffffffffffffff16613156565b15612eed578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612d73959493929190614026565b602060405180830381600087803b158015612d8d57600080fd5b505af1925050508015612dbe57506040513d601f19601f82011682018060405250810190612dbb9190613916565b60015b612e6457612dca614974565b806308c379a01415612e275750612ddf6150b8565b80612dea5750612e29565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1e9190614177565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5b90614199565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee2906141b9565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff811115612f1457612f13614945565b5b604051908082528060200260200182016040528015612f425781602001602082028036833780820191505090505b5090508281600081518110612f5a57612f59614916565b5b60200260200101818152505080915050919050565b612f8e8473ffffffffffffffffffffffffffffffffffffffff16613156565b1561314e578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612fd495949392919061408e565b602060405180830381600087803b158015612fee57600080fd5b505af192505050801561301f57506040513d601f19601f8201168201806040525081019061301c9190613916565b60015b6130c55761302b614974565b806308c379a0141561308857506130406150b8565b8061304b575061308a565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307f9190614177565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130bc90614199565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461314c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613143906141b9565b60405180910390fd5b505b505050505050565b600080823b905060008111915050919050565b828054613175906147de565b90600052602060002090601f01602090048101928261319757600085556131de565b82601f106131b057803560ff19168380011785556131de565b828001600101855582156131de579182015b828111156131dd5782358255916020019190600101906131c2565b5b5090506131eb9190613275565b5090565b8280546131fb906147de565b90600052602060002090601f01602090048101928261321d5760008555613264565b82601f1061323657805160ff1916838001178555613264565b82800160010185558215613264579182015b82811115613263578251825591602001919060010190613248565b5b5090506132719190613275565b5090565b5b8082111561328e576000816000905550600101613276565b5090565b60006132a56132a084614562565b61453d565b905080838252602082019050828560208602820111156132c8576132c76149a0565b5b60005b858110156132f857816132de88826133b4565b8452602084019350602083019250506001810190506132cb565b5050509392505050565b60006133156133108461458e565b61453d565b90508083825260208201905082856020860282011115613338576133376149a0565b5b60005b85811015613368578161334e8882613568565b84526020840193506020830192505060018101905061333b565b5050509392505050565b6000613385613380846145ba565b61453d565b9050828152602081018484840111156133a1576133a06149a5565b5b6133ac84828561479c565b509392505050565b6000813590506133c38161514e565b92915050565b600082601f8301126133de576133dd61499b565b5b81356133ee848260208601613292565b91505092915050565b60008083601f84011261340d5761340c61499b565b5b8235905067ffffffffffffffff81111561342a57613429614996565b5b602083019150836020820283011115613446576134456149a0565b5b9250929050565b600082601f8301126134625761346161499b565b5b8135613472848260208601613302565b91505092915050565b60008135905061348a81615165565b92915050565b60008135905061349f8161517c565b92915050565b6000813590506134b481615193565b92915050565b6000815190506134c981615193565b92915050565b600082601f8301126134e4576134e361499b565b5b81356134f4848260208601613372565b91505092915050565b60008151905061350c816151aa565b92915050565b60008083601f8401126135285761352761499b565b5b8235905067ffffffffffffffff81111561354557613544614996565b5b602083019150836001820283011115613561576135606149a0565b5b9250929050565b600081359050613577816151c1565b92915050565b600060208284031215613593576135926149af565b5b60006135a1848285016133b4565b91505092915050565b600080604083850312156135c1576135c06149af565b5b60006135cf858286016133b4565b92505060206135e0858286016133b4565b9150509250929050565b600080600080600060a08688031215613606576136056149af565b5b6000613614888289016133b4565b9550506020613625888289016133b4565b945050604086013567ffffffffffffffff811115613646576136456149aa565b5b6136528882890161344d565b935050606086013567ffffffffffffffff811115613673576136726149aa565b5b61367f8882890161344d565b925050608086013567ffffffffffffffff8111156136a05761369f6149aa565b5b6136ac888289016134cf565b9150509295509295909350565b600080600080600060a086880312156136d5576136d46149af565b5b60006136e3888289016133b4565b95505060206136f4888289016133b4565b945050604061370588828901613568565b935050606061371688828901613568565b925050608086013567ffffffffffffffff811115613737576137366149aa565b5b613743888289016134cf565b9150509295509295909350565b6000806000806060858703121561376a576137696149af565b5b6000613778878288016133b4565b945050602085013567ffffffffffffffff811115613799576137986149aa565b5b6137a5878288016133f7565b935093505060406137b887828801613568565b91505092959194509250565b600080604083850312156137db576137da6149af565b5b60006137e9858286016133b4565b92505060206137fa8582860161347b565b9150509250929050565b6000806040838503121561381b5761381a6149af565b5b6000613829858286016133b4565b925050602061383a85828601613568565b9150509250929050565b6000806040838503121561385b5761385a6149af565b5b600083013567ffffffffffffffff811115613879576138786149aa565b5b613885858286016133c9565b925050602083013567ffffffffffffffff8111156138a6576138a56149aa565b5b6138b28582860161344d565b9150509250929050565b6000602082840312156138d2576138d16149af565b5b60006138e084828501613490565b91505092915050565b6000602082840312156138ff576138fe6149af565b5b600061390d848285016134a5565b91505092915050565b60006020828403121561392c5761392b6149af565b5b600061393a848285016134ba565b91505092915050565b600060208284031215613959576139586149af565b5b6000613967848285016134fd565b91505092915050565b60008060208385031215613987576139866149af565b5b600083013567ffffffffffffffff8111156139a5576139a46149aa565b5b6139b185828601613512565b92509250509250929050565b6000602082840312156139d3576139d26149af565b5b60006139e184828501613568565b91505092915050565b60008060408385031215613a0157613a006149af565b5b6000613a0f85828601613568565b9250506020613a2085828601613568565b9150509250929050565b600080600080600060808688031215613a4657613a456149af565b5b6000613a5488828901613568565b9550506020613a6588828901613568565b9450506040613a7688828901613568565b935050606086013567ffffffffffffffff811115613a9757613a966149aa565b5b613aa3888289016133f7565b92509250509295509295909350565b6000613abe8383613fa6565b60208301905092915050565b613ad38161470c565b82525050565b613aea613ae58261470c565b61488a565b82525050565b6000613afb826145fb565b613b058185614629565b9350613b10836145eb565b8060005b83811015613b41578151613b288882613ab2565b9750613b338361461c565b925050600181019050613b14565b5085935050505092915050565b613b578161471e565b82525050565b613b668161472a565b82525050565b613b7d613b788261472a565b61489c565b82525050565b6000613b8e82614606565b613b98818561463a565b9350613ba88185602086016147ab565b613bb1816149b4565b840191505092915050565b6000613bc782614611565b613bd1818561464b565b9350613be18185602086016147ab565b613bea816149b4565b840191505092915050565b6000613c0260348361464b565b9150613c0d826149df565b604082019050919050565b6000613c2560288361464b565b9150613c3082614a2e565b604082019050919050565b6000613c4860158361464b565b9150613c5382614a7d565b602082019050919050565b6000613c6b602b8361464b565b9150613c7682614aa6565b604082019050919050565b6000613c8e60268361464b565b9150613c9982614af5565b604082019050919050565b6000613cb160108361464b565b9150613cbc82614b44565b602082019050919050565b6000613cd460188361464b565b9150613cdf82614b6d565b602082019050919050565b6000613cf760298361464b565b9150613d0282614b96565b604082019050919050565b6000613d1a60118361464b565b9150613d2582614be5565b602082019050919050565b6000613d3d60258361464b565b9150613d4882614c0e565b604082019050919050565b6000613d6060328361464b565b9150613d6b82614c5d565b604082019050919050565b6000613d83603d8361464b565b9150613d8e82614cac565b604082019050919050565b6000613da660328361464b565b9150613db182614cfb565b604082019050919050565b6000613dc960178361464b565b9150613dd482614d4a565b602082019050919050565b6000613dec602a8361464b565b9150613df782614d73565b604082019050919050565b6000613e0f601f8361464b565b9150613e1a82614dc2565b602082019050919050565b6000613e32600d8361464b565b9150613e3d82614deb565b602082019050919050565b6000613e5560208361464b565b9150613e6082614e14565b602082019050919050565b6000613e7860318361464b565b9150613e8382614e3d565b604082019050919050565b6000613e9b601f8361464b565b9150613ea682614e8c565b602082019050919050565b6000613ebe60328361464b565b9150613ec982614eb5565b604082019050919050565b6000613ee160108361464b565b9150613eec82614f04565b602082019050919050565b6000613f0460258361464b565b9150613f0f82614f2d565b604082019050919050565b6000613f2760298361464b565b9150613f3282614f7c565b604082019050919050565b6000613f4a60298361464b565b9150613f5582614fcb565b604082019050919050565b6000613f6d60288361464b565b9150613f788261501a565b604082019050919050565b6000613f9060218361464b565b9150613f9b82615069565b604082019050919050565b613faf81614792565b82525050565b613fbe81614792565b82525050565b6000613fd08284613ad9565b60148201915081905092915050565b6000613feb8285613b6c565b602082019150613ffb8284613b6c565b6020820191508190509392505050565b60006020820190506140206000830184613aca565b92915050565b600060a08201905061403b6000830188613aca565b6140486020830187613aca565b818103604083015261405a8186613af0565b9050818103606083015261406e8185613af0565b905081810360808301526140828184613b83565b90509695505050505050565b600060a0820190506140a36000830188613aca565b6140b06020830187613aca565b6140bd6040830186613fb5565b6140ca6060830185613fb5565b81810360808301526140dc8184613b83565b90509695505050505050565b600060208201905081810360008301526141028184613af0565b905092915050565b600060408201905081810360008301526141248185613af0565b905081810360208301526141388184613af0565b90509392505050565b60006020820190506141566000830184613b4e565b92915050565b60006020820190506141716000830184613b5d565b92915050565b600060208201905081810360008301526141918184613bbc565b905092915050565b600060208201905081810360008301526141b281613bf5565b9050919050565b600060208201905081810360008301526141d281613c18565b9050919050565b600060208201905081810360008301526141f281613c3b565b9050919050565b6000602082019050818103600083015261421281613c5e565b9050919050565b6000602082019050818103600083015261423281613c81565b9050919050565b6000602082019050818103600083015261425281613ca4565b9050919050565b6000602082019050818103600083015261427281613cc7565b9050919050565b6000602082019050818103600083015261429281613cea565b9050919050565b600060208201905081810360008301526142b281613d0d565b9050919050565b600060208201905081810360008301526142d281613d30565b9050919050565b600060208201905081810360008301526142f281613d53565b9050919050565b6000602082019050818103600083015261431281613d76565b9050919050565b6000602082019050818103600083015261433281613d99565b9050919050565b6000602082019050818103600083015261435281613dbc565b9050919050565b6000602082019050818103600083015261437281613ddf565b9050919050565b6000602082019050818103600083015261439281613e02565b9050919050565b600060208201905081810360008301526143b281613e25565b9050919050565b600060208201905081810360008301526143d281613e48565b9050919050565b600060208201905081810360008301526143f281613e6b565b9050919050565b6000602082019050818103600083015261441281613e8e565b9050919050565b6000602082019050818103600083015261443281613eb1565b9050919050565b6000602082019050818103600083015261445281613ed4565b9050919050565b6000602082019050818103600083015261447281613ef7565b9050919050565b6000602082019050818103600083015261449281613f1a565b9050919050565b600060208201905081810360008301526144b281613f3d565b9050919050565b600060208201905081810360008301526144d281613f60565b9050919050565b600060208201905081810360008301526144f281613f83565b9050919050565b600060208201905061450e6000830184613fb5565b92915050565b60006040820190506145296000830185613fb5565b6145366020830184613fb5565b9392505050565b6000614547614558565b90506145538282614810565b919050565b6000604051905090565b600067ffffffffffffffff82111561457d5761457c614945565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156145a9576145a8614945565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156145d5576145d4614945565b5b6145de826149b4565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061466782614792565b915061467283614792565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146a7576146a66148b8565b5b828201905092915050565b60006146bd82614792565b91506146c883614792565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614701576147006148b8565b5b828202905092915050565b600061471782614772565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061476b8261470c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156147c95780820151818401526020810190506147ae565b838111156147d8576000848401525b50505050565b600060028204905060018216806147f657607f821691505b6020821081141561480a576148096148e7565b5b50919050565b614819826149b4565b810181811067ffffffffffffffff8211171561483857614837614945565b5b80604052505050565b600061484c82614792565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561487f5761487e6148b8565b5b600182019050919050565b6000614895826148a6565b9050919050565b6000819050919050565b60006148b1826149c5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156149935760046000803e6149906000516149d2565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682066756e64732073656e740000000000000000000000600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420706173735479706500000000000000000000000000000000600082015250565b7f55736572206973206e6f74206f6e2077686974656c6973740000000000000000600082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420706173732074797065000000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f546865206561726c792073616c65206973206f7665722e20557365207468652060008201527f7075626c6963206d696e742066756e6374696f6e20696e73746561642e000000602082015250565b7f43616e6e6f74206d696e74206d6f7265207468616e203320706572206164647260008201527f65737320696e20746869732070686173652e0000000000000000000000000000602082015250565b7f5075626c6963206d696e74206973206e6f74206f70656e000000000000000000600082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4d75737420757365204669727374204275796572732077686974656c69737400600082015250565b7f496e76616c696420737461746500000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616e6e6f74206d696e74206d6f7265207468616e203520706572206164647260008201527f65737320696e2074686973207068617365000000000000000000000000000000602082015250565b7f4d696e74696e6720776f756c6420657863656564206d617820746f6b656e7300600082015250565b7f43616e6e6f74206d696e74206d6f7265207468616e203120706572206164647260008201527f65737320696e20746869732070686173652e0000000000000000000000000000602082015250565b7f53616c65206973206e6f74206f70656e00000000000000000000000000000000600082015250565b7f496e76616c69642077686974656c697374547970652c206d757374206265203160008201527f206f722032000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d10156150c85761514b565b6150d0614558565b60043d036004823e80513d602482011167ffffffffffffffff821117156150f857505061514b565b808201805167ffffffffffffffff811115615116575050505061514b565b80602083010160043d03850181111561513357505050505061514b565b61514282602001850186614810565b82955050505050505b90565b6151578161470c565b811461516257600080fd5b50565b61516e8161471e565b811461517957600080fd5b50565b6151858161472a565b811461519057600080fd5b50565b61519c81614734565b81146151a757600080fd5b50565b6151b381614760565b81146151be57600080fd5b50565b6151ca81614792565b81146151d557600080fd5b5056fea26469706673582212209342a4745e89b9456f0406193b5eff2094a981d24e7513d7976e60e16ae3257a64736f6c6343000807003368747470733a2f2f6173736574732e6a6f696e7468657070612e636f6d2f73687574746c657061737365732f6d657461646174612f636f6e74726163742e6a736f6e68747470733a2f2f6173736574732e6a6f696e7468657070612e636f6d2f73687574746c657061737365732f6d657461646174612f7b69647d2e6a736f6e
Deployed Bytecode
0x60806040526004361061025b5760003560e01c806395d89b4111610144578063cf14b283116100b6578063e3e55f081161007a578063e3e55f08146108cb578063e8a3d485146108f6578063e985e9c514610921578063f242432a1461095e578063f2fde38b14610987578063f47c84c5146109b05761025b565b8063cf14b283146107f6578063d47573d414610821578063d52079b41461084a578063dd22c20b14610875578063e00fd543146108a05761025b565b8063bba767f911610108578063bba767f9146106f5578063c2de8f2b1461071e578063c7f9378514610749578063c813cfd414610774578063ccb4807b14610790578063cee26885146107b95761025b565b806395d89b411461062457806399b7b0e31461064f578063a0bcfc7f1461067a578063a22cb465146106a3578063a961b162146106cc5761025b565b80632eb2c2d6116101dd5780634e1273f4116101a15780634e1273f414610528578063603f4d5214610565578063715018a6146105905780637708c027146105a75780638c25de60146105d05780638da5cb5b146105f95761025b565b80632eb2c2d6146104695780633ca1fca7146104925780633ccfd60b146104bb5780633e4bee38146104d25780633e5517d4146104fd5761025b565b80630f420d9b116102245780630f420d9b1461036b57806312fd93d5146103a85780631a58f3ca146103e55780631b1081fa146104225780631b2ef1ca1461044d5761025b565b8062fdd58e1461026057806301ffc9a71461029d57806306fdde03146102da578063084c4088146103055780630e89341c1461032e575b600080fd5b34801561026c57600080fd5b5061028760048036038101906102829190613804565b6109db565b60405161029491906144f9565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf91906138e9565b610aa4565b6040516102d19190614141565b60405180910390f35b3480156102e657600080fd5b506102ef610b86565b6040516102fc9190614177565b60405180910390f35b34801561031157600080fd5b5061032c600480360381019061032791906139bd565b610c14565b005b34801561033a57600080fd5b50610355600480360381019061035091906139bd565b610ceb565b6040516103629190614177565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d919061357d565b610d7f565b60405161039f91906144f9565b60405180910390f35b3480156103b457600080fd5b506103cf60048036038101906103ca919061357d565b610d97565b6040516103dc91906144f9565b60405180910390f35b3480156103f157600080fd5b5061040c60048036038101906104079190613750565b610daf565b6040516104199190614141565b60405180910390f35b34801561042e57600080fd5b50610437610e97565b60405161044491906144f9565b60405180910390f35b610467600480360381019061046291906139ea565b610e9d565b005b34801561047557600080fd5b50610490600480360381019061048b91906135ea565b611001565b005b34801561049e57600080fd5b506104b960048036038101906104b491906138bc565b6110a2565b005b3480156104c757600080fd5b506104d0611128565b005b3480156104de57600080fd5b506104e76111f3565b6040516104f491906144f9565b60405180910390f35b34801561050957600080fd5b506105126111f8565b60405161051f91906144f9565b60405180910390f35b34801561053457600080fd5b5061054f600480360381019061054a9190613844565b6111fd565b60405161055c91906140e8565b60405180910390f35b34801561057157600080fd5b5061057a611316565b60405161058791906144f9565b60405180910390f35b34801561059c57600080fd5b506105a561131c565b005b3480156105b357600080fd5b506105ce60048036038101906105c991906139bd565b6113a4565b005b3480156105dc57600080fd5b506105f760048036038101906105f291906138bc565b61142a565b005b34801561060557600080fd5b5061060e6114b0565b60405161061b919061400b565b60405180910390f35b34801561063057600080fd5b506106396114da565b6040516106469190614177565b60405180910390f35b34801561065b57600080fd5b50610664611568565b604051610671919061415c565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613970565b61156e565b005b3480156106af57600080fd5b506106ca60048036038101906106c591906137c4565b61163b565b005b3480156106d857600080fd5b506106f360048036038101906106ee91906139bd565b611651565b005b34801561070157600080fd5b5061071c600480360381019061071791906139bd565b6116d7565b005b34801561072a57600080fd5b5061073361175d565b604051610740919061415c565b60405180910390f35b34801561075557600080fd5b5061075e611763565b60405161076b91906144f9565b60405180910390f35b61078e60048036038101906107899190613a2a565b611769565b005b34801561079c57600080fd5b506107b760048036038101906107b29190613970565b611a98565b005b3480156107c557600080fd5b506107e060048036038101906107db919061357d565b611b2a565b6040516107ed91906144f9565b60405180910390f35b34801561080257600080fd5b5061080b611b42565b60405161081891906144f9565b60405180910390f35b34801561082d57600080fd5b50610848600480360381019061084391906139ea565b611b48565b005b34801561085657600080fd5b5061085f611c45565b60405161086c91906144f9565b60405180910390f35b34801561088157600080fd5b5061088a611c4b565b60405161089791906144f9565b60405180910390f35b3480156108ac57600080fd5b506108b5611c50565b6040516108c291906144f9565b60405180910390f35b3480156108d757600080fd5b506108e0611c55565b6040516108ed91906144f9565b60405180910390f35b34801561090257600080fd5b5061090b611c5a565b6040516109189190614177565b60405180910390f35b34801561092d57600080fd5b50610948600480360381019061094391906135aa565b611cec565b6040516109559190614141565b60405180910390f35b34801561096a57600080fd5b50610985600480360381019061098091906136b9565b611d11565b005b34801561099357600080fd5b506109ae60048036038101906109a9919061357d565b611db2565b005b3480156109bc57600080fd5b506109c5611eaa565b6040516109d291906144f9565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a43906141f9565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b6f57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b7f5750610b7e82611eb0565b5b9050919050565b600f8054610b93906147de565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbf906147de565b8015610c0c5780601f10610be157610100808354040283529160200191610c0c565b820191906000526020600020905b815481529060010190602001808311610bef57829003601f168201915b505050505081565b610c1c611f1a565b73ffffffffffffffffffffffffffffffffffffffff16610c3a6114b0565b73ffffffffffffffffffffffffffffffffffffffff1614610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c87906143b9565b60405180910390fd5b60008110158015610ca2575060038111155b610ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd890614399565b60405180910390fd5b80600d8190555050565b606060028054610cfa906147de565b80601f0160208091040260200160405190810160405280929190818152602001828054610d26906147de565b8015610d735780601f10610d4857610100808354040283529160200191610d73565b820191906000526020600020905b815481529060010190602001808311610d5657829003601f168201915b50505050509050919050565b600a6020528060005260406000206000915090505481565b600c6020528060005260406000206000915090505481565b6000806001831415610dc5576008549050610e14565b6002831415610dd8576009549050610e13565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0a90614459565b60405180910390fd5b5b600086604051602001610e279190613fc4565b604051602081830303815290604052805190602001209050610e8b868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508383611f22565b92505050949350505050565b60075481565b6003600d5414610ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed990614339565b60405180910390fd5b80600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f2d919061465c565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506005600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea906143d9565b60405180910390fd5b610ffd8282611f39565b5050565b611009611f1a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061104f575061104e85611049611f1a565b611cec565b5b61108e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611085906142d9565b60405180910390fd5b61109b858585858561200a565b5050505050565b6110aa611f1a565b73ffffffffffffffffffffffffffffffffffffffff166110c86114b0565b73ffffffffffffffffffffffffffffffffffffffff161461111e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611115906143b9565b60405180910390fd5b8060098190555050565b611130611f1a565b73ffffffffffffffffffffffffffffffffffffffff1661114e6114b0565b73ffffffffffffffffffffffffffffffffffffffff16146111a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119b906143b9565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111ef573d6000803e3d6000fd5b5050565b600081565b600281565b60608151835114611243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123a90614499565b60405180910390fd5b6000835167ffffffffffffffff8111156112605761125f614945565b5b60405190808252806020026020018201604052801561128e5781602001602082028036833780820191505090505b50905060005b845181101561130b576112db8582815181106112b3576112b2614916565b5b60200260200101518583815181106112ce576112cd614916565b5b60200260200101516109db565b8282815181106112ee576112ed614916565b5b6020026020010181815250508061130490614841565b9050611294565b508091505092915050565b600d5481565b611324611f1a565b73ffffffffffffffffffffffffffffffffffffffff166113426114b0565b73ffffffffffffffffffffffffffffffffffffffff1614611398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138f906143b9565b60405180910390fd5b6113a2600061231e565b565b6113ac611f1a565b73ffffffffffffffffffffffffffffffffffffffff166113ca6114b0565b73ffffffffffffffffffffffffffffffffffffffff1614611420576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611417906143b9565b60405180910390fd5b8060078190555050565b611432611f1a565b73ffffffffffffffffffffffffffffffffffffffff166114506114b0565b73ffffffffffffffffffffffffffffffffffffffff16146114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d906143b9565b60405180910390fd5b8060088190555050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601080546114e7906147de565b80601f0160208091040260200160405190810160405280929190818152602001828054611513906147de565b80156115605780601f1061153557610100808354040283529160200191611560565b820191906000526020600020905b81548152906001019060200180831161154357829003601f168201915b505050505081565b60095481565b611576611f1a565b73ffffffffffffffffffffffffffffffffffffffff166115946114b0565b73ffffffffffffffffffffffffffffffffffffffff16146115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e1906143b9565b60405180910390fd5b61163782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506123e4565b5050565b61164d611646611f1a565b83836123fe565b5050565b611659611f1a565b73ffffffffffffffffffffffffffffffffffffffff166116776114b0565b73ffffffffffffffffffffffffffffffffffffffff16146116cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c4906143b9565b60405180910390fd5b8060068190555050565b6116df611f1a565b73ffffffffffffffffffffffffffffffffffffffff166116fd6114b0565b73ffffffffffffffffffffffffffffffffffffffff1614611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a906143b9565b60405180910390fd5b8060058190555050565b60085481565b60055481565b6000600d54116117ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a590614439565b60405180910390fd5b6001600d54141561191e5783600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611804919061465c565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146118c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c090614419565b60405180910390fd5b6001831461190c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190390614379565b60405180910390fd5b611919338383600161256b565b611a87565b6002600d541415611a4b5783600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611974919061465c565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506003600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3190614319565b60405180910390fd5b611a463383838661256b565b611a86565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7d906142f9565b60405180910390fd5b5b611a918585611f39565b5050505050565b611aa0611f1a565b73ffffffffffffffffffffffffffffffffffffffff16611abe6114b0565b73ffffffffffffffffffffffffffffffffffffffff1614611b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0b906143b9565b60405180910390fd5b8181600e9190611b25929190613169565b505050565b600b6020528060005260406000206000915090505481565b60065481565b611b50611f1a565b73ffffffffffffffffffffffffffffffffffffffff16611b6e6114b0565b73ffffffffffffffffffffffffffffffffffffffff1614611bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbb906143b9565b60405180910390fd5b611bcd816125bc565b6000821480611bdc5750600182145b80611be75750600282145b611c26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1d90614239565b60405180910390fd5b611c413383836040518060200160405280600081525061261a565b5050565b60045481565b600181565b600281565b600181565b6060600e8054611c69906147de565b80601f0160208091040260200160405190810160405280929190818152602001828054611c95906147de565b8015611ce25780601f10611cb757610100808354040283529160200191611ce2565b820191906000526020600020905b815481529060010190602001808311611cc557829003601f168201915b5050505050905090565b6000611cf883836127b0565b80611d095750611d0883836128f7565b5b905092915050565b611d19611f1a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611d5f5750611d5e85611d59611f1a565b611cec565b5b611d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9590614279565b60405180910390fd5b611dab858585858561298b565b5050505050565b611dba611f1a565b73ffffffffffffffffffffffffffffffffffffffff16611dd86114b0565b73ffffffffffffffffffffffffffffffffffffffff1614611e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e25906143b9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9590614219565b60405180910390fd5b611ea78161231e565b50565b6126a281565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600082611f2f8584612c0d565b1490509392505050565b611f42816125bc565b6000821415611f6657611f6181600554611f5c91906146b2565b612cc0565b611feb565b6001821415611f8a57611f8581600654611f8091906146b2565b612cc0565b611fea565b6002821415611fae57611fa981600754611fa491906146b2565b612cc0565b611fe9565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe090614299565b60405180910390fd5b5b5b6120063383836040518060200160405280600081525061261a565b5050565b815183511461204e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612045906144b9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156120be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b5906142b9565b60405180910390fd5b60006120c8611f1a565b90506120d8818787878787612d06565b60005b84518110156122895760008582815181106120f9576120f8614916565b5b60200260200101519050600085838151811061211857612117614916565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156121b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b090614359565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461226e919061465c565b925050819055505050508061228290614841565b90506120db565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161230092919061410a565b60405180910390a4612316818787878787612d0e565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600290805190602001906123fa9291906131ef565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561246d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246490614479565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161255e9190614141565b60405180910390a3505050565b61257784848484610daf565b6125b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ad90614259565b60405180910390fd5b50505050565b806004546125ca919061465c565b6004819055506126a26004541115612617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260e906143f9565b60405180910390fd5b50565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561268a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612681906144d9565b60405180910390fd5b6000612694611f1a565b90506126b5816000876126a688612ef5565b6126af88612ef5565b87612d06565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612714919061465c565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612792929190614514565b60405180910390a46127a981600087878787612f6f565b5050505050565b60008046600181146127c957600481146127e5576127fd565b73a5409ec958c83c3f309868babaca7c86dcb077c191506127fd565b73f57b2c51ded3a29e6891aba85459d600256cf31791505b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156128ee57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401612886919061400b565b60206040518083038186803b15801561289e57600080fd5b505afa1580156128b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d69190613943565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156129fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f2906142b9565b60405180910390fd5b6000612a05611f1a565b9050612a25818787612a1688612ef5565b612a1f88612ef5565b87612d06565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab390614359565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b71919061465c565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051612bee929190614514565b60405180910390a4612c04828888888888612f6f565b50505050505050565b60008082905060005b8451811015612cb5576000858281518110612c3457612c33614916565b5b60200260200101519050808311612c75578281604051602001612c58929190613fdf565b604051602081830303815290604052805190602001209250612ca1565b8083604051602001612c88929190613fdf565b6040516020818303038152906040528051906020012092505b508080612cad90614841565b915050612c16565b508091505092915050565b80341015612d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfa906141d9565b60405180910390fd5b50565b505050505050565b612d2d8473ffffffffffffffffffffffffffffffffffffffff16613156565b15612eed578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612d73959493929190614026565b602060405180830381600087803b158015612d8d57600080fd5b505af1925050508015612dbe57506040513d601f19601f82011682018060405250810190612dbb9190613916565b60015b612e6457612dca614974565b806308c379a01415612e275750612ddf6150b8565b80612dea5750612e29565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1e9190614177565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5b90614199565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee2906141b9565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff811115612f1457612f13614945565b5b604051908082528060200260200182016040528015612f425781602001602082028036833780820191505090505b5090508281600081518110612f5a57612f59614916565b5b60200260200101818152505080915050919050565b612f8e8473ffffffffffffffffffffffffffffffffffffffff16613156565b1561314e578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612fd495949392919061408e565b602060405180830381600087803b158015612fee57600080fd5b505af192505050801561301f57506040513d601f19601f8201168201806040525081019061301c9190613916565b60015b6130c55761302b614974565b806308c379a0141561308857506130406150b8565b8061304b575061308a565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307f9190614177565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130bc90614199565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461314c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613143906141b9565b60405180910390fd5b505b505050505050565b600080823b905060008111915050919050565b828054613175906147de565b90600052602060002090601f01602090048101928261319757600085556131de565b82601f106131b057803560ff19168380011785556131de565b828001600101855582156131de579182015b828111156131dd5782358255916020019190600101906131c2565b5b5090506131eb9190613275565b5090565b8280546131fb906147de565b90600052602060002090601f01602090048101928261321d5760008555613264565b82601f1061323657805160ff1916838001178555613264565b82800160010185558215613264579182015b82811115613263578251825591602001919060010190613248565b5b5090506132719190613275565b5090565b5b8082111561328e576000816000905550600101613276565b5090565b60006132a56132a084614562565b61453d565b905080838252602082019050828560208602820111156132c8576132c76149a0565b5b60005b858110156132f857816132de88826133b4565b8452602084019350602083019250506001810190506132cb565b5050509392505050565b60006133156133108461458e565b61453d565b90508083825260208201905082856020860282011115613338576133376149a0565b5b60005b85811015613368578161334e8882613568565b84526020840193506020830192505060018101905061333b565b5050509392505050565b6000613385613380846145ba565b61453d565b9050828152602081018484840111156133a1576133a06149a5565b5b6133ac84828561479c565b509392505050565b6000813590506133c38161514e565b92915050565b600082601f8301126133de576133dd61499b565b5b81356133ee848260208601613292565b91505092915050565b60008083601f84011261340d5761340c61499b565b5b8235905067ffffffffffffffff81111561342a57613429614996565b5b602083019150836020820283011115613446576134456149a0565b5b9250929050565b600082601f8301126134625761346161499b565b5b8135613472848260208601613302565b91505092915050565b60008135905061348a81615165565b92915050565b60008135905061349f8161517c565b92915050565b6000813590506134b481615193565b92915050565b6000815190506134c981615193565b92915050565b600082601f8301126134e4576134e361499b565b5b81356134f4848260208601613372565b91505092915050565b60008151905061350c816151aa565b92915050565b60008083601f8401126135285761352761499b565b5b8235905067ffffffffffffffff81111561354557613544614996565b5b602083019150836001820283011115613561576135606149a0565b5b9250929050565b600081359050613577816151c1565b92915050565b600060208284031215613593576135926149af565b5b60006135a1848285016133b4565b91505092915050565b600080604083850312156135c1576135c06149af565b5b60006135cf858286016133b4565b92505060206135e0858286016133b4565b9150509250929050565b600080600080600060a08688031215613606576136056149af565b5b6000613614888289016133b4565b9550506020613625888289016133b4565b945050604086013567ffffffffffffffff811115613646576136456149aa565b5b6136528882890161344d565b935050606086013567ffffffffffffffff811115613673576136726149aa565b5b61367f8882890161344d565b925050608086013567ffffffffffffffff8111156136a05761369f6149aa565b5b6136ac888289016134cf565b9150509295509295909350565b600080600080600060a086880312156136d5576136d46149af565b5b60006136e3888289016133b4565b95505060206136f4888289016133b4565b945050604061370588828901613568565b935050606061371688828901613568565b925050608086013567ffffffffffffffff811115613737576137366149aa565b5b613743888289016134cf565b9150509295509295909350565b6000806000806060858703121561376a576137696149af565b5b6000613778878288016133b4565b945050602085013567ffffffffffffffff811115613799576137986149aa565b5b6137a5878288016133f7565b935093505060406137b887828801613568565b91505092959194509250565b600080604083850312156137db576137da6149af565b5b60006137e9858286016133b4565b92505060206137fa8582860161347b565b9150509250929050565b6000806040838503121561381b5761381a6149af565b5b6000613829858286016133b4565b925050602061383a85828601613568565b9150509250929050565b6000806040838503121561385b5761385a6149af565b5b600083013567ffffffffffffffff811115613879576138786149aa565b5b613885858286016133c9565b925050602083013567ffffffffffffffff8111156138a6576138a56149aa565b5b6138b28582860161344d565b9150509250929050565b6000602082840312156138d2576138d16149af565b5b60006138e084828501613490565b91505092915050565b6000602082840312156138ff576138fe6149af565b5b600061390d848285016134a5565b91505092915050565b60006020828403121561392c5761392b6149af565b5b600061393a848285016134ba565b91505092915050565b600060208284031215613959576139586149af565b5b6000613967848285016134fd565b91505092915050565b60008060208385031215613987576139866149af565b5b600083013567ffffffffffffffff8111156139a5576139a46149aa565b5b6139b185828601613512565b92509250509250929050565b6000602082840312156139d3576139d26149af565b5b60006139e184828501613568565b91505092915050565b60008060408385031215613a0157613a006149af565b5b6000613a0f85828601613568565b9250506020613a2085828601613568565b9150509250929050565b600080600080600060808688031215613a4657613a456149af565b5b6000613a5488828901613568565b9550506020613a6588828901613568565b9450506040613a7688828901613568565b935050606086013567ffffffffffffffff811115613a9757613a966149aa565b5b613aa3888289016133f7565b92509250509295509295909350565b6000613abe8383613fa6565b60208301905092915050565b613ad38161470c565b82525050565b613aea613ae58261470c565b61488a565b82525050565b6000613afb826145fb565b613b058185614629565b9350613b10836145eb565b8060005b83811015613b41578151613b288882613ab2565b9750613b338361461c565b925050600181019050613b14565b5085935050505092915050565b613b578161471e565b82525050565b613b668161472a565b82525050565b613b7d613b788261472a565b61489c565b82525050565b6000613b8e82614606565b613b98818561463a565b9350613ba88185602086016147ab565b613bb1816149b4565b840191505092915050565b6000613bc782614611565b613bd1818561464b565b9350613be18185602086016147ab565b613bea816149b4565b840191505092915050565b6000613c0260348361464b565b9150613c0d826149df565b604082019050919050565b6000613c2560288361464b565b9150613c3082614a2e565b604082019050919050565b6000613c4860158361464b565b9150613c5382614a7d565b602082019050919050565b6000613c6b602b8361464b565b9150613c7682614aa6565b604082019050919050565b6000613c8e60268361464b565b9150613c9982614af5565b604082019050919050565b6000613cb160108361464b565b9150613cbc82614b44565b602082019050919050565b6000613cd460188361464b565b9150613cdf82614b6d565b602082019050919050565b6000613cf760298361464b565b9150613d0282614b96565b604082019050919050565b6000613d1a60118361464b565b9150613d2582614be5565b602082019050919050565b6000613d3d60258361464b565b9150613d4882614c0e565b604082019050919050565b6000613d6060328361464b565b9150613d6b82614c5d565b604082019050919050565b6000613d83603d8361464b565b9150613d8e82614cac565b604082019050919050565b6000613da660328361464b565b9150613db182614cfb565b604082019050919050565b6000613dc960178361464b565b9150613dd482614d4a565b602082019050919050565b6000613dec602a8361464b565b9150613df782614d73565b604082019050919050565b6000613e0f601f8361464b565b9150613e1a82614dc2565b602082019050919050565b6000613e32600d8361464b565b9150613e3d82614deb565b602082019050919050565b6000613e5560208361464b565b9150613e6082614e14565b602082019050919050565b6000613e7860318361464b565b9150613e8382614e3d565b604082019050919050565b6000613e9b601f8361464b565b9150613ea682614e8c565b602082019050919050565b6000613ebe60328361464b565b9150613ec982614eb5565b604082019050919050565b6000613ee160108361464b565b9150613eec82614f04565b602082019050919050565b6000613f0460258361464b565b9150613f0f82614f2d565b604082019050919050565b6000613f2760298361464b565b9150613f3282614f7c565b604082019050919050565b6000613f4a60298361464b565b9150613f5582614fcb565b604082019050919050565b6000613f6d60288361464b565b9150613f788261501a565b604082019050919050565b6000613f9060218361464b565b9150613f9b82615069565b604082019050919050565b613faf81614792565b82525050565b613fbe81614792565b82525050565b6000613fd08284613ad9565b60148201915081905092915050565b6000613feb8285613b6c565b602082019150613ffb8284613b6c565b6020820191508190509392505050565b60006020820190506140206000830184613aca565b92915050565b600060a08201905061403b6000830188613aca565b6140486020830187613aca565b818103604083015261405a8186613af0565b9050818103606083015261406e8185613af0565b905081810360808301526140828184613b83565b90509695505050505050565b600060a0820190506140a36000830188613aca565b6140b06020830187613aca565b6140bd6040830186613fb5565b6140ca6060830185613fb5565b81810360808301526140dc8184613b83565b90509695505050505050565b600060208201905081810360008301526141028184613af0565b905092915050565b600060408201905081810360008301526141248185613af0565b905081810360208301526141388184613af0565b90509392505050565b60006020820190506141566000830184613b4e565b92915050565b60006020820190506141716000830184613b5d565b92915050565b600060208201905081810360008301526141918184613bbc565b905092915050565b600060208201905081810360008301526141b281613bf5565b9050919050565b600060208201905081810360008301526141d281613c18565b9050919050565b600060208201905081810360008301526141f281613c3b565b9050919050565b6000602082019050818103600083015261421281613c5e565b9050919050565b6000602082019050818103600083015261423281613c81565b9050919050565b6000602082019050818103600083015261425281613ca4565b9050919050565b6000602082019050818103600083015261427281613cc7565b9050919050565b6000602082019050818103600083015261429281613cea565b9050919050565b600060208201905081810360008301526142b281613d0d565b9050919050565b600060208201905081810360008301526142d281613d30565b9050919050565b600060208201905081810360008301526142f281613d53565b9050919050565b6000602082019050818103600083015261431281613d76565b9050919050565b6000602082019050818103600083015261433281613d99565b9050919050565b6000602082019050818103600083015261435281613dbc565b9050919050565b6000602082019050818103600083015261437281613ddf565b9050919050565b6000602082019050818103600083015261439281613e02565b9050919050565b600060208201905081810360008301526143b281613e25565b9050919050565b600060208201905081810360008301526143d281613e48565b9050919050565b600060208201905081810360008301526143f281613e6b565b9050919050565b6000602082019050818103600083015261441281613e8e565b9050919050565b6000602082019050818103600083015261443281613eb1565b9050919050565b6000602082019050818103600083015261445281613ed4565b9050919050565b6000602082019050818103600083015261447281613ef7565b9050919050565b6000602082019050818103600083015261449281613f1a565b9050919050565b600060208201905081810360008301526144b281613f3d565b9050919050565b600060208201905081810360008301526144d281613f60565b9050919050565b600060208201905081810360008301526144f281613f83565b9050919050565b600060208201905061450e6000830184613fb5565b92915050565b60006040820190506145296000830185613fb5565b6145366020830184613fb5565b9392505050565b6000614547614558565b90506145538282614810565b919050565b6000604051905090565b600067ffffffffffffffff82111561457d5761457c614945565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156145a9576145a8614945565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156145d5576145d4614945565b5b6145de826149b4565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061466782614792565b915061467283614792565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146a7576146a66148b8565b5b828201905092915050565b60006146bd82614792565b91506146c883614792565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614701576147006148b8565b5b828202905092915050565b600061471782614772565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061476b8261470c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156147c95780820151818401526020810190506147ae565b838111156147d8576000848401525b50505050565b600060028204905060018216806147f657607f821691505b6020821081141561480a576148096148e7565b5b50919050565b614819826149b4565b810181811067ffffffffffffffff8211171561483857614837614945565b5b80604052505050565b600061484c82614792565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561487f5761487e6148b8565b5b600182019050919050565b6000614895826148a6565b9050919050565b6000819050919050565b60006148b1826149c5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156149935760046000803e6149906000516149d2565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682066756e64732073656e740000000000000000000000600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420706173735479706500000000000000000000000000000000600082015250565b7f55736572206973206e6f74206f6e2077686974656c6973740000000000000000600082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420706173732074797065000000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f546865206561726c792073616c65206973206f7665722e20557365207468652060008201527f7075626c6963206d696e742066756e6374696f6e20696e73746561642e000000602082015250565b7f43616e6e6f74206d696e74206d6f7265207468616e203320706572206164647260008201527f65737320696e20746869732070686173652e0000000000000000000000000000602082015250565b7f5075626c6963206d696e74206973206e6f74206f70656e000000000000000000600082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4d75737420757365204669727374204275796572732077686974656c69737400600082015250565b7f496e76616c696420737461746500000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616e6e6f74206d696e74206d6f7265207468616e203520706572206164647260008201527f65737320696e2074686973207068617365000000000000000000000000000000602082015250565b7f4d696e74696e6720776f756c6420657863656564206d617820746f6b656e7300600082015250565b7f43616e6e6f74206d696e74206d6f7265207468616e203120706572206164647260008201527f65737320696e20746869732070686173652e0000000000000000000000000000602082015250565b7f53616c65206973206e6f74206f70656e00000000000000000000000000000000600082015250565b7f496e76616c69642077686974656c697374547970652c206d757374206265203160008201527f206f722032000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d10156150c85761514b565b6150d0614558565b60043d036004823e80513d602482011167ffffffffffffffff821117156150f857505061514b565b808201805167ffffffffffffffff811115615116575050505061514b565b80602083010160043d03850181111561513357505050505061514b565b61514282602001850186614810565b82955050505050505b90565b6151578161470c565b811461516257600080fd5b50565b61516e8161471e565b811461517957600080fd5b50565b6151858161472a565b811461519057600080fd5b50565b61519c81614734565b81146151a757600080fd5b50565b6151b381614760565b81146151be57600080fd5b50565b6151ca81614792565b81146151d557600080fd5b5056fea26469706673582212209342a4745e89b9456f0406193b5eff2094a981d24e7513d7976e60e16ae3257a64736f6c63430008070033
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.