ETH Price: $3,092.47 (-4.50%)
 

Overview

Max Total Supply

33 BUILD

Holders

0

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 0 Decimals)

Filtered by Token Holder
therambler.eth
Balance
1 BUILD

Value
$0.00
0x5f7ab8699ec7f3c8405e194cd6616d6d1c3cc0a2
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Builder

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
constantinople EvmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 15: Builder.sol
// 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");
        _;
    }
}

File 1 of 15: Address.sol
// 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();
        }
    }
}

File 3 of 15: Context.sol
// 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;
    }
}

File 4 of 15: ERC165.sol
// 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;
    }
}

File 5 of 15: ERC2981.sol
// 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];
    }
}

File 6 of 15: ERC721A.sol
// 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)
        }
    }
}

File 7 of 15: IERC165.sol
// 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);
}

File 8 of 15: IERC20.sol
// 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);
}

File 9 of 15: IERC20Permit.sol
// 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);
}

File 10 of 15: IERC2981.sol
// 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);
}

File 11 of 15: IERC721A.sol
// 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);
}

File 12 of 15: Ownable.sol
// 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);
    }
}

File 13 of 15: PaymentSplitter.sol
// 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_;
    }
}

File 14 of 15: ReentrancyGuard.sol
// 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;
    }
}

File 15 of 15: SafeERC20.sol
// 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

Contract ABI

[{"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"}]

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
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.