Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,006 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 15670226 | 861 days ago | IN | 0 ETH | 0.00042372 | ||||
Flip Public Sale... | 15417065 | 899 days ago | IN | 0 ETH | 0.00082466 | ||||
Flip Sale Status | 15417059 | 899 days ago | IN | 0 ETH | 0.00050329 | ||||
Mint Public | 15417055 | 899 days ago | IN | 0.1 ETH | 0.00148117 | ||||
Mint Public | 15417051 | 899 days ago | IN | 0.1 ETH | 0.00154709 | ||||
Mint Public | 15417048 | 899 days ago | IN | 0.1 ETH | 0.00147602 | ||||
Mint Public | 15417042 | 899 days ago | IN | 0 ETH | 0.00129367 | ||||
Mint Public | 15417018 | 899 days ago | IN | 0.1 ETH | 0.00178948 | ||||
Mint Public | 15416980 | 899 days ago | IN | 0.1 ETH | 0.00239828 | ||||
Mint Public | 15416962 | 899 days ago | IN | 0.3 ETH | 0.00208607 | ||||
Mint Public | 15416962 | 899 days ago | IN | 0.1 ETH | 0.00199744 | ||||
Mint Public | 15416954 | 899 days ago | IN | 0.1 ETH | 0.00245495 | ||||
Mint Public | 15416766 | 899 days ago | IN | 0.2 ETH | 0.00335038 | ||||
Mint Public | 15416766 | 899 days ago | IN | 0.1 ETH | 0.00327766 | ||||
Mint Public | 15416764 | 899 days ago | IN | 0.1 ETH | 0.00365338 | ||||
Mint Public | 15416764 | 899 days ago | IN | 0.1 ETH | 0.0031992 | ||||
Mint Public | 15416760 | 899 days ago | IN | 0.1 ETH | 0.00373875 | ||||
Mint Public | 15416633 | 899 days ago | IN | 0.2 ETH | 0.00173428 | ||||
Mint Public | 15416631 | 899 days ago | IN | 0.1 ETH | 0.00190405 | ||||
Mint Public | 15416576 | 899 days ago | IN | 0.1 ETH | 0.00402356 | ||||
Mint Public | 15416553 | 899 days ago | IN | 0.1 ETH | 0.00150872 | ||||
Mint Public | 15416487 | 899 days ago | IN | 0.1 ETH | 0.001914 | ||||
Mint Public | 15416430 | 899 days ago | IN | 0.2 ETH | 0.00441556 | ||||
Mint Public | 15416370 | 899 days ago | IN | 0.1 ETH | 0.00173621 | ||||
Mint Public | 15416364 | 899 days ago | IN | 0.1 ETH | 0.00157627 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
15417055 | 899 days ago | 0.1 ETH | ||||
15417051 | 899 days ago | 0.1 ETH | ||||
15417048 | 899 days ago | 0.1 ETH | ||||
15417018 | 899 days ago | 0.1 ETH | ||||
15416980 | 899 days ago | 0.1 ETH | ||||
15416962 | 899 days ago | 0.3 ETH | ||||
15416962 | 899 days ago | 0.1 ETH | ||||
15416954 | 899 days ago | 0.1 ETH | ||||
15416766 | 899 days ago | 0.2 ETH | ||||
15416766 | 899 days ago | 0.1 ETH | ||||
15416764 | 899 days ago | 0.1 ETH | ||||
15416764 | 899 days ago | 0.1 ETH | ||||
15416760 | 899 days ago | 0.1 ETH | ||||
15416633 | 899 days ago | 0.2 ETH | ||||
15416631 | 899 days ago | 0.1 ETH | ||||
15416576 | 899 days ago | 0.1 ETH | ||||
15416553 | 899 days ago | 0.1 ETH | ||||
15416487 | 899 days ago | 0.1 ETH | ||||
15416430 | 899 days ago | 0.2 ETH | ||||
15416370 | 899 days ago | 0.1 ETH | ||||
15416364 | 899 days ago | 0.1 ETH | ||||
15416216 | 899 days ago | 0.1 ETH | ||||
15416200 | 899 days ago | 0.1 ETH | ||||
15416169 | 899 days ago | 0.6 ETH | ||||
15416063 | 899 days ago | 0.2 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Minter
Compiler Version
v0.8.15+commit.e14f2714
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.15; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./IToken.sol"; contract Minter is Ownable, ReentrancyGuard { using SafeERC20 for IERC20; // ======== Supply ========= uint256 public maxMintsPerAddress; uint256 public maxTokens; // ======== Cost =========; uint256 public immutable tokenPriceETH; uint256 public tokenPriceETH_Discount; uint256 public tokenPriceApeCoin; uint256 public tokenPriceApeCoin_Discount; event TokenPriceApeCoinChanged(uint256 oldPrice, uint256 newPrice); event TokenPriceApeCoinDiscountChanged(uint256 oldPrice, uint256 newPrice); event TokenPriceETHDiscountChanged(uint256 oldPrice, uint256 newPrice); // ======== Sale Status ========= bool public saleIsActive = false; bool public saleApeCoinIsActive = false; bool public isWhitelistSaleActive = false; bool public isDiscountedSaleActive = false; bool public isPublicSaleActive = false; // ======== Claim Tracking ========= mapping(address => uint256) private addressToMintCount; mapping(address => bool) public whitelistClaimed; mapping(address => uint256) public discountClaimed; // ======== Whitelist Validation ========= bytes32 public whitelistMerkleRoot; bytes32 public discountMerkleRoot; // ======== External Storage Contract ========= IToken public immutable token; // ======== Fund Management ========= // NFF Gnosis Wallet address public withdrawalAddress = 0xAEE6a9660878A217f4070181FFb271c4De61fBac; // ======== ApeCoin Support ========= IERC20 public immutable tokenApeCoin; // ======== Constructor ========= constructor(address contractAddress, uint256 _maxTokens, uint256 _maxMintsPerAddress, IERC20 _tokenApeCoin, uint256 _tokenPriceETH_Discount, uint256 _tokenPriceETH, uint256 _tokenPriceApeCoin_Discount, uint256 _tokenPriceApeCoin) { token = IToken(contractAddress); maxTokens = _maxTokens; maxMintsPerAddress = _maxMintsPerAddress; tokenApeCoin = _tokenApeCoin; tokenPriceETH = _tokenPriceETH; setTokenPriceETHDiscount(_tokenPriceETH_Discount); setTokenPriceApeCoin(_tokenPriceApeCoin); setTokenPriceApeCoinDiscount(_tokenPriceApeCoin_Discount); } // ======== Modifier Checks ========= modifier isWhitelistMerkleRootSet() { require(whitelistMerkleRoot != 0, "Whitelist merkle root not set!"); _; } modifier isValidMerkleProofWhitelist(address _address, bytes32[] calldata merkleProof, uint256 quantity) { require( MerkleProof.verify( merkleProof, whitelistMerkleRoot, keccak256(abi.encodePacked(keccak256(abi.encodePacked(_address, quantity))) ) ), "Address is not on whitelist!"); _; } modifier isDiscountMerkleRootSet() { require(discountMerkleRoot != 0, "Discount merkle root not set!"); _; } modifier isValidMerkleProofDiscount(address _address, bytes32[] calldata merkleProof, uint256 quantity) { require( MerkleProof.verify( merkleProof, discountMerkleRoot, keccak256(abi.encodePacked(keccak256(abi.encodePacked(_address, quantity))) ) ), "Address is not on discount list!"); _; } modifier isSupplyAvailable(uint256 numberOfTokens) { uint256 supply = token.tokenCount(); require(supply + numberOfTokens <= maxTokens, "Exceeds max token supply!"); _; } modifier isSaleActive() { require(saleIsActive, "Sale is not active!"); _; } modifier isMaxMintsPerAddressExceeded(uint amount) { require(addressToMintCount[msg.sender] + amount <= maxMintsPerAddress, "Exceeds max mint per address!"); _; } /// @notice Set the discounted token price in ETH /// @param _tokenPriceETHDiscount The ETH price function setTokenPriceETHDiscount(uint256 _tokenPriceETHDiscount) public onlyOwner { emit TokenPriceETHDiscountChanged(tokenPriceETH_Discount, _tokenPriceETHDiscount); tokenPriceETH_Discount = _tokenPriceETHDiscount; } /// @notice Set the token price in ApeCoin /// @param _tokenPriceApeCoin The ApeCoin price function setTokenPriceApeCoin(uint256 _tokenPriceApeCoin) public onlyOwner { emit TokenPriceApeCoinChanged(tokenPriceApeCoin, _tokenPriceApeCoin); tokenPriceApeCoin = _tokenPriceApeCoin; } /// @notice Set the discounted token price in ApeCoin /// @param _tokenPriceApeCoinDiscount The ApeCoin price function setTokenPriceApeCoinDiscount(uint256 _tokenPriceApeCoinDiscount) public onlyOwner { emit TokenPriceApeCoinDiscountChanged(tokenPriceApeCoin_Discount, _tokenPriceApeCoinDiscount); tokenPriceApeCoin_Discount = _tokenPriceApeCoinDiscount; } /// @notice Transfer funds to gnosis wallet /// @param qty The qty user is purchsing /// @param applyDiscount Is this a discounted purchase function transferFunds(uint256 qty, bool applyDiscount) private { uint256 priceETH = !applyDiscount ? tokenPriceETH : tokenPriceETH_Discount; uint256 priceApeCoin = !applyDiscount ? tokenPriceApeCoin : tokenPriceApeCoin_Discount; if(msg.value == qty * priceETH) { // pay with ETH (bool success, ) = payable(withdrawalAddress).call{value: qty * priceETH}(""); require(success, "transfer failed"); } else if(msg.value == 0) { // pay with ApeCoin require(saleApeCoinIsActive, "ApeCoin sale is not active!"); tokenApeCoin.safeTransferFrom( msg.sender, withdrawalAddress, qty * priceApeCoin ); } else { revert("invalid payment option"); } } // ======== Mint Functions ========= /// @notice Mint all available tokens on whitelist /// @param merkleProof The merkle proof generated offchain /// @param amount The amount user can mint function mintWhitelist(bytes32[] calldata merkleProof, uint amount) public isSaleActive() isWhitelistMerkleRootSet() isValidMerkleProofWhitelist(msg.sender, merkleProof, amount) isSupplyAvailable(amount) isMaxMintsPerAddressExceeded(amount) nonReentrant { require(isWhitelistSaleActive, "Whitlist sale is not active!"); require(!whitelistClaimed[msg.sender], "Whitelist is already claimed by this wallet!"); token.mint(amount, msg.sender); addressToMintCount[msg.sender] += amount; whitelistClaimed[msg.sender] = true; } /// @notice Mint tokens at a discounted price /// @param merkleProof The merkle proof generated offchain /// @param amount The amount user can mint /// @param quantity The quantity user would like to mint function mintDiscount(bytes32[] calldata merkleProof, uint amount, uint quantity) public payable isSaleActive() isDiscountMerkleRootSet() isValidMerkleProofDiscount(msg.sender, merkleProof, amount) isSupplyAvailable(quantity) isMaxMintsPerAddressExceeded(quantity) nonReentrant { require(isDiscountedSaleActive, "Discount sale is not active!"); require(discountClaimed[msg.sender] != amount, "Discount is already claimed by this wallet!"); token.mint(quantity, msg.sender); transferFunds(quantity, true); addressToMintCount[msg.sender] += quantity; discountClaimed[msg.sender] += quantity; } /// @notice Mint tokens at public price /// @param quantity The quantity user would like to mint function mintPublic(uint quantity) public payable isSaleActive() isSupplyAvailable(quantity) isMaxMintsPerAddressExceeded(quantity) nonReentrant { require(isPublicSaleActive, "Public sale is not active!"); require(msg.sender == tx.origin, "Mint: not allowed from contract"); transferFunds(quantity, false); token.mint(quantity, msg.sender); addressToMintCount[msg.sender] += quantity; } /// @notice Mint team tokens at zero cost /// @param _to The address to send the tokens /// @param _reserveAmount The quantity user would like to mint function mintTeamTokens(address _to, uint256 _reserveAmount) public onlyOwner isSupplyAvailable(_reserveAmount) { token.mint(_reserveAmount, _to); } // ======== Whitelisting ========= /// @notice Set merkle root for whitelist mints /// @param merkleRoot The merkle root function setWhitelistMerkleRoot(bytes32 merkleRoot) external onlyOwner { whitelistMerkleRoot = merkleRoot; } /// @notice Check if user is whitelisted /// @param _address The whitelisted address /// @param merkleProof The merkle proof generated offchain /// @param amount The number of tokens the user has been whitelisted for function isWhitelisted(address _address, bytes32[] calldata merkleProof, uint256 amount) external view isValidMerkleProofWhitelist(_address, merkleProof, amount) returns (bool) { require(!whitelistClaimed[_address], "Whitelist is already claimed by this wallet"); return true; } /// @notice Check if user has claimed all their whitelist spots /// @param _address The whitelisted address function isWhitelistClaimed(address _address) external view returns (bool) { return whitelistClaimed[_address]; } // ======== Discounting ========= /// @notice Set merkle root for discounted mints /// @param merkleRoot The merkle root function setDiscountMerkleRoot(bytes32 merkleRoot) external onlyOwner { discountMerkleRoot = merkleRoot; } /// @notice Check if user is on discount list /// @param _address The discounted address /// @param merkleProof The merkle proof generated offchain /// @param amount The number of tokens the user has been whitelisted for function isDiscounted(address _address, bytes32[] calldata merkleProof, uint256 amount) external view isValidMerkleProofDiscount(_address, merkleProof, amount) returns (bool) { require(discountClaimed[_address] != amount, "Discount is already claimed by this wallet"); return true; } /// @notice Returns the number of discounted spots user has claimed /// @param _address The discounted address function discountsClaimed(address _address) external view returns (uint256) { return discountClaimed[_address]; } // ======== Utilities ========= /// @notice Returns the number of tokens minted by an address /// @param _address The minter's address function mintCount(address _address) external view returns (uint) { return addressToMintCount[_address]; } // ======== State Management ========= /// @notice Toggle mint sale status function flipSaleStatus() public onlyOwner { saleIsActive = !saleIsActive; } /// @notice Toggle whitelist mint sale status function flipWhitelistSaleStatus() public onlyOwner { isWhitelistSaleActive = !isWhitelistSaleActive; } /// @notice Toggle discounted mint sale status function flipDiscountedSaleStatus() public onlyOwner { isDiscountedSaleActive = !isDiscountedSaleActive; } /// @notice Toggle public mint sale status function flipPublicSaleStatus() public onlyOwner { isPublicSaleActive = !isPublicSaleActive; } /// @notice Toggle ApeCoin sale status function flipSaleApeCoinStatus() public onlyOwner { saleApeCoinIsActive = !saleApeCoinIsActive; } // ======== Token Supply Management========= /// @notice Set the max mints per address /// @param _max The maximum number of tokens a user can mint function setMaxMintPerAddress(uint _max) public onlyOwner { maxMintsPerAddress = _max; } /// @notice Set the max supply, can only be lowered not increased /// @param newMaxTokenSupply The maximum number of tokens that can be minted function decreaseTokenSupply(uint256 newMaxTokenSupply) external onlyOwner { require(maxTokens > newMaxTokenSupply, "Max token supply can only be decreased!"); maxTokens = newMaxTokenSupply; } // ======== Withdraw ========= /// @notice Set the withdrawal address for all funds /// @param _newWithdrawalAddress The withdrawal address for buth ETH/ApeCoin funds function setWithdrawalAddress(address _newWithdrawalAddress) public onlyOwner { withdrawalAddress = _newWithdrawalAddress; } }
// SPDX-License-Identifier: MIT 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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT 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) { 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)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } }
// SPDX-License-Identifier: MIT 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 pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// Contract based on https://docs.openzeppelin.com/contracts/3.x/erc721 // SPDX-License-Identifier: MIT /// @title Interface for Token pragma solidity ^0.8.15; abstract contract IToken { function setProvenanceHash(string memory _provenanceHash) virtual external; function mint(uint256 _count, address _recipient) virtual external; function setBaseURI(string memory baseURI) virtual external; function updateMinter(address _minter) virtual external; function lockMinter() virtual external; function tokenCount() virtual external returns (uint256); }
// SPDX-License-Identifier: MIT 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; } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"_maxTokens","type":"uint256"},{"internalType":"uint256","name":"_maxMintsPerAddress","type":"uint256"},{"internalType":"contract IERC20","name":"_tokenApeCoin","type":"address"},{"internalType":"uint256","name":"_tokenPriceETH_Discount","type":"uint256"},{"internalType":"uint256","name":"_tokenPriceETH","type":"uint256"},{"internalType":"uint256","name":"_tokenPriceApeCoin_Discount","type":"uint256"},{"internalType":"uint256","name":"_tokenPriceApeCoin","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"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":false,"internalType":"uint256","name":"oldPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"TokenPriceApeCoinChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"TokenPriceApeCoinDiscountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"TokenPriceETHDiscountChanged","type":"event"},{"inputs":[{"internalType":"uint256","name":"newMaxTokenSupply","type":"uint256"}],"name":"decreaseTokenSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"discountClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"discountMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"discountsClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipDiscountedSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPublicSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleApeCoinStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhitelistSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"isDiscounted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDiscountedSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintDiscount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"mintTeamTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleApeCoinIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setDiscountMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxMintPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenPriceApeCoin","type":"uint256"}],"name":"setTokenPriceApeCoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenPriceApeCoinDiscount","type":"uint256"}],"name":"setTokenPriceApeCoinDiscount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenPriceETHDiscount","type":"uint256"}],"name":"setTokenPriceETHDiscount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newWithdrawalAddress","type":"address"}],"name":"setWithdrawalAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenApeCoin","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPriceApeCoin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPriceApeCoin_Discount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPriceETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPriceETH_Discount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60e06040526000600760006101000a81548160ff0219169083151502179055506000600760016101000a81548160ff0219169083151502179055506000600760026101000a81548160ff0219169083151502179055506000600760036101000a81548160ff0219169083151502179055506000600760046101000a81548160ff02191690831515021790555073aee6a9660878a217f4070181ffb271c4de61fbac600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000ed57600080fd5b5060405162004dfb38038062004dfb83398181016040528101906200011391906200065a565b6200013362000127620001f960201b60201c565b6200020160201b60201c565b600180819055508773ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505086600381905550856002819055508473ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508260808181525050620001c984620002c560201b60201c565b620001da816200039b60201b60201c565b620001eb826200047160201b60201c565b5050505050505050620007e4565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002d5620001f960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002fb6200054760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000354576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200034b9062000784565b60405180910390fd5b7f616211c440ee58ae6f25cbd9e9bc4c443e821e5e609dba05b7c556cd29cb222e6004548260405162000389929190620007b7565b60405180910390a18060048190555050565b620003ab620001f960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003d16200054760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200042a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004219062000784565b60405180910390fd5b7fe37f490f6820c4aeb200a00776b1dd5a41d05cd1d13ebe80bc9bddc12f408e20600554826040516200045f929190620007b7565b60405180910390a18060058190555050565b62000481620001f960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004a76200054760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000500576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004f79062000784565b60405180910390fd5b7f5b62250854903ecfb1e67a098b20b95793b97c8e7f182e4f4697b92ebbec9bb36006548260405162000535929190620007b7565b60405180910390a18060068190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005a28262000575565b9050919050565b620005b48162000595565b8114620005c057600080fd5b50565b600081519050620005d481620005a9565b92915050565b6000819050919050565b620005ef81620005da565b8114620005fb57600080fd5b50565b6000815190506200060f81620005e4565b92915050565b6000620006228262000595565b9050919050565b620006348162000615565b81146200064057600080fd5b50565b600081519050620006548162000629565b92915050565b600080600080600080600080610100898b0312156200067e576200067d62000570565b5b60006200068e8b828c01620005c3565b9850506020620006a18b828c01620005fe565b9750506040620006b48b828c01620005fe565b9650506060620006c78b828c0162000643565b9550506080620006da8b828c01620005fe565b94505060a0620006ed8b828c01620005fe565b93505060c0620007008b828c01620005fe565b92505060e0620007138b828c01620005fe565b9150509295985092959890939650565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200076c60208362000723565b9150620007798262000734565b602082019050919050565b600060208201905081810360008301526200079f816200075d565b9050919050565b620007b181620005da565b82525050565b6000604082019050620007ce6000830185620007a6565b620007dd6020830184620007a6565b9392505050565b60805160a05160c0516145a16200085a60003960008181610cc70152612cb0015260008181610d6a01528181610e4d01528181611615015281816118b101528181611f50015281816121d80152818161255d015281816127ed01526129450152600081816109f40152612afb01526145a16000f3fe60806040526004361061025c5760003560e01c8063a371a06211610144578063db4bec44116100b6578063ef59f1e41161007a578063ef59f1e414610878578063efd0cbf9146108b5578063f2bcd022146108d1578063f2fde38b146108fc578063f618e63814610925578063fc0c546a146109415761025c565b8063db4bec441461077f578063e04e82dd146107bc578063e8315742146107e5578063eb8d244414610810578063ed9ec8881461083b5761025c565b8063b98451cf11610108578063b98451cf14610681578063bd32fb66146106ac578063c31769fd146106d5578063ce03ec9314610712578063d6f0874e14610729578063db474b39146107545761025c565b8063a371a062146105ae578063a6d612f9146105eb578063aa98e0c614610614578063ae6a80d51461063f578063b5b781c51461066a5761025c565b806359913d47116101dd57806381bb5cb4116101a157806381bb5cb41461049e5780638521b8e3146104c9578063853a5606146105065780638da5cb5b1461051d5780638ffefa0d146105485780639f2d83fd146105715761025c565b806359913d47146103df57806359eaa0951461040a578063657732561461043357806367142cf61461045e578063715018a6146104875761025c565b8063237fa68811610224578063237fa6881461033257806340d34133146103495780634da3cc4a146103745780634f92bea01461038b5780635057afb4146103b65761025c565b80631abae686146102615780631dfe90951461028a5780631e14d44b146102b55780631e84c413146102de57806321b8092e14610309575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613072565b61096c565b005b34801561029657600080fd5b5061029f6109f2565b6040516102ac91906130b8565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d791906130ff565b610a16565b005b3480156102ea57600080fd5b506102f3610a9c565b6040516103009190613147565b60405180910390f35b34801561031557600080fd5b50610330600480360381019061032b91906131c0565b610aaf565b005b34801561033e57600080fd5b50610347610b6f565b005b34801561035557600080fd5b5061035e610c17565b60405161036b91906131fc565b60405180910390f35b34801561038057600080fd5b50610389610c1d565b005b34801561039757600080fd5b506103a0610cc5565b6040516103ad9190613276565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d89190613291565b610ce9565b005b3480156103eb57600080fd5b506103f4610ede565b6040516104019190613147565b60405180910390f35b34801561041657600080fd5b50610431600480360381019061042c91906130ff565b610ef1565b005b34801561043f57600080fd5b50610448610fbb565b6040516104559190613147565b60405180910390f35b34801561046a57600080fd5b50610485600480360381019061048091906130ff565b610fce565b005b34801561049357600080fd5b5061049c61108f565b005b3480156104aa57600080fd5b506104b3611117565b6040516104c091906130b8565b60405180910390f35b3480156104d557600080fd5b506104f060048036038101906104eb91906131c0565b61111d565b6040516104fd9190613147565b60405180910390f35b34801561051257600080fd5b5061051b611173565b005b34801561052957600080fd5b5061053261121b565b60405161053f91906132e0565b60405180910390f35b34801561055457600080fd5b5061056f600480360381019061056a91906130ff565b611244565b005b34801561057d57600080fd5b50610598600480360381019061059391906131c0565b611305565b6040516105a591906130b8565b60405180910390f35b3480156105ba57600080fd5b506105d560048036038101906105d09190613360565b61131d565b6040516105e29190613147565b60405180910390f35b3480156105f757600080fd5b50610612600480360381019061060d91906133d4565b61149b565b005b34801561062057600080fd5b506106296119fd565b60405161063691906131fc565b60405180910390f35b34801561064b57600080fd5b50610654611a03565b60405161066191906130b8565b60405180910390f35b34801561067657600080fd5b5061067f611a09565b005b34801561068d57600080fd5b50610696611ab1565b6040516106a39190613147565b60405180910390f35b3480156106b857600080fd5b506106d360048036038101906106ce9190613072565b611ac4565b005b3480156106e157600080fd5b506106fc60048036038101906106f79190613360565b611b4a565b6040516107099190613147565b60405180910390f35b34801561071e57600080fd5b50610727611cbc565b005b34801561073557600080fd5b5061073e611d64565b60405161074b91906130b8565b60405180910390f35b34801561076057600080fd5b50610769611d6a565b60405161077691906130b8565b60405180910390f35b34801561078b57600080fd5b506107a660048036038101906107a191906131c0565b611d70565b6040516107b39190613147565b60405180910390f35b3480156107c857600080fd5b506107e360048036038101906107de91906130ff565b611d90565b005b3480156107f157600080fd5b506107fa611e51565b60405161080791906130b8565b60405180910390f35b34801561081c57600080fd5b50610825611e57565b6040516108329190613147565b60405180910390f35b34801561084757600080fd5b50610862600480360381019061085d91906131c0565b611e6a565b60405161086f91906130b8565b60405180910390f35b34801561088457600080fd5b5061089f600480360381019061089a91906131c0565b611eb3565b6040516108ac91906130b8565b60405180910390f35b6108cf60048036038101906108ca91906130ff565b611efc565b005b3480156108dd57600080fd5b506108e66122c6565b6040516108f391906132e0565b60405180910390f35b34801561090857600080fd5b50610923600480360381019061091e91906131c0565b6122ec565b005b61093f600480360381019061093a9190613434565b6123e3565b005b34801561094d57600080fd5b50610956612943565b60405161096391906134c9565b60405180910390f35b610974612967565b73ffffffffffffffffffffffffffffffffffffffff1661099261121b565b73ffffffffffffffffffffffffffffffffffffffff16146109e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109df90613541565b60405180910390fd5b80600c8190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610a1e612967565b73ffffffffffffffffffffffffffffffffffffffff16610a3c61121b565b73ffffffffffffffffffffffffffffffffffffffff1614610a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8990613541565b60405180910390fd5b8060028190555050565b600760049054906101000a900460ff1681565b610ab7612967565b73ffffffffffffffffffffffffffffffffffffffff16610ad561121b565b73ffffffffffffffffffffffffffffffffffffffff1614610b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2290613541565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610b77612967565b73ffffffffffffffffffffffffffffffffffffffff16610b9561121b565b73ffffffffffffffffffffffffffffffffffffffff1614610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be290613541565b60405180910390fd5b600760039054906101000a900460ff1615600760036101000a81548160ff021916908315150217905550565b600c5481565b610c25612967565b73ffffffffffffffffffffffffffffffffffffffff16610c4361121b565b73ffffffffffffffffffffffffffffffffffffffff1614610c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9090613541565b60405180910390fd5b600760029054906101000a900460ff1615600760026101000a81548160ff021916908315150217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b610cf1612967565b73ffffffffffffffffffffffffffffffffffffffff16610d0f61121b565b73ffffffffffffffffffffffffffffffffffffffff1614610d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5c90613541565b60405180910390fd5b8060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639f181b5e6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610dd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df99190613576565b90506003548282610e0a91906135d2565b1115610e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4290613674565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166394bf804d84866040518363ffffffff1660e01b8152600401610ea6929190613694565b600060405180830381600087803b158015610ec057600080fd5b505af1158015610ed4573d6000803e3d6000fd5b5050505050505050565b600760039054906101000a900460ff1681565b610ef9612967565b73ffffffffffffffffffffffffffffffffffffffff16610f1761121b565b73ffffffffffffffffffffffffffffffffffffffff1614610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6490613541565b60405180910390fd5b8060035411610fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa89061372f565b60405180910390fd5b8060038190555050565b600760019054906101000a900460ff1681565b610fd6612967565b73ffffffffffffffffffffffffffffffffffffffff16610ff461121b565b73ffffffffffffffffffffffffffffffffffffffff161461104a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104190613541565b60405180910390fd5b7f5b62250854903ecfb1e67a098b20b95793b97c8e7f182e4f4697b92ebbec9bb36006548260405161107d92919061374f565b60405180910390a18060068190555050565b611097612967565b73ffffffffffffffffffffffffffffffffffffffff166110b561121b565b73ffffffffffffffffffffffffffffffffffffffff161461110b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110290613541565b60405180910390fd5b611115600061296f565b565b60055481565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61117b612967565b73ffffffffffffffffffffffffffffffffffffffff1661119961121b565b73ffffffffffffffffffffffffffffffffffffffff16146111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e690613541565b60405180910390fd5b600760019054906101000a900460ff1615600760016101000a81548160ff021916908315150217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61124c612967565b73ffffffffffffffffffffffffffffffffffffffff1661126a61121b565b73ffffffffffffffffffffffffffffffffffffffff16146112c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b790613541565b60405180910390fd5b7fe37f490f6820c4aeb200a00776b1dd5a41d05cd1d13ebe80bc9bddc12f408e20600554826040516112f392919061374f565b60405180910390a18060058190555050565b600a6020528060005260406000206000915090505481565b6000848484846113bf838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b54868460405160200161137e9291906137e1565b604051602081830303815290604052805190602001206040516020016113a4919061382e565b60405160208183030381529060405280519060200120612a33565b6113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f590613895565b60405180910390fd5b600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148290613927565b60405180910390fd5b6001945050505050949350505050565b600760009054906101000a900460ff166114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190613993565b60405180910390fd5b6000801b600b5403611531576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611528906139ff565b60405180910390fd5b338383836115d1838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b5486846040516020016115909291906137e1565b604051602081830303815290604052805190602001206040516020016115b6919061382e565b60405160208183030381529060405280519060200120612a33565b611610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160790613895565b60405180910390fd5b8460007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639f181b5e6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611680573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a49190613576565b905060035482826116b591906135d2565b11156116f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ed90613674565b60405180910390fd5b8660025481600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461174591906135d2565b1115611786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177d90613a6b565b60405180910390fd5b6002600154036117cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c290613ad7565b60405180910390fd5b6002600181905550600760029054906101000a900460ff16611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990613b43565b60405180910390fd5b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a690613bd5565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166394bf804d89336040518363ffffffff1660e01b815260040161190a929190613694565b600060405180830381600087803b15801561192457600080fd5b505af1158015611938573d6000803e3d6000fd5b5050505087600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461198b91906135d2565b925050819055506001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001808190555050505050505050505050565b600b5481565b60025481565b611a11612967565b73ffffffffffffffffffffffffffffffffffffffff16611a2f61121b565b73ffffffffffffffffffffffffffffffffffffffff1614611a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7c90613541565b60405180910390fd5b600760049054906101000a900460ff1615600760046101000a81548160ff021916908315150217905550565b600760029054906101000a900460ff1681565b611acc612967565b73ffffffffffffffffffffffffffffffffffffffff16611aea61121b565b73ffffffffffffffffffffffffffffffffffffffff1614611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790613541565b60405180910390fd5b80600b8190555050565b600084848484611bec838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c548684604051602001611bab9291906137e1565b60405160208183030381529060405280519060200120604051602001611bd1919061382e565b60405160208183030381529060405280519060200120612a33565b611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290613c41565b60405180910390fd5b85600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403611cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca390613cd3565b60405180910390fd5b6001945050505050949350505050565b611cc4612967565b73ffffffffffffffffffffffffffffffffffffffff16611ce261121b565b73ffffffffffffffffffffffffffffffffffffffff1614611d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2f90613541565b60405180910390fd5b600760009054906101000a900460ff1615600760006101000a81548160ff021916908315150217905550565b60045481565b60065481565b60096020528060005260406000206000915054906101000a900460ff1681565b611d98612967565b73ffffffffffffffffffffffffffffffffffffffff16611db661121b565b73ffffffffffffffffffffffffffffffffffffffff1614611e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0390613541565b60405180910390fd5b7f616211c440ee58ae6f25cbd9e9bc4c443e821e5e609dba05b7c556cd29cb222e60045482604051611e3f92919061374f565b60405180910390a18060048190555050565b60035481565b600760009054906101000a900460ff1681565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600760009054906101000a900460ff16611f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4290613993565b60405180910390fd5b8060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639f181b5e6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611fbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdf9190613576565b90506003548282611ff091906135d2565b1115612031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202890613674565b60405180910390fd5b8260025481600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461208091906135d2565b11156120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b890613a6b565b60405180910390fd5b600260015403612106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fd90613ad7565b60405180910390fd5b6002600181905550600760049054906101000a900460ff1661215d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215490613d3f565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c290613dab565b60405180910390fd5b6121d6846000612ae9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166394bf804d85336040518363ffffffff1660e01b8152600401612231929190613694565b600060405180830381600087803b15801561224b57600080fd5b505af115801561225f573d6000803e3d6000fd5b5050505083600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122b291906135d2565b925050819055506001808190555050505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122f4612967565b73ffffffffffffffffffffffffffffffffffffffff1661231261121b565b73ffffffffffffffffffffffffffffffffffffffff1614612368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235f90613541565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce90613e3d565b60405180910390fd5b6123e08161296f565b50565b600760009054906101000a900460ff16612432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242990613993565b60405180910390fd5b6000801b600c5403612479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247090613ea9565b60405180910390fd5b33848484612519838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c5486846040516020016124d89291906137e1565b604051602081830303815290604052805190602001206040516020016124fe919061382e565b60405160208183030381529060405280519060200120612a33565b612558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254f90613c41565b60405180910390fd5b8460007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639f181b5e6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156125c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ec9190613576565b905060035482826125fd91906135d2565b111561263e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263590613674565b60405180910390fd5b8660025481600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461268d91906135d2565b11156126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c590613a6b565b60405180910390fd5b600260015403612713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270a90613ad7565b60405180910390fd5b6002600181905550600760039054906101000a900460ff1661276a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276190613f15565b60405180910390fd5b88600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054036127eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e290613fa7565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166394bf804d89336040518363ffffffff1660e01b8152600401612846929190613694565b600060405180830381600087803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b50505050612883886001612ae9565b87600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128d291906135d2565b9250508190555087600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461292891906135d2565b92505081905550600180819055505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008082905060005b8551811015612adb576000868281518110612a5a57612a59613fc7565b5b60200260200101519050808311612a9b578281604051602001612a7e929190613ff6565b604051602081830303815290604052805190602001209250612ac7565b8083604051602001612aae929190613ff6565b6040516020818303038152906040528051906020012092505b508080612ad390614022565b915050612a3c565b508381149150509392505050565b60008115612af957600454612b1b565b7f00000000000000000000000000000000000000000000000000000000000000005b905060008215612b2d57600654612b31565b6005545b90508184612b3f919061406a565b3403612c24576000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168386612b8c919061406a565b604051612b98906140f5565b60006040518083038185875af1925050503d8060008114612bd5576040519150601f19603f3d011682016040523d82523d6000602084013e612bda565b606091505b5050905080612c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1590614156565b60405180910390fd5b50612d36565b60003403612cfa57600760019054906101000a900460ff16612c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c72906141c2565b60405180910390fd5b612cf533600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168387612cae919061406a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612d3c909392919063ffffffff16565b612d35565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2c9061422e565b60405180910390fd5b5b50505050565b612dbf846323b872dd60e01b858585604051602401612d5d9392919061424e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612dc5565b50505050565b6000612e27826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612e8c9092919063ffffffff16565b9050600081511115612e875780806020019051810190612e4791906142b1565b612e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7d90614350565b60405180910390fd5b5b505050565b6060612e9b8484600085612ea4565b90509392505050565b606082471015612ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee0906143e2565b60405180910390fd5b612ef285612fb8565b612f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f289061444e565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612f5a91906144dd565b60006040518083038185875af1925050503d8060008114612f97576040519150601f19603f3d011682016040523d82523d6000602084013e612f9c565b606091505b5091509150612fac828286612fcb565b92505050949350505050565b600080823b905060008111915050919050565b60608315612fdb5782905061302b565b600083511115612fee5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130229190614549565b60405180910390fd5b9392505050565b600080fd5b600080fd5b6000819050919050565b61304f8161303c565b811461305a57600080fd5b50565b60008135905061306c81613046565b92915050565b60006020828403121561308857613087613032565b5b60006130968482850161305d565b91505092915050565b6000819050919050565b6130b28161309f565b82525050565b60006020820190506130cd60008301846130a9565b92915050565b6130dc8161309f565b81146130e757600080fd5b50565b6000813590506130f9816130d3565b92915050565b60006020828403121561311557613114613032565b5b6000613123848285016130ea565b91505092915050565b60008115159050919050565b6131418161312c565b82525050565b600060208201905061315c6000830184613138565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061318d82613162565b9050919050565b61319d81613182565b81146131a857600080fd5b50565b6000813590506131ba81613194565b92915050565b6000602082840312156131d6576131d5613032565b5b60006131e4848285016131ab565b91505092915050565b6131f68161303c565b82525050565b600060208201905061321160008301846131ed565b92915050565b6000819050919050565b600061323c61323761323284613162565b613217565b613162565b9050919050565b600061324e82613221565b9050919050565b600061326082613243565b9050919050565b61327081613255565b82525050565b600060208201905061328b6000830184613267565b92915050565b600080604083850312156132a8576132a7613032565b5b60006132b6858286016131ab565b92505060206132c7858286016130ea565b9150509250929050565b6132da81613182565b82525050565b60006020820190506132f560008301846132d1565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126133205761331f6132fb565b5b8235905067ffffffffffffffff81111561333d5761333c613300565b5b60208301915083602082028301111561335957613358613305565b5b9250929050565b6000806000806060858703121561337a57613379613032565b5b6000613388878288016131ab565b945050602085013567ffffffffffffffff8111156133a9576133a8613037565b5b6133b58782880161330a565b935093505060406133c8878288016130ea565b91505092959194509250565b6000806000604084860312156133ed576133ec613032565b5b600084013567ffffffffffffffff81111561340b5761340a613037565b5b6134178682870161330a565b9350935050602061342a868287016130ea565b9150509250925092565b6000806000806060858703121561344e5761344d613032565b5b600085013567ffffffffffffffff81111561346c5761346b613037565b5b6134788782880161330a565b9450945050602061348b878288016130ea565b925050604061349c878288016130ea565b91505092959194509250565b60006134b382613243565b9050919050565b6134c3816134a8565b82525050565b60006020820190506134de60008301846134ba565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061352b6020836134e4565b9150613536826134f5565b602082019050919050565b6000602082019050818103600083015261355a8161351e565b9050919050565b600081519050613570816130d3565b92915050565b60006020828403121561358c5761358b613032565b5b600061359a84828501613561565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006135dd8261309f565b91506135e88361309f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561361d5761361c6135a3565b5b828201905092915050565b7f45786365656473206d617820746f6b656e20737570706c792100000000000000600082015250565b600061365e6019836134e4565b915061366982613628565b602082019050919050565b6000602082019050818103600083015261368d81613651565b9050919050565b60006040820190506136a960008301856130a9565b6136b660208301846132d1565b9392505050565b7f4d617820746f6b656e20737570706c792063616e206f6e6c792062652064656360008201527f7265617365642100000000000000000000000000000000000000000000000000602082015250565b60006137196027836134e4565b9150613724826136bd565b604082019050919050565b600060208201905081810360008301526137488161370c565b9050919050565b600060408201905061376460008301856130a9565b61377160208301846130a9565b9392505050565b60008160601b9050919050565b600061379082613778565b9050919050565b60006137a282613785565b9050919050565b6137ba6137b582613182565b613797565b82525050565b6000819050919050565b6137db6137d68261309f565b6137c0565b82525050565b60006137ed82856137a9565b6014820191506137fd82846137ca565b6020820191508190509392505050565b6000819050919050565b6138286138238261303c565b61380d565b82525050565b600061383a8284613817565b60208201915081905092915050565b7f41646472657373206973206e6f74206f6e2077686974656c6973742100000000600082015250565b600061387f601c836134e4565b915061388a82613849565b602082019050919050565b600060208201905081810360008301526138ae81613872565b9050919050565b7f57686974656c69737420697320616c726561647920636c61696d65642062792060008201527f746869732077616c6c6574000000000000000000000000000000000000000000602082015250565b6000613911602b836134e4565b915061391c826138b5565b604082019050919050565b6000602082019050818103600083015261394081613904565b9050919050565b7f53616c65206973206e6f74206163746976652100000000000000000000000000600082015250565b600061397d6013836134e4565b915061398882613947565b602082019050919050565b600060208201905081810360008301526139ac81613970565b9050919050565b7f57686974656c697374206d65726b6c6520726f6f74206e6f7420736574210000600082015250565b60006139e9601e836134e4565b91506139f4826139b3565b602082019050919050565b60006020820190508181036000830152613a18816139dc565b9050919050565b7f45786365656473206d6178206d696e7420706572206164647265737321000000600082015250565b6000613a55601d836134e4565b9150613a6082613a1f565b602082019050919050565b60006020820190508181036000830152613a8481613a48565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613ac1601f836134e4565b9150613acc82613a8b565b602082019050919050565b60006020820190508181036000830152613af081613ab4565b9050919050565b7f576869746c6973742073616c65206973206e6f74206163746976652100000000600082015250565b6000613b2d601c836134e4565b9150613b3882613af7565b602082019050919050565b60006020820190508181036000830152613b5c81613b20565b9050919050565b7f57686974656c69737420697320616c726561647920636c61696d65642062792060008201527f746869732077616c6c6574210000000000000000000000000000000000000000602082015250565b6000613bbf602c836134e4565b9150613bca82613b63565b604082019050919050565b60006020820190508181036000830152613bee81613bb2565b9050919050565b7f41646472657373206973206e6f74206f6e20646973636f756e74206c69737421600082015250565b6000613c2b6020836134e4565b9150613c3682613bf5565b602082019050919050565b60006020820190508181036000830152613c5a81613c1e565b9050919050565b7f446973636f756e7420697320616c726561647920636c61696d6564206279207460008201527f6869732077616c6c657400000000000000000000000000000000000000000000602082015250565b6000613cbd602a836134e4565b9150613cc882613c61565b604082019050919050565b60006020820190508181036000830152613cec81613cb0565b9050919050565b7f5075626c69632073616c65206973206e6f742061637469766521000000000000600082015250565b6000613d29601a836134e4565b9150613d3482613cf3565b602082019050919050565b60006020820190508181036000830152613d5881613d1c565b9050919050565b7f4d696e743a206e6f7420616c6c6f7765642066726f6d20636f6e747261637400600082015250565b6000613d95601f836134e4565b9150613da082613d5f565b602082019050919050565b60006020820190508181036000830152613dc481613d88565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e276026836134e4565b9150613e3282613dcb565b604082019050919050565b60006020820190508181036000830152613e5681613e1a565b9050919050565b7f446973636f756e74206d65726b6c6520726f6f74206e6f742073657421000000600082015250565b6000613e93601d836134e4565b9150613e9e82613e5d565b602082019050919050565b60006020820190508181036000830152613ec281613e86565b9050919050565b7f446973636f756e742073616c65206973206e6f74206163746976652100000000600082015250565b6000613eff601c836134e4565b9150613f0a82613ec9565b602082019050919050565b60006020820190508181036000830152613f2e81613ef2565b9050919050565b7f446973636f756e7420697320616c726561647920636c61696d6564206279207460008201527f6869732077616c6c657421000000000000000000000000000000000000000000602082015250565b6000613f91602b836134e4565b9150613f9c82613f35565b604082019050919050565b60006020820190508181036000830152613fc081613f84565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006140028285613817565b6020820191506140128284613817565b6020820191508190509392505050565b600061402d8261309f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361405f5761405e6135a3565b5b600182019050919050565b60006140758261309f565b91506140808361309f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140b9576140b86135a3565b5b828202905092915050565b600081905092915050565b50565b60006140df6000836140c4565b91506140ea826140cf565b600082019050919050565b6000614100826140d2565b9150819050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614140600f836134e4565b915061414b8261410a565b602082019050919050565b6000602082019050818103600083015261416f81614133565b9050919050565b7f417065436f696e2073616c65206973206e6f7420616374697665210000000000600082015250565b60006141ac601b836134e4565b91506141b782614176565b602082019050919050565b600060208201905081810360008301526141db8161419f565b9050919050565b7f696e76616c6964207061796d656e74206f7074696f6e00000000000000000000600082015250565b60006142186016836134e4565b9150614223826141e2565b602082019050919050565b600060208201905081810360008301526142478161420b565b9050919050565b600060608201905061426360008301866132d1565b61427060208301856132d1565b61427d60408301846130a9565b949350505050565b61428e8161312c565b811461429957600080fd5b50565b6000815190506142ab81614285565b92915050565b6000602082840312156142c7576142c6613032565b5b60006142d58482850161429c565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061433a602a836134e4565b9150614345826142de565b604082019050919050565b600060208201905081810360008301526143698161432d565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006143cc6026836134e4565b91506143d782614370565b604082019050919050565b600060208201905081810360008301526143fb816143bf565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614438601d836134e4565b915061444382614402565b602082019050919050565b600060208201905081810360008301526144678161442b565b9050919050565b600081519050919050565b60005b8381101561449757808201518184015260208101905061447c565b838111156144a6576000848401525b50505050565b60006144b78261446e565b6144c181856140c4565b93506144d1818560208601614479565b80840191505092915050565b60006144e982846144ac565b915081905092915050565b600081519050919050565b6000601f19601f8301169050919050565b600061451b826144f4565b61452581856134e4565b9350614535818560208601614479565b61453e816144ff565b840191505092915050565b600060208201905081810360008301526145638184614510565b90509291505056fea26469706673582212206a19c97ff154e4d279a9533e894a29141f5caf4a3789e16d730c2dc769c195de64736f6c634300080f00330000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a73743000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000320000000000000000000000004d224452801aced8b2f0aebe155379bb5d594381000000000000000000000000000000000000000000000000012dfb0cb5e88000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000015af1d78b58c40000000000000000000000000000000000000000000000000001a055690d9db80000
Deployed Bytecode
0x60806040526004361061025c5760003560e01c8063a371a06211610144578063db4bec44116100b6578063ef59f1e41161007a578063ef59f1e414610878578063efd0cbf9146108b5578063f2bcd022146108d1578063f2fde38b146108fc578063f618e63814610925578063fc0c546a146109415761025c565b8063db4bec441461077f578063e04e82dd146107bc578063e8315742146107e5578063eb8d244414610810578063ed9ec8881461083b5761025c565b8063b98451cf11610108578063b98451cf14610681578063bd32fb66146106ac578063c31769fd146106d5578063ce03ec9314610712578063d6f0874e14610729578063db474b39146107545761025c565b8063a371a062146105ae578063a6d612f9146105eb578063aa98e0c614610614578063ae6a80d51461063f578063b5b781c51461066a5761025c565b806359913d47116101dd57806381bb5cb4116101a157806381bb5cb41461049e5780638521b8e3146104c9578063853a5606146105065780638da5cb5b1461051d5780638ffefa0d146105485780639f2d83fd146105715761025c565b806359913d47146103df57806359eaa0951461040a578063657732561461043357806367142cf61461045e578063715018a6146104875761025c565b8063237fa68811610224578063237fa6881461033257806340d34133146103495780634da3cc4a146103745780634f92bea01461038b5780635057afb4146103b65761025c565b80631abae686146102615780631dfe90951461028a5780631e14d44b146102b55780631e84c413146102de57806321b8092e14610309575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613072565b61096c565b005b34801561029657600080fd5b5061029f6109f2565b6040516102ac91906130b8565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d791906130ff565b610a16565b005b3480156102ea57600080fd5b506102f3610a9c565b6040516103009190613147565b60405180910390f35b34801561031557600080fd5b50610330600480360381019061032b91906131c0565b610aaf565b005b34801561033e57600080fd5b50610347610b6f565b005b34801561035557600080fd5b5061035e610c17565b60405161036b91906131fc565b60405180910390f35b34801561038057600080fd5b50610389610c1d565b005b34801561039757600080fd5b506103a0610cc5565b6040516103ad9190613276565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d89190613291565b610ce9565b005b3480156103eb57600080fd5b506103f4610ede565b6040516104019190613147565b60405180910390f35b34801561041657600080fd5b50610431600480360381019061042c91906130ff565b610ef1565b005b34801561043f57600080fd5b50610448610fbb565b6040516104559190613147565b60405180910390f35b34801561046a57600080fd5b50610485600480360381019061048091906130ff565b610fce565b005b34801561049357600080fd5b5061049c61108f565b005b3480156104aa57600080fd5b506104b3611117565b6040516104c091906130b8565b60405180910390f35b3480156104d557600080fd5b506104f060048036038101906104eb91906131c0565b61111d565b6040516104fd9190613147565b60405180910390f35b34801561051257600080fd5b5061051b611173565b005b34801561052957600080fd5b5061053261121b565b60405161053f91906132e0565b60405180910390f35b34801561055457600080fd5b5061056f600480360381019061056a91906130ff565b611244565b005b34801561057d57600080fd5b50610598600480360381019061059391906131c0565b611305565b6040516105a591906130b8565b60405180910390f35b3480156105ba57600080fd5b506105d560048036038101906105d09190613360565b61131d565b6040516105e29190613147565b60405180910390f35b3480156105f757600080fd5b50610612600480360381019061060d91906133d4565b61149b565b005b34801561062057600080fd5b506106296119fd565b60405161063691906131fc565b60405180910390f35b34801561064b57600080fd5b50610654611a03565b60405161066191906130b8565b60405180910390f35b34801561067657600080fd5b5061067f611a09565b005b34801561068d57600080fd5b50610696611ab1565b6040516106a39190613147565b60405180910390f35b3480156106b857600080fd5b506106d360048036038101906106ce9190613072565b611ac4565b005b3480156106e157600080fd5b506106fc60048036038101906106f79190613360565b611b4a565b6040516107099190613147565b60405180910390f35b34801561071e57600080fd5b50610727611cbc565b005b34801561073557600080fd5b5061073e611d64565b60405161074b91906130b8565b60405180910390f35b34801561076057600080fd5b50610769611d6a565b60405161077691906130b8565b60405180910390f35b34801561078b57600080fd5b506107a660048036038101906107a191906131c0565b611d70565b6040516107b39190613147565b60405180910390f35b3480156107c857600080fd5b506107e360048036038101906107de91906130ff565b611d90565b005b3480156107f157600080fd5b506107fa611e51565b60405161080791906130b8565b60405180910390f35b34801561081c57600080fd5b50610825611e57565b6040516108329190613147565b60405180910390f35b34801561084757600080fd5b50610862600480360381019061085d91906131c0565b611e6a565b60405161086f91906130b8565b60405180910390f35b34801561088457600080fd5b5061089f600480360381019061089a91906131c0565b611eb3565b6040516108ac91906130b8565b60405180910390f35b6108cf60048036038101906108ca91906130ff565b611efc565b005b3480156108dd57600080fd5b506108e66122c6565b6040516108f391906132e0565b60405180910390f35b34801561090857600080fd5b50610923600480360381019061091e91906131c0565b6122ec565b005b61093f600480360381019061093a9190613434565b6123e3565b005b34801561094d57600080fd5b50610956612943565b60405161096391906134c9565b60405180910390f35b610974612967565b73ffffffffffffffffffffffffffffffffffffffff1661099261121b565b73ffffffffffffffffffffffffffffffffffffffff16146109e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109df90613541565b60405180910390fd5b80600c8190555050565b7f000000000000000000000000000000000000000000000000016345785d8a000081565b610a1e612967565b73ffffffffffffffffffffffffffffffffffffffff16610a3c61121b565b73ffffffffffffffffffffffffffffffffffffffff1614610a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8990613541565b60405180910390fd5b8060028190555050565b600760049054906101000a900460ff1681565b610ab7612967565b73ffffffffffffffffffffffffffffffffffffffff16610ad561121b565b73ffffffffffffffffffffffffffffffffffffffff1614610b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2290613541565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610b77612967565b73ffffffffffffffffffffffffffffffffffffffff16610b9561121b565b73ffffffffffffffffffffffffffffffffffffffff1614610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be290613541565b60405180910390fd5b600760039054906101000a900460ff1615600760036101000a81548160ff021916908315150217905550565b600c5481565b610c25612967565b73ffffffffffffffffffffffffffffffffffffffff16610c4361121b565b73ffffffffffffffffffffffffffffffffffffffff1614610c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9090613541565b60405180910390fd5b600760029054906101000a900460ff1615600760026101000a81548160ff021916908315150217905550565b7f0000000000000000000000004d224452801aced8b2f0aebe155379bb5d59438181565b610cf1612967565b73ffffffffffffffffffffffffffffffffffffffff16610d0f61121b565b73ffffffffffffffffffffffffffffffffffffffff1614610d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5c90613541565b60405180910390fd5b8060007f0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a7374373ffffffffffffffffffffffffffffffffffffffff16639f181b5e6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610dd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df99190613576565b90506003548282610e0a91906135d2565b1115610e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4290613674565b60405180910390fd5b7f0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a7374373ffffffffffffffffffffffffffffffffffffffff166394bf804d84866040518363ffffffff1660e01b8152600401610ea6929190613694565b600060405180830381600087803b158015610ec057600080fd5b505af1158015610ed4573d6000803e3d6000fd5b5050505050505050565b600760039054906101000a900460ff1681565b610ef9612967565b73ffffffffffffffffffffffffffffffffffffffff16610f1761121b565b73ffffffffffffffffffffffffffffffffffffffff1614610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6490613541565b60405180910390fd5b8060035411610fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa89061372f565b60405180910390fd5b8060038190555050565b600760019054906101000a900460ff1681565b610fd6612967565b73ffffffffffffffffffffffffffffffffffffffff16610ff461121b565b73ffffffffffffffffffffffffffffffffffffffff161461104a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104190613541565b60405180910390fd5b7f5b62250854903ecfb1e67a098b20b95793b97c8e7f182e4f4697b92ebbec9bb36006548260405161107d92919061374f565b60405180910390a18060068190555050565b611097612967565b73ffffffffffffffffffffffffffffffffffffffff166110b561121b565b73ffffffffffffffffffffffffffffffffffffffff161461110b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110290613541565b60405180910390fd5b611115600061296f565b565b60055481565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61117b612967565b73ffffffffffffffffffffffffffffffffffffffff1661119961121b565b73ffffffffffffffffffffffffffffffffffffffff16146111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e690613541565b60405180910390fd5b600760019054906101000a900460ff1615600760016101000a81548160ff021916908315150217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61124c612967565b73ffffffffffffffffffffffffffffffffffffffff1661126a61121b565b73ffffffffffffffffffffffffffffffffffffffff16146112c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b790613541565b60405180910390fd5b7fe37f490f6820c4aeb200a00776b1dd5a41d05cd1d13ebe80bc9bddc12f408e20600554826040516112f392919061374f565b60405180910390a18060058190555050565b600a6020528060005260406000206000915090505481565b6000848484846113bf838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b54868460405160200161137e9291906137e1565b604051602081830303815290604052805190602001206040516020016113a4919061382e565b60405160208183030381529060405280519060200120612a33565b6113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f590613895565b60405180910390fd5b600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148290613927565b60405180910390fd5b6001945050505050949350505050565b600760009054906101000a900460ff166114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190613993565b60405180910390fd5b6000801b600b5403611531576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611528906139ff565b60405180910390fd5b338383836115d1838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b5486846040516020016115909291906137e1565b604051602081830303815290604052805190602001206040516020016115b6919061382e565b60405160208183030381529060405280519060200120612a33565b611610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160790613895565b60405180910390fd5b8460007f0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a7374373ffffffffffffffffffffffffffffffffffffffff16639f181b5e6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611680573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a49190613576565b905060035482826116b591906135d2565b11156116f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ed90613674565b60405180910390fd5b8660025481600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461174591906135d2565b1115611786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177d90613a6b565b60405180910390fd5b6002600154036117cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c290613ad7565b60405180910390fd5b6002600181905550600760029054906101000a900460ff16611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990613b43565b60405180910390fd5b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a690613bd5565b60405180910390fd5b7f0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a7374373ffffffffffffffffffffffffffffffffffffffff166394bf804d89336040518363ffffffff1660e01b815260040161190a929190613694565b600060405180830381600087803b15801561192457600080fd5b505af1158015611938573d6000803e3d6000fd5b5050505087600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461198b91906135d2565b925050819055506001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001808190555050505050505050505050565b600b5481565b60025481565b611a11612967565b73ffffffffffffffffffffffffffffffffffffffff16611a2f61121b565b73ffffffffffffffffffffffffffffffffffffffff1614611a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7c90613541565b60405180910390fd5b600760049054906101000a900460ff1615600760046101000a81548160ff021916908315150217905550565b600760029054906101000a900460ff1681565b611acc612967565b73ffffffffffffffffffffffffffffffffffffffff16611aea61121b565b73ffffffffffffffffffffffffffffffffffffffff1614611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790613541565b60405180910390fd5b80600b8190555050565b600084848484611bec838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c548684604051602001611bab9291906137e1565b60405160208183030381529060405280519060200120604051602001611bd1919061382e565b60405160208183030381529060405280519060200120612a33565b611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290613c41565b60405180910390fd5b85600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403611cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca390613cd3565b60405180910390fd5b6001945050505050949350505050565b611cc4612967565b73ffffffffffffffffffffffffffffffffffffffff16611ce261121b565b73ffffffffffffffffffffffffffffffffffffffff1614611d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2f90613541565b60405180910390fd5b600760009054906101000a900460ff1615600760006101000a81548160ff021916908315150217905550565b60045481565b60065481565b60096020528060005260406000206000915054906101000a900460ff1681565b611d98612967565b73ffffffffffffffffffffffffffffffffffffffff16611db661121b565b73ffffffffffffffffffffffffffffffffffffffff1614611e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0390613541565b60405180910390fd5b7f616211c440ee58ae6f25cbd9e9bc4c443e821e5e609dba05b7c556cd29cb222e60045482604051611e3f92919061374f565b60405180910390a18060048190555050565b60035481565b600760009054906101000a900460ff1681565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600760009054906101000a900460ff16611f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4290613993565b60405180910390fd5b8060007f0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a7374373ffffffffffffffffffffffffffffffffffffffff16639f181b5e6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611fbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdf9190613576565b90506003548282611ff091906135d2565b1115612031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202890613674565b60405180910390fd5b8260025481600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461208091906135d2565b11156120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b890613a6b565b60405180910390fd5b600260015403612106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fd90613ad7565b60405180910390fd5b6002600181905550600760049054906101000a900460ff1661215d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215490613d3f565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c290613dab565b60405180910390fd5b6121d6846000612ae9565b7f0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a7374373ffffffffffffffffffffffffffffffffffffffff166394bf804d85336040518363ffffffff1660e01b8152600401612231929190613694565b600060405180830381600087803b15801561224b57600080fd5b505af115801561225f573d6000803e3d6000fd5b5050505083600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122b291906135d2565b925050819055506001808190555050505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122f4612967565b73ffffffffffffffffffffffffffffffffffffffff1661231261121b565b73ffffffffffffffffffffffffffffffffffffffff1614612368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235f90613541565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce90613e3d565b60405180910390fd5b6123e08161296f565b50565b600760009054906101000a900460ff16612432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242990613993565b60405180910390fd5b6000801b600c5403612479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247090613ea9565b60405180910390fd5b33848484612519838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c5486846040516020016124d89291906137e1565b604051602081830303815290604052805190602001206040516020016124fe919061382e565b60405160208183030381529060405280519060200120612a33565b612558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254f90613c41565b60405180910390fd5b8460007f0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a7374373ffffffffffffffffffffffffffffffffffffffff16639f181b5e6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156125c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ec9190613576565b905060035482826125fd91906135d2565b111561263e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263590613674565b60405180910390fd5b8660025481600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461268d91906135d2565b11156126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c590613a6b565b60405180910390fd5b600260015403612713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270a90613ad7565b60405180910390fd5b6002600181905550600760039054906101000a900460ff1661276a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276190613f15565b60405180910390fd5b88600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054036127eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e290613fa7565b60405180910390fd5b7f0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a7374373ffffffffffffffffffffffffffffffffffffffff166394bf804d89336040518363ffffffff1660e01b8152600401612846929190613694565b600060405180830381600087803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b50505050612883886001612ae9565b87600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128d291906135d2565b9250508190555087600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461292891906135d2565b92505081905550600180819055505050505050505050505050565b7f0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a7374381565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008082905060005b8551811015612adb576000868281518110612a5a57612a59613fc7565b5b60200260200101519050808311612a9b578281604051602001612a7e929190613ff6565b604051602081830303815290604052805190602001209250612ac7565b8083604051602001612aae929190613ff6565b6040516020818303038152906040528051906020012092505b508080612ad390614022565b915050612a3c565b508381149150509392505050565b60008115612af957600454612b1b565b7f000000000000000000000000000000000000000000000000016345785d8a00005b905060008215612b2d57600654612b31565b6005545b90508184612b3f919061406a565b3403612c24576000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168386612b8c919061406a565b604051612b98906140f5565b60006040518083038185875af1925050503d8060008114612bd5576040519150601f19603f3d011682016040523d82523d6000602084013e612bda565b606091505b5050905080612c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1590614156565b60405180910390fd5b50612d36565b60003403612cfa57600760019054906101000a900460ff16612c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c72906141c2565b60405180910390fd5b612cf533600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168387612cae919061406a565b7f0000000000000000000000004d224452801aced8b2f0aebe155379bb5d59438173ffffffffffffffffffffffffffffffffffffffff16612d3c909392919063ffffffff16565b612d35565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2c9061422e565b60405180910390fd5b5b50505050565b612dbf846323b872dd60e01b858585604051602401612d5d9392919061424e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612dc5565b50505050565b6000612e27826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612e8c9092919063ffffffff16565b9050600081511115612e875780806020019051810190612e4791906142b1565b612e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7d90614350565b60405180910390fd5b5b505050565b6060612e9b8484600085612ea4565b90509392505050565b606082471015612ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee0906143e2565b60405180910390fd5b612ef285612fb8565b612f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f289061444e565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612f5a91906144dd565b60006040518083038185875af1925050503d8060008114612f97576040519150601f19603f3d011682016040523d82523d6000602084013e612f9c565b606091505b5091509150612fac828286612fcb565b92505050949350505050565b600080823b905060008111915050919050565b60608315612fdb5782905061302b565b600083511115612fee5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130229190614549565b60405180910390fd5b9392505050565b600080fd5b600080fd5b6000819050919050565b61304f8161303c565b811461305a57600080fd5b50565b60008135905061306c81613046565b92915050565b60006020828403121561308857613087613032565b5b60006130968482850161305d565b91505092915050565b6000819050919050565b6130b28161309f565b82525050565b60006020820190506130cd60008301846130a9565b92915050565b6130dc8161309f565b81146130e757600080fd5b50565b6000813590506130f9816130d3565b92915050565b60006020828403121561311557613114613032565b5b6000613123848285016130ea565b91505092915050565b60008115159050919050565b6131418161312c565b82525050565b600060208201905061315c6000830184613138565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061318d82613162565b9050919050565b61319d81613182565b81146131a857600080fd5b50565b6000813590506131ba81613194565b92915050565b6000602082840312156131d6576131d5613032565b5b60006131e4848285016131ab565b91505092915050565b6131f68161303c565b82525050565b600060208201905061321160008301846131ed565b92915050565b6000819050919050565b600061323c61323761323284613162565b613217565b613162565b9050919050565b600061324e82613221565b9050919050565b600061326082613243565b9050919050565b61327081613255565b82525050565b600060208201905061328b6000830184613267565b92915050565b600080604083850312156132a8576132a7613032565b5b60006132b6858286016131ab565b92505060206132c7858286016130ea565b9150509250929050565b6132da81613182565b82525050565b60006020820190506132f560008301846132d1565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126133205761331f6132fb565b5b8235905067ffffffffffffffff81111561333d5761333c613300565b5b60208301915083602082028301111561335957613358613305565b5b9250929050565b6000806000806060858703121561337a57613379613032565b5b6000613388878288016131ab565b945050602085013567ffffffffffffffff8111156133a9576133a8613037565b5b6133b58782880161330a565b935093505060406133c8878288016130ea565b91505092959194509250565b6000806000604084860312156133ed576133ec613032565b5b600084013567ffffffffffffffff81111561340b5761340a613037565b5b6134178682870161330a565b9350935050602061342a868287016130ea565b9150509250925092565b6000806000806060858703121561344e5761344d613032565b5b600085013567ffffffffffffffff81111561346c5761346b613037565b5b6134788782880161330a565b9450945050602061348b878288016130ea565b925050604061349c878288016130ea565b91505092959194509250565b60006134b382613243565b9050919050565b6134c3816134a8565b82525050565b60006020820190506134de60008301846134ba565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061352b6020836134e4565b9150613536826134f5565b602082019050919050565b6000602082019050818103600083015261355a8161351e565b9050919050565b600081519050613570816130d3565b92915050565b60006020828403121561358c5761358b613032565b5b600061359a84828501613561565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006135dd8261309f565b91506135e88361309f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561361d5761361c6135a3565b5b828201905092915050565b7f45786365656473206d617820746f6b656e20737570706c792100000000000000600082015250565b600061365e6019836134e4565b915061366982613628565b602082019050919050565b6000602082019050818103600083015261368d81613651565b9050919050565b60006040820190506136a960008301856130a9565b6136b660208301846132d1565b9392505050565b7f4d617820746f6b656e20737570706c792063616e206f6e6c792062652064656360008201527f7265617365642100000000000000000000000000000000000000000000000000602082015250565b60006137196027836134e4565b9150613724826136bd565b604082019050919050565b600060208201905081810360008301526137488161370c565b9050919050565b600060408201905061376460008301856130a9565b61377160208301846130a9565b9392505050565b60008160601b9050919050565b600061379082613778565b9050919050565b60006137a282613785565b9050919050565b6137ba6137b582613182565b613797565b82525050565b6000819050919050565b6137db6137d68261309f565b6137c0565b82525050565b60006137ed82856137a9565b6014820191506137fd82846137ca565b6020820191508190509392505050565b6000819050919050565b6138286138238261303c565b61380d565b82525050565b600061383a8284613817565b60208201915081905092915050565b7f41646472657373206973206e6f74206f6e2077686974656c6973742100000000600082015250565b600061387f601c836134e4565b915061388a82613849565b602082019050919050565b600060208201905081810360008301526138ae81613872565b9050919050565b7f57686974656c69737420697320616c726561647920636c61696d65642062792060008201527f746869732077616c6c6574000000000000000000000000000000000000000000602082015250565b6000613911602b836134e4565b915061391c826138b5565b604082019050919050565b6000602082019050818103600083015261394081613904565b9050919050565b7f53616c65206973206e6f74206163746976652100000000000000000000000000600082015250565b600061397d6013836134e4565b915061398882613947565b602082019050919050565b600060208201905081810360008301526139ac81613970565b9050919050565b7f57686974656c697374206d65726b6c6520726f6f74206e6f7420736574210000600082015250565b60006139e9601e836134e4565b91506139f4826139b3565b602082019050919050565b60006020820190508181036000830152613a18816139dc565b9050919050565b7f45786365656473206d6178206d696e7420706572206164647265737321000000600082015250565b6000613a55601d836134e4565b9150613a6082613a1f565b602082019050919050565b60006020820190508181036000830152613a8481613a48565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613ac1601f836134e4565b9150613acc82613a8b565b602082019050919050565b60006020820190508181036000830152613af081613ab4565b9050919050565b7f576869746c6973742073616c65206973206e6f74206163746976652100000000600082015250565b6000613b2d601c836134e4565b9150613b3882613af7565b602082019050919050565b60006020820190508181036000830152613b5c81613b20565b9050919050565b7f57686974656c69737420697320616c726561647920636c61696d65642062792060008201527f746869732077616c6c6574210000000000000000000000000000000000000000602082015250565b6000613bbf602c836134e4565b9150613bca82613b63565b604082019050919050565b60006020820190508181036000830152613bee81613bb2565b9050919050565b7f41646472657373206973206e6f74206f6e20646973636f756e74206c69737421600082015250565b6000613c2b6020836134e4565b9150613c3682613bf5565b602082019050919050565b60006020820190508181036000830152613c5a81613c1e565b9050919050565b7f446973636f756e7420697320616c726561647920636c61696d6564206279207460008201527f6869732077616c6c657400000000000000000000000000000000000000000000602082015250565b6000613cbd602a836134e4565b9150613cc882613c61565b604082019050919050565b60006020820190508181036000830152613cec81613cb0565b9050919050565b7f5075626c69632073616c65206973206e6f742061637469766521000000000000600082015250565b6000613d29601a836134e4565b9150613d3482613cf3565b602082019050919050565b60006020820190508181036000830152613d5881613d1c565b9050919050565b7f4d696e743a206e6f7420616c6c6f7765642066726f6d20636f6e747261637400600082015250565b6000613d95601f836134e4565b9150613da082613d5f565b602082019050919050565b60006020820190508181036000830152613dc481613d88565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e276026836134e4565b9150613e3282613dcb565b604082019050919050565b60006020820190508181036000830152613e5681613e1a565b9050919050565b7f446973636f756e74206d65726b6c6520726f6f74206e6f742073657421000000600082015250565b6000613e93601d836134e4565b9150613e9e82613e5d565b602082019050919050565b60006020820190508181036000830152613ec281613e86565b9050919050565b7f446973636f756e742073616c65206973206e6f74206163746976652100000000600082015250565b6000613eff601c836134e4565b9150613f0a82613ec9565b602082019050919050565b60006020820190508181036000830152613f2e81613ef2565b9050919050565b7f446973636f756e7420697320616c726561647920636c61696d6564206279207460008201527f6869732077616c6c657421000000000000000000000000000000000000000000602082015250565b6000613f91602b836134e4565b9150613f9c82613f35565b604082019050919050565b60006020820190508181036000830152613fc081613f84565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006140028285613817565b6020820191506140128284613817565b6020820191508190509392505050565b600061402d8261309f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361405f5761405e6135a3565b5b600182019050919050565b60006140758261309f565b91506140808361309f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140b9576140b86135a3565b5b828202905092915050565b600081905092915050565b50565b60006140df6000836140c4565b91506140ea826140cf565b600082019050919050565b6000614100826140d2565b9150819050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614140600f836134e4565b915061414b8261410a565b602082019050919050565b6000602082019050818103600083015261416f81614133565b9050919050565b7f417065436f696e2073616c65206973206e6f7420616374697665210000000000600082015250565b60006141ac601b836134e4565b91506141b782614176565b602082019050919050565b600060208201905081810360008301526141db8161419f565b9050919050565b7f696e76616c6964207061796d656e74206f7074696f6e00000000000000000000600082015250565b60006142186016836134e4565b9150614223826141e2565b602082019050919050565b600060208201905081810360008301526142478161420b565b9050919050565b600060608201905061426360008301866132d1565b61427060208301856132d1565b61427d60408301846130a9565b949350505050565b61428e8161312c565b811461429957600080fd5b50565b6000815190506142ab81614285565b92915050565b6000602082840312156142c7576142c6613032565b5b60006142d58482850161429c565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061433a602a836134e4565b9150614345826142de565b604082019050919050565b600060208201905081810360008301526143698161432d565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006143cc6026836134e4565b91506143d782614370565b604082019050919050565b600060208201905081810360008301526143fb816143bf565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614438601d836134e4565b915061444382614402565b602082019050919050565b600060208201905081810360008301526144678161442b565b9050919050565b600081519050919050565b60005b8381101561449757808201518184015260208101905061447c565b838111156144a6576000848401525b50505050565b60006144b78261446e565b6144c181856140c4565b93506144d1818560208601614479565b80840191505092915050565b60006144e982846144ac565b915081905092915050565b600081519050919050565b6000601f19601f8301169050919050565b600061451b826144f4565b61452581856134e4565b9350614535818560208601614479565b61453e816144ff565b840191505092915050565b600060208201905081810360008301526145638184614510565b90509291505056fea26469706673582212206a19c97ff154e4d279a9533e894a29141f5caf4a3789e16d730c2dc769c195de64736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a73743000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000320000000000000000000000004d224452801aced8b2f0aebe155379bb5d594381000000000000000000000000000000000000000000000000012dfb0cb5e88000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000015af1d78b58c40000000000000000000000000000000000000000000000000001a055690d9db80000
-----Decoded View---------------
Arg [0] : contractAddress (address): 0x3ed0814bE6C0679A89Ca6Ed323E475ca66a73743
Arg [1] : _maxTokens (uint256): 10000
Arg [2] : _maxMintsPerAddress (uint256): 50
Arg [3] : _tokenApeCoin (address): 0x4d224452801ACEd8B2F0aebE155379bb5D594381
Arg [4] : _tokenPriceETH_Discount (uint256): 85000000000000000
Arg [5] : _tokenPriceETH (uint256): 100000000000000000
Arg [6] : _tokenPriceApeCoin_Discount (uint256): 25000000000000000000
Arg [7] : _tokenPriceApeCoin (uint256): 30000000000000000000
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a73743
Arg [1] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [3] : 0000000000000000000000004d224452801aced8b2f0aebe155379bb5d594381
Arg [4] : 000000000000000000000000000000000000000000000000012dfb0cb5e88000
Arg [5] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [6] : 0000000000000000000000000000000000000000000000015af1d78b58c40000
Arg [7] : 000000000000000000000000000000000000000000000001a055690d9db80000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.