ETH Price: $3,335.23 (-1.25%)

Token

Yakuza Elite (YKELITE)
 

Overview

Max Total Supply

333 YKELITE

Holders

68

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 YKELITE
0x462ea027f18b85e550225e3a767cbc8c0833d973
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:
YakuzaElite

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion
File 1 of 7 : YakuzaEliteMigrate.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.15;

/**
 * Yakuza Inc - ELITE
 * ERC-721A Migration  with Token Locking.
 * S/O to owl of moistness for locking inspiration, @ChiruLabs for ERC721A.
 */

import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "./ERC721A.sol";

interface ITempura {
    function startDripping(address addr, uint128 multiplier) external;

    function stopDripping(address addr, uint128 multiplier) external;
}

contract YakuzaElite is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;

    string public baseURI;

    uint256 public constant MAX_SUPPLY = 333;

    ITempura public Tempura;

    mapping(uint256 => uint256) public tierByToken;
    mapping(uint256 => bool) public lockStatus;
    mapping(uint256 => uint256) public lockData;

    bool public lockingAllowed;

    event Lock(uint256 token, uint256 timeStamp, address user);
    event Unlock(uint256 token, uint256 timeStamp, address user);

    /*
    ================================================
                    CONSTRUCTION        
    ================================================
*/

    constructor() ERC721A("Yakuza Elite", "YKELITE") {
        migrateTokens();
        initializeLock();
        initializeTiers();
        Tempura = ITempura(0xf52ae754AE9aaAC2f3A6C8730871d980389a424d);
        baseURI = "https://yakuza-api.vercel.app/api/";
    }

    /*
    ================================================
            Public/External Write Functions         
    ================================================
*/

    function lockTokens(uint256[] calldata tokenIds) external nonReentrant {
        require(lockingAllowed, "Locking is not currently allowed.");
        uint128 value;
        for (uint256 i; i < tokenIds.length; i++) {
            _lockToken(tokenIds[i]);
            if (tierByToken[tokenIds[i]] != 0) {
                unchecked {
                    value += 20;
                }
            } else {
                unchecked {
                    value += 10;
                }
            }
        }
        Tempura.startDripping(msg.sender, value);
    }

    function unlockTokens(uint256[] calldata tokenIds) external {
        uint128 value;
        for (uint256 i; i < tokenIds.length; i++) {
            if (tierByToken[tokenIds[i]] != 0) {
                unchecked {
                    value += 20;
                }
            } else {
                unchecked {
                    value += 10;
                }
            }
            _unlockToken(tokenIds[i]);
        }
        Tempura.stopDripping(msg.sender, value);
    }

    /*
    ================================================
               ACCESS RESTRICTED FUNCTIONS        
    ================================================
*/

    function setBaseURI(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }

    function setTier(uint256[] calldata tokenIds, uint128 tier) external onlyOwner {
        for (uint256 i; i < tokenIds.length; i++) {
            tierByToken[tokenIds[i]] = tier;
        }
    }

    function unlockTokensOwner(uint256[] calldata tokens) external onlyOwner {
        for (uint256 i; i < tokens.length; i++) {
            uint128 value;
            if (tierByToken[tokens[i]] != 0) value += 20;
            else value += 10;
            Tempura.stopDripping(ownerOf(tokens[i]), value);
            _unlockToken(tokens[i]);
        }
    }

    function lockTokensOwner(uint256[] calldata tokens) external onlyOwner {
        for (uint256 i; i < tokens.length; i++) {
            _lockToken(tokens[i]);
            uint128 value;
            if (tierByToken[tokens[i]] != 0) value += 20;
            else value += 10;
            Tempura.startDripping(ownerOf(tokens[i]), value);
        }
    }

    function setTempura(address tempura) external onlyOwner {
        Tempura = ITempura(tempura);
    }

    function toggleLocking() external onlyOwner {
        lockingAllowed = !lockingAllowed;
    }


    /*
    ================================================
                Migration/Initialization       
    ================================================
*/

    function initializeLock() internal {
        lockStatus[1] = true;
        lockStatus[5] = true;
        lockStatus[6] = true;
        lockStatus[7] = true;
        lockStatus[9] = true;
        lockStatus[10] = true;
        lockStatus[11] = true;
        lockStatus[12] = true;
        lockStatus[13] = true;
        lockStatus[15] = true;
        lockStatus[16] = true;
        lockStatus[17] = true;
        lockStatus[18] = true;
        lockStatus[19] = true;
        lockStatus[20] = true;
        lockStatus[21] = true;
        lockStatus[22] = true;
        lockStatus[23] = true;
        lockStatus[24] = true;
        lockStatus[25] = true;
        lockStatus[26] = true;
        lockStatus[27] = true;
        lockStatus[28] = true;
        lockStatus[29] = true;
        lockStatus[30] = true;
        lockStatus[31] = true;
        lockStatus[32] = true;
        lockStatus[33] = true;
        lockStatus[35] = true;
        lockStatus[36] = true;
        lockStatus[37] = true;
        lockStatus[38] = true;
        lockStatus[40] = true;
        lockStatus[41] = true;
        lockStatus[42] = true;
        lockStatus[43] = true;
        lockStatus[44] = true;
        lockStatus[46] = true;
        lockStatus[47] = true;
        lockStatus[48] = true;
        lockStatus[49] = true;
        lockStatus[50] = true;
        lockStatus[51] = true;
        lockStatus[52] = true;
        lockStatus[53] = true;
        lockStatus[54] = true;
        lockStatus[55] = true;
        lockStatus[56] = true;
        lockStatus[57] = true;
        lockStatus[58] = true;
        lockStatus[59] = true;
        lockStatus[60] = true;
        lockStatus[61] = true;
        lockStatus[62] = true;
        lockStatus[63] = true;
        lockStatus[64] = true;
        lockStatus[65] = true;
        lockStatus[66] = true;
        lockStatus[67] = true;
        lockStatus[68] = true;
        lockStatus[69] = true;
        lockStatus[70] = true;
        lockStatus[71] = true;
        lockStatus[72] = true;
        lockStatus[73] = true;
        lockStatus[74] = true;
        lockStatus[75] = true;
        lockStatus[77] = true;
        lockStatus[78] = true;
        lockStatus[79] = true;
        lockStatus[80] = true;
        lockStatus[81] = true;
        lockStatus[82] = true;
        lockStatus[83] = true;
        lockStatus[84] = true;
        lockStatus[86] = true;
        lockStatus[87] = true;
        lockStatus[88] = true;
        lockStatus[89] = true;
        lockStatus[90] = true;
        lockStatus[91] = true;
        lockStatus[92] = true;
        lockStatus[93] = true;
        lockStatus[94] = true;
        lockStatus[95] = true;
        lockStatus[96] = true;
        lockStatus[98] = true;
        lockStatus[100] = true;
        lockStatus[101] = true;
        lockStatus[103] = true;
        lockStatus[104] = true;
        lockStatus[105] = true;
        lockStatus[107] = true;
        lockStatus[109] = true;
        lockStatus[110] = true;
        lockStatus[111] = true;
        lockStatus[115] = true;
        lockStatus[117] = true;
        lockStatus[118] = true;
        lockStatus[119] = true;
        lockStatus[122] = true;
        lockStatus[123] = true;
        lockStatus[125] = true;
        lockStatus[126] = true;
        lockStatus[127] = true;
        lockStatus[128] = true;
        lockStatus[129] = true;
        lockStatus[130] = true;
        lockStatus[132] = true;
        lockStatus[133] = true;
        lockStatus[134] = true;
        lockStatus[135] = true;
        lockStatus[136] = true;
        lockStatus[137] = true;
        lockStatus[139] = true;
        lockStatus[140] = true;
        lockStatus[141] = true;
        lockStatus[142] = true;
        lockStatus[143] = true;
        lockStatus[144] = true;
        lockStatus[145] = true;
        lockStatus[147] = true;
        lockStatus[149] = true;
        lockStatus[150] = true;
        lockStatus[152] = true;
        lockStatus[153] = true;
        lockStatus[155] = true;
        lockStatus[157] = true;
        lockStatus[158] = true;
        lockStatus[159] = true;
        lockStatus[161] = true;
        lockStatus[165] = true;
        lockStatus[166] = true;
        lockStatus[168] = true;
        lockStatus[169] = true;
        lockStatus[170] = true;
        lockStatus[171] = true;
        lockStatus[173] = true;
        lockStatus[175] = true;
        lockStatus[177] = true;
        lockStatus[178] = true;
        lockStatus[181] = true;
        lockStatus[182] = true;
        lockStatus[183] = true;
        lockStatus[184] = true;
        lockStatus[185] = true;
        lockStatus[187] = true;
        lockStatus[190] = true;
        lockStatus[192] = true;
        lockStatus[193] = true;
        lockStatus[194] = true;
        lockStatus[195] = true;
        lockStatus[196] = true;
        lockStatus[197] = true;
        lockStatus[198] = true;
        lockStatus[200] = true;
        lockStatus[201] = true;
        lockStatus[203] = true;
        lockStatus[204] = true;
        lockStatus[205] = true;
        lockStatus[207] = true;
        lockStatus[208] = true;
        lockStatus[209] = true;
        lockStatus[211] = true;
        lockStatus[213] = true;
        lockStatus[215] = true;
        lockStatus[217] = true;
        lockStatus[218] = true;
        lockStatus[219] = true;
        lockStatus[220] = true;
        lockStatus[222] = true;
        lockStatus[226] = true;
        lockStatus[227] = true;
        lockStatus[228] = true;
        lockStatus[232] = true;
        lockStatus[233] = true;
        lockStatus[234] = true;
        lockStatus[236] = true;
        lockStatus[237] = true;
        lockStatus[238] = true;
        lockStatus[239] = true;
        lockStatus[240] = true;
        lockStatus[241] = true;
        lockStatus[242] = true;
        lockStatus[244] = true;
        lockStatus[246] = true;
        lockStatus[251] = true;
        lockStatus[252] = true;
        lockStatus[258] = true;
        lockStatus[259] = true;
        lockStatus[261] = true;
        lockStatus[262] = true;
        lockStatus[264] = true;
        lockStatus[266] = true;
        lockStatus[267] = true;
        lockStatus[268] = true;
        lockStatus[269] = true;
        lockStatus[273] = true;
        lockStatus[274] = true;
        lockStatus[276] = true;
        lockStatus[277] = true;
        lockStatus[278] = true;
        lockStatus[280] = true;
        lockStatus[281] = true;
        lockStatus[287] = true;
        lockStatus[289] = true;
        lockStatus[292] = true;
        lockStatus[294] = true;
        lockStatus[295] = true;
        lockStatus[297] = true;
        lockStatus[298] = true;
        lockStatus[299] = true;
        lockStatus[300] = true;
        lockStatus[301] = true;
        lockStatus[302] = true;
        lockStatus[303] = true;
        lockStatus[306] = true;
        lockStatus[307] = true;
    }

    function migrateTokens() internal {
        _mintERC2309(0x3B36Cb2c6826349eEC1F717417f47C06cB70b7Ea, 1);
        _mintERC2309(0xdF66301bb229dAFB491e68faF9b895b9CdFe5EBc, 1);
        _mintERC2309(0x76D75605C770d6B17eFE12C17C001626D371710a, 1);
        _mintERC2309(0x984b6d329d3aa1D6d5A14B134FB1Fb8BcC66D60C, 1);
        _mintERC2309(0xa724F5c322c6c281ABa5d49DcFD69dF1CE11511F, 1);
        _mintERC2309(0xc2445F027e5e3E0d9ED0EB9fFE20fbB5C580C847, 1);
        _mintERC2309(0xb8410f47e152E6ec0E7578f8e0D79d10FB90e09b, 1);
        _mintERC2309(0xc4a6d14d083ca6e6893EA0059195616FDd61F655, 1);
        _mintERC2309(0x2FF6B407D0baC20a27E80D6BAbe8a5149852f4BF, 1);
        _mintERC2309(0x4AB59d6caC15920b2f2909C0529995e12C509b80, 1);
        _mintERC2309(0x2520D890B24AA71E9200183a8B53Af87bB6eBeeE, 1);
        _mintERC2309(0x590f4faFe1966803c79a038c462C8F28B06668d8, 1);
        _mintERC2309(0x552e366f9D3c4f4C1f9F2bebC493715F866Fe9D9, 1);
        _mintERC2309(0x3c9A29649EBf0270a3214916A8A76e0844Cf8DB9, 1);
        _mintERC2309(0x02B004114503F5E75121EF528eac3C08f0D19305, 1);
        _mintERC2309(0x346affc5c5E7bF14Ebbc33530B6e0488Fb8b265e, 1);
        _mintERC2309(0xEeBa29bc63c008B39a432B17382d5441CBA5Fc31, 1);
        _mintERC2309(0x0A90B83884870046B73441AF03b76c35C1d21763, 1);
        _mintERC2309(0x87E974Eea31c0B5bed051bd7569dE8176b447e53, 1);
        _mintERC2309(0xE1EF400f64240bBB30033818980A6b9c6f57D871, 1);
        _mintERC2309(0x6635675C439f545BC9FAD80d40c3C6b054EBc402, 1);
        _mintERC2309(0x6249cd17AaEEF4CdD467785780c669b03b2ACf86, 1);
        _mintERC2309(0xc1692cD69493436b01cddcbE5FeDbC911746A7C1, 1);
        _mintERC2309(0xAcE7858A2514075f5Ab8dD7B947143C0A82a5813, 1);
        _mintERC2309(0x17ff38F48f36bd691B5322DDb68792000440fdd6, 1);
        _mintERC2309(0xe905d18Bd971ce7A1976e0241DB396fAab8A5A32, 1);
        _mintERC2309(0x2e24A856D65Be4319a883E0489f1CAFBB0F3c468, 1);
        _mintERC2309(0xAeA4C6c95D927172bD42aAcA170Aa3E92A29921C, 1);
        _mintERC2309(0x8423753fe03a4f0ACf792E00426BF6f758aE645D, 1);
        _mintERC2309(0x02F60fEF631AC1691fe3d38191b8E3430930d2f4, 1);
        _mintERC2309(0x5B85b432317bc8E16b4895555c2F822271400d6b, 1);
        _mintERC2309(0xdEF769bcf57dF5a2400ab5f9DD3AaD5981079689, 1);
        _mintERC2309(0x4AB59d6caC15920b2f2909C0529995e12C509b80, 1);
        _mintERC2309(0x0064f54f2084758afA4E013B606A9fdD718Ec53c, 1);
        _mintERC2309(0xdac5B25AD77C0a726B95D6A448483cEdc5284fAB, 1);
        _mintERC2309(0x18A01e6c1159d606fcc3148A2b9836669611c0A0, 1);
        _mintERC2309(0xcED0ed8Cb5E884aE4e2A5E8aa9eCe1fD3404330e, 1);
        _mintERC2309(0xC502b4E8346524cD679FBbAdA962317c8f0e1291, 1);
        _mintERC2309(0x6d9ed472Da62B604eD479026185995889ae8f80e, 1);
        _mintERC2309(0x5587C8C50F189b79E93cCeFC62a00669A0D181dc, 1);
        _mintERC2309(0x2C72bc035Ba6242B7f7B7C1bdf0ed171A7c2b945, 1);
        _mintERC2309(0xE1EF400f64240bBB30033818980A6b9c6f57D871, 1);
        _mintERC2309(0x2cB2e57a922893c5a843399C42793BdCC6FC844C, 1);
        _mintERC2309(0x011e2747F5E393E67CE0372cB9cfBd0B9a4C8F12, 1);
        _mintERC2309(0x2741C7A3159F2a01a19F53Cff8972a7812CF6418, 1);
        _mintERC2309(0xd6081A2823F9Ce4e78fB441a693F91f0bcbEd328, 1);
        _mintERC2309(0x87E974Eea31c0B5bed051bd7569dE8176b447e53, 1);
        _mintERC2309(0xe905d18Bd971ce7A1976e0241DB396fAab8A5A32, 1);
        _mintERC2309(0xEeBa29bc63c008B39a432B17382d5441CBA5Fc31, 1);
        _mintERC2309(0x6eB6a8f7F6d071af1311B194893c12796515CC54, 1);
        _mintERC2309(0x6249cd17AaEEF4CdD467785780c669b03b2ACf86, 1);
        _mintERC2309(0x8423753fe03a4f0ACf792E00426BF6f758aE645D, 1);
        _mintERC2309(0x5587C8C50F189b79E93cCeFC62a00669A0D181dc, 1);
        _mintERC2309(0x0A90B83884870046B73441AF03b76c35C1d21763, 1);
        _mintERC2309(0xE1EF400f64240bBB30033818980A6b9c6f57D871, 1);
        _mintERC2309(0x6635675C439f545BC9FAD80d40c3C6b054EBc402, 1);
        _mintERC2309(0x4AB59d6caC15920b2f2909C0529995e12C509b80, 1);
        _mintERC2309(0xAeA4C6c95D927172bD42aAcA170Aa3E92A29921C, 1);
        _mintERC2309(0x2C72bc035Ba6242B7f7B7C1bdf0ed171A7c2b945, 1);
        _mintERC2309(0xb73c6dD54f3d1723d7d76Cf230175B9100c36915, 1);
        _mintERC2309(0x462eA027f18B85e550225E3A767cbc8c0833d973, 1);
        _mintERC2309(0xf52e3f7625B56A59F6CaA0aeAd91A1646C983bE8, 1);
        _mintERC2309(0xE1EF400f64240bBB30033818980A6b9c6f57D871, 1);
        _mintERC2309(0x298c30F70bdc0d035bCE76D261E758240cFaD93A, 1);
        _mintERC2309(0xd71514E903F1E3cABa8b92f8B980a16F0A3a413d, 1);
        _mintERC2309(0x8423753fe03a4f0ACf792E00426BF6f758aE645D, 1);
        _mintERC2309(0xDbAAD435aC3a81858123b9b6ddFcd1851021e826, 1);
        _mintERC2309(0xAeA4C6c95D927172bD42aAcA170Aa3E92A29921C, 1);
        _mintERC2309(0x2cB2e57a922893c5a843399C42793BdCC6FC844C, 1);
        _mintERC2309(0xe905d18Bd971ce7A1976e0241DB396fAab8A5A32, 1);
        _mintERC2309(0xb73c6dD54f3d1723d7d76Cf230175B9100c36915, 1);
        _mintERC2309(0x2C72bc035Ba6242B7f7B7C1bdf0ed171A7c2b945, 1);
        _mintERC2309(0xe905d18Bd971ce7A1976e0241DB396fAab8A5A32, 1);
        _mintERC2309(0xd71514E903F1E3cABa8b92f8B980a16F0A3a413d, 1);
        _mintERC2309(0x6635675C439f545BC9FAD80d40c3C6b054EBc402, 1);
        _mintERC2309(0xCdA87A974DA84D23920071B5d71cF8ad76AEDF9f, 1);
        _mintERC2309(0x298c30F70bdc0d035bCE76D261E758240cFaD93A, 1);
        _mintERC2309(0xDe308A5F7EAE545e5dc312A5bC4689Ae82CdD9eE, 1);
        _mintERC2309(0xeCBD1663D744e9f08a381D32B18EA88aeB5b8D39, 1);
        _mintERC2309(0x2cB2e57a922893c5a843399C42793BdCC6FC844C, 1);
        _mintERC2309(0x68f0FAA81837D10aaF23974fa0CEb40220717f4e, 1);
        _mintERC2309(0xba7533A972bDaC8925A811aD456C95B220fE00f7, 1);
        _mintERC2309(0x6eB6a8f7F6d071af1311B194893c12796515CC54, 1);
        _mintERC2309(0xAeA4C6c95D927172bD42aAcA170Aa3E92A29921C, 1);
        _mintERC2309(0x653473A7b0BF45eee566d732FdEB8dc845EF6512, 1);
        _mintERC2309(0xba7533A972bDaC8925A811aD456C95B220fE00f7, 1);
        _mintERC2309(0x49f7989010Fe2751d60b6f239b6C61a497227Aef, 1);
        _mintERC2309(0xdEF769bcf57dF5a2400ab5f9DD3AaD5981079689, 1);
        _mintERC2309(0x6635675C439f545BC9FAD80d40c3C6b054EBc402, 1);
        _mintERC2309(0x5A70ec52E977B50c9fc12Ca0aA6d5e26E7C62291, 1);
        _mintERC2309(0x49f7989010Fe2751d60b6f239b6C61a497227Aef, 1);
        _mintERC2309(0xfE13A69994743AE68053CCC7A4d601d2B63c9318, 1);
        _mintERC2309(0x1790B08c57400Fe9b28Aa7c6C18272078cBEba25, 1);
        _mintERC2309(0x221AF81adDFaef129AD9a5e1aaE643fd00689b4E, 1);
        _mintERC2309(0x6eB6a8f7F6d071af1311B194893c12796515CC54, 1);
        _mintERC2309(0x51EC173342aEfd977A9481Cf0Ff474195b63E0b0, 1);
        _mintERC2309(0xe5E689114D80aBFB955a06B7b27d3226b65De421, 1);
        _mintERC2309(0xE1EF400f64240bBB30033818980A6b9c6f57D871, 1);
        _mintERC2309(0x4349Ad665636d65CEb89e415dC0d250Cb7b1D693, 1);
        _mintERC2309(0x68f0FAA81837D10aaF23974fa0CEb40220717f4e, 1);
        _mintERC2309(0x5A70ec52E977B50c9fc12Ca0aA6d5e26E7C62291, 1);
        _mintERC2309(0x475205225dBf2A2E4115574DA89b8F806af418b8, 1);
        _mintERC2309(0x298c30F70bdc0d035bCE76D261E758240cFaD93A, 1);
        _mintERC2309(0x221AF81adDFaef129AD9a5e1aaE643fd00689b4E, 1);
        _mintERC2309(0x69012192E2886D311a2FA6b6e0C8ea153dcccB7B, 1);
        _mintERC2309(0x27889b0CaCC1705b0E61780B16DF21C81dDB03F8, 1);
        _mintERC2309(0x9997E502d002506541Dd05264d717d0D6aFbB673, 1);
        _mintERC2309(0xB573D55bB681b091cA01ef0E78D519ED26238C38, 1);
        _mintERC2309(0xce3A505702d1f374B9CB277c7aCc4396944Fd238, 1);
        _mintERC2309(0xba7533A972bDaC8925A811aD456C95B220fE00f7, 1);
        _mintERC2309(0x216222ec646E764dA7995Ed3c02848568072cb58, 1);
        _mintERC2309(0x69Cd3080236750F7A006FdDdf86797A7Efc813a4, 1);
        _mintERC2309(0x2806cA13d7dA9a2EC03101D9dAa0A011E2b21c04, 2);
        _mintERC2309(0x5A70ec52E977B50c9fc12Ca0aA6d5e26E7C62291, 1);
        _mintERC2309(0x69Cd3080236750F7A006FdDdf86797A7Efc813a4, 1);
        _mintERC2309(0xAC844941f038ff6493B1eec17D4ec775DeC210DD, 2);
        _mintERC2309(0xce3A505702d1f374B9CB277c7aCc4396944Fd238, 1);
        _mintERC2309(0x69Cd3080236750F7A006FdDdf86797A7Efc813a4, 1);
        _mintERC2309(0x699a4Fbf7f094cff9e894a83b9a599B03b2723A1, 1);
        _mintERC2309(0xdE302714639124bce12389bb026484a2B07C43Ea, 1);
        _mintERC2309(0x8A4565Fb0C2862f85265af4794ffBED4Cf3e441D, 1);
        _mintERC2309(0x18AaC583c5782F4A7494A304c5F721ce4F02B471, 1);
        _mintERC2309(0xf44324E28bB9ce5C2a8B843377E92cb7f4Fdf376, 1);
        _mintERC2309(0x42d6B53B205CC931a93b845ac3A58B99c88437eD, 1);
        _mintERC2309(0x76b2F8C6DA7BFFB5A63eA41f794481E5C7D81e44, 1);
        _mintERC2309(0xE10820407810935e2d321E0641Bf4DABeeD61E12, 1);
        _mintERC2309(0xa724F5c322c6c281ABa5d49DcFD69dF1CE11511F, 1);
        _mintERC2309(0xcaf0624d4Ab1b0B45Aeee977a6008832e5860C93, 1);
        _mintERC2309(0x7185538FC7FA1220C9FCB6758D4AB60238Eaac5b, 1);
        _mintERC2309(0x87ac0553e62Fc074BcBAF9D348cC12D41A4c041e, 1);
        _mintERC2309(0xeCBD1663D744e9f08a381D32B18EA88aeB5b8D39, 1);
        _mintERC2309(0xba7533A972bDaC8925A811aD456C95B220fE00f7, 1);
        _mintERC2309(0x42d6B53B205CC931a93b845ac3A58B99c88437eD, 1);
        _mintERC2309(0x289C4dCB0B69BA183f0519C0D4191479327Cb06B, 1);
        _mintERC2309(0xeCBD1663D744e9f08a381D32B18EA88aeB5b8D39, 1);
        _mintERC2309(0x69Cd3080236750F7A006FdDdf86797A7Efc813a4, 1);
        _mintERC2309(0xc821eE063C0aBe2be67D0621b676C2Bcaa63cf4b, 1);
        _mintERC2309(0xE1EF400f64240bBB30033818980A6b9c6f57D871, 1);
        _mintERC2309(0x499Ad4e017E0aA45a2D32c54a7c7C3eAcDd72a33, 1);
        _mintERC2309(0x35fEC93300ce629707218950B88f071e2F2f437f, 1);
        _mintERC2309(0x499Ad4e017E0aA45a2D32c54a7c7C3eAcDd72a33, 1);
        _mintERC2309(0xba7533A972bDaC8925A811aD456C95B220fE00f7, 1);
        _mintERC2309(0xc821eE063C0aBe2be67D0621b676C2Bcaa63cf4b, 1);
        _mintERC2309(0x653473A7b0BF45eee566d732FdEB8dc845EF6512, 1);
        _mintERC2309(0x62b4618af958aBF3a4F803dFED365FD37618095c, 1);
        _mintERC2309(0xE4DEa04fa6FA74f0d62D7e987738a83E606C92a1, 1);
        _mintERC2309(0xdE302714639124bce12389bb026484a2B07C43Ea, 1);
        _mintERC2309(0x779A8A5a7d253Ea612Ca5fAdF589b16094952b66, 1);
        _mintERC2309(0x023f5B749860964393ae1217BB5d9bB56fe5dF23, 1);
        _mintERC2309(0x779A8A5a7d253Ea612Ca5fAdF589b16094952b66, 2);
        _mintERC2309(0x838450e58a9Ba982BB1866fcc2396Db8b307B9C9, 1);
        _mintERC2309(0xAA7c21fCe545fc47c80636127E408168e88c1a60, 1);
        _mintERC2309(0x896aE45164b0EB741074A1cDb3Df170f5ed8F664, 1);
        _mintERC2309(0x779A8A5a7d253Ea612Ca5fAdF589b16094952b66, 2);
        _mintERC2309(0x00386637CF48eB0341B3fcFE80edab62b78C866e, 1);
        _mintERC2309(0x8Dd982D63183E42dE34CeE77079CCACAEbe8B14F, 1);
        _mintERC2309(0x00386637CF48eB0341B3fcFE80edab62b78C866e, 1);
        _mintERC2309(0xa7f879Eee9C76b4b7Cf7c067e3CBf43A5E28ef33, 1);
        _mintERC2309(0x023f5B749860964393ae1217BB5d9bB56fe5dF23, 1);
        _mintERC2309(0x653473A7b0BF45eee566d732FdEB8dc845EF6512, 1);
        _mintERC2309(0x2cC71CffB7eBeE2596e60b70088fa195397494b2, 1);
        _mintERC2309(0xD87ad6e7D350CE4D568AE7b04558B8b6041d1DA3, 1);
        _mintERC2309(0xa7f879Eee9C76b4b7Cf7c067e3CBf43A5E28ef33, 1);
        _mintERC2309(0x8830516fDA3821fc0e805E9A982B143E8792d5DC, 2);
        _mintERC2309(0xbe85F5aDf3aFfFEa08a2529Bf992Ee96525Cfd2f, 1);
        _mintERC2309(0x2cC71CffB7eBeE2596e60b70088fa195397494b2, 1);
        _mintERC2309(0x789d757EB17a56eC7fAbcFaaa13f48BdcA651C18, 1);
        _mintERC2309(0xcED0ed8Cb5E884aE4e2A5E8aa9eCe1fD3404330e, 1);
        _mintERC2309(0xA90e35c6BE67920AdaB21F1a207eB3A736E06649, 1);
        _mintERC2309(0x3181955d2646998f7150065E2A48823D78123928, 1);
        _mintERC2309(0x679eB39CC05CE43B9b813dF8abc4f66da896bcD6, 1);
        _mintERC2309(0x8CF6B98F59487ed43f64c7a94516dCA2f010ACC8, 1);
        _mintERC2309(0x4fa0e8318DFBb42233eCb5330661691fa802c458, 1);
        _mintERC2309(0x838450e58a9Ba982BB1866fcc2396Db8b307B9C9, 1);
        _mintERC2309(0x2b0A63c55F5926699Be551C968A1EA3B22B08691, 1);
        _mintERC2309(0x99b096CE65C4A273dfdE3E7F14d792C2F76BCc98, 1);
        _mintERC2309(0x042CFA58735B52790E3F25eDc99Aca32677b3b50, 1);
        _mintERC2309(0xdEF769bcf57dF5a2400ab5f9DD3AaD5981079689, 1);
        _mintERC2309(0x515d1a7b1982826D53194E03fbBAcDf392034b83, 2);
        _mintERC2309(0x71Ef3244fDac9168Ee3382aF5aD99dA09632649a, 1);
        _mintERC2309(0x515d1a7b1982826D53194E03fbBAcDf392034b83, 1);
        _mintERC2309(0x499Ad4e017E0aA45a2D32c54a7c7C3eAcDd72a33, 1);
        _mintERC2309(0x4DBE8b56E3D2a481bbdC4cF4Be98Fc5cBb888FbF, 1);
        _mintERC2309(0x7ADEE4C1Ec5427519A0cb78E354828E6dA58e871, 1);
        _mintERC2309(0xbb1fF00e5Af0f3b81e2F464a329ae4EE7C1DfbA5, 1);
        _mintERC2309(0xdE302714639124bce12389bb026484a2B07C43Ea, 1);
        _mintERC2309(0xCEA44512698Fce6D380683d69C3C551Da4EBc6eD, 2);
        _mintERC2309(0xCDD094642F5fB2445f108758929770257C9DA8e6, 1);
        _mintERC2309(0xCEA44512698Fce6D380683d69C3C551Da4EBc6eD, 3);
        _mintERC2309(0x0Cb2ECEfAb110966a117358abf5Dd3a635F9c3A1, 1);
        _mintERC2309(0x042CFA58735B52790E3F25eDc99Aca32677b3b50, 1);
        _mintERC2309(0x81134166c117ae6C8366C36BE9e886B0F7147faE, 1);
        _mintERC2309(0x1ff69103A094eFDc748A35ee0A6c193fF7f4728f, 1);
        _mintERC2309(0x1C96E40DA3eF76039D3cadD7892bF8209E5a8C99, 1);
        _mintERC2309(0x8423753fe03a4f0ACf792E00426BF6f758aE645D, 1);
        _mintERC2309(0x67c4E74Eaa79b6F7114B56D17B5BEd2F60c69fB5, 1);
        _mintERC2309(0xCA0E051598cbE53057ed34AAAFC32a3310f4aEe7, 1);
        _mintERC2309(0x3076dD2c4f6797034Ffb11cedFca352b579b120E, 2);
        _mintERC2309(0x5bB4E468d79Dce3C878F76535BeC388CcBCc4031, 1);
        _mintERC2309(0x9eD81f00b587781D7ee4473A878a07560944427b, 1);
        _mintERC2309(0xc181f3828fE39bbE39e78354795a676304a825A3, 1);
        _mintERC2309(0xB1d3A4c1907AD74f35dBBb5F1478dD456a9d81dF, 1);
        _mintERC2309(0x76D75605C770d6B17eFE12C17C001626D371710a, 1);
        _mintERC2309(0x010298F5dDE499b371A86d6ce7ee454b68B62780, 1);
        _mintERC2309(0x52bE0A4F75DF6fD45770f5A6E71ac269185D48e0, 1);
        _mintERC2309(0x9e86cC88D072e1c0259ee96cFBc457fEFfCC1Fee, 1);
        _mintERC2309(0xb9fA7689bDfE2f3718f3b101af60936D6f993324, 2);
        _mintERC2309(0xa7b065AB08a41609b508aFCd87473cb22af3a08A, 2);
        _mintERC2309(0x499Ad4e017E0aA45a2D32c54a7c7C3eAcDd72a33, 1);
        _mintERC2309(0x9d79F12e677822C2d3F9745e422Cb1CdBc5A41AA, 1);
        _mintERC2309(0xbC9bB672d0732165535C49eD8bBa7c9e9BA988Cc, 1);
        _mintERC2309(0x8a1635C39C53DeEdf9fD8a1A28B0f0f4d2fF5a78, 1);
        _mintERC2309(0x826EC552A86b20302a3f01B6980b662Eb1Ba7a44, 1);
        _mintERC2309(0x58E6a5cD87d38Ae2C35007B1bD7b25026be9b0b1, 1);
        _mintERC2309(0x462eA027f18B85e550225E3A767cbc8c0833d973, 1);
        _mintERC2309(0x58E6a5cD87d38Ae2C35007B1bD7b25026be9b0b1, 1);
        _mintERC2309(0x8a1635C39C53DeEdf9fD8a1A28B0f0f4d2fF5a78, 1);
        _mintERC2309(0x187D8e97ffb6a92Ad0Ca25F80d97ada595513C88, 1);
        _mintERC2309(0xCa5334CE5a579C72413B58411F3E0Fb4CD4c345c, 1);
        _mintERC2309(0x95a00FFb2EaE9420287BF374F08dE040e7637D3A, 1);
        _mintERC2309(0x84Df49B1D4FdceE1e3B410669B7e5087412B411B, 1);
        _mintERC2309(0xb34b19f30D0E72c407ccF136aA6ac9E71B7B0684, 1);
        _mintERC2309(0x5f3fEa69BfC3fe51E9E43e3BE05dD5794AC50AB6, 1);
        _mintERC2309(0x865901C6bB1dD7842975f66E2B5Db494735F3655, 1);
        _mintERC2309(0x200cA9451C7d1fD027b3b04B1A08Bce257e21888, 2);
        _mintERC2309(0x408fdb9063b25542e95b171aE53046a6950E50Cd, 1);
        _mintERC2309(0x552e366f9D3c4f4C1f9F2bebC493715F866Fe9D9, 1);
        _mintERC2309(0x408fdb9063b25542e95b171aE53046a6950E50Cd, 1);
        _mintERC2309(0x6aE5bf41457D9f938F4f2588b9200f4390B23f9c, 1);
        _mintERC2309(0xB609d966A45ec87AfB84BF4a3F3DD29DE2deeD83, 1);
        _mintERC2309(0x413Cf568d0aA5aE64C9A0161b207e165Cb8D35C4, 1);
        _mintERC2309(0xB609d966A45ec87AfB84BF4a3F3DD29DE2deeD83, 1);
        _mintERC2309(0x289C4dCB0B69BA183f0519C0D4191479327Cb06B, 1);
        _mintERC2309(0x0C375dA33507197f318E0F92aCAc6f45B53f2629, 1);
        _mintERC2309(0xf932755165312e18b62484B9A23B517Cc07a7ba2, 1);
        _mintERC2309(0x6dBBa020D28DDEc7A8859Cc10F7641b7F8c11419, 1);
        _mintERC2309(0xFeEC85c46f99a9722636044D5EA0B5DFDD5C5CD7, 1);
        _mintERC2309(0xcaf0624d4Ab1b0B45Aeee977a6008832e5860C93, 1);
        _mintERC2309(0xAeA4C6c95D927172bD42aAcA170Aa3E92A29921C, 1);
        _mintERC2309(0x385fd77f7B5A1e67222c94304D342ff4752ce92c, 2);
        _mintERC2309(0x997708fe9e316F6E6b3Ef91a53374148795f0e5C, 2);
        _mintERC2309(0xfcF8a7B49539154CCf149Ca2FF4Fdf12E39A1DB7, 1);
        _mintERC2309(0xfAd606Fe2181966C8703C84125BfdAd2A541BE2b, 1);
        _mintERC2309(0x308a4Fa5D38Ff273eD2E4618f66bDD864a3dDA7E, 1);
        _mintERC2309(0x18AaC583c5782F4A7494A304c5F721ce4F02B471, 1);
        _mintERC2309(0x7e2aA3047eb37eBAeF3438A1becC0c1FdF14B383, 1);
        _mintERC2309(0x0CDD65d3e6e80dA2e5A11F7C1cEdaCE730372D7E, 1);
        _mintERC2309(0xAbb9190C87955BdabDfd3DF0D4E0D415ec18dfB1, 1);
        _mintERC2309(0x4AB59d6caC15920b2f2909C0529995e12C509b80, 1);
        _mintERC2309(0x8f5FBdc4a08d48cACC468B30b55705529944bC8c, 1);
        _mintERC2309(0xAA7c21fCe545fc47c80636127E408168e88c1a60, 1);
        _mintERC2309(0x67c4E74Eaa79b6F7114B56D17B5BEd2F60c69fB5, 2);
        _mintERC2309(0x9DE9b25139df40e04202E42e4F53e52c9Ef6e949, 1);
        _mintERC2309(0x3E0d3071DA4Fc3139E11cb92a49460748712051a, 1);
        _mintERC2309(0xbf2C8b554a1D227F41EAc0e6F50fe5700e9EAc8D, 2);
        _mintERC2309(0x6d557322D7a8f399d6dD61DA819592AcE36E556c, 1);
        _mintERC2309(0x590f4faFe1966803c79a038c462C8F28B06668d8, 1);
        _mintERC2309(0xfbcD2a7Fa20c267b8d9363098399BFD307c7748b, 1);
        _mintERC2309(0xCEA44512698Fce6D380683d69C3C551Da4EBc6eD, 1);
        _mintERC2309(0x252aD4c147630634170971fE0BEe72FeaF7DfCb3, 1);
        _mintERC2309(0xe35932989927AF1Ce78F54af6578FD22dB3ce675, 1);
        _mintERC2309(0xe2B0cEb92Ee82D48d06c5c41bb307DCb367EA94A, 1);
        _mintERC2309(0x499Ad4e017E0aA45a2D32c54a7c7C3eAcDd72a33, 1);
        _mintERC2309(0x5A70ec52E977B50c9fc12Ca0aA6d5e26E7C62291, 1);
        _mintERC2309(0x6619032e9fb486d738CF6db6ba39F18e59C38B10, 1);
        _mintERC2309(0x62c912f6B8727Af47DC0bcB6862E5E4804b26f24, 1);
        _mintERC2309(0xb50260f2076D744A6a87d4Ba0102fA8770c08e34, 2);
        _mintERC2309(0xfcf7cF49aB34E43EFDeEaD51eEDc0f1D25E43cC5, 1);
        _mintERC2309(0xD0010f430E836137bCCB778C5e9886E0c58B4b6C, 1);
        _mintERC2309(0x8eb80a451c61116395CF7BDA5B641a4569A11e63, 1);
        _mintERC2309(0xB94664acC7c7750B92f028b1e7139e19BF4922e9, 1);
        _mintERC2309(0x340ee74B7257C6b11b7Bf47fD279558Ea9E143f8, 1);
        _mintERC2309(0x46acF7AaF70e7dFC2AAA4c176E05fBa9F5c0A009, 1);
        _mintERC2309(0x744e14680b3C9693442e8526e22E1d5F60101846, 1);
        _mintERC2309(0x5EAe85C3dc16032878a579a39C85Ad7eCa3e7dc5, 1);
        _mintERC2309(0xb8410f47e152E6ec0E7578f8e0D79d10FB90e09b, 1);
        _mintERC2309(0x6bade65A3C3CB9E81cF8316c76a799947bA87d32, 1);
        _mintERC2309(0x3CFd1a2CF9585AfB5c0B18C15b174BAAae58ac21, 1);
        _mintERC2309(0x99b096CE65C4A273dfdE3E7F14d792C2F76BCc98, 1);
        _mintERC2309(0x778c1694994C24D701accb42F48c1BD10d10EE4C, 1);
        _mintERC2309(0x85150706937Ec68194677131A1F1F94c3dD38664, 1);
        _mintERC2309(0x415bd9A5e2fDcB8310ceE3F785F25B5E4D4564E3, 2);
        _mintERC2309(0x216222ec646E764dA7995Ed3c02848568072cb58, 1);
        _mintERC2309(0x7B056DcF6551f96d54AC2040ae89f8b30e0D77cb, 1);
        _mintERC2309(0x8165a12EE90d17278d30D8442c64AF767a05E12C, 2);
        _mintERC2309(0x7B056DcF6551f96d54AC2040ae89f8b30e0D77cb, 2);
        _mintERC2309(0x8165a12EE90d17278d30D8442c64AF767a05E12C, 3);
        _mintERC2309(0x26349cC1373c1e8A834815e930aD05632C375B27, 1);
        _mintERC2309(0x8165a12EE90d17278d30D8442c64AF767a05E12C, 22);
    }

    function initializeTiers() internal {
        tierByToken[1] = 2;
        tierByToken[3] = 2;
        tierByToken[4] = 2;
        tierByToken[5] = 1;
        tierByToken[6] = 1;
        tierByToken[7] = 1;
        tierByToken[9] = 1;
        tierByToken[10] = 1;
        tierByToken[11] = 2;
        tierByToken[13] = 1;
        tierByToken[17] = 1;
        tierByToken[20] = 1;
        tierByToken[21] = 1;
        tierByToken[22] = 1;
        tierByToken[25] = 1;
        tierByToken[26] = 1;
        tierByToken[27] = 1;
        tierByToken[28] = 1;
        tierByToken[29] = 1;
        tierByToken[31] = 1;
        tierByToken[32] = 1;
        tierByToken[33] = 1;
        tierByToken[35] = 1;
        tierByToken[37] = 1;
        tierByToken[39] = 1;
        tierByToken[40] = 1;
        tierByToken[41] = 1;
        tierByToken[42] = 1;
        tierByToken[43] = 1;
        tierByToken[44] = 1;
        tierByToken[48] = 1;
        tierByToken[49] = 1;
        tierByToken[50] = 1;
        tierByToken[51] = 1;
        tierByToken[52] = 1;
        tierByToken[53] = 1;
        tierByToken[55] = 1;
        tierByToken[56] = 1;
        tierByToken[57] = 1;
        tierByToken[58] = 1;
        tierByToken[59] = 1;
        tierByToken[60] = 1;
        tierByToken[61] = 1;
        tierByToken[62] = 1;
        tierByToken[63] = 1;
        tierByToken[64] = 1;
        tierByToken[65] = 1;
        tierByToken[66] = 1;
        tierByToken[67] = 1;
        tierByToken[68] = 1;
        tierByToken[70] = 1;
        tierByToken[72] = 1;
        tierByToken[74] = 1;
        tierByToken[75] = 1;
        tierByToken[79] = 1;
        tierByToken[81] = 1;
        tierByToken[82] = 1;
        tierByToken[83] = 1;
        tierByToken[84] = 2;
        tierByToken[85] = 2;
        tierByToken[86] = 1;
        tierByToken[87] = 2;
        tierByToken[90] = 1;
        tierByToken[91] = 1;
        tierByToken[92] = 1;
        tierByToken[94] = 1;
        tierByToken[96] = 1;
        tierByToken[97] = 1;
        tierByToken[98] = 2;
        tierByToken[99] = 1;
        tierByToken[100] = 1;
        tierByToken[101] = 1;
        tierByToken[103] = 1;
        tierByToken[105] = 1;
        tierByToken[107] = 1;
        tierByToken[109] = 1;
        tierByToken[110] = 2;
        tierByToken[111] = 1;
        tierByToken[112] = 1;
        tierByToken[113] = 1;
        tierByToken[115] = 1;
        tierByToken[116] = 1;
        tierByToken[117] = 1;
        tierByToken[118] = 1;
        tierByToken[120] = 1;
        tierByToken[122] = 1;
        tierByToken[124] = 1;
        tierByToken[125] = 1;
        tierByToken[126] = 1;
        tierByToken[128] = 1;
        tierByToken[130] = 1;
        tierByToken[132] = 1;
        tierByToken[136] = 2;
        tierByToken[140] = 2;
        tierByToken[143] = 1;
        tierByToken[146] = 1;
        tierByToken[149] = 1;
        tierByToken[150] = 1;
        tierByToken[151] = 1;
        tierByToken[153] = 1;
        tierByToken[154] = 2;
        tierByToken[155] = 1;
        tierByToken[156] = 1;
        tierByToken[157] = 2;
        tierByToken[159] = 1;
        tierByToken[161] = 1;
        tierByToken[162] = 1;
        tierByToken[164] = 1;
        tierByToken[167] = 1;
        tierByToken[168] = 1;
        tierByToken[169] = 1;
        tierByToken[174] = 1;
        tierByToken[175] = 1;
        tierByToken[177] = 1;
        tierByToken[179] = 2;
        tierByToken[180] = 1;
        tierByToken[181] = 1;
        tierByToken[182] = 1;
        tierByToken[183] = 1;
        tierByToken[184] = 1;
        tierByToken[188] = 1;
        tierByToken[193] = 2;
        tierByToken[194] = 1;
        tierByToken[195] = 1;
        tierByToken[196] = 1;
        tierByToken[197] = 1;
        tierByToken[198] = 1;
        tierByToken[199] = 1;
        tierByToken[205] = 1;
        tierByToken[207] = 1;
        tierByToken[210] = 1;
        tierByToken[211] = 2;
        tierByToken[214] = 1;
        tierByToken[217] = 1;
        tierByToken[219] = 1;
        tierByToken[222] = 1;
        tierByToken[224] = 1;
        tierByToken[226] = 2;
        tierByToken[228] = 2;
        tierByToken[231] = 1;
        tierByToken[232] = 1;
        tierByToken[237] = 1;
        tierByToken[238] = 1;
        tierByToken[241] = 1;
        tierByToken[244] = 1;
        tierByToken[248] = 1;
        tierByToken[250] = 2;
        tierByToken[252] = 1;
        tierByToken[257] = 1;
        tierByToken[266] = 1;
        tierByToken[267] = 1;
        tierByToken[270] = 1;
        tierByToken[271] = 1;
        tierByToken[277] = 1;
        tierByToken[284] = 2;
        tierByToken[300] = 2;
        tierByToken[331] = 2;
        tierByToken[332] = 2;
        tierByToken[333] = 2;
    }

    /*
    ================================================
                Internal Write Functions         
    ================================================
*/

    function _lockToken(uint256 tokenId) internal {
        require(
            ownerOf(tokenId) == msg.sender || owner() == msg.sender,
            "You must own a token in order to unlock it"
        );
        require(lockStatus[tokenId] == false, "token already locked");
        lockStatus[tokenId] = true;
        lockData[tokenId] = block.timestamp;
        emit Lock(tokenId, block.timestamp, ownerOf(tokenId));
    }

    function _unlockToken(uint256 tokenId) internal {
        require(
            ownerOf(tokenId) == msg.sender || owner() == msg.sender,
            "You must own a token in order to unlock it"
        );
        require(lockStatus[tokenId] == true, "token not locked");
        lockStatus[tokenId] = false;
        lockData[tokenId] = 0;
        emit Unlock(tokenId, block.timestamp, ownerOf(tokenId));
    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual override {
        bool lock = false;
        for (uint256 i; i < quantity; i++) {
            if (lockStatus[startTokenId + i] == true) {
                lock = true;
            }
        }
        require(lock == false, "Token Locked");
    }

    /*
    ================================================
                    VIEW FUNCTIONS        
    ================================================
*/

    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        require(_exists(_tokenId), "Token does not exist.");
        return string(abi.encodePacked(baseURI, Strings.toString(_tokenId)));
    }

    function getBaseURI() external view returns (string memory) {
        return baseURI;
    }
}

