Overview
ETH Balance
0.00063594646 ETH
Eth Value
$1.96 (@ $3,077.71/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 97 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 21023939 | 26 days ago | IN | 0 ETH | 0.00014029 | ||||
Set Approval For... | 18933481 | 319 days ago | IN | 0 ETH | 0.00038795 | ||||
Set Approval For... | 18247238 | 415 days ago | IN | 0 ETH | 0.00028611 | ||||
Set Approval For... | 18149382 | 428 days ago | IN | 0 ETH | 0.00043034 | ||||
Release | 17994086 | 450 days ago | IN | 0 ETH | 0.00131601 | ||||
Release | 17994074 | 450 days ago | IN | 0 ETH | 0.00174958 | ||||
Set Approval For... | 17851685 | 470 days ago | IN | 0 ETH | 0.0006384 | ||||
Set Approval For... | 17751164 | 484 days ago | IN | 0 ETH | 0.00071607 | ||||
Set Approval For... | 17751107 | 484 days ago | IN | 0 ETH | 0.00070494 | ||||
Set Approval For... | 17750677 | 484 days ago | IN | 0 ETH | 0.00067983 | ||||
Safe Transfer Fr... | 17750373 | 484 days ago | IN | 0 ETH | 0.00162302 | ||||
Safe Transfer Fr... | 17750283 | 484 days ago | IN | 0 ETH | 0.00104303 | ||||
Set Paused | 17750246 | 484 days ago | IN | 0 ETH | 0.00048277 | ||||
Mint | 17750239 | 484 days ago | IN | 0.0185 ETH | 0.00652225 | ||||
Mint | 17750232 | 484 days ago | IN | 0.0185 ETH | 0.01391481 | ||||
Mint | 17750210 | 484 days ago | IN | 0.0185 ETH | 0.01421783 | ||||
Mint | 17750203 | 484 days ago | IN | 0 ETH | 0.00436502 | ||||
Mint | 17750191 | 484 days ago | IN | 0.0185 ETH | 0.00777008 | ||||
Mint | 17750190 | 484 days ago | IN | 0.0185 ETH | 0.01333494 | ||||
Mint | 17750188 | 484 days ago | IN | 0 ETH | 0.01196385 | ||||
Mint | 17750172 | 484 days ago | IN | 0 ETH | 0.01183491 | ||||
Mint | 17750162 | 484 days ago | IN | 0 ETH | 0.01095387 | ||||
Mint | 17750153 | 484 days ago | IN | 0.0185 ETH | 0.01335343 | ||||
Mint | 17750151 | 484 days ago | IN | 0.0185 ETH | 0.01364639 | ||||
Mint | 17750147 | 484 days ago | IN | 0 ETH | 0.01085797 |
Loading...
Loading
Contract Name:
Builder
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.20; // This is an NFT for Bird Builders NFT https://www.birdbuilders.io //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, //,,,,,,,,,...,,//*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,, //,,,,,,,,,///,,//*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,///,,,,,,,,,,,, //,,,,,,,,,///,,##*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*##,,///,,,,,,,,,,,, //,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%,,,,,,,%%/ %%,,,,,,,#%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,, //,,,,,,,,,,,,##,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%#..%%,,,%% ,(( %%%,,%%. %%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##,,,,,,,,,,,,,,, //,,,,,,,,,,,,##//*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*%%..%%%**....... %%..(%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//##,,,,,,,,,,,,,,, //,,,,,,,,,,,,##//*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*%%*******....... ..(%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//##,,,,,,,,,,,,,,, //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*%%**(((((((((((((((((..(%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, //,,,,,,,,,...,,//*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*%%((%%%%%%%%%%%%%%%%%((#%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,, ,,,,,,,,,,,, //,,,,,,,,,,,,,,//*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*%%%%(((((((((((((((((%%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,, //,,,,,,,,,///,,//*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%%%%%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,..,,///,,,,,,,,,,,, //,,,,,,,,,///,,##*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*##,,///,,,,,,,,,,,, //,,,,,,,,,,,,##,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##,,,,,,,,,,,,,,, //,,,,,,,,,,,,##,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%%%%%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,##,,,,,,,,,,,,,,, //,,,,,,,,,///##,,,,,,,,,,,,,,,,,,,%%%%%,,,,,,,,,,,,,,,,,,,,,%%%%%%%.................%%%%%,,,,,,,,,,,,,,,,,,,,,%%%%%,,,,,,,,,,,,##///,,,,,,,,,,,, //,,,,,,,,,///##,,,,,,,,,,,,,,,,,,,%% %%%%%%%%%,,,,,,,/%%%%**,.............. ..........%%%%(,,,,,,,%%%%%%%%% %%,,,,,,,,,,,,##///,,,,,,,,,,,, //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%% %%%%%%%(*********.............. .......**/%%%%%%% %%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, //,,,,,,,,, ,,//*,,,,,,,,,,,,,,,,,,,,,%% ,,............ .....***** %%,,,,,,,,,,,,,,,//,,...,,,,,,,,,,,, //,,,,,,,,,,,,,,..,,,,,,,,,,,,,,,,,,,,,,,,%%%%% ,,,............ ...,, %%%%%%%,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,, //,,,,,,,,,///,,//*,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%***** ,,.............,, %%%,,,,,,,,,,,,,,,,,,,,,,,,//,,///,,,,,,,,,,,, //,,,,,,,,,*****//*,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%*** ............ ............ ............%%,,,,,,,,,,,,,,,,,,,,,,//*****,,,,,,,,,,,, //,,,,,,,,,,,,##,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%% .,, ,,. ,,...,,,, %%,,,,,,, ,,,,,,,,,,,,,,##,,,,,,,,,,,,,,, //,,,,,,,,,,,,##//*,,,,,,,,,,,,,,,,,,,,,,,,,,,,%% **. ,,, ** %%,,,,, ,,, ,,,,,,,,,,//##,,,,,,,,,,,,,,, //,,,,,,,,,,,,##//*,,,,,,,,,,,,,,,,,,,,,,,,,,,,%% **#@@@@@@@@@@@@@@@@@@#** **@@@@@@@@@@@@@@@@@@&,,,,,,, ,,,,,,,,,,,,//##,,,,,,,,,,,,,,, //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%** *%%....,@@@@.....%%/ %%%%%%%%%,....@@@@@.....%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, //,,,,,,,,, ,,//*,,,,,,,,,,,,,,,,,,,,,,,,,,%%** *%% %%%%%**... %%, %%,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,, //,,,,,,,,,,,,,,//*,,,,,,,,,,,,,,,,,,,,,,,,,,%%** %% %% *%%**.....%%%%% %%%%%,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,, //,,,,,,,,,///,,//*,,,,,,,,,,,,,,,,,,,,,,,,,,%% *** %%%%%%%%%% .**%%.....%%, %%%%%%%%% %%,,,,,,,,,,,,,,,,,,,,,,//,,///,,,,,,,,,,,, //,,,,,,,,,///,,##*,,,,,,,,,,,,,,,,,,,,,,,,,,%% *** .. %%...%%.. %%,,,,,,,,,,,,,,,,,,,,,*##,,///,,,,,,,,,,,, //,,,,,,,,,,,,##,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%% ***** .. %%***%% ..... %%,,,,,,,,,,,,,,,,,,,,,,,,##,,,,,,,,,,,,,,, //,,,,,,,,,,,,##,,,,,,,,,,,,,,,,,,,,, ,,,,,%% ********** **... %%% **, ***%%,,,,,,,,,,,,,,,,,,,,,,,,##,,,,,,,,,,,,,,, //,,,,,,,,,///##,,,,,,,,,,,,,,,,,,, ,,, ,,,%% *******,,,********* ..,**** %%,,,,,,,,,,,,,,,,,,,,,,,,##///,,,,,,,,,,,, //,,,,,,,,,///##,,,,,,,,,,,,,,,,,,,,, ,,%%# *********,,,,,,,,....*** **...,,** %%,,,,,,,,,,,,,,,,,,,,,,,,##///,,,,,,,,,,,, //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%# *********. ,,,,,....*** **.....,,*** %%*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, //,,,,,,,,,,,,,,//*,,,,,,,,,,,,,,,,,,,,,,,%%# ************,,,,,.......** ,**.. ..,,*** %%*,,,,,,,,,,,,,,,,,,,//,, ,,,,,,,,,,,, //,,,,,,,,,...,,//*,,,,,,,,,,,,,,,,,,,,,,,%%# *********. ,,,,,.........**, ,**.. ..,,*** %%*,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,, //,,,,,,,,,///,,//*,,,,,,,,,,,,,,,,,,,,,,,%%# *********. ,,,,,...........,** **... ,,*** %%*,,,,,,,,,,,,,,,,,,,//,,///,,,,,,,,,,,, //,,,,,,,,,///,,##*,,,,,,,,,,,,,,,,,,,,,,,%%# *********. ,,,,,..............** **..... ,,*** %%*,,,,,,,,,,,,,,,,,,*##,,///,,,,,,,,,,,, //,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,%%# *********. ,,,,,................***.... .. ,,*** %%*,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,, //,,,,,,,,,,,,##,,,,,,,,,,,,,,,,,,,,,,,,%% ***********,..,,,,,....................... ..,,*** %%(,,,,,,,,,,,,,,,,,,,,,##,,,,,,,,,,,,,,, //,,,,,,,,,,,,##//*,,,,,,,,,,,,,,,,,,,,,%% *********//*..,,,,,....................... ..,,*** %%%%%,,,,,,,,,,,,,,,,,,,##,,,.......,,,,, //,,,,,,,,,,,,**,,,,,,,,,,,,,,,,,,,,,,,,%% **..,****%%(..,,,,,....................... ..,,*** %%%%%,,,,,,,,,,,,,,,,,,,**,,,,, .,,,,,,, //,,,,,,,,, ,,//*,,,,,,,,,,,,,,,,,,/%% ***....,****%%(..,,,,,.......................... .....,,*** %%%%%,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,, //,,,,,,,,,,,,,,..,,,,,,,,,,,,,,,,,,,/%% ***....,****%%(..,,,,,.......................... .....,,*** %%%%%,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,, //,,,,,,,,,///,,//*,,,,,,,,,,,,,,,,,,/%% ***.......**%%(..,,,,,.................................,,*** %%%%%,,,,,,,,,,,,,,,,,//,,///,,,,,,,,,,,, //,,,,,,,,,///,,##*,,,,,,,,,,,,,,,,,,/%% ***.......**%%(..,,,,,.................................,,*** %%%%%,,,,,,,,,,,,,,,,*##,,///,,,,,,,,,,,, //,,,,,,,,,,,,##,,,,,,,,,,,,,,,,,,,,,/%% ***.......**%%(..,,,,,....................... .........,,*** %%%%%,,,,,,,,,,,,,,,,,,,##,,,,,,,,,,,,,,, //,,,,,,,,,,,,##,,,,,,,,,,,,,,,,,,,,,/%% ..........**%%(..,,,,,.................................,,*** %%%%%,,,,,,,,,,,,,,,,,,,##,,,,,,,,,,,,,,, //,,,,,,,,,///## .,,,,,,,,,,,,,,,,,,/%% ..........**%%(..,,,,,.................................,,*** %%%%%,,,,,,,,,,,,,,,,,,,##///,,,,,,,,,,,, //,,,,,,,,,///##,,,,,,,,,,,,,,,,,,,,,/%% .......,**%%**,..,,,,,.......................... .....,,*** %%%%%,,,,,,,,,,,,,,,,,,,##///,,,,,,,,,,,, //,,,,,,,,, ,, .,,,,,,,,,,,,,,,,,,/%% .......,**%%##(,,,,,,,....................... ..,,*****%%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, //,,,,,,,,, ,,//*,,,,,,,,,,,,,,,,,,/%% .......,**%%#######///,,,,...,,,,,,,,,,,,..,,,,,,,,,,,, ,,,,,%%%%%,,,,,,,,,,,,,,,,,//,, ,,,,,,,,,,,, //,,,,,,,,,,,,,,..,,,,,,,,,,,,,,,,,,,/%% .......,**%%(((###############################################%%%%%,,,,,,,,,,,,,,,,,..,,,,,,,,,,,,,,,,, //,,,,,,,,,///,,//*,,,,,,,,,,,,,,,,,,/%% .....**#%%*****////###////,..///////..///////*..///////,,,,,&&%%%%%,,,,,,,,,,,,,,,,,//,,///,,,,,,,,,,,, //,,,,,,,,,///,,##*,,,,,,,,,,,,,,,,,,/%% ..**#%%****,,,//###,,.. ..,,,,,............,,,,,,,..,,,&&%%%%%,,,,,,,,,,,,,,,,*##,,///,,,,,,,,,,,, //,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,%% ..**#%%*******//###,,,,...,,,,,,,..,,,..,,,..,,,,,,,,,,,,&&%%%%%,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,, //,,,,,,,,,,,,##,,,,,,,,,,,,,,,,,,,,,,,,%% ..**#%%*******((###//,,,,,,,,,,,,,,.......,,,,, ,,,,###&&%%(,,,,,,,,,,,,,,,,,,,,,##,,,,,,,,,,,,,,, //,,,,,,,,,,,,##//*,,,,,,,,,,,,,,,,,,,,,,,%%% **#%%%%*******(((##//*,,,,,,,..,,,,,,,,,,,,,,,,,,,##%&&%%%%(,,,,,,,,,,,,,,,,,,,//##,,,,,,,,,,,,,,, //,,,,,,,,,,,,##//*,,,,,,,,,,,...,,,,,,,,,%%% **#%%%%%%%%%*****((###############################&&%%%%%%%(,,,,,,,,,,,,,,,,,,,//##,,,,,,,,,,,,... //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,(##%%(((%%%%%%%%%(((((((((((((((((&&%%#//##%%%%%,,#%%##,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, //,,..,,,,,***,,**,,,,,,,,..,,,,,,,,,,,,,,,,,..**/((**(((((//(((((%%%%%%%%%%%%%%%%%%%*****##(((///////,,,,,..,,,,,,,,,,....,,,,, ,,,,,,,,,,,,,,, //.. ..,,///,,,,,,,..,,,,,((///**((/,,,,,,,,,//***((//(((*****************..,,***##**/(((((((**,,,,,,, .,,/////((/////**///**..***,,,,. ,,... //,,...,,//###,,,,///,,,,*//##,,,,,##(///////////**,////(%%,*/////##(////////////////,*////////,*//*,,///////,,,,,,,,,. //////////////##(/////// //,,/////#####////*,,//,,*##,, ,,,,,,,,,,,,,,%%(((%%%%%%%((%%%%%%%%%%%%%%%%%%%%%%%%((#%%%%,,,((,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ////,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,%%&&&%%%%%%%&&%%%%%%%%%%%%%%%%%%%%%%%%&&%%%%%,,*&&,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, //,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, //,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%%%%%,,,,,,,,,*%%%%%%%%%%%(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%%%%,,,,,,,,,,,,,,%%%%%%%%%(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*%%%%%%%,,,,,,,,,,,,,,%%%%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*%%%%%%%,,,,,,,,,,,,,,%%%%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%,,,,,,,,,*%%%%%%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,%%%%%%%*,,,,%%%%%%%*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, import "./ERC721A.sol"; import "./Ownable.sol"; import "./ReentrancyGuard.sol"; import "./ERC2981.sol"; import "./PaymentSplitter.sol"; contract Builder is ERC721A, ReentrancyGuard, PaymentSplitter, ERC2981, Ownable(msg.sender) { bool public paused = true; bool public freezeURI = false; bool[10000] public claimed; string private privateKey; string private constant _name = "Bird Builders"; string private constant _symbol = "BUILD"; string public baseURI = "https://mint-json-bucket.s3.amazonaws.com/"; uint16 public maxSupply = 10000; uint16[120][3] public traitRarity; string[120][3] public traitNames; uint16[10000][4] private moonbirdID; uint256 public cost = 0.0185 ether; mapping(address => uint16) public freeList; address[] private firstPayees = [0x23f0dc26ba952FB9e4ac5A55976c7EaEf6491Cc2, 0x9A7dE61E3025ED3A9F86ab5D4413a5D6F7F382f8, 0x405a1f8dbc824f6D3b57EfAC49263441c47E7AF4, 0x5b20f6C42A42F5a108600D4EE901Ea55dDbA594a]; uint256[] private firstShares = [100, 898, 1, 1]; address public admin = firstPayees[1]; constructor() ERC721A(_name, _symbol) PaymentSplitter(firstPayees, firstShares) payable { _setDefaultRoyalty(address(this), 500); } // @dev public minting function mint(uint16 claimId, string[3] memory traits, string memory key) external payable nonReentrant { uint16 i; uint16[3] memory requestTrait; bool found; require(compare(key, privateKey), "Builder: please mint via website only"); require(totalSupply() + 1 <= maxSupply, "Builder: Can't mint more than max supply"); require(claimId <10000, "Builder: there are only 9999"); require(claimed[claimId] == false, "Builder: already minted that one"); if (msg.sender != owner()) { require(!paused, "Builder: minting is not open yet"); } if (freeList[msg.sender] > 0) { freeList[msg.sender] -= 1; } else if (msg.sender != owner()) { require(msg.value >= cost, "Builder: You must pay for the nft"); } unchecked { //look up the id of each trait by searching for the name for (i = 0; i < 120; i += 1) { if (compare(traits[0], traitNames[0][i])) { requestTrait[0] = i; found = true; break; } } require(found, "Builder: cannot find requested body"); found = false; for (i = 0; i < 120; i += 1) { if (compare(traits[1], traitNames[1][i])) { requestTrait[1] = i; found = true; break; } } require(found, "Builder: cannot find requested accessory"); found = false; for (i = 0; i < 120; i += 1) { if (compare(traits[2], traitNames[2][i])) { requestTrait[2] = i; found = true; break; } } require(found, "Builder: cannot find requested bottom"); moonbirdID[0][totalSupply()] = claimId; claimed[claimId] = true; for (i = 0; i < 3; i += 1) { //body has no rarity limits if (i > 0) { require(traitRarity[i][requestTrait[i]] > 0, "Builder: that trait is no longer available"); traitRarity[i][requestTrait[i]] -= 1; } moonbirdID[i + 1][totalSupply()] = requestTrait[i]; } } _safeMint(msg.sender, 1); } //please mint via the builder website only function setKey(string calldata newKey) public onlyAdmin { privateKey = newKey; } //free mint wallets function addFree(address[] calldata wallet, uint16[] calldata quantity) public onlyAdmin { require(wallet.length == quantity.length,"Builder: count of wallet and quantity not match"); for (uint i = 0; i < wallet.length; i++) { freeList[wallet[i]] = quantity[i]; } } // if string1 == string2 causes compile error function compare(string memory _a, string memory _b) internal pure returns (bool) { return keccak256(abi.encodePacked(_a)) == keccak256(abi.encodePacked(_b)); } // find an unclaimed moonbird function unMinted() external view returns (uint16) { bool found; uint16 i; uint16 start = uint16(uint256(keccak256(abi.encodePacked(block.timestamp))) % 9999); if (start > 9990 || start < 10) { start = 5000; } for (i = start; i < 10000; i += 1) { if (claimed[i] == false) { found = true; break; } } if (found == false) { for (i = start; i > 0; i -= 1) { if (claimed[i] == false) { found = true; break; } } } require(found == true, "Builder: can't find available moonbird"); return i; } // set the names for each variation of one trait function setNames(uint16 traitNum, string[] memory names) public onlyAdmin { for (uint16 i = 0; i < names.length; i += 1) { traitNames[traitNum][i] = names[i]; } } // set the quantity available for each variation of one trait function setRarity(uint16 traitNum, uint16[] memory rarity) public onlyAdmin { for (uint16 i = 0; i < rarity.length; i += 1) { traitRarity[traitNum][i] = rarity[i]; } } // show the list of names and quantity available for each variation of one trait function traitList(uint16 traitNum) external view returns (string[120] memory listName) { for (uint16 i = 0; i < 120; i += 1) { if (bytes(traitNames[traitNum][i]).length == 0) { break; } listName[i] = traitNames[traitNum][i]; } } // show the list of names and quantity available for each variation of one trait function quantityList(uint16 traitNum) external view returns (uint16[120] memory listRarity) { for (uint16 i = 0; i < 120; i += 1) { listRarity[i] = traitRarity[traitNum][i]; } } // show for an nft which Moonbird ID and traits are used function showTrait(uint16 id) external view returns (uint16, string memory, string memory, string memory) { return (moonbirdID[0][id], traitNames[0][moonbirdID[1][id]], traitNames[1][moonbirdID[2][id]], traitNames[2][moonbirdID[3][id]]); } // @dev set cost of minting function setCost(uint256 _newCost) external onlyAdmin { cost = _newCost; } // @dev pause minting function setPaused(bool _status) external onlyAdmin { paused = _status; } // set the second owner function setAdmin(address newAdmin) external onlyOwner { admin = newAdmin; } // @dev Set the base url path to the json metadata used by opensea function setBaseURI(string memory _baseTokenURI) external onlyAdmin { require(freezeURI == false, "Builder: uri is frozen"); baseURI = _baseTokenURI; } // @dev freeze the URI function setFreezeURI() external onlyAdmin { freezeURI = true; } // @dev show the baseuri function _baseURI() internal view virtual override returns (string memory) { return baseURI; } //reduce max supply if needed function reduceMaxSupply(uint16 newMax) external onlyAdmin { require(newMax < maxSupply, "Builder: New maximum must be less than existing maximum"); require(newMax >= totalSupply(), "Builder: New maximum can't be less than minted count"); maxSupply = newMax; } //change payment splitter share count function changeShares(address account, uint256 shares_) external onlyAdmin { _changeShares(account, shares_); } //to support royalties function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } //set royalties function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyAdmin { _setDefaultRoyalty(receiver, feeNumerator); } //allow second owner modifier onlyAdmin() { require(msg.sender == owner() || msg.sender == admin, "Builder: only for owner"); _; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol pragma solidity ^0.8.19; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, defaultRevert); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with a * `customRevert` function as a fallback when `target` reverts. * * Requirements: * * - `customRevert` must be a reverting function. */ function functionCall( address target, bytes memory data, function() internal view customRevert ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, customRevert); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, defaultRevert); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with a `customRevert` function as a fallback revert reason when `target` reverts. * * Requirements: * * - `customRevert` must be a reverting function. */ function functionCallWithValue( address target, bytes memory data, uint256 value, function() internal view customRevert ) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, customRevert); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, defaultRevert); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. */ function functionStaticCall( address target, bytes memory data, function() internal view customRevert ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, customRevert); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, defaultRevert); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall( address target, bytes memory data, function() internal view customRevert ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, customRevert); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided `customRevert`) in case of unsuccessful call or if target was not a contract. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, function() internal view customRevert ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (target.code.length == 0) { revert AddressEmptyCode(target); } } return returndata; } else { _revert(returndata, customRevert); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or with a default revert error. */ function verifyCallResult(bool success, bytes memory returndata) internal view returns (bytes memory) { return verifyCallResult(success, returndata, defaultRevert); } /** * @dev Same as {xref-Address-verifyCallResult-bool-bytes-}[`verifyCallResult`], but with a * `customRevert` function as a fallback when `success` is `false`. * * Requirements: * * - `customRevert` must be a reverting function. */ function verifyCallResult( bool success, bytes memory returndata, function() internal view customRevert ) internal view returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, customRevert); } } /** * @dev Default reverting function when no `customRevert` is provided in a function call. */ function defaultRevert() internal pure { revert FailedInnerCall(); } function _revert(bytes memory returndata, function() internal view customRevert) private view { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { customRevert(); revert FailedInnerCall(); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol pragma solidity ^0.8.19; /** * @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/ERC165.sol) // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.19; import {IERC165} from "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol) // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/common/ERC2981.sol pragma solidity ^0.8.19; import {IERC2981} from "./IERC2981.sol"; import {IERC165, ERC165} from "./ERC165.sol"; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev The default royalty set is invalid (eg. (numerator / denominator) >= 1). */ error ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator); /** * @dev The default royalty receiver is invalid. */ error ERC2981InvalidDefaultRoyaltyReceiver(address receiver); /** * @dev The royalty set for an specific `tokenId` is invalid (eg. (numerator / denominator) >= 1). */ error ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator); /** * @dev The royalty receiver for `tokenId` is invalid. */ error ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver); /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { uint256 denominator = _feeDenominator(); if (feeNumerator > denominator) { // Royalty fee will exceed the sale price revert ERC2981InvalidDefaultRoyalty(feeNumerator, denominator); } if (receiver == address(0)) { revert ERC2981InvalidDefaultRoyaltyReceiver(address(0)); } _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual { uint256 denominator = _feeDenominator(); if (feeNumerator > denominator) { // Royalty fee will exceed the sale price revert ERC2981InvalidTokenRoyalty(tokenId, feeNumerator, denominator); } if (receiver == address(0)) { revert ERC2981InvalidTokenRoyaltyReceiver(tokenId, address(0)); } _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs // https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol pragma solidity ^0.8.4; import "./IERC721A.sol"; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId),".json")) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @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) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.19; /** * @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.9.0) (token/ERC20/IERC20.sol) // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol pragma solidity ^0.8.19; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/extensions/IERC20Permit.sol pragma solidity ^0.8.19; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol) // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/interfaces/IERC2981.sol pragma solidity ^0.8.19; import {IERC165} from "./IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs // https://github.com/chiru-labs/ERC721A/blob/main/contracts/IERC721A.sol pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @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`, * 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 be 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, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * 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 payable; /** * @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 payable; /** * @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); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol pragma solidity ^0.8.19; import {Context} from "./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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { _transferOwnership(initialOwner); } /** * @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 { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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) (finance/PaymentSplitter.sol) // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/finance/PaymentSplitter.sol pragma solidity ^0.8.0; import "./SafeERC20.sol"; import "./Address.sol"; import "./Context.sol"; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. The distribution of shares is set at the * time of contract deployment and can't be updated thereafter. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(IERC20 => uint256) private _erc20TotalReleased; mapping(IERC20 => mapping(address => uint256)) private _erc20Released; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(IERC20 token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(IERC20 token, address account) public view returns (uint256) { return _erc20Released[token][account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Getter for the amount of payee's releasable Ether. */ function releasable(address account) public view returns (uint256) { uint256 totalReceived = address(this).balance + totalReleased(); return _pendingPayment(account, totalReceived, released(account)); } /** * @dev Getter for the amount of payee's releasable `token` tokens. `token` should be the address of an * IERC20 contract. */ function releasable(IERC20 token, address account) public view returns (uint256) { uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); return _pendingPayment(account, totalReceived, released(token, account)); } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 payment = releasable(account); require(payment != 0, "PaymentSplitter: account is not due payment"); // _totalReleased is the sum of all values in _released. // If "_totalReleased += payment" does not overflow, then "_released[account] += payment" cannot overflow. _totalReleased += payment; unchecked { _released[account] += payment; } Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, address account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 payment = releasable(token, account); require(payment != 0, "PaymentSplitter: account is not due payment"); // _erc20TotalReleased[token] is the sum of all values in _erc20Released[token]. // If "_erc20TotalReleased[token] += payment" does not overflow, then "_erc20Released[token][account] += payment" // cannot overflow. _erc20TotalReleased[token] += payment; unchecked { _erc20Released[token][account] += payment; } SafeERC20.safeTransfer(token, account, payment); emit ERC20PaymentReleased(token, account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); //require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } // added in case we need to change shares function _changeShares(address account, uint256 shares_) internal { _totalShares = _totalShares + shares_ - _shares[account]; require(_totalShares > 0, "PaymentSplitter: cannot have 0 shares"); _shares[account] = shares_; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol pragma solidity ^0.8.19; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED if (_status == _ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol) // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol pragma solidity ^0.8.19; import {IERC20} from "./IERC20.sol"; import {IERC20Permit} from "./IERC20Permit.sol"; import {Address} from "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); if (nonceAfter != nonceBefore + 1) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidDefaultRoyalty","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidDefaultRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidTokenRoyalty","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidTokenRoyaltyReceiver","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"wallet","type":"address[]"},{"internalType":"uint16[]","name":"quantity","type":"uint16[]"}],"name":"addFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"changeShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeList","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"claimId","type":"uint16"},{"internalType":"string[3]","name":"traits","type":"string[3]"},{"internalType":"string","name":"key","type":"string"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"traitNum","type":"uint16"}],"name":"quantityList","outputs":[{"internalType":"uint16[120]","name":"listRarity","type":"uint16[120]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"newMax","type":"uint16"}],"name":"reduceMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setFreezeURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newKey","type":"string"}],"name":"setKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"traitNum","type":"uint16"},{"internalType":"string[]","name":"names","type":"string[]"}],"name":"setNames","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"traitNum","type":"uint16"},{"internalType":"uint16[]","name":"rarity","type":"uint16[]"}],"name":"setRarity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"id","type":"uint16"}],"name":"showTrait","outputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"traitNum","type":"uint16"}],"name":"traitList","outputs":[{"internalType":"string[120]","name":"listName","type":"string[120]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"traitNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"traitRarity","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unMinted","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6012805461ffff60a01b19167401000000000000000000000000000000000000000017905560e0604052602a60808181529062004b9c60a03961014d9062000048908262000911565b5061014e805461ffff19166127101790556641b9a6e8584000610c9355604080516080810182527323f0dc26ba952fb9e4ac5a55976c7eaef6491cc28152739a7de61e3025ed3a9f86ab5d4413a5d6f7f382f8602082015273405a1f8dbc824f6d3b57efac49263441c47e7af491810191909152735b20f6c42a42f5a108600d4ee901ea55ddba594a6060820152620000e790610c9590600462000775565b5060408051608081018252606481526103826020820152600191810182905260608101919091526200011f90610c96906004620007df565b50610c95600181548110620001385762000138620009dd565b60009182526020918290200154610c9780546001600160a01b0319166001600160a01b03909216919091179055610c9580546040805182850281018501909152818152339390929190830182828015620001bc57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116200019d575b5050505050610c968054806020026020016040519081016040528092919081815260200182805480156200021057602002820191906000526020600020905b815481526020019060010190808311620001fb575b50505050506040518060400160405280600d81526020017f42697264204275696c64657273000000000000000000000000000000000000008152506040518060400160405280600581526020017f4255494c44000000000000000000000000000000000000000000000000000000815250816002908162000292919062000911565b506003620002a1828262000911565b506000805550506001600855805182511462000344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e64207368617260448201527f6573206c656e677468206d69736d61746368000000000000000000000000000060648201526084015b60405180910390fd5b6000825111620003b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f2070617965657300000000000060448201526064016200033b565b60005b82518110156200041d5762000408838281518110620003d757620003d7620009dd565b6020026020010151838381518110620003f457620003f4620009dd565b60200260200101516200044660201b60201c565b80620004148162000a3b565b915050620003b4565b50505062000431816200063960201b60201c565b5062000440306101f46200068b565b62000a73565b6001600160a01b038216620004de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201527f7a65726f2061646472657373000000000000000000000000000000000000000060648201526084016200033b565b6001600160a01b0382166000908152600b60205260409020541562000586576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201527f206861732073686172657300000000000000000000000000000000000000000060648201526084016200033b565b600d8054600181019091557fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319166001600160a01b0384169081179091556000908152600b60205260409020819055600954620005f090829062000a57565b600955604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b601280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b038216811015620006e5576040517f6f483d090000000000000000000000000000000000000000000000000000000081526001600160601b0383166004820152602481018290526044016200033b565b6001600160a01b0383166200072a576040517fb6d9900a000000000000000000000000000000000000000000000000000000008152600060048201526024016200033b565b50604080518082019091526001600160a01b039092168083526001600160601b0390911660209092018290527401000000000000000000000000000000000000000090910217601055565b828054828255906000526020600020908101928215620007cd579160200282015b82811115620007cd57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000796565b50620007db92915062000823565b5090565b828054828255906000526020600020908101928215620007cd579160200282015b82811115620007cd578251829061ffff1690559160200191906001019062000800565b5b80821115620007db576000815560010162000824565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600181811c908216806200087e57607f821691505b602082108103620008b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f8211156200090c57600081815260208120601f850160051c81016020861015620008e75750805b601f850160051c820191505b818110156200090857828155600101620008f3565b5050505b505050565b81516001600160401b038111156200092d576200092d6200083a565b62000945816200093e845462000869565b84620008be565b602080601f8311600181146200097d5760008415620009645750858301515b600019600386901b1c1916600185901b17855562000908565b600085815260208120601f198616915b82811015620009ae578886015182559484019460019091019084016200098d565b5085821015620009cd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006001820162000a505762000a5062000a0c565b5060010190565b8082018082111562000a6d5762000a6d62000a0c565b92915050565b6141198062000a836000396000f3fe60806040526004361061036f5760003560e01c80636352211e116101c6578063a3f8eace116100f7578063d5abeb0111610095578063e33b7de31161006f578063e33b7de314610abb578063e985e9c514610ad0578063f2fde38b14610b19578063f851a44014610b3957600080fd5b8063d5abeb0114610a49578063d79779b214610a65578063dbe7e3bd14610a9b57600080fd5b8063c45ac050116100d1578063c45ac050146109b2578063c793803c146109d2578063c87b56dd146109f3578063ce7c2ac214610a1357600080fd5b8063a3f8eace1461095f578063af42d1061461097f578063b88d4fde1461099f57600080fd5b80638b83209b116101645780639852595c1161013e5780639852595c146108c957806398fa6c45146108ff5780639ad3f2be1461091f578063a22cb4651461093f57600080fd5b80638b83209b146108765780638da5cb5b1461089657806395d89b41146108b457600080fd5b8063704b6c02116101a0578063704b6c021461080157806370a0823114610821578063715018a614610841578063865dfcd91461085657600080fd5b80636352211e1461079f57806368df37f9146107bf5780636c0360eb146107ec57600080fd5b80632a55205a116102a057806355f804b31161023e5780635c975abb116102185780635c975abb146107015780635f63d54b14610722578063619282611461074f5780636279d38e1461077f57600080fd5b806355f804b3146106a15780635634c592146106c15780635751e145146106e157600080fd5b8063406072a91161027a578063406072a91461060857806342842e0e1461064e57806344a0d68a1461066157806348b750441461068157600080fd5b80632a55205a1461059f5780632e343d2d146105de5780633a98ef39146105f357600080fd5b806313faede61161030d57806318160ddd116102e757806318160ddd1461050e578063191655871461052757806323b872dd1461054757806327db591e1461055a57600080fd5b806313faede6146104a957806315d122ed146104ce57806316c38b3c146104ee57600080fd5b8063081812fc11610349578063081812fc14610436578063095ea7b31461046e57806311d4bc9a1461048157806313e54aef1461049657600080fd5b806301ffc9a7146103bd57806304634d8d146103f257806306fdde031461041457600080fd5b366103b8577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156103c957600080fd5b506103dd6103d8366004613407565b610b5a565b60405190151581526020015b60405180910390f35b3480156103fe57600080fd5b5061041261040d366004613439565b610b6b565b005b34801561042057600080fd5b50610429610bc2565b6040516103e991906134ce565b34801561044257600080fd5b506104566104513660046134e1565b610c54565b6040516001600160a01b0390911681526020016103e9565b61041261047c3660046134fa565b610c98565b34801561048d57600080fd5b50610412610d38565b6104126104a4366004613622565b610d8d565b3480156104b557600080fd5b506104c0610c935481565b6040519081526020016103e9565b3480156104da57600080fd5b506104126104e9366004613714565b6115b1565b3480156104fa57600080fd5b506104126105093660046137d1565b611689565b34801561051a57600080fd5b50600154600054036104c0565b34801561053357600080fd5b506104126105423660046137ee565b6116e7565b61041261055536600461380b565b6117ce565b34801561056657600080fd5b5061058c6105753660046137ee565b610c946020526000908152604090205461ffff1681565b60405161ffff90911681526020016103e9565b3480156105ab57600080fd5b506105bf6105ba36600461384c565b611967565b604080516001600160a01b0390931683526020830191909152016103e9565b3480156105ea57600080fd5b5061058c611a15565b3480156105ff57600080fd5b506009546104c0565b34801561061457600080fd5b506104c061062336600461386e565b6001600160a01b039182166000908152600f6020908152604080832093909416825291909152205490565b61041261065c36600461380b565b611bae565b34801561066d57600080fd5b5061041261067c3660046134e1565b611bc9565b34801561068d57600080fd5b5061041261069c36600461386e565b611c0f565b3480156106ad57600080fd5b506104126106bc36600461389c565b611d20565b3480156106cd57600080fd5b506104126106dc3660046134fa565b611dc0565b3480156106ed57600080fd5b5061058c6106fc36600461384c565b611e0a565b34801561070d57600080fd5b506012546103dd90600160a01b900460ff1681565b34801561072e57600080fd5b5061074261073d3660046138d0565b611e4e565b6040516103e991906138eb565b34801561075b57600080fd5b5061076f61076a3660046138d0565b611f98565b6040516103e99493929190613939565b34801561078b57600080fd5b5061041261079a36600461397c565b612268565b3480156107ab57600080fd5b506104566107ba3660046134e1565b612326565b3480156107cb57600080fd5b506107df6107da3660046138d0565b612331565b6040516103e99190613a3f565b3480156107f857600080fd5b506104296123ca565b34801561080d57600080fd5b5061041261081c3660046137ee565b612459565b34801561082d57600080fd5b506104c061083c3660046137ee565b612484565b34801561084d57600080fd5b506104126124d2565b34801561086257600080fd5b5061042961087136600461384c565b6124e6565b34801561088257600080fd5b506104566108913660046134e1565b612519565b3480156108a257600080fd5b506012546001600160a01b0316610456565b3480156108c057600080fd5b50610429612549565b3480156108d557600080fd5b506104c06108e43660046137ee565b6001600160a01b03166000908152600c602052604090205490565b34801561090b57600080fd5b5061041261091a3660046138d0565b612558565b34801561092b57600080fd5b5061041261093a366004613ab9565b6126a8565b34801561094b57600080fd5b5061041261095a366004613b24565b6127f3565b34801561096b57600080fd5b506104c061097a3660046137ee565b61285f565b34801561098b57600080fd5b5061041261099a366004613b52565b6128a8565b6104126109ad366004613bc3565b6128f6565b3480156109be57600080fd5b506104c06109cd36600461386e565b612940565b3480156109de57600080fd5b506012546103dd90600160a81b900460ff1681565b3480156109ff57600080fd5b50610429610a0e3660046134e1565b612a0b565b348015610a1f57600080fd5b506104c0610a2e3660046137ee565b6001600160a01b03166000908152600b602052604090205490565b348015610a5557600080fd5b5061014e5461058c9061ffff1681565b348015610a7157600080fd5b506104c0610a803660046137ee565b6001600160a01b03166000908152600e602052604090205490565b348015610aa757600080fd5b506103dd610ab63660046134e1565b612a8e565b348015610ac757600080fd5b50600a546104c0565b348015610adc57600080fd5b506103dd610aeb36600461386e565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610b2557600080fd5b50610412610b343660046137ee565b612ab9565b348015610b4557600080fd5b50610c9754610456906001600160a01b031681565b6000610b6582612af7565b92915050565b6012546001600160a01b0316331480610b8f5750610c97546001600160a01b031633145b610bb45760405162461bcd60e51b8152600401610bab90613c42565b60405180910390fd5b610bbe8282612b2c565b5050565b606060028054610bd190613c79565b80601f0160208091040260200160405190810160405280929190818152602001828054610bfd90613c79565b8015610c4a5780601f10610c1f57610100808354040283529160200191610c4a565b820191906000526020600020905b815481529060010190602001808311610c2d57829003601f168201915b5050505050905090565b6000610c5f82612bcf565b610c7c576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610ca382612326565b9050336001600160a01b03821614610cdc57610cbf8133610aeb565b610cdc576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6012546001600160a01b0316331480610d5c5750610c97546001600160a01b031633145b610d785760405162461bcd60e51b8152600401610bab90613c42565b6012805460ff60a81b1916600160a81b179055565b610d95612bf6565b6000610d9f61338c565b6000610e368461014c8054610db390613c79565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddf90613c79565b8015610e2c5780601f10610e0157610100808354040283529160200191610e2c565b820191906000526020600020905b815481529060010190602001808311610e0f57829003601f168201915b5050505050612c20565b610e905760405162461bcd60e51b815260206004820152602560248201527f4275696c6465723a20706c65617365206d696e74207669612077656273697465604482015264206f6e6c7960d81b6064820152608401610bab565b61014e5461ffff16610ea56001546000540390565b610eb0906001613cc3565b1115610f0f5760405162461bcd60e51b815260206004820152602860248201527f4275696c6465723a2043616e2774206d696e74206d6f7265207468616e206d616044820152677820737570706c7960c01b6064820152608401610bab565b6127108661ffff1610610f645760405162461bcd60e51b815260206004820152601c60248201527f4275696c6465723a20746865726520617265206f6e6c792039393939000000006044820152606401610bab565b60138661ffff166127108110610f7c57610f7c613cd6565b602081049091015460ff601f9092166101000a90041615610fdf5760405162461bcd60e51b815260206004820181905260248201527f4275696c6465723a20616c7265616479206d696e7465642074686174206f6e656044820152606401610bab565b6012546001600160a01b0316331461104b57601254600160a01b900460ff161561104b5760405162461bcd60e51b815260206004820181905260248201527f4275696c6465723a206d696e74696e67206973206e6f74206f70656e207965746044820152606401610bab565b336000908152610c94602052604090205461ffff16156110a957336000908152610c946020526040812080546001929061108a90849061ffff16613cec565b92506101000a81548161ffff021916908361ffff160217905550611118565b6012546001600160a01b0316331461111857610c93543410156111185760405162461bcd60e51b815260206004820152602160248201527f4275696c6465723a20596f75206d7573742070617920666f7220746865206e666044820152601d60fa1b6064820152608401610bab565b600092505b60788361ffff16101561117a57845161115b9061016760005b607802018561ffff166078811061114f5761114f613cd6565b018054610db390613c79565b1561116f575061ffff82168152600161117a565b60018301925061111d565b806111d35760405162461bcd60e51b815260206004820152602360248201527f4275696c6465723a2063616e6e6f742066696e642072657175657374656420626044820152626f647960e81b6064820152608401610bab565b5060009150815b60788361ffff16101561121c5760208501516111fa906101676001611136565b15611211575061ffff82166020820152600161121c565b6001830192506111da565b8061127a5760405162461bcd60e51b815260206004820152602860248201527f4275696c6465723a2063616e6e6f742066696e6420726571756573746564206160448201526763636573736f727960c01b6064820152608401610bab565b5060009150815b60788361ffff1610156112c35760408501516112a1906101676002611136565b156112b8575061ffff8216604082015260016112c3565b600183019250611281565b8061131e5760405162461bcd60e51b815260206004820152602560248201527f4275696c6465723a2063616e6e6f742066696e642072657175657374656420626044820152646f74746f6d60d81b6064820152608401610bab565b856102cf61132f6001546000540390565b612710811061134057611340613cd6565b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550600160138761ffff16612710811061137f5761137f613cd6565b602091828204019190066101000a81548160ff021916908315150217905550600092505b60038361ffff1610156115945761ffff83161561150b57600061014f8461ffff16600381106113d4576113d4613cd6565b60080201838561ffff16600381106113ee576113ee613cd6565b602002015161ffff166078811061140757611407613cd6565b601091828204019190066002029054906101000a900461ffff1661ffff16116114855760405162461bcd60e51b815260206004820152602a60248201527f4275696c6465723a2074686174207472616974206973206e6f206c6f6e67657260448201526920617661696c61626c6560b01b6064820152608401610bab565b600161014f8461ffff166003811061149f5761149f613cd6565b60080201838561ffff16600381106114b9576114b9613cd6565b602002015161ffff16607881106114d2576114d2613cd6565b601091828204019190066002028282829054906101000a900461ffff160392506101000a81548161ffff021916908361ffff1602179055505b818361ffff166003811061152157611521613cd6565b60200201516102cf8460010161ffff166004811061154157611541613cd6565b61027102016115536001546000540390565b612710811061156457611564613cd6565b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506001830192506113a3565b61159f336001612c79565b5050506115ac6001600855565b505050565b6012546001600160a01b03163314806115d55750610c97546001600160a01b031633145b6115f15760405162461bcd60e51b8152600401610bab90613c42565b60005b81518161ffff1610156115ac57818161ffff168151811061161757611617613cd6565b602002602001015161014f8461ffff166003811061163757611637613cd6565b600802018261ffff166078811061165057611650613cd6565b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506001816116829190613d07565b90506115f4565b6012546001600160a01b03163314806116ad5750610c97546001600160a01b031633145b6116c95760405162461bcd60e51b8152600401610bab90613c42565b60128054911515600160a01b0260ff60a01b19909216919091179055565b6001600160a01b0381166000908152600b602052604090205461171c5760405162461bcd60e51b8152600401610bab90613d22565b60006117278261285f565b9050806000036117495760405162461bcd60e51b8152600401610bab90613d68565b80600a600082825461175b9190613cc3565b90915550506001600160a01b0382166000908152600c602052604090208054820190556117888282612c93565b604080516001600160a01b0384168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15050565b60006117d982612d2b565b9050836001600160a01b0316816001600160a01b03161461180c5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b038816909114176118595761183c8633610aeb565b61185957604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661188057604051633a954ecd60e21b815260040160405180910390fd5b801561188b57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b8416900361191d5760018401600081815260046020526040812054900361191b57600054811461191b5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b60008281526011602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916119dc5750604080518082019091526010546001600160a01b0381168252600160a01b90046001600160601b031660208201525b6020810151600090612710906119fb906001600160601b031687613db3565b611a059190613de0565b91519350909150505b9250929050565b60008060008061270f42604051602001611a3191815260200190565b6040516020818303038152906040528051906020012060001c611a549190613df4565b90506127068161ffff161180611a6e5750600a8161ffff16105b15611a7857506113885b8091505b6127108261ffff161015611adc5760138261ffff166127108110611aa257611aa2613cd6565b602081049091015460ff601f9092166101000a9004161515600003611aca5760019250611adc565b611ad5600183613d07565b9150611a7c565b821515600003611b46578091505b61ffff821615611b465760138261ffff166127108110611b0c57611b0c613cd6565b602081049091015460ff601f9092166101000a9004161515600003611b345760019250611b46565b611b3f600183613cec565b9150611aea565b600183151514611ba75760405162461bcd60e51b815260206004820152602660248201527f4275696c6465723a2063616e27742066696e6420617661696c61626c65206d6f6044820152651bdb989a5c9960d21b6064820152608401610bab565b5092915050565b6115ac838383604051806020016040528060008152506128f6565b6012546001600160a01b0316331480611bed5750610c97546001600160a01b031633145b611c095760405162461bcd60e51b8152600401610bab90613c42565b610c9355565b6001600160a01b0381166000908152600b6020526040902054611c445760405162461bcd60e51b8152600401610bab90613d22565b6000611c508383612940565b905080600003611c725760405162461bcd60e51b8152600401610bab90613d68565b6001600160a01b0383166000908152600e602052604081208054839290611c9a908490613cc3565b90915550506001600160a01b038084166000908152600f60209081526040808320938616835292905220805482019055611cd5838383612d92565b604080516001600160a01b038481168252602082018490528516917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a2505050565b6012546001600160a01b0316331480611d445750610c97546001600160a01b031633145b611d605760405162461bcd60e51b8152600401610bab90613c42565b601254600160a81b900460ff1615611db35760405162461bcd60e51b8152602060048201526016602482015275213ab4b63232b91d103ab9349034b990333937bd32b760511b6044820152606401610bab565b61014d610bbe8282613e4e565b6012546001600160a01b0316331480611de45750610c97546001600160a01b031633145b611e005760405162461bcd60e51b8152600401610bab90613c42565b610bbe8282612de4565b61014f8260038110611e1b57600080fd5b600802018160788110611e2d57600080fd5b60109182820401919006600202915091509054906101000a900461ffff1681565b611e566133aa565b60005b60788161ffff161015611f92576101678361ffff1660038110611e7e57611e7e613cd6565b607802018161ffff1660788110611e9757611e97613cd6565b018054611ea390613c79565b159050611f92576101678361ffff1660038110611ec257611ec2613cd6565b607802018161ffff1660788110611edb57611edb613cd6565b018054611ee790613c79565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1390613c79565b8015611f605780601f10611f3557610100808354040283529160200191611f60565b820191906000526020600020905b815481529060010190602001808311611f4357829003601f168201915b5050505050828261ffff1660788110611f7b57611f7b613cd6565b6020020152611f8b600182613d07565b9050611e59565b50919050565b6000606080806102cf61ffff86166127108110611fb757611fb7613cd6565b601081049190910154600f9091166002026101000a900461ffff90811690610167906105409088166127108110611ff057611ff0613cd6565b601091828204019190066002029054906101000a900461ffff1661ffff166078811061201e5761201e613cd6565b016101df6107b161ffff8916612710811061203b5761203b613cd6565b601091828204019190066002029054906101000a900461ffff1661ffff166078811061206957612069613cd6565b01610257610a2261ffff8a16612710811061208657612086613cd6565b601091828204019190066002029054906101000a900461ffff1661ffff16607881106120b4576120b4613cd6565b018280546120c190613c79565b80601f01602080910402602001604051908101604052809291908181526020018280546120ed90613c79565b801561213a5780601f1061210f5761010080835404028352916020019161213a565b820191906000526020600020905b81548152906001019060200180831161211d57829003601f168201915b5050505050925081805461214d90613c79565b80601f016020809104026020016040519081016040528092919081815260200182805461217990613c79565b80156121c65780601f1061219b576101008083540402835291602001916121c6565b820191906000526020600020905b8154815290600101906020018083116121a957829003601f168201915b505050505091508080546121d990613c79565b80601f016020809104026020016040519081016040528092919081815260200182805461220590613c79565b80156122525780601f1061222757610100808354040283529160200191612252565b820191906000526020600020905b81548152906001019060200180831161223557829003601f168201915b5050505050905093509350935093509193509193565b6012546001600160a01b031633148061228c5750610c97546001600160a01b031633145b6122a85760405162461bcd60e51b8152600401610bab90613c42565b60005b81518161ffff1610156115ac57818161ffff16815181106122ce576122ce613cd6565b60200260200101516101678461ffff16600381106122ee576122ee613cd6565b607802018261ffff166078811061230757612307613cd6565b01906123139082613e4e565b5061231f600182613d07565b90506122ab565b6000610b6582612d2b565b6123396133d2565b60005b60788161ffff161015611f925761014f8361ffff166003811061236157612361613cd6565b600802018161ffff166078811061237a5761237a613cd6565b601091828204019190066002029054906101000a900461ffff16828261ffff16607881106123aa576123aa613cd6565b61ffff90921660209290920201526123c3600182613d07565b905061233c565b61014d80546123d890613c79565b80601f016020809104026020016040519081016040528092919081815260200182805461240490613c79565b80156124515780601f1061242657610100808354040283529160200191612451565b820191906000526020600020905b81548152906001019060200180831161243457829003601f168201915b505050505081565b612461612e90565b610c9780546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166124ad576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6124da612e90565b6124e46000612ebd565b565b61016782600381106124f757600080fd5b60780201816078811061250957600080fd5b0180549092506123d89150613c79565b6000600d828154811061252e5761252e613cd6565b6000918252602090912001546001600160a01b031692915050565b606060038054610bd190613c79565b6012546001600160a01b031633148061257c5750610c97546001600160a01b031633145b6125985760405162461bcd60e51b8152600401610bab90613c42565b61014e5461ffff908116908216106126185760405162461bcd60e51b815260206004820152603760248201527f4275696c6465723a204e6577206d6178696d756d206d757374206265206c657360448201527f73207468616e206578697374696e67206d6178696d756d0000000000000000006064820152608401610bab565b600154600054038161ffff16101561268f5760405162461bcd60e51b815260206004820152603460248201527f4275696c6465723a204e6577206d6178696d756d2063616e2774206265206c656044820152731cdcc81d1a185b881b5a5b9d19590818dbdd5b9d60621b6064820152608401610bab565b61014e805461ffff191661ffff92909216919091179055565b6012546001600160a01b03163314806126cc5750610c97546001600160a01b031633145b6126e85760405162461bcd60e51b8152600401610bab90613c42565b82811461274f5760405162461bcd60e51b815260206004820152602f60248201527f4275696c6465723a20636f756e74206f662077616c6c657420616e642071756160448201526e0dce8d2e8f240dcdee840dac2e8c6d608b1b6064820152608401610bab565b60005b838110156127ec5782828281811061276c5761276c613cd6565b905060200201602081019061278191906138d0565b610c94600087878581811061279857612798613cd6565b90506020020160208101906127ad91906137ee565b6001600160a01b031681526020810191909152604001600020805461ffff191661ffff92909216919091179055806127e481613f0d565b915050612752565b5050505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60008061286b600a5490565b612876903031613cc3565b90506128a1838261289c866001600160a01b03166000908152600c602052604090205490565b612f0f565b9392505050565b6012546001600160a01b03163314806128cc5750610c97546001600160a01b031633145b6128e85760405162461bcd60e51b8152600401610bab90613c42565b61014c6115ac828483613f26565b6129018484846117ce565b6001600160a01b0383163b1561293a5761291d84848484612f4d565b61293a576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6001600160a01b0382166000908152600e602052604081205481906040516370a0823160e01b81523060048201526001600160a01b038616906370a0823190602401602060405180830381865afa15801561299f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c39190613fe5565b6129cd9190613cc3565b6001600160a01b038086166000908152600f6020908152604080832093881683529290522054909150612a039084908390612f0f565b949350505050565b6060612a1682612bcf565b612a3357604051630a14c4b560e41b815260040160405180910390fd5b6000612a3d613038565b90508051600003612a5d57604051806020016040528060008152506128a1565b80612a6784613048565b604051602001612a78929190613ffe565b6040516020818303038152906040529392505050565b6013816127108110612a9f57600080fd5b60209182820401919006915054906101000a900460ff1681565b612ac1612e90565b6001600160a01b038116612aeb57604051631e4fbdf760e01b815260006004820152602401610bab565b612af481612ebd565b50565b60006001600160e01b0319821663152a902d60e11b1480610b6557506301ffc9a760e01b6001600160e01b0319831614610b65565b6127106001600160601b038216811015612b6b57604051636f483d0960e01b81526001600160601b038316600482015260248101829052604401610bab565b6001600160a01b038316612b9557604051635b6cc80560e11b815260006004820152602401610bab565b50604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217601055565b6000805482108015610b65575050600090815260046020526040902054600160e01b161590565b600260085403612c1957604051633ee5aeb560e01b815260040160405180910390fd5b6002600855565b600081604051602001612c33919061403d565b6040516020818303038152906040528051906020012083604051602001612c5a919061403d565b6040516020818303038152906040528051906020012014905092915050565b610bbe82826040518060200160405280600081525061308c565b3031811115612cb75760405163cd78605960e01b8152306004820152602401610bab565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612d04576040519150601f19603f3d011682016040523d82523d6000602084013e612d09565b606091505b50509050806115ac57604051630a12f52160e11b815260040160405180910390fd5b600081600054811015612d795760008181526004602052604081205490600160e01b82169003612d77575b806000036128a1575060001901600081815260046020526040902054612d56565b505b604051636f96cda160e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526115ac9084906130f2565b6001600160a01b0382166000908152600b6020526040902054600954612e0b908390613cc3565b612e159190614059565b6009819055612e745760405162461bcd60e51b815260206004820152602560248201527f5061796d656e7453706c69747465723a2063616e6e6f74206861766520302073604482015264686172657360d81b6064820152608401610bab565b6001600160a01b039091166000908152600b6020526040902055565b6012546001600160a01b031633146124e45760405163118cdaa760e01b8152336004820152602401610bab565b601280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6009546001600160a01b0384166000908152600b602052604081205490918391612f399086613db3565b612f439190613de0565b612a039190614059565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612f8290339089908890889060040161406c565b6020604051808303816000875af1925050508015612fbd575060408051601f3d908101601f19168201909252612fba918101906140a9565b60015b61301b573d808015612feb576040519150601f19603f3d011682016040523d82523d6000602084013e612ff0565b606091505b508051600003613013576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b606061014d8054610bd190613c79565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806130625750819003601f19909101908152919050565b6130968383613155565b6001600160a01b0383163b156115ac576000548281035b6130c06000868380600101945086612f4d565b6130dd576040516368d2bf6b60e11b815260040160405180910390fd5b8181106130ad5781600054146127ec57600080fd5b60006131076001600160a01b03841683613253565b9050805160001415801561312c57508080602001905181019061312a91906140c6565b155b156115ac57604051635274afe760e01b81526001600160a01b0384166004820152602401610bab565b600080549082900361317a5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461322957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001016131f1565b508160000361324a57604051622e076360e81b815260040160405180910390fd5b60005550505050565b60606128a18383600061326461327d565b604051630a12f52160e11b815260040160405180910390fd5b606030318311156132a35760405163cd78605960e01b8152306004820152602401610bab565b600080866001600160a01b031685876040516132bf919061403d565b60006040518083038185875af1925050503d80600081146132fc576040519150601f19603f3d011682016040523d82523d6000602084013e613301565b606091505b50915091506133128783838761331d565b979650505050505050565b6060831561336b57825160000361336457846001600160a01b03163b60000361336457604051639996b31560e01b81526001600160a01b0386166004820152602401610bab565b5081612a03565b612a0383838151156133805781518083602001fd5b6132648163ffffffff16565b60405180606001604052806003906020820280368337509192915050565b60405180610f0001604052806078905b60608152602001906001900390816133ba5790505090565b60405180610f0001604052806078906020820280368337509192915050565b6001600160e01b031981168114612af457600080fd5b60006020828403121561341957600080fd5b81356128a1816133f1565b6001600160a01b0381168114612af457600080fd5b6000806040838503121561344c57600080fd5b823561345781613424565b915060208301356001600160601b038116811461347357600080fd5b809150509250929050565b60005b83811015613499578181015183820152602001613481565b50506000910152565b600081518084526134ba81602086016020860161347e565b601f01601f19169290920160200192915050565b6020815260006128a160208301846134a2565b6000602082840312156134f357600080fd5b5035919050565b6000806040838503121561350d57600080fd5b823561351881613424565b946020939093013593505050565b803561ffff8116811461353857600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156135755761357561353d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156135a3576135a361353d565b604052919050565b60006001600160401b038311156135c4576135c461353d565b6135d7601f8401601f191660200161357b565b90508281528383830111156135eb57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261361357600080fd5b6128a1838335602085016135ab565b60008060006060848603121561363757600080fd5b61364084613526565b92506020808501356001600160401b038082111561365d57600080fd5b818701915087601f83011261367157600080fd5b613679613553565b80606084018a81111561368b57600080fd5b845b818110156136bf578035858111156136a55760008081fd5b6136b18d828901613602565b85525092860192860161368d565b50909650505060408701359250808311156136d957600080fd5b50506136e786828701613602565b9150509250925092565b60006001600160401b0382111561370a5761370a61353d565b5060051b60200190565b6000806040838503121561372757600080fd5b61373083613526565b91506020808401356001600160401b0381111561374c57600080fd5b8401601f8101861361375d57600080fd5b803561377061376b826136f1565b61357b565b81815260059190911b8201830190838101908883111561378f57600080fd5b928401925b828410156137b4576137a584613526565b82529284019290840190613794565b80955050505050509250929050565b8015158114612af457600080fd5b6000602082840312156137e357600080fd5b81356128a1816137c3565b60006020828403121561380057600080fd5b81356128a181613424565b60008060006060848603121561382057600080fd5b833561382b81613424565b9250602084013561383b81613424565b929592945050506040919091013590565b6000806040838503121561385f57600080fd5b50508035926020909101359150565b6000806040838503121561388157600080fd5b823561388c81613424565b9150602083013561347381613424565b6000602082840312156138ae57600080fd5b81356001600160401b038111156138c457600080fd5b612a0384828501613602565b6000602082840312156138e257600080fd5b6128a182613526565b6020808252600090610f20830183820185845b607881101561392d57601f1987850301835261391b8483516134a2565b935091840191908401906001016138fe565b50919695505050505050565b61ffff8516815260806020820152600061395660808301866134a2565b828103604084015261396881866134a2565b9050828103606084015261331281856134a2565b6000806040838503121561398f57600080fd5b61399883613526565b91506020808401356001600160401b03808211156139b557600080fd5b818601915086601f8301126139c957600080fd5b81356139d761376b826136f1565b81815260059190911b830184019084810190898311156139f657600080fd5b8585015b83811015613a2e57803585811115613a125760008081fd5b613a208c89838a0101613602565b8452509186019186016139fa565b508096505050505050509250929050565b610f008101818360005b6078811015613a6c57815161ffff16835260209283019290910190600101613a49565b50505092915050565b60008083601f840112613a8757600080fd5b5081356001600160401b03811115613a9e57600080fd5b6020830191508360208260051b8501011115611a0e57600080fd5b60008060008060408587031215613acf57600080fd5b84356001600160401b0380821115613ae657600080fd5b613af288838901613a75565b90965094506020870135915080821115613b0b57600080fd5b50613b1887828801613a75565b95989497509550505050565b60008060408385031215613b3757600080fd5b8235613b4281613424565b91506020830135613473816137c3565b60008060208385031215613b6557600080fd5b82356001600160401b0380821115613b7c57600080fd5b818501915085601f830112613b9057600080fd5b813581811115613b9f57600080fd5b866020828501011115613bb157600080fd5b60209290920196919550909350505050565b60008060008060808587031215613bd957600080fd5b8435613be481613424565b93506020850135613bf481613424565b92506040850135915060608501356001600160401b03811115613c1657600080fd5b8501601f81018713613c2757600080fd5b613c36878235602084016135ab565b91505092959194509250565b60208082526017908201527f4275696c6465723a206f6e6c7920666f72206f776e6572000000000000000000604082015260600190565b600181811c90821680613c8d57607f821691505b602082108103611f9257634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115610b6557610b65613cad565b634e487b7160e01b600052603260045260246000fd5b61ffff828116828216039080821115611ba757611ba7613cad565b61ffff818116838216019080821115611ba757611ba7613cad565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b8082028115828204841417610b6557610b65613cad565b634e487b7160e01b600052601260045260246000fd5b600082613def57613def613dca565b500490565b600082613e0357613e03613dca565b500690565b601f8211156115ac57600081815260208120601f850160051c81016020861015613e2f5750805b601f850160051c820191505b8181101561195f57828155600101613e3b565b81516001600160401b03811115613e6757613e6761353d565b613e7b81613e758454613c79565b84613e08565b602080601f831160018114613eb05760008415613e985750858301515b600019600386901b1c1916600185901b17855561195f565b600085815260208120601f198616915b82811015613edf57888601518255948401946001909101908401613ec0565b5085821015613efd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201613f1f57613f1f613cad565b5060010190565b6001600160401b03831115613f3d57613f3d61353d565b613f5183613f4b8354613c79565b83613e08565b6000601f841160018114613f855760008515613f6d5750838201355b600019600387901b1c1916600186901b1783556127ec565b600083815260209020601f19861690835b82811015613fb65786850135825560209485019460019092019101613f96565b5086821015613fd35760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600060208284031215613ff757600080fd5b5051919050565b6000835161401081846020880161347e565b83519083019061402481836020880161347e565b64173539b7b760d91b9101908152600501949350505050565b6000825161404f81846020870161347e565b9190910192915050565b81810381811115610b6557610b65613cad565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061409f908301846134a2565b9695505050505050565b6000602082840312156140bb57600080fd5b81516128a1816133f1565b6000602082840312156140d857600080fd5b81516128a1816137c356fea2646970667358221220836f8df98d8915a30fcd9b324c934ba3dadb22b881e7fbbc5b919c37254ce77f64736f6c6343000814003368747470733a2f2f6d696e742d6a736f6e2d6275636b65742e73332e616d617a6f6e6177732e636f6d2f
Deployed Bytecode
0x60806040526004361061036f5760003560e01c80636352211e116101c6578063a3f8eace116100f7578063d5abeb0111610095578063e33b7de31161006f578063e33b7de314610abb578063e985e9c514610ad0578063f2fde38b14610b19578063f851a44014610b3957600080fd5b8063d5abeb0114610a49578063d79779b214610a65578063dbe7e3bd14610a9b57600080fd5b8063c45ac050116100d1578063c45ac050146109b2578063c793803c146109d2578063c87b56dd146109f3578063ce7c2ac214610a1357600080fd5b8063a3f8eace1461095f578063af42d1061461097f578063b88d4fde1461099f57600080fd5b80638b83209b116101645780639852595c1161013e5780639852595c146108c957806398fa6c45146108ff5780639ad3f2be1461091f578063a22cb4651461093f57600080fd5b80638b83209b146108765780638da5cb5b1461089657806395d89b41146108b457600080fd5b8063704b6c02116101a0578063704b6c021461080157806370a0823114610821578063715018a614610841578063865dfcd91461085657600080fd5b80636352211e1461079f57806368df37f9146107bf5780636c0360eb146107ec57600080fd5b80632a55205a116102a057806355f804b31161023e5780635c975abb116102185780635c975abb146107015780635f63d54b14610722578063619282611461074f5780636279d38e1461077f57600080fd5b806355f804b3146106a15780635634c592146106c15780635751e145146106e157600080fd5b8063406072a91161027a578063406072a91461060857806342842e0e1461064e57806344a0d68a1461066157806348b750441461068157600080fd5b80632a55205a1461059f5780632e343d2d146105de5780633a98ef39146105f357600080fd5b806313faede61161030d57806318160ddd116102e757806318160ddd1461050e578063191655871461052757806323b872dd1461054757806327db591e1461055a57600080fd5b806313faede6146104a957806315d122ed146104ce57806316c38b3c146104ee57600080fd5b8063081812fc11610349578063081812fc14610436578063095ea7b31461046e57806311d4bc9a1461048157806313e54aef1461049657600080fd5b806301ffc9a7146103bd57806304634d8d146103f257806306fdde031461041457600080fd5b366103b8577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156103c957600080fd5b506103dd6103d8366004613407565b610b5a565b60405190151581526020015b60405180910390f35b3480156103fe57600080fd5b5061041261040d366004613439565b610b6b565b005b34801561042057600080fd5b50610429610bc2565b6040516103e991906134ce565b34801561044257600080fd5b506104566104513660046134e1565b610c54565b6040516001600160a01b0390911681526020016103e9565b61041261047c3660046134fa565b610c98565b34801561048d57600080fd5b50610412610d38565b6104126104a4366004613622565b610d8d565b3480156104b557600080fd5b506104c0610c935481565b6040519081526020016103e9565b3480156104da57600080fd5b506104126104e9366004613714565b6115b1565b3480156104fa57600080fd5b506104126105093660046137d1565b611689565b34801561051a57600080fd5b50600154600054036104c0565b34801561053357600080fd5b506104126105423660046137ee565b6116e7565b61041261055536600461380b565b6117ce565b34801561056657600080fd5b5061058c6105753660046137ee565b610c946020526000908152604090205461ffff1681565b60405161ffff90911681526020016103e9565b3480156105ab57600080fd5b506105bf6105ba36600461384c565b611967565b604080516001600160a01b0390931683526020830191909152016103e9565b3480156105ea57600080fd5b5061058c611a15565b3480156105ff57600080fd5b506009546104c0565b34801561061457600080fd5b506104c061062336600461386e565b6001600160a01b039182166000908152600f6020908152604080832093909416825291909152205490565b61041261065c36600461380b565b611bae565b34801561066d57600080fd5b5061041261067c3660046134e1565b611bc9565b34801561068d57600080fd5b5061041261069c36600461386e565b611c0f565b3480156106ad57600080fd5b506104126106bc36600461389c565b611d20565b3480156106cd57600080fd5b506104126106dc3660046134fa565b611dc0565b3480156106ed57600080fd5b5061058c6106fc36600461384c565b611e0a565b34801561070d57600080fd5b506012546103dd90600160a01b900460ff1681565b34801561072e57600080fd5b5061074261073d3660046138d0565b611e4e565b6040516103e991906138eb565b34801561075b57600080fd5b5061076f61076a3660046138d0565b611f98565b6040516103e99493929190613939565b34801561078b57600080fd5b5061041261079a36600461397c565b612268565b3480156107ab57600080fd5b506104566107ba3660046134e1565b612326565b3480156107cb57600080fd5b506107df6107da3660046138d0565b612331565b6040516103e99190613a3f565b3480156107f857600080fd5b506104296123ca565b34801561080d57600080fd5b5061041261081c3660046137ee565b612459565b34801561082d57600080fd5b506104c061083c3660046137ee565b612484565b34801561084d57600080fd5b506104126124d2565b34801561086257600080fd5b5061042961087136600461384c565b6124e6565b34801561088257600080fd5b506104566108913660046134e1565b612519565b3480156108a257600080fd5b506012546001600160a01b0316610456565b3480156108c057600080fd5b50610429612549565b3480156108d557600080fd5b506104c06108e43660046137ee565b6001600160a01b03166000908152600c602052604090205490565b34801561090b57600080fd5b5061041261091a3660046138d0565b612558565b34801561092b57600080fd5b5061041261093a366004613ab9565b6126a8565b34801561094b57600080fd5b5061041261095a366004613b24565b6127f3565b34801561096b57600080fd5b506104c061097a3660046137ee565b61285f565b34801561098b57600080fd5b5061041261099a366004613b52565b6128a8565b6104126109ad366004613bc3565b6128f6565b3480156109be57600080fd5b506104c06109cd36600461386e565b612940565b3480156109de57600080fd5b506012546103dd90600160a81b900460ff1681565b3480156109ff57600080fd5b50610429610a0e3660046134e1565b612a0b565b348015610a1f57600080fd5b506104c0610a2e3660046137ee565b6001600160a01b03166000908152600b602052604090205490565b348015610a5557600080fd5b5061014e5461058c9061ffff1681565b348015610a7157600080fd5b506104c0610a803660046137ee565b6001600160a01b03166000908152600e602052604090205490565b348015610aa757600080fd5b506103dd610ab63660046134e1565b612a8e565b348015610ac757600080fd5b50600a546104c0565b348015610adc57600080fd5b506103dd610aeb36600461386e565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610b2557600080fd5b50610412610b343660046137ee565b612ab9565b348015610b4557600080fd5b50610c9754610456906001600160a01b031681565b6000610b6582612af7565b92915050565b6012546001600160a01b0316331480610b8f5750610c97546001600160a01b031633145b610bb45760405162461bcd60e51b8152600401610bab90613c42565b60405180910390fd5b610bbe8282612b2c565b5050565b606060028054610bd190613c79565b80601f0160208091040260200160405190810160405280929190818152602001828054610bfd90613c79565b8015610c4a5780601f10610c1f57610100808354040283529160200191610c4a565b820191906000526020600020905b815481529060010190602001808311610c2d57829003601f168201915b5050505050905090565b6000610c5f82612bcf565b610c7c576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610ca382612326565b9050336001600160a01b03821614610cdc57610cbf8133610aeb565b610cdc576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6012546001600160a01b0316331480610d5c5750610c97546001600160a01b031633145b610d785760405162461bcd60e51b8152600401610bab90613c42565b6012805460ff60a81b1916600160a81b179055565b610d95612bf6565b6000610d9f61338c565b6000610e368461014c8054610db390613c79565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddf90613c79565b8015610e2c5780601f10610e0157610100808354040283529160200191610e2c565b820191906000526020600020905b815481529060010190602001808311610e0f57829003601f168201915b5050505050612c20565b610e905760405162461bcd60e51b815260206004820152602560248201527f4275696c6465723a20706c65617365206d696e74207669612077656273697465604482015264206f6e6c7960d81b6064820152608401610bab565b61014e5461ffff16610ea56001546000540390565b610eb0906001613cc3565b1115610f0f5760405162461bcd60e51b815260206004820152602860248201527f4275696c6465723a2043616e2774206d696e74206d6f7265207468616e206d616044820152677820737570706c7960c01b6064820152608401610bab565b6127108661ffff1610610f645760405162461bcd60e51b815260206004820152601c60248201527f4275696c6465723a20746865726520617265206f6e6c792039393939000000006044820152606401610bab565b60138661ffff166127108110610f7c57610f7c613cd6565b602081049091015460ff601f9092166101000a90041615610fdf5760405162461bcd60e51b815260206004820181905260248201527f4275696c6465723a20616c7265616479206d696e7465642074686174206f6e656044820152606401610bab565b6012546001600160a01b0316331461104b57601254600160a01b900460ff161561104b5760405162461bcd60e51b815260206004820181905260248201527f4275696c6465723a206d696e74696e67206973206e6f74206f70656e207965746044820152606401610bab565b336000908152610c94602052604090205461ffff16156110a957336000908152610c946020526040812080546001929061108a90849061ffff16613cec565b92506101000a81548161ffff021916908361ffff160217905550611118565b6012546001600160a01b0316331461111857610c93543410156111185760405162461bcd60e51b815260206004820152602160248201527f4275696c6465723a20596f75206d7573742070617920666f7220746865206e666044820152601d60fa1b6064820152608401610bab565b600092505b60788361ffff16101561117a57845161115b9061016760005b607802018561ffff166078811061114f5761114f613cd6565b018054610db390613c79565b1561116f575061ffff82168152600161117a565b60018301925061111d565b806111d35760405162461bcd60e51b815260206004820152602360248201527f4275696c6465723a2063616e6e6f742066696e642072657175657374656420626044820152626f647960e81b6064820152608401610bab565b5060009150815b60788361ffff16101561121c5760208501516111fa906101676001611136565b15611211575061ffff82166020820152600161121c565b6001830192506111da565b8061127a5760405162461bcd60e51b815260206004820152602860248201527f4275696c6465723a2063616e6e6f742066696e6420726571756573746564206160448201526763636573736f727960c01b6064820152608401610bab565b5060009150815b60788361ffff1610156112c35760408501516112a1906101676002611136565b156112b8575061ffff8216604082015260016112c3565b600183019250611281565b8061131e5760405162461bcd60e51b815260206004820152602560248201527f4275696c6465723a2063616e6e6f742066696e642072657175657374656420626044820152646f74746f6d60d81b6064820152608401610bab565b856102cf61132f6001546000540390565b612710811061134057611340613cd6565b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550600160138761ffff16612710811061137f5761137f613cd6565b602091828204019190066101000a81548160ff021916908315150217905550600092505b60038361ffff1610156115945761ffff83161561150b57600061014f8461ffff16600381106113d4576113d4613cd6565b60080201838561ffff16600381106113ee576113ee613cd6565b602002015161ffff166078811061140757611407613cd6565b601091828204019190066002029054906101000a900461ffff1661ffff16116114855760405162461bcd60e51b815260206004820152602a60248201527f4275696c6465723a2074686174207472616974206973206e6f206c6f6e67657260448201526920617661696c61626c6560b01b6064820152608401610bab565b600161014f8461ffff166003811061149f5761149f613cd6565b60080201838561ffff16600381106114b9576114b9613cd6565b602002015161ffff16607881106114d2576114d2613cd6565b601091828204019190066002028282829054906101000a900461ffff160392506101000a81548161ffff021916908361ffff1602179055505b818361ffff166003811061152157611521613cd6565b60200201516102cf8460010161ffff166004811061154157611541613cd6565b61027102016115536001546000540390565b612710811061156457611564613cd6565b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506001830192506113a3565b61159f336001612c79565b5050506115ac6001600855565b505050565b6012546001600160a01b03163314806115d55750610c97546001600160a01b031633145b6115f15760405162461bcd60e51b8152600401610bab90613c42565b60005b81518161ffff1610156115ac57818161ffff168151811061161757611617613cd6565b602002602001015161014f8461ffff166003811061163757611637613cd6565b600802018261ffff166078811061165057611650613cd6565b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506001816116829190613d07565b90506115f4565b6012546001600160a01b03163314806116ad5750610c97546001600160a01b031633145b6116c95760405162461bcd60e51b8152600401610bab90613c42565b60128054911515600160a01b0260ff60a01b19909216919091179055565b6001600160a01b0381166000908152600b602052604090205461171c5760405162461bcd60e51b8152600401610bab90613d22565b60006117278261285f565b9050806000036117495760405162461bcd60e51b8152600401610bab90613d68565b80600a600082825461175b9190613cc3565b90915550506001600160a01b0382166000908152600c602052604090208054820190556117888282612c93565b604080516001600160a01b0384168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15050565b60006117d982612d2b565b9050836001600160a01b0316816001600160a01b03161461180c5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b038816909114176118595761183c8633610aeb565b61185957604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661188057604051633a954ecd60e21b815260040160405180910390fd5b801561188b57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b8416900361191d5760018401600081815260046020526040812054900361191b57600054811461191b5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b60008281526011602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916119dc5750604080518082019091526010546001600160a01b0381168252600160a01b90046001600160601b031660208201525b6020810151600090612710906119fb906001600160601b031687613db3565b611a059190613de0565b91519350909150505b9250929050565b60008060008061270f42604051602001611a3191815260200190565b6040516020818303038152906040528051906020012060001c611a549190613df4565b90506127068161ffff161180611a6e5750600a8161ffff16105b15611a7857506113885b8091505b6127108261ffff161015611adc5760138261ffff166127108110611aa257611aa2613cd6565b602081049091015460ff601f9092166101000a9004161515600003611aca5760019250611adc565b611ad5600183613d07565b9150611a7c565b821515600003611b46578091505b61ffff821615611b465760138261ffff166127108110611b0c57611b0c613cd6565b602081049091015460ff601f9092166101000a9004161515600003611b345760019250611b46565b611b3f600183613cec565b9150611aea565b600183151514611ba75760405162461bcd60e51b815260206004820152602660248201527f4275696c6465723a2063616e27742066696e6420617661696c61626c65206d6f6044820152651bdb989a5c9960d21b6064820152608401610bab565b5092915050565b6115ac838383604051806020016040528060008152506128f6565b6012546001600160a01b0316331480611bed5750610c97546001600160a01b031633145b611c095760405162461bcd60e51b8152600401610bab90613c42565b610c9355565b6001600160a01b0381166000908152600b6020526040902054611c445760405162461bcd60e51b8152600401610bab90613d22565b6000611c508383612940565b905080600003611c725760405162461bcd60e51b8152600401610bab90613d68565b6001600160a01b0383166000908152600e602052604081208054839290611c9a908490613cc3565b90915550506001600160a01b038084166000908152600f60209081526040808320938616835292905220805482019055611cd5838383612d92565b604080516001600160a01b038481168252602082018490528516917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a2505050565b6012546001600160a01b0316331480611d445750610c97546001600160a01b031633145b611d605760405162461bcd60e51b8152600401610bab90613c42565b601254600160a81b900460ff1615611db35760405162461bcd60e51b8152602060048201526016602482015275213ab4b63232b91d103ab9349034b990333937bd32b760511b6044820152606401610bab565b61014d610bbe8282613e4e565b6012546001600160a01b0316331480611de45750610c97546001600160a01b031633145b611e005760405162461bcd60e51b8152600401610bab90613c42565b610bbe8282612de4565b61014f8260038110611e1b57600080fd5b600802018160788110611e2d57600080fd5b60109182820401919006600202915091509054906101000a900461ffff1681565b611e566133aa565b60005b60788161ffff161015611f92576101678361ffff1660038110611e7e57611e7e613cd6565b607802018161ffff1660788110611e9757611e97613cd6565b018054611ea390613c79565b159050611f92576101678361ffff1660038110611ec257611ec2613cd6565b607802018161ffff1660788110611edb57611edb613cd6565b018054611ee790613c79565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1390613c79565b8015611f605780601f10611f3557610100808354040283529160200191611f60565b820191906000526020600020905b815481529060010190602001808311611f4357829003601f168201915b5050505050828261ffff1660788110611f7b57611f7b613cd6565b6020020152611f8b600182613d07565b9050611e59565b50919050565b6000606080806102cf61ffff86166127108110611fb757611fb7613cd6565b601081049190910154600f9091166002026101000a900461ffff90811690610167906105409088166127108110611ff057611ff0613cd6565b601091828204019190066002029054906101000a900461ffff1661ffff166078811061201e5761201e613cd6565b016101df6107b161ffff8916612710811061203b5761203b613cd6565b601091828204019190066002029054906101000a900461ffff1661ffff166078811061206957612069613cd6565b01610257610a2261ffff8a16612710811061208657612086613cd6565b601091828204019190066002029054906101000a900461ffff1661ffff16607881106120b4576120b4613cd6565b018280546120c190613c79565b80601f01602080910402602001604051908101604052809291908181526020018280546120ed90613c79565b801561213a5780601f1061210f5761010080835404028352916020019161213a565b820191906000526020600020905b81548152906001019060200180831161211d57829003601f168201915b5050505050925081805461214d90613c79565b80601f016020809104026020016040519081016040528092919081815260200182805461217990613c79565b80156121c65780601f1061219b576101008083540402835291602001916121c6565b820191906000526020600020905b8154815290600101906020018083116121a957829003601f168201915b505050505091508080546121d990613c79565b80601f016020809104026020016040519081016040528092919081815260200182805461220590613c79565b80156122525780601f1061222757610100808354040283529160200191612252565b820191906000526020600020905b81548152906001019060200180831161223557829003601f168201915b5050505050905093509350935093509193509193565b6012546001600160a01b031633148061228c5750610c97546001600160a01b031633145b6122a85760405162461bcd60e51b8152600401610bab90613c42565b60005b81518161ffff1610156115ac57818161ffff16815181106122ce576122ce613cd6565b60200260200101516101678461ffff16600381106122ee576122ee613cd6565b607802018261ffff166078811061230757612307613cd6565b01906123139082613e4e565b5061231f600182613d07565b90506122ab565b6000610b6582612d2b565b6123396133d2565b60005b60788161ffff161015611f925761014f8361ffff166003811061236157612361613cd6565b600802018161ffff166078811061237a5761237a613cd6565b601091828204019190066002029054906101000a900461ffff16828261ffff16607881106123aa576123aa613cd6565b61ffff90921660209290920201526123c3600182613d07565b905061233c565b61014d80546123d890613c79565b80601f016020809104026020016040519081016040528092919081815260200182805461240490613c79565b80156124515780601f1061242657610100808354040283529160200191612451565b820191906000526020600020905b81548152906001019060200180831161243457829003601f168201915b505050505081565b612461612e90565b610c9780546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166124ad576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6124da612e90565b6124e46000612ebd565b565b61016782600381106124f757600080fd5b60780201816078811061250957600080fd5b0180549092506123d89150613c79565b6000600d828154811061252e5761252e613cd6565b6000918252602090912001546001600160a01b031692915050565b606060038054610bd190613c79565b6012546001600160a01b031633148061257c5750610c97546001600160a01b031633145b6125985760405162461bcd60e51b8152600401610bab90613c42565b61014e5461ffff908116908216106126185760405162461bcd60e51b815260206004820152603760248201527f4275696c6465723a204e6577206d6178696d756d206d757374206265206c657360448201527f73207468616e206578697374696e67206d6178696d756d0000000000000000006064820152608401610bab565b600154600054038161ffff16101561268f5760405162461bcd60e51b815260206004820152603460248201527f4275696c6465723a204e6577206d6178696d756d2063616e2774206265206c656044820152731cdcc81d1a185b881b5a5b9d19590818dbdd5b9d60621b6064820152608401610bab565b61014e805461ffff191661ffff92909216919091179055565b6012546001600160a01b03163314806126cc5750610c97546001600160a01b031633145b6126e85760405162461bcd60e51b8152600401610bab90613c42565b82811461274f5760405162461bcd60e51b815260206004820152602f60248201527f4275696c6465723a20636f756e74206f662077616c6c657420616e642071756160448201526e0dce8d2e8f240dcdee840dac2e8c6d608b1b6064820152608401610bab565b60005b838110156127ec5782828281811061276c5761276c613cd6565b905060200201602081019061278191906138d0565b610c94600087878581811061279857612798613cd6565b90506020020160208101906127ad91906137ee565b6001600160a01b031681526020810191909152604001600020805461ffff191661ffff92909216919091179055806127e481613f0d565b915050612752565b5050505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60008061286b600a5490565b612876903031613cc3565b90506128a1838261289c866001600160a01b03166000908152600c602052604090205490565b612f0f565b9392505050565b6012546001600160a01b03163314806128cc5750610c97546001600160a01b031633145b6128e85760405162461bcd60e51b8152600401610bab90613c42565b61014c6115ac828483613f26565b6129018484846117ce565b6001600160a01b0383163b1561293a5761291d84848484612f4d565b61293a576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6001600160a01b0382166000908152600e602052604081205481906040516370a0823160e01b81523060048201526001600160a01b038616906370a0823190602401602060405180830381865afa15801561299f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c39190613fe5565b6129cd9190613cc3565b6001600160a01b038086166000908152600f6020908152604080832093881683529290522054909150612a039084908390612f0f565b949350505050565b6060612a1682612bcf565b612a3357604051630a14c4b560e41b815260040160405180910390fd5b6000612a3d613038565b90508051600003612a5d57604051806020016040528060008152506128a1565b80612a6784613048565b604051602001612a78929190613ffe565b6040516020818303038152906040529392505050565b6013816127108110612a9f57600080fd5b60209182820401919006915054906101000a900460ff1681565b612ac1612e90565b6001600160a01b038116612aeb57604051631e4fbdf760e01b815260006004820152602401610bab565b612af481612ebd565b50565b60006001600160e01b0319821663152a902d60e11b1480610b6557506301ffc9a760e01b6001600160e01b0319831614610b65565b6127106001600160601b038216811015612b6b57604051636f483d0960e01b81526001600160601b038316600482015260248101829052604401610bab565b6001600160a01b038316612b9557604051635b6cc80560e11b815260006004820152602401610bab565b50604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217601055565b6000805482108015610b65575050600090815260046020526040902054600160e01b161590565b600260085403612c1957604051633ee5aeb560e01b815260040160405180910390fd5b6002600855565b600081604051602001612c33919061403d565b6040516020818303038152906040528051906020012083604051602001612c5a919061403d565b6040516020818303038152906040528051906020012014905092915050565b610bbe82826040518060200160405280600081525061308c565b3031811115612cb75760405163cd78605960e01b8152306004820152602401610bab565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612d04576040519150601f19603f3d011682016040523d82523d6000602084013e612d09565b606091505b50509050806115ac57604051630a12f52160e11b815260040160405180910390fd5b600081600054811015612d795760008181526004602052604081205490600160e01b82169003612d77575b806000036128a1575060001901600081815260046020526040902054612d56565b505b604051636f96cda160e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526115ac9084906130f2565b6001600160a01b0382166000908152600b6020526040902054600954612e0b908390613cc3565b612e159190614059565b6009819055612e745760405162461bcd60e51b815260206004820152602560248201527f5061796d656e7453706c69747465723a2063616e6e6f74206861766520302073604482015264686172657360d81b6064820152608401610bab565b6001600160a01b039091166000908152600b6020526040902055565b6012546001600160a01b031633146124e45760405163118cdaa760e01b8152336004820152602401610bab565b601280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6009546001600160a01b0384166000908152600b602052604081205490918391612f399086613db3565b612f439190613de0565b612a039190614059565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612f8290339089908890889060040161406c565b6020604051808303816000875af1925050508015612fbd575060408051601f3d908101601f19168201909252612fba918101906140a9565b60015b61301b573d808015612feb576040519150601f19603f3d011682016040523d82523d6000602084013e612ff0565b606091505b508051600003613013576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b606061014d8054610bd190613c79565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806130625750819003601f19909101908152919050565b6130968383613155565b6001600160a01b0383163b156115ac576000548281035b6130c06000868380600101945086612f4d565b6130dd576040516368d2bf6b60e11b815260040160405180910390fd5b8181106130ad5781600054146127ec57600080fd5b60006131076001600160a01b03841683613253565b9050805160001415801561312c57508080602001905181019061312a91906140c6565b155b156115ac57604051635274afe760e01b81526001600160a01b0384166004820152602401610bab565b600080549082900361317a5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461322957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001016131f1565b508160000361324a57604051622e076360e81b815260040160405180910390fd5b60005550505050565b60606128a18383600061326461327d565b604051630a12f52160e11b815260040160405180910390fd5b606030318311156132a35760405163cd78605960e01b8152306004820152602401610bab565b600080866001600160a01b031685876040516132bf919061403d565b60006040518083038185875af1925050503d80600081146132fc576040519150601f19603f3d011682016040523d82523d6000602084013e613301565b606091505b50915091506133128783838761331d565b979650505050505050565b6060831561336b57825160000361336457846001600160a01b03163b60000361336457604051639996b31560e01b81526001600160a01b0386166004820152602401610bab565b5081612a03565b612a0383838151156133805781518083602001fd5b6132648163ffffffff16565b60405180606001604052806003906020820280368337509192915050565b60405180610f0001604052806078905b60608152602001906001900390816133ba5790505090565b60405180610f0001604052806078906020820280368337509192915050565b6001600160e01b031981168114612af457600080fd5b60006020828403121561341957600080fd5b81356128a1816133f1565b6001600160a01b0381168114612af457600080fd5b6000806040838503121561344c57600080fd5b823561345781613424565b915060208301356001600160601b038116811461347357600080fd5b809150509250929050565b60005b83811015613499578181015183820152602001613481565b50506000910152565b600081518084526134ba81602086016020860161347e565b601f01601f19169290920160200192915050565b6020815260006128a160208301846134a2565b6000602082840312156134f357600080fd5b5035919050565b6000806040838503121561350d57600080fd5b823561351881613424565b946020939093013593505050565b803561ffff8116811461353857600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156135755761357561353d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156135a3576135a361353d565b604052919050565b60006001600160401b038311156135c4576135c461353d565b6135d7601f8401601f191660200161357b565b90508281528383830111156135eb57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261361357600080fd5b6128a1838335602085016135ab565b60008060006060848603121561363757600080fd5b61364084613526565b92506020808501356001600160401b038082111561365d57600080fd5b818701915087601f83011261367157600080fd5b613679613553565b80606084018a81111561368b57600080fd5b845b818110156136bf578035858111156136a55760008081fd5b6136b18d828901613602565b85525092860192860161368d565b50909650505060408701359250808311156136d957600080fd5b50506136e786828701613602565b9150509250925092565b60006001600160401b0382111561370a5761370a61353d565b5060051b60200190565b6000806040838503121561372757600080fd5b61373083613526565b91506020808401356001600160401b0381111561374c57600080fd5b8401601f8101861361375d57600080fd5b803561377061376b826136f1565b61357b565b81815260059190911b8201830190838101908883111561378f57600080fd5b928401925b828410156137b4576137a584613526565b82529284019290840190613794565b80955050505050509250929050565b8015158114612af457600080fd5b6000602082840312156137e357600080fd5b81356128a1816137c3565b60006020828403121561380057600080fd5b81356128a181613424565b60008060006060848603121561382057600080fd5b833561382b81613424565b9250602084013561383b81613424565b929592945050506040919091013590565b6000806040838503121561385f57600080fd5b50508035926020909101359150565b6000806040838503121561388157600080fd5b823561388c81613424565b9150602083013561347381613424565b6000602082840312156138ae57600080fd5b81356001600160401b038111156138c457600080fd5b612a0384828501613602565b6000602082840312156138e257600080fd5b6128a182613526565b6020808252600090610f20830183820185845b607881101561392d57601f1987850301835261391b8483516134a2565b935091840191908401906001016138fe565b50919695505050505050565b61ffff8516815260806020820152600061395660808301866134a2565b828103604084015261396881866134a2565b9050828103606084015261331281856134a2565b6000806040838503121561398f57600080fd5b61399883613526565b91506020808401356001600160401b03808211156139b557600080fd5b818601915086601f8301126139c957600080fd5b81356139d761376b826136f1565b81815260059190911b830184019084810190898311156139f657600080fd5b8585015b83811015613a2e57803585811115613a125760008081fd5b613a208c89838a0101613602565b8452509186019186016139fa565b508096505050505050509250929050565b610f008101818360005b6078811015613a6c57815161ffff16835260209283019290910190600101613a49565b50505092915050565b60008083601f840112613a8757600080fd5b5081356001600160401b03811115613a9e57600080fd5b6020830191508360208260051b8501011115611a0e57600080fd5b60008060008060408587031215613acf57600080fd5b84356001600160401b0380821115613ae657600080fd5b613af288838901613a75565b90965094506020870135915080821115613b0b57600080fd5b50613b1887828801613a75565b95989497509550505050565b60008060408385031215613b3757600080fd5b8235613b4281613424565b91506020830135613473816137c3565b60008060208385031215613b6557600080fd5b82356001600160401b0380821115613b7c57600080fd5b818501915085601f830112613b9057600080fd5b813581811115613b9f57600080fd5b866020828501011115613bb157600080fd5b60209290920196919550909350505050565b60008060008060808587031215613bd957600080fd5b8435613be481613424565b93506020850135613bf481613424565b92506040850135915060608501356001600160401b03811115613c1657600080fd5b8501601f81018713613c2757600080fd5b613c36878235602084016135ab565b91505092959194509250565b60208082526017908201527f4275696c6465723a206f6e6c7920666f72206f776e6572000000000000000000604082015260600190565b600181811c90821680613c8d57607f821691505b602082108103611f9257634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115610b6557610b65613cad565b634e487b7160e01b600052603260045260246000fd5b61ffff828116828216039080821115611ba757611ba7613cad565b61ffff818116838216019080821115611ba757611ba7613cad565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b8082028115828204841417610b6557610b65613cad565b634e487b7160e01b600052601260045260246000fd5b600082613def57613def613dca565b500490565b600082613e0357613e03613dca565b500690565b601f8211156115ac57600081815260208120601f850160051c81016020861015613e2f5750805b601f850160051c820191505b8181101561195f57828155600101613e3b565b81516001600160401b03811115613e6757613e6761353d565b613e7b81613e758454613c79565b84613e08565b602080601f831160018114613eb05760008415613e985750858301515b600019600386901b1c1916600185901b17855561195f565b600085815260208120601f198616915b82811015613edf57888601518255948401946001909101908401613ec0565b5085821015613efd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201613f1f57613f1f613cad565b5060010190565b6001600160401b03831115613f3d57613f3d61353d565b613f5183613f4b8354613c79565b83613e08565b6000601f841160018114613f855760008515613f6d5750838201355b600019600387901b1c1916600186901b1783556127ec565b600083815260209020601f19861690835b82811015613fb65786850135825560209485019460019092019101613f96565b5086821015613fd35760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600060208284031215613ff757600080fd5b5051919050565b6000835161401081846020880161347e565b83519083019061402481836020880161347e565b64173539b7b760d91b9101908152600501949350505050565b6000825161404f81846020870161347e565b9190910192915050565b81810381811115610b6557610b65613cad565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061409f908301846134a2565b9695505050505050565b6000602082840312156140bb57600080fd5b81516128a1816133f1565b6000602082840312156140d857600080fd5b81516128a1816137c356fea2646970667358221220836f8df98d8915a30fcd9b324c934ba3dadb22b881e7fbbc5b919c37254ce77f64736f6c63430008140033
Deployed Bytecode Sourcemap
12412:8725:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3514:40:12;836:10:2;3514:40:12;;;-1:-1:-1;;;;;206:32:15;;;188:51;;3544:9:12;270:2:15;255:18;;248:34;161:18;3514:40:12;;;;;;;12412:8725:1;;;;;20622:171;;;;;;;;;;-1:-1:-1;20622:171:1;;;;;:::i;:::-;;:::i;:::-;;;844:14:15;;837:22;819:41;;807:2;792:18;20622:171:1;;;;;;;;20822:146;;;;;;;;;;-1:-1:-1;20822:146:1;;;;;:::i;:::-;;:::i;:::-;;10386:100:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;16885:218::-;;;;;;;;;;-1:-1:-1;16885:218:5;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2552:32:15;;;2534:51;;2522:2;2507:18;16885:218:5;2388:203:15;16318:408:5;;;;;;:::i;:::-;;:::i;19851:78:1:-;;;;;;;;;;;;;:::i;13600:2481::-;;;;;;:::i;:::-;;:::i;13012:34::-;;;;;;;;;;;;;;;;;;;5781:25:15;;;5769:2;5754:18;13012:34:1;5635:177:15;17961:204:1;;;;;;;;;;-1:-1:-1;17961:204:1;;;;;:::i;:::-;;:::i;19353:81::-;;;;;;;;;;-1:-1:-1;19353:81:1;;;;;:::i;:::-;;:::i;6137:323:5:-;;;;;;;;;;-1:-1:-1;6411:12:5;;6198:7;6395:13;:28;6137:323;;6035:671:12;;;;;;;;;;-1:-1:-1;6035:671:12;;;;;:::i;:::-;;:::i;20524:2825:5:-;;;;;;:::i;:::-;;:::i;13053:42:1:-;;;;;;;;;;-1:-1:-1;13053:42:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8491:6:15;8479:19;;;8461:38;;8449:2;8434:18;13053:42:1;8317:188:15;2498:429:4;;;;;;;;;;-1:-1:-1;2498:429:4;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;206:32:15;;;188:51;;270:2;255:18;;248:34;;;;161:18;2498:429:4;14:274:15;16855:770:1;;;;;;;;;;;;;:::i;3645:91:12:-;;;;;;;;;;-1:-1:-1;3716:12:12;;3645:91;;4774:135;;;;;;;;;;-1:-1:-1;4774:135:12;;;;;:::i;:::-;-1:-1:-1;;;;;4871:21:12;;;4844:7;4871:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;4774:135;23445:193:5;;;;;;:::i;:::-;;:::i;19236:82:1:-;;;;;;;;;;-1:-1:-1;19236:82:1;;;;;:::i;:::-;;:::i;6974:792:12:-;;;;;;;;;;-1:-1:-1;6974:792:12;;;;;:::i;:::-;;:::i;19641:174:1:-;;;;;;;;;;-1:-1:-1;19641:174:1;;;;;:::i;:::-;;:::i;20461:125::-;;;;;;;;;;-1:-1:-1;20461:125:1;;;;;:::i;:::-;;:::i;12891:33::-;;;;;;;;;;-1:-1:-1;12891:33:1;;;;;:::i;:::-;;:::i;12543:25::-;;;;;;;;;;-1:-1:-1;12543:25:1;;;;-1:-1:-1;;;12543:25:1;;;;;;18259:308;;;;;;;;;;-1:-1:-1;18259:308:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18945:253::-;;;;;;;;;;-1:-1:-1;18945:253:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;17687:199::-;;;;;;;;;;-1:-1:-1;17687:199:1;;;;;:::i;:::-;;:::i;11787:152:5:-;;;;;;;;;;-1:-1:-1;11787:152:5;;;;;:::i;:::-;;:::i;18661:214:1:-;;;;;;;;;;-1:-1:-1;18661:214:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;12778:68::-;;;;;;;;;;;;;:::i;19471:90::-;;;;;;;;;;-1:-1:-1;19471:90:1;;;;;:::i;:::-;;:::i;7321:233:5:-;;;;;;;;;;-1:-1:-1;7321:233:5;;;;;:::i;:::-;;:::i;2354:103:11:-;;;;;;;;;;;;;:::i;12931:32:1:-;;;;;;;;;;-1:-1:-1;12931:32:1;;;;;:::i;:::-;;:::i;5000:100:12:-;;;;;;;;;;-1:-1:-1;5000:100:12;;;;;:::i;:::-;;:::i;1679:87:11:-;;;;;;;;;;-1:-1:-1;1752:6:11;;-1:-1:-1;;;;;1752:6:11;1679:87;;10562:104:5;;;;;;;;;;;;;:::i;4496:109:12:-;;;;;;;;;;-1:-1:-1;4496:109:12;;;;;:::i;:::-;-1:-1:-1;;;;;4579:18:12;4552:7;4579:18;;;:9;:18;;;;;;;4496:109;20118:292:1;;;;;;;;;;-1:-1:-1;20118:292:1;;;;;:::i;:::-;;:::i;16269:310::-;;;;;;;;;;-1:-1:-1;16269:310:1;;;;;:::i;:::-;;:::i;17443:234:5:-;;;;;;;;;;-1:-1:-1;17443:234:5;;;;;:::i;:::-;;:::i;5190:225:12:-;;;;;;;;;;-1:-1:-1;5190:225:12;;;;;:::i;:::-;;:::i;16137:95:1:-;;;;;;;;;;-1:-1:-1;16137:95:1;;;;;:::i;:::-;;:::i;24236:407:5:-;;;;;;:::i;:::-;;:::i;5575:260:12:-;;;;;;;;;;-1:-1:-1;5575:260:12;;;;;:::i;:::-;;:::i;12575:29:1:-;;;;;;;;;;-1:-1:-1;12575:29:1;;;;-1:-1:-1;;;12575:29:1;;;;;;10772:326:5;;;;;;;;;;-1:-1:-1;10772:326:5;;;;;:::i;:::-;;:::i;4292:105:12:-;;;;;;;;;;-1:-1:-1;4292:105:12;;;;;:::i;:::-;-1:-1:-1;;;;;4373:16:12;4346:7;4373:16;;;:7;:16;;;;;;;4292:105;12853:31:1;;;;;;;;;;-1:-1:-1;12853:31:1;;;;;;;;4082:119:12;;;;;;;;;;-1:-1:-1;4082:119:12;;;;;:::i;:::-;-1:-1:-1;;;;;4167:26:12;4140:7;4167:26;;;:19;:26;;;;;;;4082:119;12611:26:1;;;;;;;;;;-1:-1:-1;12611:26:1;;;;;:::i;:::-;;:::i;3830:95:12:-;;;;;;;;;;-1:-1:-1;3903:14:12;;3830:95;;17834:164:5;;;;;;;;;;-1:-1:-1;17834:164:5;;;;;:::i;:::-;-1:-1:-1;;;;;17955:25:5;;;17931:4;17955:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;17834:164;2612:220:11;;;;;;;;;;-1:-1:-1;2612:220:11;;;;;:::i;:::-;;:::i;13376:37:1:-;;;;;;;;;;-1:-1:-1;13376:37:1;;;;-1:-1:-1;;;;;13376:37:1;;;20622:171;20725:4;20749:36;20773:11;20749:23;:36::i;:::-;20742:43;20622:171;-1:-1:-1;;20622:171:1:o;20822:146::-;1752:6:11;;-1:-1:-1;;;;;1752:6:11;21042:10:1;:21;;:44;;-1:-1:-1;21081:5:1;;-1:-1:-1;;;;;21081:5:1;21067:10;:19;21042:44;21034:80;;;;-1:-1:-1;;;21034:80:1;;;;;;;:::i;:::-;;;;;;;;;20918:42:::1;20937:8;20947:12;20918:18;:42::i;:::-;20822:146:::0;;:::o;10386:100:5:-;10440:13;10473:5;10466:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10386:100;:::o;16885:218::-;16961:7;16986:16;16994:7;16986;:16::i;:::-;16981:64;;17011:34;;-1:-1:-1;;;17011:34:5;;;;;;;;;;;16981:64;-1:-1:-1;17065:24:5;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;17065:30:5;;16885:218::o;16318:408::-;16407:13;16423:16;16431:7;16423;:16::i;:::-;16407:32;-1:-1:-1;836:10:2;-1:-1:-1;;;;;16456:28:5;;;16452:175;;16504:44;16521:5;836:10:2;17834:164:5;:::i;16504:44::-;16499:128;;16576:35;;-1:-1:-1;;;16576:35:5;;;;;;;;;;;16499:128;16639:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;16639:35:5;-1:-1:-1;;;;;16639:35:5;;;;;;;;;16690:28;;16639:24;;16690:28;;;;;;;16396:330;16318:408;;:::o;19851:78:1:-;1752:6:11;;-1:-1:-1;;;;;1752:6:11;21042:10:1;:21;;:44;;-1:-1:-1;21081:5:1;;-1:-1:-1;;;;;21081:5:1;21067:10;:19;21042:44;21034:80;;;;-1:-1:-1;;;21034:80:1;;;;;;;:::i;:::-;19905:9:::1;:16:::0;;-1:-1:-1;;;;19905:16:1::1;-1:-1:-1::0;;;19905:16:1::1;::::0;;19851:78::o;13600:2481::-;2527:21:13;:19;:21::i;:::-;13715:8:1::1;13734:29;;:::i;:::-;13774:10;13805:24;13813:3;13818:10;13805:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:24::i;:::-;13797:74;;;::::0;-1:-1:-1;;;13797:74:1;;17278:2:15;13797:74:1::1;::::0;::::1;17260:21:15::0;17317:2;17297:18;;;17290:30;17356:34;17336:18;;;17329:62;-1:-1:-1;;;17407:18:15;;;17400:35;17452:19;;13797:74:1::1;17076:401:15::0;13797:74:1::1;13911:9;::::0;::::1;;13890:13;6411:12:5::0;;6198:7;6395:13;:28;;6137:323;13890:13:1::1;:17;::::0;13906:1:::1;13890:17;:::i;:::-;:30;;13882:83;;;::::0;-1:-1:-1;;;13882:83:1;;17946:2:15;13882:83:1::1;::::0;::::1;17928:21:15::0;17985:2;17965:18;;;17958:30;18024:34;18004:18;;;17997:62;-1:-1:-1;;;18075:18:15;;;18068:38;18123:19;;13882:83:1::1;17744:404:15::0;13882:83:1::1;13993:5;13984:7;:14;;;13976:55;;;::::0;-1:-1:-1;;;13976:55:1;;18355:2:15;13976:55:1::1;::::0;::::1;18337:21:15::0;18394:2;18374:18;;;18367:30;18433;18413:18;;;18406:58;18481:18;;13976:55:1::1;18153:352:15::0;13976:55:1::1;14050:7;14058;14050:16;;;;;;;;;:::i;:::-;;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;::::1;;:25;14042:70;;;::::0;-1:-1:-1;;;14042:70:1;;18844:2:15;14042:70:1::1;::::0;::::1;18826:21:15::0;;;18863:18;;;18856:30;18922:34;18902:18;;;18895:62;18974:18;;14042:70:1::1;18642:356:15::0;14042:70:1::1;1752:6:11::0;;-1:-1:-1;;;;;1752:6:11;14129:10:1::1;:21;14125:106;;14176:6;::::0;-1:-1:-1;;;14176:6:1;::::1;;;14175:7;14167:52;;;::::0;-1:-1:-1;;;14167:52:1;;19205:2:15;14167:52:1::1;::::0;::::1;19187:21:15::0;;;19224:18;;;19217:30;19283:34;19263:18;;;19256:62;19335:18;;14167:52:1::1;19003:356:15::0;14167:52:1::1;14256:10;14270:1;14247:20:::0;;;:8:::1;:20;::::0;;;;;::::1;;:24:::0;14243:205:::1;;14297:10;14288:20;::::0;;;:8:::1;:20;::::0;;;;:25;;14312:1:::1;::::0;14288:20;:25:::1;::::0;14312:1;;14288:25:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;14243:205;;;1752:6:11::0;;-1:-1:-1;;;;;1752:6:11;14335:10:1::1;:21;14331:117;;14394:4;;14381:9;:17;;14373:63;;;::::0;-1:-1:-1;;;14373:63:1;;19742:2:15;14373:63:1::1;::::0;::::1;19724:21:15::0;19781:2;19761:18;;;19754:30;19820:34;19800:18;;;19793:62;-1:-1:-1;;;19871:18:15;;;19864:31;19912:19;;14373:63:1::1;19540:397:15::0;14373:63:1::1;14564:1;14560:5;;14555:230;14571:3;14567:1;:7;;;14555:230;;;14615:9:::0;;14607:36:::1;::::0;14626:10:::1;14622:1;14626:13;;;;14640:1;14626:16;;;;;;;;;:::i;:::-;;14607:36;;;;;:::i;:::-;14603:167;;;-1:-1:-1::0;14668:19:1::1;::::0;::::1;::::0;;14718:4:::1;14745:5;;14603:167;14581:1;14576:6;;;;14555:230;;;14807:5;14799:53;;;::::0;-1:-1:-1;;;14799:53:1;;20144:2:15;14799:53:1::1;::::0;::::1;20126:21:15::0;20183:2;20163:18;;;20156:30;20222:34;20202:18;;;20195:62;-1:-1:-1;;;20273:18:15;;;20266:33;20316:19;;14799:53:1::1;19942:399:15::0;14799:53:1::1;-1:-1:-1::0;14877:5:1::1;::::0;-1:-1:-1;14877:5:1;14897:230:::1;14913:3;14909:1;:7;;;14897:230;;;14957:9;::::0;::::1;::::0;14949:36:::1;::::0;14968:10:::1;14964:1;14968:13;::::0;14949:36:::1;14945:167;;;-1:-1:-1::0;15010:19:1::1;::::0;::::1;:15;::::0;::::1;:19:::0;15023:1:::1;15087:5;;14945:167;14923:1;14918:6;;;;14897:230;;;15149:5;15141:58;;;::::0;-1:-1:-1;;;15141:58:1;;20548:2:15;15141:58:1::1;::::0;::::1;20530:21:15::0;20587:2;20567:18;;;20560:30;20626:34;20606:18;;;20599:62;-1:-1:-1;;;20677:18:15;;;20670:38;20725:19;;15141:58:1::1;20346:404:15::0;15141:58:1::1;-1:-1:-1::0;15224:5:1::1;::::0;-1:-1:-1;15224:5:1;15244:230:::1;15260:3;15256:1;:7;;;15244:230;;;15304:9:::0;;::::1;::::0;15296:36:::1;::::0;15315:10:::1;15311:1;15315:13;::::0;15296:36:::1;15292:167;;;-1:-1:-1::0;15357:19:1::1;::::0;::::1;:15:::0;;::::1;:19:::0;15407:4:::1;15434:5;;15292:167;15270:1;15265:6;;;;15244:230;;;15496:5;15488:55;;;::::0;-1:-1:-1;;;15488:55:1;;20957:2:15;15488:55:1::1;::::0;::::1;20939:21:15::0;20996:2;20976:18;;;20969:30;21035:34;21015:18;;;21008:62;-1:-1:-1;;;21086:18:15;;;21079:35;21131:19;;15488:55:1::1;20755:401:15::0;15488:55:1::1;15591:7:::0;15560:10:::1;15574:13;6411:12:5::0;;6198:7;6395:13;:28;;6137:323;15574:13:1::1;15560:28;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;15632:4;15613:7;15621;15613:16;;;;;;;;;:::i;:::-;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;15660:1;15656:5;;15651:378;15667:1;15663;:5;;;15651:378;;;15746:5;::::0;::::1;::::0;15742:203:::1;;15818:1;15784:11;15796:1;15784:14;;;;;;;;;:::i;:::-;;;;15799:12;15812:1;15799:15;;;;;;;;;:::i;:::-;;;;;15784:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:35;;;15776:90;;;::::0;-1:-1:-1;;;15776:90:1;;21363:2:15;15776:90:1::1;::::0;::::1;21345:21:15::0;21402:2;21382:18;;;21375:30;21441:34;21421:18;;;21414:62;-1:-1:-1;;;21492:18:15;;;21485:40;21542:19;;15776:90:1::1;21161:406:15::0;15776:90:1::1;15924:1;15889:11;15901:1;15889:14;;;;;;;;;:::i;:::-;;;;15904:12;15917:1;15904:15;;;;;;;;;:::i;:::-;;;;;15889:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15742:203;15998:12;16011:1;15998:15;;;;;;;;;:::i;:::-;;;;;15963:10;15974:1;15978;15974:5;15963:17;;;;;;;;;:::i;:::-;;;;15981:13;6411:12:5::0;;6198:7;6395:13;:28;;6137:323;15981:13:1::1;15963:32;;;;;;;:::i;:::-;;;;;;;;;;;;:50;;;;;;;;;;;;;;;;;;15675:1;15670:6;;;;15651:378;;;16052:24;16062:10;16074:1;16052:9;:24::i;:::-;13704:2377;;;2571:20:13::0;1860:1;3116:7;:22;2933:213;2571:20;13600:2481:1;;;:::o;17961:204::-;1752:6:11;;-1:-1:-1;;;;;1752:6:11;21042:10:1;:21;;:44;;-1:-1:-1;21081:5:1;;-1:-1:-1;;;;;21081:5:1;21067:10;:19;21042:44;21034:80;;;;-1:-1:-1;;;21034:80:1;;;;;;;:::i;:::-;18054:8:::1;18049:109;18072:6;:13;18068:1;:17;;;18049:109;;;18137:6;18144:1;18137:9;;;;;;;;;;:::i;:::-;;;;;;;18110:11;18122:8;18110:21;;;;;;;;;:::i;:::-;;;;18132:1;18110:24;;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;18092:1;18087:6;;;;;:::i;:::-;;;18049:109;;19353:81:::0;1752:6:11;;-1:-1:-1;;;;;1752:6:11;21042:10:1;:21;;:44;;-1:-1:-1;21081:5:1;;-1:-1:-1;;;;;21081:5:1;21067:10;:19;21042:44;21034:80;;;;-1:-1:-1;;;21034:80:1;;;;;;;:::i;:::-;19413:6:::1;:16:::0;;;::::1;;-1:-1:-1::0;;;19413:16:1::1;-1:-1:-1::0;;;;19413:16:1;;::::1;::::0;;;::::1;::::0;;19353:81::o;6035:671:12:-;-1:-1:-1;;;;;6111:16:12;;6130:1;6111:16;;;:7;:16;;;;;;6103:71;;;;-1:-1:-1;;;6103:71:12;;;;;;;:::i;:::-;6187:15;6205:19;6216:7;6205:10;:19::i;:::-;6187:37;;6245:7;6256:1;6245:12;6237:68;;;;-1:-1:-1;;;6237:68:12;;;;;;;:::i;:::-;6518:7;6500:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;6561:18:12;;;;;;:9;:18;;;;;:29;;;;;;6614:35;6571:7;6583;6614:17;:35::i;:::-;6665:33;;;-1:-1:-1;;;;;206:32:15;;188:51;;270:2;255:18;;248:34;;;6665:33:12;;161:18:15;6665:33:12;;;;;;;6092:614;6035:671;:::o;20524:2825:5:-;20666:27;20696;20715:7;20696:18;:27::i;:::-;20666:57;;20781:4;-1:-1:-1;;;;;20740:45:5;20756:19;-1:-1:-1;;;;;20740:45:5;;20736:86;;20794:28;;-1:-1:-1;;;20794:28:5;;;;;;;;;;;20736:86;20836:27;19632:24;;;:15;:24;;;;;19860:26;;836:10:2;19257:30:5;;;-1:-1:-1;;;;;18950:28:5;;19235:20;;;19232:56;21022:180;;21115:43;21132:4;836:10:2;17834:164:5;:::i;21115:43::-;21110:92;;21167:35;;-1:-1:-1;;;21167:35:5;;;;;;;;;;;21110:92;-1:-1:-1;;;;;21219:16:5;;21215:52;;21244:23;;-1:-1:-1;;;21244:23:5;;;;;;;;;;;21215:52;21416:15;21413:160;;;21556:1;21535:19;21528:30;21413:160;-1:-1:-1;;;;;21953:24:5;;;;;;;:18;:24;;;;;;21951:26;;-1:-1:-1;;21951:26:5;;;22022:22;;;;;;;;;22020:24;;-1:-1:-1;22020:24:5;;;15176:11;15151:23;15147:41;15134:63;-1:-1:-1;;;15134:63:5;22315:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;22610:47:5;;:52;;22606:627;;22715:1;22705:11;;22683:19;22838:30;;;:17;:30;;;;;;:35;;22834:384;;22976:13;;22961:11;:28;22957:242;;23123:30;;;;:17;:30;;;;;:52;;;22957:242;22664:569;22606:627;23280:7;23276:2;-1:-1:-1;;;;;23261:27:5;23270:4;-1:-1:-1;;;;;23261:27:5;;;;;;;;;;;23299:42;20655:2694;;;20524:2825;;;:::o;2498:429:4:-;2584:7;2642:26;;;:17;:26;;;;;;;;2613:55;;;;;;;;;-1:-1:-1;;;;;2613:55:4;;;;;-1:-1:-1;;;2613:55:4;;;-1:-1:-1;;;;;2613:55:4;;;;;;;;2584:7;;2681:92;;-1:-1:-1;2732:29:4;;;;;;;;;2742:19;2732:29;-1:-1:-1;;;;;2732:29:4;;;;-1:-1:-1;;;2732:29:4;;-1:-1:-1;;;;;2732:29:4;;;;;2681:92;2822:23;;;;2785:21;;3293:5;;2810:35;;-1:-1:-1;;;;;2810:35:4;:9;:35;:::i;:::-;2809:57;;;;:::i;:::-;2887:16;;;-1:-1:-1;2785:81:4;;-1:-1:-1;;2498:429:4;;;;;;:::o;16855:770:1:-;16898:6;16917:10;16938:8;16959:12;17037:4;17016:15;16999:33;;;;;;23410:19:15;;23454:2;23445:12;;23281:182;16999:33:1;;;;;;;;;;;;;16989:44;;;;;;16981:53;;:60;;;;:::i;:::-;16959:83;;17065:4;17057:5;:12;;;:26;;;;17081:2;17073:5;:10;;;17057:26;17053:71;;;-1:-1:-1;17108:4:1;17053:71;17145:5;17141:9;;17136:157;17156:5;17152:1;:9;;;17136:157;;;17190:7;17198:1;17190:10;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:19;;17204:5;17190:19;17186:96;;17238:4;17230:12;;17261:5;;17186:96;17163:6;17168:1;17163:6;;:::i;:::-;;;17136:157;;;17307:14;;;17316:5;17307:14;17303:219;;17347:5;17343:9;;17338:173;17354:5;;;;17338:173;;17392:7;17400:1;17392:10;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:19;;17406:5;17392:19;17388:108;;17444:4;17436:12;;17471:5;;17388:108;17361:6;17366:1;17361:6;;:::i;:::-;;;17338:173;;;17551:4;17542:13;;;;17534:64;;;;-1:-1:-1;;;17534:64:1;;23787:2:15;17534:64:1;;;23769:21:15;23826:2;23806:18;;;23799:30;23865:34;23845:18;;;23838:62;-1:-1:-1;;;23916:18:15;;;23909:36;23962:19;;17534:64:1;23585:402:15;17534:64:1;-1:-1:-1;17616:1:1;16855:770;-1:-1:-1;;16855:770:1:o;23445:193:5:-;23591:39;23608:4;23614:2;23618:7;23591:39;;;;;;;;;;;;:16;:39::i;19236:82:1:-;1752:6:11;;-1:-1:-1;;;;;1752:6:11;21042:10:1;:21;;:44;;-1:-1:-1;21081:5:1;;-1:-1:-1;;;;;21081:5:1;21067:10;:19;21042:44;21034:80;;;;-1:-1:-1;;;21034:80:1;;;;;;;:::i;:::-;19298:4:::1;:15:::0;19236:82::o;6974:792:12:-;-1:-1:-1;;;;;7056:16:12;;7075:1;7056:16;;;:7;:16;;;;;;7048:71;;;;-1:-1:-1;;;7048:71:12;;;;;;;:::i;:::-;7132:15;7150:26;7161:5;7168:7;7150:10;:26::i;:::-;7132:44;;7197:7;7208:1;7197:12;7189:68;;;;-1:-1:-1;;;7189:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;7512:26:12;;;;;;:19;:26;;;;;:37;;7542:7;;7512:26;:37;;7542:7;;7512:37;:::i;:::-;;;;-1:-1:-1;;;;;;;7585:21:12;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;:41;;;;;;7650:47;7600:5;7607:7;7619;7650:22;:47::i;:::-;7713:45;;;-1:-1:-1;;;;;206:32:15;;;188:51;;270:2;255:18;;248:34;;;7713:45:12;;;;;161:18:15;7713:45:12;;;;;;;7037:729;6974:792;;:::o;19641:174:1:-;1752:6:11;;-1:-1:-1;;;;;1752:6:11;21042:10:1;:21;;:44;;-1:-1:-1;21081:5:1;;-1:-1:-1;;;;;21081:5:1;21067:10;:19;21042:44;21034:80;;;;-1:-1:-1;;;21034:80:1;;;;;;;:::i;:::-;19728:9:::1;::::0;-1:-1:-1;;;19728:9:1;::::1;;;:18;19720:53;;;::::0;-1:-1:-1;;;19720:53:1;;24194:2:15;19720:53:1::1;::::0;::::1;24176:21:15::0;24233:2;24213:18;;;24206:30;-1:-1:-1;;;24252:18:15;;;24245:52;24314:18;;19720:53:1::1;23992:346:15::0;19720:53:1::1;19784:7;:23;19794:13:::0;19784:7;:23:::1;:::i;20461:125::-:0;1752:6:11;;-1:-1:-1;;;;;1752:6:11;21042:10:1;:21;;:44;;-1:-1:-1;21081:5:1;;-1:-1:-1;;;;;21081:5:1;21067:10;:19;21042:44;21034:80;;;;-1:-1:-1;;;21034:80:1;;;;;;;:::i;:::-;20547:31:::1;20561:7;20570;20547:13;:31::i;12891:33::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18259:308::-;18318:27;;:::i;:::-;18363:8;18358:202;18381:3;18377:1;:7;;;18358:202;;;18419:10;18430:8;18419:20;;;;;;;;;:::i;:::-;;;;18440:1;18419:23;;;;;;;;;:::i;:::-;;18413:37;;;;;:::i;:::-;18409:88;;-1:-1:-1;18476:5:1;18409:88;18525:10;18536:8;18525:20;;;;;;;;;:::i;:::-;;;;18546:1;18525:23;;;;;;;;;:::i;:::-;;18511:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;18520:1;18511:11;;;;;;;;;:::i;:::-;;;;:37;18386:6;18391:1;18386:6;;:::i;:::-;;;18358:202;;;;18259:308;;;:::o;18945:253::-;18998:6;19006:13;;;19070:10;:17;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;19089:10;;19103:13;;:17;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;19089:32;;;;;;;;;:::i;:::-;;19123:13;19137;:17;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;19123:32;;;;;;;;;:::i;:::-;;19157:13;19171;:17;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;19157:32;;;;;;;;;:::i;:::-;;19062:128;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18945:253;;;;;:::o;17687:199::-;1752:6:11;;-1:-1:-1;;;;;1752:6:11;21042:10:1;:21;;:44;;-1:-1:-1;21081:5:1;;-1:-1:-1;;;;;21081:5:1;21067:10;:19;21042:44;21034:80;;;;-1:-1:-1;;;21034:80:1;;;;;;;:::i;:::-;17778:8:::1;17773:106;17796:5;:12;17792:1;:16;;;17773:106;;;17859:5;17865:1;17859:8;;;;;;;;;;:::i;:::-;;;;;;;17833:10;17844:8;17833:20;;;;;;;;;:::i;:::-;;;;17854:1;17833:23;;;;;;;;;:::i;:::-;;::::0;:34:::1;::::0;:23;:34:::1;:::i;:::-;-1:-1:-1::0;17810:6:1::1;17815:1;17810:6:::0;::::1;:::i;:::-;;;17773:106;;11787:152:5::0;11859:7;11902:27;11921:7;11902:18;:27::i;18661:214:1:-;18723:29;;:::i;:::-;18770:8;18765:103;18788:3;18784:1;:7;;;18765:103;;;18832:11;18844:8;18832:21;;;;;;;;;:::i;:::-;;;;18854:1;18832:24;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;18816:10;18827:1;18816:13;;;;;;;;;:::i;:::-;:40;;;;:13;;;;;;:40;18793:6;18798:1;18793:6;;:::i;:::-;;;18765:103;;12778:68;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19471:90::-;1565:13:11;:11;:13::i;:::-;19537:5:1::1;:16:::0;;-1:-1:-1;;;;;;19537:16:1::1;-1:-1:-1::0;;;;;19537:16:1;;;::::1;::::0;;;::::1;::::0;;19471:90::o;7321:233:5:-;7393:7;-1:-1:-1;;;;;7417:19:5;;7413:60;;7445:28;;-1:-1:-1;;;7445:28:5;;;;;;;;;;;7413:60;-1:-1:-1;;;;;;7491:25:5;;;;;:18;:25;;;;;;-1:-1:-1;;;;;7491:55:5;;7321:233::o;2354:103:11:-;1565:13;:11;:13::i;:::-;2419:30:::1;2446:1;2419:18;:30::i;:::-;2354:103::o:0;12931:32:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12931:32:1;;-1:-1:-1;12931:32:1;:::i;5000:100:12:-;5051:7;5078;5086:5;5078:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;5078:14:12;;5000:100;-1:-1:-1;;5000:100:12:o;10562:104:5:-;10618:13;10651:7;10644:14;;;;;:::i;20118:292:1:-;1752:6:11;;-1:-1:-1;;;;;1752:6:11;21042:10:1;:21;;:44;;-1:-1:-1;21081:5:1;;-1:-1:-1;;;;;21081:5:1;21067:10;:19;21042:44;21034:80;;;;-1:-1:-1;;;21034:80:1;;;;;;;:::i;:::-;20205:9:::1;::::0;::::1;::::0;;::::1;20196:18:::0;;::::1;;20188:86;;;::::0;-1:-1:-1;;;20188:86:1;;26749:2:15;20188:86:1::1;::::0;::::1;26731:21:15::0;26788:2;26768:18;;;26761:30;26827:34;26807:18;;;26800:62;26898:25;26878:18;;;26871:53;26941:19;;20188:86:1::1;26547:419:15::0;20188:86:1::1;6411:12:5::0;;6198:7;6395:13;:28;20293:6:1::1;:23;;;;20285:88;;;::::0;-1:-1:-1;;;20285:88:1;;27173:2:15;20285:88:1::1;::::0;::::1;27155:21:15::0;27212:2;27192:18;;;27185:30;27251:34;27231:18;;;27224:62;-1:-1:-1;;;27302:18:15;;;27295:50;27362:19;;20285:88:1::1;26971:416:15::0;20285:88:1::1;20384:9;:18:::0;;-1:-1:-1;;20384:18:1::1;;::::0;;;::::1;::::0;;;::::1;::::0;;20118:292::o;16269:310::-;1752:6:11;;-1:-1:-1;;;;;1752:6:11;21042:10:1;:21;;:44;;-1:-1:-1;21081:5:1;;-1:-1:-1;;;;;21081:5:1;21067:10;:19;21042:44;21034:80;;;;-1:-1:-1;;;21034:80:1;;;;;;;:::i;:::-;16377:32;;::::1;16369:91;;;::::0;-1:-1:-1;;;16369:91:1;;27594:2:15;16369:91:1::1;::::0;::::1;27576:21:15::0;27633:2;27613:18;;;27606:30;27672:34;27652:18;;;27645:62;-1:-1:-1;;;27723:18:15;;;27716:45;27778:19;;16369:91:1::1;27392:411:15::0;16369:91:1::1;16476:6;16471:101;16488:17:::0;;::::1;16471:101;;;16549:8;;16558:1;16549:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;16527:8;:19;16536:6;;16543:1;16536:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;16527:19:1::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;16527:19:1;:33;;-1:-1:-1;;16527:33:1::1;;::::0;;;::::1;::::0;;;::::1;::::0;;16507:3;::::1;::::0;::::1;:::i;:::-;;;;16471:101;;;;16269:310:::0;;;;:::o;17443:234:5:-;836:10:2;17538:39:5;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;17538:49:5;;;;;;;;;;;;:60;;-1:-1:-1;;17538:60:5;;;;;;;;;;17614:55;;819:41:15;;;17538:49:5;;836:10:2;17614:55:5;;792:18:15;17614:55:5;;;;;;;17443:234;;:::o;5190:225:12:-;5248:7;5268:21;5316:15;3903:14;;;3830:95;5316:15;5292:39;;5300:4;5292:21;:39;:::i;:::-;5268:63;;5349:58;5365:7;5374:13;5389:17;5398:7;-1:-1:-1;;;;;4579:18:12;4552:7;4579:18;;;:9;:18;;;;;;;4496:109;5389:17;5349:15;:58::i;:::-;5342:65;5190:225;-1:-1:-1;;;5190:225:12:o;16137:95:1:-;1752:6:11;;-1:-1:-1;;;;;1752:6:11;21042:10:1;:21;;:44;;-1:-1:-1;21081:5:1;;-1:-1:-1;;;;;21081:5:1;21067:10;:19;21042:44;21034:80;;;;-1:-1:-1;;;21034:80:1;;;;;;;:::i;:::-;16205:10:::1;:19;16218:6:::0;;16205:10;:19:::1;:::i;24236:407:5:-:0;24411:31;24424:4;24430:2;24434:7;24411:12;:31::i;:::-;-1:-1:-1;;;;;24457:14:5;;;:19;24453:183;;24496:56;24527:4;24533:2;24537:7;24546:5;24496:30;:56::i;:::-;24491:145;;24580:40;;-1:-1:-1;;;24580:40:5;;;;;;;;;;;24491:145;24236:407;;;;:::o;5575:260:12:-;-1:-1:-1;;;;;4167:26:12;;5647:7;4167:26;;;:19;:26;;;;;;5647:7;;5691:30;;-1:-1:-1;;;5691:30:12;;5715:4;5691:30;;;2534:51:15;-1:-1:-1;;;;;5691:15:12;;;;;2507:18:15;;5691:30:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;-1:-1:-1;;;;;4871:21:12;;;4844:7;4871:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;5667:77;;-1:-1:-1;5762:65:12;;5778:7;;5667:77;;5349:15;:58::i;5762:65::-;5755:72;5575:260;-1:-1:-1;;;;5575:260:12:o;10772:326:5:-;10845:13;10876:16;10884:7;10876;:16::i;:::-;10871:59;;10901:29;;-1:-1:-1;;;10901:29:5;;;;;;;;;;;10871:59;10943:21;10967:10;:8;:10::i;:::-;10943:34;;11001:7;10995:21;11020:1;10995:26;:95;;;;;;;;;;;;;;;;;11048:7;11057:18;11067:7;11057:9;:18::i;:::-;11031:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10988:102;10772:326;-1:-1:-1;;;10772:326:5:o;12611:26:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2612:220:11:-;1565:13;:11;:13::i;:::-;-1:-1:-1;;;;;2697:22:11;::::1;2693:93;;2743:31;::::0;-1:-1:-1;;;2743:31:11;;2771:1:::1;2743:31;::::0;::::1;2534:51:15::0;2507:18;;2743:31:11::1;2388:203:15::0;2693:93:11::1;2796:28;2815:8;2796:18;:28::i;:::-;2612:220:::0;:::o;2228:215:4:-;2330:4;-1:-1:-1;;;;;;2354:41:4;;-1:-1:-1;;;2354:41:4;;:81;;-1:-1:-1;;;;;;;;;;982:40:3;;;2399:36:4;882:148:3;3577:518:4;3293:5;-1:-1:-1;;;;;3726:26:4;;;-1:-1:-1;3722:176:4;;;3831:55;;-1:-1:-1;;;3831:55:4;;-1:-1:-1;;;;;30207:39:15;;3831:55:4;;;30189:58:15;30263:18;;;30256:34;;;30162:18;;3831:55:4;30016:280:15;3722:176:4;-1:-1:-1;;;;;3912:22:4;;3908:110;;3958:48;;-1:-1:-1;;;3958:48:4;;4003:1;3958:48;;;2534:51:15;2507:18;;3958:48:4;2388:203:15;3908:110:4;-1:-1:-1;4052:35:4;;;;;;;;;-1:-1:-1;;;;;4052:35:4;;;;;;-1:-1:-1;;;;;4052:35:4;;;;;;;;;;-1:-1:-1;;;4030:57:4;;;;:19;:57;3577:518::o;18256:282:5:-;18321:4;18411:13;;18401:7;:23;18358:153;;;;-1:-1:-1;;18462:26:5;;;;:17;:26;;;;;;-1:-1:-1;;;18462:44:5;:49;;18256:282::o;2607:318:13:-;1904:1;2737:7;;:19;2733:89;;2780:30;;-1:-1:-1;;;2780:30:13;;;;;;;;;;;2733:89;1904:1;2899:7;:18;2607:318::o;16638:174:1:-;16714:4;16800:2;16783:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;16773:31;;;;;;16765:2;16748:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;16738:31;;;;;;:66;16731:73;;16638:174;;;;:::o;34396:112:5:-;34473:27;34483:2;34487:8;34473:27;;;;;;;;;;;;:9;:27::i;1669:340:0:-;1763:4;1755:21;:30;-1:-1:-1;1751:111:0;;;1809:41;;-1:-1:-1;;;1809:41:0;;1844:4;1809:41;;;2534:51:15;2507:18;;1809:41:0;2388:203:15;1751:111:0;1875:12;1893:9;-1:-1:-1;;;;;1893:14:0;1915:6;1893:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1874:52;;;1942:7;1937:65;;1973:17;;-1:-1:-1;;;1973:17:0;;;;;;;;;;;12942:1275:5;13009:7;13044;13146:13;;13139:4;:20;13135:1015;;;13184:14;13201:23;;;:17;:23;;;;;;;-1:-1:-1;;;13290:24:5;;:29;;13286:845;;13955:113;13962:6;13972:1;13962:11;13955:113;;-1:-1:-1;;;14033:6:5;14015:25;;;;:17;:25;;;;;;13955:113;;13286:845;13161:989;13135:1015;14178:31;;-1:-1:-1;;;14178:31:5;;;;;;;;;;;1425:162:14;1535:43;;;-1:-1:-1;;;;;206:32:15;;1535:43:14;;;188:51:15;255:18;;;;248:34;;;1535:43:14;;;;;;;;;;161:18:15;;;;1535:43:14;;;;;;;;-1:-1:-1;;;;;1535:43:14;-1:-1:-1;;;1535:43:14;;;1508:71;;1528:5;;1508:19;:71::i;8914:255:12:-;-1:-1:-1;;;;;9031:16:12;;;;;;:7;:16;;;;;;9006:12;;:22;;9021:7;;9006:22;:::i;:::-;:41;;;;:::i;:::-;8991:12;:56;;;9058:66;;;;-1:-1:-1;;;9058:66:12;;31140:2:15;9058:66:12;;;31122:21:15;31179:2;31159:18;;;31152:30;31218:34;31198:18;;;31191:62;-1:-1:-1;;;31269:18:15;;;31262:35;31314:19;;9058:66:12;30938:401:15;9058:66:12;-1:-1:-1;;;;;9135:16:12;;;;;;;:7;:16;;;;;:26;8914:255::o;1844:166:11:-;1752:6;;-1:-1:-1;;;;;1752:6:11;836:10:2;1904:23:11;1900:103;;1951:40;;-1:-1:-1;;;1951:40:11;;836:10:2;1951:40:11;;;2534:51:15;2507:18;;1951:40:11;2388:203:15;2992:191:11;3085:6;;;-1:-1:-1;;;;;3102:17:11;;;-1:-1:-1;;;;;;3102:17:11;;;;;;;3135:40;;3085:6;;;3102:17;3085:6;;3135:40;;3066:16;;3135:40;3055:128;2992:191;:::o;7944:248:12:-;8154:12;;-1:-1:-1;;;;;8134:16:12;;8090:7;8134:16;;;:7;:16;;;;;;8090:7;;8169:15;;8118:32;;:13;:32;:::i;:::-;8117:49;;;;:::i;:::-;:67;;;;:::i;26727:716:5:-;26911:88;;-1:-1:-1;;;26911:88:5;;26890:4;;-1:-1:-1;;;;;26911:45:5;;;;;:88;;836:10:2;;26978:4:5;;26984:7;;26993:5;;26911:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26911:88:5;;;;;;;;-1:-1:-1;;26911:88:5;;;;;;;;;;;;:::i;:::-;;;26907:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27194:6;:13;27211:1;27194:18;27190:235;;27240:40;;-1:-1:-1;;;27240:40:5;;;;;;;;;;;27190:235;27383:6;27377:13;27368:6;27364:2;27360:15;27353:38;26907:529;-1:-1:-1;;;;;;27070:64:5;-1:-1:-1;;;27070:64:5;;-1:-1:-1;26727:716:5;;;;;;:::o;19967:108:1:-;20027:13;20060:7;20053:14;;;;;:::i;40771:1745:5:-;40836:17;41270:4;41263;41257:11;41253:22;41362:1;41356:4;41349:15;41437:4;41434:1;41430:12;41423:19;;;41519:1;41514:3;41507:14;41623:3;41862:5;41844:428;41910:1;41905:3;41901:11;41894:18;;42081:2;42075:4;42071:13;42067:2;42063:22;42058:3;42050:36;42175:2;42165:13;;42232:25;41844:428;42232:25;-1:-1:-1;42302:13:5;;;-1:-1:-1;;42417:14:5;;;42479:19;;;42417:14;40771:1745;-1:-1:-1;40771:1745:5:o;33623:689::-;33754:19;33760:2;33764:8;33754:5;:19::i;:::-;-1:-1:-1;;;;;33815:14:5;;;:19;33811:483;;33855:11;33869:13;33917:14;;;33950:233;33981:62;34020:1;34024:2;34028:7;;;;;;34037:5;33981:30;:62::i;:::-;33976:167;;34079:40;;-1:-1:-1;;;34079:40:5;;;;;;;;;;;33976:167;34178:3;34170:5;:11;33950:233;;34265:3;34248:13;;:20;34244:34;;34270:8;;;4913:638:14;5337:23;5363:33;-1:-1:-1;;;;;5363:27:14;;5391:4;5363:27;:33::i;:::-;5337:59;;5411:10;:17;5432:1;5411:22;;:57;;;;;5449:10;5438:30;;;;;;;;;;;;:::i;:::-;5437:31;5411:57;5407:137;;;5492:40;;-1:-1:-1;;;5492:40:14;;-1:-1:-1;;;;;2552:32:15;;5492:40:14;;;2534:51:15;2507:18;;5492:40:14;2388:203:15;27905:2966:5;27978:20;28001:13;;;28029;;;28025:44;;28051:18;;-1:-1:-1;;;28051:18:5;;;;;;;;;;;28025:44;-1:-1:-1;;;;;28557:22:5;;;;;;:18;:22;;;;1618:2;28557:22;;;:71;;28595:32;28583:45;;28557:71;;;28871:31;;;:17;:31;;;;;-1:-1:-1;15607:15:5;;15581:24;15577:46;15176:11;15151:23;15147:41;15144:52;15134:63;;28871:173;;29106:23;;;;28871:31;;28557:22;;29871:25;28557:22;;29724:335;30385:1;30371:12;30367:20;30325:346;30426:3;30417:7;30414:16;30325:346;;30644:7;30634:8;30631:1;30604:25;30601:1;30598;30593:59;30479:1;30466:15;30325:346;;;30329:77;30704:8;30716:1;30704:13;30700:45;;30726:19;;-1:-1:-1;;;30726:19:5;;;;;;;;;;;30700:45;30762:13;:19;-1:-1:-1;13600:2481:1;;;:::o;2731:168:0:-;2806:12;2838:53;2860:6;2868:4;2874:1;2877:13;2838:21;:53::i;8471:82::-;8528:17;;-1:-1:-1;;;8528:17:0;;;;;;;;;;;4270:494;4451:12;4488:4;4480:21;:29;-1:-1:-1;4476:110:0;;;4533:41;;-1:-1:-1;;;4533:41:0;;4568:4;4533:41;;;2534:51:15;2507:18;;4533:41:0;2388:203:15;4476:110:0;4597:12;4611:23;4638:6;-1:-1:-1;;;;;4638:11:0;4657:5;4664:4;4638:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4596:73;;;;4687:69;4714:6;4722:7;4731:10;4743:12;4687:26;:69::i;:::-;4680:76;4270:494;-1:-1:-1;;;;;;;4270:494:0:o;6661:710::-;6857:12;6886:7;6882:482;;;6914:10;:17;6935:1;6914:22;6910:345;;7141:6;-1:-1:-1;;;;;7141:18:0;;7163:1;7141:23;7137:103;;7196:24;;-1:-1:-1;;;7196:24:0;;-1:-1:-1;;;;;2552:32:15;;7196:24:0;;;2534:51:15;2507:18;;7196:24:0;2388:203:15;7137:103:0;-1:-1:-1;7276:10:0;7269:17;;6882:482;7319:33;7327:10;7339:12;8733:17;;:21;8729:421;;8965:10;8959:17;9022:15;9009:10;9005:2;9001:19;8994:44;8729:421;9085:14;:12;:14;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;293:131:15:-;-1:-1:-1;;;;;;367:32:15;;357:43;;347:71;;414:1;411;404:12;429:245;487:6;540:2;528:9;519:7;515:23;511:32;508:52;;;556:1;553;546:12;508:52;595:9;582:23;614:30;638:5;614:30;:::i;871:131::-;-1:-1:-1;;;;;946:31:15;;936:42;;926:70;;992:1;989;982:12;1007:435;1074:6;1082;1135:2;1123:9;1114:7;1110:23;1106:32;1103:52;;;1151:1;1148;1141:12;1103:52;1190:9;1177:23;1209:31;1234:5;1209:31;:::i;:::-;1259:5;-1:-1:-1;1316:2:15;1301:18;;1288:32;-1:-1:-1;;;;;1351:40:15;;1339:53;;1329:81;;1406:1;1403;1396:12;1329:81;1429:7;1419:17;;;1007:435;;;;;:::o;1447:250::-;1532:1;1542:113;1556:6;1553:1;1550:13;1542:113;;;1632:11;;;1626:18;1613:11;;;1606:39;1578:2;1571:10;1542:113;;;-1:-1:-1;;1689:1:15;1671:16;;1664:27;1447:250::o;1702:271::-;1744:3;1782:5;1776:12;1809:6;1804:3;1797:19;1825:76;1894:6;1887:4;1882:3;1878:14;1871:4;1864:5;1860:16;1825:76;:::i;:::-;1955:2;1934:15;-1:-1:-1;;1930:29:15;1921:39;;;;1962:4;1917:50;;1702:271;-1:-1:-1;;1702:271:15:o;1978:220::-;2127:2;2116:9;2109:21;2090:4;2147:45;2188:2;2177:9;2173:18;2165:6;2147:45;:::i;2203:180::-;2262:6;2315:2;2303:9;2294:7;2290:23;2286:32;2283:52;;;2331:1;2328;2321:12;2283:52;-1:-1:-1;2354:23:15;;2203:180;-1:-1:-1;2203:180:15:o;2596:315::-;2664:6;2672;2725:2;2713:9;2704:7;2700:23;2696:32;2693:52;;;2741:1;2738;2731:12;2693:52;2780:9;2767:23;2799:31;2824:5;2799:31;:::i;:::-;2849:5;2901:2;2886:18;;;;2873:32;;-1:-1:-1;;;2596:315:15:o;2916:159::-;2983:20;;3043:6;3032:18;;3022:29;;3012:57;;3065:1;3062;3055:12;3012:57;2916:159;;;:::o;3080:127::-;3141:10;3136:3;3132:20;3129:1;3122:31;3172:4;3169:1;3162:15;3196:4;3193:1;3186:15;3212:251;3284:2;3278:9;3326:2;3314:15;;-1:-1:-1;;;;;3344:34:15;;3380:22;;;3341:62;3338:88;;;3406:18;;:::i;:::-;3442:2;3435:22;3212:251;:::o;3468:275::-;3539:2;3533:9;3604:2;3585:13;;-1:-1:-1;;3581:27:15;3569:40;;-1:-1:-1;;;;;3624:34:15;;3660:22;;;3621:62;3618:88;;;3686:18;;:::i;:::-;3722:2;3715:22;3468:275;;-1:-1:-1;3468:275:15:o;3748:407::-;3813:5;-1:-1:-1;;;;;3839:6:15;3836:30;3833:56;;;3869:18;;:::i;:::-;3907:57;3952:2;3931:15;;-1:-1:-1;;3927:29:15;3958:4;3923:40;3907:57;:::i;:::-;3898:66;;3987:6;3980:5;3973:21;4027:3;4018:6;4013:3;4009:16;4006:25;4003:45;;;4044:1;4041;4034:12;4003:45;4093:6;4088:3;4081:4;4074:5;4070:16;4057:43;4147:1;4140:4;4131:6;4124:5;4120:18;4116:29;4109:40;3748:407;;;;;:::o;4160:222::-;4203:5;4256:3;4249:4;4241:6;4237:17;4233:27;4223:55;;4274:1;4271;4264:12;4223:55;4296:80;4372:3;4363:6;4350:20;4343:4;4335:6;4331:17;4296:80;:::i;4387:1243::-;4506:6;4514;4522;4575:2;4563:9;4554:7;4550:23;4546:32;4543:52;;;4591:1;4588;4581:12;4543:52;4614:28;4632:9;4614:28;:::i;:::-;4604:38;;4661:2;4714;4703:9;4699:18;4686:32;-1:-1:-1;;;;;4778:2:15;4770:6;4767:14;4764:34;;;4794:1;4791;4784:12;4764:34;4832:6;4821:9;4817:22;4807:32;;4877:7;4870:4;4866:2;4862:13;4858:27;4848:55;;4899:1;4896;4889:12;4848:55;4923:22;;:::i;:::-;4967:3;5001:2;4997;4993:11;5027:7;5019:6;5016:19;5013:39;;;5048:1;5045;5038:12;5013:39;5072:2;5083:344;5099:6;5094:3;5091:15;5083:344;;;5185:3;5172:17;5221:2;5208:11;5205:19;5202:109;;;5265:1;5294:2;5290;5283:14;5202:109;5336:48;5376:7;5362:11;5358:2;5354:20;5336:48;:::i;:::-;5324:61;;-1:-1:-1;5405:12:15;;;;5116;;5083:344;;;-1:-1:-1;5446:5:15;;-1:-1:-1;;;5504:2:15;5489:18;;5476:32;;-1:-1:-1;5520:16:15;;;5517:36;;;5549:1;5546;5539:12;5517:36;;;5572:52;5616:7;5605:8;5594:9;5590:24;5572:52;:::i;:::-;5562:62;;;4387:1243;;;;;:::o;5817:182::-;5876:4;-1:-1:-1;;;;;5901:6:15;5898:30;5895:56;;;5931:18;;:::i;:::-;-1:-1:-1;5976:1:15;5972:14;5988:4;5968:25;;5817:182::o;6004:966::-;6095:6;6103;6156:2;6144:9;6135:7;6131:23;6127:32;6124:52;;;6172:1;6169;6162:12;6124:52;6195:28;6213:9;6195:28;:::i;:::-;6185:38;;6242:2;6295;6284:9;6280:18;6267:32;-1:-1:-1;;;;;6314:6:15;6311:30;6308:50;;;6354:1;6351;6344:12;6308:50;6377:22;;6430:4;6422:13;;6418:27;-1:-1:-1;6408:55:15;;6459:1;6456;6449:12;6408:55;6495:2;6482:16;6518:59;6534:42;6573:2;6534:42;:::i;:::-;6518:59;:::i;:::-;6611:15;;;6693:1;6689:10;;;;6681:19;;6677:28;;;6642:12;;;;6717:19;;;6714:39;;;6749:1;6746;6739:12;6714:39;6773:11;;;;6793:147;6809:6;6804:3;6801:15;6793:147;;;6875:22;6893:3;6875:22;:::i;:::-;6863:35;;6826:12;;;;6918;;;;6793:147;;;6959:5;6949:15;;;;;;;6004:966;;;;;:::o;6975:118::-;7061:5;7054:13;7047:21;7040:5;7037:32;7027:60;;7083:1;7080;7073:12;7098:241;7154:6;7207:2;7195:9;7186:7;7182:23;7178:32;7175:52;;;7223:1;7220;7213:12;7175:52;7262:9;7249:23;7281:28;7303:5;7281:28;:::i;7344:255::-;7411:6;7464:2;7452:9;7443:7;7439:23;7435:32;7432:52;;;7480:1;7477;7470:12;7432:52;7519:9;7506:23;7538:31;7563:5;7538:31;:::i;7604:456::-;7681:6;7689;7697;7750:2;7738:9;7729:7;7725:23;7721:32;7718:52;;;7766:1;7763;7756:12;7718:52;7805:9;7792:23;7824:31;7849:5;7824:31;:::i;:::-;7874:5;-1:-1:-1;7931:2:15;7916:18;;7903:32;7944:33;7903:32;7944:33;:::i;:::-;7604:456;;7996:7;;-1:-1:-1;;;8050:2:15;8035:18;;;;8022:32;;7604:456::o;8510:248::-;8578:6;8586;8639:2;8627:9;8618:7;8614:23;8610:32;8607:52;;;8655:1;8652;8645:12;8607:52;-1:-1:-1;;8678:23:15;;;8748:2;8733:18;;;8720:32;;-1:-1:-1;8510:248:15:o;8763:403::-;8846:6;8854;8907:2;8895:9;8886:7;8882:23;8878:32;8875:52;;;8923:1;8920;8913:12;8875:52;8962:9;8949:23;8981:31;9006:5;8981:31;:::i;:::-;9031:5;-1:-1:-1;9088:2:15;9073:18;;9060:32;9101:33;9060:32;9101:33;:::i;9171:322::-;9240:6;9293:2;9281:9;9272:7;9268:23;9264:32;9261:52;;;9309:1;9306;9299:12;9261:52;9349:9;9336:23;-1:-1:-1;;;;;9374:6:15;9371:30;9368:50;;;9414:1;9411;9404:12;9368:50;9437;9479:7;9470:6;9459:9;9455:22;9437:50;:::i;9498:184::-;9556:6;9609:2;9597:9;9588:7;9584:23;9580:32;9577:52;;;9625:1;9622;9615:12;9577:52;9648:28;9666:9;9648:28;:::i;9687:694::-;9878:2;9930:21;;;9849:4;;10037;10022:20;;9903:18;;;10065:6;9849:4;10099:253;10113:4;10110:1;10107:11;10099:253;;;10204:2;10200:7;10188:9;10180:6;10176:22;10172:36;10167:3;10160:49;10232:40;10265:6;10256;10250:13;10232:40;:::i;:::-;10222:50;-1:-1:-1;10330:12:15;;;;10295:15;;;;10133:1;10126:9;10099:253;;;-1:-1:-1;10369:6:15;;9687:694;-1:-1:-1;;;;;;9687:694:15:o;10386:630::-;10669:6;10661;10657:19;10646:9;10639:38;10713:3;10708:2;10697:9;10693:18;10686:31;10620:4;10740:46;10781:3;10770:9;10766:19;10758:6;10740:46;:::i;:::-;10834:9;10826:6;10822:22;10817:2;10806:9;10802:18;10795:50;10868:33;10894:6;10886;10868:33;:::i;:::-;10854:47;;10949:9;10941:6;10937:22;10932:2;10921:9;10917:18;10910:50;10977:33;11003:6;10995;10977:33;:::i;11021:1204::-;11123:6;11131;11184:2;11172:9;11163:7;11159:23;11155:32;11152:52;;;11200:1;11197;11190:12;11152:52;11223:28;11241:9;11223:28;:::i;:::-;11213:38;;11270:2;11323;11312:9;11308:18;11295:32;-1:-1:-1;;;;;11387:2:15;11379:6;11376:14;11373:34;;;11403:1;11400;11393:12;11373:34;11441:6;11430:9;11426:22;11416:32;;11486:7;11479:4;11475:2;11471:13;11467:27;11457:55;;11508:1;11505;11498:12;11457:55;11544:2;11531:16;11567:59;11583:42;11622:2;11583:42;:::i;11567:59::-;11660:15;;;11742:1;11738:10;;;;11730:19;;11726:28;;;11691:12;;;;11766:19;;;11763:39;;;11798:1;11795;11788:12;11763:39;11830:2;11826;11822:11;11842:353;11858:6;11853:3;11850:15;11842:353;;;11944:3;11931:17;11980:2;11967:11;11964:19;11961:109;;;12024:1;12053:2;12049;12042:14;11961:109;12095:57;12144:7;12139:2;12125:11;12121:2;12117:20;12113:29;12095:57;:::i;:::-;12083:70;;-1:-1:-1;12173:12:15;;;;11875;;11842:353;;;11846:3;12214:5;12204:15;;;;;;;;11021:1204;;;;;:::o;12230:511::-;12412:4;12397:20;;12401:9;12494:6;12370:4;12528:207;12542:4;12539:1;12536:11;12528:207;;;12605:13;;12620:6;12601:26;12589:39;;12651:4;12675:12;;;;12710:15;;;;12562:1;12555:9;12528:207;;;12532:3;;;12230:511;;;;:::o;12746:367::-;12809:8;12819:6;12873:3;12866:4;12858:6;12854:17;12850:27;12840:55;;12891:1;12888;12881:12;12840:55;-1:-1:-1;12914:20:15;;-1:-1:-1;;;;;12946:30:15;;12943:50;;;12989:1;12986;12979:12;12943:50;13026:4;13018:6;13014:17;13002:29;;13086:3;13079:4;13069:6;13066:1;13062:14;13054:6;13050:27;13046:38;13043:47;13040:67;;;13103:1;13100;13093:12;13118:772;13239:6;13247;13255;13263;13316:2;13304:9;13295:7;13291:23;13287:32;13284:52;;;13332:1;13329;13322:12;13284:52;13372:9;13359:23;-1:-1:-1;;;;;13442:2:15;13434:6;13431:14;13428:34;;;13458:1;13455;13448:12;13428:34;13497:70;13559:7;13550:6;13539:9;13535:22;13497:70;:::i;:::-;13586:8;;-1:-1:-1;13471:96:15;-1:-1:-1;13674:2:15;13659:18;;13646:32;;-1:-1:-1;13690:16:15;;;13687:36;;;13719:1;13716;13709:12;13687:36;;13758:72;13822:7;13811:8;13800:9;13796:24;13758:72;:::i;:::-;13118:772;;;;-1:-1:-1;13849:8:15;-1:-1:-1;;;;13118:772:15:o;13895:382::-;13960:6;13968;14021:2;14009:9;14000:7;13996:23;13992:32;13989:52;;;14037:1;14034;14027:12;13989:52;14076:9;14063:23;14095:31;14120:5;14095:31;:::i;:::-;14145:5;-1:-1:-1;14202:2:15;14187:18;;14174:32;14215:30;14174:32;14215:30;:::i;14282:592::-;14353:6;14361;14414:2;14402:9;14393:7;14389:23;14385:32;14382:52;;;14430:1;14427;14420:12;14382:52;14470:9;14457:23;-1:-1:-1;;;;;14540:2:15;14532:6;14529:14;14526:34;;;14556:1;14553;14546:12;14526:34;14594:6;14583:9;14579:22;14569:32;;14639:7;14632:4;14628:2;14624:13;14620:27;14610:55;;14661:1;14658;14651:12;14610:55;14701:2;14688:16;14727:2;14719:6;14716:14;14713:34;;;14743:1;14740;14733:12;14713:34;14788:7;14783:2;14774:6;14770:2;14766:15;14762:24;14759:37;14756:57;;;14809:1;14806;14799:12;14756:57;14840:2;14832:11;;;;;14862:6;;-1:-1:-1;14282:592:15;;-1:-1:-1;;;;14282:592:15:o;14879:795::-;14974:6;14982;14990;14998;15051:3;15039:9;15030:7;15026:23;15022:33;15019:53;;;15068:1;15065;15058:12;15019:53;15107:9;15094:23;15126:31;15151:5;15126:31;:::i;:::-;15176:5;-1:-1:-1;15233:2:15;15218:18;;15205:32;15246:33;15205:32;15246:33;:::i;:::-;15298:7;-1:-1:-1;15352:2:15;15337:18;;15324:32;;-1:-1:-1;15407:2:15;15392:18;;15379:32;-1:-1:-1;;;;;15423:30:15;;15420:50;;;15466:1;15463;15456:12;15420:50;15489:22;;15542:4;15534:13;;15530:27;-1:-1:-1;15520:55:15;;15571:1;15568;15561:12;15520:55;15594:74;15660:7;15655:2;15642:16;15637:2;15633;15629:11;15594:74;:::i;:::-;15584:84;;;14879:795;;;;;;;:::o;16339:347::-;16541:2;16523:21;;;16580:2;16560:18;;;16553:30;16619:25;16614:2;16599:18;;16592:53;16677:2;16662:18;;16339:347::o;16691:380::-;16770:1;16766:12;;;;16813;;;16834:61;;16888:4;16880:6;16876:17;16866:27;;16834:61;16941:2;16933:6;16930:14;16910:18;16907:38;16904:161;;16987:10;16982:3;16978:20;16975:1;16968:31;17022:4;17019:1;17012:15;17050:4;17047:1;17040:15;17482:127;17543:10;17538:3;17534:20;17531:1;17524:31;17574:4;17571:1;17564:15;17598:4;17595:1;17588:15;17614:125;17679:9;;;17700:10;;;17697:36;;;17713:18;;:::i;18510:127::-;18571:10;18566:3;18562:20;18559:1;18552:31;18602:4;18599:1;18592:15;18626:4;18623:1;18616:15;19364:171;19432:6;19471:10;;;19459;;;19455:27;;19494:12;;;19491:38;;;19509:18;;:::i;21572:168::-;21639:6;21665:10;;;21677;;;21661:27;;21700:11;;;21697:37;;;21714:18;;:::i;21745:402::-;21947:2;21929:21;;;21986:2;21966:18;;;21959:30;22025:34;22020:2;22005:18;;21998:62;-1:-1:-1;;;22091:2:15;22076:18;;22069:36;22137:3;22122:19;;21745:402::o;22152:407::-;22354:2;22336:21;;;22393:2;22373:18;;;22366:30;22432:34;22427:2;22412:18;;22405:62;-1:-1:-1;;;22498:2:15;22483:18;;22476:41;22549:3;22534:19;;22152:407::o;22851:168::-;22924:9;;;22955;;22972:15;;;22966:22;;22952:37;22942:71;;22993:18;;:::i;23024:127::-;23085:10;23080:3;23076:20;23073:1;23066:31;23116:4;23113:1;23106:15;23140:4;23137:1;23130:15;23156:120;23196:1;23222;23212:35;;23227:18;;:::i;:::-;-1:-1:-1;23261:9:15;;23156:120::o;23468:112::-;23500:1;23526;23516:35;;23531:18;;:::i;:::-;-1:-1:-1;23565:9:15;;23468:112::o;24469:545::-;24571:2;24566:3;24563:11;24560:448;;;24607:1;24632:5;24628:2;24621:17;24677:4;24673:2;24663:19;24747:2;24735:10;24731:19;24728:1;24724:27;24718:4;24714:38;24783:4;24771:10;24768:20;24765:47;;;-1:-1:-1;24806:4:15;24765:47;24861:2;24856:3;24852:12;24849:1;24845:20;24839:4;24835:31;24825:41;;24916:82;24934:2;24927:5;24924:13;24916:82;;;24979:17;;;24960:1;24949:13;24916:82;;25190:1352;25316:3;25310:10;-1:-1:-1;;;;;25335:6:15;25332:30;25329:56;;;25365:18;;:::i;:::-;25394:97;25484:6;25444:38;25476:4;25470:11;25444:38;:::i;:::-;25438:4;25394:97;:::i;:::-;25546:4;;25610:2;25599:14;;25627:1;25622:663;;;;26329:1;26346:6;26343:89;;;-1:-1:-1;26398:19:15;;;26392:26;26343:89;-1:-1:-1;;25147:1:15;25143:11;;;25139:24;25135:29;25125:40;25171:1;25167:11;;;25122:57;26445:81;;25592:944;;25622:663;24416:1;24409:14;;;24453:4;24440:18;;-1:-1:-1;;25658:20:15;;;25776:236;25790:7;25787:1;25784:14;25776:236;;;25879:19;;;25873:26;25858:42;;25971:27;;;;25939:1;25927:14;;;;25806:19;;25776:236;;;25780:3;26040:6;26031:7;26028:19;26025:201;;;26101:19;;;26095:26;-1:-1:-1;;26184:1:15;26180:14;;;26196:3;26176:24;26172:37;26168:42;26153:58;26138:74;;26025:201;-1:-1:-1;;;;;26272:1:15;26256:14;;;26252:22;26239:36;;-1:-1:-1;25190:1352:15:o;27808:135::-;27847:3;27868:17;;;27865:43;;27888:18;;:::i;:::-;-1:-1:-1;27935:1:15;27924:13;;27808:135::o;27948:1206::-;-1:-1:-1;;;;;28067:3:15;28064:27;28061:53;;;28094:18;;:::i;:::-;28123:94;28213:3;28173:38;28205:4;28199:11;28173:38;:::i;:::-;28167:4;28123:94;:::i;:::-;28243:1;28268:2;28263:3;28260:11;28285:1;28280:616;;;;28940:1;28957:3;28954:93;;;-1:-1:-1;29013:19:15;;;29000:33;28954:93;-1:-1:-1;;25147:1:15;25143:11;;;25139:24;25135:29;25125:40;25171:1;25167:11;;;25122:57;29060:78;;28253:895;;28280:616;24416:1;24409:14;;;24453:4;24440:18;;-1:-1:-1;;28316:17:15;;;28417:9;28439:229;28453:7;28450:1;28447:14;28439:229;;;28542:19;;;28529:33;28514:49;;28649:4;28634:20;;;;28602:1;28590:14;;;;28469:12;28439:229;;;28443:3;28696;28687:7;28684:16;28681:159;;;28820:1;28816:6;28810:3;28804;28801:1;28797:11;28793:21;28789:34;28785:39;28772:9;28767:3;28763:19;28750:33;28746:79;28738:6;28731:95;28681:159;;;28883:1;28877:3;28874:1;28870:11;28866:19;28860:4;28853:33;28253:895;;27948:1206;;;:::o;29159:184::-;29229:6;29282:2;29270:9;29261:7;29257:23;29253:32;29250:52;;;29298:1;29295;29288:12;29250:52;-1:-1:-1;29321:16:15;;29159:184;-1:-1:-1;29159:184:15:o;29348:663::-;29628:3;29666:6;29660:13;29682:66;29741:6;29736:3;29729:4;29721:6;29717:17;29682:66;:::i;:::-;29811:13;;29770:16;;;;29833:70;29811:13;29770:16;29880:4;29868:17;;29833:70;:::i;:::-;-1:-1:-1;;;29925:20:15;;29954:22;;;30003:1;29992:13;;29348:663;-1:-1:-1;;;;29348:663:15:o;30301:289::-;30432:3;30470:6;30464:13;30486:66;30545:6;30540:3;30533:4;30525:6;30521:17;30486:66;:::i;:::-;30568:16;;;;;30301:289;-1:-1:-1;;30301:289:15:o;30805:128::-;30872:9;;;30893:11;;;30890:37;;;30907:18;;:::i;31344:489::-;-1:-1:-1;;;;;31613:15:15;;;31595:34;;31665:15;;31660:2;31645:18;;31638:43;31712:2;31697:18;;31690:34;;;31760:3;31755:2;31740:18;;31733:31;;;31538:4;;31781:46;;31807:19;;31799:6;31781:46;:::i;:::-;31773:54;31344:489;-1:-1:-1;;;;;;31344:489:15:o;31838:249::-;31907:6;31960:2;31948:9;31939:7;31935:23;31931:32;31928:52;;;31976:1;31973;31966:12;31928:52;32008:9;32002:16;32027:30;32051:5;32027:30;:::i;32092:245::-;32159:6;32212:2;32200:9;32191:7;32187:23;32183:32;32180:52;;;32228:1;32225;32218:12;32180:52;32260:9;32254:16;32279:28;32301:5;32279:28;:::i
Swarm Source
ipfs://836f8df98d8915a30fcd9b324c934ba3dadb22b881e7fbbc5b919c37254ce77f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,077.71 | 0.00063595 | $1.96 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.