Overview
ETH Balance
5.1 ETH
Eth Value
$13,426.50 (@ $2,632.65/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 600 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Refund | 17339243 | 510 days ago | IN | 0 ETH | 0.00115235 | ||||
Refund | 17025329 | 554 days ago | IN | 0 ETH | 0.00165007 | ||||
Refund | 17010786 | 556 days ago | IN | 0 ETH | 0.00087873 | ||||
Refund | 16997732 | 558 days ago | IN | 0 ETH | 0.00132329 | ||||
Refund | 16996580 | 558 days ago | IN | 0 ETH | 0.00101223 | ||||
Refund | 16995076 | 558 days ago | IN | 0 ETH | 0.00106083 | ||||
Refund | 16995070 | 558 days ago | IN | 0 ETH | 0.00103734 | ||||
Refund | 16994576 | 558 days ago | IN | 0 ETH | 0.00088075 | ||||
Refund | 16994396 | 558 days ago | IN | 0 ETH | 0.00092301 | ||||
Refund | 16992349 | 559 days ago | IN | 0 ETH | 0.00100349 | ||||
Refund | 16991714 | 559 days ago | IN | 0 ETH | 0.00112267 | ||||
Refund | 16991707 | 559 days ago | IN | 0 ETH | 0.00107237 | ||||
Refund | 16991592 | 559 days ago | IN | 0 ETH | 0.00149862 | ||||
Refund | 16991574 | 559 days ago | IN | 0 ETH | 0.00140476 | ||||
Refund | 16991535 | 559 days ago | IN | 0 ETH | 0.00150229 | ||||
Refund | 16991473 | 559 days ago | IN | 0 ETH | 0.00103736 | ||||
Refund | 16991416 | 559 days ago | IN | 0 ETH | 0.00111013 | ||||
Refund | 16991373 | 559 days ago | IN | 0 ETH | 0.00174161 | ||||
Refund | 16991356 | 559 days ago | IN | 0 ETH | 0.00126504 | ||||
Refund | 16991336 | 559 days ago | IN | 0 ETH | 0.00166755 | ||||
Refund | 16991332 | 559 days ago | IN | 0 ETH | 0.0017009 | ||||
Refund | 16991308 | 559 days ago | IN | 0 ETH | 0.00102206 | ||||
Refund | 16991290 | 559 days ago | IN | 0 ETH | 0.00101824 | ||||
Refund | 16991289 | 559 days ago | IN | 0 ETH | 0.00097529 | ||||
Refund | 16991282 | 559 days ago | IN | 0 ETH | 0.00104352 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers. Name tag integration is not available in advanced view.
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | ||||
---|---|---|---|---|---|---|---|
17339243 | 510 days ago | 0.1 ETH | |||||
17025329 | 554 days ago | 3.5 ETH | |||||
17010786 | 556 days ago | 1.1 ETH | |||||
16997732 | 558 days ago | 0.14 ETH | |||||
16996580 | 558 days ago | 2.66 ETH | |||||
16995076 | 558 days ago | 0.7 ETH | |||||
16995070 | 558 days ago | 0.32 ETH | |||||
16994576 | 558 days ago | 4.04 ETH | |||||
16994396 | 558 days ago | 0.6 ETH | |||||
16992349 | 559 days ago | 0.52 ETH | |||||
16991714 | 559 days ago | 0.46 ETH | |||||
16991707 | 559 days ago | 0.16 ETH | |||||
16991592 | 559 days ago | 1.04 ETH | |||||
16991574 | 559 days ago | 0.5 ETH | |||||
16991535 | 559 days ago | 1.14 ETH | |||||
16991473 | 559 days ago | 0.9 ETH | |||||
16991416 | 559 days ago | 0.36 ETH | |||||
16991373 | 559 days ago | 1.4 ETH | |||||
16991356 | 559 days ago | 0.08 ETH | |||||
16991336 | 559 days ago | 0.1 ETH | |||||
16991332 | 559 days ago | 4.84 ETH | |||||
16991308 | 559 days ago | 0.46 ETH | |||||
16991290 | 559 days ago | 7.7 ETH | |||||
16991289 | 559 days ago | 2.04 ETH | |||||
16991282 | 559 days ago | 0.38 ETH |
Loading...
Loading
Contract Name:
PPPArtworkAuction
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // Copyright (c) 2022-2023 Fellowship pragma solidity ^0.8.7; import "@openzeppelin/contracts/utils/math/Math.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "./Delegation.sol"; import "./EarlyAccessSale.sol"; import "./MintableById.sol"; import "./Shuffler.sol"; struct AuctionStage { /// @notice Amount that the price drops (in wei) every slot (every 12 seconds) uint256 priceDropPerSlot; /// @notice Price where this auction stage ends (in wei) uint256 endPrice; /// @notice The duration of time that this stage will last, in seconds uint256 duration; } struct AuctionStageConfiguration { /// @notice Amount that the price drops (in wei) every slot (every 12 seconds) uint256 priceDropPerSlot; /// @notice Price where this auction stage ends (in wei) uint256 endPrice; } contract PPPArtworkAuction is EarlyAccessSale, Shuffler { string private publicLimitRevertMessage; /// @notice The number of mints available for each pass uint256 public passLimit; /// @notice The number of mints available without a pass (per address), after the early access period uint256 public publicLimit; /// @notice The total number of mints available until the auction is sold out uint256 public mintLimit; /// @notice ERC-721 contract whose tokens are minted by this auction /// @dev Must implement MintableById and allow minting out of order MintableById public tokenContract; /// @notice Starting price for the Dutch auction (in wei) uint256 public startPrice; /// @notice Lowest price at which a token was minted (in wei) uint256 public lowestPrice; /// @notice Stages for this auction, in order AuctionStage[] public auctionStages; /// @notice Number of reserveTokens that have been minted uint256 public reserveCount = 0; /// @notice Number of tokens that have been minted per address mapping(address => uint256) public mintCount; /// @notice Total amount paid to mint per address mapping(address => uint256) public mintPayment; /// @notice Number of tokens that have been minted without a pass, per address /// @dev May over count public mints on the final sale transaction, so not publicly exposed mapping(address => uint256) private publicMintCount; uint256 private previousPayment = 0; /// @notice An event emitted upon purchases event Purchase(address purchaser, uint256 mintId, uint256 tokenId, uint256 price, bool passMint); /// @notice An event emitted when reserve tokens are minted event Reservation(address recipient, uint256 quantity, uint256 totalReserved); /// @notice An event emitted when a refund is sent to a minter event Refund(address recipient, uint256 amount); /// @notice An error returned when the auction has reached its `mintLimit` error SoldOut(); error FailedWithdraw(uint256 amount, bytes data); constructor( MintableById tokenContract_, uint256 startTime_, uint256 startPrice_, uint256 earlyPriceDrop, uint256 transitionPrice, uint256 latePriceDrop, uint256 restPrice, uint256 mintLimit_, uint256 publicLimit_, uint256 passLimit_, uint256 earlyAccessDuration_ ) EarlyAccessSale(startTime_, earlyAccessDuration_) Shuffler(mintLimit_) { // CHECKS inputs require(address(tokenContract_) != address(0), "Token contract must not be the zero address"); require(restPrice > 1e15, "Rest price too low: check that prices are in wei"); require(startPrice_ >= transitionPrice, "Start price must not be lower than transition price"); require(transitionPrice >= restPrice, "Transition price must not be lower than rest price"); uint256 earlyPriceDifference; uint256 latePriceDifference; unchecked { earlyPriceDifference = startPrice_ - transitionPrice; latePriceDifference = transitionPrice - restPrice; } require(earlyPriceDrop * 25 <= earlyPriceDifference, "Initial stage must last at least 5 minutes"); require(latePriceDrop * 25 <= latePriceDifference, "Final stage must last at least 5 minutes"); require(earlyPriceDifference % earlyPriceDrop == 0, "Transition price must be reachable by earlyPriceDrop"); require(latePriceDifference % latePriceDrop == 0, "Resting price must be reachable by latePriceDrop"); require( earlyPriceDrop * (5 * 60 * 12) >= earlyPriceDifference, "Initial stage must not last longer than 12 hours" ); require(latePriceDrop * (5 * 60 * 12) >= latePriceDifference, "Final stage must not last longer than 12 hours"); require(mintLimit_ >= 10, "Mint limit too low"); require(passLimit_ != 0, "Pass limit must not be zero"); require(publicLimit_ != 0, "Public limit must not be zero"); require(passLimit_ < mintLimit_, "Pass limit must be lower than mint limit"); require(publicLimit_ < mintLimit_, "Public limit must be lower than mint limit"); // EFFECTS tokenContract = tokenContract_; lowestPrice = startPrice = startPrice_; unchecked { AuctionStage storage earlyStage = auctionStages.push(); earlyStage.priceDropPerSlot = earlyPriceDrop; earlyStage.endPrice = transitionPrice; earlyStage.duration = (12 * earlyPriceDifference) / earlyPriceDrop; AuctionStage storage lateStage = auctionStages.push(); lateStage.priceDropPerSlot = latePriceDrop; lateStage.endPrice = restPrice; lateStage.duration = (12 * latePriceDifference) / latePriceDrop; } mintLimit = mintLimit_; passLimit = passLimit_; publicLimit = publicLimit_; publicLimitRevertMessage = publicLimit_ == 1 ? "Limited to one purchase without a pass" : string.concat("Limited to ", Strings.toString(publicLimit_), " purchases without a pass"); } // PUBLIC FUNCTIONS /// @notice Mint a token on the `tokenContract` contract. Must include at least `currentPrice`. function mint() external payable publicMint { // CHECKS require(publicMintCount[msg.sender] < publicLimit, publicLimitRevertMessage); // EFFECTS unchecked { // Unchecked arithmetic: publicMintCount cannot exceed publicLimit publicMintCount[msg.sender]++; } // Proceed to core mint logic (including all CHECKS + EFFECTS + INTERACTIONS) _mint(false); } /// @notice Mint multiple tokens on the `tokenContract` contract. Must pay at least `currentPrice` * `quantity`. /// @param quantity The number of tokens to mint: must not be greater than `publicLimit` function mintMultiple(uint256 quantity) public payable virtual publicMint whenNotPaused { // CHECKS state and inputs uint256 remaining = remainingValueCount; if (remaining == 0) revert SoldOut(); uint256 alreadyMinted = mintCount[msg.sender]; require(quantity > 0, "Must mint at least one token"); uint256 publicMinted = publicMintCount[msg.sender]; require(publicMinted < publicLimit && quantity <= publicLimit, publicLimitRevertMessage); uint256 price = msg.value / quantity; uint256 slotPrice = currentPrice(); require(price >= slotPrice, "Insufficient payment"); // EFFECTS if (quantity > remaining) { quantity = remaining; } unchecked { if (publicMinted + quantity > publicLimit) { quantity = publicLimit - publicMinted; } // Unchecked arithmetic: mintCount cannot exceed mintLimit mintCount[msg.sender] = alreadyMinted + quantity; // Unchecked arithmetic: publicMintCount cannot exceed publicLimit publicMintCount[msg.sender] += quantity; // Unchecked arithmetic: can't exceed total existing wei; not expected to exceed mintLimit * startPrice mintPayment[msg.sender] += msg.value; } if (slotPrice < lowestPrice) { lowestPrice = slotPrice; } // INTERACTIONS: call mint on known contract (tokenContract.mint contains no external interactions) unchecked { uint256 startMintId = mintLimit - remainingValueCount; for (uint256 i = 0; i < quantity; i++) { uint256 tokenId = drawNext(); emit Purchase(msg.sender, startMintId + i, tokenId, price, false); tokenContract.mint(msg.sender, tokenId); } } } /// @notice Send any available refund to the message sender function refund() external returns (uint256) { // CHECK available refund uint256 refundAmount = refundAvailable(msg.sender); require(refundAmount > 0, "No refund available"); // EFFECTS unchecked { // Unchecked arithmetic: refundAmount will always be less than mintPayment mintPayment[msg.sender] -= refundAmount; } emit Refund(msg.sender, refundAmount); // INTERACTIONS (bool refunded, ) = msg.sender.call{value: refundAmount}(""); require(refunded, "Refund transfer was reverted"); return refundAmount; } // PASS HOLDER FUNCTIONS /// @notice Mint a token on the `tokenContract` to the caller, using a pass /// @param passId The pass token ID: caller must be owner or operator and pass must have at least one mint remaining function mintFromPass(uint256 passId) external payable started { // CHECKS that the caller has permissions and the pass can be used require(passAllowance(passId) > 0, "No mints remaining for provided pass"); // INTERACTIONS: mark the pass as used (known contract with no external interactions) passes.logPassUse(passId, passProjectId); // Proceed to core mint logic (including all CHECKS + EFFECTS + INTERACTIONS) _mint(true); } /// @notice Mint multiple tokens on the `tokenContract` to the caller, using passes /// @param passIds The pass token IDs: caller must be owner or operator and passes must have mints remaining function mintMultipleFromPasses( uint256 quantity, uint256[] calldata passIds ) external payable started whenNotPaused { // CHECKS state and inputs uint256 remaining = remainingValueCount; if (remaining == 0) revert SoldOut(); require(quantity > 0, "Must mint at least one token"); require(quantity <= mintLimit, "Quantity exceeds auction size"); uint256 price = msg.value / quantity; uint256 slotPrice = currentPrice(); require(price >= slotPrice, "Insufficient payment"); uint256 passCount = passIds.length; require(passCount > 0, "Must include at least one pass"); // EFFECTS if (quantity > remaining) { quantity = remaining; } // CHECKS: check passes and log their usages uint256 passUses = 0; for (uint256 i = 0; i < passCount; i++) { uint256 passId = passIds[i]; // CHECKS uint256 allowance = passAllowance(passId); // INTERACTIONS for (uint256 j = 0; j < allowance && passUses < quantity; j++) { passes.logPassUse(passId, passProjectId); passUses++; } // Don't check more passes than needed if (passUses == quantity) break; } require(passUses > 0, "No mints remaining for provided passes"); quantity = passUses; // EFFECTS unchecked { // Unchecked arithmetic: mintCount cannot exceed passLimit * number of existing passes mintCount[msg.sender] += quantity; // Unchecked arithmetic: can't exceed total existing wei; not expected to exceed mintLimit * startPrice mintPayment[msg.sender] += msg.value; } if (slotPrice < lowestPrice) { lowestPrice = slotPrice; } // INTERACTIONS: call mint on known contract (tokenContract.mint contains no external interactions) unchecked { uint256 startMintId = mintLimit - remainingValueCount; for (uint256 i = 0; i < quantity; i++) { uint256 tokenId = drawNext(); emit Purchase(msg.sender, startMintId + i, tokenId, price, true); tokenContract.mint(msg.sender, tokenId); } } } // OWNER FUNCTIONS /// @notice Mint reserve tokens to the designated `recipient` /// @dev Can only be called by the contract `owner`. Reverts if the auction has already started. function reserve(address recipient, uint256 quantity) external unstarted onlyOwner { // CHECKS contract state uint256 remaining = remainingValueCount; if (remaining == 0) revert SoldOut(); // EFFECTS if (quantity > remaining) { quantity = remaining; } unchecked { // Unchecked arithmetic: neither value can exceed mintLimit reserveCount += quantity; } emit Reservation(recipient, quantity, reserveCount); // INTERACTIONS unchecked { for (uint256 i = 0; i < quantity; i++) { tokenContract.mint(recipient, drawNext()); } } } /// @notice withdraw auction proceeds /// @dev Can only be called by the contract `owner`. Reverts if the final price is unknown, if proceeds have already /// been withdrawn, or if the fund transfer fails. function withdraw(address recipient) external onlyOwner { // CHECKS contract state uint256 remaining = remainingValueCount; bool soldOut = remaining == 0; uint256 finalPrice = lowestPrice; if (!soldOut) { finalPrice = auctionStages[auctionStages.length - 1].endPrice; // Only allow a withdraw before the auction is sold out if the price has finished falling require(currentPrice() == finalPrice, "Price is still falling"); } uint256 totalPayment = (mintLimit - remaining - reserveCount) * finalPrice; require(totalPayment > previousPayment, "All funds have been withdrawn"); // EFFECTS uint256 outstandingPayment = totalPayment - previousPayment; uint256 balance = address(this).balance; if (outstandingPayment > balance) { // Escape hatch to prevent stuck funds, but this shouldn't happen require(balance > 0, "All funds have been withdrawn"); outstandingPayment = balance; } previousPayment += outstandingPayment; (bool success, bytes memory data) = recipient.call{value: outstandingPayment}(""); if (!success) revert FailedWithdraw(outstandingPayment, data); } /// @notice Update the tokenContract contract address /// @dev Can only be called by the contract `owner`. Reverts if the auction has already started. function setMintable(MintableById tokenContract_) external unstarted onlyOwner { // CHECKS inputs require(address(tokenContract_) != address(0), "Token contract must not be the zero address"); // EFFECTS tokenContract = tokenContract_; } /// @notice Update the auction price ranges and rates of decrease /// @dev Since the values are validated against each other, they are all set together. Can only be called by the /// contract `owner`. Reverts if the auction has already started. function setPricing( uint256 startPrice_, AuctionStageConfiguration[] calldata stages_ ) external unstarted onlyOwner { // CHECKS inputs uint256 stageCount = stages_.length; require(stageCount > 0, "Must specify at least one auction stage"); // EFFECTS + additional CHECKS uint256 previousPrice = startPrice = startPrice_; delete auctionStages; for (uint256 i; i < stageCount; i++) { AuctionStageConfiguration calldata config = stages_[i]; require(config.endPrice < previousPrice, "Each stage price must be lower than the previous price"); require(config.endPrice > 1e15, "Stage price too low: check that prices are in wei"); uint256 priceDifference = previousPrice - config.endPrice; require(config.priceDropPerSlot * 25 <= priceDifference, "Each stage must last at least 5 minutes"); require( priceDifference % config.priceDropPerSlot == 0, "Stage end price must be reachable by slot price drop" ); require( config.priceDropPerSlot * (5 * 60 * 12) >= priceDifference, "Stage must not last longer than 12 hours" ); AuctionStage storage newStage = auctionStages.push(); newStage.duration = (12 * priceDifference) / config.priceDropPerSlot; newStage.priceDropPerSlot = config.priceDropPerSlot; newStage.endPrice = previousPrice = config.endPrice; } } /// @notice Update the number of total mints function setMintLimit(uint256 mintLimit_) external unstarted onlyOwner { // CHECKS inputs require(reserveCount == 0, 'Cannot change the mint limit once tokens have been reserved'); require(mintLimit_ >= 10, "Mint limit too low"); require(passLimit < mintLimit_, "Mint limit must be higher than pass limit"); require(publicLimit < mintLimit_, "Mint limit must be higher than public limit"); // EFFECTS mintLimit = remainingValueCount = mintLimit_; } /// @notice Update the per-pass mint limit function setPassLimit(uint256 passLimit_) external onlyOwner { // CHECKS inputs require(passLimit_ != 0, "Pass limit must not be zero"); require(passLimit_ < mintLimit, "Pass limit must be lower than mint limit"); // EFFECTS passLimit = passLimit_; } /// @notice Update the public per-wallet mint limit function setPublicLimit(uint256 publicLimit_) external onlyOwner { // CHECKS inputs require(publicLimit_ != 0, "Public limit must not be zero"); require(publicLimit_ < mintLimit, "Public limit must be lower than mint limit"); // EFFECTS publicLimit = publicLimit_; publicLimitRevertMessage = publicLimit_ == 1 ? "Limited to one purchase without a pass" : string.concat("Limited to ", Strings.toString(publicLimit_), " purchases without a pass"); } // VIEW FUNCTIONS /// @notice Query the current price function currentPrice() public view returns (uint256 price) { uint256 time = timeElapsed(); price = startPrice; uint256 stageCount = auctionStages.length; uint256 stageDuration; AuctionStage storage stage; for (uint256 i = 0; i < stageCount; i++) { stage = auctionStages[i]; stageDuration = stage.duration; if (time < stageDuration) { unchecked { uint256 drop = stage.priceDropPerSlot * (time / 12); return price - drop; } } // Proceed to the next stage unchecked { time -= stageDuration; } price = auctionStages[i].endPrice; } // Auction has reached resting price return price; } /// @notice Query the refund available for the specified `minter` function refundAvailable(address minter) public view returns (uint256) { uint256 minted = mintCount[minter]; if (minted == 0) return 0; uint256 refundPrice = remainingValueCount == 0 ? lowestPrice : currentPrice(); uint256 payment = mintPayment[minter]; uint256 newPayment; uint256 refundAmount; unchecked { // Unchecked arithmetic: newPayment cannot exceed mintLimit * startPrice newPayment = minted * refundPrice; // Unchecked arithmetic: value only used if newPayment < payment refundAmount = payment - newPayment; } return (newPayment < payment) ? refundAmount : 0; } // INTERNAL FUNCTIONS function _mint(bool passMint) internal whenNotPaused { // CHECKS state and inputs uint256 remaining = remainingValueCount; if (remaining == 0) revert SoldOut(); uint256 slotPrice = currentPrice(); require(msg.value >= slotPrice, "Insufficient payment"); // EFFECTS unchecked { // Unchecked arithmetic: mintCount cannot exceed mintLimit mintCount[msg.sender]++; // Unchecked arithmetic: can't exceed this.balance; not expected to exceed mintLimit * startPrice mintPayment[msg.sender] += msg.value; } if (slotPrice < lowestPrice) { lowestPrice = slotPrice; } uint256 mintId = mintLimit - remainingValueCount; uint256 tokenId = drawNext(); emit Purchase(msg.sender, mintId, tokenId, msg.value, passMint); // INTERACTIONS: call mint on known contract (tokenContract.mint contains no external interactions) tokenContract.mint(msg.sender, tokenId); } // INTERNAL VIEW FUNCTIONS function passAllowance(uint256 passId) internal view returns (uint256) { // Uses view functions of the passes contract require(Delegation.check(msg.sender, passes, passId), "Caller is not pass owner or approved"); uint256 uses = passes.passUses(passId, passProjectId); unchecked { return uses >= passLimit ? 0 : passLimit - uses; } } }
// Copyright (c) 2022-2023 Fellowship // // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated // documentation files (the "Software"), to deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies // or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE // WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// SPDX-License-Identifier: MIT // Copyright (c) 2023 Fellowship pragma solidity ^0.8.7; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; interface IDelegationRegistry { function checkDelegateForToken( address delegate, address vault, address contract_, uint256 tokenId ) external view returns (bool); } library Delegation { IDelegationRegistry public constant DELEGATION_REGISTRY = IDelegationRegistry(0x00000000000076A84feF008CDAbe6409d2FE638B); function check(address operator, IERC721 contract_, uint256 tokenId) internal view returns (bool) { address owner = contract_.ownerOf(tokenId); return (operator == owner || contract_.isApprovedForAll(owner, operator) || contract_.getApproved(tokenId) == operator || (address(DELEGATION_REGISTRY).code.length > 0 && DELEGATION_REGISTRY.checkDelegateForToken(operator, owner, address(contract_), tokenId))); } }
// SPDX-License-Identifier: MIT // Copyright (c) 2022 - 2023 Fellowship pragma solidity ^0.8.7; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; abstract contract PatronPass is IERC721 { function logPassUse(uint256 tokenId, uint256 projectId) external virtual; function passUses(uint256 tokenId, uint256 projectId) external view virtual returns (uint256); function projectInfo(uint256 projectId) external view virtual returns (address, address, string memory); } contract EarlyAccessSale is Ownable { /// @notice Timestamp when this auction starts allowing minting uint256 public startTime; /// @notice Duration of the early access period where minting is limited to pass holders uint256 public earlyAccessDuration; /// @notice The contract that is used to gate minting during the early access period PatronPass public passes; /// @notice The project id for this auction in `passes` uint256 internal passProjectId; /// @notice Whether or not this contract is paused /// @dev The exact meaning of "paused" will vary by contract, but in general paused contracts should prevent most /// interactions from non-owners bool public isPaused = false; uint256 private pauseStart; uint256 internal pastPauseDelay; event Paused(); event Unpaused(); /// @notice An error returned when the auction has already started error AlreadyStarted(); /// @notice An error returned when the auction has not yet started error NotYetStarted(); /// @notice An error returned when minting during early access without a pass error EarlyAccessWithoutPass(); error ContractIsPaused(); error ContractNotPaused(); constructor(uint256 startTime_, uint256 earlyAccessDuration_) { // CHECKS inputs require(startTime_ >= block.timestamp, "Start time cannot be in the past"); require(earlyAccessDuration_ >= 60 * 5, "Early access must last at least 5 minutes"); require(earlyAccessDuration_ <= 60 * 60 * 24, "Early access must not last longer than 24 hours"); // EFFECTS startTime = startTime_; earlyAccessDuration = earlyAccessDuration_; } modifier started() { if (!isStarted()) revert NotYetStarted(); _; } modifier unstarted() { if (isStarted()) revert AlreadyStarted(); _; } modifier publicMint() { if (!isPublic()) revert EarlyAccessWithoutPass(); _; } modifier whenPaused() { if (!isPaused) revert ContractNotPaused(); _; } modifier whenNotPaused() { if (isPaused) revert ContractIsPaused(); _; } // OWNER FUNCTIONS /// @notice Pause this contract /// @dev Can only be called by the contract `owner` function pause() public virtual whenNotPaused onlyOwner { // EFFECTS (checks already handled by modifiers) isPaused = true; pauseStart = block.timestamp; emit Paused(); } /// @notice Resume this contract /// @dev Can only be called by the contract `owner` function unpause() public virtual whenPaused onlyOwner { // EFFECTS (checks already handled by modifiers) isPaused = false; emit Unpaused(); // See if pastPauseDelay needs updated if (block.timestamp <= startTime) { return; } // Find the amount time the auction should have been live, but was paused unchecked { // Unchecked arithmetic: computed value will be < block.timestamp and >= 0 if (pauseStart < startTime) { pastPauseDelay = block.timestamp - startTime; } else { pastPauseDelay += (block.timestamp - pauseStart); } } } /// @notice Update the auction start time /// @dev Can only be called by the contract `owner`. Reverts if the auction has already started. function setStartTime(uint256 startTime_) external unstarted onlyOwner { // CHECKS inputs require(startTime_ >= block.timestamp, "New start time cannot be in the past"); // EFFECTS startTime = startTime_; } /// @notice Update the duration of the early access period /// @dev Can only be called by the contract `owner`. Reverts if the auction has already started. function setEarlyAccessDuration(uint256 duration) external unstarted onlyOwner { // CHECKS inputs require(duration >= 60 * 5, "Early access must last at least 5 minutes"); require(duration <= 60 * 60 * 24, "Early access must not last longer than 24 hours"); // EFFECTS earlyAccessDuration = duration; } /// @notice Update the pass contract for the early access period /// @dev Can only be called by the contract `owner`. Reverts if the auction has already started. function setPassContract(PatronPass passContract, uint256 projectId) external unstarted onlyOwner { // CHECKS inputs (address projectMinter, , ) = passContract.projectInfo(projectId); require(projectMinter == address(this), "Specified pass project is not configured for this auction"); // EFFECTS passes = passContract; passProjectId = projectId; if (isStarted()) { // If setting the contract started the auction, then we need to pretend we were paused up to this point unchecked { // Unchecked arithmetic: startTime <= block.timestamp because the auction has started pastPauseDelay = block.timestamp - startTime; } } } // VIEW FUNCTIONS /// @notice Query if the early access period has ended function isPublic() public view returns (bool) { return isStarted() && block.timestamp >= (startTime + pastPauseDelay + earlyAccessDuration); } /// @notice Query if this contract implements an interface /// @param interfaceId The interface identifier, as specified in ERC-165 /// @return `true` if `interfaceID` is implemented and is not 0xffffffff, `false` otherwise function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) { return interfaceId == 0x7f5828d0 || // ERC-173 Contract Ownership Standard interfaceId == 0x01ffc9a7; // ERC-165 Standard Interface Detection } // INTERNAL FUNCTIONS function isStarted() internal view virtual returns (bool) { return address(passes) != address(0) && (isPaused ? pauseStart : block.timestamp) >= startTime; } function timeElapsed() internal view returns (uint256) { if (!isStarted()) return 0; unchecked { // pastPauseDelay cannot be greater than the time passed since startTime if (!isPaused) { return block.timestamp - startTime - pastPauseDelay; } // pastPauseDelay cannot be greater than the time between startTime and pauseStart return pauseStart - startTime - pastPauseDelay; } } }
// SPDX-License-Identifier: MIT // Copyright (c) 2023 Fellowship pragma solidity ^0.8.7; abstract contract MintableById { function mint(address to, uint256 tokenId) external virtual; }
// SPDX-License-Identifier: MIT // Copyright (c) 2023 Fellowship pragma solidity ^0.8.7; /// @notice A contract that draws (without replacement) pseudorandom shuffled values /// @dev Uses prevrandao and Fisher-Yates shuffle to return values one at a time contract Shuffler { uint256 internal remainingValueCount; /// @notice Mapping that lets `drawNext` find values that are still available /// @dev This is effectively the Fisher-Yates in-place array. Zero values stand in for their key to avoid costly /// initialization. All other values are off-by-one so that zero can be represented. Keys from remainingValueCount /// onward have their values set back to zero since they aren't needed once they've been drawn. mapping(uint256 => uint256) private shuffleValues; constructor(uint256 shuffleSize) { // CHECKS require(shuffleSize <= type(uint16).max, "Shuffle size is too large"); // EFFECTS remainingValueCount = shuffleSize; } function drawNext() internal returns (uint256) { // CHECKS require(remainingValueCount > 0, "Shuffled values have been exhausted"); // EFFECTS uint256 swapValue; unchecked { // Unchecked arithmetic: remainingValueCount is nonzero swapValue = shuffleValues[remainingValueCount - 1]; } if (swapValue == 0) { swapValue = remainingValueCount; } else { shuffleValues[remainingValueCount - 1] = 0; } if (remainingValueCount == 1) { // swapValue is the last value left; just return it remainingValueCount = 0; unchecked { return swapValue - 1; } } uint256 randomIndex = uint256(keccak256(abi.encodePacked(remainingValueCount, block.difficulty))) % remainingValueCount; unchecked { // Unchecked arithmetic: remainingValueCount is nonzero remainingValueCount--; // Check if swapValue was drawn // Unchecked arithmetic: swapValue is nonzero if (randomIndex == remainingValueCount) return swapValue - 1; } // Draw the value at randomIndex and put swapValue in its place uint256 drawnValue = shuffleValues[randomIndex]; shuffleValues[randomIndex] = swapValue; unchecked { // Unchecked arithmetic: only subtract if drawnValue is nonzero return drawnValue > 0 ? drawnValue - 1 : randomIndex; } } }
// OpenZeppelin Contracts // // Copyright (c) 2016-2023 zOS Global Limited and contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated // documentation files (the "Software"), to deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the // Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE // WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract MintableById","name":"tokenContract_","type":"address"},{"internalType":"uint256","name":"startTime_","type":"uint256"},{"internalType":"uint256","name":"startPrice_","type":"uint256"},{"internalType":"uint256","name":"earlyPriceDrop","type":"uint256"},{"internalType":"uint256","name":"transitionPrice","type":"uint256"},{"internalType":"uint256","name":"latePriceDrop","type":"uint256"},{"internalType":"uint256","name":"restPrice","type":"uint256"},{"internalType":"uint256","name":"mintLimit_","type":"uint256"},{"internalType":"uint256","name":"publicLimit_","type":"uint256"},{"internalType":"uint256","name":"passLimit_","type":"uint256"},{"internalType":"uint256","name":"earlyAccessDuration_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyStarted","type":"error"},{"inputs":[],"name":"ContractIsPaused","type":"error"},{"inputs":[],"name":"ContractNotPaused","type":"error"},{"inputs":[],"name":"EarlyAccessWithoutPass","type":"error"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"FailedWithdraw","type":"error"},{"inputs":[],"name":"NotYetStarted","type":"error"},{"inputs":[],"name":"SoldOut","type":"error"},{"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":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"purchaser","type":"address"},{"indexed":false,"internalType":"uint256","name":"mintId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"bool","name":"passMint","type":"bool"}],"name":"Purchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalReserved","type":"uint256"}],"name":"Reservation","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctionStages","outputs":[{"internalType":"uint256","name":"priceDropPerSlot","type":"uint256"},{"internalType":"uint256","name":"endPrice","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyAccessDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lowestPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"passId","type":"uint256"}],"name":"mintFromPass","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintMultiple","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256[]","name":"passIds","type":"uint256[]"}],"name":"mintMultipleFromPasses","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintPayment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"passLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"passes","outputs":[{"internalType":"contract PatronPass","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"refundAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"setEarlyAccessDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintLimit_","type":"uint256"}],"name":"setMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract MintableById","name":"tokenContract_","type":"address"}],"name":"setMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract PatronPass","name":"passContract","type":"address"},{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"setPassContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"passLimit_","type":"uint256"}],"name":"setPassLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startPrice_","type":"uint256"},{"components":[{"internalType":"uint256","name":"priceDropPerSlot","type":"uint256"},{"internalType":"uint256","name":"endPrice","type":"uint256"}],"internalType":"struct AuctionStageConfiguration[]","name":"stages_","type":"tuple[]"}],"name":"setPricing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"publicLimit_","type":"uint256"}],"name":"setPublicLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startTime_","type":"uint256"}],"name":"setStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"tokenContract","outputs":[{"internalType":"contract MintableById","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526005805460ff19169055600060128190556016553480156200002557600080fd5b5060405162003f9e38038062003f9e833981016040819052620000489162000b68565b838a8262000056336200098a565b42821015620000ac5760405162461bcd60e51b815260206004820181905260248201527f53746172742074696d652063616e6e6f7420626520696e20746865207061737460448201526064015b60405180910390fd5b61012c811015620001125760405162461bcd60e51b815260206004820152602960248201527f4561726c7920616363657373206d757374206c617374206174206c656173742060448201526835206d696e7574657360b81b6064820152608401620000a3565b620151808111156200017f5760405162461bcd60e51b815260206004820152602f60248201527f4561726c7920616363657373206d757374206e6f74206c617374206c6f6e676560448201526e72207468616e20323420686f75727360881b6064820152608401620000a3565b60019190915560025561ffff811115620001dc5760405162461bcd60e51b815260206004820152601960248201527f53687566666c652073697a6520697320746f6f206c61726765000000000000006044820152606401620000a3565b6008556001600160a01b038b166200024b5760405162461bcd60e51b815260206004820152602b60248201527f546f6b656e20636f6e7472616374206d757374206e6f7420626520746865207a60448201526a65726f206164647265737360a81b6064820152608401620000a3565b66038d7ea4c680008511620002bc5760405162461bcd60e51b815260206004820152603060248201527f5265737420707269636520746f6f206c6f773a20636865636b2074686174207060448201526f72696365732061726520696e2077656960801b6064820152608401620000a3565b86891015620003345760405162461bcd60e51b815260206004820152603360248201527f5374617274207072696365206d757374206e6f74206265206c6f77657220746860448201527f616e207472616e736974696f6e207072696365000000000000000000000000006064820152608401620000a3565b84871015620003a15760405162461bcd60e51b815260206004820152603260248201527f5472616e736974696f6e207072696365206d757374206e6f74206265206c6f776044820152716572207468616e207265737420707269636560701b6064820152608401620000a3565b86890385880381620003b58b601962000c00565b1115620004185760405162461bcd60e51b815260206004820152602a60248201527f496e697469616c207374616765206d757374206c617374206174206c656173746044820152692035206d696e7574657360b01b6064820152608401620000a3565b806200042689601962000c00565b1115620004875760405162461bcd60e51b815260206004820152602860248201527f46696e616c207374616765206d757374206c617374206174206c656173742035604482015267206d696e7574657360c01b6064820152608401620000a3565b620004938a8362000c3c565b15620005085760405162461bcd60e51b815260206004820152603460248201527f5472616e736974696f6e207072696365206d757374206265207265616368616260448201527f6c65206279206561726c79507269636544726f700000000000000000000000006064820152608401620000a3565b62000514888262000c3c565b156200057c5760405162461bcd60e51b815260206004820152603060248201527f52657374696e67207072696365206d75737420626520726561636861626c652060448201526f06279206c617465507269636544726f760841b6064820152608401620000a3565b816200058b8b610e1062000c00565b1015620005f45760405162461bcd60e51b815260206004820152603060248201527f496e697469616c207374616765206d757374206e6f74206c617374206c6f6e6760448201526f6572207468616e20313220686f75727360801b6064820152608401620000a3565b806200060389610e1062000c00565b10156200066a5760405162461bcd60e51b815260206004820152602e60248201527f46696e616c207374616765206d757374206e6f74206c617374206c6f6e67657260448201526d207468616e20313220686f75727360901b6064820152608401620000a3565b600a861015620006b25760405162461bcd60e51b81526020600482015260126024820152714d696e74206c696d697420746f6f206c6f7760701b6044820152606401620000a3565b83600003620007045760405162461bcd60e51b815260206004820152601b60248201527f50617373206c696d6974206d757374206e6f74206265207a65726f00000000006044820152606401620000a3565b84600003620007565760405162461bcd60e51b815260206004820152601d60248201527f5075626c6963206c696d6974206d757374206e6f74206265207a65726f0000006044820152606401620000a3565b858410620007b85760405162461bcd60e51b815260206004820152602860248201527f50617373206c696d6974206d757374206265206c6f776572207468616e206d696044820152671b9d081b1a5b5a5d60c21b6064820152608401620000a3565b8585106200081c5760405162461bcd60e51b815260206004820152602a60248201527f5075626c6963206c696d6974206d757374206265206c6f776572207468616e206044820152691b5a5b9d081b1a5b5a5d60b21b6064820152608401620000a3565b600e80546001600160a01b038f166001600160a01b0319909116179055600f8b905560108b90556011805460018101825560009190915260030260008051602062003f3883398151915281018b815560008051602062003f588339815191529091018a90558a600c84028162000896576200089662000c26565b0460028201556011805460018101825560009190915260030260008051602062003f3883398151915281018a815560008051602062003f5883398151915290910189905589600c840281620008ef57620008ef62000c26565b0460029091015550600d869055600b849055600c859055600185146200094c576200092585620009da60201b620021611760201c565b60405160200162000937919062000c5f565b60405160208183030381529060405262000967565b60405180606001604052806026815260200162003f78602691395b600a9062000976908262000d70565b505050505050505050505050505062000e3c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60606000620009f48362000a7e60201b620021f41760201c565b60010190506000816001600160401b0381111562000a165762000a1662000ccb565b6040519080825280601f01601f19166020018201604052801562000a41576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508462000a4b57509392505050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831062000ac8577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef8100000000831062000af5576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831062000b1457662386f26fc10000830492506010015b6305f5e100831062000b2d576305f5e100830492506008015b612710831062000b4257612710830492506004015b6064831062000b55576064830492506002015b600a831062000b62576001015b92915050565b60008060008060008060008060008060006101608c8e03121562000b8b57600080fd5b8b516001600160a01b038116811462000ba357600080fd5b809b505060208c0151995060408c0151985060608c0151975060808c0151965060a08c0151955060c08c0151945060e08c015193506101008c015192506101208c015191506101408c015190509295989b509295989b9093969950565b808202811582820484141762000b6257634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b60008262000c5a57634e487b7160e01b600052601260045260246000fd5b500690565b6a02634b6b4ba32b2103a37960ad1b81526000825160005b8181101562000c96576020818601810151600b86840101520162000c77565b507f2070757263686173657320776974686f75742061207061737300000000000000600b939091019283015250602401919050565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000cf657607f821691505b60208210810362000d1757634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000d6b57600081815260208120601f850160051c8101602086101562000d465750805b601f850160051c820191505b8181101562000d675782815560010162000d52565b5050505b505050565b81516001600160401b0381111562000d8c5762000d8c62000ccb565b62000da48162000d9d845462000ce1565b8462000d1d565b602080601f83116001811462000ddc576000841562000dc35750858301515b600019600386901b1c1916600185901b17855562000d67565b600085815260208120601f198616915b8281101562000e0d5788860151825594840194600190910190840162000dec565b508582101562000e2c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6130ec8062000e4c6000396000f3fe6080604052600436106102255760003560e01c80638456cb5911610123578063b8ee5289116100ab578063dc9a15351161006f578063dc9a1535146105eb578063ed9ec88814610600578063f1a9af891461062d578063f1ac434714610643578063f2fde38b1461066357600080fd5b8063b8ee52891461055f578063be29b0561461057f578063c4315d8714610595578063cc47a40b146105b5578063cdcca20e146105d557600080fd5b80639d1b464a116100f25780639d1b464a146104e75780639e6a1d7d146104fc578063a4331d2d1461051c578063abbb5a5514610532578063b187bd261461054557600080fd5b80638456cb591461047e5780638da5cb5b146104935780638ea85979146104b1578063996517cf146104d157600080fd5b80633e0a322d116101b1578063590e1ae311610175578063590e1ae3146103fe5780635fc65727146104135780636a9412bd14610433578063715018a61461045357806378e979251461046857600080fd5b80633e0a322d1461035e5780633f4ba83a1461037e57806351cff8d914610393578063552da523146103b357806355a373d6146103c657600080fd5b806316f5f9a2116101f857806316f5f9a2146102ba57806317c5fee5146102cd5780631940d8df146103085780632363761714610328578063344a6bee1461034857600080fd5b806301ffc9a71461022a5780631249c58b1461025f57806316317c211461026957806316acf1751461028d575b600080fd5b34801561023657600080fd5b5061024a610245366004612a25565b610683565b60405190151581526020015b60405180910390f35b6102676106ba565b005b34801561027557600080fd5b5061027f60125481565b604051908152602001610256565b34801561029957600080fd5b5061027f6102a8366004612a64565b60146020526000908152604090205481565b6102676102c8366004612a81565b61073e565b3480156102d957600080fd5b506102ed6102e8366004612b00565b610b50565b60408051938452602084019290925290820152606001610256565b34801561031457600080fd5b50610267610323366004612b19565b610b83565b34801561033457600080fd5b50610267610343366004612b00565b610f0c565b34801561035457600080fd5b5061027f600b5481565b34801561036a57600080fd5b50610267610379366004612b00565b61102d565b34801561038a57600080fd5b506102676110bc565b34801561039f57600080fd5b506102676103ae366004612a64565b61114d565b6102676103c1366004612b00565b61136b565b3480156103d257600080fd5b50600e546103e6906001600160a01b031681565b6040516001600160a01b039091168152602001610256565b34801561040a57600080fd5b5061027f611467565b34801561041f57600080fd5b5061026761042e366004612b85565b6115a8565b34801561043f57600080fd5b5061027f61044e366004612a64565b611704565b34801561045f57600080fd5b50610267611787565b34801561047457600080fd5b5061027f60015481565b34801561048a57600080fd5b50610267611799565b34801561049f57600080fd5b506000546001600160a01b03166103e6565b3480156104bd57600080fd5b506102676104cc366004612a64565b611801565b3480156104dd57600080fd5b5061027f600d5481565b3480156104f357600080fd5b5061027f6118bb565b34801561050857600080fd5b50610267610517366004612b00565b61196b565b34801561052857600080fd5b5061027f600c5481565b610267610540366004612b00565b611b27565b34801561055157600080fd5b5060055461024a9060ff1681565b34801561056b57600080fd5b506003546103e6906001600160a01b031681565b34801561058b57600080fd5b5061027f60105481565b3480156105a157600080fd5b506102676105b0366004612b00565b611dac565b3480156105c157600080fd5b506102676105d0366004612b85565b611eae565b3480156105e157600080fd5b5061027f60025481565b3480156105f757600080fd5b5061024a611ff5565b34801561060c57600080fd5b5061027f61061b366004612a64565b60136020526000908152604090205481565b34801561063957600080fd5b5061027f600f5481565b34801561064f57600080fd5b5061026761065e366004612b00565b61202c565b34801561066f57600080fd5b5061026761067e366004612a64565b6120eb565b60006307f5828d60e41b6001600160e01b0319831614806106b457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6106c2611ff5565b6106df5760405163a611c2c160e01b815260040160405180910390fd5b600c5433600090815260156020526040902054600a911161071c5760405162461bcd60e51b81526004016107139190612be5565b60405180910390fd5b503360009081526015602052604081208054600101905561073c906122cc565b565b610746612436565b610763576040516303bdb9df60e61b815260040160405180910390fd5b60055460ff1615610787576040516306d39fcd60e41b815260040160405180910390fd5b60085460008190036107ac576040516352df9fe560e01b815260040160405180910390fd5b600084116107fc5760405162461bcd60e51b815260206004820152601c60248201527f4d757374206d696e74206174206c65617374206f6e6520746f6b656e000000006044820152606401610713565b600d5484111561084e5760405162461bcd60e51b815260206004820152601d60248201527f5175616e7469747920657863656564732061756374696f6e2073697a650000006044820152606401610713565b600061085a8534612c9c565b905060006108666118bb565b9050808210156108885760405162461bcd60e51b815260040161071390612cb0565b83806108d65760405162461bcd60e51b815260206004820152601e60248201527f4d75737420696e636c756465206174206c65617374206f6e65207061737300006044820152606401610713565b838711156108e2578396505b6000805b828110156109d957600088888381811061090257610902612cde565b90506020020135905060006109168261246c565b905060005b818110801561092957508b85105b156109b55760035460048054604051638c6c4d2d60e01b815291820186905260248201526001600160a01b0390911690638c6c4d2d90604401600060405180830381600087803b15801561097c57600080fd5b505af1158015610990573d6000803e3d6000fd5b50505050848061099f90612cf4565b95505080806109ad90612cf4565b91505061091b565b508a84036109c45750506109d9565b505080806109d190612cf4565b9150506108e6565b5060008111610a395760405162461bcd60e51b815260206004820152602660248201527f4e6f206d696e74732072656d61696e696e6720666f722070726f76696465642060448201526570617373657360d01b6064820152608401610713565b336000908152601360209081526040808320805485019055601490915290208054340190556010549097508790831015610a735760108390555b600854600d540360005b89811015610b44576000610a8f612575565b90507fc5b99c13a484031a4653a7e34411cbbd61c99b9a83377332d5fcf2cc6c75dec233838501838a6001604051610acb959493929190612d0d565b60405180910390a1600e546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015610b1f57600080fd5b505af1158015610b33573d6000803e3d6000fd5b505060019093019250610a7d915050565b50505050505050505050565b60118181548110610b6057600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b610b8b612436565b15610ba957604051631fbde44560e01b815260040160405180910390fd5b610bb16126ce565b8080610c0f5760405162461bcd60e51b815260206004820152602760248201527f4d7573742073706563696679206174206c65617374206f6e652061756374696f6044820152666e20737461676560c81b6064820152608401610713565b600f84905583610c21601160006129e3565b60005b82811015610f045736858583818110610c3f57610c3f612cde565b905060400201905082816020013510610cb95760405162461bcd60e51b815260206004820152603660248201527f45616368207374616765207072696365206d757374206265206c6f776572207460448201527568616e207468652070726576696f757320707269636560501b6064820152608401610713565b66038d7ea4c68000816020013511610d2d5760405162461bcd60e51b815260206004820152603160248201527f537461676520707269636520746f6f206c6f773a20636865636b2074686174206044820152707072696365732061726520696e2077656960781b6064820152608401610713565b6000610d3d602083013585612d3d565b905080610d4c83356019612d50565b1115610daa5760405162461bcd60e51b815260206004820152602760248201527f45616368207374616765206d757374206c617374206174206c656173742035206044820152666d696e7574657360c81b6064820152608401610713565b610db5823582612d67565b15610e1f5760405162461bcd60e51b815260206004820152603460248201527f537461676520656e64207072696365206d75737420626520726561636861626c60448201527306520627920736c6f742070726963652064726f760641b6064820152608401610713565b80610e2d8335610e10612d50565b1015610e8c5760405162461bcd60e51b815260206004820152602860248201527f5374616765206d757374206e6f74206c617374206c6f6e676572207468616e20604482015267313220686f75727360c01b6064820152608401610713565b601180546001810182556000919091526003027f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68018235610ece83600c612d50565b610ed89190612c9c565b600282015582358155602090920135600190920182905550915080610efc81612cf4565b915050610c24565b505050505050565b610f146126ce565b80600003610f645760405162461bcd60e51b815260206004820152601d60248201527f5075626c6963206c696d6974206d757374206e6f74206265207a65726f0000006044820152606401610713565b600d548110610fc85760405162461bcd60e51b815260206004820152602a60248201527f5075626c6963206c696d6974206d757374206265206c6f776572207468616e206044820152691b5a5b9d081b1a5b5a5d60b21b6064820152608401610713565b600c8190556001811461100257610fde81612161565b604051602001610fee9190612d9f565b60405160208183030381529060405261101c565b604051806060016040528060268152602001613091602691395b600a906110299082612e55565b5050565b611035612436565b1561105357604051631fbde44560e01b815260040160405180910390fd5b61105b6126ce565b428110156110b75760405162461bcd60e51b8152602060048201526024808201527f4e65772073746172742074696d652063616e6e6f7420626520696e20746865206044820152631c185cdd60e21b6064820152608401610713565b600155565b60055460ff166110df5760405163dcdde9dd60e01b815260040160405180910390fd5b6110e76126ce565b6005805460ff191690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a160015442111561073c57600154600654101561113a576001544203600755565b6006546007805442929092039091019055565b6111556126ce565b600854601054811590816111e6576011805461117390600190612d3d565b8154811061118357611183612cde565b9060005260206000209060030201600101549050806111a06118bb565b146111e65760405162461bcd60e51b81526020600482015260166024820152755072696365206973207374696c6c2066616c6c696e6760501b6044820152606401610713565b60008160125485600d546111fa9190612d3d565b6112049190612d3d565b61120e9190612d50565b905060165481116112615760405162461bcd60e51b815260206004820152601d60248201527f416c6c2066756e64732068617665206265656e2077697468647261776e0000006044820152606401610713565b6000601654826112719190612d3d565b905047808211156112d057600081116112cc5760405162461bcd60e51b815260206004820152601d60248201527f416c6c2066756e64732068617665206265656e2077697468647261776e0000006044820152606401610713565b8091505b81601660008282546112e29190612f15565b909155505060405160009081906001600160a01b038a169085908381818185875af1925050503d8060008114611334576040519150601f19603f3d011682016040523d82523d6000602084013e611339565b606091505b509150915081611360578381604051637e4c7d7b60e01b8152600401610713929190612f28565b505050505050505050565b611373612436565b611390576040516303bdb9df60e61b815260040160405180910390fd5b600061139b8261246c565b116113f45760405162461bcd60e51b8152602060048201526024808201527f4e6f206d696e74732072656d61696e696e6720666f722070726f7669646564206044820152637061737360e01b6064820152608401610713565b60035460048054604051638c6c4d2d60e01b815291820184905260248201526001600160a01b0390911690638c6c4d2d90604401600060405180830381600087803b15801561144257600080fd5b505af1158015611456573d6000803e3d6000fd5b5050505061146460016122cc565b50565b60008061147333611704565b9050600081116114bb5760405162461bcd60e51b81526020600482015260136024820152724e6f20726566756e6420617661696c61626c6560681b6044820152606401610713565b3360008181526014602090815260409182902080548590039055815192835282018390527fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d910160405180910390a1604051600090339083908381818185875af1925050503d806000811461154c576040519150601f19603f3d011682016040523d82523d6000602084013e611551565b606091505b50509050806115a25760405162461bcd60e51b815260206004820152601c60248201527f526566756e64207472616e7366657220776173207265766572746564000000006044820152606401610713565b50919050565b6115b0612436565b156115ce57604051631fbde44560e01b815260040160405180910390fd5b6115d66126ce565b60405163c9acbcf160e01b8152600481018290526000906001600160a01b0384169063c9acbcf190602401600060405180830381865afa15801561161e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116469190810190612f62565b50909150506001600160a01b03811630146116c95760405162461bcd60e51b815260206004820152603960248201527f53706563696669656420706173732070726f6a656374206973206e6f7420636f60448201527f6e6669677572656420666f7220746869732061756374696f6e000000000000006064820152608401610713565b600380546001600160a01b0319166001600160a01b03851617905560048290556116f1612436565b156116ff5760015442036007555b505050565b6001600160a01b03811660009081526013602052604081205480820361172d5750600092915050565b6000600854600014611746576117416118bb565b61174a565b6010545b6001600160a01b03851660009081526014602052604090205490915082820280820382821061177a57600061177c565b805b979650505050505050565b61178f6126ce565b61073c6000612728565b60055460ff16156117bd576040516306d39fcd60e41b815260040160405180910390fd5b6117c56126ce565b6005805460ff19166001179055426006556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b611809612436565b1561182757604051631fbde44560e01b815260040160405180910390fd5b61182f6126ce565b6001600160a01b0381166118995760405162461bcd60e51b815260206004820152602b60248201527f546f6b656e20636f6e7472616374206d757374206e6f7420626520746865207a60448201526a65726f206164647265737360a81b6064820152608401610713565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000806118c6612778565b600f54601154909350909150600080805b8381101561196357601181815481106118f2576118f2612cde565b906000526020600020906003020191508160020154925082851015611924575054600c90930490920290920392915050565b82850394506011818154811061193c5761193c612cde565b9060005260206000209060030201600101549550808061195b90612cf4565b9150506118d7565b505050505090565b611973612436565b1561199157604051631fbde44560e01b815260040160405180910390fd5b6119996126ce565b60125415611a0f5760405162461bcd60e51b815260206004820152603b60248201527f43616e6e6f74206368616e676520746865206d696e74206c696d6974206f6e6360448201527f6520746f6b656e732068617665206265656e20726573657276656400000000006064820152608401610713565b600a811015611a555760405162461bcd60e51b81526020600482015260126024820152714d696e74206c696d697420746f6f206c6f7760701b6044820152606401610713565b80600b5410611ab85760405162461bcd60e51b815260206004820152602960248201527f4d696e74206c696d6974206d75737420626520686967686572207468616e2070604482015268185cdcc81b1a5b5a5d60ba1b6064820152608401610713565b80600c5410611b1d5760405162461bcd60e51b815260206004820152602b60248201527f4d696e74206c696d6974206d75737420626520686967686572207468616e207060448201526a1d589b1a58c81b1a5b5a5d60aa1b6064820152608401610713565b6008819055600d55565b611b2f611ff5565b611b4c5760405163a611c2c160e01b815260040160405180910390fd5b60055460ff1615611b70576040516306d39fcd60e41b815260040160405180910390fd5b6008546000819003611b95576040516352df9fe560e01b815260040160405180910390fd5b3360009081526013602052604090205482611bf25760405162461bcd60e51b815260206004820152601c60248201527f4d757374206d696e74206174206c65617374206f6e6520746f6b656e000000006044820152606401610713565b33600090815260156020526040902054600c5481108015611c155750600c548411155b600a90611c355760405162461bcd60e51b81526004016107139190612be5565b506000611c428534612c9c565b90506000611c4e6118bb565b905080821015611c705760405162461bcd60e51b815260040161071390612cb0565b84861115611c7c578495505b600c548684011115611c905782600c540395505b336000908152601360209081526040808320878a0190556015825280832080548a01905560149091529020805434019055601054811015611cd15760108190555b600854600d540360005b87811015611da2576000611ced612575565b90507fc5b99c13a484031a4653a7e34411cbbd61c99b9a83377332d5fcf2cc6c75dec23383850183886000604051611d29959493929190612d0d565b60405180910390a1600e546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015611d7d57600080fd5b505af1158015611d91573d6000803e3d6000fd5b505060019093019250611cdb915050565b5050505050505050565b611db4612436565b15611dd257604051631fbde44560e01b815260040160405180910390fd5b611dda6126ce565b61012c811015611e3e5760405162461bcd60e51b815260206004820152602960248201527f4561726c7920616363657373206d757374206c617374206174206c656173742060448201526835206d696e7574657360b81b6064820152608401610713565b62015180811115611ea95760405162461bcd60e51b815260206004820152602f60248201527f4561726c7920616363657373206d757374206e6f74206c617374206c6f6e676560448201526e72207468616e20323420686f75727360881b6064820152608401610713565b600255565b611eb6612436565b15611ed457604051631fbde44560e01b815260040160405180910390fd5b611edc6126ce565b6008546000819003611f01576040516352df9fe560e01b815260040160405180910390fd5b80821115611f0d578091505b60128054830190819055604080516001600160a01b03861681526020810185905280820192909252517fd4f5ef8b5c5c845e4bb3a6bcbe0af0716d1a796eb1cd6996bae76e5d3515493c9181900360600190a160005b82811015611fef57600e546001600160a01b03166340c10f1985611f85612575565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611fcb57600080fd5b505af1158015611fdf573d6000803e3d6000fd5b505060019092019150611f639050565b50505050565b6000611fff612436565b801561202757506002546007546001546120199190612f15565b6120239190612f15565b4210155b905090565b6120346126ce565b806000036120845760405162461bcd60e51b815260206004820152601b60248201527f50617373206c696d6974206d757374206e6f74206265207a65726f00000000006044820152606401610713565b600d5481106120e65760405162461bcd60e51b815260206004820152602860248201527f50617373206c696d6974206d757374206265206c6f776572207468616e206d696044820152671b9d081b1a5b5a5d60c21b6064820152608401610713565b600b55565b6120f36126ce565b6001600160a01b0381166121585760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610713565b61146481612728565b6060600061216e836121f4565b600101905060008167ffffffffffffffff81111561218e5761218e612df9565b6040519080825280601f01601f1916602001820160405280156121b8576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846121c257509392505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106122335772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061225f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061227d57662386f26fc10000830492506010015b6305f5e1008310612295576305f5e100830492506008015b61271083106122a957612710830492506004015b606483106122bb576064830492506002015b600a83106106b45760010192915050565b60055460ff16156122f0576040516306d39fcd60e41b815260040160405180910390fd5b6008546000819003612315576040516352df9fe560e01b815260040160405180910390fd5b600061231f6118bb565b9050803410156123415760405162461bcd60e51b815260040161071390612cb0565b33600090815260136020908152604080832080546001019055601490915290208054340190556010548110156123775760108190555b6000600854600d546123899190612d3d565b90506000612395612575565b90507fc5b99c13a484031a4653a7e34411cbbd61c99b9a83377332d5fcf2cc6c75dec233838334896040516123ce959493929190612d0d565b60405180910390a1600e546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b15801561242257600080fd5b505af1158015611360573d6000803e3d6000fd5b6003546000906001600160a01b031615801590612027575060015460055460ff166124615742612465565b6006545b1015905090565b6003546000906124879033906001600160a01b0316846127b2565b6124df5760405162461bcd60e51b8152602060048201526024808201527f43616c6c6572206973206e6f742070617373206f776e6572206f7220617070726044820152631bdd995960e21b6064820152608401610713565b60035460048054604051636017d14160e11b815291820185905260248201526000916001600160a01b03169063c02fa28290604401602060405180830381865afa158015612531573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125559190613038565b9050600b5481101561256b5780600b540361256e565b60005b9392505050565b600080600854116125d45760405162461bcd60e51b815260206004820152602360248201527f53687566666c65642076616c7565732068617665206265656e206578686175736044820152621d195960ea1b6064820152608401610713565b60085460001901600090815260096020526040812054908190036125fb5750600854612622565b60006009600060016008546126109190612d3d565b81526020810191909152604001600020555b60085460010361263a57600060085560001901919050565b60006008546008544460405160200161265d929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c6126809190612d67565b60088054600019810190915590915081036001016126a2575060001901919050565b6000818152600960205260409020805490839055806126c157816126c6565b600181035b935050505090565b6000546001600160a01b0316331461073c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610713565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612782612436565b61278c5750600090565b60055460ff166127a3575060075460015442030390565b50600754600154600654030390565b6040516331a9108f60e11b81526004810182905260009081906001600160a01b03851690636352211e90602401602060405180830381865afa1580156127fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128209190613051565b9050806001600160a01b0316856001600160a01b031614806128af575060405163e985e9c560e01b81526001600160a01b038281166004830152868116602483015285169063e985e9c590604401602060405180830381865afa15801561288b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128af919061306e565b8061292e575060405163020604bf60e21b8152600481018490526001600160a01b03808716919086169063081812fc90602401602060405180830381865afa1580156128ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129239190613051565b6001600160a01b0316145b806129da57506d76a84fef008cdabe6409d2fe638b3b158015906129da5750604051631574d39f60e31b81526001600160a01b038087166004830152808316602483015285166044820152606481018490526d76a84fef008cdabe6409d2fe638b9063aba69cf890608401602060405180830381865afa1580156129b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129da919061306e565b95945050505050565b508054600082556003029060005260206000209081019061146491905b80821115612a21576000808255600182018190556002820155600301612a00565b5090565b600060208284031215612a3757600080fd5b81356001600160e01b03198116811461256e57600080fd5b6001600160a01b038116811461146457600080fd5b600060208284031215612a7657600080fd5b813561256e81612a4f565b600080600060408486031215612a9657600080fd5b83359250602084013567ffffffffffffffff80821115612ab557600080fd5b818601915086601f830112612ac957600080fd5b813581811115612ad857600080fd5b8760208260051b8501011115612aed57600080fd5b6020830194508093505050509250925092565b600060208284031215612b1257600080fd5b5035919050565b600080600060408486031215612b2e57600080fd5b83359250602084013567ffffffffffffffff80821115612b4d57600080fd5b818601915086601f830112612b6157600080fd5b813581811115612b7057600080fd5b8760208260061b8501011115612aed57600080fd5b60008060408385031215612b9857600080fd5b8235612ba381612a4f565b946020939093013593505050565b600181811c90821680612bc557607f821691505b6020821081036115a257634e487b7160e01b600052602260045260246000fd5b6000602080835260008454612bf981612bb1565b80848701526040600180841660008114612c1a5760018114612c3457612c62565b60ff1985168984015283151560051b890183019550612c62565b896000528660002060005b85811015612c5a5781548b8201860152908301908801612c3f565b8a0184019650505b509398975050505050505050565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082612cab57612cab612c70565b500490565b602080825260149082015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060018201612d0657612d06612c86565b5060010190565b6001600160a01b039590951685526020850193909352604084019190915260608301521515608082015260a00190565b818103818111156106b4576106b4612c86565b80820281158282048414176106b4576106b4612c86565b600082612d7657612d76612c70565b500690565b60005b83811015612d96578181015183820152602001612d7e565b50506000910152565b6a02634b6b4ba32b2103a37960ad1b815260008251612dc581600b850160208701612d7b565b7f2070757263686173657320776974686f75742061207061737300000000000000600b939091019283015250602401919050565b634e487b7160e01b600052604160045260246000fd5b601f8211156116ff57600081815260208120601f850160051c81016020861015612e365750805b601f850160051c820191505b81811015610f0457828155600101612e42565b815167ffffffffffffffff811115612e6f57612e6f612df9565b612e8381612e7d8454612bb1565b84612e0f565b602080601f831160018114612eb85760008415612ea05750858301515b600019600386901b1c1916600185901b178555610f04565b600085815260208120601f198616915b82811015612ee757888601518255948401946001909101908401612ec8565b5085821015612f055787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156106b4576106b4612c86565b8281526040602082015260008251806040840152612f4d816060850160208701612d7b565b601f01601f1916919091016060019392505050565b600080600060608486031215612f7757600080fd5b8351612f8281612a4f565b6020850151909350612f9381612a4f565b604085015190925067ffffffffffffffff80821115612fb157600080fd5b818601915086601f830112612fc557600080fd5b815181811115612fd757612fd7612df9565b604051601f8201601f19908116603f01168101908382118183101715612fff57612fff612df9565b8160405282815289602084870101111561301857600080fd5b613029836020830160208801612d7b565b80955050505050509250925092565b60006020828403121561304a57600080fd5b5051919050565b60006020828403121561306357600080fd5b815161256e81612a4f565b60006020828403121561308057600080fd5b8151801515811461256e57600080fdfe4c696d6974656420746f206f6e6520707572636861736520776974686f757420612070617373a264697066735822122020d652ac76530a8232b2bf57dadfc053564335cb5251986e9fe6d28123edd5b164736f6c6343000812003331ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6831ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c694c696d6974656420746f206f6e6520707572636861736520776974686f75742061207061737300000000000000000000000066bcf059b2d8db6cd10615cdd781828db58268cf00000000000000000000000000000000000000000000000000000000642efa900000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000003782dace9d90000000000000000000000000000000000000000000000000000000470de4df8200000000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000834
Deployed Bytecode
0x6080604052600436106102255760003560e01c80638456cb5911610123578063b8ee5289116100ab578063dc9a15351161006f578063dc9a1535146105eb578063ed9ec88814610600578063f1a9af891461062d578063f1ac434714610643578063f2fde38b1461066357600080fd5b8063b8ee52891461055f578063be29b0561461057f578063c4315d8714610595578063cc47a40b146105b5578063cdcca20e146105d557600080fd5b80639d1b464a116100f25780639d1b464a146104e75780639e6a1d7d146104fc578063a4331d2d1461051c578063abbb5a5514610532578063b187bd261461054557600080fd5b80638456cb591461047e5780638da5cb5b146104935780638ea85979146104b1578063996517cf146104d157600080fd5b80633e0a322d116101b1578063590e1ae311610175578063590e1ae3146103fe5780635fc65727146104135780636a9412bd14610433578063715018a61461045357806378e979251461046857600080fd5b80633e0a322d1461035e5780633f4ba83a1461037e57806351cff8d914610393578063552da523146103b357806355a373d6146103c657600080fd5b806316f5f9a2116101f857806316f5f9a2146102ba57806317c5fee5146102cd5780631940d8df146103085780632363761714610328578063344a6bee1461034857600080fd5b806301ffc9a71461022a5780631249c58b1461025f57806316317c211461026957806316acf1751461028d575b600080fd5b34801561023657600080fd5b5061024a610245366004612a25565b610683565b60405190151581526020015b60405180910390f35b6102676106ba565b005b34801561027557600080fd5b5061027f60125481565b604051908152602001610256565b34801561029957600080fd5b5061027f6102a8366004612a64565b60146020526000908152604090205481565b6102676102c8366004612a81565b61073e565b3480156102d957600080fd5b506102ed6102e8366004612b00565b610b50565b60408051938452602084019290925290820152606001610256565b34801561031457600080fd5b50610267610323366004612b19565b610b83565b34801561033457600080fd5b50610267610343366004612b00565b610f0c565b34801561035457600080fd5b5061027f600b5481565b34801561036a57600080fd5b50610267610379366004612b00565b61102d565b34801561038a57600080fd5b506102676110bc565b34801561039f57600080fd5b506102676103ae366004612a64565b61114d565b6102676103c1366004612b00565b61136b565b3480156103d257600080fd5b50600e546103e6906001600160a01b031681565b6040516001600160a01b039091168152602001610256565b34801561040a57600080fd5b5061027f611467565b34801561041f57600080fd5b5061026761042e366004612b85565b6115a8565b34801561043f57600080fd5b5061027f61044e366004612a64565b611704565b34801561045f57600080fd5b50610267611787565b34801561047457600080fd5b5061027f60015481565b34801561048a57600080fd5b50610267611799565b34801561049f57600080fd5b506000546001600160a01b03166103e6565b3480156104bd57600080fd5b506102676104cc366004612a64565b611801565b3480156104dd57600080fd5b5061027f600d5481565b3480156104f357600080fd5b5061027f6118bb565b34801561050857600080fd5b50610267610517366004612b00565b61196b565b34801561052857600080fd5b5061027f600c5481565b610267610540366004612b00565b611b27565b34801561055157600080fd5b5060055461024a9060ff1681565b34801561056b57600080fd5b506003546103e6906001600160a01b031681565b34801561058b57600080fd5b5061027f60105481565b3480156105a157600080fd5b506102676105b0366004612b00565b611dac565b3480156105c157600080fd5b506102676105d0366004612b85565b611eae565b3480156105e157600080fd5b5061027f60025481565b3480156105f757600080fd5b5061024a611ff5565b34801561060c57600080fd5b5061027f61061b366004612a64565b60136020526000908152604090205481565b34801561063957600080fd5b5061027f600f5481565b34801561064f57600080fd5b5061026761065e366004612b00565b61202c565b34801561066f57600080fd5b5061026761067e366004612a64565b6120eb565b60006307f5828d60e41b6001600160e01b0319831614806106b457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6106c2611ff5565b6106df5760405163a611c2c160e01b815260040160405180910390fd5b600c5433600090815260156020526040902054600a911161071c5760405162461bcd60e51b81526004016107139190612be5565b60405180910390fd5b503360009081526015602052604081208054600101905561073c906122cc565b565b610746612436565b610763576040516303bdb9df60e61b815260040160405180910390fd5b60055460ff1615610787576040516306d39fcd60e41b815260040160405180910390fd5b60085460008190036107ac576040516352df9fe560e01b815260040160405180910390fd5b600084116107fc5760405162461bcd60e51b815260206004820152601c60248201527f4d757374206d696e74206174206c65617374206f6e6520746f6b656e000000006044820152606401610713565b600d5484111561084e5760405162461bcd60e51b815260206004820152601d60248201527f5175616e7469747920657863656564732061756374696f6e2073697a650000006044820152606401610713565b600061085a8534612c9c565b905060006108666118bb565b9050808210156108885760405162461bcd60e51b815260040161071390612cb0565b83806108d65760405162461bcd60e51b815260206004820152601e60248201527f4d75737420696e636c756465206174206c65617374206f6e65207061737300006044820152606401610713565b838711156108e2578396505b6000805b828110156109d957600088888381811061090257610902612cde565b90506020020135905060006109168261246c565b905060005b818110801561092957508b85105b156109b55760035460048054604051638c6c4d2d60e01b815291820186905260248201526001600160a01b0390911690638c6c4d2d90604401600060405180830381600087803b15801561097c57600080fd5b505af1158015610990573d6000803e3d6000fd5b50505050848061099f90612cf4565b95505080806109ad90612cf4565b91505061091b565b508a84036109c45750506109d9565b505080806109d190612cf4565b9150506108e6565b5060008111610a395760405162461bcd60e51b815260206004820152602660248201527f4e6f206d696e74732072656d61696e696e6720666f722070726f76696465642060448201526570617373657360d01b6064820152608401610713565b336000908152601360209081526040808320805485019055601490915290208054340190556010549097508790831015610a735760108390555b600854600d540360005b89811015610b44576000610a8f612575565b90507fc5b99c13a484031a4653a7e34411cbbd61c99b9a83377332d5fcf2cc6c75dec233838501838a6001604051610acb959493929190612d0d565b60405180910390a1600e546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015610b1f57600080fd5b505af1158015610b33573d6000803e3d6000fd5b505060019093019250610a7d915050565b50505050505050505050565b60118181548110610b6057600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b610b8b612436565b15610ba957604051631fbde44560e01b815260040160405180910390fd5b610bb16126ce565b8080610c0f5760405162461bcd60e51b815260206004820152602760248201527f4d7573742073706563696679206174206c65617374206f6e652061756374696f6044820152666e20737461676560c81b6064820152608401610713565b600f84905583610c21601160006129e3565b60005b82811015610f045736858583818110610c3f57610c3f612cde565b905060400201905082816020013510610cb95760405162461bcd60e51b815260206004820152603660248201527f45616368207374616765207072696365206d757374206265206c6f776572207460448201527568616e207468652070726576696f757320707269636560501b6064820152608401610713565b66038d7ea4c68000816020013511610d2d5760405162461bcd60e51b815260206004820152603160248201527f537461676520707269636520746f6f206c6f773a20636865636b2074686174206044820152707072696365732061726520696e2077656960781b6064820152608401610713565b6000610d3d602083013585612d3d565b905080610d4c83356019612d50565b1115610daa5760405162461bcd60e51b815260206004820152602760248201527f45616368207374616765206d757374206c617374206174206c656173742035206044820152666d696e7574657360c81b6064820152608401610713565b610db5823582612d67565b15610e1f5760405162461bcd60e51b815260206004820152603460248201527f537461676520656e64207072696365206d75737420626520726561636861626c60448201527306520627920736c6f742070726963652064726f760641b6064820152608401610713565b80610e2d8335610e10612d50565b1015610e8c5760405162461bcd60e51b815260206004820152602860248201527f5374616765206d757374206e6f74206c617374206c6f6e676572207468616e20604482015267313220686f75727360c01b6064820152608401610713565b601180546001810182556000919091526003027f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68018235610ece83600c612d50565b610ed89190612c9c565b600282015582358155602090920135600190920182905550915080610efc81612cf4565b915050610c24565b505050505050565b610f146126ce565b80600003610f645760405162461bcd60e51b815260206004820152601d60248201527f5075626c6963206c696d6974206d757374206e6f74206265207a65726f0000006044820152606401610713565b600d548110610fc85760405162461bcd60e51b815260206004820152602a60248201527f5075626c6963206c696d6974206d757374206265206c6f776572207468616e206044820152691b5a5b9d081b1a5b5a5d60b21b6064820152608401610713565b600c8190556001811461100257610fde81612161565b604051602001610fee9190612d9f565b60405160208183030381529060405261101c565b604051806060016040528060268152602001613091602691395b600a906110299082612e55565b5050565b611035612436565b1561105357604051631fbde44560e01b815260040160405180910390fd5b61105b6126ce565b428110156110b75760405162461bcd60e51b8152602060048201526024808201527f4e65772073746172742074696d652063616e6e6f7420626520696e20746865206044820152631c185cdd60e21b6064820152608401610713565b600155565b60055460ff166110df5760405163dcdde9dd60e01b815260040160405180910390fd5b6110e76126ce565b6005805460ff191690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a160015442111561073c57600154600654101561113a576001544203600755565b6006546007805442929092039091019055565b6111556126ce565b600854601054811590816111e6576011805461117390600190612d3d565b8154811061118357611183612cde565b9060005260206000209060030201600101549050806111a06118bb565b146111e65760405162461bcd60e51b81526020600482015260166024820152755072696365206973207374696c6c2066616c6c696e6760501b6044820152606401610713565b60008160125485600d546111fa9190612d3d565b6112049190612d3d565b61120e9190612d50565b905060165481116112615760405162461bcd60e51b815260206004820152601d60248201527f416c6c2066756e64732068617665206265656e2077697468647261776e0000006044820152606401610713565b6000601654826112719190612d3d565b905047808211156112d057600081116112cc5760405162461bcd60e51b815260206004820152601d60248201527f416c6c2066756e64732068617665206265656e2077697468647261776e0000006044820152606401610713565b8091505b81601660008282546112e29190612f15565b909155505060405160009081906001600160a01b038a169085908381818185875af1925050503d8060008114611334576040519150601f19603f3d011682016040523d82523d6000602084013e611339565b606091505b509150915081611360578381604051637e4c7d7b60e01b8152600401610713929190612f28565b505050505050505050565b611373612436565b611390576040516303bdb9df60e61b815260040160405180910390fd5b600061139b8261246c565b116113f45760405162461bcd60e51b8152602060048201526024808201527f4e6f206d696e74732072656d61696e696e6720666f722070726f7669646564206044820152637061737360e01b6064820152608401610713565b60035460048054604051638c6c4d2d60e01b815291820184905260248201526001600160a01b0390911690638c6c4d2d90604401600060405180830381600087803b15801561144257600080fd5b505af1158015611456573d6000803e3d6000fd5b5050505061146460016122cc565b50565b60008061147333611704565b9050600081116114bb5760405162461bcd60e51b81526020600482015260136024820152724e6f20726566756e6420617661696c61626c6560681b6044820152606401610713565b3360008181526014602090815260409182902080548590039055815192835282018390527fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d910160405180910390a1604051600090339083908381818185875af1925050503d806000811461154c576040519150601f19603f3d011682016040523d82523d6000602084013e611551565b606091505b50509050806115a25760405162461bcd60e51b815260206004820152601c60248201527f526566756e64207472616e7366657220776173207265766572746564000000006044820152606401610713565b50919050565b6115b0612436565b156115ce57604051631fbde44560e01b815260040160405180910390fd5b6115d66126ce565b60405163c9acbcf160e01b8152600481018290526000906001600160a01b0384169063c9acbcf190602401600060405180830381865afa15801561161e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116469190810190612f62565b50909150506001600160a01b03811630146116c95760405162461bcd60e51b815260206004820152603960248201527f53706563696669656420706173732070726f6a656374206973206e6f7420636f60448201527f6e6669677572656420666f7220746869732061756374696f6e000000000000006064820152608401610713565b600380546001600160a01b0319166001600160a01b03851617905560048290556116f1612436565b156116ff5760015442036007555b505050565b6001600160a01b03811660009081526013602052604081205480820361172d5750600092915050565b6000600854600014611746576117416118bb565b61174a565b6010545b6001600160a01b03851660009081526014602052604090205490915082820280820382821061177a57600061177c565b805b979650505050505050565b61178f6126ce565b61073c6000612728565b60055460ff16156117bd576040516306d39fcd60e41b815260040160405180910390fd5b6117c56126ce565b6005805460ff19166001179055426006556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b611809612436565b1561182757604051631fbde44560e01b815260040160405180910390fd5b61182f6126ce565b6001600160a01b0381166118995760405162461bcd60e51b815260206004820152602b60248201527f546f6b656e20636f6e7472616374206d757374206e6f7420626520746865207a60448201526a65726f206164647265737360a81b6064820152608401610713565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000806118c6612778565b600f54601154909350909150600080805b8381101561196357601181815481106118f2576118f2612cde565b906000526020600020906003020191508160020154925082851015611924575054600c90930490920290920392915050565b82850394506011818154811061193c5761193c612cde565b9060005260206000209060030201600101549550808061195b90612cf4565b9150506118d7565b505050505090565b611973612436565b1561199157604051631fbde44560e01b815260040160405180910390fd5b6119996126ce565b60125415611a0f5760405162461bcd60e51b815260206004820152603b60248201527f43616e6e6f74206368616e676520746865206d696e74206c696d6974206f6e6360448201527f6520746f6b656e732068617665206265656e20726573657276656400000000006064820152608401610713565b600a811015611a555760405162461bcd60e51b81526020600482015260126024820152714d696e74206c696d697420746f6f206c6f7760701b6044820152606401610713565b80600b5410611ab85760405162461bcd60e51b815260206004820152602960248201527f4d696e74206c696d6974206d75737420626520686967686572207468616e2070604482015268185cdcc81b1a5b5a5d60ba1b6064820152608401610713565b80600c5410611b1d5760405162461bcd60e51b815260206004820152602b60248201527f4d696e74206c696d6974206d75737420626520686967686572207468616e207060448201526a1d589b1a58c81b1a5b5a5d60aa1b6064820152608401610713565b6008819055600d55565b611b2f611ff5565b611b4c5760405163a611c2c160e01b815260040160405180910390fd5b60055460ff1615611b70576040516306d39fcd60e41b815260040160405180910390fd5b6008546000819003611b95576040516352df9fe560e01b815260040160405180910390fd5b3360009081526013602052604090205482611bf25760405162461bcd60e51b815260206004820152601c60248201527f4d757374206d696e74206174206c65617374206f6e6520746f6b656e000000006044820152606401610713565b33600090815260156020526040902054600c5481108015611c155750600c548411155b600a90611c355760405162461bcd60e51b81526004016107139190612be5565b506000611c428534612c9c565b90506000611c4e6118bb565b905080821015611c705760405162461bcd60e51b815260040161071390612cb0565b84861115611c7c578495505b600c548684011115611c905782600c540395505b336000908152601360209081526040808320878a0190556015825280832080548a01905560149091529020805434019055601054811015611cd15760108190555b600854600d540360005b87811015611da2576000611ced612575565b90507fc5b99c13a484031a4653a7e34411cbbd61c99b9a83377332d5fcf2cc6c75dec23383850183886000604051611d29959493929190612d0d565b60405180910390a1600e546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015611d7d57600080fd5b505af1158015611d91573d6000803e3d6000fd5b505060019093019250611cdb915050565b5050505050505050565b611db4612436565b15611dd257604051631fbde44560e01b815260040160405180910390fd5b611dda6126ce565b61012c811015611e3e5760405162461bcd60e51b815260206004820152602960248201527f4561726c7920616363657373206d757374206c617374206174206c656173742060448201526835206d696e7574657360b81b6064820152608401610713565b62015180811115611ea95760405162461bcd60e51b815260206004820152602f60248201527f4561726c7920616363657373206d757374206e6f74206c617374206c6f6e676560448201526e72207468616e20323420686f75727360881b6064820152608401610713565b600255565b611eb6612436565b15611ed457604051631fbde44560e01b815260040160405180910390fd5b611edc6126ce565b6008546000819003611f01576040516352df9fe560e01b815260040160405180910390fd5b80821115611f0d578091505b60128054830190819055604080516001600160a01b03861681526020810185905280820192909252517fd4f5ef8b5c5c845e4bb3a6bcbe0af0716d1a796eb1cd6996bae76e5d3515493c9181900360600190a160005b82811015611fef57600e546001600160a01b03166340c10f1985611f85612575565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611fcb57600080fd5b505af1158015611fdf573d6000803e3d6000fd5b505060019092019150611f639050565b50505050565b6000611fff612436565b801561202757506002546007546001546120199190612f15565b6120239190612f15565b4210155b905090565b6120346126ce565b806000036120845760405162461bcd60e51b815260206004820152601b60248201527f50617373206c696d6974206d757374206e6f74206265207a65726f00000000006044820152606401610713565b600d5481106120e65760405162461bcd60e51b815260206004820152602860248201527f50617373206c696d6974206d757374206265206c6f776572207468616e206d696044820152671b9d081b1a5b5a5d60c21b6064820152608401610713565b600b55565b6120f36126ce565b6001600160a01b0381166121585760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610713565b61146481612728565b6060600061216e836121f4565b600101905060008167ffffffffffffffff81111561218e5761218e612df9565b6040519080825280601f01601f1916602001820160405280156121b8576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846121c257509392505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106122335772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061225f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061227d57662386f26fc10000830492506010015b6305f5e1008310612295576305f5e100830492506008015b61271083106122a957612710830492506004015b606483106122bb576064830492506002015b600a83106106b45760010192915050565b60055460ff16156122f0576040516306d39fcd60e41b815260040160405180910390fd5b6008546000819003612315576040516352df9fe560e01b815260040160405180910390fd5b600061231f6118bb565b9050803410156123415760405162461bcd60e51b815260040161071390612cb0565b33600090815260136020908152604080832080546001019055601490915290208054340190556010548110156123775760108190555b6000600854600d546123899190612d3d565b90506000612395612575565b90507fc5b99c13a484031a4653a7e34411cbbd61c99b9a83377332d5fcf2cc6c75dec233838334896040516123ce959493929190612d0d565b60405180910390a1600e546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b15801561242257600080fd5b505af1158015611360573d6000803e3d6000fd5b6003546000906001600160a01b031615801590612027575060015460055460ff166124615742612465565b6006545b1015905090565b6003546000906124879033906001600160a01b0316846127b2565b6124df5760405162461bcd60e51b8152602060048201526024808201527f43616c6c6572206973206e6f742070617373206f776e6572206f7220617070726044820152631bdd995960e21b6064820152608401610713565b60035460048054604051636017d14160e11b815291820185905260248201526000916001600160a01b03169063c02fa28290604401602060405180830381865afa158015612531573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125559190613038565b9050600b5481101561256b5780600b540361256e565b60005b9392505050565b600080600854116125d45760405162461bcd60e51b815260206004820152602360248201527f53687566666c65642076616c7565732068617665206265656e206578686175736044820152621d195960ea1b6064820152608401610713565b60085460001901600090815260096020526040812054908190036125fb5750600854612622565b60006009600060016008546126109190612d3d565b81526020810191909152604001600020555b60085460010361263a57600060085560001901919050565b60006008546008544460405160200161265d929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c6126809190612d67565b60088054600019810190915590915081036001016126a2575060001901919050565b6000818152600960205260409020805490839055806126c157816126c6565b600181035b935050505090565b6000546001600160a01b0316331461073c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610713565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000612782612436565b61278c5750600090565b60055460ff166127a3575060075460015442030390565b50600754600154600654030390565b6040516331a9108f60e11b81526004810182905260009081906001600160a01b03851690636352211e90602401602060405180830381865afa1580156127fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128209190613051565b9050806001600160a01b0316856001600160a01b031614806128af575060405163e985e9c560e01b81526001600160a01b038281166004830152868116602483015285169063e985e9c590604401602060405180830381865afa15801561288b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128af919061306e565b8061292e575060405163020604bf60e21b8152600481018490526001600160a01b03808716919086169063081812fc90602401602060405180830381865afa1580156128ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129239190613051565b6001600160a01b0316145b806129da57506d76a84fef008cdabe6409d2fe638b3b158015906129da5750604051631574d39f60e31b81526001600160a01b038087166004830152808316602483015285166044820152606481018490526d76a84fef008cdabe6409d2fe638b9063aba69cf890608401602060405180830381865afa1580156129b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129da919061306e565b95945050505050565b508054600082556003029060005260206000209081019061146491905b80821115612a21576000808255600182018190556002820155600301612a00565b5090565b600060208284031215612a3757600080fd5b81356001600160e01b03198116811461256e57600080fd5b6001600160a01b038116811461146457600080fd5b600060208284031215612a7657600080fd5b813561256e81612a4f565b600080600060408486031215612a9657600080fd5b83359250602084013567ffffffffffffffff80821115612ab557600080fd5b818601915086601f830112612ac957600080fd5b813581811115612ad857600080fd5b8760208260051b8501011115612aed57600080fd5b6020830194508093505050509250925092565b600060208284031215612b1257600080fd5b5035919050565b600080600060408486031215612b2e57600080fd5b83359250602084013567ffffffffffffffff80821115612b4d57600080fd5b818601915086601f830112612b6157600080fd5b813581811115612b7057600080fd5b8760208260061b8501011115612aed57600080fd5b60008060408385031215612b9857600080fd5b8235612ba381612a4f565b946020939093013593505050565b600181811c90821680612bc557607f821691505b6020821081036115a257634e487b7160e01b600052602260045260246000fd5b6000602080835260008454612bf981612bb1565b80848701526040600180841660008114612c1a5760018114612c3457612c62565b60ff1985168984015283151560051b890183019550612c62565b896000528660002060005b85811015612c5a5781548b8201860152908301908801612c3f565b8a0184019650505b509398975050505050505050565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082612cab57612cab612c70565b500490565b602080825260149082015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060018201612d0657612d06612c86565b5060010190565b6001600160a01b039590951685526020850193909352604084019190915260608301521515608082015260a00190565b818103818111156106b4576106b4612c86565b80820281158282048414176106b4576106b4612c86565b600082612d7657612d76612c70565b500690565b60005b83811015612d96578181015183820152602001612d7e565b50506000910152565b6a02634b6b4ba32b2103a37960ad1b815260008251612dc581600b850160208701612d7b565b7f2070757263686173657320776974686f75742061207061737300000000000000600b939091019283015250602401919050565b634e487b7160e01b600052604160045260246000fd5b601f8211156116ff57600081815260208120601f850160051c81016020861015612e365750805b601f850160051c820191505b81811015610f0457828155600101612e42565b815167ffffffffffffffff811115612e6f57612e6f612df9565b612e8381612e7d8454612bb1565b84612e0f565b602080601f831160018114612eb85760008415612ea05750858301515b600019600386901b1c1916600185901b178555610f04565b600085815260208120601f198616915b82811015612ee757888601518255948401946001909101908401612ec8565b5085821015612f055787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156106b4576106b4612c86565b8281526040602082015260008251806040840152612f4d816060850160208701612d7b565b601f01601f1916919091016060019392505050565b600080600060608486031215612f7757600080fd5b8351612f8281612a4f565b6020850151909350612f9381612a4f565b604085015190925067ffffffffffffffff80821115612fb157600080fd5b818601915086601f830112612fc557600080fd5b815181811115612fd757612fd7612df9565b604051601f8201601f19908116603f01168101908382118183101715612fff57612fff612df9565b8160405282815289602084870101111561301857600080fd5b613029836020830160208801612d7b565b80955050505050509250925092565b60006020828403121561304a57600080fd5b5051919050565b60006020828403121561306357600080fd5b815161256e81612a4f565b60006020828403121561308057600080fd5b8151801515811461256e57600080fdfe4c696d6974656420746f206f6e6520707572636861736520776974686f757420612070617373a264697066735822122020d652ac76530a8232b2bf57dadfc053564335cb5251986e9fe6d28123edd5b164736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000066bcf059b2d8db6cd10615cdd781828db58268cf00000000000000000000000000000000000000000000000000000000642efa900000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000003782dace9d90000000000000000000000000000000000000000000000000000000470de4df8200000000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000834
-----Decoded View---------------
Arg [0] : tokenContract_ (address): 0x66bcf059B2D8dB6cD10615Cdd781828db58268cF
Arg [1] : startTime_ (uint256): 1680800400
Arg [2] : startPrice_ (uint256): 10000000000000000000
Arg [3] : earlyPriceDrop (uint256): 80000000000000000
Arg [4] : transitionPrice (uint256): 4000000000000000000
Arg [5] : latePriceDrop (uint256): 20000000000000000
Arg [6] : restPrice (uint256): 2000000000000000000
Arg [7] : mintLimit_ (uint256): 500
Arg [8] : publicLimit_ (uint256): 5
Arg [9] : passLimit_ (uint256): 2
Arg [10] : earlyAccessDuration_ (uint256): 2100
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000066bcf059b2d8db6cd10615cdd781828db58268cf
Arg [1] : 00000000000000000000000000000000000000000000000000000000642efa90
Arg [2] : 0000000000000000000000000000000000000000000000008ac7230489e80000
Arg [3] : 000000000000000000000000000000000000000000000000011c37937e080000
Arg [4] : 0000000000000000000000000000000000000000000000003782dace9d900000
Arg [5] : 00000000000000000000000000000000000000000000000000470de4df820000
Arg [6] : 0000000000000000000000000000000000000000000000001bc16d674ec80000
Arg [7] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000834
Deployed Bytecode Sourcemap
868:21219:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6194:263:7;;;;;;;;;;-1:-1:-1;6194:263:7;;;;;:::i;:::-;;:::i;:::-;;;470:14:13;;463:22;445:41;;433:2;418:18;6194:263:7;;;;;;;;6236:436:11;;;:::i;:::-;;1851:31;;;;;;;;;;;;;;;;;;;643:25:13;;;631:2;616:18;1851:31:11;497:177:13;2060:46:11;;;;;;;;;;-1:-1:-1;2060:46:11;;;;;:::i;:::-;;;;;;;;;;;;;;10399:2351;;;;;;:::i;:::-;;:::i;1747:35::-;;;;;;;;;;-1:-1:-1;1747:35:11;;;;;:::i;:::-;;:::i;:::-;;;;2142:25:13;;;2198:2;2183:18;;2176:34;;;;2226:18;;;2219:34;2130:2;2115:18;1747:35:11;1940:319:13;15847:1561:11;;;;;;;;;;-1:-1:-1;15847:1561:11;;;;;:::i;:::-;;:::i;18382:524::-;;;;;;;;;;-1:-1:-1;18382:524:11;;;;;:::i;:::-;;:::i;1036:24::-;;;;;;;;;;;;;;;;4017:242:7;;;;;;;;;;-1:-1:-1;4017:242:7;;;;;:::i;:::-;;:::i;3168:696::-;;;;;;;;;;;;;:::i;13874:1271:11:-;;;;;;;;;;-1:-1:-1;13874:1271:11;;;;;:::i;:::-;;:::i;9710:482::-;;;;;;:::i;:::-;;:::i;1464:33::-;;;;;;;;;;-1:-1:-1;1464:33:11;;;;-1:-1:-1;;;;;1464:33:11;;;;;;-1:-1:-1;;;;;3182:32:13;;;3164:51;;3152:2;3137:18;1464:33:11;2997:224:13;8847:626:11;;;;;;;;;;;;;:::i;4952:757:7:-;;;;;;;;;;-1:-1:-1;4952:757:7;;;;;:::i;:::-;;:::i;19894:698:11:-;;;;;;;;;;-1:-1:-1;19894:698:11;;;;;:::i;:::-;;:::i;1831:101:0:-;;;;;;;;;;;;;:::i;654:24:7:-;;;;;;;;;;;;;;;;2863:206;;;;;;;;;;;;;:::i;1201:85:0:-;;;;;;;;;;-1:-1:-1;1247:7:0;1273:6;-1:-1:-1;;;;;1273:6:0;1201:85;;15310:273:11;;;;;;;;;;-1:-1:-1;15310:273:11;;;;;:::i;:::-;;:::i;1288:24::-;;;;;;;;;;;;;;;;18975:843;;;;;;;;;;;;;:::i;17463:509::-;;;;;;;;;;-1:-1:-1;17463:509:11;;;;;:::i;:::-;;:::i;1173:26::-;;;;;;;;;;;;;;;;6888:1889;;;;;;:::i;:::-;;:::i;1247:28:7:-;;;;;;;;;;-1:-1:-1;1247:28:7;;;;;;;;908:24;;;;;;;;;;-1:-1:-1;908:24:7;;;;-1:-1:-1;;;;;908:24:7;;;1664:26:11;;;;;;;;;;;;;;;;4429:347:7;;;;;;;;;;-1:-1:-1;4429:347:7;;;;;:::i;:::-;;:::i;12947:702:11:-;;;;;;;;;;-1:-1:-1;12947:702:11;;;;;:::i;:::-;;:::i;778:34:7:-;;;;;;;;;;;;;;;;5797:155;;;;;;;;;;;;;:::i;1956:44:11:-;;;;;;;;;;-1:-1:-1;1956:44:11;;;;;:::i;:::-;;;;;;;;;;;;;;1566:25;;;;;;;;;;;;;;;;18025:295;;;;;;;;;;-1:-1:-1;18025:295:11;;;;;:::i;:::-;;:::i;2081:198:0:-;;;;;;;;;;-1:-1:-1;2081:198:0;;;;;:::i;:::-;;:::i;6194:263:7:-;6270:4;-1:-1:-1;;;;;;;;;6305:25:7;;;;:105;;-1:-1:-1;;;;;;;;;;6385:25:7;;;6305:105;6286:124;6194:263;-1:-1:-1;;6194:263:7:o;6236:436:11:-;2485:10:7;:8;:10::i;:::-;2480:48;;2504:24;;-1:-1:-1;;;2504:24:7;;;;;;;;;;;2480:48;6346:11:11::1;::::0;6332:10:::1;6316:27;::::0;;;:15:::1;:27;::::0;;;;;6359:24:::1;::::0;-1:-1:-1;6308:76:11::1;;;;-1:-1:-1::0;;;6308:76:11::1;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1::0;6533:10:11::1;6517:27;::::0;;;:15:::1;:27;::::0;;;;:29;;::::1;;::::0;;6653:12:::1;::::0;:5:::1;:12::i;:::-;6236:436::o:0;10399:2351::-;2295:11:7;:9;:11::i;:::-;2290:40;;2315:15;;-1:-1:-1;;;2315:15:7;;;;;;;;;;;2290:40;2688:8:::1;::::0;::::1;;2684:39;;;2705:18;;-1:-1:-1::0;;;2705:18:7::1;;;;;;;;;;;2684:39;10603:19:11::2;::::0;10583:17:::2;10636:14:::0;;;10632:36:::2;;10659:9;;-1:-1:-1::0;;;10659:9:11::2;;;;;;;;;;;10632:36;10697:1;10686:8;:12;10678:53;;;::::0;-1:-1:-1;;;10678:53:11;;6274:2:13;10678:53:11::2;::::0;::::2;6256:21:13::0;6313:2;6293:18;;;6286:30;6352;6332:18;;;6325:58;6400:18;;10678:53:11::2;6072:352:13::0;10678:53:11::2;10761:9;;10749:8;:21;;10741:63;;;::::0;-1:-1:-1;;;10741:63:11;;6631:2:13;10741:63:11::2;::::0;::::2;6613:21:13::0;6670:2;6650:18;;;6643:30;6709:31;6689:18;;;6682:59;6758:18;;10741:63:11::2;6429:353:13::0;10741:63:11::2;10815:13;10831:20;10843:8:::0;10831:9:::2;:20;:::i;:::-;10815:36;;10861:17;10881:14;:12;:14::i;:::-;10861:34;;10922:9;10913:5;:18;;10905:51;;;;-1:-1:-1::0;;;10905:51:11::2;;;;;;;:::i;:::-;10987:7:::0;11019:13;11011:56:::2;;;::::0;-1:-1:-1;;;11011:56:11;;7727:2:13;11011:56:11::2;::::0;::::2;7709:21:13::0;7766:2;7746:18;;;7739:30;7805:32;7785:18;;;7778:60;7855:18;;11011:56:11::2;7525:354:13::0;11011:56:11::2;11112:9;11101:8;:20;11097:71;;;11148:9;11137:20;;11097:71;11231:16;11266:9:::0;11261:473:::2;11285:9;11281:1;:13;11261:473;;;11315:14;11332:7;;11340:1;11332:10;;;;;;;:::i;:::-;;;;;;;11315:27;;11379:17;11399:21;11413:6;11399:13;:21::i;:::-;11379:41;;11468:9;11463:164;11487:9;11483:1;:13;:36;;;;;11511:8;11500;:19;11483:36;11463:164;;;11544:6;::::0;11570:13:::2;::::0;;11544:40:::2;::::0;-1:-1:-1;;;11544:40:11;;;;::::2;8190:25:13::0;;;8231:18;;;8224:34;-1:-1:-1;;;;;11544:6:11;;::::2;::::0;:17:::2;::::0;8163:18:13;;11544:40:11::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;11602:10;;;;;:::i;:::-;;;;11521:3;;;;;:::i;:::-;;;;11463:164;;;;11708:8;11696;:20:::0;11692:31:::2;;11718:5;;;;11692:31;11301:433;;11296:3;;;;;:::i;:::-;;;;11261:473;;;;11763:1;11752:8;:12;11744:63;;;::::0;-1:-1:-1;;;11744:63:11;;8611:2:13;11744:63:11::2;::::0;::::2;8593:21:13::0;8650:2;8630:18;;;8623:30;8689:34;8669:18;;;8662:62;-1:-1:-1;;;8740:18:13;;;8733:36;8786:19;;11744:63:11::2;8409:402:13::0;11744:63:11::2;11999:10;11989:21;::::0;;;:9:::2;:21;::::0;;;;;;;:33;;;::::2;::::0;;12152:11:::2;:23:::0;;;;;:36;;12179:9:::2;12152:36;::::0;;12225:11:::2;::::0;11828:8;;-1:-1:-1;11828:8:11;;12213:23;::::2;12209:77;;;12252:11;:23:::0;;;12209:77:::2;12462:19;::::0;12450:9:::2;::::0;:31:::2;12428:19;12495:239;12519:8;12515:1;:12;12495:239;;;12552:15;12570:10;:8;:10::i;:::-;12552:28;;12603:59;12612:10;12638:1;12624:11;:15;12641:7;12650:5;12657:4;12603:59;;;;;;;;;;:::i;:::-;;;;;;;;12680:13;::::0;:39:::2;::::0;-1:-1:-1;;;12680:39:11;;12699:10:::2;12680:39;::::0;::::2;9494:51:13::0;9561:18;;;9554:34;;;-1:-1:-1;;;;;12680:13:11;;::::2;::::0;:18:::2;::::0;9467::13;;12680:39:11::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;12529:3:11::2;::::0;;::::2;::::0;-1:-1:-1;12495:239:11::2;::::0;-1:-1:-1;;12495:239:11::2;;;12404:340;10538:2212;;;;;10399:2351:::0;;;:::o;1747:35::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1747:35:11;:::o;15847:1561::-;2388:11:7;:9;:11::i;:::-;2384:40;;;2408:16;;-1:-1:-1;;;2408:16:7;;;;;;;;;;;2384:40;1094:13:0::1;:11;:13::i;:::-;16041:7:11::0;16073:14;16065:66:::2;;;::::0;-1:-1:-1;;;16065:66:11;;9801:2:13;16065:66:11::2;::::0;::::2;9783:21:13::0;9840:2;9820:18;;;9813:30;9879:34;9859:18;;;9852:62;-1:-1:-1;;;9930:18:13;;;9923:37;9977:19;;16065:66:11::2;9599:403:13::0;16065:66:11::2;16205:10;:24:::0;;;16218:11;16239:20:::2;16246:13;16181:21;16239:20;:::i;:::-;16275:9;16270:1132;16290:10;16286:1;:14;16270:1132;;;16321:41;16365:7;;16373:1;16365:10;;;;;;;:::i;:::-;;;;;;16321:54;;16415:13;16397:6;:15;;;:31;16389:98;;;::::0;-1:-1:-1;;;16389:98:11;;10209:2:13;16389:98:11::2;::::0;::::2;10191:21:13::0;10248:2;10228:18;;;10221:30;10287:34;10267:18;;;10260:62;-1:-1:-1;;;10338:18:13;;;10331:52;10400:19;;16389:98:11::2;10007:418:13::0;16389:98:11::2;16527:4;16509:6;:15;;;:22;16501:84;;;::::0;-1:-1:-1;;;16501:84:11;;10632:2:13;16501:84:11::2;::::0;::::2;10614:21:13::0;10671:2;10651:18;;;10644:30;10710:34;10690:18;;;10683:62;-1:-1:-1;;;10761:18:13;;;10754:47;10818:19;;16501:84:11::2;10430:413:13::0;16501:84:11::2;16600:23;16626:31;16642:15;::::0;::::2;;16626:13:::0;:31:::2;:::i;:::-;16600:57:::0;-1:-1:-1;16600:57:11;16679:28:::2;:23:::0;::::2;16705:2;16679:28;:::i;:::-;:47;;16671:99;;;::::0;-1:-1:-1;;;16671:99:11;;11356:2:13;16671:99:11::2;::::0;::::2;11338:21:13::0;11395:2;11375:18;;;11368:30;11434:34;11414:18;;;11407:62;-1:-1:-1;;;11485:18:13;;;11478:37;11532:19;;16671:99:11::2;11154:403:13::0;16671:99:11::2;16809:41;16827:23:::0;::::2;16809:15:::0;:41:::2;:::i;:::-;:46:::0;16784:157:::2;;;::::0;-1:-1:-1;;;16784:157:11;;11881:2:13;16784:157:11::2;::::0;::::2;11863:21:13::0;11920:2;11900:18;;;11893:30;11959:34;11939:18;;;11932:62;-1:-1:-1;;;12010:18:13;;;12003:50;12070:19;;16784:157:11::2;11679:416:13::0;16784:157:11::2;17023:15:::0;16980:39:::2;:23:::0;::::2;17007:11;16980:39;:::i;:::-;:58;;16955:157;;;::::0;-1:-1:-1;;;16955:157:11;;12302:2:13;16955:157:11::2;::::0;::::2;12284:21:13::0;12341:2;12321:18;;;12314:30;12380:34;12360:18;;;12353:62;-1:-1:-1;;;12431:18:13;;;12424:38;12479:19;;16955:157:11::2;12100:404:13::0;16955:157:11::2;17159:13;:20:::0;;::::2;::::0;::::2;::::0;;17127:29:::2;17159:20:::0;;;;::::2;;::::0;::::2;17238:23:::0;::::2;17214:20;17219:15:::0;17214:2:::2;:20;:::i;:::-;17213:48;;;;:::i;:::-;17193:17;::::0;::::2;:68:::0;17303:23;::::2;17275:51:::0;;17376:15:::2;::::0;;::::2;;17340:17;::::0;;::::2;:51:::0;;;-1:-1:-1;17376:15:11;-1:-1:-1;16302:3:11;::::2;::::0;::::2;:::i;:::-;;;;16270:1132;;;;15985:1423;;15847:1561:::0;;;:::o;18382:524::-;1094:13:0;:11;:13::i;:::-;18490:12:11::1;18506:1;18490:17:::0;18482:59:::1;;;::::0;-1:-1:-1;;;18482:59:11;;12711:2:13;18482:59:11::1;::::0;::::1;12693:21:13::0;12750:2;12730:18;;;12723:30;12789:31;12769:18;;;12762:59;12838:18;;18482:59:11::1;12509:353:13::0;18482:59:11::1;18574:9;;18559:12;:24;18551:79;;;::::0;-1:-1:-1;;;18551:79:11;;13069:2:13;18551:79:11::1;::::0;::::1;13051:21:13::0;13108:2;13088:18;;;13081:30;13147:34;13127:18;;;13120:62;-1:-1:-1;;;13198:18:13;;;13191:40;13248:19;;18551:79:11::1;12867:406:13::0;18551:79:11::1;18660:11;:26:::0;;;18739:1:::1;18723:17:::0;::::1;:176;;18839:30;18856:12;18839:16;:30::i;:::-;18810:89;;;;;;;;:::i;:::-;;;;;;;;;;;;;18723:176;;;;;;;;;;;;;;;;;;;;;18696:24;::::0;:203:::1;::::0;:24;:203:::1;:::i;:::-;;18382:524:::0;:::o;4017:242:7:-;2388:11;:9;:11::i;:::-;2384:40;;;2408:16;;-1:-1:-1;;;2408:16:7;;;;;;;;;;;2384:40;1094:13:0::1;:11;:13::i;:::-;4145:15:7::2;4131:10;:29;;4123:78;;;::::0;-1:-1:-1;;;4123:78:7;;16552:2:13;4123:78:7::2;::::0;::::2;16534:21:13::0;16591:2;16571:18;;;16564:30;16630:34;16610:18;;;16603:62;-1:-1:-1;;;16681:18:13;;;16674:34;16725:19;;4123:78:7::2;16350:400:13::0;4123:78:7::2;4230:9;:22:::0;4017:242::o;3168:696::-;2589:8;;;;2584:41;;2606:19;;-1:-1:-1;;;2606:19:7;;;;;;;;;;;2584:41;1094:13:0::1;:11;:13::i;:::-;3290:8:7::2;:16:::0;;-1:-1:-1;;3290:16:7::2;::::0;;3321:10:::2;::::0;::::2;::::0;3301:5:::2;::::0;3321:10:::2;3412:9;;3393:15;:28;3389:65:::0;3437:7:::2;3389:65;3673:9;;3660:10;;:22;3656:192;;;3737:9;::::0;3719:15:::2;:27;3702:14;:44:::0;6236:436:11:o;3656:192:7:-:2;3822:10;::::0;3785:14:::2;:48:::0;;3804:15:::2;:28:::0;;;::::2;3785:48:::0;;::::2;::::0;;3168:696::o;13874:1271:11:-;1094:13:0;:11;:13::i;:::-;13993:19:11::1;::::0;14082:11:::1;::::0;14037:14;;;;14103:280:::1;;14144:13;14158:20:::0;;:24:::1;::::0;14181:1:::1;::::0;14158:24:::1;:::i;:::-;14144:39;;;;;;;;:::i;:::-;;;;;;;;;;;:48;;;14131:61;;14335:10;14317:14;:12;:14::i;:::-;:28;14309:63;;;::::0;-1:-1:-1;;;14309:63:11;;16957:2:13;14309:63:11::1;::::0;::::1;16939:21:13::0;16996:2;16976:18;;;16969:30;-1:-1:-1;;;17015:18:13;;;17008:52;17077:18;;14309:63:11::1;16755:346:13::0;14309:63:11::1;14393:20;14457:10;14441:12;;14429:9;14417;;:21;;;;:::i;:::-;:36;;;;:::i;:::-;14416:51;;;;:::i;:::-;14393:74;;14500:15;;14485:12;:30;14477:72;;;::::0;-1:-1:-1;;;14477:72:11;;17308:2:13;14477:72:11::1;::::0;::::1;17290:21:13::0;17347:2;17327:18;;;17320:30;17386:31;17366:18;;;17359:59;17435:18;;14477:72:11::1;17106:353:13::0;14477:72:11::1;14579:26;14623:15;;14608:12;:30;;;;:::i;:::-;14579:59:::0;-1:-1:-1;14666:21:11::1;14701:28:::0;;::::1;14697:232;;;14841:1;14831:7;:11;14823:53;;;::::0;-1:-1:-1;;;14823:53:11;;17308:2:13;14823:53:11::1;::::0;::::1;17290:21:13::0;17347:2;17327:18;;;17320:30;17386:31;17366:18;;;17359:59;17435:18;;14823:53:11::1;17106:353:13::0;14823:53:11::1;14911:7;14890:28;;14697:232;14958:18;14939:15;;:37;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;15022:45:11::1;::::0;14987:12:::1;::::0;;;-1:-1:-1;;;;;15022:14:11;::::1;::::0;15044:18;;14987:12;15022:45;14987:12;15022:45;15044:18;15022:14;:45:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14986:81;;;;15082:7;15077:61;;15113:18;15133:4;15098:40;;-1:-1:-1::0;;;15098:40:11::1;;;;;;;;;:::i;15077:61::-;13930:1215;;;;;;;;13874:1271:::0;:::o;9710:482::-;2295:11:7;:9;:11::i;:::-;2290:40;;2315:15;;-1:-1:-1;;;2315:15:7;;;;;;;;;;;2290:40;9890:1:11::1;9866:21;9880:6;9866:13;:21::i;:::-;:25;9858:74;;;::::0;-1:-1:-1;;;9858:74:11;;18476:2:13;9858:74:11::1;::::0;::::1;18458:21:13::0;18515:2;18495:18;;;18488:30;18554:34;18534:18;;;18527:62;-1:-1:-1;;;18605:18:13;;;18598:34;18649:19;;9858:74:11::1;18274:400:13::0;9858:74:11::1;10037:6;::::0;10063:13:::1;::::0;;10037:40:::1;::::0;-1:-1:-1;;;10037:40:11;;;;::::1;8190:25:13::0;;;8231:18;;;8224:34;-1:-1:-1;;;;;10037:6:11;;::::1;::::0;:17:::1;::::0;8163:18:13;;10037:40:11::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10174:11;10180:4;10174:5;:11::i;:::-;9710:482:::0;:::o;8847:626::-;8883:7;8936:20;8959:27;8975:10;8959:15;:27::i;:::-;8936:50;;9019:1;9004:12;:16;8996:48;;;;-1:-1:-1;;;8996:48:11;;18881:2:13;8996:48:11;;;18863:21:13;18920:2;18900:18;;;18893:30;-1:-1:-1;;;18939:18:13;;;18932:49;18998:18;;8996:48:11;18679:343:13;8996:48:11;9197:10;9185:23;;;;:11;:23;;;;;;;;;:39;;;;;;;9250:32;;9494:51:13;;;9561:18;;9554:34;;;9250:32:11;;9467:18:13;9250:32:11;;;;;;;9337:40;;9318:13;;9337:10;;9360:12;;9318:13;9337:40;9318:13;9337:40;9360:12;9337:10;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9317:60;;;9395:8;9387:49;;;;-1:-1:-1;;;9387:49:11;;19229:2:13;9387:49:11;;;19211:21:13;19268:2;19248:18;;;19241:30;19307;19287:18;;;19280:58;19355:18;;9387:49:11;19027:352:13;9387:49:11;-1:-1:-1;9454:12:11;8847:626;-1:-1:-1;8847:626:11:o;4952:757:7:-;2388:11;:9;:11::i;:::-;2384:40;;;2408:16;;-1:-1:-1;;;2408:16:7;;;;;;;;;;;2384:40;1094:13:0::1;:11;:13::i;:::-;5115:35:7::2;::::0;-1:-1:-1;;;5115:35:7;;::::2;::::0;::::2;643:25:13::0;;;5086:21:7::2;::::0;-1:-1:-1;;;;;5115:24:7;::::2;::::0;::::2;::::0;616:18:13;;5115:35:7::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;5115:35:7::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;5085:65:7;;-1:-1:-1;;;;;;;5168:30:7;::::2;5193:4;5168:30;5160:100;;;::::0;-1:-1:-1;;;5160:100:7;;20750:2:13;5160:100:7::2;::::0;::::2;20732:21:13::0;20789:2;20769:18;;;20762:30;20828:34;20808:18;;;20801:62;20899:27;20879:18;;;20872:55;20944:19;;5160:100:7::2;20548:421:13::0;5160:100:7::2;5290:6;:21:::0;;-1:-1:-1;;;;;;5290:21:7::2;-1:-1:-1::0;;;;;5290:21:7;::::2;;::::0;;5321:13:::2;:25:::0;;;5361:11:::2;:9;:11::i;:::-;5357:346;;;5669:9;::::0;5651:15:::2;:27;5634:14;:44:::0;5357:346:::2;5050:659;4952:757:::0;;:::o;19894:698:11:-;-1:-1:-1;;;;;19992:17:11;;19956:7;19992:17;;;:9;:17;;;;;;20023:11;;;20019:25;;-1:-1:-1;20043:1:11;;19894:698;-1:-1:-1;;19894:698:11:o;20019:25::-;20055:19;20077;;20100:1;20077:24;:55;;20118:14;:12;:14::i;:::-;20077:55;;;20104:11;;20077:55;-1:-1:-1;;;;;20161:19:11;;20143:15;20161:19;;;:11;:19;;;;;;20055:77;;-1:-1:-1;20370:20:11;;;20496;;;20545;;;20544:41;;20584:1;20544:41;;;20569:12;20544:41;20537:48;19894:698;-1:-1:-1;;;;;;;19894:698:11:o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;2863:206:7:-:0;2688:8;;;;2684:39;;;2705:18;;-1:-1:-1;;;2705:18:7;;;;;;;;;;;2684:39;1094:13:0::1;:11;:13::i;:::-;2986:8:7::2;:15:::0;;-1:-1:-1;;2986:15:7::2;2997:4;2986:15;::::0;;3024::::2;3011:10;:28:::0;3054:8:::2;::::0;::::2;::::0;2986::::2;::::0;3054::::2;2863:206::o:0;15310:273:11:-;2388:11:7;:9;:11::i;:::-;2384:40;;;2408:16;;-1:-1:-1;;;2408:16:7;;;;;;;;;;;2384:40;1094:13:0::1;:11;:13::i;:::-;-1:-1:-1::0;;;;;15432:37:11;::::2;15424:93;;;::::0;-1:-1:-1;;;15424:93:11;;21176:2:13;15424:93:11::2;::::0;::::2;21158:21:13::0;21215:2;21195:18;;;21188:30;21254:34;21234:18;;;21227:62;-1:-1:-1;;;21305:18:13;;;21298:41;21356:19;;15424:93:11::2;20974:407:13::0;15424:93:11::2;15546:13;:30:::0;;-1:-1:-1;;;;;;15546:30:11::2;-1:-1:-1::0;;;;;15546:30:11;;;::::2;::::0;;;::::2;::::0;;15310:273::o;18975:843::-;19020:13;19045:12;19060:13;:11;:13::i;:::-;19092:10;;19133:13;:20;19092:10;;-1:-1:-1;19045:28:11;;-1:-1:-1;19112:18:11;;;19230:514;19254:10;19250:1;:14;19230:514;;;19293:13;19307:1;19293:16;;;;;;;;:::i;:::-;;;;;;;;;;;19285:24;;19339:5;:14;;;19323:30;;19378:13;19371:4;:20;19367:201;;;-1:-1:-1;19458:22:11;19491:2;19484:9;;;19458:36;;;19523:12;;;;;-1:-1:-1;;18975:843:11:o;19367:201::-;19659:13;19651:21;;;;19708:13;19722:1;19708:16;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;19700:33;;19266:3;;;;;:::i;:::-;;;;19230:514;;;;19799:12;;;;18975:843;:::o;17463:509::-;2388:11:7;:9;:11::i;:::-;2384:40;;;2408:16;;-1:-1:-1;;;2408:16:7;;;;;;;;;;;2384:40;1094:13:0::1;:11;:13::i;:::-;17577:12:11::2;::::0;:17;17569:89:::2;;;::::0;-1:-1:-1;;;17569:89:11;;21588:2:13;17569:89:11::2;::::0;::::2;21570:21:13::0;21627:2;21607:18;;;21600:30;21666:34;21646:18;;;21639:62;21737:29;21717:18;;;21710:57;21784:19;;17569:89:11::2;21386:423:13::0;17569:89:11::2;17690:2;17676:10;:16;;17668:47;;;::::0;-1:-1:-1;;;17668:47:11;;22016:2:13;17668:47:11::2;::::0;::::2;21998:21:13::0;22055:2;22035:18;;;22028:30;-1:-1:-1;;;22074:18:13;;;22067:48;22132:18;;17668:47:11::2;21814:342:13::0;17668:47:11::2;17745:10;17733:9;;:22;17725:76;;;::::0;-1:-1:-1;;;17725:76:11;;22363:2:13;17725:76:11::2;::::0;::::2;22345:21:13::0;22402:2;22382:18;;;22375:30;22441:34;22421:18;;;22414:62;-1:-1:-1;;;22492:18:13;;;22485:39;22541:19;;17725:76:11::2;22161:405:13::0;17725:76:11::2;17833:10;17819:11;;:24;17811:80;;;::::0;-1:-1:-1;;;17811:80:11;;22773:2:13;17811:80:11::2;::::0;::::2;22755:21:13::0;22812:2;22792:18;;;22785:30;22851:34;22831:18;;;22824:62;-1:-1:-1;;;22902:18:13;;;22895:41;22953:19;;17811:80:11::2;22571:407:13::0;17811:80:11::2;17933:19;:32:::0;;;17921:9:::2;:44:::0;17463:509::o;6888:1889::-;2485:10:7;:8;:10::i;:::-;2480:48;;2504:24;;-1:-1:-1;;;2504:24:7;;;;;;;;;;;2480:48;2688:8:::1;::::0;::::1;;2684:39;;;2705:18;;-1:-1:-1::0;;;2705:18:7::1;;;;;;;;;;;2684:39;7041:19:11::2;::::0;7021:17:::2;7074:14:::0;;;7070:36:::2;;7097:9;;-1:-1:-1::0;;;7097:9:11::2;;;;;;;;;;;7070:36;7150:10;7116:21;7140::::0;;;:9:::2;:21;::::0;;;;;7179:12;7171:53:::2;;;::::0;-1:-1:-1;;;7171:53:11;;6274:2:13;7171:53:11::2;::::0;::::2;6256:21:13::0;6313:2;6293:18;;;6286:30;6352;6332:18;;;6325:58;6400:18;;7171:53:11::2;6072:352:13::0;7171:53:11::2;7274:10;7235:20;7258:27:::0;;;:15:::2;:27;::::0;;;;;7318:11:::2;::::0;7303:26;::::2;:53:::0;::::2;;;;7345:11;;7333:8;:23;;7303:53;7358:24;7295:88;;;;;-1:-1:-1::0;;;7295:88:11::2;;;;;;;;:::i;:::-;-1:-1:-1::0;7394:13:11::2;7410:20;7422:8:::0;7410:9:::2;:20;:::i;:::-;7394:36;;7440:17;7460:14;:12;:14::i;:::-;7440:34;;7501:9;7492:5;:18;;7484:51;;;;-1:-1:-1::0;;;7484:51:11::2;;;;;;;:::i;:::-;7580:9;7569:8;:20;7565:71;;;7616:9;7605:20;;7565:71;7700:11;;7689:8;7674:12;:23;:37;7670:113;;;7756:12;7742:11;;:26;7731:37;;7670:113;7878:10;7868:21;::::0;;;:9:::2;:21;::::0;;;;;;;7892:24;;::::2;7868:48:::0;;8009:15:::2;:27:::0;;;;;:39;;;::::2;::::0;;8178:11:::2;:23:::0;;;;;:36;;8205:9:::2;8178:36;::::0;;8251:11:::2;::::0;8239:23;::::2;8235:77;;;8278:11;:23:::0;;;8235:77:::2;8488:19;::::0;8476:9:::2;::::0;:31:::2;8454:19;8521:240;8545:8;8541:1;:12;8521:240;;;8578:15;8596:10;:8;:10::i;:::-;8578:28;;8629:60;8638:10;8664:1;8650:11;:15;8667:7;8676:5;8683;8629:60;;;;;;;;;;:::i;:::-;;;;;;;;8707:13;::::0;:39:::2;::::0;-1:-1:-1;;;8707:39:11;;8726:10:::2;8707:39;::::0;::::2;9494:51:13::0;9561:18;;;9554:34;;;-1:-1:-1;;;;;8707:13:11;;::::2;::::0;:18:::2;::::0;9467::13;;8707:39:11::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;8555:3:11::2;::::0;;::::2;::::0;-1:-1:-1;8521:240:11::2;::::0;-1:-1:-1;;8521:240:11::2;;;8430:341;6976:1801;;;;;6888:1889:::0;:::o;4429:347:7:-;2388:11;:9;:11::i;:::-;2384:40;;;2408:16;;-1:-1:-1;;;2408:16:7;;;;;;;;;;;2384:40;1094:13:0::1;:11;:13::i;:::-;4563:6:7::2;4551:8;:18;;4543:72;;;::::0;-1:-1:-1;;;4543:72:7;;23185:2:13;4543:72:7::2;::::0;::::2;23167:21:13::0;23224:2;23204:18;;;23197:30;23263:34;23243:18;;;23236:62;-1:-1:-1;;;23314:18:13;;;23307:39;23363:19;;4543:72:7::2;22983:405:13::0;4543:72:7::2;4645:12;4633:8;:24;;4625:84;;;::::0;-1:-1:-1;;;4625:84:7;;23595:2:13;4625:84:7::2;::::0;::::2;23577:21:13::0;23634:2;23614:18;;;23607:30;23673:34;23653:18;;;23646:62;-1:-1:-1;;;23724:18:13;;;23717:45;23779:19;;4625:84:7::2;23393:411:13::0;4625:84:7::2;4739:19;:30:::0;4429:347::o;12947:702:11:-;2388:11:7;:9;:11::i;:::-;2384:40;;;2408:16;;-1:-1:-1;;;2408:16:7;;;;;;;;;;;2384:40;1094:13:0::1;:11;:13::i;:::-;13093:19:11::2;::::0;13073:17:::2;13126:14:::0;;;13122:36:::2;;13149:9;;-1:-1:-1::0;;;13149:9:11::2;;;;;;;;;;;13122:36;13203:9;13192:8;:20;13188:71;;;13239:9;13228:20;;13188:71;13365:12;:24:::0;;;::::2;::::0;;;;13415:46:::2;::::0;;-1:-1:-1;;;;;24029:32:13;;24011:51;;24093:2;24078:18;;24071:34;;;24121:18;;;24114:34;;;;13415:46:11;::::2;::::0;;;;23999:2:13;13415:46:11;;::::2;13525:9;13520:113;13544:8;13540:1;:12;13520:113;;;13577:13;::::0;-1:-1:-1;;;;;13577:13:11::2;:18;13596:9:::0;13607:10:::2;:8;:10::i;:::-;13577:41;::::0;-1:-1:-1;;;;;;13577:41:11::2;::::0;;;;;;-1:-1:-1;;;;;9512:32:13;;;13577:41:11::2;::::0;::::2;9494:51:13::0;9561:18;;;9554:34;9467:18;;13577:41:11::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;13554:3:11::2;::::0;;::::2;::::0;-1:-1:-1;13520:113:11::2;::::0;-1:-1:-1;13520:113:11::2;;;13030:619;12947:702:::0;;:::o;5797:155:7:-;5838:4;5861:11;:9;:11::i;:::-;:84;;;;;5925:19;;5908:14;;5896:9;;:26;;;;:::i;:::-;:48;;;;:::i;:::-;5876:15;:69;;5861:84;5854:91;;5797:155;:::o;18025:295:11:-;1094:13:0;:11;:13::i;:::-;18129:10:11::1;18143:1;18129:15:::0;18121:55:::1;;;::::0;-1:-1:-1;;;18121:55:11;;24361:2:13;18121:55:11::1;::::0;::::1;24343:21:13::0;24400:2;24380:18;;;24373:30;24439:29;24419:18;;;24412:57;24486:18;;18121:55:11::1;24159:351:13::0;18121:55:11::1;18207:9;;18194:10;:22;18186:75;;;::::0;-1:-1:-1;;;18186:75:11;;24717:2:13;18186:75:11::1;::::0;::::1;24699:21:13::0;24756:2;24736:18;;;24729:30;24795:34;24775:18;;;24768:62;-1:-1:-1;;;24846:18:13;;;24839:38;24894:19;;18186:75:11::1;24515:404:13::0;18186:75:11::1;18291:9;:22:::0;18025:295::o;2081:198:0:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:0;;25126:2:13;2161:73:0::1;::::0;::::1;25108:21:13::0;25165:2;25145:18;;;25138:30;25204:34;25184:18;;;25177:62;-1:-1:-1;;;25255:18:13;;;25248:36;25301:19;;2161:73:0::1;24924:402:13::0;2161:73:0::1;2244:28;2263:8;2244:18;:28::i;415:696:3:-:0;471:13;520:14;537:17;548:5;537:10;:17::i;:::-;557:1;537:21;520:38;;572:20;606:6;595:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;595:18:3;-1:-1:-1;572:41:3;-1:-1:-1;733:28:3;;;749:2;733:28;788:280;-1:-1:-1;;819:5:3;-1:-1:-1;;;953:2:3;942:14;;937:30;819:5;924:44;1012:2;1003:11;;;-1:-1:-1;1032:21:3;788:280;1032:21;-1:-1:-1;1088:6:3;415:696;-1:-1:-1;;;415:696:3:o;9889:890:5:-;9942:7;;-1:-1:-1;;;10017:15:5;;10013:99;;-1:-1:-1;;;10052:15:5;;;-1:-1:-1;10095:2:5;10085:12;10013:99;10138:6;10129:5;:15;10125:99;;10173:6;10164:15;;;-1:-1:-1;10207:2:5;10197:12;10125:99;10250:6;10241:5;:15;10237:99;;10285:6;10276:15;;;-1:-1:-1;10319:2:5;10309:12;10237:99;10362:5;10353;:14;10349:96;;10396:5;10387:14;;;-1:-1:-1;10429:1:5;10419:11;10349:96;10471:5;10462;:14;10458:96;;10505:5;10496:14;;;-1:-1:-1;10538:1:5;10528:11;10458:96;10580:5;10571;:14;10567:96;;10614:5;10605:14;;;-1:-1:-1;10647:1:5;10637:11;10567:96;10689:5;10680;:14;10676:64;;10724:1;10714:11;10766:6;9889:890;-1:-1:-1;;9889:890:5:o;20625:1032:11:-;2688:8:7;;;;2684:39;;;2705:18;;-1:-1:-1;;;2705:18:7;;;;;;;;;;;2684:39;20743:19:11::1;::::0;20723:17:::1;20776:14:::0;;;20772:36:::1;;20799:9;;-1:-1:-1::0;;;20799:9:11::1;;;;;;;;;;;20772:36;20818:17;20838:14;:12;:14::i;:::-;20818:34;;20883:9;20870;:22;;20862:55;;;;-1:-1:-1::0;;;20862:55:11::1;;;;;;;:::i;:::-;21052:10;21042:21;::::0;;;:9:::1;:21;::::0;;;;;;;:23;;::::1;;::::0;;21189:11:::1;:23:::0;;;;;:36;;21216:9:::1;21189:36;::::0;;21262:11:::1;::::0;21250:23;::::1;21246:77;;;21289:11;:23:::0;;;21246:77:::1;21333:14;21362:19;;21350:9;;:31;;;;:::i;:::-;21333:48;;21391:15;21409:10;:8;:10::i;:::-;21391:28;;21434:58;21443:10;21455:6;21463:7;21472:9;21483:8;21434:58;;;;;;;;;;:::i;:::-;;;;;;;;21611:13;::::0;:39:::1;::::0;-1:-1:-1;;;21611:39:11;;21630:10:::1;21611:39;::::0;::::1;9494:51:13::0;9561:18;;;9554:34;;;-1:-1:-1;;;;;21611:13:11;;::::1;::::0;:18:::1;::::0;9467::13;;21611:39:11::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;6490:169:7::0;6573:6;;6542:4;;-1:-1:-1;;;;;6573:6:7;6565:29;;;;:87;;-1:-1:-1;6643:9:7;;6599:8;;;;:39;;6623:15;6599:39;;;6610:10;;6599:39;6598:54;;6558:94;;6490:169;:::o;21695:390:11:-;21867:6;;21757:7;;21838:44;;21855:10;;-1:-1:-1;;;;;21867:6:11;21875;21838:16;:44::i;:::-;21830:93;;;;-1:-1:-1;;;21830:93:11;;25533:2:13;21830:93:11;;;25515:21:13;25572:2;25552:18;;;25545:30;25611:34;25591:18;;;25584:62;-1:-1:-1;;;25662:18:13;;;25655:34;25706:19;;21830:93:11;25331:400:13;21830:93:11;21949:6;;21973:13;;;21949:38;;-1:-1:-1;;;21949:38:11;;;;;8190:25:13;;;8231:18;;;8224:34;21934:12:11;;-1:-1:-1;;;;;21949:6:11;;:15;;8163:18:13;;21949:38:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21934:53;;22036:9;;22028:4;:17;;:40;;22064:4;22052:9;;:16;22028:40;;;22048:1;22028:40;22021:47;21695:390;-1:-1:-1;;;21695:390:11:o;1005:1550:12:-;1043:7;1110:1;1088:19;;:23;1080:71;;;;-1:-1:-1;;;1080:71:12;;26127:2:13;1080:71:12;;;26109:21:13;26166:2;26146:18;;;26139:30;26205:34;26185:18;;;26178:62;-1:-1:-1;;;26256:18:13;;;26249:33;26299:19;;1080:71:12;25925:399:13;1080:71:12;1326:19;;-1:-1:-1;;1326:23:12;1181:17;1312:38;;;:13;:38;;;;;;;1374:14;;;1370:149;;-1:-1:-1;1416:19:12;;1370:149;;;1507:1;1466:13;:38;1502:1;1480:19;;:23;;;;:::i;:::-;1466:38;;;;;;;;;;;-1:-1:-1;1466:38:12;:42;1370:149;1533:19;;1556:1;1533:24;1529:218;;1659:1;1637:19;:23;-1:-1:-1;;1709:13:12;;1005:1550;-1:-1:-1;1005:1550:12:o;1529:218::-;1757:19;1869;;1814;;1835:16;1797:55;;;;;;;;26486:19:13;;;26530:2;26521:12;;26514:28;26567:2;26558:12;;26329:247;1797:55:12;;;;;;;;;;;;;1787:66;;;;;;1779:75;;:109;;;;:::i;:::-;1990:19;:21;;-1:-1:-1;;1990:21:12;;;;;1757:131;;-1:-1:-1;2131:34:12;;1990:21;2131:34;2127:60;;-1:-1:-1;;;2174:13:12;;1005:1550;-1:-1:-1;1005:1550:12:o;2127:60::-;2280:18;2301:26;;;:13;:26;;;;;;;2337:38;;;;2493:14;:45;;2527:11;2493:45;;;2523:1;2510:10;:14;2493:45;2486:52;;;;;1005:1550;:::o;1359:130:0:-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:0;719:10:2;1422:23:0;1414:68;;;;-1:-1:-1;;;1414:68:0;;26783:2:13;1414:68:0;;;26765:21:13;;;26802:18;;;26795:30;26861:34;26841:18;;;26834:62;26913:18;;1414:68:0;26581:356:13;2433:187:0;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:0;;;-1:-1:-1;;;;;;2541:17:0;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;6665:481:7:-;6711:7;6735:11;:9;:11::i;:::-;6730:26;;-1:-1:-1;6755:1:7;;6665:481::o;6730:26::-;6880:8;;;;6875:99;;-1:-1:-1;6945:14:7;;6933:9;;6915:15;:27;:44;;6665:481::o;6875:99::-;-1:-1:-1;7115:14:7;;7103:9;;7090:10;;:22;:39;;6665:481::o;519:479:6:-;643:26;;-1:-1:-1;;;643:26:6;;;;;:25:13;;;611:4:6;;;;-1:-1:-1;;;;;643:17:6;;;;;616:18:13;;643:26:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;627:42;;699:5;-1:-1:-1;;;;;687:17:6;:8;-1:-1:-1;;;;;687:17:6;;:76;;;-1:-1:-1;720:43:6;;-1:-1:-1;;;720:43:6;;-1:-1:-1;;;;;27428:15:13;;;720:43:6;;;27410:34:13;27480:15;;;27460:18;;;27453:43;720:26:6;;;;;27345:18:13;;720:43:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;687:134;;;-1:-1:-1;779:30:6;;-1:-1:-1;;;779:30:6;;;;;643:25:13;;;-1:-1:-1;;;;;779:42:6;;;;:21;;;;;;616:18:13;;779:30:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;779:42:6;;687:134;:303;;;-1:-1:-1;469:42:6;838:40;:44;;;;:151;;-1:-1:-1;902:87:6;;-1:-1:-1;;;902:87:6;;-1:-1:-1;;;;;28076:15:13;;;902:87:6;;;28058:34:13;28128:15;;;28108:18;;;28101:43;28180:15;;28160:18;;;28153:43;28212:18;;;28205:34;;;469:42:6;;902:41;;27992:19:13;;902:87:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;679:312;519:479;-1:-1:-1;;;;;519:479:6:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:286:13:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:13;;209:43;;199:71;;266:1;263;256:12;679:131;-1:-1:-1;;;;;754:31:13;;744:42;;734:70;;800:1;797;790:12;815:247;874:6;927:2;915:9;906:7;902:23;898:32;895:52;;;943:1;940;933:12;895:52;982:9;969:23;1001:31;1026:5;1001:31;:::i;1067:683::-;1162:6;1170;1178;1231:2;1219:9;1210:7;1206:23;1202:32;1199:52;;;1247:1;1244;1237:12;1199:52;1283:9;1270:23;1260:33;;1344:2;1333:9;1329:18;1316:32;1367:18;1408:2;1400:6;1397:14;1394:34;;;1424:1;1421;1414:12;1394:34;1462:6;1451:9;1447:22;1437:32;;1507:7;1500:4;1496:2;1492:13;1488:27;1478:55;;1529:1;1526;1519:12;1478:55;1569:2;1556:16;1595:2;1587:6;1584:14;1581:34;;;1611:1;1608;1601:12;1581:34;1664:7;1659:2;1649:6;1646:1;1642:14;1638:2;1634:23;1630:32;1627:45;1624:65;;;1685:1;1682;1675:12;1624:65;1716:2;1712;1708:11;1698:21;;1738:6;1728:16;;;;;1067:683;;;;;:::o;1755:180::-;1814:6;1867:2;1855:9;1846:7;1842:23;1838:32;1835:52;;;1883:1;1880;1873:12;1835:52;-1:-1:-1;1906:23:13;;1755:180;-1:-1:-1;1755:180:13:o;2264:728::-;2404:6;2412;2420;2473:2;2461:9;2452:7;2448:23;2444:32;2441:52;;;2489:1;2486;2479:12;2441:52;2525:9;2512:23;2502:33;;2586:2;2575:9;2571:18;2558:32;2609:18;2650:2;2642:6;2639:14;2636:34;;;2666:1;2663;2656:12;2636:34;2704:6;2693:9;2689:22;2679:32;;2749:7;2742:4;2738:2;2734:13;2730:27;2720:55;;2771:1;2768;2761:12;2720:55;2811:2;2798:16;2837:2;2829:6;2826:14;2823:34;;;2853:1;2850;2843:12;2823:34;2906:7;2901:2;2891:6;2888:1;2884:14;2880:2;2876:23;2872:32;2869:45;2866:65;;;2927:1;2924;2917:12;3226:334;3313:6;3321;3374:2;3362:9;3353:7;3349:23;3345:32;3342:52;;;3390:1;3387;3380:12;3342:52;3429:9;3416:23;3448:31;3473:5;3448:31;:::i;:::-;3498:5;3550:2;3535:18;;;;3522:32;;-1:-1:-1;;;3226:334:13:o;4593:380::-;4672:1;4668:12;;;;4715;;;4736:61;;4790:4;4782:6;4778:17;4768:27;;4736:61;4843:2;4835:6;4832:14;4812:18;4809:38;4806:161;;4889:10;4884:3;4880:20;4877:1;4870:31;4924:4;4921:1;4914:15;4952:4;4949:1;4942:15;5104:963;5213:4;5242:2;5271;5260:9;5253:21;5294:1;5327:6;5321:13;5357:36;5383:9;5357:36;:::i;:::-;5429:6;5424:2;5413:9;5409:18;5402:34;5455:2;5476:1;5508:2;5497:9;5493:18;5525:1;5520:158;;;;5692:1;5687:354;;;;5486:555;;5520:158;-1:-1:-1;;5568:24:13;;5548:18;;;5541:52;5646:14;;5639:22;5636:1;5632:30;5617:46;;5613:55;;;-1:-1:-1;5520:158:13;;5687:354;5718:6;5715:1;5708:17;5766:2;5763:1;5753:16;5791:1;5805:180;5819:6;5816:1;5813:13;5805:180;;;5912:14;;5888:17;;;5884:26;;5877:50;5955:16;;;;5834:10;;5805:180;;;6009:17;;6005:26;;;-1:-1:-1;;5486:555:13;-1:-1:-1;6058:3:13;;5104:963;-1:-1:-1;;;;;;;;5104:963:13:o;6787:127::-;6848:10;6843:3;6839:20;6836:1;6829:31;6879:4;6876:1;6869:15;6903:4;6900:1;6893:15;6919:127;6980:10;6975:3;6971:20;6968:1;6961:31;7011:4;7008:1;7001:15;7035:4;7032:1;7025:15;7051:120;7091:1;7117;7107:35;;7122:18;;:::i;:::-;-1:-1:-1;7156:9:13;;7051:120::o;7176:344::-;7378:2;7360:21;;;7417:2;7397:18;;;7390:30;-1:-1:-1;;;7451:2:13;7436:18;;7429:50;7511:2;7496:18;;7176:344::o;7884:127::-;7945:10;7940:3;7936:20;7933:1;7926:31;7976:4;7973:1;7966:15;8000:4;7997:1;7990:15;8269:135;8308:3;8329:17;;;8326:43;;8349:18;;:::i;:::-;-1:-1:-1;8396:1:13;8385:13;;8269:135::o;8816:499::-;-1:-1:-1;;;;;9087:32:13;;;;9069:51;;9151:2;9136:18;;9129:34;;;;9194:2;9179:18;;9172:34;;;;9237:2;9222:18;;9215:34;9293:14;9286:22;9280:3;9265:19;;9258:51;9056:3;9041:19;;8816:499::o;10848:128::-;10915:9;;;10936:11;;;10933:37;;;10950:18;;:::i;10981:168::-;11054:9;;;11085;;11102:15;;;11096:22;;11082:37;11072:71;;11123:18;;:::i;11562:112::-;11594:1;11620;11610:35;;11625:18;;:::i;:::-;-1:-1:-1;11659:9:13;;11562:112::o;13278:250::-;13363:1;13373:113;13387:6;13384:1;13381:13;13373:113;;;13463:11;;;13457:18;13444:11;;;13437:39;13409:2;13402:10;13373:113;;;-1:-1:-1;;13520:1:13;13502:16;;13495:27;13278:250::o;13533:602::-;-1:-1:-1;;;13871:3:13;13864:26;13846:3;13919:6;13913:13;13935:75;14003:6;13998:2;13993:3;13989:12;13982:4;13974:6;13970:17;13935:75;:::i;:::-;14074:27;14069:2;14029:16;;;;14061:11;;;14054:48;-1:-1:-1;14126:2:13;14118:11;;13533:602;-1:-1:-1;13533:602:13:o;14140:127::-;14201:10;14196:3;14192:20;14189:1;14182:31;14232:4;14229:1;14222:15;14256:4;14253:1;14246:15;14272:545;14374:2;14369:3;14366:11;14363:448;;;14410:1;14435:5;14431:2;14424:17;14480:4;14476:2;14466:19;14550:2;14538:10;14534:19;14531:1;14527:27;14521:4;14517:38;14586:4;14574:10;14571:20;14568:47;;;-1:-1:-1;14609:4:13;14568:47;14664:2;14659:3;14655:12;14652:1;14648:20;14642:4;14638:31;14628:41;;14719:82;14737:2;14730:5;14727:13;14719:82;;;14782:17;;;14763:1;14752:13;14719:82;;14993:1352;15119:3;15113:10;15146:18;15138:6;15135:30;15132:56;;;15168:18;;:::i;:::-;15197:97;15287:6;15247:38;15279:4;15273:11;15247:38;:::i;:::-;15241:4;15197:97;:::i;:::-;15349:4;;15413:2;15402:14;;15430:1;15425:663;;;;16132:1;16149:6;16146:89;;;-1:-1:-1;16201:19:13;;;16195:26;16146:89;-1:-1:-1;;14950:1:13;14946:11;;;14942:24;14938:29;14928:40;14974:1;14970:11;;;14925:57;16248:81;;15395:944;;15425:663;5051:1;5044:14;;;5088:4;5075:18;;-1:-1:-1;;15461:20:13;;;15579:236;15593:7;15590:1;15587:14;15579:236;;;15682:19;;;15676:26;15661:42;;15774:27;;;;15742:1;15730:14;;;;15609:19;;15579:236;;;15583:3;15843:6;15834:7;15831:19;15828:201;;;15904:19;;;15898:26;-1:-1:-1;;15987:1:13;15983:14;;;15999:3;15979:24;15975:37;15971:42;15956:58;15941:74;;15828:201;-1:-1:-1;;;;;16075:1:13;16059:14;;;16055:22;16042:36;;-1:-1:-1;14993:1352:13:o;17464:125::-;17529:9;;;17550:10;;;17547:36;;;17563:18;;:::i;17804:465::-;17979:6;17968:9;17961:25;18022:2;18017;18006:9;18002:18;17995:30;17942:4;18054:6;18048:13;18097:6;18092:2;18081:9;18077:18;18070:34;18113:79;18185:6;18180:2;18169:9;18165:18;18160:2;18152:6;18148:15;18113:79;:::i;:::-;18253:2;18232:15;-1:-1:-1;;18228:29:13;18213:45;;;;18260:2;18209:54;;17804:465;-1:-1:-1;;;17804:465:13:o;19384:1159::-;19482:6;19490;19498;19551:2;19539:9;19530:7;19526:23;19522:32;19519:52;;;19567:1;19564;19557:12;19519:52;19599:9;19593:16;19618:31;19643:5;19618:31;:::i;:::-;19718:2;19703:18;;19697:25;19668:5;;-1:-1:-1;19731:33:13;19697:25;19731:33;:::i;:::-;19834:2;19819:18;;19813:25;19783:7;;-1:-1:-1;19857:18:13;19887:14;;;19884:34;;;19914:1;19911;19904:12;19884:34;19952:6;19941:9;19937:22;19927:32;;19997:7;19990:4;19986:2;19982:13;19978:27;19968:55;;20019:1;20016;20009:12;19968:55;20048:2;20042:9;20070:2;20066;20063:10;20060:36;;;20076:18;;:::i;:::-;20151:2;20145:9;20119:2;20205:13;;-1:-1:-1;;20201:22:13;;;20225:2;20197:31;20193:40;20181:53;;;20249:18;;;20269:22;;;20246:46;20243:72;;;20295:18;;:::i;:::-;20335:10;20331:2;20324:22;20370:2;20362:6;20355:18;20410:7;20405:2;20400;20396;20392:11;20388:20;20385:33;20382:53;;;20431:1;20428;20421:12;20382:53;20444:68;20509:2;20504;20496:6;20492:15;20487:2;20483;20479:11;20444:68;:::i;:::-;20531:6;20521:16;;;;;;;19384:1159;;;;;:::o;25736:184::-;25806:6;25859:2;25847:9;25838:7;25834:23;25830:32;25827:52;;;25875:1;25872;25865:12;25827:52;-1:-1:-1;25898:16:13;;25736:184;-1:-1:-1;25736:184:13:o;26942:251::-;27012:6;27065:2;27053:9;27044:7;27040:23;27036:32;27033:52;;;27081:1;27078;27071:12;27033:52;27113:9;27107:16;27132:31;27157:5;27132:31;:::i;27507:277::-;27574:6;27627:2;27615:9;27606:7;27602:23;27598:32;27595:52;;;27643:1;27640;27633:12;27595:52;27675:9;27669:16;27728:5;27721:13;27714:21;27707:5;27704:32;27694:60;;27750:1;27747;27740:12
Swarm Source
ipfs://20d652ac76530a8232b2bf57dadfc053564335cb5251986e9fe6d28123edd5b1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $2,631.03 | 5.1 | $13,418.25 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.