File 2 of 7 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 3 of 7 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 4 of 7 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

File 5 of 7 : ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard,
 * including the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at `_startTokenId()`
 * (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // 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 tokenId of the next token to be minted.
    uint256 public _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 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view 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 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 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 returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    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: 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.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view 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 {
        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;
    }

    /**
     * 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 ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * 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);
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @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 See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    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))) : '';
    }

    /**
     * @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 '';
    }

    /**
     * @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))
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ownerOf(tokenId);

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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 (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, 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 {
        _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 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 {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        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 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

            _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 {
        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 Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    /**
     * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`.
     */
    function _isOwnerOrApproved(
        address approvedAddress,
        address from,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
            from := and(from, BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, BITMASK_ADDRESS)
            // `msgSender == from || msgSender == approvedAddress`.
            result := or(eq(msgSender, from), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isOwnerOrApproved(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 `_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) = _getApprovedAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isOwnerOrApproved(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++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool 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))
                }
            }
        }
    }

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        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 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;
    }

    /**
     * @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 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 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 returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

File 6 of 7 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 7 of 7 : IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * 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();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of 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 through `_extraData`.
        uint24 extraData;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            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);

    // ==============================
    //            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`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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
    ) external;

    /**
     * @dev Transfers `tokenId` token 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;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    // ==============================
    //        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 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":false,"internalType":"uint256","name":"token","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeStamp","type":"uint256"},{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"Lock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"token","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timeStamp","type":"uint256"},{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"Unlock","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Tempura","outputs":[{"internalType":"contract ITempura","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_currentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockData","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"lockTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"name":"lockTokensOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"nonpayable","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":"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":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tempura","type":"address"}],"name":"setTempura","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint128","name":"tier","type":"uint128"}],"name":"setTier","outputs":[],"stateMutability":"nonpayable","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":"","type":"uint256"}],"name":"tierByToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleLocking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"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":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unlockTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"name":"unlockTokensOwner","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600c81526020016b59616b757a6120456c69746560a01b81525060405180604001604052806007815260200166594b454c49544560c81b8152508160029081620000689190620061de565b506003620000778282620061de565b50506001600055506200008a3362003a51565b60016009556200009962003aa3565b7ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c58054600160ff1991821681179092557fa5049387d9cb649c59f4bda666105ba636c2a103d8e2b232ba4d125737cd214980548216831790557fa48544818c2c710afa9849c61ec9c60e8acdb3eaa2885f33b37e118cc8fd04ac80548216831790557fb91432bedff11256dbe14161d3606a2657bc9dacf8742f6b817d871dd53fb97680548216831790557f7b6f1ece0cbe5122a575776770f0494c2d57ed2a50e36c2ba0d811d70ee03b6480548216831790557fba9d637f252776d5e1b3534bbd7554a1265a4ef0539d9ca50abe118598a6973c80548216831790557f52c2086a203f40e709b1346663401f6c737b2fce5878601fcf875b047fed5fb680548216831790557fe399baa2fabbab2a0309615b124a802277bab50ec0ca3452a00889e216c4b90280548216831790557fe0af3347aa7e5af384208c9d29458f902f0ceddbc90963608afa77235658b36080548216831790557f52fb6a28cb3c239105f8f829bc7376f939b6bfb040c470bdc2bda0af2e784b9480548216831790557f01a49be1e7ea084651fd665847100d28826db0b17160863a99534933cbbd2dce80548216831790557f6fbf3b49b523bc27464b7dbfa6311951351b1d3efd07aa2ee4d1ce319801a0ce80548216831790557f0a206051e911305809ddd48cf2baa7ead2c7fb038e505e1d02f9e6c2ce72930c80548216831790557f1341e158d1184a2eb4edb96b016176e1c5ad075baae6651557fb93ae3925007a80548216831790557fdd2af3330d298808a303a10bc360333536e7697099bb3fe7200b0c272de6655880548216831790557f35c0ef8c6f7488ebe28ad34a3af68b3aa3aea0693e227054e9ec90bd504f66d280548216831790557ff8851ce6c4310b9be6bca97e0096f86a6320988daa397e63ba810d131bf2e10480548216831790557f61aa25cf391356ba640a4a503ee096a9320b1458703836411a4cfd64367cc40680548216831790557f7168f6bbe73ace5e8cd185ae572d98139e24d2e7580b476484635c9f54ecf57680548216831790557f86dcaef5b371562e25da7df8ee32083c9239bda56e7f70e4165f067bec093bc380548216831790557ffb3ec49021610accdbb5331dfb9427abd3a48df4a63296fa21c9774e949ef61180548216831790557fc6f8da1eb0f77655af0d84a5a72156e0ffb5e7022a0646de15af772ded57606780548216831790557fe08c955e5efff0d87732e6655002ef18ef6cad920399de609dbb470f9b22665f80548216831790557f3aae3b634cb9b99b51566b75af7ff73cac8547b09fca90ff6208ea0c2fb59feb80548216831790557fb500998a2231b583e908a1b39c18018d38ac385329d6bf58b8879659d91d392e80548216831790557f5f3c6c0b1e50e87c0039700bc4a6903edf183a5a76d5ce6710939618d0c56d3680548216831790557f2ddd05873c3fef7c1c99202ed0e35ef9973e6d947ec745875f730f32ce6df88a80548216831790557f24122b1af4725de4d15c86646f3f70018cddcad0f9cdddaa5a7645e74d8861c080548216831790557f860664a00dfe3a81038e4b9982a4dc19c019348163140cd91ec907f8a04990de80548216831790557fddaad61099ff76f5feb0e0b828fc01d0ca3774aac4e783369f898dd8076a6f7c80548216831790557f6ac758b3451d4d5df25347818aca7a69ccd73c13fb19aa4d3a98992b8e38ea5a80548216831790557ff862e31c060b91f4cdafa9376ea8e63d83d8cf50bceec82b7f106cef25b3d70e80548216831790557f7a25df128260f11398f51be7070910b502921b3ad0cc78db6387cf899ea120f480548216831790557feaa1832c18f7f80e4eee941d4ad1affa18337e15a87344672494a3a710b1932e80548216831790557fe507abdd9f918da3cb66dcd78a764d90f4fa5ae10debe885ddffc4f6256ef19280548216831790557fb7064c5f72f646cc2b351a32c2d7a23de23e6f2991c92d1bb345e0365ef9052480548216831790557f16420cbe32b58b581cffaefb8a93a11d89da9a0fb022fce8e271d3984cfefd2680548216831790557fc18c762cd57b960f55a02c55bb27432df7a820d284ca9c1007828f75083f19ae80548216831790557ff6c1fdf8e88daefcde180aece33b25aea92c0bed92258e7fbdaca3b42868bcb280548216831790557f5b1cbcad200ce926e5f5a9dc769f5bf6b891b3955aac7ec4238aa9877c7c648680548216831790557fa0272111609cfa27a441fa15273fba60a697b3bb82abb7269d1e8cbfaeef51cb80548216831790557f84b44b4b915a5e8b8f05e8c5b5eab937eeca6a50a7c3617f70b593bb58db017680548216831790557f2c0bd5940767c61adf5f9a200d3a62d1be3a79d05cb0f0a3315f38e67857f81080548216831790557f79cf314b0fd61b5256048df6d2a2b1d8d2e13b26c7d8368e16bd0062339340ed80548216831790557fb0e0b84565ad000a720bbf4a2ae61669d658079c49dfe21cb97f1e0db00c47ab80548216831790557f3308d4fe455dfc6cc2674c2746b3f1cf3a983c0c6a3aa7fc2808fb345aa2d72b80548216831790557f46ff1148c11735025a40295fc7b54a0944df25291c0552db969b4cb2dcea730f80548216831790557f4cc174dba0a1f0d4cad370f5f6b9ab64748d27d0573b589ff2f027884e8370d080548216831790557f597bd784f84d6fbb77a2700c9d9df2a2948c81aff4a5b93401ae3f1d76f24a5280548216831790557f09f1d6ae6ec356fb2effd93af055a401f94b5d86c5ebc0127b5d5f51b6100e1880548216831790557fa14893269844b981053f0182ee73491060a608e67b60d0929de0f18a3834ca8480548216831790557f74e742ff7c684cde569fb4e13c75900891a21eb654dd37f99cfaa48207467e9680548216831790557fbf030cbfe8b2174997c6a9c8d1e07cb39c051f4b7ef335a1a39a7db4e016034280548216831790557f0b0eea9621166f75e489a0d8548dbc2203d4caaa572a98b11cded00c6631893980548216831790557fc86ee4123785d14084afa3fc75db9171409c604823014de041457882b365b52b80548216831790557f1b46b00fd9372ae09b84ffc9fb0793706d3adbfdcb45f4cac8880bb66b8f105080548216831790557f1caae3511cd90b400f1fc3cf0114d9e6dcf79d328afd723f13806737c1823bcc80548216831790557f4993ee0f51bbc7acfd33a33ecd741cf46c6217b6a72d2e83ff49a62ba6670b6580548216831790557f3e5eeec337e02a126f7fca322b3b4bf5f086478342da713e1894b58e2893104b80548216831790557ffba5be3e032ab195d56abd5114911f65b88e2ead58a69ccbfcbe95ce8d277ce480548216831790557f0d36ac8b489197841faeeebe3135627926003153ae70272425cb904a22342e3680548216831790557f2c68beddbd3c6f361c933761b974971f4b8613589476d35440869749149ac6b480548216831790557f5086fc5e708cff27552447b982d2be7ff6ac5fe4630e7c24068d8351589766c680548216831790557ffdfe62899c30587663b9984280909a56d6d7226ff5f2e31464e1fc309e74eb0e80548216831790557f2bec297a3d40a1498e53ad6c4678c12fa370018a8dfd6f6fbd8a3917317c4b3180548216831790557f825dfbcc0a520db3eff2d6b4694471d6ffaaeeb8807e834b551fa567447d919b80548216831790557f11a71635ad1ab3b8c394742431c7bb7141d48e61c5f1b19289a0fd8384d2353580548216831790557f68ce74c7b29371e61c40c88dbcf988f5aad546b457ca69d6ea3bd81e37ff57f280548216831790557f746e3d461606fc2e06e02160004f1ceff720ca425447e88cae69e0d7168ceff980548216831790557f91e35cfc03273ca41e47ce373454c82dfa9d9ee7021a12aff90723d4fe6ae01980548216831790557f85681ce83ddb5854bdcca03d7ad8c9cb45b716a999795fd4fc11baf383ba4f4980548216831790557f165a317ed323078bf525a80093e689a8fa8fd2ee610ad2b9f4c73abf927e32cf80548216831790557ff3f83a3959083f5a781143e08371c348d1fef32daf8bc5ff91bf0b4163dfaed180548216831790557f71f177ea8e07c791122c46c80bed6dc943df48665622fa2fe33d1ab56cb47f9480548216831790557f8bc1988c04827cb986ff4dcb3aab9e4c72d9eeb41c66185892297c55878fefd680548216831790557fe1caa0f14d2b6abb2de8916fc2906e16efc29587c31a117bd2253c184adf376d80548216831790557f4b72bf64775c5a9fda70e146ee5edf9a0c4849366ba920a22d74327efa845ef080548216831790557fa719fa9272e39ed4eac3c306f112579d1bdece31efc598b6b83689be4f36ea6080548216831790557f42e0edf9a66e389dba2689adc126c7b706af6ccb8e7e839e94ba656026aba31b80548216831790557f6d7a92e696f0688f26e4b1ea6039fe4448d8a822e67ac794a76d0e65df6db55280548216831790557f57d0f5b704d8ae816a2ca0f2e2c4d6153682d770192d139e6c0617cca0a9157b80548216831790557f234c09388fd6138d33db45478142af8bb4c50511a1d25a0cf4bd840055ad252880548216831790557f2137b8eaef8d0fd89716255ba21f72f7ab1a81e36417ad8a2aa9ae6f171b344380548216831790557f40196769e641be91d3121033f5ff5aae0bfef0e4edab26dd623545c866a5d88b80548216831790557fe2fe48a5fd7d2330a0f0670b2a5a36311bcb3be4f5dee19a026327ea0a1a9b6680548216831790557ffd3c8294fd33ecf1a47c5624c3b8a07dd249fee1ef7e3f22baf0af2708415c4b80548216831790557fb71a4a824de53d0f2ff7c3d293e8d4284ab7eaa6e239e1f26b908dde8d1aceed80548216831790557f816f36130a06c897ec411bf59d06163b0ee29e27b58d1183bbd41c477319952d80548216831790557f5931b00f972294910ac98bd9c43d2241944318302e79453dd37ac86eb966fd9e80548216831790557f35504cad06b918ac3b98e7b0389ee1b83b50c4d65cc61af8deab0930348614cd80548216831790557faadcdfeb911a8d30a82a9fb8c57071989bbd6b6c5d571e1dd254efd69d21501180548216831790557f509398db79da1c14d7575ab1bef2e94996a55018b469fd22dc5ac00cb8a46d6780548216831790557f10e3def7f2c991f75745c5801cce0c4dc24801d77e2b666e55ec70518e88ec7880548216831790557fcc9e7dfbb25c9c48c7b3c83d1f6d0424e111f803afd498f934b783ba3d840e2780548216831790557faabcc86bc132c43121cd79979a9d848a6ad02b7707879c411ec9ba81e54a7b9180548216831790557f50697500444dd897992c876d79ef3638bf070e4c3787f13fbed4f05b721c6f6880548216831790557f634e7d034c47d4cd0ad0c82acfadad7899fa50bd060facdbc53f68ff17f379c280548216831790557fb466125162ff4a33896b534bd748345aba46904ae81a9c7491215ce70b07595c80548216831790557f45bfd6d96481fb043b38672744d12ca631a5f5c9317347fdecc1c40d5c88707e80548216831790557f83c29fe939af8af29cbbd02c4211c3e876080c910da340d0982b3814d36933c880548216831790557fa59c56e3968840b3bed45cef2612f72f4be629de04a595f4cda46fa029bf125380548216831790557f2e4e3bdcd0dd74dbf4f75b02f766e76fe1b67dc80fb8072104ef9d5e3b40b95580548216831790557f29bf4b7f6dec99cc562b4d88453bffda3fbbc3d68aef49a196e1913e2ae9e57e80548216831790557f055562e28c45296ca7a4bbf7c8a20fb29f57ddba02f35c8b8131a7346a9690fc80548216831790557f620e237be6a0516cff2d4a602608c9c91d8e7cbef798151e582bb57f5c381d1580548216831790557f1ae5b0fe1045352667c9c48ed5b75b735e8b6cd124434aeaefb7992b727e31ef80548216831790557fff52a2a32c09d016485861f7c0211f41e6105aa6eea1e292df89b102fc2f292280548216831790557f0a417c49670b5e7c93961f13d2ba57b22ba4b62acb76b5150551588a48cb079d80548216831790557fdbd1d51dc4cf771318e1e9f476274f09ae23d3834a9551587b74e5eda449478480548216831790557f04264c95e79a0efe6908fbe09505049238df54c856401556dceea4ce47d799e380548216831790557f47bc44f7338ceab72d48b89b776ad074c0c6d7fac5541d95a39283d2898d876580548216831790557f0f638e1327c9bdec8ce424201cb5261d6d370674c58d3a03344af47eb1dbeb2f80548216831790557f4e76955f0707a2f88d8dee54fd289910192112ab68cf1e748a748b358e8055fd80548216831790557fa3bd5d0bc36f2e2bbd5d271902a3347b70fb49f3c6f12369a9d81c75718c6c4780548216831790557fc75e651d8747d0f3a135ed582fbf050338f5f1ecb9c8164e4e7aae00b569adf680548216831790557f4b11155ff6cdb247d37378ea4ce90f8a50cda4c92499d9bcb9b853a3e8e2c50b80548216831790557f424d8440c4f1ebefc1dc58c04671d93e3e16cf2ee9057e15b76d57223610223380548216831790557fa467a9f4f15c120f245186d8cf32159fb376f2aec7982cacefd09a7f5c5ea73d80548216831790557f5802818d3ced2c5cc03f2014881615c87848ee5bb2f57db82c2ab42b4cc4064980548216831790557ff0d51f9177e103712abe889580c0f6236a664275568c88b7caf16deb307c687480548216831790557f8e782c7b724acbefe5e8320c1f14cc43750fa959a98cdf1bf6fab880292dc79780548216831790557ffbb7d572ffafae85251a0bea634214347cf4b3f7f12fd0d0a832f4fd39210bd780548216831790557fc312840a9764affd25d81a331213a1a217e9f37b388c3739f13cf2f94af823d680548216831790557f6d43e628e1b27173a3eda9142775172ca3c8f4d2716402948854148d5bfc497480548216831790557f3589eb1853eed86163d7e18ece8dfd7ca07d057a345071a09fb88f582e62636180548216831790557f3dfe1032c2851726b1803b9fc474aaba1bf4733f454de76e095c9319fc63fdb980548216831790557fa4b122763dcd305d92c1e7f3d397d87322855e422db7af7da087fd0714c8fae880548216831790557f5a51ebea1f75895c8186c98f18bb52383bb2742deb2cbcc6016584f8406ea0c680548216831790557f387af389f2db60f19e0d9ce4d37f5517ba9dc49d44004823a86f8a58d4459af080548216831790557f068f71b043d5583b30c5470da2ccff45032f16d95778cc87f1a0e11199695be480548216831790557f09e2d37a38f468b72cacbc3a902f6dd57b9064b7c3c3977b2174a7fb3df5435180548216831790557ff056593e250294e81c8d9831d2fe63f5b11ea9da07245b1a181ca65bb1dd6af480548216831790557f5acff4cbee4aaf6115a47c66494c7ef256f23eeee9805244d7c437b64deb254a80548216831790557f99d702e6194622d28f2ede80e9977b5dafed64923f3e455f75dd45ff771f393c80548216831790557f57df202fd12582703230fa83d75163eea16d78595f0bf57d55c77e715c0db6b880548216831790557f5952356d4b85483bccd68f345ae8960cfe5845d01587a2d24ed1e0be5dd34b8280548216831790557fe7b8c912244c9d359c7a0126ed7d965046b9c5f1a4f2050138bdfbfd126d81db80548216831790557f09b5b19769ff8404a6d6d9abf4f90379cb20f1da18348439d743944d197edb6d80548216831790557f167492ecb7762ff91b3cb44f9472320dd9b456b6b3809043c581a982812e0dea80548216831790557f4031f1224d755a9dd736589d2736caa2ded444486e672a4244b141845a6d192080548216831790557f7773050da6a983e6287d8800ac705ebb9baa96a902f8d8ef43c56b88d98d1a8280548216831790557ff85834fd9f3028048b458edc26ab77e96a833f9a920a7e90f586e1baa1090ef680548216831790557f34d7c4946b712f993bb1c3d168e5cd6eddccc12f009724ff113f8c89fce1978480548216831790557fc9a7535420bf0d831947604876affd2c46311a151d876131484c51b602aca14580548216831790557f7eda4ec638267dc2507707303f79158fcebebcb16f4f470455692cd09877e79380548216831790557f76dc527a3ce7059aaf29a4797b7e57385fcdaa1ddfafd8236e36e38e621672fb80548216831790557fb446168f8507921629b0e70cd701e479c6a0bbca71496cfac4a0e477cbbcdc3180548216831790557f5dd1c2cb7c26af4b371f3b22744cf8f4db2e7453cc324d24b0c3db12101eee2180548216831790557fae25fec8c6ea062e710b731b23e65a4fc60904ad9a2a5595620fb4d1b8ea402380548216831790557fc15b1d1e3c2e3c4400a1082ba27beca7398737a2efc4a1b496c737ddc150361180548216831790557f0a50cf052623114f6b6e02bf9190870d15006d8087b3b124eb837cb794686b3d80548216831790557ff2ba378f7ca6eecec1c33112990ce0ccbf772195f99a0e3f312e9cfd7b878b4780548216831790557f896f1d6e050f6e32f1e377da8833280c3712ddd58471473142fe4b7c1265b02580548216831790557f81a72069c37c9ff1a1028e4c7f40c0f80ff3351df1006d1c1cb59676faa61e6580548216831790557f07875669ab1613cee0e1fcf8318c49902a771ac9b516cdf15b94422a9d158e7b80548216831790557fe04ff3ca70febbe24d21e628fbbcf37347448ef5d05080a5520f1d745bf7989c80548216831790557f7ce9e6aee908a5016ff3d87672ae2f3ec906730b8e86e0c394699f058f8ec70e80548216831790557f9194fc0065f7709b1c1572e0d254755e41b93a977a63cc60d7afa942f46b4e1e80548216831790557f4e6e1b120c89728466121d1061dc8859b73f2bfd0a09a7b0438bb91a4def5a5c80548216831790557f961db0ddb5606cb0c9e4bb4bbbe51009b28396effffd51b0db2107c2d35dc7cb80548216831790557f34982247315ead19890a43958db076643373919ada20eec943afb96df864454280548216831790557f88cb92f34400d5b7361ae7b0ee544efb03186145353862c8da217c04634380bc80548216831790557fa02583a7875d6c1bd3771a888d2bee4c4b4c0a9c2f4d623ef679ed0ba51056fb80548216831790557fff17b5c1421687f0b457afcf9101468f5f3a42e49f7472e2363fcdf7e258198680548216831790557ff387fa565f95ee944c0801c5d47db54c8aeaa921aebbc2691f6263072071ac4e80548216831790557f3ff7a5fa265cc8de8743f11e37816937d65250af28259edad2ee0994492952ca80548216831790557fb2d3c4352af3635ae8b7f5f1f252e3eea4a20cc5aa663b6b33169f2f3a4039c780548216831790557fa70118631b4dabeeff3be89fd88e9d69c2f7ee198b74f8097749a78948c1951080548216831790557fbb83f60580d1d9221484228de6121e16da726cfa036e2e1061efaf2cb704cd5e80548216831790557f7bf9d14c60d0c6fc4d7ee40824754910ec7703ed24488fb07684048cc393c02080548216831790557f2faab8f0d08d13ad63a52bcf77a820b3ef8bc092d84581dce73ad96af2dcd6c980548216831790557f6225e1de74e56d831b3dea0b354b0a20711046a7a4e2c3a2525a4508c1a97a7e80548216831790557ffdd869ab35777fa505029e1b03631462bc5af788b35f9b53d9c2b0b9ace541f880548216831790557f4cb2e3f923dd07183937b2ab80228e903f0581f9c074121fbe78fe4225aed3df80548216831790557fa964117635c9b912135a575da61bea7dfdf2271da95d4e7bf666cc359cf6face80548216831790557f3158dd26dc4c79b3b9476011ac01bb53df113897332efc6c0f0ef1232275088c80548216831790557fe325afad4915643ed3047b3254bf40461990c95b878897095f14b7b1d820d12980548216831790557ff5c018af5e7b836c249e6e43efa4d3aad30f862f23c8283bdcb35a399e7592d780548216831790557f0843c43429c27871351fe467e66f72d9c457328c4d44f37836648b038dc556bf80548216831790557fc95420c630fd1470e73c9765e205eb29895773ff11704d0fe69f97b865cdbd2380548216831790557fbe92cc0d9a59ba6f7332ec2171d206fdb11ed3cb077d185c0c398ee6f80a10d580548216831790557f3f0dc6224e1cb53598611c19eab411c399f82faecbfcda00a20bd4d788501aed80548216831790557f169dda4117be461d695d3319b81be9b8dddf48f27b0878cd2297c5cf63fc727680548216831790557f427e7e3d4453f8fe6749b342e356d16be18eadede0b53d4d3027587f623e257280548216831790557f3547fd1db590028e4519a092a68827a6d205439dcee13bd518d3b9a289b56ec380548216831790557f145b269ffcbdd74f2e621d340d81f15b7f8be3cfa4491437f0297afd8b66d66680548216831790557f0dfff6979448a1a1cfd28445b17871faa1caf5e34da793a0e1bb8587bfd56c0b80548216831790557f8297aaa23147a8427e531b2f58bad8ac892d1d6f1cf304bdf15af233853d1ed780548216831790557f7ac52f651649deafa81feae8abcf9c804d729dced4726fd51892f7b97786996880548216831790557f27453e7eafaa367c40b66186d2194a0329fe637b46d5466d8e4419380cfc752880548216831790557f8d5c5e415c1faf3458e4f418b382faaeaad9b9afd90726390f834bc87c79dc5880548216831790557fb9abaabebeecac6862b0f5e1646ce9088c8f617a14c056bdfcb880fcf998489980548216831790557f90dabfeb2f9af689061824362bf8aacbac729441190eb998341ddae3eb5cb01b80548216831790557f342780a86287dcfc6c5bcbbebedbe48960346fa1db5e27690d7d37192c81c88480548216831790557f9b3aac5ae7d3663b6c46c647c830e3bdf9348e2b2bd547c3609cda064e4671ca80548216831790557f333e953797b912e08a100876f7077f20e89f2f0f17ff3a3355cbfea8b02eb96e80548216831790557f72cb1c16c531bdc3f7175bc9c3b942a73c0ae160eaa0bc0b9f84ef07286c7db080548216831790557f4bcbdf716aeb3a8c09e5b04a18a6c72bc9b1401d8607e512a7fd3cc19d0c6a0080548216831790557fb2f7ceba361095172109937b0f62d321675ab8632c73611406c9536a751e164080548216831790557fb0bb135c343f5ca61bc40a51734e55ed4a9626b278a3002b32f74e5a72f56fcb80548216831790557fe26dd456e7a7f9a51e1a5887a8643c1872e50ba5b490e03a1762956b29a06ac680548216831790557fb14c7aac676e5789e2e80247cec2d4262a28b96f5b76321939b36925172c9d5280548216831790557fe9e82422d7e5c4a1aff26e68ffc0ced0d715aa9080d59ad7dd45027b60f9e4e880548216831790557ff325997efc45e847b145977fd00d519cf7b4ae08a2b4f5e1bd2757ffc3a6700380548216831790557f11c81689a563091b9be93ca7f0bf6ed95deb1a97158eda7998cbccb38affe1f380548216831790557fd0dd123e44b05e5aa0f84ccbf200dcce2e259dcbc39bf00dc0d6560aeb31df4780548216831790557f666bd106b1ded8335d127faa41da13b02f9d7a29d5b2b1ddae02a5b1bcfadf5680548216831790557f9613be95bc536b6770106a05a5d77d6db562b60f38579e25caf33135dd38bc6d80548216831790557f071000a675270772874c8b3536695819cc1cd13d733e06f7364cc382e56d746c80548216831790557fee1478ace95a24401016705b2f07c260bd6ed36e41bee15c3a7a8f392f0dd8df80548216831790557fd9d130e3ca46a1714a886177f82a3eee694f7d0cf26248d4c670985b065a9c1c80548216831790557f0b024923df85817fd80015967f8855bd5767f421da6c688bc03f8f567e4b93e480548216831790557f0ca6e46a1397e31f5224012ce78f8935ffd716a735eb3fe6bf6e7c05677fc0de80548216831790557fa2b9f441a1769f59ae9be9ef89d2bf3586d3270d749f52bfabbc79749c83edcf80548216831790557fd1f0f9cfbb83a7bf3bd8489ad31576284e08239b8c89ae311664bdad19a36b4c80548216831790557f378cb008b8986fc8a95016152911093ea4cc387fda1c5c61aa425f5da761e6b580548216831790557fb49c74a5d861230b77d6f07a72d96d36fb06318d11ef8c61ae30feeaadc7cc5b80548216831790556101336000527fbc8c95eceaf087cebeecd607c38e8ffc5f84025cb3ec07c7c54cfa6331d7e22b805490911682179055600c60205260027fd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c8190557fc0da782485e77ae272268ae0a3ff44c1552ecb60b3743924de17a815e0a3cfd78190557f5b84bb9e0f5aa9cc45a8bb66468db5d4816d1e75ff86b5e1f1dd8d144dab80978190557f2cd9ebf6ff19cdd7ffcc447d7c7d47b5991f5c7392a04512134e765802361fa68290557f980f427e00e74f6d338adfccc7468518c8c8ea00836d0dce98c5fe154e17bf2b829055620039fc91807fdae089abd7155aa13ce498edb0d7a7156b783d015031f10c9a3d4f5fcb518971557f2fb3c9afecd3f0d43923381d3e9f60168c039b98f0b7120382e81b682b7bc3168190557f9e6c92d7be355807bd948171438a5e65aaf9e4c36f1405c1b9ca25d27c4ea3a08190557f6a9911425952520efa6de3784a0ac63c35d3c5bb392028ea0beb0dc41a1919578290557f551134c3788a756a109c6e227f794518fef985fa2ba3fac727bcd6dac5e98e8f8190557f270e7751614d4e91a095cd3ace3f4d517c1b37aa711dfeaf72be0b76abd048398190557f55664edbebd57273ba1f6d1c017cd920bbceea562d5502a6837280a660edef958190557ff77830ee6ca813461e84e66f2fead14ff7f40269cd63d8faab5b6ce1c3d8c07e8190557f9fe279e833bcb8beab045538c3e47062dba2173d3cb9299210a3ae3478eac49d8190557f40f1108237696bbe60a17fe2a155c116be4dd3f1a51814bfd40efec622f2b4bc8190557fd8dac8cb0b26825dac24b42aca725ffacbadc03e2a42734896eb984ce196259d8190557f693426d4b4e14c633fef30f9078c13e548d510bd2b9ddbd4fbb6d7db48c3d9b48190557f3377e215baa0ca35d3616f499e5c09359a769b94ce0637346960541be030732b8190557f474b71661ba4f296f0558dc263a9e7087ad32825e7e3e721d7824c779a0607068190557f8a69cd99a9300b6f278a7cd64177087c7a01a605a7305ab8002d8564ae00e34a8190557f72edfe78b2d259e5f8bedbff15cf4b63a3c5a819f9534071bf934e42aac19df68190557f32f57031be3980b83490b6329e2e3b7ce475446e73fbb98d0754c951129bba348190557ff47a2f56f0955e689cdfc6405887e0f3452b74fbb1c4f20652e6c211a96d68b38190557f6c675f231855f627a93e11d9f743240c8132e5921217196b16be344917e04fb88190557f242de898f09cc489709572640b0282694d1e57aeee4f2782dfed2fec0d9734528190557f51a73f098f8eb113468838cd83eeb94a3acc7b32d37eb9e0a2d02ac7fe5ae6728190557f9a86beb6228bf168307f184cf63c593599ffdab1a9a2399ca6e1c21e6fff27ee8190557f2b66750ad81d2c4a0a0ad3fe62fe97e0506e09b7b878f08f5caf5fc39cb69bfc8190557f2f8d0863d1503b48b8db94a588745baa1aa34f821c792ce05db827ed7b5f138f8190557f3b2dcd766b1e6e901ec8247b9d753cc6a9192a740b545c4df7f412281bec917f8190557fa7d649518832acac3aec0a3a1c8c99f8e737fd04d44177e8b9542b8e88ec4e488190557f2920f2398030b3343ee0b00293fa1b4df4983e83e02f5dd1df737c301e2cd0718190557f74c83704300c65b1de76b9ee7537f3f330650a1d59eb262898de510c0c350be28190557fb9956f4f6db14839fcc7a648fb95ae3c8a94149897d9fa7d0b3cc56ae71ca2198190557fbae274710ebfde648b5b9df374a8740ee00d008663de7c52a2f11f9cd00fc9c38190557f85b34e0fdf61b127a0ceb0c58fa33a0ca0a963cdc6b60150248f464691c4f7448190557fcdc51bb982a5165eaa17bb8b68b2b0e352011bba5623f620a293923ef5ed14b68190557f1e1a8a45fda41d3411e5ddb7e31c782beeea24f581fe27d1b40e8eba897e4cc58190557ffa587a69ff2868f708e56f30e58eb07cfce587b7d40951fa6177d9441e037d3d8190557fec5bde0ead8f35a05aedac5459a2abdad34d3e33c50aa5b5b9ba0caa25c4bf098190557f771a62db98e58cd6a94d8107f35532c6b08eaf8878f356e8c086100b831d44a98190557f5175c0b6eb66f6a89d517d8f3b9050b4741e41569221c140e28ab4d1383030e18190557facdc9a95c1ee54edc6995f889f29660483ccdd95bdec803cf09957520d00ae8e8190557fe486e816b778026e5a877e84dc6dc9c42c9964765df37a8384b7e0c81b85b0808190557fe97dbc7dbc3257ef583151b2fb7adcb4902c56eb881d3a3bda305fb607b76bbf8190557fa48b9028adba9e02002cb015c9667ed212e0846360571bf15b59190d632867bc8190557f16c46ee027eb65f4a428e3ada1ae03f7ca4d8edccae96b82e1db4a158a03d6a38190557fc13433af3fc85f508753b93ca7e00e6d40a42ed914f1436164b77de8c25eb7748190557fbdc3f465974b8e50e2f9aae1a46119e0139707b6d0cba0a53efb520194542ae88190557f96b4f44406f30879aa77d6b0fdea83dc73be4c43f64afc2b9aa7cff913d85c1f8190557f44d9416351d0997c6f354d72309fad9f15fb2701f5474f163270db90b95be1778190557ff8e7a3440a99d4c12590ab082d4afb47a0226ee4ec75d36b3010debf946467168190557fda82c5f074260cd23221e4ae00d071f0dd5ce46844c7ceba1da504364741fd718190557f34976f31c8c5ab61b2c7cceac930975c5f2a578173fa10219994d2dc49f281258190557f95e4b57a730ab3a177f6a67661422b42a6fbaec88a943dc5e23f90d5e840a3748190557fc5659e09fe07835c24120b13c9c6612fe0770d41915ee361888e8870960e232d8190557fe24d4c39159f5fbc1f7d545dd6c120d28bbe4eeb70101ad5e1f40174d2117bef8190557fbe0bda1c9559a671a0cfdcb5d4d92bcd20930c157d843f7bcd819c971706b10e8190557f7acdfe8ba44341b011dd1c06369e4c003629d236f94d8fdb80eec9357f3117a88290557f342cd1b50a535bbf24e663b08a5a8f2e8ae25be1c51bc56fdb1d42a5c96a0d118290557f61078696b9b0454ff235832d5929a35a7ae754af8c2b7a5c18b83c63ef7c75a48190557f81e1fb88e0f68847e6e1c84a24bf9873a331bb975b0566e7a9a0c04e6fa6996b8290557fb6fee850c592782285e2afa4b9b9fe57677af9af6c836afb1b518cff893d6d368190557f05d8f60387322d90a430a1c274f3a1757ea9c946165c1e84c740f72c6639a74c8190557fd49bb95bf77df70901646d29225d60a4be7777a660196fa5ca7d2e1976dfad9f8190557fe031583a5905d77d676afce6ca8b635f61e5b2f0fa7f4d60fb7018f6c795ac338190557fe9d6a6ec1455b0fc637e1622660aed1d6516cc1a347d4579e465f5ee6be490848190557fccb2241f604186e1ec5a6ff9fcd294af6593a87ef0e0966dcb97d71c83541f448190557fbdfa1b43664e651fa7f48af3630d52e8282af1236a929e5120bffee5cd22c7c18290557fc403433866350e986877e09cb1e2f777b3df965c1d3279707427d02eda65e3278190557f4c00f71f01a52daddc45b8daaad7c3c1fccb6bc3cde62eb98a2332cd183874b08190557f40bf9d9f34e44c316634927ac0b32bbadacc4320b4afbc5a2c3cc0df5c0089df8190557f516850eb393bf5ee7d85d9f49af7fa24c1b98b0d04a9cef38a73ce4bb69209d78190557ff0ee9ac195f39722b2587bc975d0b26302224865848a66b79f3f345fca38b1c68190557ff930d965aa0b020b245c0631e5046c9e163ffaaf0d282e5b9152ce78f1966b538190557f67fb093dc0b3c4011073998a5698a037e50aac80a98282822ec0d00c3b8641268190557f12cb41e0d9174da94bd5172ad2999f8be62d47f06a92f3d3fd273c9ae1f769be8290557fc66a49908946c4f12ac28169e2377ec5f091659a6ff6397e858400e990c4b4678190557f1d53fbb67b617731c8c315a7cc5c53156f9a9645498130515259a5136a5539ed8190557fb607dbb23994189c2baf7995df4669730bdec3c5b1fe9acef5e7348363e255c08190557fe3cdc4103a90890808b189ebacf4b9e1699a148e60128538106ef1d465d116408190557fa37c7fd6a8dc0a4b968c5c59afee10102f6f56d399f4666ae6c8ae5f9f2e8a468190557f52a0800165437fce57764bd93fe76ceff1ad18882f7568c7930a2e06b6617be28190557fbf721d46bfce5b9703f90c7a1414782de605434a788c875bbadeff78220bbff88190557f5528c759e24bb186b39cf008793d9cf3525a200a87b9d05d8cce3bf8dc8c5ccb8190557f4d6e533177f335b93338c800ef9001cebb66b46786ac1073eb73d573d627b6458190557f9f689cc2069ca2057c24ba227f000c5ce40311740b40b9ce8b38e61c0143c4e58190557f27cdecb3522fc719403f7cc65fde2c9a95715969d26e67f871ab6dd307d5b2f28190557f7d286a4800357d79ac264740271a4d26c2ac1637a72165266792073880498d228190557f2decbe1040bc31908f58623fcdcc6384a18b2df7d690342007df0a1f152a1bb28190557f8202e84fa0ab56221486d3375133a1ce75fa898558a19bf9a0293c2b1d5e504a8190557f36545c8c1b99ac483b2039d33429cee78033679a5922caff90c792cf3f402d3a8190557f11fb04b579675078be11871e36c3fc56aec9fe6e19f0af931e9d1f641542d4228290557f95ff713956038c8348e0c7f9f2f123f967280049b9355bc276168aed8d2ef2ea8290557f9f31e87265ff8f9ba359b36a7ce55741169a9bb02a9dbeae8197e2b87e24168a8190557fb9ef9c76a4fa3cb87f058335be08d15d53220961321afe47d3f0154f040e3d2e8190557fcd93744c29f2af0782f0f80d40b05b1a8f5f1464fb3c2543c3b546fcb85be4028190557fb3a0cc641775e8a7d60345a5a01f5f5808462ecac316295ee28089b24271351d8190557f6dcf333904dc6817c5936c24c1cb27d2ebd199bc601ddb9222d1baf06886a4228190557f5fa2b7ba08a2c6d6224b0b38145ea0f93fb1256db644ca42c51bb07e35a7de508190557fd8c142560a77906bbaa5387553add955ec31a5df5181d2898721cb96dfd5c0c78290557f578be511e8baf0fa70c200c7d5a28555f6086bc73676e57f3f5a978ec42ecdf18190557fb9902fe101ece31f06140a19997e7c43885519cf1b7865e3ee6eed9509ad5c1c8190557f73c62762c28203d6d7a7ebc36492c2644235deb0d4ddc5ec99857766ec5c0a268290557f047cf0a3cf39ba981fdf9126a6a5ce2e58e784d13b1fda97ef7b19165e76eeb68190557ff8a487a9093be9b5bed25fe6932297a24100394551e7b15f4caba620cde466378190557f78ae9bdb7aac335f21bd61062b7ea43cfa5cf129b014045d1b91acfdc4f3db408190557f3ec204f33a502ecf70100f27d1673d02344ed7e0ccb5350d159d4962fe5d48c58190557f53d97bc156a1a3db42412a83f866bcebbf3d203fcdec78a9e42d0999ded7938f8190557ffae6ddb6fc52bcd1bb130a2a59488985a8ceec3d738dbd0785b2dbcbe05228b28190557f6bc138ca850836ab2d0dbe55f7bfdb7d8475f9f123fe4ce54b628655b5fc622a8190557fbc33bbc2e02a3707a50f5c831767b3171c761eaeb39b9c2d219bf9670a9289e58190557f76c9c1817712795a41aa91bca547655432e283fee95d105231e61c10bded3dd88190557ff17dea50b9d1918c066fb22830598e168a3100fc979a2723be59f06ac8074c228190557fe8352c2bf624c1dcc540473be4103b48c4ea1811dd6d61588c5de9a268d3f5d88290557fad3157f10f74ed02bcd2d9655cab299a5e45cb5522de29fe16c40cc6a26d7c0f8190557fdfd3ff10e24720d3fc1dd22fcc6d449a4c7a7c132b64741709b30420e99d51e68190557fb289614b6ebeea17c96860ab4de6cf0cdd1195d55b47d97d57321f02307a7e788190557fd9bf61c12ebbfb2c6a6a9998b18894eea69de16c4d1e199a1212f9a3ff50b8638190557f63b5267cde430eab94ed0bac8c51fec1071aecc29fec57d5e6fc2eff0f77c8ff8190557f808300085f8d755b25b3d871f2e91001d1881ae4c66fa5f7f2b6c8e0cacf62038190557f96329102262f3fb96662d74a26fd6369e7f2150751ae8f34c9ae6c86af98a0968290557f556f572ebcb93d0358e99a8b21f527bba70fe9e4138b7bdb9c75dbedb209775d8190557ff13444a686b7197dc3052ce34ff0d784a99d8d99252459d51a279a1f3cb9c1e38190557ff25fbeab8e5bf38726eb9df9c7b1e071ab1afec4a39f8e1e1e3ec65b2ffc4b3e8190557f8fbac5dd83caa891a5030b9fd8d50615f28d52a6a9c731981899d3f0ccfed93e8190557fb593bd8e2a6894c36307fd15e1befd7e1fb05de4644c467d4b892b0fa7cbdc6b8190557f3e9a3ac1548f5e9c1137de066afd11642d7cffa1cccb282496ef8b93b72996bb8190557f286280989e6dfc0763edae61b1f27ad5ed5aaffd32391590925479939eab53238190557fc3aa7c4d4f90e455ccffff101ba78c210d40880df0202f0cd59d47e503f0aef28190557f0246857e70a3fe465de049c0d8bcc9bf8d1621690472ea4230e5dfe08ee4e2a38190557f2a92e5366a6160a66a08f1a3d9c5eafba4da6122987c978bc6dbc84ad3a5d0008290557fc597a83b317d2fd0b5fa4f3c902cc5d651f4c8676064f5e3aba09e3304381ca98190557f8d10862a7e59cb0512d7ab0f74c01e59e56dd8dbdffbb66928e13fa027d9cec18190557f1f6b70541e81fcc6272b41c996a7c5e93d93c3ca7ab0514c8e8edb2d825aa0ee8190557f7016cf8a993b98e5e82d36598447abea71276e6348de6db69e8131a31a7a62408190557fb565141880f1a90ced225d95351d46bc245f2fd1612c549621b2b635ffa8fcbd8190557f476a38f81106cefd136e07b2c1f6ce5505000de62994e152b25c9b751497b5638290557f4d92cfa7b7d38d4595dc4616563f67771345e2bbe68565d34b28a0f861d24e358290557f59a98b9418f2ee2deababc12de9d4279804b259017ee4288d2185990a93047b88190557f02cf3a914bcf8216bc26b9159629b80e144e5352f39537dc3a0cfb148d2817918190557f3985b17e0261f411489e90441f5034e41f6ea3d89bbf960e16c6153a296924278190557f12ab5a45d26433c378acaf02fb029fe4bd1f82e67f182e7c229fa1a4315686fa8190557f7ec68347036628bf01771770bb094a492be704a65dccfb8d31905c46726740468190557f3730d388b88ee10907d7c4913bfc35a2d99d86bb697338be9c04da8c66caeb598190557f16c55b5cd22a12ae251f36b5f2bada0a348e9748fa0cac1cbb6d1f38f079704d8190557fb91a728a6fc59bb8622efd2362471282491c23d7d7889b84b49be7ebd92c381c8290557fa3872cb1d79620426cfac258d841e8ce773872d347b5a65eabdc3e93dcc4e3d28190557f2f1302f1e5b8c83cb243fc9c6c091f5e4917e9d40b35f0d32481749796a79e808190557fbade338d042f49a9a39283ede55c3312706b420bd13ed380e1490f6c1ecb1e178190557fc2d282d8c4711cf49b1890a1d3a761eea3e91f610c47e6e8a69dd49395bc2f678190557fdfd9e40033aa8865f273b483d8b4a0742e5acc0861b12f8f9a90c60d006a51548190557f12fd890ce8b6f3d7b6e97f5ed8b604bdff223ac1883be76cca7fcbee92edbdf28190557fb94a4f9f76b1c21ada6e3be7ad472c1cba9419de613bd7d714ecfb6639a2d22f557fb078ec3b3ade27ab7d37295252a78f3d34c2c0baaa66bd30269d96e7d0b968a68190557fd5bdc2c05950a9c7fde3cb1c3b463ac63ebc87fb02dbc0436c1e0bbbdfbf6b9a8190557f3a0cadecb9d55e5098395cb4dcc0c18b8581bd848baf49162866075e7bc550268190557faa85d77f74cb6e46b09d51e256b1fcad89aa8354564b79dcb7b6ca5aca13602781905561014d6000527f7fe7cfa729d2a24f71a66761ae535e6fd5967a30f706a2ad01e2df340dfcda9c55565b600b80546001600160a01b03191673f52ae754ae9aaac2f3a6c8730871d980389a424d17905560408051606081019091526022808252620084336020830139600a9062003a4a9082620061de565b50620062f7565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62003ac4733b36cb2c6826349eec1f717417f47c06cb70b7ea600162005f93565b62003ae573df66301bb229dafb491e68faf9b895b9cdfe5ebc600162005f93565b62003b067376d75605c770d6b17efe12c17c001626d371710a600162005f93565b62003b2773984b6d329d3aa1d6d5a14b134fb1fb8bcc66d60c600162005f93565b62003b4873a724f5c322c6c281aba5d49dcfd69df1ce11511f600162005f93565b62003b6973c2445f027e5e3e0d9ed0eb9ffe20fbb5c580c847600162005f93565b62003b8a73b8410f47e152e6ec0e7578f8e0d79d10fb90e09b600162005f93565b62003bab73c4a6d14d083ca6e6893ea0059195616fdd61f655600162005f93565b62003bcc732ff6b407d0bac20a27e80d6babe8a5149852f4bf600162005f93565b62003bed734ab59d6cac15920b2f2909c0529995e12c509b80600162005f93565b62003c0e732520d890b24aa71e9200183a8b53af87bb6ebeee600162005f93565b62003c2f73590f4fafe1966803c79a038c462c8f28b06668d8600162005f93565b62003c5073552e366f9d3c4f4c1f9f2bebc493715f866fe9d9600162005f93565b62003c71733c9a29649ebf0270a3214916a8a76e0844cf8db9600162005f93565b62003c927302b004114503f5e75121ef528eac3c08f0d19305600162005f93565b62003cb373346affc5c5e7bf14ebbc33530b6e0488fb8b265e600162005f93565b62003cd473eeba29bc63c008b39a432b17382d5441cba5fc31600162005f93565b62003cf5730a90b83884870046b73441af03b76c35c1d21763600162005f93565b62003d167387e974eea31c0b5bed051bd7569de8176b447e53600162005f93565b62003d32600080516020620083d3833981519152600162005f93565b62003d53736635675c439f545bc9fad80d40c3c6b054ebc402600162005f93565b62003d74736249cd17aaeef4cdd467785780c669b03b2acf86600162005f93565b62003d9573c1692cd69493436b01cddcbe5fedbc911746a7c1600162005f93565b62003db673ace7858a2514075f5ab8dd7b947143c0a82a5813600162005f93565b62003dd77317ff38f48f36bd691b5322ddb68792000440fdd6600162005f93565b62003df873e905d18bd971ce7a1976e0241db396faab8a5a32600162005f93565b62003e19732e24a856d65be4319a883e0489f1cafbb0f3c468600162005f93565b62003e3560008051602062008413833981519152600162005f93565b62003e56738423753fe03a4f0acf792e00426bf6f758ae645d600162005f93565b62003e777302f60fef631ac1691fe3d38191b8e3430930d2f4600162005f93565b62003e98735b85b432317bc8e16b4895555c2f822271400d6b600162005f93565b62003eb973def769bcf57df5a2400ab5f9dd3aad5981079689600162005f93565b62003eda734ab59d6cac15920b2f2909c0529995e12c509b80600162005f93565b62003efa7264f54f2084758afa4e013b606a9fdd718ec53c600162005f93565b62003f1b73dac5b25ad77c0a726b95d6a448483cedc5284fab600162005f93565b62003f3c7318a01e6c1159d606fcc3148a2b9836669611c0a0600162005f93565b62003f5d73ced0ed8cb5e884ae4e2a5e8aa9ece1fd3404330e600162005f93565b62003f7e73c502b4e8346524cd679fbbada962317c8f0e1291600162005f93565b62003f9f736d9ed472da62b604ed479026185995889ae8f80e600162005f93565b62003fc0735587c8c50f189b79e93ccefc62a00669a0d181dc600162005f93565b62003fe1732c72bc035ba6242b7f7b7c1bdf0ed171a7c2b945600162005f93565b62003ffd600080516020620083d3833981519152600162005f93565b6200401e732cb2e57a922893c5a843399c42793bdcc6fc844c600162005f93565b6200403f73011e2747f5e393e67ce0372cb9cfbd0b9a4c8f12600162005f93565b62004060732741c7a3159f2a01a19f53cff8972a7812cf6418600162005f93565b6200408173d6081a2823f9ce4e78fb441a693f91f0bcbed328600162005f93565b620040a27387e974eea31c0b5bed051bd7569de8176b447e53600162005f93565b620040c373e905d18bd971ce7a1976e0241db396faab8a5a32600162005f93565b620040e473eeba29bc63c008b39a432b17382d5441cba5fc31600162005f93565b62004105736eb6a8f7f6d071af1311b194893c12796515cc54600162005f93565b62004126736249cd17aaeef4cdd467785780c669b03b2acf86600162005f93565b62004147738423753fe03a4f0acf792e00426bf6f758ae645d600162005f93565b62004168735587c8c50f189b79e93ccefc62a00669a0d181dc600162005f93565b62004189730a90b83884870046b73441af03b76c35c1d21763600162005f93565b620041a5600080516020620083d3833981519152600162005f93565b620041c6736635675c439f545bc9fad80d40c3c6b054ebc402600162005f93565b620041e7734ab59d6cac15920b2f2909c0529995e12c509b80600162005f93565b6200420360008051602062008413833981519152600162005f93565b62004224732c72bc035ba6242b7f7b7c1bdf0ed171a7c2b945600162005f93565b6200424573b73c6dd54f3d1723d7d76cf230175b9100c36915600162005f93565b6200426673462ea027f18b85e550225e3a767cbc8c0833d973600162005f93565b6200428773f52e3f7625b56a59f6caa0aead91a1646c983be8600162005f93565b620042a3600080516020620083d3833981519152600162005f93565b620042c473298c30f70bdc0d035bce76d261e758240cfad93a600162005f93565b620042e573d71514e903f1e3caba8b92f8b980a16f0a3a413d600162005f93565b62004306738423753fe03a4f0acf792e00426bf6f758ae645d600162005f93565b6200432773dbaad435ac3a81858123b9b6ddfcd1851021e826600162005f93565b6200434360008051602062008413833981519152600162005f93565b62004364732cb2e57a922893c5a843399c42793bdcc6fc844c600162005f93565b6200438573e905d18bd971ce7a1976e0241db396faab8a5a32600162005f93565b620043a673b73c6dd54f3d1723d7d76cf230175b9100c36915600162005f93565b620043c7732c72bc035ba6242b7f7b7c1bdf0ed171a7c2b945600162005f93565b620043e873e905d18bd971ce7a1976e0241db396faab8a5a32600162005f93565b6200440973d71514e903f1e3caba8b92f8b980a16f0a3a413d600162005f93565b6200442a736635675c439f545bc9fad80d40c3c6b054ebc402600162005f93565b6200444b73cda87a974da84d23920071b5d71cf8ad76aedf9f600162005f93565b6200446c73298c30f70bdc0d035bce76d261e758240cfad93a600162005f93565b6200448d73de308a5f7eae545e5dc312a5bc4689ae82cdd9ee600162005f93565b620044ae73ecbd1663d744e9f08a381d32b18ea88aeb5b8d39600162005f93565b620044cf732cb2e57a922893c5a843399c42793bdcc6fc844c600162005f93565b620044f07368f0faa81837d10aaf23974fa0ceb40220717f4e600162005f93565b6200451173ba7533a972bdac8925a811ad456c95b220fe00f7600162005f93565b62004532736eb6a8f7f6d071af1311b194893c12796515cc54600162005f93565b6200454e60008051602062008413833981519152600162005f93565b6200456f73653473a7b0bf45eee566d732fdeb8dc845ef6512600162005f93565b6200459073ba7533a972bdac8925a811ad456c95b220fe00f7600162005f93565b620045b17349f7989010fe2751d60b6f239b6c61a497227aef600162005f93565b620045d273def769bcf57df5a2400ab5f9dd3aad5981079689600162005f93565b620045f3736635675c439f545bc9fad80d40c3c6b054ebc402600162005f93565b62004614735a70ec52e977b50c9fc12ca0aa6d5e26e7c62291600162005f93565b620046357349f7989010fe2751d60b6f239b6c61a497227aef600162005f93565b6200465673fe13a69994743ae68053ccc7a4d601d2b63c9318600162005f93565b62004677731790b08c57400fe9b28aa7c6c18272078cbeba25600162005f93565b6200469873221af81addfaef129ad9a5e1aae643fd00689b4e600162005f93565b620046b9736eb6a8f7f6d071af1311b194893c12796515cc54600162005f93565b620046da7351ec173342aefd977a9481cf0ff474195b63e0b0600162005f93565b620046fb73e5e689114d80abfb955a06b7b27d3226b65de421600162005f93565b62004717600080516020620083d3833981519152600162005f93565b62004738734349ad665636d65ceb89e415dc0d250cb7b1d693600162005f93565b620047597368f0faa81837d10aaf23974fa0ceb40220717f4e600162005f93565b6200477a735a70ec52e977b50c9fc12ca0aa6d5e26e7c62291600162005f93565b6200479b73475205225dbf2a2e4115574da89b8f806af418b8600162005f93565b620047bc73298c30f70bdc0d035bce76d261e758240cfad93a600162005f93565b620047dd73221af81addfaef129ad9a5e1aae643fd00689b4e600162005f93565b620047fe7369012192e2886d311a2fa6b6e0c8ea153dcccb7b600162005f93565b6200481f7327889b0cacc1705b0e61780b16df21c81ddb03f8600162005f93565b62004840739997e502d002506541dd05264d717d0d6afbb673600162005f93565b6200486173b573d55bb681b091ca01ef0e78d519ed26238c38600162005f93565b6200488273ce3a505702d1f374b9cb277c7acc4396944fd238600162005f93565b620048a373ba7533a972bdac8925a811ad456c95b220fe00f7600162005f93565b620048c473216222ec646e764da7995ed3c02848568072cb58600162005f93565b620048e57369cd3080236750f7a006fdddf86797a7efc813a4600162005f93565b62004906732806ca13d7da9a2ec03101d9daa0a011e2b21c04600262005f93565b62004927735a70ec52e977b50c9fc12ca0aa6d5e26e7c62291600162005f93565b620049487369cd3080236750f7a006fdddf86797a7efc813a4600162005f93565b6200496973ac844941f038ff6493b1eec17d4ec775dec210dd600262005f93565b6200498a73ce3a505702d1f374b9cb277c7acc4396944fd238600162005f93565b620049ab7369cd3080236750f7a006fdddf86797a7efc813a4600162005f93565b620049cc73699a4fbf7f094cff9e894a83b9a599b03b2723a1600162005f93565b620049ed73de302714639124bce12389bb026484a2b07c43ea600162005f93565b62004a0e738a4565fb0c2862f85265af4794ffbed4cf3e441d600162005f93565b62004a2f7318aac583c5782f4a7494a304c5f721ce4f02b471600162005f93565b62004a5073f44324e28bb9ce5c2a8b843377e92cb7f4fdf376600162005f93565b62004a717342d6b53b205cc931a93b845ac3a58b99c88437ed600162005f93565b62004a927376b2f8c6da7bffb5a63ea41f794481e5c7d81e44600162005f93565b62004ab373e10820407810935e2d321e0641bf4dabeed61e12600162005f93565b62004ad473a724f5c322c6c281aba5d49dcfd69df1ce11511f600162005f93565b62004af573caf0624d4ab1b0b45aeee977a6008832e5860c93600162005f93565b62004b16737185538fc7fa1220c9fcb6758d4ab60238eaac5b600162005f93565b62004b377387ac0553e62fc074bcbaf9d348cc12d41a4c041e600162005f93565b62004b5873ecbd1663d744e9f08a381d32b18ea88aeb5b8d39600162005f93565b62004b7973ba7533a972bdac8925a811ad456c95b220fe00f7600162005f93565b62004b9a7342d6b53b205cc931a93b845ac3a58b99c88437ed600162005f93565b62004bbb73289c4dcb0b69ba183f0519c0d4191479327cb06b600162005f93565b62004bdc73ecbd1663d744e9f08a381d32b18ea88aeb5b8d39600162005f93565b62004bfd7369cd3080236750f7a006fdddf86797a7efc813a4600162005f93565b62004c1e73c821ee063c0abe2be67d0621b676c2bcaa63cf4b600162005f93565b62004c3a600080516020620083d3833981519152600162005f93565b62004c56600080516020620083f3833981519152600162005f93565b62004c777335fec93300ce629707218950b88f071e2f2f437f600162005f93565b62004c93600080516020620083f3833981519152600162005f93565b62004cb473ba7533a972bdac8925a811ad456c95b220fe00f7600162005f93565b62004cd573c821ee063c0abe2be67d0621b676c2bcaa63cf4b600162005f93565b62004cf673653473a7b0bf45eee566d732fdeb8dc845ef6512600162005f93565b62004d177362b4618af958abf3a4f803dfed365fd37618095c600162005f93565b62004d3873e4dea04fa6fa74f0d62d7e987738a83e606c92a1600162005f93565b62004d5973de302714639124bce12389bb026484a2b07c43ea600162005f93565b62004d7a73779a8a5a7d253ea612ca5fadf589b16094952b66600162005f93565b62004d9b73023f5b749860964393ae1217bb5d9bb56fe5df23600162005f93565b62004dbc73779a8a5a7d253ea612ca5fadf589b16094952b66600262005f93565b62004ddd73838450e58a9ba982bb1866fcc2396db8b307b9c9600162005f93565b62004dfe73aa7c21fce545fc47c80636127e408168e88c1a60600162005f93565b62004e1f73896ae45164b0eb741074a1cdb3df170f5ed8f664600162005f93565b62004e4073779a8a5a7d253ea612ca5fadf589b16094952b66600262005f93565b62004e6072386637cf48eb0341b3fcfe80edab62b78c866e600162005f93565b62004e81738dd982d63183e42de34cee77079ccacaebe8b14f600162005f93565b62004ea172386637cf48eb0341b3fcfe80edab62b78c866e600162005f93565b62004ec273a7f879eee9c76b4b7cf7c067e3cbf43a5e28ef33600162005f93565b62004ee373023f5b749860964393ae1217bb5d9bb56fe5df23600162005f93565b62004f0473653473a7b0bf45eee566d732fdeb8dc845ef6512600162005f93565b62004f25732cc71cffb7ebee2596e60b70088fa195397494b2600162005f93565b62004f4673d87ad6e7d350ce4d568ae7b04558b8b6041d1da3600162005f93565b62004f6773a7f879eee9c76b4b7cf7c067e3cbf43a5e28ef33600162005f93565b62004f88738830516fda3821fc0e805e9a982b143e8792d5dc600262005f93565b62004fa973be85f5adf3afffea08a2529bf992ee96525cfd2f600162005f93565b62004fca732cc71cffb7ebee2596e60b70088fa195397494b2600162005f93565b62004feb73789d757eb17a56ec7fabcfaaa13f48bdca651c18600162005f93565b6200500c73ced0ed8cb5e884ae4e2a5e8aa9ece1fd3404330e600162005f93565b6200502d73a90e35c6be67920adab21f1a207eb3a736e06649600162005f93565b6200504e733181955d2646998f7150065e2a48823d78123928600162005f93565b6200506f73679eb39cc05ce43b9b813df8abc4f66da896bcd6600162005f93565b62005090738cf6b98f59487ed43f64c7a94516dca2f010acc8600162005f93565b620050b1734fa0e8318dfbb42233ecb5330661691fa802c458600162005f93565b620050d273838450e58a9ba982bb1866fcc2396db8b307b9c9600162005f93565b620050f3732b0a63c55f5926699be551c968a1ea3b22b08691600162005f93565b620051147399b096ce65c4a273dfde3e7f14d792c2f76bcc98600162005f93565b6200513573042cfa58735b52790e3f25edc99aca32677b3b50600162005f93565b6200515673def769bcf57df5a2400ab5f9dd3aad5981079689600162005f93565b6200517773515d1a7b1982826d53194e03fbbacdf392034b83600262005f93565b620051987371ef3244fdac9168ee3382af5ad99da09632649a600162005f93565b620051b973515d1a7b1982826d53194e03fbbacdf392034b83600162005f93565b620051d5600080516020620083f3833981519152600162005f93565b620051f6734dbe8b56e3d2a481bbdc4cf4be98fc5cbb888fbf600162005f93565b62005217737adee4c1ec5427519a0cb78e354828e6da58e871600162005f93565b6200523873bb1ff00e5af0f3b81e2f464a329ae4ee7c1dfba5600162005f93565b6200525973de302714639124bce12389bb026484a2b07c43ea600162005f93565b6200527a73cea44512698fce6d380683d69c3c551da4ebc6ed600262005f93565b6200529b73cdd094642f5fb2445f108758929770257c9da8e6600162005f93565b620052bc73cea44512698fce6d380683d69c3c551da4ebc6ed600362005f93565b620052dd730cb2ecefab110966a117358abf5dd3a635f9c3a1600162005f93565b620052fe73042cfa58735b52790e3f25edc99aca32677b3b50600162005f93565b6200531f7381134166c117ae6c8366c36be9e886b0f7147fae600162005f93565b62005340731ff69103a094efdc748a35ee0a6c193ff7f4728f600162005f93565b62005361731c96e40da3ef76039d3cadd7892bf8209e5a8c99600162005f93565b62005382738423753fe03a4f0acf792e00426bf6f758ae645d600162005f93565b620053a37367c4e74eaa79b6f7114b56d17b5bed2f60c69fb5600162005f93565b620053c473ca0e051598cbe53057ed34aaafc32a3310f4aee7600162005f93565b620053e5733076dd2c4f6797034ffb11cedfca352b579b120e600262005f93565b62005406735bb4e468d79dce3c878f76535bec388ccbcc4031600162005f93565b62005427739ed81f00b587781d7ee4473a878a07560944427b600162005f93565b6200544873c181f3828fe39bbe39e78354795a676304a825a3600162005f93565b6200546973b1d3a4c1907ad74f35dbbb5f1478dd456a9d81df600162005f93565b6200548a7376d75605c770d6b17efe12c17c001626d371710a600162005f93565b620054ab73010298f5dde499b371a86d6ce7ee454b68b62780600162005f93565b620054cc7352be0a4f75df6fd45770f5a6e71ac269185d48e0600162005f93565b620054ed739e86cc88d072e1c0259ee96cfbc457feffcc1fee600162005f93565b6200550e73b9fa7689bdfe2f3718f3b101af60936d6f993324600262005f93565b6200552f73a7b065ab08a41609b508afcd87473cb22af3a08a600262005f93565b6200554b600080516020620083f3833981519152600162005f93565b6200556c739d79f12e677822c2d3f9745e422cb1cdbc5a41aa600162005f93565b6200558d73bc9bb672d0732165535c49ed8bba7c9e9ba988cc600162005f93565b620055ae738a1635c39c53deedf9fd8a1a28b0f0f4d2ff5a78600162005f93565b620055cf73826ec552a86b20302a3f01b6980b662eb1ba7a44600162005f93565b620055f07358e6a5cd87d38ae2c35007b1bd7b25026be9b0b1600162005f93565b6200561173462ea027f18b85e550225e3a767cbc8c0833d973600162005f93565b620056327358e6a5cd87d38ae2c35007b1bd7b25026be9b0b1600162005f93565b62005653738a1635c39c53deedf9fd8a1a28b0f0f4d2ff5a78600162005f93565b6200567473187d8e97ffb6a92ad0ca25f80d97ada595513c88600162005f93565b6200569573ca5334ce5a579c72413b58411f3e0fb4cd4c345c600162005f93565b620056b67395a00ffb2eae9420287bf374f08de040e7637d3a600162005f93565b620056d77384df49b1d4fdcee1e3b410669b7e5087412b411b600162005f93565b620056f873b34b19f30d0e72c407ccf136aa6ac9e71b7b0684600162005f93565b62005719735f3fea69bfc3fe51e9e43e3be05dd5794ac50ab6600162005f93565b6200573a73865901c6bb1dd7842975f66e2b5db494735f3655600162005f93565b6200575b73200ca9451c7d1fd027b3b04b1a08bce257e21888600262005f93565b6200577c73408fdb9063b25542e95b171ae53046a6950e50cd600162005f93565b6200579d73552e366f9d3c4f4c1f9f2bebc493715f866fe9d9600162005f93565b620057be73408fdb9063b25542e95b171ae53046a6950e50cd600162005f93565b620057df736ae5bf41457d9f938f4f2588b9200f4390b23f9c600162005f93565b6200580073b609d966a45ec87afb84bf4a3f3dd29de2deed83600162005f93565b6200582173413cf568d0aa5ae64c9a0161b207e165cb8d35c4600162005f93565b6200584273b609d966a45ec87afb84bf4a3f3dd29de2deed83600162005f93565b6200586373289c4dcb0b69ba183f0519c0d4191479327cb06b600162005f93565b62005884730c375da33507197f318e0f92acac6f45b53f2629600162005f93565b620058a573f932755165312e18b62484b9a23b517cc07a7ba2600162005f93565b620058c6736dbba020d28ddec7a8859cc10f7641b7f8c11419600162005f93565b620058e773feec85c46f99a9722636044d5ea0b5dfdd5c5cd7600162005f93565b6200590873caf0624d4ab1b0b45aeee977a6008832e5860c93600162005f93565b6200592460008051602062008413833981519152600162005f93565b6200594573385fd77f7b5a1e67222c94304d342ff4752ce92c600262005f93565b6200596673997708fe9e316f6e6b3ef91a53374148795f0e5c600262005f93565b6200598773fcf8a7b49539154ccf149ca2ff4fdf12e39a1db7600162005f93565b620059a873fad606fe2181966c8703c84125bfdad2a541be2b600162005f93565b620059c973308a4fa5d38ff273ed2e4618f66bdd864a3dda7e600162005f93565b620059ea7318aac583c5782f4a7494a304c5f721ce4f02b471600162005f93565b62005a0b737e2aa3047eb37ebaef3438a1becc0c1fdf14b383600162005f93565b62005a2c730cdd65d3e6e80da2e5a11f7c1cedace730372d7e600162005f93565b62005a4d73abb9190c87955bdabdfd3df0d4e0d415ec18dfb1600162005f93565b62005a6e734ab59d6cac15920b2f2909c0529995e12c509b80600162005f93565b62005a8f738f5fbdc4a08d48cacc468b30b55705529944bc8c600162005f93565b62005ab073aa7c21fce545fc47c80636127e408168e88c1a60600162005f93565b62005ad17367c4e74eaa79b6f7114b56d17b5bed2f60c69fb5600262005f93565b62005af2739de9b25139df40e04202e42e4f53e52c9ef6e949600162005f93565b62005b13733e0d3071da4fc3139e11cb92a49460748712051a600162005f93565b62005b3473bf2c8b554a1d227f41eac0e6f50fe5700e9eac8d600262005f93565b62005b55736d557322d7a8f399d6dd61da819592ace36e556c600162005f93565b62005b7673590f4fafe1966803c79a038c462c8f28b06668d8600162005f93565b62005b9773fbcd2a7fa20c267b8d9363098399bfd307c7748b600162005f93565b62005bb873cea44512698fce6d380683d69c3c551da4ebc6ed600162005f93565b62005bd973252ad4c147630634170971fe0bee72feaf7dfcb3600162005f93565b62005bfa73e35932989927af1ce78f54af6578fd22db3ce675600162005f93565b62005c1b73e2b0ceb92ee82d48d06c5c41bb307dcb367ea94a600162005f93565b62005c37600080516020620083f3833981519152600162005f93565b62005c58735a70ec52e977b50c9fc12ca0aa6d5e26e7c62291600162005f93565b62005c79736619032e9fb486d738cf6db6ba39f18e59c38b10600162005f93565b62005c9a7362c912f6b8727af47dc0bcb6862e5e4804b26f24600162005f93565b62005cbb73b50260f2076d744a6a87d4ba0102fa8770c08e34600262005f93565b62005cdc73fcf7cf49ab34e43efdeead51eedc0f1d25e43cc5600162005f93565b62005cfd73d0010f430e836137bccb778c5e9886e0c58b4b6c600162005f93565b62005d1e738eb80a451c61116395cf7bda5b641a4569a11e63600162005f93565b62005d3f73b94664acc7c7750b92f028b1e7139e19bf4922e9600162005f93565b62005d6073340ee74b7257c6b11b7bf47fd279558ea9e143f8600162005f93565b62005d817346acf7aaf70e7dfc2aaa4c176e05fba9f5c0a009600162005f93565b62005da273744e14680b3c9693442e8526e22e1d5f60101846600162005f93565b62005dc3735eae85c3dc16032878a579a39c85ad7eca3e7dc5600162005f93565b62005de473b8410f47e152e6ec0e7578f8e0d79d10fb90e09b600162005f93565b62005e05736bade65a3c3cb9e81cf8316c76a799947ba87d32600162005f93565b62005e26733cfd1a2cf9585afb5c0b18c15b174baaae58ac21600162005f93565b62005e477399b096ce65c4a273dfde3e7f14d792c2f76bcc98600162005f93565b62005e6873778c1694994c24d701accb42f48c1bd10d10ee4c600162005f93565b62005e897385150706937ec68194677131a1f1f94c3dd38664600162005f93565b62005eaa73415bd9a5e2fdcb8310cee3f785f25b5e4d4564e3600262005f93565b62005ecb73216222ec646e764da7995ed3c02848568072cb58600162005f93565b62005eec737b056dcf6551f96d54ac2040ae89f8b30e0d77cb600162005f93565b62005f0d738165a12ee90d17278d30d8442c64af767a05e12c600262005f93565b62005f2e737b056dcf6551f96d54ac2040ae89f8b30e0d77cb600262005f93565b62005f4f738165a12ee90d17278d30d8442c64af767a05e12c600362005f93565b62005f707326349cc1373c1e8a834815e930ad05632c375b27600162005f93565b62005f91738165a12ee90d17278d30d8442c64af767a05e12c601662005f93565b565b6000546001600160a01b03831662005fbd57604051622e076360e81b815260040160405180910390fd5b8160000362005fdf5760405163b562e8dd60e01b815260040160405180910390fd5b6113888211156200600357604051633db1f9af60e01b815260040160405180910390fd5b6200601260008483856200609b565b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600482528083206001871460e11b4260a01b17851790558051600019868801018152905185927fdeaa91b6123d068f5821d0fb0678463d1a8a6079fe8af5de3ce5e896dcf9133d928290030190a40160005550565b505050565b6000805b82811015620060f057600d6000620060b88387620062c0565b815260208101919091526040016000205460ff161515600103620060db57600191505b80620060e781620062db565b9150506200609f565b508015620061335760405162461bcd60e51b815260206004820152600c60248201526b151bdad95b88131bd8dad95960a21b604482015260640160405180910390fd5b5050505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200616557607f821691505b6020821081036200618657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200609657600081815260208120601f850160051c81016020861015620061b55750805b601f850160051c820191505b81811015620061d657828155600101620061c1565b505050505050565b81516001600160401b03811115620061fa57620061fa6200613a565b62006212816200620b845462006150565b846200618c565b602080601f8311600181146200624a5760008415620062315750858301515b600019600386901b1c1916600185901b178555620061d6565b600085815260208120601f198616915b828110156200627b578886015182559484019460019091019084016200625a565b50858210156200629a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b60008219821115620062d657620062d6620062aa565b500190565b600060018201620062f057620062f0620062aa565b5060010190565b6120cc80620063076000396000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c8063714c53981161012a578063ba326b87116100bd578063d728f75c1161008c578063dc4e54ca11610071578063dc4e54ca14610491578063e985e9c51461049e578063f2fde38b146104da57600080fd5b8063d728f75c14610466578063dacac82b1461048957600080fd5b8063ba326b871461040d578063c87b56dd1461042d578063cbd5d40314610440578063ce32aac61461045357600080fd5b80639451c99a116100f95780639451c99a146103d657806395d89b41146103df578063a22cb465146103e7578063b88d4fde146103fa57600080fd5b8063714c5398146103a2578063715018a6146103aa57806379dcdef6146103b25780638da5cb5b146103c557600080fd5b806323b872dd116101bd5780634d23453d1161018c5780636352211e116101715780636352211e146103745780636c0360eb1461038757806370a082311461038f57600080fd5b80634d23453d1461034e57806355f804b31461036157600080fd5b806323b872dd1461030c5780633091b8a51461031f57806332cb6b0c1461033257806342842e0e1461033b57600080fd5b8063095ea7b3116101f9578063095ea7b3146102a85780630d3742a7146102bb57806318160ddd146102e95780631d57d68d146102f957600080fd5b806301ffc9a71461022b57806306fdde0314610253578063081812fc14610268578063084b731a14610293575b600080fd5b61023e6102393660046119b3565b6104ed565b60405190151581526020015b60405180910390f35b61025b61058a565b60405161024a9190611a28565b61027b610276366004611a3b565b61061c565b6040516001600160a01b03909116815260200161024a565b6102a66102a1366004611aa0565b610679565b005b6102a66102b6366004611afe565b610861565b6102db6102c9366004611a3b565b600e6020526000908152604090205481565b60405190815260200161024a565b60015460005403600019016102db565b6102a6610307366004611b28565b610927565b6102a661031a366004611b43565b61095e565b6102a661032d366004611b7f565b610b50565b6102db61014d81565b6102a6610349366004611b43565b610bb5565b600b5461027b906001600160a01b031681565b6102a661036f366004611c6e565b610bd5565b61027b610382366004611a3b565b610bed565b61025b610bf8565b6102db61039d366004611b28565b610c86565b61025b610cee565b6102a6610cfd565b6102a66103c0366004611aa0565b610d11565b6008546001600160a01b031661027b565b6102db60005481565b61025b610e47565b6102a66103f5366004611cb7565b610e56565b6102a6610408366004611cf3565b610f04565b6102db61041b366004611a3b565b600c6020526000908152604090205481565b61025b61043b366004611a3b565b610f48565b6102a661044e366004611aa0565b610fd1565b6102a6610461366004611aa0565b6110d4565b61023e610474366004611a3b565b600d6020526000908152604090205460ff1681565b6102a66111f3565b600f5461023e9060ff1681565b61023e6104ac366004611d6f565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6102a66104e8366004611b28565b61120f565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316148061055057507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b8061058457507f5b5e139f000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b60606002805461059990611da2565b80601f01602080910402602001604051908101604052809291908181526020018280546105c590611da2565b80156106125780601f106105e757610100808354040283529160200191610612565b820191906000526020600020905b8154815290600101906020018083116105f557829003601f168201915b5050505050905090565b60006106278261129f565b61065d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6002600954036106d05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b6002600955600f5460ff1661074d5760405162461bcd60e51b815260206004820152602160248201527f4c6f636b696e67206973206e6f742063757272656e746c7920616c6c6f77656460448201527f2e0000000000000000000000000000000000000000000000000000000000000060648201526084016106c7565b6000805b828110156107d15761077a84848381811061076e5761076e611ddc565b905060200201356112d4565b600c600085858481811061079057610790611ddc565b905060200201358152602001908152602001600020546000146107b8576014820191506107bf565b600a820191505b806107c981611e08565b915050610751565b50600b546040517ffd2852190000000000000000000000000000000000000000000000000000000081523360048201526001600160801b03831660248201526001600160a01b039091169063fd28521990604401600060405180830381600087803b15801561083f57600080fd5b505af1158015610853573d6000803e3d6000fd5b505060016009555050505050565b600061086c82610bed565b9050336001600160a01b038216146108be5761088881336104ac565b6108be576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61092f611449565b600b805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000610969826114a3565b9050836001600160a01b0316816001600160a01b0316146109b6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610a1c576109e686336104ac565b610a1c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516610a5c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a698686866001611532565b8015610a7457600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003610b0657600184016000818152600460205260408120549003610b04576000548114610b045760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610b58611449565b60005b82811015610baf57816001600160801b0316600c6000868685818110610b8357610b83611ddc565b905060200201358152602001908152602001600020819055508080610ba790611e08565b915050610b5b565b50505050565b610bd083838360405180602001604052806000815250610f04565b505050565b610bdd611449565b600a610be98282611e67565b5050565b6000610584826114a3565b600a8054610c0590611da2565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3190611da2565b8015610c7e5780601f10610c5357610100808354040283529160200191610c7e565b820191906000526020600020905b815481529060010190602001808311610c6157829003601f168201915b505050505081565b60006001600160a01b038216610cc8576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6060600a805461059990611da2565b610d05611449565b610d0f60006115d6565b565b610d19611449565b60005b81811015610bd0576000600c6000858585818110610d3c57610d3c611ddc565b90506020020135815260200190815260200160002054600014610d6b57610d64601482611f27565b9050610d79565b610d76600a82611f27565b90505b600b546001600160a01b03166342db1046610dab868686818110610d9f57610d9f611ddc565b90506020020135610bed565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526001600160801b0384166024820152604401600060405180830381600087803b158015610dfb57600080fd5b505af1158015610e0f573d6000803e3d6000fd5b50505050610e34848484818110610e2857610e28611ddc565b90506020020135611635565b5080610e3f81611e08565b915050610d1c565b60606003805461059990611da2565b336001600160a01b03831603610e98576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610f0f84848461095e565b6001600160a01b0383163b15610baf57610f2b8484848461177c565b610baf576040516368d2bf6b60e11b815260040160405180910390fd5b6060610f538261129f565b610f9f5760405162461bcd60e51b815260206004820152601560248201527f546f6b656e20646f6573206e6f742065786973742e000000000000000000000060448201526064016106c7565b600a610faa83611868565b604051602001610fbb929190611f52565b6040516020818303038152906040529050919050565b6000805b8281101561104957600c6000858584818110610ff357610ff3611ddc565b9050602002013581526020019081526020016000205460001461101b57601482019150611022565b600a820191505b611037848483818110610e2857610e28611ddc565b8061104181611e08565b915050610fd5565b50600b546040517f42db10460000000000000000000000000000000000000000000000000000000081523360048201526001600160801b03831660248201526001600160a01b03909116906342db104690604401600060405180830381600087803b1580156110b757600080fd5b505af11580156110cb573d6000803e3d6000fd5b50505050505050565b6110dc611449565b60005b81811015610bd0576110fc83838381811061076e5761076e611ddc565b6000600c600085858581811061111457611114611ddc565b905060200201358152602001908152602001600020546000146111435761113c601482611f27565b9050611151565b61114e600a82611f27565b90505b600b546001600160a01b031663fd285219611177868686818110610d9f57610d9f611ddc565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526001600160801b0384166024820152604401600060405180830381600087803b1580156111c757600080fd5b505af11580156111db573d6000803e3d6000fd5b505050505080806111eb90611e08565b9150506110df565b6111fb611449565b600f805460ff19811660ff90911615179055565b611217611449565b6001600160a01b0381166112935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106c7565b61129c816115d6565b50565b6000816001111580156112b3575060005482105b8015610584575050600090815260046020526040902054600160e01b161590565b336112de82610bed565b6001600160a01b0316148061130c5750336113016008546001600160a01b031690565b6001600160a01b0316145b61136b5760405162461bcd60e51b815260206004820152602a60248201527f596f75206d757374206f776e206120746f6b656e20696e206f7264657220746f604482015269081d5b9b1bd8dac81a5d60b21b60648201526084016106c7565b6000818152600d602052604090205460ff16156113ca5760405162461bcd60e51b815260206004820152601460248201527f746f6b656e20616c7265616479206c6f636b656400000000000000000000000060448201526064016106c7565b6000818152600d60209081526040808320805460ff19166001179055600e909152902042908190557f3cb54077b06ebcb9b6e438df27ab6a97453f26b207e6351e8bd4cdfb145d7a6b90829061141f82610bed565b6040805193845260208401929092526001600160a01b03169082015260600160405180910390a150565b6008546001600160a01b03163314610d0f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b60008180600111611500576000548110156115005760008181526004602052604081205490600160e01b821690036114fe575b806000036114f75750600019016000818152600460205260409020546114d6565b9392505050565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8281101561158057600d600061154c8387611fd0565b815260208101919091526040016000205460ff16151560010361156e57600191505b8061157881611e08565b915050611536565b5080156115cf5760405162461bcd60e51b815260206004820152600c60248201527f546f6b656e204c6f636b6564000000000000000000000000000000000000000060448201526064016106c7565b5050505050565b600880546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b3361163f82610bed565b6001600160a01b0316148061166d5750336116626008546001600160a01b031690565b6001600160a01b0316145b6116cc5760405162461bcd60e51b815260206004820152602a60248201527f596f75206d757374206f776e206120746f6b656e20696e206f7264657220746f604482015269081d5b9b1bd8dac81a5d60b21b60648201526084016106c7565b6000818152600d602052604090205460ff16151560011461172f5760405162461bcd60e51b815260206004820152601060248201527f746f6b656e206e6f74206c6f636b65640000000000000000000000000000000060448201526064016106c7565b6000818152600d60209081526040808320805460ff19169055600e9091528120557ff4b5dc38d8b4dcee5e7fc6413bf0bd43c170e5179a2bce1450e21f28e183e748814261141f82610bed565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906117b1903390899088908890600401611fe8565b6020604051808303816000875af19250505080156117ec575060408051601f3d908101601f191682019092526117e991810190612024565b60015b61184a573d80801561181a576040519150601f19603f3d011682016040523d82523d6000602084013e61181f565b606091505b508051600003611842576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036118ab57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156118d557806118bf81611e08565b91506118ce9050600a83612057565b91506118af565b60008167ffffffffffffffff8111156118f0576118f0611be2565b6040519080825280601f01601f19166020018201604052801561191a576020820181803683370190505b5090505b84156118605761192f60018361206b565b915061193c600a86612082565b611947906030611fd0565b60f81b81838151811061195c5761195c611ddc565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611996600a86612057565b945061191e565b6001600160e01b03198116811461129c57600080fd5b6000602082840312156119c557600080fd5b81356114f78161199d565b60005b838110156119eb5781810151838201526020016119d3565b83811115610baf5750506000910152565b60008151808452611a148160208601602086016119d0565b601f01601f19169290920160200192915050565b6020815260006114f760208301846119fc565b600060208284031215611a4d57600080fd5b5035919050565b60008083601f840112611a6657600080fd5b50813567ffffffffffffffff811115611a7e57600080fd5b6020830191508360208260051b8501011115611a9957600080fd5b9250929050565b60008060208385031215611ab357600080fd5b823567ffffffffffffffff811115611aca57600080fd5b611ad685828601611a54565b90969095509350505050565b80356001600160a01b0381168114611af957600080fd5b919050565b60008060408385031215611b1157600080fd5b611b1a83611ae2565b946020939093013593505050565b600060208284031215611b3a57600080fd5b6114f782611ae2565b600080600060608486031215611b5857600080fd5b611b6184611ae2565b9250611b6f60208501611ae2565b9150604084013590509250925092565b600080600060408486031215611b9457600080fd5b833567ffffffffffffffff811115611bab57600080fd5b611bb786828701611a54565b90945092505060208401356001600160801b0381168114611bd757600080fd5b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611c1357611c13611be2565b604051601f8501601f19908116603f01168101908282118183101715611c3b57611c3b611be2565b81604052809350858152868686011115611c5457600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611c8057600080fd5b813567ffffffffffffffff811115611c9757600080fd5b8201601f81018413611ca857600080fd5b61186084823560208401611bf8565b60008060408385031215611cca57600080fd5b611cd383611ae2565b915060208301358015158114611ce857600080fd5b809150509250929050565b60008060008060808587031215611d0957600080fd5b611d1285611ae2565b9350611d2060208601611ae2565b925060408501359150606085013567ffffffffffffffff811115611d4357600080fd5b8501601f81018713611d5457600080fd5b611d6387823560208401611bf8565b91505092959194509250565b60008060408385031215611d8257600080fd5b611d8b83611ae2565b9150611d9960208401611ae2565b90509250929050565b600181811c90821680611db657607f821691505b602082108103611dd657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201611e1a57611e1a611df2565b5060010190565b601f821115610bd057600081815260208120601f850160051c81016020861015611e485750805b601f850160051c820191505b81811015610b4857828155600101611e54565b815167ffffffffffffffff811115611e8157611e81611be2565b611e9581611e8f8454611da2565b84611e21565b602080601f831160018114611eca5760008415611eb25750858301515b600019600386901b1c1916600185901b178555610b48565b600085815260208120601f198616915b82811015611ef957888601518255948401946001909101908401611eda565b5085821015611f175787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001600160801b03808316818516808303821115611f4957611f49611df2565b01949350505050565b6000808454611f6081611da2565b60018281168015611f785760018114611f8d57611fbc565b60ff1984168752821515830287019450611fbc565b8860005260208060002060005b85811015611fb35781548a820152908401908201611f9a565b50505082870194505b505050508351611f498183602088016119d0565b60008219821115611fe357611fe3611df2565b500190565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261201a60808301846119fc565b9695505050505050565b60006020828403121561203657600080fd5b81516114f78161199d565b634e487b7160e01b600052601260045260246000fd5b60008261206657612066612041565b500490565b60008282101561207d5761207d611df2565b500390565b60008261209157612091612041565b50069056fea26469706673582212205e4481addb3da0ca218f1c5cf5bf4c22855b84fb9c75e8dd633595d4b349363464736f6c634300080f0033000000000000000000000000e1ef400f64240bbb30033818980a6b9c6f57d871000000000000000000000000499ad4e017e0aa45a2d32c54a7c7c3eacdd72a33000000000000000000000000aea4c6c95d927172bd42aaca170aa3e92a29921c68747470733a2f2f79616b757a612d6170692e76657263656c2e6170702f6170692f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102265760003560e01c8063714c53981161012a578063ba326b87116100bd578063d728f75c1161008c578063dc4e54ca11610071578063dc4e54ca14610491578063e985e9c51461049e578063f2fde38b146104da57600080fd5b8063d728f75c14610466578063dacac82b1461048957600080fd5b8063ba326b871461040d578063c87b56dd1461042d578063cbd5d40314610440578063ce32aac61461045357600080fd5b80639451c99a116100f95780639451c99a146103d657806395d89b41146103df578063a22cb465146103e7578063b88d4fde146103fa57600080fd5b8063714c5398146103a2578063715018a6146103aa57806379dcdef6146103b25780638da5cb5b146103c557600080fd5b806323b872dd116101bd5780634d23453d1161018c5780636352211e116101715780636352211e146103745780636c0360eb1461038757806370a082311461038f57600080fd5b80634d23453d1461034e57806355f804b31461036157600080fd5b806323b872dd1461030c5780633091b8a51461031f57806332cb6b0c1461033257806342842e0e1461033b57600080fd5b8063095ea7b3116101f9578063095ea7b3146102a85780630d3742a7146102bb57806318160ddd146102e95780631d57d68d146102f957600080fd5b806301ffc9a71461022b57806306fdde0314610253578063081812fc14610268578063084b731a14610293575b600080fd5b61023e6102393660046119b3565b6104ed565b60405190151581526020015b60405180910390f35b61025b61058a565b60405161024a9190611a28565b61027b610276366004611a3b565b61061c565b6040516001600160a01b03909116815260200161024a565b6102a66102a1366004611aa0565b610679565b005b6102a66102b6366004611afe565b610861565b6102db6102c9366004611a3b565b600e6020526000908152604090205481565b60405190815260200161024a565b60015460005403600019016102db565b6102a6610307366004611b28565b610927565b6102a661031a366004611b43565b61095e565b6102a661032d366004611b7f565b610b50565b6102db61014d81565b6102a6610349366004611b43565b610bb5565b600b5461027b906001600160a01b031681565b6102a661036f366004611c6e565b610bd5565b61027b610382366004611a3b565b610bed565b61025b610bf8565b6102db61039d366004611b28565b610c86565b61025b610cee565b6102a6610cfd565b6102a66103c0366004611aa0565b610d11565b6008546001600160a01b031661027b565b6102db60005481565b61025b610e47565b6102a66103f5366004611cb7565b610e56565b6102a6610408366004611cf3565b610f04565b6102db61041b366004611a3b565b600c6020526000908152604090205481565b61025b61043b366004611a3b565b610f48565b6102a661044e366004611aa0565b610fd1565b6102a6610461366004611aa0565b6110d4565b61023e610474366004611a3b565b600d6020526000908152604090205460ff1681565b6102a66111f3565b600f5461023e9060ff1681565b61023e6104ac366004611d6f565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6102a66104e8366004611b28565b61120f565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316148061055057507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b8061058457507f5b5e139f000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b60606002805461059990611da2565b80601f01602080910402602001604051908101604052809291908181526020018280546105c590611da2565b80156106125780601f106105e757610100808354040283529160200191610612565b820191906000526020600020905b8154815290600101906020018083116105f557829003601f168201915b5050505050905090565b60006106278261129f565b61065d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6002600954036106d05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b6002600955600f5460ff1661074d5760405162461bcd60e51b815260206004820152602160248201527f4c6f636b696e67206973206e6f742063757272656e746c7920616c6c6f77656460448201527f2e0000000000000000000000000000000000000000000000000000000000000060648201526084016106c7565b6000805b828110156107d15761077a84848381811061076e5761076e611ddc565b905060200201356112d4565b600c600085858481811061079057610790611ddc565b905060200201358152602001908152602001600020546000146107b8576014820191506107bf565b600a820191505b806107c981611e08565b915050610751565b50600b546040517ffd2852190000000000000000000000000000000000000000000000000000000081523360048201526001600160801b03831660248201526001600160a01b039091169063fd28521990604401600060405180830381600087803b15801561083f57600080fd5b505af1158015610853573d6000803e3d6000fd5b505060016009555050505050565b600061086c82610bed565b9050336001600160a01b038216146108be5761088881336104ac565b6108be576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61092f611449565b600b805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000610969826114a3565b9050836001600160a01b0316816001600160a01b0316146109b6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610a1c576109e686336104ac565b610a1c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516610a5c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a698686866001611532565b8015610a7457600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003610b0657600184016000818152600460205260408120549003610b04576000548114610b045760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610b58611449565b60005b82811015610baf57816001600160801b0316600c6000868685818110610b8357610b83611ddc565b905060200201358152602001908152602001600020819055508080610ba790611e08565b915050610b5b565b50505050565b610bd083838360405180602001604052806000815250610f04565b505050565b610bdd611449565b600a610be98282611e67565b5050565b6000610584826114a3565b600a8054610c0590611da2565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3190611da2565b8015610c7e5780601f10610c5357610100808354040283529160200191610c7e565b820191906000526020600020905b815481529060010190602001808311610c6157829003601f168201915b505050505081565b60006001600160a01b038216610cc8576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6060600a805461059990611da2565b610d05611449565b610d0f60006115d6565b565b610d19611449565b60005b81811015610bd0576000600c6000858585818110610d3c57610d3c611ddc565b90506020020135815260200190815260200160002054600014610d6b57610d64601482611f27565b9050610d79565b610d76600a82611f27565b90505b600b546001600160a01b03166342db1046610dab868686818110610d9f57610d9f611ddc565b90506020020135610bed565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526001600160801b0384166024820152604401600060405180830381600087803b158015610dfb57600080fd5b505af1158015610e0f573d6000803e3d6000fd5b50505050610e34848484818110610e2857610e28611ddc565b90506020020135611635565b5080610e3f81611e08565b915050610d1c565b60606003805461059990611da2565b336001600160a01b03831603610e98576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610f0f84848461095e565b6001600160a01b0383163b15610baf57610f2b8484848461177c565b610baf576040516368d2bf6b60e11b815260040160405180910390fd5b6060610f538261129f565b610f9f5760405162461bcd60e51b815260206004820152601560248201527f546f6b656e20646f6573206e6f742065786973742e000000000000000000000060448201526064016106c7565b600a610faa83611868565b604051602001610fbb929190611f52565b6040516020818303038152906040529050919050565b6000805b8281101561104957600c6000858584818110610ff357610ff3611ddc565b9050602002013581526020019081526020016000205460001461101b57601482019150611022565b600a820191505b611037848483818110610e2857610e28611ddc565b8061104181611e08565b915050610fd5565b50600b546040517f42db10460000000000000000000000000000000000000000000000000000000081523360048201526001600160801b03831660248201526001600160a01b03909116906342db104690604401600060405180830381600087803b1580156110b757600080fd5b505af11580156110cb573d6000803e3d6000fd5b50505050505050565b6110dc611449565b60005b81811015610bd0576110fc83838381811061076e5761076e611ddc565b6000600c600085858581811061111457611114611ddc565b905060200201358152602001908152602001600020546000146111435761113c601482611f27565b9050611151565b61114e600a82611f27565b90505b600b546001600160a01b031663fd285219611177868686818110610d9f57610d9f611ddc565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526001600160801b0384166024820152604401600060405180830381600087803b1580156111c757600080fd5b505af11580156111db573d6000803e3d6000fd5b505050505080806111eb90611e08565b9150506110df565b6111fb611449565b600f805460ff19811660ff90911615179055565b611217611449565b6001600160a01b0381166112935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106c7565b61129c816115d6565b50565b6000816001111580156112b3575060005482105b8015610584575050600090815260046020526040902054600160e01b161590565b336112de82610bed565b6001600160a01b0316148061130c5750336113016008546001600160a01b031690565b6001600160a01b0316145b61136b5760405162461bcd60e51b815260206004820152602a60248201527f596f75206d757374206f776e206120746f6b656e20696e206f7264657220746f604482015269081d5b9b1bd8dac81a5d60b21b60648201526084016106c7565b6000818152600d602052604090205460ff16156113ca5760405162461bcd60e51b815260206004820152601460248201527f746f6b656e20616c7265616479206c6f636b656400000000000000000000000060448201526064016106c7565b6000818152600d60209081526040808320805460ff19166001179055600e909152902042908190557f3cb54077b06ebcb9b6e438df27ab6a97453f26b207e6351e8bd4cdfb145d7a6b90829061141f82610bed565b6040805193845260208401929092526001600160a01b03169082015260600160405180910390a150565b6008546001600160a01b03163314610d0f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b60008180600111611500576000548110156115005760008181526004602052604081205490600160e01b821690036114fe575b806000036114f75750600019016000818152600460205260409020546114d6565b9392505050565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8281101561158057600d600061154c8387611fd0565b815260208101919091526040016000205460ff16151560010361156e57600191505b8061157881611e08565b915050611536565b5080156115cf5760405162461bcd60e51b815260206004820152600c60248201527f546f6b656e204c6f636b6564000000000000000000000000000000000000000060448201526064016106c7565b5050505050565b600880546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b3361163f82610bed565b6001600160a01b0316148061166d5750336116626008546001600160a01b031690565b6001600160a01b0316145b6116cc5760405162461bcd60e51b815260206004820152602a60248201527f596f75206d757374206f776e206120746f6b656e20696e206f7264657220746f604482015269081d5b9b1bd8dac81a5d60b21b60648201526084016106c7565b6000818152600d602052604090205460ff16151560011461172f5760405162461bcd60e51b815260206004820152601060248201527f746f6b656e206e6f74206c6f636b65640000000000000000000000000000000060448201526064016106c7565b6000818152600d60209081526040808320805460ff19169055600e9091528120557ff4b5dc38d8b4dcee5e7fc6413bf0bd43c170e5179a2bce1450e21f28e183e748814261141f82610bed565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906117b1903390899088908890600401611fe8565b6020604051808303816000875af19250505080156117ec575060408051601f3d908101601f191682019092526117e991810190612024565b60015b61184a573d80801561181a576040519150601f19603f3d011682016040523d82523d6000602084013e61181f565b606091505b508051600003611842576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036118ab57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156118d557806118bf81611e08565b91506118ce9050600a83612057565b91506118af565b60008167ffffffffffffffff8111156118f0576118f0611be2565b6040519080825280601f01601f19166020018201604052801561191a576020820181803683370190505b5090505b84156118605761192f60018361206b565b915061193c600a86612082565b611947906030611fd0565b60f81b81838151811061195c5761195c611ddc565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611996600a86612057565b945061191e565b6001600160e01b03198116811461129c57600080fd5b6000602082840312156119c557600080fd5b81356114f78161199d565b60005b838110156119eb5781810151838201526020016119d3565b83811115610baf5750506000910152565b60008151808452611a148160208601602086016119d0565b601f01601f19169290920160200192915050565b6020815260006114f760208301846119fc565b600060208284031215611a4d57600080fd5b5035919050565b60008083601f840112611a6657600080fd5b50813567ffffffffffffffff811115611a7e57600080fd5b6020830191508360208260051b8501011115611a9957600080fd5b9250929050565b60008060208385031215611ab357600080fd5b823567ffffffffffffffff811115611aca57600080fd5b611ad685828601611a54565b90969095509350505050565b80356001600160a01b0381168114611af957600080fd5b919050565b60008060408385031215611b1157600080fd5b611b1a83611ae2565b946020939093013593505050565b600060208284031215611b3a57600080fd5b6114f782611ae2565b600080600060608486031215611b5857600080fd5b611b6184611ae2565b9250611b6f60208501611ae2565b9150604084013590509250925092565b600080600060408486031215611b9457600080fd5b833567ffffffffffffffff811115611bab57600080fd5b611bb786828701611a54565b90945092505060208401356001600160801b0381168114611bd757600080fd5b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611c1357611c13611be2565b604051601f8501601f19908116603f01168101908282118183101715611c3b57611c3b611be2565b81604052809350858152868686011115611c5457600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611c8057600080fd5b813567ffffffffffffffff811115611c9757600080fd5b8201601f81018413611ca857600080fd5b61186084823560208401611bf8565b60008060408385031215611cca57600080fd5b611cd383611ae2565b915060208301358015158114611ce857600080fd5b809150509250929050565b60008060008060808587031215611d0957600080fd5b611d1285611ae2565b9350611d2060208601611ae2565b925060408501359150606085013567ffffffffffffffff811115611d4357600080fd5b8501601f81018713611d5457600080fd5b611d6387823560208401611bf8565b91505092959194509250565b60008060408385031215611d8257600080fd5b611d8b83611ae2565b9150611d9960208401611ae2565b90509250929050565b600181811c90821680611db657607f821691505b602082108103611dd657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201611e1a57611e1a611df2565b5060010190565b601f821115610bd057600081815260208120601f850160051c81016020861015611e485750805b601f850160051c820191505b81811015610b4857828155600101611e54565b815167ffffffffffffffff811115611e8157611e81611be2565b611e9581611e8f8454611da2565b84611e21565b602080601f831160018114611eca5760008415611eb25750858301515b600019600386901b1c1916600185901b178555610b48565b600085815260208120601f198616915b82811015611ef957888601518255948401946001909101908401611eda565b5085821015611f175787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001600160801b03808316818516808303821115611f4957611f49611df2565b01949350505050565b6000808454611f6081611da2565b60018281168015611f785760018114611f8d57611fbc565b60ff1984168752821515830287019450611fbc565b8860005260208060002060005b85811015611fb35781548a820152908401908201611f9a565b50505082870194505b505050508351611f498183602088016119d0565b60008219821115611fe357611fe3611df2565b500190565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261201a60808301846119fc565b9695505050505050565b60006020828403121561203657600080fd5b81516114f78161199d565b634e487b7160e01b600052601260045260246000fd5b60008261206657612066612041565b500490565b60008282101561207d5761207d611df2565b500390565b60008261209157612091612041565b50069056fea26469706673582212205e4481addb3da0ca218f1c5cf5bf4c22855b84fb9c75e8dd633595d4b349363464736f6c634300080f0033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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