ETH Price: $2,977.65 (+1.97%)
Gas: 1 Gwei

Token

Seed Capital (SDC)
 

Overview

Max Total Supply

0 SDC

Holders

136

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
atomdance.eth
Balance
1 SDC
0xb4a9f7d78c438e972199288ed9c4c1c13693a8fc
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:
Palmdeamon

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 6 : Palmdeamon.sol
//SPDX-License-Identifier: Unlicense
import "@rari-capital/solmate/src/tokens/ERC721.sol";
import "./metadata.sol";

pragma solidity ^0.8.0;

contract Palmdeamon is ERC721, Metadata {
    address public admin;
    address public verificationcontract;

    mapping(uint256 => tdata) public tokendata;

    struct tdata {
        uint256 moisture;
        uint256 temperature;
        uint256 colorandlocation;
        string rtimestamp;
    }

    constructor(address _admin) ERC721("Seed Capital", "SDC") {
        admin = _admin;
    }

    function tokenURI(uint256 id) public view override returns (string memory) {
        return
            generatemetadata(
                id,
                tokendata[id].moisture,
                tokendata[id].temperature,
                tokendata[id].colorandlocation,
                tokendata[id].rtimestamp
            );
    }

    function setverificationcontract(address _verificationcontract) public {
        require(msg.sender == admin, "only admin can set verificationcontract");
        verificationcontract = _verificationcontract;
    }

    function setadmin(address newadmin) public {
        require(msg.sender == admin, "only admin can set admin");
        admin = newadmin;
    }

    function generatecolorprofile(
        uint256 profile,
        string memory firsthex,
        string memory secondhex,
        string memory venue,
        string memory plant,
        string memory curator 
    ) public {
        require(msg.sender == admin, "only admin can set colorprofile");
        _generatecolorprofile(
            profile,
            firsthex,
            secondhex,
            venue,
            plant,
            curator 
        );
    }

    function mintafterverification(
        uint256 value1,
        uint256 value2,
        uint256 colorpointer,
        uint256 tokenid,
        string memory rtimestamp
    ) public {
        require(
            msg.sender == verificationcontract,
            "minting can only be called from verification contract"
        );
        require(
            verificationcontract != address(0),
            "no verification contract set"
        );
        tokendata[tokenid].moisture = value1;
        tokendata[tokenid].temperature = value2;
        tokendata[tokenid].colorandlocation = colorpointer;
        tokendata[tokenid].rtimestamp = rtimestamp;
        _mint(tx.origin, tokenid);
    }
}

File 2 of 6 : ERC721.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
/// @dev Note that balanceOf does not revert if passed the zero address, in defiance of the ERC.
abstract contract ERC721 {
    /*///////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 indexed id);

    event Approval(address indexed owner, address indexed spender, uint256 indexed id);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /*///////////////////////////////////////////////////////////////
                          METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*///////////////////////////////////////////////////////////////
                            ERC721 STORAGE                        
    //////////////////////////////////////////////////////////////*/

    mapping(address => uint256) public balanceOf;

    mapping(uint256 => address) public ownerOf;

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*///////////////////////////////////////////////////////////////
                              CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*///////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = ownerOf[id];

        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from || msg.sender == getApproved[id] || isApprovedForAll[from][msg.sender],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            balanceOf[from]--;

            balanceOf[to]++;
        }

        ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes memory data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*///////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*///////////////////////////////////////////////////////////////
                       INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            balanceOf[to]++;
        }

        ownerOf[id] = to;

        emit Transfer(address(0), to, id);
    }

    function _burn(uint256 id) internal virtual {
        address owner = ownerOf[id];

        require(ownerOf[id] != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            balanceOf[owner]--;
        }

        delete ownerOf[id];

        delete getApproved[id];

        emit Transfer(owner, address(0), id);
    }

    /*///////////////////////////////////////////////////////////////
                       INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
interface ERC721TokenReceiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 id,
        bytes calldata data
    ) external returns (bytes4);
}

File 3 of 6 : metadata.sol
pragma solidity ^0.8.0;
import "./generativesvg.sol";

contract Metadata is GenerativeSvg {
    function generatemetadata(
        uint256 id,
        uint256 moisture,
        uint256 temperature,
        uint256 locationcolor,
        string memory rtimestamp
    ) public view returns (string memory) {
        string memory name = generatename(id);
        string memory description = "Seed Capital - Certificates of Growth";
        string memory attributes = generateattributes(
            cschemes[locationcolor].venue,
            cschemes[locationcolor].curator
        );
        string memory image = getsvgbase64(
            moisture,
            temperature,
            locationcolor,
            rtimestamp,
            id
        );
        return
            string(
                abi.encodePacked(
                    "data:text/plain,"
                    '{"name":"',
                    name,
                    '", "description":"',
                    description,
                    '", "image": "',
                    image,
                    '",',
                    '"attributes": ',
                    attributes,
                    "}"
                )
            );
    }

    function generatename(uint256 tokenId)
        internal
        pure
        returns (string memory)
    {
        return
            string(
                abi.encodePacked(
                    "Certificate of Growth ",
                    Strings.toString(tokenId)
                )
            );
    }

    function generateattributes(
        string memory venue,
        string memory curator
    ) internal pure returns (string memory) {
        return
            string(
                abi.encodePacked(
                    "[",
                    '{"trait_type":"Venue",',
                    '"value":"',
                    venue,
                    '"},',
                    '{"trait_type":"Curator",',
                    '"value":"',
                    curator,
                    '"}'
                    "]"
                )
            );
    }
}

File 4 of 6 : generativesvg.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/Strings.sol";
import "base64-sol/base64.sol";

//mapfunction example moisture: 411,300,1000,3600,5600   mapfactor: 1000
// moisture: 1013, temperature: 20.125,

contract GenerativeSvg {
    using Strings for string;

    string internal header =
        "<?xml version='1.0' encoding='UTF-8'?><svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' width='480px' height='740px' viewBox='0 0 480 740' enable-background='new 0 0 480 740' xml:space='preserve'>";
    string internal background =
        "<rect y='140' fill='#141414' width='480' height='500'/>";

    uint256 mapfactor;
    mapping(uint256 => colorscheme) cschemes;

    struct colorscheme {
        string firsthex;
        string secondhex;
        string venue;
        string plant;
        string curator;
    }

    constructor() {
        cschemes[0].firsthex = "#f63f3c";
        cschemes[0].secondhex = "#13b9bc";
        cschemes[0].venue = "Art Dubai";
        cschemes[0].plant = "Dypsis lutescens";
        cschemes[0].curator = "Fingerprints DAO";

        cschemes[1].firsthex = "#ffea00";
        cschemes[1].secondhex = "#481249";

        cschemes[2].firsthex = "#167d5e";
        cschemes[2].secondhex = "#5e67b0";

        mapfactor = 100;
    }

    function mapvalue(
        uint256 value,
        uint256 leftMin,
        uint256 leftMax,
        uint256 rightMin,
        uint256 rightMax
    ) public view returns (uint256) {
        uint256 leftSpan = leftMax - leftMin;
        uint256 rightSpan = rightMax - rightMin;
        uint256 s = (value - leftMin) * mapfactor;
        uint256 valueScaled = s / uint256(leftSpan);
        return rightMin + (valueScaled * rightSpan) / mapfactor;
    }

    function _generatecolorprofile(
        uint256 profile,
        string memory firsthex,
        string memory secondhex,
        string memory venue,
        string memory plant,
        string memory curator
    ) internal {
        cschemes[profile].firsthex = firsthex;
        cschemes[profile].secondhex = secondhex;
        cschemes[profile].venue = venue;
        cschemes[profile].plant = plant;
        cschemes[profile].curator = curator;
    }

    function buildhsl(uint256 temp, uint256 moisture)
        internal
        view
        returns (string memory)
    {
        string memory h = Strings.toString(
            mapvalue(moisture, 70000, 80000, 0, 360)
        );
        string memory l = Strings.toString(
            mapvalue(temp, 19000, 23000, 50, 100)
        );
        return string(abi.encodePacked("hsl(", h, ",100%,", l, "%)"));
        //= 'hsl(0, 100%, 50%)';
    }

    function gradienty(uint256 temp) internal view returns (string memory) {
        return Strings.toString(mapvalue(temp, 19000, 23000, 300, 1000));
    }

    function gradientx(uint256 moisture) internal view returns (string memory) {
        return Strings.toString(mapvalue(moisture, 70000, 80000, 50, 700));
    }

    function gradientz(uint256 moisture) internal view returns (string memory) {
        return Strings.toString(mapvalue(moisture, 70000, 80000, 100, 500));
    }

    function lineargradienty(uint256 temp, uint256 locationcolor)
        internal
        view
        returns (string memory)
    {
        return
            string(
                abi.encodePacked(
                    "<linearGradient id='SVGID_1_' gradientUnits='userSpaceOnUse' x1='180.0005' y1='",
                    gradienty(temp),
                    "' x2='180.0005' y2='160.0005'> <stop  offset='0' style='stop-color:",
                    cschemes[locationcolor].secondhex,
                    ";stop-opacity:0'/><stop  offset='0.5' style='stop-color:",
                    cschemes[locationcolor].secondhex,
                    "'/> <stop  offset='1' style='stop-color:",
                    cschemes[locationcolor].secondhex,
                    ";stop-opacity:0'/></linearGradient> <rect y='160' fill='url(#SVGID_1_)' width='360' height='480'/>"
                )
            );
    }

    function lineargradientx(uint256 moisture, uint256 locationcolor)
        internal
        view
        returns (string memory)
    {
        return
            string(
                abi.encodePacked(
                    "<linearGradient id='SVGID_2_' gradientUnits='userSpaceOnUse' x1='0' y1='400' x2='",
                    gradientx(moisture),
                    "' y2='400'><stop  offset='0' style='stop-color:",
                    cschemes[locationcolor].firsthex,
                    ";stop-opacity:0'/><stop  offset='0.5' style='stop-color:",
                    cschemes[locationcolor].firsthex,
                    "'/> <stop  offset='1' style='stop-color:",
                    cschemes[locationcolor].firsthex,
                    ";stop-opacity:0'/></linearGradient> <rect y='160' fill='url(#SVGID_2_)' width='360' height='480'/>"
                )
            );
    }

    function lineargradientz(uint256 temp, uint256 moisture)
        internal
        view
        returns (string memory)
    {
        return
            string(
                abi.encodePacked(
                    "<linearGradient id='SVGID_3_' gradientUnits='userSpaceOnUse' x1='220.0225' y1='329.4453' x2='",
                    gradientz(moisture),
                    "' y2='219.445' gradientTransform='matrix(3.6 0 0 3.6 -684.0762 -606)'> <stop  offset='0' style='stop-color:",
                    buildhsl(temp, moisture),
                    ";stop-opacity:0'/> <stop  offset='1' style='stop-color:",
                    buildhsl(temp, moisture),
                    "'/> </linearGradient> <rect y='220' fill='url(#SVGID_3_)' width='360.001' height='360'/>"
                )
            );
    }

    function returnfixtext() internal pure returns (string memory) {
        return
            "<text transform='matrix(1 0 0 1 10 185.2061)' font-family='Arial' font-size='16'>Soil Moisture (x-axis)</text><text transform='matrix(1 0 0 1 10 141.4561)' font-family='Arial' font-size='16'>Time</text><text transform='matrix(1 0 0 1 10 605.2061)' font-family='Arial' font-size='16'>Plant</text><text transform='matrix(1 0 0 1 10 651.4561)' font-family='Arial' font-size='16'>Location</text><text transform='matrix(1 0 0 1 250 185.2061)' font-family='Arial' font-size='16'>Temperature (y-axis)</text><text transform='matrix(1 0 0 1 427.0029 241.4556)' fill='#EBEBEB' font-family='Arial' font-size='16'>terra0</text><text transform='matrix(1 0 0 1 9 80.7349)' fill='#141414' font-family='Times-Roman, Times' font-size='45'>Certificate of Growth </text>";
    }

    function buildpercentage(uint256 percentage)
        public
        pure
        returns (string memory)
    {
        return
            string(
                abi.encodePacked(
                    Strings.toString((percentage % 100000) / 1000),
                    ",",
                    Strings.toString((percentage % 1000) / 10)
                )
            );
    }



    function xypoint(uint256 moisture, uint256 temperature)
        internal
        view
        returns (string memory)
    {
        return
            string(
                abi.encodePacked(
                    "<text transform='matrix(1 0 0 1 ",
                    Strings.toString(mapvalue(moisture, 70000, 80000, 0, 335)),
                    " ",
                    Strings.toString(
                        580 -
                            (mapvalue(temperature, 19000, 23000, 245, 580) -
                                245)
                    ),
                    ")' fill='#EBEBEB' font-family='Courier, monospace' font-size='40'>+</text>"
                )
            );
    }

    function buildmoisture(uint256 moisture)
        internal
        pure
        returns (string memory)
    {
        return
            string(
                abi.encodePacked(
                    "<text transform='matrix(1 0 0 1 9 205.3359)' fill='#141414' font-family='Courier, monospace' font-size='24'>",
                    buildpercentage(moisture),
                    "%</text>"
                )
            );
    }

    function buildtemperature(uint256 temperature)
        internal
        pure
        returns (string memory)
    {
        return
            string(
                abi.encodePacked(
                    "<text transform='matrix(1 0 0 1 249 205.3364)' fill='#141414' font-family='Courier, monospace' font-size='24'>",
                    buildpercentage(temperature),
                    "C</text>"
                )
            );
    }

    function buildlocation(uint256 colorpointer)
        internal
        view
        returns (string memory)
    {
        return
            string(
                abi.encodePacked(
                    "<text transform='matrix(1 0 0 1 10 671.5859)'><tspan x='0' y='0' fill='#141414' font-family='Courier, monospace' font-size='24'>",
                    cschemes[colorpointer].venue,
                    "</tspan><tspan x='0' y='20' fill='#141414' font-family='Courier' font-size='24'>",
                    cschemes[colorpointer].curator,
                    "</tspan></text>"
                )
            );
    }

    function buildtokennumber(uint256 tokenid)
        internal
        pure
        returns (string memory)
    {
        return
            string(
                abi.encodePacked(
                    "<text transform='matrix(1 0 0 1 412.3906 80)' fill='#141414' font-family='Courier, monospace' font-size='24'>",
                    Strings.toString(tokenid),
                    "</text>"
                )
            );
    }

    function buildbars(uint256 moisture, uint256 temp)
        internal
        view
        returns (string memory)
    {
        return
            string(
                abi.encodePacked(
                    "<text transform='matrix(1 0 0 1 360 ",
                    Strings.toString(
                        650 - mapvalue(moisture, 70000, 80000, 250, 390)
                    ),
                    ")' fill='#EBEBEB' font-family='Courier, monospace' font-size='49'>_</text>",
                    "<text transform='matrix(1 0 0 1 390 ",
                    Strings.toString(
                        650 - mapvalue(temp, 19000, 23000, 250, 390)
                    ),
                    ")' fill='#EBEBEB' font-family='Courier, monospace' font-size='49'>_</text>"
                )
            );
    }

    function returndynamictext(
        uint256 moisture,
        uint256 temp,
        uint256 locationcolor,
        string memory humantimestamp,
        uint256 tokenid
    ) internal view returns (string memory) {
        return
            string(
                abi.encodePacked(
                    buildtemperature(temp),
                    buildmoisture(moisture),
                    buildlocation(locationcolor),
                    "<text transform='matrix(1 0 0 1 10 625.3359)' fill='#141414' font-family='Courier, monospace' font-size='24'>",
                    cschemes[locationcolor].plant,
                    "</text>",
                    buildtokennumber(tokenid),
                    "<text transform='matrix(1 0 0 1 10 161.5859)' fill='#141414' font-family='Courier, monospace' font-size='24'>",
                    humantimestamp,
                    "</text>"
                )
            );
    }

    function generatebars() internal pure returns (string memory) {
        return
            string(
                abi.encodePacked(
                    "<linearGradient id='SVGID_4_' gradientUnits='userSpaceOnUse' x1='405' y1='580' x2='405' y2='220.1191'> <stop  offset='0' style='stop-color:#00FF00'/> <stop  offset='1' style='stop-color:#C2000B'/> </linearGradient> <rect x='390' y='220.119' fill='url(#SVGID_4_)' width='30' height='359.881'/><linearGradient id='SVGID_5_' gradientUnits='userSpaceOnUse' x1='375' y1='580' x2='375' y2='220.1191'> <stop  offset='0' style='stop-color:#141414'/> <stop  offset='1' style='stop-color:#00A0C6'/> </linearGradient>",
                    "<path opacity='0.25' fill='none' stroke='#EBEBEB' stroke-width='2' stroke-miterlimit='10' d='M300,220v360 M240,220v360 M180,220 v360 M120,220v360 M60,220v360 M360,520H0 M360,460H0 M360,400H0 M360,340H0 M360,280H0'/><rect x='360' y='260' opacity='0.25' fill='#EBEBEB' width='30' height='120'/><rect x='390' y='240' opacity='0.25' fill='#EBEBEB' width='30' height='160'/>",
                    "<rect x='360' y='220.119' fill='url(#SVGID_5_)' width='30' height='359.881'/>"
                )
            );
    }

    function generatesvg(
        uint256 moisture,
        uint256 temp,
        uint256 locationcolor,
        string memory humantimestamp,
        uint256 id
    ) public view returns (string memory) {
        return
            string(
                abi.encodePacked(
                    header,
                    background,
                    generatebars(),
                    lineargradienty(temp, locationcolor),
                    lineargradientx(moisture, locationcolor),
                    lineargradientz(temp, moisture),
                    "<path fill='#EBEBEB' d='M0,580v160h480V580H0z'/> <path fill='#EBEBEB' d='M0,0v220h480V0H0z'/>",
                    "<path opacity='0.25' fill='none' stroke='#EBEBEB' stroke-width='2' stroke-miterlimit='10' d='M300,220v360 M240,220v360 M180,220v360 M120,220v360 M60,220v360 M360,520H0 M360,460H0 M360,400H0 M360,340H0 M360,280H0'/>",
                    returnfixtext(),
                    returndynamictext(
                        moisture,
                        temp,
                        locationcolor,
                        humantimestamp,
                        id
                    ),
                    xypoint(moisture, temp),
                    buildbars(moisture, temp),
                    "</svg >"
                )
            );
    }

    function getsvgbase64(
        uint256 moisture,
        uint256 temperature,
        uint256 locationcolor,
        string memory humantimestamp,
        uint256 id
    ) public view returns (string memory) {
        return
            string(
                abi.encodePacked(
                    "data:image/svg+xml;base64,",
                    Base64.encode(
                        bytes(
                            generatesvg(
                                moisture,
                                temperature,
                                locationcolor,
                                humantimestamp,
                                id
                            )
                        )
                    )
                )
            );
    }
}

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

pragma solidity ^0.8.0;

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

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

File 6 of 6 : base64.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }

    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

        // add some extra buffer at the end required for the writing
        bytes memory result = new bytes(decodedLen + 32);

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","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":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"buildpercentage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"profile","type":"uint256"},{"internalType":"string","name":"firsthex","type":"string"},{"internalType":"string","name":"secondhex","type":"string"},{"internalType":"string","name":"venue","type":"string"},{"internalType":"string","name":"plant","type":"string"},{"internalType":"string","name":"curator","type":"string"}],"name":"generatecolorprofile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"moisture","type":"uint256"},{"internalType":"uint256","name":"temperature","type":"uint256"},{"internalType":"uint256","name":"locationcolor","type":"uint256"},{"internalType":"string","name":"rtimestamp","type":"string"}],"name":"generatemetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"moisture","type":"uint256"},{"internalType":"uint256","name":"temp","type":"uint256"},{"internalType":"uint256","name":"locationcolor","type":"uint256"},{"internalType":"string","name":"humantimestamp","type":"string"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"generatesvg","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"moisture","type":"uint256"},{"internalType":"uint256","name":"temperature","type":"uint256"},{"internalType":"uint256","name":"locationcolor","type":"uint256"},{"internalType":"string","name":"humantimestamp","type":"string"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getsvgbase64","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"leftMin","type":"uint256"},{"internalType":"uint256","name":"leftMax","type":"uint256"},{"internalType":"uint256","name":"rightMin","type":"uint256"},{"internalType":"uint256","name":"rightMax","type":"uint256"}],"name":"mapvalue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value1","type":"uint256"},{"internalType":"uint256","name":"value2","type":"uint256"},{"internalType":"uint256","name":"colorpointer","type":"uint256"},{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"string","name":"rtimestamp","type":"string"}],"name":"mintafterverification","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","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":"id","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":"address","name":"newadmin","type":"address"}],"name":"setadmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_verificationcontract","type":"address"}],"name":"setverificationcontract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokendata","outputs":[{"internalType":"uint256","name":"moisture","type":"uint256"},{"internalType":"uint256","name":"temperature","type":"uint256"},{"internalType":"uint256","name":"colorandlocation","type":"uint256"},{"internalType":"string","name":"rtimestamp","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"verificationcontract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

608060405260405180610120016040528060f58152602001620064a360f59139600690805190602001906200003692919062000502565b506040518060600160405280603781526020016200659860379139600790805190602001906200006892919062000502565b503480156200007657600080fd5b50604051620065cf380380620065cf83398181016040528101906200009c9190620005c9565b6040518060400160405280600c81526020017f53656564204361706974616c00000000000000000000000000000000000000008152506040518060400160405280600381526020017f534443000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200012092919062000502565b5080600190805190602001906200013992919062000502565b5050506040518060400160405280600781526020017f23663633663363000000000000000000000000000000000000000000000000008152506009600080815260200190815260200160002060000190805190602001906200019d92919062000502565b506040518060400160405280600781526020017f2331336239626300000000000000000000000000000000000000000000000000815250600960008081526020019081526020016000206001019080519060200190620001ff92919062000502565b506040518060400160405280600981526020017f41727420447562616900000000000000000000000000000000000000000000008152506009600080815260200190815260200160002060020190805190602001906200026192919062000502565b506040518060400160405280601081526020017f447970736973206c7574657363656e7300000000000000000000000000000000815250600960008081526020019081526020016000206003019080519060200190620002c392919062000502565b506040518060400160405280601081526020017f46696e6765727072696e74732044414f000000000000000000000000000000008152506009600080815260200190815260200160002060040190805190602001906200032592919062000502565b506040518060400160405280600781526020017f2366666561303000000000000000000000000000000000000000000000000000815250600960006001815260200190815260200160002060000190805190602001906200038892919062000502565b506040518060400160405280600781526020017f233438313234390000000000000000000000000000000000000000000000000081525060096000600181526020019081526020016000206001019080519060200190620003eb92919062000502565b506040518060400160405280600781526020017f2331363764356500000000000000000000000000000000000000000000000000815250600960006002815260200190815260200160002060000190805190602001906200044e92919062000502565b506040518060400160405280600781526020017f233565363762300000000000000000000000000000000000000000000000000081525060096000600281526020019081526020016000206001019080519060200190620004b192919062000502565b50606460088190555080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620006a8565b828054620005109062000629565b90600052602060002090601f01602090048101928262000534576000855562000580565b82601f106200054f57805160ff191683800117855562000580565b8280016001018555821562000580579182015b828111156200057f57825182559160200191906001019062000562565b5b5090506200058f919062000593565b5090565b5b80821115620005ae57600081600090555060010162000594565b5090565b600081519050620005c3816200068e565b92915050565b600060208284031215620005dc57600080fd5b6000620005ec84828501620005b2565b91505092915050565b6000620006028262000609565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200064257607f821691505b602082108114156200065957620006586200065f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6200069981620005f5565b8114620006a557600080fd5b50565b615deb80620006b86000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806370a08231116100de578063b88d4fde11610097578063dded49cb11610071578063dded49cb146104a7578063e4939f9d146104c3578063e985e9c5146104e1578063f851a4401461051157610173565b8063b88d4fde1461042b578063c6643c9b14610447578063c87b56dd1461047757610173565b806370a082311461033157806374cfa50a14610361578063864f98b11461039157806395d89b41146103c1578063a22cb465146103df578063b0703efd146103fb57610173565b806323b872dd1161013057806323b872dd1461025e5780633bf717761461027a57806342842e0e14610296578063507d7f42146102b257806357c8081b146102ce5780636352211e1461030157610173565b806301ffc9a71461017857806306fdde03146101a8578063081812fc146101c6578063095ea7b3146101f6578063128c5b5614610212578063131a4ad414610242575b600080fd5b610192600480360381019061018d919061293b565b61052f565b60405161019f9190613cbd565b60405180910390f35b6101b06105c1565b6040516101bd9190613cd8565b60405180910390f35b6101e060048036038101906101db919061298d565b61064f565b6040516101ed9190613c0c565b60405180910390f35b610210600480360381019061020b91906128ff565b610682565b005b61022c6004803603810190610227919061298d565b61086b565b6040516102399190613cd8565b60405180910390f35b61025c600480360381019061025791906129b6565b6108da565b005b610278600480360381019061027391906127f9565b610980565b005b610294600480360381019061028f9190612b46565b610d80565b005b6102b060048036038101906102ab91906127f9565b610f2f565b005b6102cc60048036038101906102c79190612794565b611076565b005b6102e860048036038101906102e3919061298d565b61114a565b6040516102f89493929190613e55565b60405180910390f35b61031b6004803603810190610316919061298d565b611202565b6040516103289190613c0c565b60405180910390f35b61034b60048036038101906103469190612794565b611235565b6040516103589190613e3a565b60405180910390f35b61037b60048036038101906103769190612b46565b61124d565b6040516103889190613cd8565b60405180910390f35b6103ab60048036038101906103a69190612ab7565b611409565b6040516103b89190613cd8565b60405180910390f35b6103c961144a565b6040516103d69190613cd8565b60405180910390f35b6103f960048036038101906103f491906128c3565b6114d8565b005b61041560048036038101906104109190612bd5565b6115d5565b6040516104229190613e3a565b60405180910390f35b61044560048036038101906104409190612848565b611656565b005b610461600480360381019061045c9190612ab7565b6117a0565b60405161046e9190613cd8565b60405180910390f35b610491600480360381019061048c919061298d565b611828565b60405161049e9190613cd8565b60405180910390f35b6104c160048036038101906104bc9190612794565b61191e565b005b6104cb6119f2565b6040516104d89190613c0c565b60405180910390f35b6104fb60048036038101906104f691906127bd565b611a18565b6040516105089190613cbd565b60405180910390f35b610519611a47565b6040516105269190613c0c565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061058a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105ba5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600080546105ce9061414b565b80601f01602080910402602001604051908101604052809291908181526020018280546105fa9061414b565b80156106475780601f1061061c57610100808354040283529160200191610647565b820191906000526020600020905b81548152906001019060200180831161062a57829003601f168201915b505050505081565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061077a5750600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6107b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b090613dfa565b60405180910390fd5b826004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60606108916103e8620186a08461088291906141f7565b61088c9190613fd6565b611a6d565b6108b3600a6103e8856108a491906141f7565b6108ae9190613fd6565b611a6d565b6040516020016108c49291906136e3565b6040516020818303038152906040529050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461096a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096190613d9a565b60405180910390fd5b610978868686868686611c1a565b505050505050565b6003600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1890613e1a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890613d1a565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b2957506004600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610bba5750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf090613dfa565b60405180910390fd5b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0790613cfa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9990613d7a565b60405180910390fd5b84600c60008481526020019081526020016000206000018190555083600c60008481526020019081526020016000206001018190555082600c60008481526020019081526020016000206002018190555080600c60008481526020019081526020016000206003019080519060200190610f1d9291906125b8565b50610f283283611cf9565b5050505050565b610f3a838383610980565b60008273ffffffffffffffffffffffffffffffffffffffff163b1480611032575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b8152600401610fbf93929190613c73565b602060405180830381600087803b158015610fd957600080fd5b505af1158015610fed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110119190612964565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b611071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106890613d5a565b60405180910390fd5b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fd90613d3a565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c60205280600052604060002060009150905080600001549080600101549080600201549080600301805461117f9061414b565b80601f01602080910402602001604051908101604052809291908181526020018280546111ab9061414b565b80156111f85780601f106111cd576101008083540402835291602001916111f8565b820191906000526020600020905b8154815290600101906020018083116111db57829003601f168201915b5050505050905084565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026020528060005260406000206000915090505481565b6060600061125a87611f0c565b90506000604051806060016040528060258152602001615d5160259139905060006113c160096000888152602001908152602001600020600201805461129f9061414b565b80601f01602080910402602001604051908101604052809291908181526020018280546112cb9061414b565b80156113185780601f106112ed57610100808354040283529160200191611318565b820191906000526020600020905b8154815290600101906020018083116112fb57829003601f168201915b505050505060096000898152602001908152602001600020600401805461133e9061414b565b80601f016020809104026020016040519081016040528092919081815260200182805461136a9061414b565b80156113b75780601f1061138c576101008083540402835291602001916113b7565b820191906000526020600020905b81548152906001019060200180831161139a57829003601f168201915b5050505050611f3d565b905060006113d2898989898e611409565b9050838382846040516020016113eb94939291906139e7565b60405160208183030381529060405294505050505095945050505050565b606061142061141b87878787876117a0565b611f69565b6040516020016114309190613bea565b604051602081830303815290604052905095945050505050565b600180546114579061414b565b80601f01602080910402602001604051908101604052809291908181526020018280546114839061414b565b80156114d05780601f106114a5576101008083540402835291602001916114d0565b820191906000526020600020905b8154815290600101906020018083116114b357829003601f168201915b505050505081565b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115c99190613cbd565b60405180910390a35050565b60008085856115e49190614061565b9050600084846115f49190614061565b90506000600854888a6116079190614061565b6116119190614007565b9050600083826116219190613fd6565b905060085483826116329190614007565b61163c9190613fd6565b876116479190613f80565b94505050505095945050505050565b611661848484610980565b60008373ffffffffffffffffffffffffffffffffffffffff163b148061175b575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b81526004016116e89493929190613c27565b602060405180830381600087803b15801561170257600080fd5b505af1158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a9190612964565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b61179a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179190613d5a565b60405180910390fd5b50505050565b6060600660076117ae612108565b6117b8888861212d565b6117c28a896121a4565b6117cc8a8c61221b565b6117d4612263565b6117e18d8d8d8d8d612286565b6117eb8e8e6122f2565b6117f58f8f61236f565b60405160200161180e9a99989796959493929190613712565b604051602081830303815290604052905095945050505050565b606061191782600c600085815260200190815260200160002060000154600c600086815260200190815260200160002060010154600c600087815260200190815260200160002060020154600c600088815260200190815260200160002060030180546118949061414b565b80601f01602080910402602001604051908101604052809291908181526020018280546118c09061414b565b801561190d5780601f106118e25761010080835404028352916020019161190d565b820191906000526020600020905b8154815290600101906020018083116118f057829003601f168201915b505050505061124d565b9050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a590613dba565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000821415611ab5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611c15565b600082905060005b60008214611ae7578080611ad0906141ae565b915050600a82611ae09190613fd6565b9150611abd565b60008167ffffffffffffffff811115611b29577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611b5b5781602001600182028036833780820191505090505b5090505b60008514611c0e57600182611b749190614061565b9150600a85611b8391906141f7565b6030611b8f9190613f80565b60f81b818381518110611bcb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611c079190613fd6565b9450611b5f565b8093505050505b919050565b84600960008881526020019081526020016000206000019080519060200190611c449291906125b8565b5083600960008881526020019081526020016000206001019080519060200190611c6f9291906125b8565b5082600960008881526020019081526020016000206002019080519060200190611c9a9291906125b8565b5081600960008881526020019081526020016000206003019080519060200190611cc59291906125b8565b5080600960008881526020019081526020016000206004019080519060200190611cf09291906125b8565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6090613d1a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0290613dda565b60405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6060611f1782611a6d565b604051602001611f279190613ad8565b6040516020818303038152906040529050919050565b60608282604051602001611f52929190613a67565b604051602081830303815290604052905092915050565b6060600082511415611f8c57604051806020016040528060008152509050612103565b6000604051806060016040528060408152602001615d766040913990506000600360028551611fbb9190613f80565b611fc59190613fd6565b6004611fd19190614007565b90506000602082611fe29190613f80565b67ffffffffffffffff811115612021577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120535781602001600182028036833780820191505090505b509050818152600183018586518101602084015b818310156120c2576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825360018201915050612067565b6003895106600181146120dc57600281146120ec576120f7565b613d3d60f01b60028303526120f7565b603d60f81b60018303525b50505050508093505050505b919050565b606060405160200161211990613b6f565b604051602081830303815290604052905090565b6060612138836123ed565b60096000848152602001908152602001600020600101600960008581526020019081526020016000206001016009600086815260200190815260200160002060010160405160200161218d9493929190613831565b604051602081830303815290604052905092915050565b60606121af83612413565b6009600084815260200190815260200160002060000160096000858152602001908152602001600020600001600960008681526020019081526020016000206000016040516020016122049493929190613afa565b604051602081830303815290604052905092915050565b60606122268261243a565b6122308484612461565b61223a8585612461565b60405160200161224c9392919061398a565b604051602081830303815290604052905092915050565b60606040518061032001604052806102ef8152602001615a626102ef9139905090565b6060612291856124d0565b61229a87612501565b6122a386612532565b600960008881526020019081526020016000206003016122c286612587565b876040516020016122d89695949392919061365f565b604051602081830303815290604052905095945050505050565b606061231261230d846201117062013880600061014f6115d5565b611a6d565b61234760f561232b85614a386159d860f56102446115d5565b6123359190614061565b6102446123429190614061565b611a6d565b6040516020016123589291906138a6565b604051602081830303815290604052905092915050565b606061239c61238a84620111706201388060fa6101866115d5565b61028a6123979190614061565b611a6d565b6123c56123b384614a386159d860fa6101866115d5565b61028a6123c09190614061565b611a6d565b6040516020016123d6929190613b9a565b604051602081830303815290604052905092915050565b606061240c61240783614a386159d861012c6103e86115d5565b611a6d565b9050919050565b606061243361242e83620111706201388060326102bc6115d5565b611a6d565b9050919050565b606061245a61245583620111706201388060646101f46115d5565b611a6d565b9050919050565b6060600061248361247e84620111706201388060006101686115d5565b611a6d565b905060006124a261249d86614a386159d8603260646115d5565b611a6d565b905081816040516020016124b7929190613945565b6040516020818303038152906040529250505092915050565b60606124db8261086b565b6040516020016124eb9190613804565b6040516020818303038152906040529050919050565b606061250c8261086b565b60405160200161251c9190613918565b6040516020818303038152906040529050919050565b606060096000838152602001908152602001600020600201600960008481526020019081526020016000206004016040516020016125719291906137bf565b6040516020818303038152906040529050919050565b606061259282611a6d565b6040516020016125a291906138eb565b6040516020818303038152906040529050919050565b8280546125c49061414b565b90600052602060002090601f0160209004810192826125e6576000855561262d565b82601f106125ff57805160ff191683800117855561262d565b8280016001018555821561262d579182015b8281111561262c578251825591602001919060010190612611565b5b50905061263a919061263e565b5090565b5b8082111561265757600081600090555060010161263f565b5090565b600061266e61266984613ec6565b613ea1565b90508281526020810184848401111561268657600080fd5b612691848285614109565b509392505050565b60006126ac6126a784613ef7565b613ea1565b9050828152602081018484840111156126c457600080fd5b6126cf848285614109565b509392505050565b6000813590506126e681615a05565b92915050565b6000813590506126fb81615a1c565b92915050565b60008135905061271081615a33565b92915050565b60008151905061272581615a33565b92915050565b600082601f83011261273c57600080fd5b813561274c84826020860161265b565b91505092915050565b600082601f83011261276657600080fd5b8135612776848260208601612699565b91505092915050565b60008135905061278e81615a4a565b92915050565b6000602082840312156127a657600080fd5b60006127b4848285016126d7565b91505092915050565b600080604083850312156127d057600080fd5b60006127de858286016126d7565b92505060206127ef858286016126d7565b9150509250929050565b60008060006060848603121561280e57600080fd5b600061281c868287016126d7565b935050602061282d868287016126d7565b925050604061283e8682870161277f565b9150509250925092565b6000806000806080858703121561285e57600080fd5b600061286c878288016126d7565b945050602061287d878288016126d7565b935050604061288e8782880161277f565b925050606085013567ffffffffffffffff8111156128ab57600080fd5b6128b78782880161272b565b91505092959194509250565b600080604083850312156128d657600080fd5b60006128e4858286016126d7565b92505060206128f5858286016126ec565b9150509250929050565b6000806040838503121561291257600080fd5b6000612920858286016126d7565b92505060206129318582860161277f565b9150509250929050565b60006020828403121561294d57600080fd5b600061295b84828501612701565b91505092915050565b60006020828403121561297657600080fd5b600061298484828501612716565b91505092915050565b60006020828403121561299f57600080fd5b60006129ad8482850161277f565b91505092915050565b60008060008060008060c087890312156129cf57600080fd5b60006129dd89828a0161277f565b965050602087013567ffffffffffffffff8111156129fa57600080fd5b612a0689828a01612755565b955050604087013567ffffffffffffffff811115612a2357600080fd5b612a2f89828a01612755565b945050606087013567ffffffffffffffff811115612a4c57600080fd5b612a5889828a01612755565b935050608087013567ffffffffffffffff811115612a7557600080fd5b612a8189828a01612755565b92505060a087013567ffffffffffffffff811115612a9e57600080fd5b612aaa89828a01612755565b9150509295509295509295565b600080600080600060a08688031215612acf57600080fd5b6000612add8882890161277f565b9550506020612aee8882890161277f565b9450506040612aff8882890161277f565b935050606086013567ffffffffffffffff811115612b1c57600080fd5b612b2888828901612755565b9250506080612b398882890161277f565b9150509295509295909350565b600080600080600060a08688031215612b5e57600080fd5b6000612b6c8882890161277f565b9550506020612b7d8882890161277f565b9450506040612b8e8882890161277f565b9350506060612b9f8882890161277f565b925050608086013567ffffffffffffffff811115612bbc57600080fd5b612bc888828901612755565b9150509295509295909350565b600080600080600060a08688031215612bed57600080fd5b6000612bfb8882890161277f565b9550506020612c0c8882890161277f565b9450506040612c1d8882890161277f565b9350506060612c2e8882890161277f565b9250506080612c3f8882890161277f565b9150509295509295909350565b612c5581614095565b82525050565b612c64816140a7565b82525050565b6000612c7582613f3d565b612c7f8185613f53565b9350612c8f818560208601614118565b612c98816142e4565b840191505092915050565b6000612cae82613f48565b612cb88185613f64565b9350612cc8818560208601614118565b612cd1816142e4565b840191505092915050565b6000612ce782613f48565b612cf18185613f75565b9350612d01818560208601614118565b80840191505092915050565b60008154612d1a8161414b565b612d248186613f75565b94506001821660008114612d3f5760018114612d5057612d83565b60ff19831686528186019350612d83565b612d5985613f28565b60005b83811015612d7b57815481890152600182019150602081019050612d5c565b838801955050505b50505092915050565b6000612d99606d83613f75565b9150612da4826142f5565b606d82019050919050565b6000612dbc606283613f75565b9150612dc782614390565b606282019050919050565b6000612ddf600f83613f75565b9150612dea8261442b565b600f82019050919050565b6000612e02608083613f75565b9150612e0d82614454565b608082019050919050565b6000612e25602483613f75565b9150612e30826144ef565b602482019050919050565b6000612e48600283613f75565b9150612e538261453e565b600282019050919050565b6000612e6b600883613f75565b9150612e7682614567565b600882019050919050565b6000612e8e600683613f75565b9150612e9982614590565b600682019050919050565b6000612eb1601683613f75565b9150612ebc826145b9565b601682019050919050565b6000612ed4606e83613f75565b9150612edf826145e2565b606e82019050919050565b6000612ef7602f83613f75565b9150612f028261467d565b602f82019050919050565b6000612f1a604f83613f75565b9150612f25826146cc565b604f82019050919050565b6000612f3d60d683613f75565b9150612f4882614741565b60d682019050919050565b6000612f60600183613f75565b9150612f6b8261484e565b600182019050919050565b6000612f83600383613f75565b9150612f8e82614877565b600382019050919050565b6000612fa6602083613f75565b9150612fb1826148a0565b602082019050919050565b6000612fc9605083613f75565b9150612fd4826148c9565b605082019050919050565b6000612fec600883613f75565b9150612ff78261493e565b600882019050919050565b600061300f606d83613f75565b915061301a82614967565b606d82019050919050565b6000613032604a83613f75565b915061303d82614a02565b604a82019050919050565b6000613055606c83613f75565b915061306082614a77565b606c82019050919050565b6000613078603783613f75565b915061308382614b12565b603782019050919050565b600061309b600383613f75565b91506130a682614b61565b600382019050919050565b60006130be603583613f64565b91506130c982614b8a565b604082019050919050565b60006130e1601183613f64565b91506130ec82614bd9565b602082019050919050565b6000613104602783613f64565b915061310f82614c02565b604082019050919050565b6000613127600483613f75565b915061313282614c51565b600482019050919050565b600061314a600283613f75565b915061315582614c7a565b600282019050919050565b600061316d600183613f75565b915061317882614ca3565b600182019050919050565b6000613190604a83613f75565b915061319b82614ccc565b604a82019050919050565b60006131b461017183613f75565b91506131bf82614d41565b61017182019050919050565b60006131d8605883613f75565b91506131e382614f10565b605882019050919050565b60006131fb600783613f75565b915061320682614f85565b600782019050919050565b600061321e605d83613f75565b915061322982614fae565b605d82019050919050565b6000613241600d83613f75565b915061324c82615023565b600d82019050919050565b6000613264600183613f75565b915061326f8261504c565b600182019050919050565b6000613287601983613f75565b915061329282615075565b601982019050919050565b60006132aa600783613f75565b91506132b58261509e565b600782019050919050565b60006132cd601083613f64565b91506132d8826150c7565b602082019050919050565b60006132f0601283613f75565b91506132fb826150f0565b601282019050919050565b6000613313600983613f75565b915061331e82615119565b600982019050919050565b6000613336600183613f75565b915061334182615142565b600182019050919050565b6000613359604383613f75565b91506133648261516b565b604382019050919050565b600061337c606283613f75565b9150613387826151e0565b606282019050919050565b600061339f601683613f75565b91506133aa8261527b565b601682019050919050565b60006133c2602883613f75565b91506133cd826152a4565b602882019050919050565b60006133e5601c83613f64565b91506133f0826152f3565b602082019050919050565b6000613408605d83613f75565b91506134138261531c565b605d82019050919050565b600061342b606b83613f75565b915061343682615391565b606b82019050919050565b600061344e600083613f53565b91506134598261542c565b600082019050919050565b6000613471604d83613f75565b915061347c8261542f565b604d82019050919050565b6000613494601f83613f64565b915061349f826154a4565b602082019050919050565b60006134b7601883613f75565b91506134c2826154cd565b601882019050919050565b60006134da605183613f75565b91506134e5826154f6565b605182019050919050565b60006134fd603883613f75565b91506135088261556b565b603882019050919050565b6000613520601883613f64565b915061352b826155ba565b602082019050919050565b6000613543600e83613f75565b915061354e826155e3565b600e82019050919050565b60006135676101fa83613f75565b91506135728261560c565b6101fa82019050919050565b600061358b602483613f75565b915061359682615877565b602482019050919050565b60006135ae606d83613f75565b91506135b9826158c6565b606d82019050919050565b60006135d1600e83613f64565b91506135dc82615961565b602082019050919050565b60006135f4600e83613f64565b91506135ff8261598a565b602082019050919050565b6000613617600a83613f64565b9150613622826159b3565b602082019050919050565b600061363a601a83613f75565b9150613645826159dc565b601a82019050919050565b613659816140ff565b82525050565b600061366b8289612cdc565b91506136778288612cdc565b91506136838287612cdc565b915061368e826135a1565b915061369a8286612d0d565b91506136a5826131ee565b91506136b18285612cdc565b91506136bc82612d8c565b91506136c88284612cdc565b91506136d3826131ee565b9150819050979650505050505050565b60006136ef8285612cdc565b91506136fa82612f53565b91506137068284612cdc565b91508190509392505050565b600061371e828d612d0d565b915061372a828c612d0d565b9150613736828b612cdc565b9150613742828a612cdc565b915061374e8289612cdc565b915061375a8288612cdc565b9150613765826133fb565b915061377082612f30565b915061377c8287612cdc565b91506137888286612cdc565b91506137948285612cdc565b91506137a08284612cdc565b91506137ab8261329d565b91508190509b9a5050505050505050505050565b60006137ca82612df5565b91506137d68285612d0d565b91506137e182612fbc565b91506137ed8284612d0d565b91506137f882612dd2565b91508190509392505050565b600061380f82612ec7565b915061381b8284612cdc565b915061382682612fdf565b915081905092915050565b600061383c82612f0d565b91506138488287612cdc565b91506138538261334c565b915061385f8286612d0d565b915061386a826134f0565b91506138768285612d0d565b9150613881826133b5565b915061388d8284612d0d565b915061389882612daf565b915081905095945050505050565b60006138b182612f99565b91506138bd8285612cdc565b91506138c882613160565b91506138d48284612cdc565b91506138df82613183565b91508190509392505050565b60006138f682613002565b91506139028284612cdc565b915061390d826131ee565b915081905092915050565b600061392382613048565b915061392f8284612cdc565b915061393a82612e5e565b915081905092915050565b60006139508261311a565b915061395c8285612cdc565b915061396782612e81565b91506139738284612cdc565b915061397e8261313d565b91508190509392505050565b600061399582613211565b91506139a18286612cdc565b91506139ac8261341e565b91506139b88285612cdc565b91506139c38261306b565b91506139cf8284612cdc565b91506139da826131cb565b9150819050949350505050565b60006139f28261327a565b91506139fe8287612cdc565b9150613a09826132e3565b9150613a158286612cdc565b9150613a2082613234565b9150613a2c8285612cdc565b9150613a3782612e3b565b9150613a4282613536565b9150613a4e8284612cdc565b9150613a5982613257565b915081905095945050505050565b6000613a7282613329565b9150613a7d82612ea4565b9150613a8882613306565b9150613a948285612cdc565b9150613a9f82612f76565b9150613aaa826134aa565b9150613ab582613306565b9150613ac18284612cdc565b9150613acc8261308e565b91508190509392505050565b6000613ae382613392565b9150613aef8284612cdc565b915081905092915050565b6000613b05826134cd565b9150613b118287612cdc565b9150613b1c82612eea565b9150613b288286612d0d565b9150613b33826134f0565b9150613b3f8285612d0d565b9150613b4a826133b5565b9150613b568284612d0d565b9150613b618261336f565b915081905095945050505050565b6000613b7a82613559565b9150613b85826131a6565b9150613b9082613464565b9150819050919050565b6000613ba58261357e565b9150613bb18285612cdc565b9150613bbc82613025565b9150613bc782612e18565b9150613bd38284612cdc565b9150613bde82613025565b91508190509392505050565b6000613bf58261362d565b9150613c018284612cdc565b915081905092915050565b6000602082019050613c216000830184612c4c565b92915050565b6000608082019050613c3c6000830187612c4c565b613c496020830186612c4c565b613c566040830185613650565b8181036060830152613c688184612c6a565b905095945050505050565b6000608082019050613c886000830186612c4c565b613c956020830185612c4c565b613ca26040830184613650565b8181036060830152613cb381613441565b9050949350505050565b6000602082019050613cd26000830184612c5b565b92915050565b60006020820190508181036000830152613cf28184612ca3565b905092915050565b60006020820190508181036000830152613d13816130b1565b9050919050565b60006020820190508181036000830152613d33816130d4565b9050919050565b60006020820190508181036000830152613d53816130f7565b9050919050565b60006020820190508181036000830152613d73816132c0565b9050919050565b60006020820190508181036000830152613d93816133d8565b9050919050565b60006020820190508181036000830152613db381613487565b9050919050565b60006020820190508181036000830152613dd381613513565b9050919050565b60006020820190508181036000830152613df3816135c4565b9050919050565b60006020820190508181036000830152613e13816135e7565b9050919050565b60006020820190508181036000830152613e338161360a565b9050919050565b6000602082019050613e4f6000830184613650565b92915050565b6000608082019050613e6a6000830187613650565b613e776020830186613650565b613e846040830185613650565b8181036060830152613e968184612ca3565b905095945050505050565b6000613eab613ebc565b9050613eb7828261417d565b919050565b6000604051905090565b600067ffffffffffffffff821115613ee157613ee06142b5565b5b613eea826142e4565b9050602081019050919050565b600067ffffffffffffffff821115613f1257613f116142b5565b5b613f1b826142e4565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f8b826140ff565b9150613f96836140ff565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613fcb57613fca614228565b5b828201905092915050565b6000613fe1826140ff565b9150613fec836140ff565b925082613ffc57613ffb614257565b5b828204905092915050565b6000614012826140ff565b915061401d836140ff565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561405657614055614228565b5b828202905092915050565b600061406c826140ff565b9150614077836140ff565b92508282101561408a57614089614228565b5b828203905092915050565b60006140a0826140df565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561413657808201518184015260208101905061411b565b83811115614145576000848401525b50505050565b6000600282049050600182168061416357607f821691505b6020821081141561417757614176614286565b5b50919050565b614186826142e4565b810181811067ffffffffffffffff821117156141a5576141a46142b5565b5b80604052505050565b60006141b9826140ff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141ec576141eb614228565b5b600182019050919050565b6000614202826140ff565b915061420d836140ff565b92508261421d5761421c614257565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f3c74657874207472616e73666f726d3d276d617472697828312030203020312060008201527f3130203136312e3538353929272066696c6c3d27233134313431342720666f6e60208201527f742d66616d696c793d27436f75726965722c206d6f6e6f73706163652720666f60408201527f6e742d73697a653d273234273e00000000000000000000000000000000000000606082015250565b7f3b73746f702d6f7061636974793a30272f3e3c2f6c696e65617247726164696560008201527f6e743e203c7265637420793d27313630272066696c6c3d2775726c282353564760208201527f49445f315f29272077696474683d2733363027206865696768743d273438302760408201527f2f3e000000000000000000000000000000000000000000000000000000000000606082015250565b7f3c2f747370616e3e3c2f746578743e0000000000000000000000000000000000600082015250565b7f3c74657874207472616e73666f726d3d276d617472697828312030203020312060008201527f3130203637312e3538353929273e3c747370616e20783d27302720793d27302760208201527f2066696c6c3d27233134313431342720666f6e742d66616d696c793d27436f7560408201527f726965722c206d6f6e6f73706163652720666f6e742d73697a653d273234273e606082015250565b7f3c74657874207472616e73666f726d3d276d617472697828312030203020312060008201527f3339302000000000000000000000000000000000000000000000000000000000602082015250565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b7f253c2f746578743e000000000000000000000000000000000000000000000000600082015250565b7f2c313030252c0000000000000000000000000000000000000000000000000000600082015250565b7f7b2274726169745f74797065223a2256656e7565222c00000000000000000000600082015250565b7f3c74657874207472616e73666f726d3d276d617472697828312030203020312060008201527f323439203230352e3333363429272066696c6c3d27233134313431342720666f60208201527f6e742d66616d696c793d27436f75726965722c206d6f6e6f737061636527206660408201527f6f6e742d73697a653d273234273e000000000000000000000000000000000000606082015250565b7f272079323d27343030273e3c73746f7020206f66667365743d2730272073747960008201527f6c653d2773746f702d636f6c6f723a0000000000000000000000000000000000602082015250565b7f3c6c696e6561724772616469656e742069643d2753564749445f315f2720677260008201527f616469656e74556e6974733d277573657253706163654f6e557365272078313d60208201527f273138302e30303035272079313d270000000000000000000000000000000000604082015250565b7f3c70617468206f7061636974793d27302e3235272066696c6c3d276e6f6e652760008201527f207374726f6b653d272345424542454227207374726f6b652d77696474683d2760208201527f3227207374726f6b652d6d697465726c696d69743d2731302720643d274d333060408201527f302c32323076333630204d3234302c32323076333630204d3138302c3232307660608201527f333630204d3132302c32323076333630204d36302c32323076333630204d333660808201527f302c3532304830204d3336302c3436304830204d3336302c3430304830204d3360a08201527f36302c3334304830204d3336302c3238304830272f3e0000000000000000000060c082015250565b7f2c00000000000000000000000000000000000000000000000000000000000000600082015250565b7f227d2c0000000000000000000000000000000000000000000000000000000000600082015250565b7f3c74657874207472616e73666f726d3d276d6174726978283120302030203120600082015250565b7f3c2f747370616e3e3c747370616e20783d27302720793d273230272066696c6c60008201527f3d27233134313431342720666f6e742d66616d696c793d27436f75726965722760208201527f20666f6e742d73697a653d273234273e00000000000000000000000000000000604082015250565b7f433c2f746578743e000000000000000000000000000000000000000000000000600082015250565b7f3c74657874207472616e73666f726d3d276d617472697828312030203020312060008201527f3431322e3339303620383029272066696c6c3d27233134313431342720666f6e60208201527f742d66616d696c793d27436f75726965722c206d6f6e6f73706163652720666f60408201527f6e742d73697a653d273234273e00000000000000000000000000000000000000606082015250565b7f29272066696c6c3d27234542454245422720666f6e742d66616d696c793d274360008201527f6f75726965722c206d6f6e6f73706163652720666f6e742d73697a653d27343960208201527f273e5f3c2f746578743e00000000000000000000000000000000000000000000604082015250565b7f3c74657874207472616e73666f726d3d276d617472697828312030203020312060008201527f39203230352e3333353929272066696c6c3d27233134313431342720666f6e7460208201527f2d66616d696c793d27436f75726965722c206d6f6e6f73706163652720666f6e60408201527f742d73697a653d273234273e0000000000000000000000000000000000000000606082015250565b7f3b73746f702d6f7061636974793a30272f3e203c73746f7020206f666673657460008201527f3d273127207374796c653d2773746f702d636f6c6f723a000000000000000000602082015250565b7f227d5d0000000000000000000000000000000000000000000000000000000000600082015250565b7f6d696e74696e672063616e206f6e6c792062652063616c6c65642066726f6d2060008201527f766572696669636174696f6e20636f6e74726163740000000000000000000000602082015250565b7f494e56414c49445f524543495049454e54000000000000000000000000000000600082015250565b7f6f6e6c792061646d696e2063616e2073657420766572696669636174696f6e6360008201527f6f6e747261637400000000000000000000000000000000000000000000000000602082015250565b7f68736c2800000000000000000000000000000000000000000000000000000000600082015250565b7f2529000000000000000000000000000000000000000000000000000000000000600082015250565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b7f29272066696c6c3d27234542454245422720666f6e742d66616d696c793d274360008201527f6f75726965722c206d6f6e6f73706163652720666f6e742d73697a653d27343060208201527f273e2b3c2f746578743e00000000000000000000000000000000000000000000604082015250565b7f3c70617468206f7061636974793d27302e3235272066696c6c3d276e6f6e652760008201527f207374726f6b653d272345424542454227207374726f6b652d77696474683d2760208201527f3227207374726f6b652d6d697465726c696d69743d2731302720643d274d333060408201527f302c32323076333630204d3234302c32323076333630204d3138302c3232302060608201527f76333630204d3132302c32323076333630204d36302c32323076333630204d3360808201527f36302c3532304830204d3336302c3436304830204d3336302c3430304830204d60a08201527f3336302c3334304830204d3336302c3238304830272f3e3c7265637420783d2760c08201527f3336302720793d2732363027206f7061636974793d27302e3235272066696c6c60e08201527f3d2723454245424542272077696474683d27333027206865696768743d2731326101008201527f30272f3e3c7265637420783d273339302720793d2732343027206f70616369746101208201527f793d27302e3235272066696c6c3d2723454245424542272077696474683d27336101408201527f3027206865696768743d27313630272f3e00000000000000000000000000000061016082015250565b7f272f3e203c2f6c696e6561724772616469656e743e203c7265637420793d273260008201527f3230272066696c6c3d2775726c282353564749445f335f29272077696474683d60208201527f273336302e30303127206865696768743d27333630272f3e0000000000000000604082015250565b7f3c2f746578743e00000000000000000000000000000000000000000000000000600082015250565b7f3c6c696e6561724772616469656e742069643d2753564749445f335f2720677260008201527f616469656e74556e6974733d277573657253706163654f6e557365272078313d60208201527f273232302e30323235272079313d273332392e34343533272078323d27000000604082015250565b7f222c2022696d616765223a202200000000000000000000000000000000000000600082015250565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f646174613a746578742f706c61696e2c7b226e616d65223a2200000000000000600082015250565b7f3c2f737667203e00000000000000000000000000000000000000000000000000600082015250565b7f554e534146455f524543495049454e5400000000000000000000000000000000600082015250565b7f222c20226465736372697074696f6e223a220000000000000000000000000000600082015250565b7f2276616c7565223a220000000000000000000000000000000000000000000000600082015250565b7f5b00000000000000000000000000000000000000000000000000000000000000600082015250565b7f272078323d273138302e30303035272079323d273136302e30303035273e203c60008201527f73746f7020206f66667365743d273027207374796c653d2773746f702d636f6c60208201527f6f723a0000000000000000000000000000000000000000000000000000000000604082015250565b7f3b73746f702d6f7061636974793a30272f3e3c2f6c696e65617247726164696560008201527f6e743e203c7265637420793d27313630272066696c6c3d2775726c282353564760208201527f49445f325f29272077696474683d2733363027206865696768743d273438302760408201527f2f3e000000000000000000000000000000000000000000000000000000000000606082015250565b7f4365727469666963617465206f662047726f7774682000000000000000000000600082015250565b7f272f3e203c73746f7020206f66667365743d273127207374796c653d2773746f60008201527f702d636f6c6f723a000000000000000000000000000000000000000000000000602082015250565b7f6e6f20766572696669636174696f6e20636f6e74726163742073657400000000600082015250565b7f3c706174682066696c6c3d27234542454245422720643d274d302c353830763160008201527f3630683438305635383048307a272f3e203c706174682066696c6c3d2723454260208201527f454245422720643d274d302c307632323068343830563048307a272f3e000000604082015250565b7f272079323d273231392e34343527206772616469656e745472616e73666f726d60008201527f3d276d617472697828332e362030203020332e36202d3638342e30373632202d60208201527f36303629273e203c73746f7020206f66667365743d273027207374796c653d2760408201527f73746f702d636f6c6f723a000000000000000000000000000000000000000000606082015250565b50565b7f3c7265637420783d273336302720793d273232302e313139272066696c6c3d2760008201527f75726c282353564749445f355f29272077696474683d2733302720686569676860208201527f743d273335392e383831272f3e00000000000000000000000000000000000000604082015250565b7f6f6e6c792061646d696e2063616e2073657420636f6c6f7270726f66696c6500600082015250565b7f7b2274726169745f74797065223a2243757261746f72222c0000000000000000600082015250565b7f3c6c696e6561724772616469656e742069643d2753564749445f325f2720677260008201527f616469656e74556e6974733d277573657253706163654f6e557365272078313d60208201527f2730272079313d27343030272078323d27000000000000000000000000000000604082015250565b7f3b73746f702d6f7061636974793a30272f3e3c73746f7020206f66667365743d60008201527f27302e3527207374796c653d2773746f702d636f6c6f723a0000000000000000602082015250565b7f6f6e6c792061646d696e2063616e207365742061646d696e0000000000000000600082015250565b7f2261747472696275746573223a20000000000000000000000000000000000000600082015250565b7f3c6c696e6561724772616469656e742069643d2753564749445f345f2720677260008201527f616469656e74556e6974733d277573657253706163654f6e557365272078313d60208201527f27343035272079313d27353830272078323d27343035272079323d273232302e60408201527f31313931273e203c73746f7020206f66667365743d273027207374796c653d2760608201527f73746f702d636f6c6f723a23303046463030272f3e203c73746f7020206f666660808201527f7365743d273127207374796c653d2773746f702d636f6c6f723a23433230303060a08201527f42272f3e203c2f6c696e6561724772616469656e743e203c7265637420783d2760c08201527f3339302720793d273232302e313139272066696c6c3d2775726c28235356474960e08201527f445f345f29272077696474683d27333027206865696768743d273335392e38386101008201527f31272f3e3c6c696e6561724772616469656e742069643d2753564749445f355f6101208201527f27206772616469656e74556e6974733d277573657253706163654f6e557365276101408201527f2078313d27333735272079313d27353830272078323d27333735272079323d276101608201527f3232302e31313931273e203c73746f7020206f66667365743d273027207374796101808201527f6c653d2773746f702d636f6c6f723a23313431343134272f3e203c73746f70206101a08201527f206f66667365743d273127207374796c653d2773746f702d636f6c6f723a23306101c08201527f3041304336272f3e203c2f6c696e6561724772616469656e743e0000000000006101e082015250565b7f3c74657874207472616e73666f726d3d276d617472697828312030203020312060008201527f3336302000000000000000000000000000000000000000000000000000000000602082015250565b7f3c74657874207472616e73666f726d3d276d617472697828312030203020312060008201527f3130203632352e3333353929272066696c6c3d27233134313431342720666f6e60208201527f742d66616d696c793d27436f75726965722c206d6f6e6f73706163652720666f60408201527f6e742d73697a653d273234273e00000000000000000000000000000000000000606082015250565b7f414c52454144595f4d494e544544000000000000000000000000000000000000600082015250565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b7f57524f4e475f46524f4d00000000000000000000000000000000000000000000600082015250565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000600082015250565b615a0e81614095565b8114615a1957600080fd5b50565b615a25816140a7565b8114615a3057600080fd5b50565b615a3c816140b3565b8114615a4757600080fd5b50565b615a53816140ff565b8114615a5e57600080fd5b5056fe3c74657874207472616e73666f726d3d276d61747269782831203020302031203130203138352e32303631292720666f6e742d66616d696c793d27417269616c2720666f6e742d73697a653d273136273e536f696c204d6f6973747572652028782d61786973293c2f746578743e3c74657874207472616e73666f726d3d276d61747269782831203020302031203130203134312e34353631292720666f6e742d66616d696c793d27417269616c2720666f6e742d73697a653d273136273e54696d653c2f746578743e3c74657874207472616e73666f726d3d276d61747269782831203020302031203130203630352e32303631292720666f6e742d66616d696c793d27417269616c2720666f6e742d73697a653d273136273e506c616e743c2f746578743e3c74657874207472616e73666f726d3d276d61747269782831203020302031203130203635312e34353631292720666f6e742d66616d696c793d27417269616c2720666f6e742d73697a653d273136273e4c6f636174696f6e3c2f746578743e3c74657874207472616e73666f726d3d276d6174726978283120302030203120323530203138352e32303631292720666f6e742d66616d696c793d27417269616c2720666f6e742d73697a653d273136273e54656d70657261747572652028792d61786973293c2f746578743e3c74657874207472616e73666f726d3d276d61747269782831203020302031203432372e30303239203234312e3435353629272066696c6c3d27234542454245422720666f6e742d66616d696c793d27417269616c2720666f6e742d73697a653d273136273e7465727261303c2f746578743e3c74657874207472616e73666f726d3d276d6174726978283120302030203120392038302e3733343929272066696c6c3d27233134313431342720666f6e742d66616d696c793d2754696d65732d526f6d616e2c2054696d65732720666f6e742d73697a653d273435273e4365727469666963617465206f662047726f777468203c2f746578743e53656564204361706974616c202d20436572746966696361746573206f662047726f7774684142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122015d04fb23ceba143263e5f5ab7602b7d817623b9d0b78ab070431b2ccb029bf464736f6c634300080400333c3f786d6c2076657273696f6e3d27312e302720656e636f64696e673d275554462d38273f3e3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f7376672720786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b2720783d273070782720793d27307078272077696474683d27343830707827206865696768743d273734307078272076696577426f783d2730203020343830203734302720656e61626c652d6261636b67726f756e643d276e65772030203020343830203734302720786d6c3a73706163653d277072657365727665273e3c7265637420793d27313430272066696c6c3d2723313431343134272077696474683d2734383027206865696768743d27353030272f3e000000000000000000000000b47494b3d487b82b78af230c8460a12272389755

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c806370a08231116100de578063b88d4fde11610097578063dded49cb11610071578063dded49cb146104a7578063e4939f9d146104c3578063e985e9c5146104e1578063f851a4401461051157610173565b8063b88d4fde1461042b578063c6643c9b14610447578063c87b56dd1461047757610173565b806370a082311461033157806374cfa50a14610361578063864f98b11461039157806395d89b41146103c1578063a22cb465146103df578063b0703efd146103fb57610173565b806323b872dd1161013057806323b872dd1461025e5780633bf717761461027a57806342842e0e14610296578063507d7f42146102b257806357c8081b146102ce5780636352211e1461030157610173565b806301ffc9a71461017857806306fdde03146101a8578063081812fc146101c6578063095ea7b3146101f6578063128c5b5614610212578063131a4ad414610242575b600080fd5b610192600480360381019061018d919061293b565b61052f565b60405161019f9190613cbd565b60405180910390f35b6101b06105c1565b6040516101bd9190613cd8565b60405180910390f35b6101e060048036038101906101db919061298d565b61064f565b6040516101ed9190613c0c565b60405180910390f35b610210600480360381019061020b91906128ff565b610682565b005b61022c6004803603810190610227919061298d565b61086b565b6040516102399190613cd8565b60405180910390f35b61025c600480360381019061025791906129b6565b6108da565b005b610278600480360381019061027391906127f9565b610980565b005b610294600480360381019061028f9190612b46565b610d80565b005b6102b060048036038101906102ab91906127f9565b610f2f565b005b6102cc60048036038101906102c79190612794565b611076565b005b6102e860048036038101906102e3919061298d565b61114a565b6040516102f89493929190613e55565b60405180910390f35b61031b6004803603810190610316919061298d565b611202565b6040516103289190613c0c565b60405180910390f35b61034b60048036038101906103469190612794565b611235565b6040516103589190613e3a565b60405180910390f35b61037b60048036038101906103769190612b46565b61124d565b6040516103889190613cd8565b60405180910390f35b6103ab60048036038101906103a69190612ab7565b611409565b6040516103b89190613cd8565b60405180910390f35b6103c961144a565b6040516103d69190613cd8565b60405180910390f35b6103f960048036038101906103f491906128c3565b6114d8565b005b61041560048036038101906104109190612bd5565b6115d5565b6040516104229190613e3a565b60405180910390f35b61044560048036038101906104409190612848565b611656565b005b610461600480360381019061045c9190612ab7565b6117a0565b60405161046e9190613cd8565b60405180910390f35b610491600480360381019061048c919061298d565b611828565b60405161049e9190613cd8565b60405180910390f35b6104c160048036038101906104bc9190612794565b61191e565b005b6104cb6119f2565b6040516104d89190613c0c565b60405180910390f35b6104fb60048036038101906104f691906127bd565b611a18565b6040516105089190613cbd565b60405180910390f35b610519611a47565b6040516105269190613c0c565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061058a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105ba5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600080546105ce9061414b565b80601f01602080910402602001604051908101604052809291908181526020018280546105fa9061414b565b80156106475780601f1061061c57610100808354040283529160200191610647565b820191906000526020600020905b81548152906001019060200180831161062a57829003601f168201915b505050505081565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061077a5750600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6107b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b090613dfa565b60405180910390fd5b826004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60606108916103e8620186a08461088291906141f7565b61088c9190613fd6565b611a6d565b6108b3600a6103e8856108a491906141f7565b6108ae9190613fd6565b611a6d565b6040516020016108c49291906136e3565b6040516020818303038152906040529050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461096a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096190613d9a565b60405180910390fd5b610978868686868686611c1a565b505050505050565b6003600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1890613e1a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890613d1a565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b2957506004600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610bba5750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf090613dfa565b60405180910390fd5b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0790613cfa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9990613d7a565b60405180910390fd5b84600c60008481526020019081526020016000206000018190555083600c60008481526020019081526020016000206001018190555082600c60008481526020019081526020016000206002018190555080600c60008481526020019081526020016000206003019080519060200190610f1d9291906125b8565b50610f283283611cf9565b5050505050565b610f3a838383610980565b60008273ffffffffffffffffffffffffffffffffffffffff163b1480611032575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b8152600401610fbf93929190613c73565b602060405180830381600087803b158015610fd957600080fd5b505af1158015610fed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110119190612964565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b611071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106890613d5a565b60405180910390fd5b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fd90613d3a565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c60205280600052604060002060009150905080600001549080600101549080600201549080600301805461117f9061414b565b80601f01602080910402602001604051908101604052809291908181526020018280546111ab9061414b565b80156111f85780601f106111cd576101008083540402835291602001916111f8565b820191906000526020600020905b8154815290600101906020018083116111db57829003601f168201915b5050505050905084565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026020528060005260406000206000915090505481565b6060600061125a87611f0c565b90506000604051806060016040528060258152602001615d5160259139905060006113c160096000888152602001908152602001600020600201805461129f9061414b565b80601f01602080910402602001604051908101604052809291908181526020018280546112cb9061414b565b80156113185780601f106112ed57610100808354040283529160200191611318565b820191906000526020600020905b8154815290600101906020018083116112fb57829003601f168201915b505050505060096000898152602001908152602001600020600401805461133e9061414b565b80601f016020809104026020016040519081016040528092919081815260200182805461136a9061414b565b80156113b75780601f1061138c576101008083540402835291602001916113b7565b820191906000526020600020905b81548152906001019060200180831161139a57829003601f168201915b5050505050611f3d565b905060006113d2898989898e611409565b9050838382846040516020016113eb94939291906139e7565b60405160208183030381529060405294505050505095945050505050565b606061142061141b87878787876117a0565b611f69565b6040516020016114309190613bea565b604051602081830303815290604052905095945050505050565b600180546114579061414b565b80601f01602080910402602001604051908101604052809291908181526020018280546114839061414b565b80156114d05780601f106114a5576101008083540402835291602001916114d0565b820191906000526020600020905b8154815290600101906020018083116114b357829003601f168201915b505050505081565b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115c99190613cbd565b60405180910390a35050565b60008085856115e49190614061565b9050600084846115f49190614061565b90506000600854888a6116079190614061565b6116119190614007565b9050600083826116219190613fd6565b905060085483826116329190614007565b61163c9190613fd6565b876116479190613f80565b94505050505095945050505050565b611661848484610980565b60008373ffffffffffffffffffffffffffffffffffffffff163b148061175b575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b81526004016116e89493929190613c27565b602060405180830381600087803b15801561170257600080fd5b505af1158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a9190612964565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b61179a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179190613d5a565b60405180910390fd5b50505050565b6060600660076117ae612108565b6117b8888861212d565b6117c28a896121a4565b6117cc8a8c61221b565b6117d4612263565b6117e18d8d8d8d8d612286565b6117eb8e8e6122f2565b6117f58f8f61236f565b60405160200161180e9a99989796959493929190613712565b604051602081830303815290604052905095945050505050565b606061191782600c600085815260200190815260200160002060000154600c600086815260200190815260200160002060010154600c600087815260200190815260200160002060020154600c600088815260200190815260200160002060030180546118949061414b565b80601f01602080910402602001604051908101604052809291908181526020018280546118c09061414b565b801561190d5780601f106118e25761010080835404028352916020019161190d565b820191906000526020600020905b8154815290600101906020018083116118f057829003601f168201915b505050505061124d565b9050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a590613dba565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000821415611ab5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611c15565b600082905060005b60008214611ae7578080611ad0906141ae565b915050600a82611ae09190613fd6565b9150611abd565b60008167ffffffffffffffff811115611b29577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611b5b5781602001600182028036833780820191505090505b5090505b60008514611c0e57600182611b749190614061565b9150600a85611b8391906141f7565b6030611b8f9190613f80565b60f81b818381518110611bcb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611c079190613fd6565b9450611b5f565b8093505050505b919050565b84600960008881526020019081526020016000206000019080519060200190611c449291906125b8565b5083600960008881526020019081526020016000206001019080519060200190611c6f9291906125b8565b5082600960008881526020019081526020016000206002019080519060200190611c9a9291906125b8565b5081600960008881526020019081526020016000206003019080519060200190611cc59291906125b8565b5080600960008881526020019081526020016000206004019080519060200190611cf09291906125b8565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6090613d1a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0290613dda565b60405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6060611f1782611a6d565b604051602001611f279190613ad8565b6040516020818303038152906040529050919050565b60608282604051602001611f52929190613a67565b604051602081830303815290604052905092915050565b6060600082511415611f8c57604051806020016040528060008152509050612103565b6000604051806060016040528060408152602001615d766040913990506000600360028551611fbb9190613f80565b611fc59190613fd6565b6004611fd19190614007565b90506000602082611fe29190613f80565b67ffffffffffffffff811115612021577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120535781602001600182028036833780820191505090505b509050818152600183018586518101602084015b818310156120c2576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825360018201915050612067565b6003895106600181146120dc57600281146120ec576120f7565b613d3d60f01b60028303526120f7565b603d60f81b60018303525b50505050508093505050505b919050565b606060405160200161211990613b6f565b604051602081830303815290604052905090565b6060612138836123ed565b60096000848152602001908152602001600020600101600960008581526020019081526020016000206001016009600086815260200190815260200160002060010160405160200161218d9493929190613831565b604051602081830303815290604052905092915050565b60606121af83612413565b6009600084815260200190815260200160002060000160096000858152602001908152602001600020600001600960008681526020019081526020016000206000016040516020016122049493929190613afa565b604051602081830303815290604052905092915050565b60606122268261243a565b6122308484612461565b61223a8585612461565b60405160200161224c9392919061398a565b604051602081830303815290604052905092915050565b60606040518061032001604052806102ef8152602001615a626102ef9139905090565b6060612291856124d0565b61229a87612501565b6122a386612532565b600960008881526020019081526020016000206003016122c286612587565b876040516020016122d89695949392919061365f565b604051602081830303815290604052905095945050505050565b606061231261230d846201117062013880600061014f6115d5565b611a6d565b61234760f561232b85614a386159d860f56102446115d5565b6123359190614061565b6102446123429190614061565b611a6d565b6040516020016123589291906138a6565b604051602081830303815290604052905092915050565b606061239c61238a84620111706201388060fa6101866115d5565b61028a6123979190614061565b611a6d565b6123c56123b384614a386159d860fa6101866115d5565b61028a6123c09190614061565b611a6d565b6040516020016123d6929190613b9a565b604051602081830303815290604052905092915050565b606061240c61240783614a386159d861012c6103e86115d5565b611a6d565b9050919050565b606061243361242e83620111706201388060326102bc6115d5565b611a6d565b9050919050565b606061245a61245583620111706201388060646101f46115d5565b611a6d565b9050919050565b6060600061248361247e84620111706201388060006101686115d5565b611a6d565b905060006124a261249d86614a386159d8603260646115d5565b611a6d565b905081816040516020016124b7929190613945565b6040516020818303038152906040529250505092915050565b60606124db8261086b565b6040516020016124eb9190613804565b6040516020818303038152906040529050919050565b606061250c8261086b565b60405160200161251c9190613918565b6040516020818303038152906040529050919050565b606060096000838152602001908152602001600020600201600960008481526020019081526020016000206004016040516020016125719291906137bf565b6040516020818303038152906040529050919050565b606061259282611a6d565b6040516020016125a291906138eb565b6040516020818303038152906040529050919050565b8280546125c49061414b565b90600052602060002090601f0160209004810192826125e6576000855561262d565b82601f106125ff57805160ff191683800117855561262d565b8280016001018555821561262d579182015b8281111561262c578251825591602001919060010190612611565b5b50905061263a919061263e565b5090565b5b8082111561265757600081600090555060010161263f565b5090565b600061266e61266984613ec6565b613ea1565b90508281526020810184848401111561268657600080fd5b612691848285614109565b509392505050565b60006126ac6126a784613ef7565b613ea1565b9050828152602081018484840111156126c457600080fd5b6126cf848285614109565b509392505050565b6000813590506126e681615a05565b92915050565b6000813590506126fb81615a1c565b92915050565b60008135905061271081615a33565b92915050565b60008151905061272581615a33565b92915050565b600082601f83011261273c57600080fd5b813561274c84826020860161265b565b91505092915050565b600082601f83011261276657600080fd5b8135612776848260208601612699565b91505092915050565b60008135905061278e81615a4a565b92915050565b6000602082840312156127a657600080fd5b60006127b4848285016126d7565b91505092915050565b600080604083850312156127d057600080fd5b60006127de858286016126d7565b92505060206127ef858286016126d7565b9150509250929050565b60008060006060848603121561280e57600080fd5b600061281c868287016126d7565b935050602061282d868287016126d7565b925050604061283e8682870161277f565b9150509250925092565b6000806000806080858703121561285e57600080fd5b600061286c878288016126d7565b945050602061287d878288016126d7565b935050604061288e8782880161277f565b925050606085013567ffffffffffffffff8111156128ab57600080fd5b6128b78782880161272b565b91505092959194509250565b600080604083850312156128d657600080fd5b60006128e4858286016126d7565b92505060206128f5858286016126ec565b9150509250929050565b6000806040838503121561291257600080fd5b6000612920858286016126d7565b92505060206129318582860161277f565b9150509250929050565b60006020828403121561294d57600080fd5b600061295b84828501612701565b91505092915050565b60006020828403121561297657600080fd5b600061298484828501612716565b91505092915050565b60006020828403121561299f57600080fd5b60006129ad8482850161277f565b91505092915050565b60008060008060008060c087890312156129cf57600080fd5b60006129dd89828a0161277f565b965050602087013567ffffffffffffffff8111156129fa57600080fd5b612a0689828a01612755565b955050604087013567ffffffffffffffff811115612a2357600080fd5b612a2f89828a01612755565b945050606087013567ffffffffffffffff811115612a4c57600080fd5b612a5889828a01612755565b935050608087013567ffffffffffffffff811115612a7557600080fd5b612a8189828a01612755565b92505060a087013567ffffffffffffffff811115612a9e57600080fd5b612aaa89828a01612755565b9150509295509295509295565b600080600080600060a08688031215612acf57600080fd5b6000612add8882890161277f565b9550506020612aee8882890161277f565b9450506040612aff8882890161277f565b935050606086013567ffffffffffffffff811115612b1c57600080fd5b612b2888828901612755565b9250506080612b398882890161277f565b9150509295509295909350565b600080600080600060a08688031215612b5e57600080fd5b6000612b6c8882890161277f565b9550506020612b7d8882890161277f565b9450506040612b8e8882890161277f565b9350506060612b9f8882890161277f565b925050608086013567ffffffffffffffff811115612bbc57600080fd5b612bc888828901612755565b9150509295509295909350565b600080600080600060a08688031215612bed57600080fd5b6000612bfb8882890161277f565b9550506020612c0c8882890161277f565b9450506040612c1d8882890161277f565b9350506060612c2e8882890161277f565b9250506080612c3f8882890161277f565b9150509295509295909350565b612c5581614095565b82525050565b612c64816140a7565b82525050565b6000612c7582613f3d565b612c7f8185613f53565b9350612c8f818560208601614118565b612c98816142e4565b840191505092915050565b6000612cae82613f48565b612cb88185613f64565b9350612cc8818560208601614118565b612cd1816142e4565b840191505092915050565b6000612ce782613f48565b612cf18185613f75565b9350612d01818560208601614118565b80840191505092915050565b60008154612d1a8161414b565b612d248186613f75565b94506001821660008114612d3f5760018114612d5057612d83565b60ff19831686528186019350612d83565b612d5985613f28565b60005b83811015612d7b57815481890152600182019150602081019050612d5c565b838801955050505b50505092915050565b6000612d99606d83613f75565b9150612da4826142f5565b606d82019050919050565b6000612dbc606283613f75565b9150612dc782614390565b606282019050919050565b6000612ddf600f83613f75565b9150612dea8261442b565b600f82019050919050565b6000612e02608083613f75565b9150612e0d82614454565b608082019050919050565b6000612e25602483613f75565b9150612e30826144ef565b602482019050919050565b6000612e48600283613f75565b9150612e538261453e565b600282019050919050565b6000612e6b600883613f75565b9150612e7682614567565b600882019050919050565b6000612e8e600683613f75565b9150612e9982614590565b600682019050919050565b6000612eb1601683613f75565b9150612ebc826145b9565b601682019050919050565b6000612ed4606e83613f75565b9150612edf826145e2565b606e82019050919050565b6000612ef7602f83613f75565b9150612f028261467d565b602f82019050919050565b6000612f1a604f83613f75565b9150612f25826146cc565b604f82019050919050565b6000612f3d60d683613f75565b9150612f4882614741565b60d682019050919050565b6000612f60600183613f75565b9150612f6b8261484e565b600182019050919050565b6000612f83600383613f75565b9150612f8e82614877565b600382019050919050565b6000612fa6602083613f75565b9150612fb1826148a0565b602082019050919050565b6000612fc9605083613f75565b9150612fd4826148c9565b605082019050919050565b6000612fec600883613f75565b9150612ff78261493e565b600882019050919050565b600061300f606d83613f75565b915061301a82614967565b606d82019050919050565b6000613032604a83613f75565b915061303d82614a02565b604a82019050919050565b6000613055606c83613f75565b915061306082614a77565b606c82019050919050565b6000613078603783613f75565b915061308382614b12565b603782019050919050565b600061309b600383613f75565b91506130a682614b61565b600382019050919050565b60006130be603583613f64565b91506130c982614b8a565b604082019050919050565b60006130e1601183613f64565b91506130ec82614bd9565b602082019050919050565b6000613104602783613f64565b915061310f82614c02565b604082019050919050565b6000613127600483613f75565b915061313282614c51565b600482019050919050565b600061314a600283613f75565b915061315582614c7a565b600282019050919050565b600061316d600183613f75565b915061317882614ca3565b600182019050919050565b6000613190604a83613f75565b915061319b82614ccc565b604a82019050919050565b60006131b461017183613f75565b91506131bf82614d41565b61017182019050919050565b60006131d8605883613f75565b91506131e382614f10565b605882019050919050565b60006131fb600783613f75565b915061320682614f85565b600782019050919050565b600061321e605d83613f75565b915061322982614fae565b605d82019050919050565b6000613241600d83613f75565b915061324c82615023565b600d82019050919050565b6000613264600183613f75565b915061326f8261504c565b600182019050919050565b6000613287601983613f75565b915061329282615075565b601982019050919050565b60006132aa600783613f75565b91506132b58261509e565b600782019050919050565b60006132cd601083613f64565b91506132d8826150c7565b602082019050919050565b60006132f0601283613f75565b91506132fb826150f0565b601282019050919050565b6000613313600983613f75565b915061331e82615119565b600982019050919050565b6000613336600183613f75565b915061334182615142565b600182019050919050565b6000613359604383613f75565b91506133648261516b565b604382019050919050565b600061337c606283613f75565b9150613387826151e0565b606282019050919050565b600061339f601683613f75565b91506133aa8261527b565b601682019050919050565b60006133c2602883613f75565b91506133cd826152a4565b602882019050919050565b60006133e5601c83613f64565b91506133f0826152f3565b602082019050919050565b6000613408605d83613f75565b91506134138261531c565b605d82019050919050565b600061342b606b83613f75565b915061343682615391565b606b82019050919050565b600061344e600083613f53565b91506134598261542c565b600082019050919050565b6000613471604d83613f75565b915061347c8261542f565b604d82019050919050565b6000613494601f83613f64565b915061349f826154a4565b602082019050919050565b60006134b7601883613f75565b91506134c2826154cd565b601882019050919050565b60006134da605183613f75565b91506134e5826154f6565b605182019050919050565b60006134fd603883613f75565b91506135088261556b565b603882019050919050565b6000613520601883613f64565b915061352b826155ba565b602082019050919050565b6000613543600e83613f75565b915061354e826155e3565b600e82019050919050565b60006135676101fa83613f75565b91506135728261560c565b6101fa82019050919050565b600061358b602483613f75565b915061359682615877565b602482019050919050565b60006135ae606d83613f75565b91506135b9826158c6565b606d82019050919050565b60006135d1600e83613f64565b91506135dc82615961565b602082019050919050565b60006135f4600e83613f64565b91506135ff8261598a565b602082019050919050565b6000613617600a83613f64565b9150613622826159b3565b602082019050919050565b600061363a601a83613f75565b9150613645826159dc565b601a82019050919050565b613659816140ff565b82525050565b600061366b8289612cdc565b91506136778288612cdc565b91506136838287612cdc565b915061368e826135a1565b915061369a8286612d0d565b91506136a5826131ee565b91506136b18285612cdc565b91506136bc82612d8c565b91506136c88284612cdc565b91506136d3826131ee565b9150819050979650505050505050565b60006136ef8285612cdc565b91506136fa82612f53565b91506137068284612cdc565b91508190509392505050565b600061371e828d612d0d565b915061372a828c612d0d565b9150613736828b612cdc565b9150613742828a612cdc565b915061374e8289612cdc565b915061375a8288612cdc565b9150613765826133fb565b915061377082612f30565b915061377c8287612cdc565b91506137888286612cdc565b91506137948285612cdc565b91506137a08284612cdc565b91506137ab8261329d565b91508190509b9a5050505050505050505050565b60006137ca82612df5565b91506137d68285612d0d565b91506137e182612fbc565b91506137ed8284612d0d565b91506137f882612dd2565b91508190509392505050565b600061380f82612ec7565b915061381b8284612cdc565b915061382682612fdf565b915081905092915050565b600061383c82612f0d565b91506138488287612cdc565b91506138538261334c565b915061385f8286612d0d565b915061386a826134f0565b91506138768285612d0d565b9150613881826133b5565b915061388d8284612d0d565b915061389882612daf565b915081905095945050505050565b60006138b182612f99565b91506138bd8285612cdc565b91506138c882613160565b91506138d48284612cdc565b91506138df82613183565b91508190509392505050565b60006138f682613002565b91506139028284612cdc565b915061390d826131ee565b915081905092915050565b600061392382613048565b915061392f8284612cdc565b915061393a82612e5e565b915081905092915050565b60006139508261311a565b915061395c8285612cdc565b915061396782612e81565b91506139738284612cdc565b915061397e8261313d565b91508190509392505050565b600061399582613211565b91506139a18286612cdc565b91506139ac8261341e565b91506139b88285612cdc565b91506139c38261306b565b91506139cf8284612cdc565b91506139da826131cb565b9150819050949350505050565b60006139f28261327a565b91506139fe8287612cdc565b9150613a09826132e3565b9150613a158286612cdc565b9150613a2082613234565b9150613a2c8285612cdc565b9150613a3782612e3b565b9150613a4282613536565b9150613a4e8284612cdc565b9150613a5982613257565b915081905095945050505050565b6000613a7282613329565b9150613a7d82612ea4565b9150613a8882613306565b9150613a948285612cdc565b9150613a9f82612f76565b9150613aaa826134aa565b9150613ab582613306565b9150613ac18284612cdc565b9150613acc8261308e565b91508190509392505050565b6000613ae382613392565b9150613aef8284612cdc565b915081905092915050565b6000613b05826134cd565b9150613b118287612cdc565b9150613b1c82612eea565b9150613b288286612d0d565b9150613b33826134f0565b9150613b3f8285612d0d565b9150613b4a826133b5565b9150613b568284612d0d565b9150613b618261336f565b915081905095945050505050565b6000613b7a82613559565b9150613b85826131a6565b9150613b9082613464565b9150819050919050565b6000613ba58261357e565b9150613bb18285612cdc565b9150613bbc82613025565b9150613bc782612e18565b9150613bd38284612cdc565b9150613bde82613025565b91508190509392505050565b6000613bf58261362d565b9150613c018284612cdc565b915081905092915050565b6000602082019050613c216000830184612c4c565b92915050565b6000608082019050613c3c6000830187612c4c565b613c496020830186612c4c565b613c566040830185613650565b8181036060830152613c688184612c6a565b905095945050505050565b6000608082019050613c886000830186612c4c565b613c956020830185612c4c565b613ca26040830184613650565b8181036060830152613cb381613441565b9050949350505050565b6000602082019050613cd26000830184612c5b565b92915050565b60006020820190508181036000830152613cf28184612ca3565b905092915050565b60006020820190508181036000830152613d13816130b1565b9050919050565b60006020820190508181036000830152613d33816130d4565b9050919050565b60006020820190508181036000830152613d53816130f7565b9050919050565b60006020820190508181036000830152613d73816132c0565b9050919050565b60006020820190508181036000830152613d93816133d8565b9050919050565b60006020820190508181036000830152613db381613487565b9050919050565b60006020820190508181036000830152613dd381613513565b9050919050565b60006020820190508181036000830152613df3816135c4565b9050919050565b60006020820190508181036000830152613e13816135e7565b9050919050565b60006020820190508181036000830152613e338161360a565b9050919050565b6000602082019050613e4f6000830184613650565b92915050565b6000608082019050613e6a6000830187613650565b613e776020830186613650565b613e846040830185613650565b8181036060830152613e968184612ca3565b905095945050505050565b6000613eab613ebc565b9050613eb7828261417d565b919050565b6000604051905090565b600067ffffffffffffffff821115613ee157613ee06142b5565b5b613eea826142e4565b9050602081019050919050565b600067ffffffffffffffff821115613f1257613f116142b5565b5b613f1b826142e4565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f8b826140ff565b9150613f96836140ff565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613fcb57613fca614228565b5b828201905092915050565b6000613fe1826140ff565b9150613fec836140ff565b925082613ffc57613ffb614257565b5b828204905092915050565b6000614012826140ff565b915061401d836140ff565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561405657614055614228565b5b828202905092915050565b600061406c826140ff565b9150614077836140ff565b92508282101561408a57614089614228565b5b828203905092915050565b60006140a0826140df565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561413657808201518184015260208101905061411b565b83811115614145576000848401525b50505050565b6000600282049050600182168061416357607f821691505b6020821081141561417757614176614286565b5b50919050565b614186826142e4565b810181811067ffffffffffffffff821117156141a5576141a46142b5565b5b80604052505050565b60006141b9826140ff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141ec576141eb614228565b5b600182019050919050565b6000614202826140ff565b915061420d836140ff565b92508261421d5761421c614257565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f3c74657874207472616e73666f726d3d276d617472697828312030203020312060008201527f3130203136312e3538353929272066696c6c3d27233134313431342720666f6e60208201527f742d66616d696c793d27436f75726965722c206d6f6e6f73706163652720666f60408201527f6e742d73697a653d273234273e00000000000000000000000000000000000000606082015250565b7f3b73746f702d6f7061636974793a30272f3e3c2f6c696e65617247726164696560008201527f6e743e203c7265637420793d27313630272066696c6c3d2775726c282353564760208201527f49445f315f29272077696474683d2733363027206865696768743d273438302760408201527f2f3e000000000000000000000000000000000000000000000000000000000000606082015250565b7f3c2f747370616e3e3c2f746578743e0000000000000000000000000000000000600082015250565b7f3c74657874207472616e73666f726d3d276d617472697828312030203020312060008201527f3130203637312e3538353929273e3c747370616e20783d27302720793d27302760208201527f2066696c6c3d27233134313431342720666f6e742d66616d696c793d27436f7560408201527f726965722c206d6f6e6f73706163652720666f6e742d73697a653d273234273e606082015250565b7f3c74657874207472616e73666f726d3d276d617472697828312030203020312060008201527f3339302000000000000000000000000000000000000000000000000000000000602082015250565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b7f253c2f746578743e000000000000000000000000000000000000000000000000600082015250565b7f2c313030252c0000000000000000000000000000000000000000000000000000600082015250565b7f7b2274726169745f74797065223a2256656e7565222c00000000000000000000600082015250565b7f3c74657874207472616e73666f726d3d276d617472697828312030203020312060008201527f323439203230352e3333363429272066696c6c3d27233134313431342720666f60208201527f6e742d66616d696c793d27436f75726965722c206d6f6e6f737061636527206660408201527f6f6e742d73697a653d273234273e000000000000000000000000000000000000606082015250565b7f272079323d27343030273e3c73746f7020206f66667365743d2730272073747960008201527f6c653d2773746f702d636f6c6f723a0000000000000000000000000000000000602082015250565b7f3c6c696e6561724772616469656e742069643d2753564749445f315f2720677260008201527f616469656e74556e6974733d277573657253706163654f6e557365272078313d60208201527f273138302e30303035272079313d270000000000000000000000000000000000604082015250565b7f3c70617468206f7061636974793d27302e3235272066696c6c3d276e6f6e652760008201527f207374726f6b653d272345424542454227207374726f6b652d77696474683d2760208201527f3227207374726f6b652d6d697465726c696d69743d2731302720643d274d333060408201527f302c32323076333630204d3234302c32323076333630204d3138302c3232307660608201527f333630204d3132302c32323076333630204d36302c32323076333630204d333660808201527f302c3532304830204d3336302c3436304830204d3336302c3430304830204d3360a08201527f36302c3334304830204d3336302c3238304830272f3e0000000000000000000060c082015250565b7f2c00000000000000000000000000000000000000000000000000000000000000600082015250565b7f227d2c0000000000000000000000000000000000000000000000000000000000600082015250565b7f3c74657874207472616e73666f726d3d276d6174726978283120302030203120600082015250565b7f3c2f747370616e3e3c747370616e20783d27302720793d273230272066696c6c60008201527f3d27233134313431342720666f6e742d66616d696c793d27436f75726965722760208201527f20666f6e742d73697a653d273234273e00000000000000000000000000000000604082015250565b7f433c2f746578743e000000000000000000000000000000000000000000000000600082015250565b7f3c74657874207472616e73666f726d3d276d617472697828312030203020312060008201527f3431322e3339303620383029272066696c6c3d27233134313431342720666f6e60208201527f742d66616d696c793d27436f75726965722c206d6f6e6f73706163652720666f60408201527f6e742d73697a653d273234273e00000000000000000000000000000000000000606082015250565b7f29272066696c6c3d27234542454245422720666f6e742d66616d696c793d274360008201527f6f75726965722c206d6f6e6f73706163652720666f6e742d73697a653d27343960208201527f273e5f3c2f746578743e00000000000000000000000000000000000000000000604082015250565b7f3c74657874207472616e73666f726d3d276d617472697828312030203020312060008201527f39203230352e3333353929272066696c6c3d27233134313431342720666f6e7460208201527f2d66616d696c793d27436f75726965722c206d6f6e6f73706163652720666f6e60408201527f742d73697a653d273234273e0000000000000000000000000000000000000000606082015250565b7f3b73746f702d6f7061636974793a30272f3e203c73746f7020206f666673657460008201527f3d273127207374796c653d2773746f702d636f6c6f723a000000000000000000602082015250565b7f227d5d0000000000000000000000000000000000000000000000000000000000600082015250565b7f6d696e74696e672063616e206f6e6c792062652063616c6c65642066726f6d2060008201527f766572696669636174696f6e20636f6e74726163740000000000000000000000602082015250565b7f494e56414c49445f524543495049454e54000000000000000000000000000000600082015250565b7f6f6e6c792061646d696e2063616e2073657420766572696669636174696f6e6360008201527f6f6e747261637400000000000000000000000000000000000000000000000000602082015250565b7f68736c2800000000000000000000000000000000000000000000000000000000600082015250565b7f2529000000000000000000000000000000000000000000000000000000000000600082015250565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b7f29272066696c6c3d27234542454245422720666f6e742d66616d696c793d274360008201527f6f75726965722c206d6f6e6f73706163652720666f6e742d73697a653d27343060208201527f273e2b3c2f746578743e00000000000000000000000000000000000000000000604082015250565b7f3c70617468206f7061636974793d27302e3235272066696c6c3d276e6f6e652760008201527f207374726f6b653d272345424542454227207374726f6b652d77696474683d2760208201527f3227207374726f6b652d6d697465726c696d69743d2731302720643d274d333060408201527f302c32323076333630204d3234302c32323076333630204d3138302c3232302060608201527f76333630204d3132302c32323076333630204d36302c32323076333630204d3360808201527f36302c3532304830204d3336302c3436304830204d3336302c3430304830204d60a08201527f3336302c3334304830204d3336302c3238304830272f3e3c7265637420783d2760c08201527f3336302720793d2732363027206f7061636974793d27302e3235272066696c6c60e08201527f3d2723454245424542272077696474683d27333027206865696768743d2731326101008201527f30272f3e3c7265637420783d273339302720793d2732343027206f70616369746101208201527f793d27302e3235272066696c6c3d2723454245424542272077696474683d27336101408201527f3027206865696768743d27313630272f3e00000000000000000000000000000061016082015250565b7f272f3e203c2f6c696e6561724772616469656e743e203c7265637420793d273260008201527f3230272066696c6c3d2775726c282353564749445f335f29272077696474683d60208201527f273336302e30303127206865696768743d27333630272f3e0000000000000000604082015250565b7f3c2f746578743e00000000000000000000000000000000000000000000000000600082015250565b7f3c6c696e6561724772616469656e742069643d2753564749445f335f2720677260008201527f616469656e74556e6974733d277573657253706163654f6e557365272078313d60208201527f273232302e30323235272079313d273332392e34343533272078323d27000000604082015250565b7f222c2022696d616765223a202200000000000000000000000000000000000000600082015250565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f646174613a746578742f706c61696e2c7b226e616d65223a2200000000000000600082015250565b7f3c2f737667203e00000000000000000000000000000000000000000000000000600082015250565b7f554e534146455f524543495049454e5400000000000000000000000000000000600082015250565b7f222c20226465736372697074696f6e223a220000000000000000000000000000600082015250565b7f2276616c7565223a220000000000000000000000000000000000000000000000600082015250565b7f5b00000000000000000000000000000000000000000000000000000000000000600082015250565b7f272078323d273138302e30303035272079323d273136302e30303035273e203c60008201527f73746f7020206f66667365743d273027207374796c653d2773746f702d636f6c60208201527f6f723a0000000000000000000000000000000000000000000000000000000000604082015250565b7f3b73746f702d6f7061636974793a30272f3e3c2f6c696e65617247726164696560008201527f6e743e203c7265637420793d27313630272066696c6c3d2775726c282353564760208201527f49445f325f29272077696474683d2733363027206865696768743d273438302760408201527f2f3e000000000000000000000000000000000000000000000000000000000000606082015250565b7f4365727469666963617465206f662047726f7774682000000000000000000000600082015250565b7f272f3e203c73746f7020206f66667365743d273127207374796c653d2773746f60008201527f702d636f6c6f723a000000000000000000000000000000000000000000000000602082015250565b7f6e6f20766572696669636174696f6e20636f6e74726163742073657400000000600082015250565b7f3c706174682066696c6c3d27234542454245422720643d274d302c353830763160008201527f3630683438305635383048307a272f3e203c706174682066696c6c3d2723454260208201527f454245422720643d274d302c307632323068343830563048307a272f3e000000604082015250565b7f272079323d273231392e34343527206772616469656e745472616e73666f726d60008201527f3d276d617472697828332e362030203020332e36202d3638342e30373632202d60208201527f36303629273e203c73746f7020206f66667365743d273027207374796c653d2760408201527f73746f702d636f6c6f723a000000000000000000000000000000000000000000606082015250565b50565b7f3c7265637420783d273336302720793d273232302e313139272066696c6c3d2760008201527f75726c282353564749445f355f29272077696474683d2733302720686569676860208201527f743d273335392e383831272f3e00000000000000000000000000000000000000604082015250565b7f6f6e6c792061646d696e2063616e2073657420636f6c6f7270726f66696c6500600082015250565b7f7b2274726169745f74797065223a2243757261746f72222c0000000000000000600082015250565b7f3c6c696e6561724772616469656e742069643d2753564749445f325f2720677260008201527f616469656e74556e6974733d277573657253706163654f6e557365272078313d60208201527f2730272079313d27343030272078323d27000000000000000000000000000000604082015250565b7f3b73746f702d6f7061636974793a30272f3e3c73746f7020206f66667365743d60008201527f27302e3527207374796c653d2773746f702d636f6c6f723a0000000000000000602082015250565b7f6f6e6c792061646d696e2063616e207365742061646d696e0000000000000000600082015250565b7f2261747472696275746573223a20000000000000000000000000000000000000600082015250565b7f3c6c696e6561724772616469656e742069643d2753564749445f345f2720677260008201527f616469656e74556e6974733d277573657253706163654f6e557365272078313d60208201527f27343035272079313d27353830272078323d27343035272079323d273232302e60408201527f31313931273e203c73746f7020206f66667365743d273027207374796c653d2760608201527f73746f702d636f6c6f723a23303046463030272f3e203c73746f7020206f666660808201527f7365743d273127207374796c653d2773746f702d636f6c6f723a23433230303060a08201527f42272f3e203c2f6c696e6561724772616469656e743e203c7265637420783d2760c08201527f3339302720793d273232302e313139272066696c6c3d2775726c28235356474960e08201527f445f345f29272077696474683d27333027206865696768743d273335392e38386101008201527f31272f3e3c6c696e6561724772616469656e742069643d2753564749445f355f6101208201527f27206772616469656e74556e6974733d277573657253706163654f6e557365276101408201527f2078313d27333735272079313d27353830272078323d27333735272079323d276101608201527f3232302e31313931273e203c73746f7020206f66667365743d273027207374796101808201527f6c653d2773746f702d636f6c6f723a23313431343134272f3e203c73746f70206101a08201527f206f66667365743d273127207374796c653d2773746f702d636f6c6f723a23306101c08201527f3041304336272f3e203c2f6c696e6561724772616469656e743e0000000000006101e082015250565b7f3c74657874207472616e73666f726d3d276d617472697828312030203020312060008201527f3336302000000000000000000000000000000000000000000000000000000000602082015250565b7f3c74657874207472616e73666f726d3d276d617472697828312030203020312060008201527f3130203632352e3333353929272066696c6c3d27233134313431342720666f6e60208201527f742d66616d696c793d27436f75726965722c206d6f6e6f73706163652720666f60408201527f6e742d73697a653d273234273e00000000000000000000000000000000000000606082015250565b7f414c52454144595f4d494e544544000000000000000000000000000000000000600082015250565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b7f57524f4e475f46524f4d00000000000000000000000000000000000000000000600082015250565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000600082015250565b615a0e81614095565b8114615a1957600080fd5b50565b615a25816140a7565b8114615a3057600080fd5b50565b615a3c816140b3565b8114615a4757600080fd5b50565b615a53816140ff565b8114615a5e57600080fd5b5056fe3c74657874207472616e73666f726d3d276d61747269782831203020302031203130203138352e32303631292720666f6e742d66616d696c793d27417269616c2720666f6e742d73697a653d273136273e536f696c204d6f6973747572652028782d61786973293c2f746578743e3c74657874207472616e73666f726d3d276d61747269782831203020302031203130203134312e34353631292720666f6e742d66616d696c793d27417269616c2720666f6e742d73697a653d273136273e54696d653c2f746578743e3c74657874207472616e73666f726d3d276d61747269782831203020302031203130203630352e32303631292720666f6e742d66616d696c793d27417269616c2720666f6e742d73697a653d273136273e506c616e743c2f746578743e3c74657874207472616e73666f726d3d276d61747269782831203020302031203130203635312e34353631292720666f6e742d66616d696c793d27417269616c2720666f6e742d73697a653d273136273e4c6f636174696f6e3c2f746578743e3c74657874207472616e73666f726d3d276d6174726978283120302030203120323530203138352e32303631292720666f6e742d66616d696c793d27417269616c2720666f6e742d73697a653d273136273e54656d70657261747572652028792d61786973293c2f746578743e3c74657874207472616e73666f726d3d276d61747269782831203020302031203432372e30303239203234312e3435353629272066696c6c3d27234542454245422720666f6e742d66616d696c793d27417269616c2720666f6e742d73697a653d273136273e7465727261303c2f746578743e3c74657874207472616e73666f726d3d276d6174726978283120302030203120392038302e3733343929272066696c6c3d27233134313431342720666f6e742d66616d696c793d2754696d65732d526f6d616e2c2054696d65732720666f6e742d73697a653d273435273e4365727469666963617465206f662047726f777468203c2f746578743e53656564204361706974616c202d20436572746966696361746573206f662047726f7774684142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122015d04fb23ceba143263e5f5ab7602b7d817623b9d0b78ab070431b2ccb029bf464736f6c63430008040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000b47494b3d487b82b78af230c8460a12272389755

-----Decoded View---------------
Arg [0] : _admin (address): 0xB47494B3d487b82b78af230c8460a12272389755

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b47494b3d487b82b78af230c8460a12272389755


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.