ETH Price: $3,116.38 (-1.00%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve237698322025-11-10 15:43:4759 days ago1762789427IN
0x5c77BFFc...5B238d09C
0 ETH0.000151533.13749417
Transfer231408032025-08-14 17:34:59147 days ago1755192899IN
0x5c77BFFc...5B238d09C
0 ETH0.000658633.07361297
Approve229695052025-07-21 18:58:23171 days ago1753124303IN
0x5c77BFFc...5B238d09C
0 ETH0.000096331.99216537
Approve217799292025-02-05 11:14:59337 days ago1738754099IN
0x5c77BFFc...5B238d09C
0 ETH0.000163963.37470594
Approve217245652025-01-28 17:38:35345 days ago1738085915IN
0x5c77BFFc...5B238d09C
0 ETH0.000240058.46085294
Approve217245652025-01-28 17:38:35345 days ago1738085915IN
0x5c77BFFc...5B238d09C
0 ETH0.000240898.49014975
Approve217245582025-01-28 17:37:11345 days ago1738085831IN
0x5c77BFFc...5B238d09C
0 ETH0.000238589.04644074
Approve216216432025-01-14 8:51:47359 days ago1736844707IN
0x5c77BFFc...5B238d09C
0 ETH0.00027735.70752542
Approve210854782024-10-31 12:00:11434 days ago1730376011IN
0x5c77BFFc...5B238d09C
0 ETH0.000380237.86490427
Approve209062712024-10-06 11:39:59459 days ago1728214799IN
0x5c77BFFc...5B238d09C
0 ETH0.0004569.42747016
Approve206780972024-09-04 15:24:47491 days ago1725463487IN
0x5c77BFFc...5B238d09C
0 ETH0.000410518.50168675
Approve202567592024-07-07 19:35:47550 days ago1720380947IN
0x5c77BFFc...5B238d09C
0 ETH0.000115552.38962383
Approve202112462024-07-01 11:03:23556 days ago1719831803IN
0x5c77BFFc...5B238d09C
0 ETH0.000270095.55906441
Approve201183612024-06-18 11:31:47569 days ago1718710307IN
0x5c77BFFc...5B238d09C
0 ETH0.000353057.25764691
Approve200540082024-06-09 11:36:23578 days ago1717932983IN
0x5c77BFFc...5B238d09C
0 ETH0.000205754.2590301
Approve199438272024-05-25 2:11:35593 days ago1716603095IN
0x5c77BFFc...5B238d09C
0 ETH0.000249195.12264037
Approve199055022024-05-19 17:34:59599 days ago1716140099IN
0x5c77BFFc...5B238d09C
0 ETH0.000181733.735941
Approve199054952024-05-19 17:33:35599 days ago1716140015IN
0x5c77BFFc...5B238d09C
0 ETH0.000193484
Approve198988522024-05-18 19:15:35600 days ago1716059735IN
0x5c77BFFc...5B238d09C
0 ETH0.000143012.95741594
Approve198955862024-05-18 8:17:11600 days ago1716020231IN
0x5c77BFFc...5B238d09C
0 ETH0.000165163.3993846
Approve198833812024-05-16 15:17:59602 days ago1715872679IN
0x5c77BFFc...5B238d09C
0 ETH0.000300119.62343264
Approve198103832024-05-06 10:15:35612 days ago1714990535IN
0x5c77BFFc...5B238d09C
0 ETH0.000321566.6612025
Approve196957552024-04-20 9:32:35628 days ago1713605555IN
0x5c77BFFc...5B238d09C
0 ETH0.000288675.93428746
Approve195493442024-03-30 21:10:23649 days ago1711833023IN
0x5c77BFFc...5B238d09C
0 ETH0.0010014720.61232762
Approve195183222024-03-26 11:29:11653 days ago1711452551IN
0x5c77BFFc...5B238d09C
0 ETH0.0006150523.37462703
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Wormz

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
paris EvmVersion
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

import "./ERC404.sol";
import "./Base64.sol";

contract Wormz is ERC404 {
    string[8] private baseColors =
        ["#AE8B61", "#DBB181", "#E8AA96", "#FFC2C2", "#EECFA0", "#C9CDAF", "#D5C6E1", "#EAD9D9"];
    string[7] private thirdNames = ["Smile", "Frown", "Handlebars", "Zombie", "Alien", "Ape", "Normal"];
    string[7] private thirdLayers = [
        '<path fill="#000" d="M16 17h1v1h-1z"/>',
        '<path fill="#000" d="M16 19h1v1h-1z"/>',
        '<path stroke="#A66E2C" d="M16.5 20v-2m3.5-.5h-3m3.5.5v2"/><path stroke="#C28946" d="M16 17.5h1m3 0h1"/>',
        '<path fill="#7DA269" d="M22 10v12h-2v2h-1v1H5v-1h1v-1h1v-1h1v-1h1v-1h2v-1h2v-9h1V9h2V8h-1V7h3v1h1v1h2v1h1z"/><path fill="#000" fill-opacity=".4" d="M17 12h-2v1h2v-1zM20 12v1h2v-1h-2zM22 21h-9v1h1v1h6v-1h2v-1zM12 19h-1v6h2v-1h-1v-5zM10 25v-5H9v5h1zM8 25v-3H7v3h1zM6 24H5v1h1v-1zM16 14h-1v1h1v-1zM21 14h-1v1h1v-1zM18 19h-1v1h1v-1z"/><path fill="red" d="M15 13h1v1h-1v-1zM20 13h1v1h-1v-1z"/><path fill="#000" d="M17 13h-1v1h1v-1zM22 13h-1v1h1v-1zM20 16v-1h-2v1h2zM17 18v1h3v-1h-3z"/>',
        '<path fill="#C8FBFB" d="M22 10v12h-2v2h-1v1H5v-1h1v-1h1v-1h1v-1h1v-1h2v-1h2v-9h1V9h2V8h-1V7h3v1h1v1h2v1h1z"/><path stroke="#75BDBD" d="M15.5 12v1m5-1v1"/><path fill="#000" d="M21 19v-1h-5v1h5zM15 13h1v-1h1v1h-1v1h-1v-1zM21 12h1v1h-1v1h-1v-1h1v-1z"/><path fill="#9BE0E0" d="M22 21h-9v1h1v1h6v-1h2v-1zM12 19h-1v6h2v-1h-1v-5zM10 25v-5H9v5h1zM8 25v-3H7v3h1zM6 24H5v1h1v-1zM17 13h-1v1h1v-1zM22 13h-1v1h1v-1zM19 14h-1v3h1v-3z"/>',
        '<path fill="#61503D" d="M22 10v12h-2v2h-1v1H5v-1h1v-1h1v-1h1v-1h1v-1h2v-1h2v-9h1V9h2V8h-1V7h3v1h1v1h2v1h1z"/><path fill="#958A7D" stroke="#958A7D" d="M16.5 19.5v-1h-1v-1h1v-2h-1v-1h-1v-3h2v-1h3v1h2v4h-1v2h1v1h-1v1h-4z"/><path fill="#000" fill-opacity=".4" d="M17 12h-2v1h2v-1zM20 12v1h2v-1h-2zM22 21h-9v1h1v1h6v-1h2v-1zM12 19h-1v6h2v-1h-1v-5zM10 25v-5H9v5h1zM8 25v-3H7v3h1zM6 24H5v1h1v-1z"/><path fill="#000" d="M16 13h-1v1h1v-1zM21 13h-1v1h1v-1zM18 16v-1h-1v1h1zM17 18v1h3v-1h-3zM19.724 16v-1h-1v1h1z"/><path fill="#AAA197" d="M17 14h-1v-1h1v1zM22 14h-1v-1h1v1z"/>',
        ""
    ];
    string[8] private fourthNames = [
        "3D Glasses",
        "VR",
        "Small Shades",
        "Eye Patch",
        "Classic Shades",
        "Regular Shades",
        "Horned Rim Glasses",
        "None"
    ];
    string[8] private fourthLayers = [
        '<path fill="#F0F0F0" d="M12 11h11v4h-9v-3h-2v-1z"/><path fill="#FD3232" d="M19 12h3v2h-3z"/><path fill="#328DFD" d="M15 12h3v2h-3z"/>',
        '<path fill="#B4B4B4" d="M14 11h9v4h-9z"/><path stroke="#000" d="M14 15.5h8m-8-5h8M13.5 14v1m10-4v4m-10-4v1m2 .5v1h6v-1h-6z"/><path stroke="#8D8D8D" d="M13.5 12v2m1 0v1m0-4v1m8-1v1m0 2v1"/>',
        '<path fill="#000" d="M13 13v-1h9v3h-2v-2h-3v2h-2v-2h-2z"/>',
        '<path fill="#000" d="M13 11h9v1h-4v2h-1v1h-2v-1h-1v-2h-1v-1z"/>',
        '<path stroke="#000" d="M13 11.5h9m-7 3h2m.5-.5v-2m2 0v2m.5.5h2m-7.5-.5v-2"/><path stroke="#5C390F" d="M15 12.5h2m3 0h2"/><path stroke="#C77514" d="M15 13.5h2m3 0h2"/>',
        '<path fill="#000" d="M13 12h11v2h-1v1h-2v-1h-1v-1h-2v1h-1v1h-2v-1h-1v-1h-1v-1z"/>',
        '<path fill="#fff" fill-opacity=".5" d="M14 12h3v3h-3zM19 12h3v3h-3z"/><path fill="#000" d="M13 11h11v2h-1v-1h-4v1h-2v-1h-3v1h-1v-2z"/>',
        ""
    ];
    string[14] private fifthNames = [
        "Beanie",
        "Cowboy Hat",
        "Fedora",
        "Police Cap",
        "Do-rag",
        "Knitted Cap",
        "Bandana",
        "Peak Spike",
        "Wild Hair",
        "Messy Hair",
        "Cap Forward",
        "Cap",
        "Top Hat",
        "None"
    ];
    string[14] private fifthLayers = [
        '<path fill="#3CC300" d="M14 10h7v1h-7z"/><path fill="#0060C3" d="M16 6v4h-4V8h1V7h1V6h2z"/><path fill="#D60404" d="M19 6v4h4V8h-1V7h-1V6h-2z"/><path fill="#E4EB17" d="M14 9h1V8h1V6h3v2h1v1h1v1h-7V9z"/><path fill="#000" d="M17 5h1v1h-1z"/><path fill="#0060C3" d="M15 4h5v1h-5z"/>',
        '<path fill="#794B11" d="M8 7h1v1h4V4h1V3h2v1h3V3h2v1h1v4h4V7h1v2h-1v1H9V9H8V7z"/><path fill="#502F05" d="M12 7h11v1H12z"/>',
        '<path fill="#3D2F1E" d="M9 9h1V8h3V6h1V4h1V3h5v1h1v2h1v2h3v1h1v1H9V9z"/><path fill="#000" d="M12 7h11v1H12z"/>',
        '<path fill="#26314A" d="M12 5h11v5H12z"/><path stroke="#fff" d="M13 8.5h1m1 0h1m1 0h1m1 0h1m1 0h1"/><path stroke="#FFD800" d="M17 6.5h1"/><path fill="#000" fill-rule="evenodd" d="M23 6V5h-4V4h-3v1h-4v1h-1v2h1v2h3v1h9V9h-1V8h1V6h-1zm0 0h-4V5h-3v1h-4v2h1v1h1V8h1v2h8V9h-1V8h1V6zm-7 3h1V8h-1v1zm2 0h1V8h-1v1zm2 0h1V8h-1v1z" clip-rule="evenodd"/>',
        '<path fill="#4C4C4C" d="M13 7h9v4h-9z"/><path fill="#000" d="M13 10h-1V8h1V7h1V6h7v1h2v2h-1V8h-1V7h-7v1h-1v2z"/><path stroke="#636363" d="M14 9.5h1m0-1h1"/>',
        '<path fill="#CA4E11" d="M14 7h-1v3h9V7h-1V6h-7v1z"/><path fill="#933709" d="M12 8h11v2h-1V9h-1v1h-1V9h-1v1h-1V9h-1v1h-1V9h-1v1h-1V9h-1v1h-1V8z"/><path stroke="#000" d="M11.5 10V8m1 0V7m1 0V6m.5-.5h7m.5.5v1m1 0v1m1 0v2"/>',
        '<path fill="#1A43C8" d="M13 7h9v3H10v3H9v-3H8V9h5V7z"/><path stroke="#1637A4" d="M22 9.5h-1m0 1h-3m0-1h-4m8.5-.5V7m-.5-.5h-8m0 1h-1m0 1h-1m0 1h-1m0 1h-1m0-1H9"/><path stroke="#142C7C" d="M11 11.5h-1m2-1h-1m2-1h-1"/>',
        '<path fill="#000" d="M14 7V5h1V4h1v1h1V4h1v1h1V4h1v1h1v2h1v2h-3v1h-1v1h-1v-1h-1V9h-3V7h1zM12 9v1h1V9h-1z"/>',
        '<path stroke="#000" d="M12 4.5h2m4 0h5m-14 1h1m2 0h10m2 0h2m-17 1h16m-16 1h17m-16 1h15m-16 1h9m2 0h5m-17 1h7m2 0h2m2 0h3m-14 1h4m9 0h2m-16 1h5m9 0h2m-16 1h1m1 0h3m9.5-.5v2M10 14.5h4m-4 1h2"/>',
        '<path fill="#000" d="M14 11h1v1h-1zM15 10h1v1h-1zM18 9h1v3h-1zM12 9h6v1h-6zM13 10h1v1h-1zM11 10h1v1h-1zM11 8h3v1h-3zM12 7h2v1h-2zM13 6h2v1h-2zM14 5h6v1h-6zM21 5h1v2h-1zM21 7h3v1h-3zM21 10h3v1h-3zM20 8h3v2h-3zM15 7h4v2h-4z"/><path fill="#000" d="M17 6h4v2h-4z"/><path fill="#000" d="M14 6h4v3h-4z"/><path stroke="#000" d="M14 5.5h6m1 0h1m-9 1h9m-10 1h12m-13 1h8m1 0h3m-11 1h7m1 0h3m-12 1h1m1 0h1m1 0h1m-2 1h1m3.5-1.5v2m2.5-1.5h3"/>',
        '<path fill="#515151" d="M13 6h9v4h-9V6z"/><path stroke="#000" d="M12 10.5h12.5V9m-.5-.5h-8m0 1h-1m8-2h-1m0-1h-1m0-1h-7m0 1h-1m-.5.5v3"/><path stroke="#353535" d="M24 9.5h-8m-1-3h-1m0 1h-1"/>',
        '<path fill="#8119B7" d="M12 7h1V6h1V5h7v1h1v2h3v1h1v1H12V7z"/><path stroke="#B261DC" d="M21 7.5h-1m0-1h-1"/>',
        '<path fill="#000" d="M13 2h9v1h1v5h1v1h1v1H10V9h1V8h1V3h1V2z"/><path fill="#DC1D1D" d="M12 7h11v1H12z"/>',
        ""
    ];
    string[5] private sixthNames = ["Earring", "Vape", "Cigarette", "Pipe", "None"];
    string[5] private sixthLayers = [
        '<path fill="#FFD926" d="M12 14h1v1h-1z"/>',
        '<path stroke="#000" d="M20 17.5h7m1 1h-1m0 1h-7"/><path stroke="#595959" d="M20 18.5h6"/><path stroke="#0040FF" d="M26 18.5h1"/>',
        '<path stroke="#000" d="M20 17.5h7m1 1h-1m0 1h-7"/><path stroke="#D7D1D1" d="M20 18.5h6"/><path stroke="#E7A600" d="M26 18.5h1"/><path fill="#fff" fill-opacity=".4" d="M26 11h1v5h-1z"/>',
        '<path stroke="#000" d="M20 18.5h1m0 1h1m0 1h1m0 1h1.5v-2h4V22m-1 0v1m-.5.5h-4m0-1h-1m0-1h-1m0-1h-1m0-1h-1"/><path stroke="#855114" d="M20 19.5h1m0 1h1m0 1h1m0 1h3m-1-2h3m-2 1h1"/><path stroke="#683C08" d="M25 21.5h1m0 1h1m0-1h1"/><path stroke="#fff" stroke-opacity=".4" d="M26.5 12v1.5m0 0H25m1.5 0H28M26.5 15v1m0 1v1"/>',
        ""
    ];

    struct WormzObject {
        uint256 baseColor;
        uint256 layerThree;
        uint256 layerFour;
        uint256 layerFive;
        uint256 layerSix;
    }

    function randomWormz(uint256 tokenId) internal pure returns (WormzObject memory) {
        WormzObject memory wormz;

        wormz.baseColor = getBaseColor(tokenId);
        wormz.layerThree = getLayerThree(tokenId);
        wormz.layerFour = getLayerFour(tokenId);
        wormz.layerFive = getLayerFive(tokenId);
        wormz.layerSix = getLayerSix(tokenId);

        return wormz;
    }

    function getTraits(WormzObject memory wormz) internal view returns (string memory) {
        string[20] memory parts;

        parts[0] = ', "attributes": [{"trait_type": "Type","value": "';
        if (wormz.layerThree == 3) {
            parts[1] = 'Zombie"}, {"trait_type": "Mouth","value": "Zombie"},';
        }
        if (wormz.layerThree == 4) {
            parts[2] = 'Alien"}, {"trait_type": "Mouth","value": "Alien"},';
        }
        if (wormz.layerThree == 5) {
            parts[3] = 'Ape"}, {"trait_type": "Mouth","value": "Ape"},';
        }
        if (wormz.layerThree < 3 || wormz.layerThree > 5) {
            parts[4] = 'Normal"}, {"trait_type": "Mouth","value": "';
            parts[5] = thirdNames[wormz.layerThree];
            parts[6] = '"},';
        }
        parts[7] = ' {"trait_type": "Eyewear","value": "';
        parts[8] = fourthNames[wormz.layerFour];
        parts[9] = '"}, {"trait_type": "Headwear","value": "';
        parts[10] = fifthNames[wormz.layerFive];
        parts[11] = '"}, {"trait_type": "Accessory","value": "';
        parts[12] = sixthNames[wormz.layerSix];
        parts[13] = '"}], ';

        string memory output =
            string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7]));
        output = string(abi.encodePacked(output, parts[8], parts[9], parts[10], parts[11], parts[12], parts[13]));
        return output;
    }

    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }

    function getBaseColor(uint256 tokenId) internal pure returns (uint256) {
        uint256 rand = random(string(abi.encodePacked("BASE COLOR", toString(tokenId))));

        uint256 rn1 = rand % 79;
        uint256 bc = 0;

        if (rn1 >= 10 && rn1 < 20) bc = 1;
        if (rn1 >= 20 && rn1 < 30) bc = 2;
        if (rn1 >= 30 && rn1 < 40) bc = 3;
        if (rn1 >= 40 && rn1 < 50) bc = 4;
        if (rn1 >= 50 && rn1 < 60) bc = 5;
        if (rn1 >= 60 && rn1 < 70) bc = 6;
        if (rn1 >= 70) bc = 7;

        return bc;
    }

    function getLayerThree(uint256 tokenId) internal pure returns (uint256) {
        uint256 rand = random(string(abi.encodePacked("LAYER THREE", toString(tokenId))));

        uint256 rn3 = rand % 170;
        uint256 l3 = 0;

        if (rn3 >= 46 && rn3 < 64) l3 = 1;
        if (rn3 >= 64 && rn3 < 81) l3 = 2;
        if (rn3 >= 81 && rn3 < 85) l3 = 3;
        if (rn3 == 85) l3 = 4;
        if (rn3 >= 86 && rn3 < 88) l3 = 5;
        if (rn3 >= 88) l3 = 6;

        return l3;
    }

    function getLayerFour(uint256 tokenId) internal pure returns (uint256) {
        uint256 rand = random(string(abi.encodePacked("LAYER FOUR", toString(tokenId))));

        uint256 rn4 = rand % 500;
        uint256 l4 = 0;

        if (rn4 >= 41 && rn4 < 81) l4 = 1;
        if (rn4 >= 81 && rn4 < 121) l4 = 2;
        if (rn4 >= 121 && rn4 < 161) l4 = 3;
        if (rn4 >= 161 && rn4 < 201) l4 = 4;
        if (rn4 >= 201 && rn4 < 261) l4 = 5;
        if (rn4 >= 261 && rn4 < 281) l4 = 6;
        if (rn4 >= 281) l4 = 7;

        return l4;
    }

    function getLayerFive(uint256 tokenId) internal pure returns (uint256) {
        uint256 rand = random(string(abi.encodePacked("LAYER FIVE", toString(tokenId))));

        uint256 rn5 = rand % 240;
        uint256 l5 = 0;

        if (rn5 >= 10 && rn5 < 20) l5 = 1;
        if (rn5 >= 20 && rn5 < 30) l5 = 2;
        if (rn5 >= 30 && rn5 < 40) l5 = 3;
        if (rn5 >= 40 && rn5 < 50) l5 = 4;
        if (rn5 >= 50 && rn5 < 60) l5 = 5;
        if (rn5 >= 60 && rn5 < 70) l5 = 6;
        if (rn5 >= 70 && rn5 < 80) l5 = 7;
        if (rn5 >= 80 && rn5 < 90) l5 = 8;
        if (rn5 >= 90 && rn5 < 100) l5 = 9;
        if (rn5 >= 100 && rn5 < 110) l5 = 10;
        if (rn5 >= 110 && rn5 < 120) l5 = 11;
        if (rn5 >= 120 && rn5 < 130) l5 = 12;
        if (rn5 >= 130) l5 = 13;

        return l5;
    }

    function getLayerSix(uint256 tokenId) internal pure returns (uint256) {
        uint256 rand = random(string(abi.encodePacked("LAYER SIX", toString(tokenId))));

        uint256 rn6 = rand % 120;
        uint256 l6 = 0;

        if (rn6 >= 10 && rn6 < 20) l6 = 1;
        if (rn6 >= 20 && rn6 < 30) l6 = 2;
        if (rn6 >= 30 && rn6 < 40) l6 = 3;
        if (rn6 >= 40) l6 = 4;

        return l6;
    }

    function getSVG(WormzObject memory wormz) internal view returns (string memory) {
        string[9] memory parts;

        parts[0] =
            '<svg id="x" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 30 30"><path fill="#638596" d="M0 0h30v30H0z"/>';
        parts[1] = '<path fill="';
        parts[2] = baseColors[wormz.baseColor];
        parts[3] =
            '" d="M22 10v12h-2v2h-1v1H5v-1h1v-1h1v-1h1v-1h1v-1h2v-1h2v-9h1V9h2V8h-1V7h3v1h1v1h2v1h1z"/><path fill="#000" d="M4 24v2h16v-2h-1v1H5v-1H4zM6 23H5v1h1v-1zM7 22H6v1h1v-1zM8 21H7v1h1v-1zM9 20H8v1h1v-1zM11 19H9v1h2v-1zM12 10v8h-1v1h2v-9h-1zM14 10V9h-1v1h1zM15 8V7h-1v2h2V8h-1zM18 6h-3v1h3V6zM19 7h-1v1h1V7zM21 8h-2v1h2V8zM23 22V9h-2v1h1v12h1zM21 24v-1h1v-1h-2v2h1zM15 13h1v1h-1v-1zM20 13h1v1h-1v-1zM18 15h2v1h-2v-1zM17 18h3v1h-3v-1z"/><path fill="#000" fill-opacity=".2" d="M17 13h-1v1h1v-1zM22 13h-1v1h1v-1z"/><path fill="#000" fill-opacity=".4" d="M17 12h-2v1h2v-1zM20 12v1h2v-1h-2zM22 21h-9v1h1v1h6v-1h2v-1zM12 19h-1v6h2v-1h-1v-5zM10 25v-5H9v5h1zM8 25v-3H7v3h1zM6 24H5v1h1v-1z"/>';
        parts[4] = thirdLayers[wormz.layerThree];
        parts[5] = fourthLayers[wormz.layerFour];
        parts[6] = fifthLayers[wormz.layerFive];
        parts[7] = sixthLayers[wormz.layerSix];
        parts[8] = "<style>#x{shape-rendering: crispedges;}</style></svg>";

        string memory output = string(
            abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8])
        );

        return output;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        WormzObject memory wormz = randomWormz(tokenId);
        string memory json = Base64.encode(
            bytes(
                string(
                    abi.encodePacked(
                        '{"name": "Wormz #',
                        toString(tokenId),
                        '", "description": "A fully on-chain game utilising the experiemental token standard, ERC-404 which enables persistent liquidity and semi-fungibility."',
                        getTraits(wormz),
                        '"image": "data:image/svg+xml;base64,',
                        Base64.encode(bytes(getSVG(wormz))),
                        '"}'
                    )
                )
            )
        );
        json = string(abi.encodePacked("data:application/json;base64,", json));
        return json;
    }

    function toString(uint256 value) internal pure returns (string memory) {
        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);
    }

    uint256 INIT_SUPPLY = 10_000 * 10 ** 18;
    uint256 public GARDEN_SUPPLY = 10_000 * 10 ** 18;
    bool public gardenLocked;
    address public garden;

    function setGarden(address _garden) external onlyOwner returns (address) {
        require(!gardenLocked, "garden locked!");
        if (garden != address(0)) {
            balanceOf[garden] = 0;
            whitelist[garden] = false;
        }
        garden = _garden;
        whitelist[_garden] = true;
        balanceOf[_garden] = GARDEN_SUPPLY;
        return garden;
    }

    function lockGarden() external onlyOwner {
        gardenLocked = true;
    }

    constructor(address _owner) ERC404("Wormz", "WORMZ", 18, 20_000, _owner) {
        balanceOf[_owner] = INIT_SUPPLY;
        whitelist[_owner] = true;
    }
}

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

import "./Ownable.sol";
// import { console2 } from "../lib/forge-std/src/console2.sol";

abstract contract ERC721Receiver {
    function onERC721Received(address, address, uint256, bytes calldata) external virtual returns (bytes4) {
        return ERC721Receiver.onERC721Received.selector;
    }
}

/// @notice ERC404
///         A gas-efficient, mixed ERC20 / ERC721 implementation
///         with native liquidity and fractionalization.
///
///         This is an experimental standard designed to integrate
///         with pre-existing ERC20 / ERC721 support as smoothly as
///         possible.
///
/// @dev    In order to support full functionality of ERC20 and ERC721
///         supply assumptions are made that slightly constraint usage.
///         Ensure decimals are sufficiently large (standard 18 recommended)
///         as ids are effectively encoded in the lowest range of amounts.
///
///         NFTs are spent on ERC20 functions in a FILO queue, this is by
///         design.
///
abstract contract ERC404 is Ownable {
    // Events
    event ERC20Transfer(address indexed from, address indexed to, uint256 amount);
    event Approval(address indexed owner, address indexed spender, uint256 amount);
    event Transfer(address indexed from, address indexed to, uint256 indexed id);
    event ERC721Approval(address indexed owner, address indexed spender, uint256 indexed id);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    // Errors
    error NotFound();
    error AlreadyExists();
    error InvalidRecipient();
    error InvalidSender();
    error UnsafeRecipient();

    // Metadata
    /// @dev Token name
    string public name;

    /// @dev Token symbol
    string public symbol;

    /// @dev Decimals for fractional representation
    uint8 public immutable decimals;

    /// @dev Total supply in fractionalized representation
    uint256 public immutable totalSupply;

    /// @dev Current mint counter, monotonically increasing to ensure accurate ownership
    uint256 public minted;

    // Mappings
    /// @dev Balance of user in fractional representation
    mapping(address => uint256) public balanceOf;

    /// @dev Allowance of user in fractional representation
    mapping(address => mapping(address => uint256)) public allowance;

    /// @dev Approval in native representaion
    mapping(uint256 => address) public getApproved;

    /// @dev Approval for all in native representation
    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /// @dev Owner of id in native representation
    mapping(uint256 => address) internal _ownerOf;

    /// @dev Array of owned ids in native representation
    mapping(address => uint256[]) internal _owned;

    /// @dev Tracks indices for the _owned mapping
    mapping(uint256 => uint256) internal _ownedIndex;

    /// @dev Addresses whitelisted from minting / burning for gas savings (pairs, routers, etc)
    mapping(address => bool) public whitelist;
    mapping(address => bool) greylist;
    uint256 greylistTimestamp;
    bool greylistEnabled;

    // Constructor
    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals,
        uint256 _totalNativeSupply,
        address _owner
    )
        Ownable(_owner)
    {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        totalSupply = _totalNativeSupply * (10 ** decimals);
        greylistTimestamp = block.timestamp + 120 minutes;
    }

    /// @notice Initialization function to set pairs / etc
    ///         saving gas by avoiding mint / burn on unnecessary targets
    function setWhitelist(address target, bool state) public onlyOwner {
        whitelist[target] = state;
    }

    function setGreylist(address[] calldata target, bool state) public onlyOwner {
        require(greylistTimestamp > block.timestamp, "greylist over");
        greylistEnabled = true;
        for (uint256 i = 0; i < target.length; i++) {
            greylist[target[i]] = state;
        }
    }

    function closeGreylist() public onlyOwner {
        greylistEnabled = false;
    }

    /// @notice Function to find owner of a given native token
    function ownerOf(uint256 id) public view virtual returns (address owner) {
        owner = _ownerOf[id];

        if (owner == address(0)) {
            revert NotFound();
        }
    }

    /// @notice tokenURI must be implemented by child contract
    function tokenURI(uint256 id) public view virtual returns (string memory);

    /// @notice Function for token approvals
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function approve(address spender, uint256 amountOrId) public virtual returns (bool) {
        if (amountOrId <= minted && amountOrId > 0) {
            address owner = _ownerOf[amountOrId];

            if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) {
                revert Unauthorized();
            }

            getApproved[amountOrId] = spender;

            emit Approval(owner, spender, amountOrId);
        } else {
            allowance[msg.sender][spender] = amountOrId;

            emit Approval(msg.sender, spender, amountOrId);
        }

        return true;
    }

    /// @notice Function native approvals
    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

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

    /// @notice Function for mixed transfers
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function transferFrom(address from, address to, uint256 amountOrId) public virtual {
        if (amountOrId <= minted) {
            if (from != _ownerOf[amountOrId]) {
                revert InvalidSender();
            }

            if (to == address(0)) {
                revert InvalidRecipient();
            }

            if (msg.sender != from && !isApprovedForAll[from][msg.sender] && msg.sender != getApproved[amountOrId]) {
                revert Unauthorized();
            }

            balanceOf[from] -= _getUnit();

            unchecked {
                balanceOf[to] += _getUnit();
            }

            _ownerOf[amountOrId] = to;
            delete getApproved[amountOrId];

            // update _owned for sender
            uint256 updatedId = _owned[from][_owned[from].length - 1];
            _owned[from][_ownedIndex[amountOrId]] = updatedId;
            // pop
            _owned[from].pop();
            // update index for the moved id
            _ownedIndex[updatedId] = _ownedIndex[amountOrId];
            // push token to to owned
            _owned[to].push(amountOrId);
            // update index for to owned
            _ownedIndex[amountOrId] = _owned[to].length - 1;

            emit Transfer(from, to, amountOrId);
            emit ERC20Transfer(from, to, _getUnit());
        } else {
            uint256 allowed = allowance[from][msg.sender];

            if (allowed != type(uint256).max) {
                allowance[from][msg.sender] = allowed - amountOrId;
            }

            _transfer(from, to, amountOrId);
        }
    }

    /// @notice Function for fractional transfers
    function transfer(address to, uint256 amount) public virtual returns (bool) {
        return _transfer(msg.sender, to, amount);
    }

    /// @notice Function for native transfers with contract support
    function safeTransferFrom(address from, address to, uint256 id) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0
                && ERC721Receiver(to).onERC721Received(msg.sender, from, id, "") != ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Function for native transfers with contract support and callback data
    function safeTransferFrom(address from, address to, uint256 id, bytes calldata data) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0
                && ERC721Receiver(to).onERC721Received(msg.sender, from, id, data)
                    != ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Internal function for fractional transfers
    function _transfer(address from, address to, uint256 amount) internal returns (bool) {
        uint256 unit = _getUnit();
        uint256 balanceBeforeSender = balanceOf[from];
        uint256 balanceBeforeReceiver = balanceOf[to];

        balanceOf[from] -= amount;

        unchecked {
            balanceOf[to] += amount;
        }

        if (greylistEnabled && (!greylist[from] || !greylist[to])) {
            revert Unauthorized();
        }

        // Skip burn for certain addresses to save gas
        if (!whitelist[from]) {
            uint256 tokens_to_burn = (balanceBeforeSender / unit) - (balanceOf[from] / unit);
            for (uint256 i = 0; i < tokens_to_burn; i++) {
                _burn(from);
            }
        }

        // Skip minting for certain addresses to save gas
        if (!whitelist[to]) {
            uint256 tokens_to_mint = (balanceOf[to] / unit) - (balanceBeforeReceiver / unit);
            for (uint256 i = 0; i < tokens_to_mint; i++) {
                _mint(to);
            }
        }

        emit ERC20Transfer(from, to, amount);
        return true;
    }

    // Internal utility logic
    function _getUnit() internal view returns (uint256) {
        return 10 ** decimals;
    }

    function _mint(address to) internal virtual {
        if (to == address(0)) {
            revert InvalidRecipient();
        }

        unchecked {
            minted++;
        }

        uint256 id = minted;

        if (_ownerOf[id] != address(0)) {
            revert AlreadyExists();
        }

        _ownerOf[id] = to;
        _owned[to].push(id);
        _ownedIndex[id] = _owned[to].length - 1;

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

    function _burn(address from) internal virtual {
        if (from == address(0)) {
            revert InvalidSender();
        }

        uint256 id = _owned[from][_owned[from].length - 1];
        _owned[from].pop();
        delete _ownedIndex[id];
        delete _ownerOf[id];
        delete getApproved[id];

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

    function _setNameSymbol(string memory _name, string memory _symbol) internal {
        name = _name;
        symbol = _symbol;
    }
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

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

        uint256 encodedLen = 4 * ((len + 2) / 3);

        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for { let i := 0 } lt(i, len) { } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

abstract contract Ownable {
    event OwnershipTransferred(address indexed user, address indexed newOwner);

    error Unauthorized();
    error InvalidOwner();

    address public owner;

    modifier onlyOwner() virtual {
        if (msg.sender != owner) revert Unauthorized();

        _;
    }

    constructor(address _owner) {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    function transferOwnership(address _owner) public virtual onlyOwner {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(msg.sender, _owner);
    }

    function revokeOwnership() public virtual onlyOwner {
        owner = address(0);

        emit OwnershipTransferred(msg.sender, address(0));
    }
}

Settings
{
  "remappings": [
    "@forge-std/=lib/forge-std/src/",
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "@solady/=lib/solady/src/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "solady/=lib/solady/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1000000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none",
    "appendCBOR": false
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","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":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"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":"ERC721Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"GARDEN_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeGreylist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"garden","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gardenLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"lockGarden","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","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":"_garden","type":"address"}],"name":"setGarden","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"target","type":"address[]"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setGreylist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60076101c0818152662341453842363160c81b6101e05260c0908152610200828152662344424231383160c81b6102205260e0526102408281526611a29c20a09c9b60c91b61026052610100526102808281526611a3232199219960c91b6102a052610120526102c0828152660234545434641360cc1b6102e052610140526103008281526611a19ca1a220a360c91b6103205261016052610340828152662344354336453160c81b61036052610180526103c0604052610380918252662345414439443960c81b6103a0526101a091909152620000e290600f90600862000bb4565b506040805161012081018252600560e0820181815264536d696c6560d81b61010084015282528251808401845281815264233937bbb760d91b6020828101919091528084019190915283518085018552600a81526948616e646c656261727360b01b8183015283850152835180850185526006808252655a6f6d62696560d01b828401526060850191909152845180860186529283526420b634b2b760d91b83830152608084019290925283518085018552600381526241706560e81b8183015260a0840152835180850190945290835265139bdc9b585b60d21b9083015260c0810191909152620001d990601790600762000c04565b50604080516101408101909152602660e0820181815282916200650c61010084013981526020016040518060600160405280602681526020016200586c6026913981526020016040518060a0016040528060678152602001620055666067913981526020016040518061020001604052806101e081526020016200632c6101e091398152602001604051806101e001604052806101a6815260200162005b426101a691398152602001604051806102600160405280610235815260200162005e796102359139815260408051602081810190925260008152910152620002c490601e90600762000c04565b506040805161014081018252600a610100820190815269334420476c617373657360b01b61012083015281528151808301835260028152612b2960f11b6020828101919091528083019190915282518084018452600c81526b536d616c6c2053686164657360a01b818301528284015282518084018452600981526808af2ca40a0c2e8c6d60bb1b81830152606083015282518084018452600e8082526d436c61737369632053686164657360901b828401526080840191909152835180850185529081526d526567756c61722053686164657360901b8183015260a0830152825180840184526012815271486f726e65642052696d20476c617373657360701b8183015260c0830152825180840190935260048352634e6f6e6560e01b9083015260e0810191909152620003fe90602590600862000bb4565b50604080516101c08101909152608561010082018181528291620054e161012084013981526020016040518060e0016040528060bc81526020016200620460bc913981526020016040518060600160405280603a8152602001620055cd603a913981526020016040518060600160405280603f815260200162005238603f913981526020016040518060e0016040528060a681526020016200516960a69139815260200160405180608001604052806051815260200162005ce86051913981526020016040518060c001604052806086815260200162005900608691398152604080516020818101909252600081529101526200050090602d90600862000bb4565b50604080516102008101825260066101c08201818152654265616e696560d01b6101e0840152825282518084018452600a8082526910dbddd89bde4812185d60b21b6020838101919091528085019290925284518086018652838152654665646f726160d01b818401528486015284518086018652818152690506f6c696365204361760b41b8184015260608501528451808601865292835265446f2d72616760d01b83830152608084019290925283518085018552600b8082526a04b6e6974746564204361760ac1b8284015260a08501919091528451808601865260078082526642616e64616e6160c81b8285015260c086019190915285518087018752848152695065616b205370696b6560b01b8185015260e08601528551808701875260098152682bb4b632102430b4b960b91b81850152610100860152855180870187529384526926b2b9b9bc902430b4b960b11b84840152610120850193909352845180860186529081526a10d85c08119bdc9dd85c9960aa1b8183015261014084015283518085018552600381526204361760ec1b818301526101608401528351808501855291825266151bdc0812185d60ca1b82820152610180830191909152825180840190935260048352634e6f6e6560e01b908301526101a0810191909152620006f390603590600e62000c42565b506040805161030081019091526101166101c082018181528291620053cb6101e084013981526020016040518060a00160405280607a815260200162005a5d607a913981526020016040518060a00160405280606e815260200162005892606e913981526020016040518061018001604052806101568152602001620060ae610156913981526020016040518060c00160405280609c815260200162005277609c9139815260200160405180610100016040528060dc8152602001620066e060dc9139815260200160405180610100016040528060d781526020016200598660d7913981526020016040518060a00160405280606b815260200162005ad7606b913981526020016040518060e0016040528060bf8152602001620057ad60bf91398152602001604051806101e001604052806101ae8152602001620065326101ae913981526020016040518060e0016040528060be8152602001620056ef60be913981526020016040518060a00160405280606c8152602001620062c0606c913981526020016040518060a00160405280606881526020016200568760689139815260408051602081810190925260008152910152620008b890604390600e62000c42565b506040805160e081018252600760a082019081526645617272696e6760c81b60c08301528152815180830183526004808252635661706560e01b6020838101919091528084019290925283518085018552600981526843696761726574746560b81b818401528385015283518085018552818152635069706560e01b81840152606084015283518085019094528352634e6f6e6560e01b9083015260808101919091526200096b90605190600562000c80565b50604080516101008101909152602960a0820181815282916200520f60c084013981526020016040518060a0016040528060808152602001620056076080913981526020016040518060e0016040528060b881526020016200531360b891398152602001604051806101600160405280610140815260200162005d39610140913981526040805160208181019092526000815291015262000a1190605690600562000c80565b5069021e19e0c9bab2400000605b5569021e19e0c9bab2400000605c5534801562000a3b57600080fd5b50604051620067bc380380620067bc83398101604081905262000a5e9162000d38565b604051806040016040528060058152602001642bb7b936bd60d91b815250604051806040016040528060058152602001642ba7a926ad60d91b8152506012614e20848060006001600160a01b0316816001600160a01b03160362000ad5576040516349e27cff60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03831690811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600162000b2c868262000e0f565b50600262000b3b858262000e0f565b5060ff8316608081905262000b5290600a62000ff0565b62000b5e908362001001565b60a05262000b6f42611c206200101b565b600d555050605b546001600160a01b03909416600090815260046020908152604080832096909655600b905293909320805460ff191660011790555062001031915050565b826008810192821562000bf2579160200282015b8281111562000bf2578251829062000be1908262000e0f565b509160200191906001019062000bc8565b5062000c0092915062000cbe565b5090565b826007810192821562000bf2579160200282015b8281111562000bf2578251829062000c31908262000e0f565b509160200191906001019062000c18565b82600e810192821562000bf2579160200282015b8281111562000bf2578251829062000c6f908262000e0f565b509160200191906001019062000c56565b826005810192821562000bf2579160200282015b8281111562000bf2578251829062000cad908262000e0f565b509160200191906001019062000c94565b8082111562000c0057600062000cd5828262000cdf565b5060010162000cbe565b50805462000ced9062000d80565b6000825580601f1062000cfe575050565b601f01602090049060005260206000209081019062000d1e919062000d21565b50565b5b8082111562000c00576000815560010162000d22565b60006020828403121562000d4b57600080fd5b81516001600160a01b038116811462000d6357600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000d9557607f821691505b60208210810362000db657634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000e0a57600081815260208120601f850160051c8101602086101562000de55750805b601f850160051c820191505b8181101562000e065782815560010162000df1565b5050505b505050565b81516001600160401b0381111562000e2b5762000e2b62000d6a565b62000e438162000e3c845462000d80565b8462000dbc565b602080601f83116001811462000e7b576000841562000e625750858301515b600019600386901b1c1916600185901b17855562000e06565b600085815260208120601f198616915b8281101562000eac5788860151825594840194600190910190840162000e8b565b508582101562000ecb5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000f3257816000190482111562000f165762000f1662000edb565b8085161562000f2457918102915b93841c939080029062000ef6565b509250929050565b60008262000f4b5750600162000fea565b8162000f5a5750600062000fea565b816001811462000f73576002811462000f7e5762000f9e565b600191505062000fea565b60ff84111562000f925762000f9262000edb565b50506001821b62000fea565b5060208310610133831016604e8410600b841016171562000fc3575081810a62000fea565b62000fcf838362000ef1565b806000190482111562000fe65762000fe662000edb565b0290505b92915050565b600062000d6360ff84168362000f3a565b808202811582820484141762000fea5762000fea62000edb565b8082018082111562000fea5762000fea62000edb565b60805160a05161410b6200105e60003960006102750152600081816102e201526116f3015261410b6000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063644c43b411610104578063b0d1b56f116100a2578063dd62ed3e11610071578063dd62ed3e14610458578063e985e9c514610483578063f2fde38b146104b1578063fc66ed84146104c457600080fd5b8063b0d1b56f14610417578063b88d4fde1461041f578063bbb1471314610432578063c87b56dd1461044557600080fd5b806395d89b41116100de57806395d89b41146103c65780639b19251a146103ce578063a22cb465146103f1578063a9059cbb1461040457600080fd5b8063644c43b41461037d57806370a08231146103865780638da5cb5b146103a657600080fd5b80632b968958116101715780634f02c4201161014b5780634f02c4201461032957806353d6fd591461033257806356ba88b8146103455780636352211e1461036a57600080fd5b80632b968958146102d5578063313ce567146102dd57806342842e0e1461031657600080fd5b806318160ddd116101ad57806318160ddd146102705780631e6b6ab3146102a55780632311930b146102ba57806323b872dd146102c257600080fd5b806306fdde03146101d4578063081812fc146101f2578063095ea7b31461024d575b600080fd5b6101dc6104d1565b6040516101e99190613050565b60405180910390f35b6102286102003660046130a1565b60066020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e9565b61026061025b3660046130de565b61055f565b60405190151581526020016101e9565b6102977f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016101e9565b6102b86102b3366004613118565b610716565b005b6102b86108a4565b6102b86102d036600461319c565b61091f565b6102b8610e0b565b6103047f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016101e9565b6102b861032436600461319c565b610eb0565b61029760035481565b6102b86103403660046131d8565b610fe9565b605d5461022890610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6102286103783660046130a1565b611090565b610297605c5481565b61029761039436600461320b565b60046020526000908152604090205481565b6000546102289073ffffffffffffffffffffffffffffffffffffffff1681565b6101dc6110f1565b6102606103dc36600461320b565b600b6020526000908152604090205460ff1681565b6102b86103ff3660046131d8565b6110fe565b6102606104123660046130de565b611195565b6102b86111a9565b6102b861042d366004613226565b611227565b61022861044036600461320b565b61134e565b6101dc6104533660046130a1565b611538565b6102976104663660046132c1565b600560209081526000928352604080842090915290825290205481565b6102606104913660046132c1565b600760209081526000928352604080842090915290825290205460ff1681565b6102b86104bf36600461320b565b6115de565b605d546102609060ff1681565b600180546104de906132eb565b80601f016020809104026020016040519081016040528092919081815260200182805461050a906132eb565b80156105575780601f1061052c57610100808354040283529160200191610557565b820191906000526020600020905b81548152906001019060200180831161053a57829003601f168201915b505050505081565b600060035482111580156105735750600082115b156106a35760008281526008602052604090205473ffffffffffffffffffffffffffffffffffffffff163381148015906105de575073ffffffffffffffffffffffffffffffffffffffff8116600090815260076020908152604080832033845290915290205460ff16155b15610615576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526006602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35061070c565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610767576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42600d54116107d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f677265796c697374206f7665720000000000000000000000000000000000000060448201526064015b60405180910390fd5b600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560005b8281101561089e5781600c60008686858181106108245761082461333e565b9050602002016020810190610839919061320b565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055806108968161339c565b915050610805565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108f5576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6003548111610d645760008181526008602052604090205473ffffffffffffffffffffffffffffffffffffffff848116911614610988576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166109d5576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff841614801590610a2c575073ffffffffffffffffffffffffffffffffffffffff8316600090815260076020908152604080832033845290915290205460ff16155b8015610a5c575060008181526006602052604090205473ffffffffffffffffffffffffffffffffffffffff163314155b15610a93576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a9b6116ec565b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602052604081208054909190610ad09084906133d4565b90915550610ade90506116ec565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260046020908152604080832080549096019095558582526008815284822080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690941790556006815284822080549093169092559186168252600990529081208054610b6d906001906133d4565b81548110610b7d57610b7d61333e565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff87168352600982526040808420868552600a90935290922054815492935083928110610bce57610bce61333e565b600091825260208083209091019290925573ffffffffffffffffffffffffffffffffffffffff86168152600990915260409020805480610c1057610c106133e7565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908101839055909201909255838252600a81526040808320548484528184205573ffffffffffffffffffffffffffffffffffffffff8616808452600983529083208054600181810183558286529385200186905592529054610c9f91906133d4565b6000838152600a6020526040808220929092559051839173ffffffffffffffffffffffffffffffffffffffff80871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487610d4d6116ec565b60405190815260200160405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526005602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df857610dc682826133d4565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602090815260408083203384529091529020555b610e0384848461171e565b50505b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b610ebb83838361091f565b73ffffffffffffffffffffffffffffffffffffffff82163b15801590610fb257506040517f150b7a020000000000000000000000000000000000000000000000000000000080825233600483015273ffffffffffffffffffffffffffffffffffffffff858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610f69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8d9190613416565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b15610e06576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461103a576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60008181526008602052604090205473ffffffffffffffffffffffffffffffffffffffff16806110ec576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600280546104de906132eb565b33600081815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60006111a233848461171e565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111fa576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b605d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b61123285858561091f565b73ffffffffffffffffffffffffffffffffffffffff84163b1580159061131757506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff86169063150b7a02906112af9033908a90899089908990600401613458565b6020604051808303816000875af11580156112ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f29190613416565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b15610e03576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1633146113a0576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b605d5460ff161561140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f67617264656e206c6f636b65642100000000000000000000000000000000000060448201526064016107ce565b605d54610100900473ffffffffffffffffffffffffffffffffffffffff161561149e57605d805473ffffffffffffffffffffffffffffffffffffffff61010091829004811660009081526004602090815260408083208390559454939093049091168152600b9091522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b50605d805473ffffffffffffffffffffffffffffffffffffffff9283166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9093169290921783556000908152600b6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055605c546004909252909120559054041690565b60606000611545836119f1565b9050600061159561155585611a9e565b61155e84611bdb565b61156f61156a8661214c565b6125d8565b604051602001611581939291906134d7565b6040516020818303038152906040526125d8565b9050806040516020016115a89190613685565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461162f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811661167c576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b60006117197f0000000000000000000000000000000000000000000000000000000000000000600a6137ea565b905090565b6000806117296116ec565b73ffffffffffffffffffffffffffffffffffffffff8087166000818152600460205260408082208054948a168352908220549282529394509192909186919061177283866133d4565b909155505073ffffffffffffffffffffffffffffffffffffffff86166000908152600460205260409020805486019055600e5460ff16801561180a575073ffffffffffffffffffffffffffffffffffffffff87166000908152600c602052604090205460ff16158061180a575073ffffffffffffffffffffffffffffffffffffffff86166000908152600c602052604090205460ff16155b15611841576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152600b602052604090205460ff166118de5773ffffffffffffffffffffffffffffffffffffffff871660009081526004602052604081205461189f908590613828565b6118a98585613828565b6118b391906133d4565b905060005b818110156118db576118c9896127b5565b806118d38161339c565b9150506118b8565b50505b73ffffffffffffffffffffffffffffffffffffffff86166000908152600b602052604090205460ff1661197d5760006119178483613828565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260046020526040902054611948908690613828565b61195291906133d4565b905060005b8181101561197a576119688861296d565b806119728161339c565b915050611957565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487876040516119dc91815260200190565b60405180910390a35060019695505050505050565b611a236040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b611a556040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b611a5e83612af6565b8152611a6983612beb565b6020820152611a7783612ca4565b6040820152611a8583612d8a565b6060820152611a9383612f07565b608082015292915050565b606081600003611ae157505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611b0b5780611af58161339c565b9150611b049050600a83613828565b9150611ae5565b60008167ffffffffffffffff811115611b2657611b2661383c565b6040519080825280601f01601f191660200182016040528015611b50576020820181803683370190505b5090505b8415611bd357611b656001836133d4565b9150611b72600a8661386b565b611b7d90603061387f565b60f81b818381518110611b9257611b9261333e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611bcc600a86613828565b9450611b54565b949350505050565b6060611be5612fe9565b6040518060600160405280603181526020016140276031913981526020830151600303611c2b57604051806060016040528060348152602001613cd96034913960208201525b8260200151600403611c56576040518060600160405280603281526020016140586032913960408201525b8260200151600503611c81576040518060600160405280602e81526020016140dd602e913960608201525b600383602001511080611c98575060058360200151115b15611dc7576040518060600160405280602b81526020016140b2602b91396080820152602083015160179060078110611cd357611cd361333e565b018054611cdf906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0b906132eb565b8015611d585780601f10611d2d57610100808354040283529160200191611d58565b820191906000526020600020905b815481529060010190602001808311611d3b57829003601f168201915b505050505081600560148110611d7057611d7061333e565b60200201819052506040518060400160405280600381526020017f227d2c000000000000000000000000000000000000000000000000000000000081525081600660148110611dc157611dc161333e565b60200201525b604051806060016040528060248152602001613cb56024913960e0820152604083015160259060088110611dfd57611dfd61333e565b018054611e09906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611e35906132eb565b8015611e825780601f10611e5757610100808354040283529160200191611e82565b820191906000526020600020905b815481529060010190602001808311611e6557829003601f168201915b505050505081600860148110611e9a57611e9a61333e565b602002018190525060405180606001604052806028815260200161408a602891396101208201526060830151603590600e8110611ed957611ed961333e565b018054611ee5906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611f11906132eb565b8015611f5e5780601f10611f3357610100808354040283529160200191611f5e565b820191906000526020600020905b815481529060010190602001808311611f4157829003601f168201915b505050505081600a60148110611f7657611f7661333e565b6020020181905250604051806060016040528060298152602001613bfd60299139610160820152608083015160519060058110611fb557611fb561333e565b018054611fc1906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611fed906132eb565b801561203a5780601f1061200f5761010080835404028352916020019161203a565b820191906000526020600020905b81548152906001019060200180831161201d57829003601f168201915b505050505081600c601481106120525761205261333e565b60200201819052506040518060400160405280600581526020017f227d5d2c2000000000000000000000000000000000000000000000000000000081525081600d601481106120a3576120a361333e565b602090810291909101919091528151828201516040808501516060860151608087015160a088015160c089015160e08a015195516000996120e79998979101613892565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290526101008401516101208501516101408601516101608701516101808801516101a08901519597506115a896889690602001613937565b6060612156613011565b6040518060c00160405280608f8152602001613c26608f9139815260408051808201909152600c81527f3c706174682066696c6c3d220000000000000000000000000000000000000000602082015281600160200201528251600f90600881106121c2576121c261333e565b0180546121ce906132eb565b80601f01602080910402602001604051908101604052809291908181526020018280546121fa906132eb565b80156122475780601f1061221c57610100808354040283529160200191612247565b820191906000526020600020905b81548152906001019060200180831161222a57829003601f168201915b50505050508160026009811061225f5761225f61333e565b6020020181905250604051806102e001604052806102a58152602001613d0d6102a5913960608201526020830151601e90600781106122a0576122a061333e565b0180546122ac906132eb565b80601f01602080910402602001604051908101604052809291908181526020018280546122d8906132eb565b80156123255780601f106122fa57610100808354040283529160200191612325565b820191906000526020600020905b81548152906001019060200180831161230857829003601f168201915b50505050508160046009811061233d5761233d61333e565b60200201526040830151602d906008811061235a5761235a61333e565b018054612366906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054612392906132eb565b80156123df5780601f106123b4576101008083540402835291602001916123df565b820191906000526020600020905b8154815290600101906020018083116123c257829003601f168201915b5050505050816005600981106123f7576123f761333e565b60200201526060830151604390600e81106124145761241461333e565b018054612420906132eb565b80601f016020809104026020016040519081016040528092919081815260200182805461244c906132eb565b80156124995780601f1061246e57610100808354040283529160200191612499565b820191906000526020600020905b81548152906001019060200180831161247c57829003601f168201915b5050505050816006600981106124b1576124b161333e565b60200201526080830151605690600581106124ce576124ce61333e565b0180546124da906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054612506906132eb565b80156125535780601f1061252857610100808354040283529160200191612553565b820191906000526020600020905b81548152906001019060200180831161253657829003601f168201915b50505050508160076009811061256b5761256b61333e565b6020020181905250604051806060016040528060358152602001613fb260359139610100820181905281516020808401516040808601516060870151608088015160a089015160c08a015160e08b0151955160009a6115a89a9996979596949593949293929091016139c9565b805160609060008190036125fc575050604080516020810190915260008152919050565b6000600361260b83600261387f565b6126159190613828565b612620906004613a8a565b9050600061262f82602061387f565b67ffffffffffffffff8111156126475761264761383c565b6040519080825280601f01601f191660200182016040528015612671576020820181803683370190505b5090506000604051806060016040528060408152602001613fe7604091399050600181016020830160005b868110156126fd576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b83526004909201910161269c565b5060038606600181146127175760028114612761576127a7565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8301526127a7565b7f3d000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301525b505050918152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116612802576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604081208054612835906001906133d4565b815481106128455761284561333e565b90600052602060002001549050600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806128a0576128a06133e7565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908101839055909201909255828252600a815260408083208390556008825280832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909155600690925280832080549092169091555182919073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b73ffffffffffffffffffffffffffffffffffffffff81166129ba576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001019081905560008181526008602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612a21576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260086020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8716908117909155808452600983529083208054600181810183558286529385200185905592529054612a9e91906133d4565b6000828152600a6020526040808220929092559051829173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080612b29612b0584611a9e565b604051602001612b159190613aa1565b604051602081830303815290604052612f9a565b90506000612b38604f8361386b565b90506000600a8210158015612b4d5750601482105b15612b56575060015b60148210158015612b675750601e82105b15612b70575060025b601e8210158015612b815750602882105b15612b8a575060035b60288210158015612b9b5750603282105b15612ba4575060045b60328210158015612bb55750603c82105b15612bbe575060055b603c8210158015612bcf5750604682105b15612bd8575060065b60468210611bd357506007949350505050565b600080612c0a612bfa84611a9e565b604051602001612b159190613ae6565b90506000612c1960aa8361386b565b90506000602e8210158015612c2e5750604082105b15612c37575060015b60408210158015612c485750605182105b15612c51575060025b60518210158015612c625750605582105b15612c6b575060035b81605503612c77575060045b60568210158015612c885750605882105b15612c91575060055b60588210611bd357506006949350505050565b600080612cc3612cb384611a9e565b604051602001612b159190613b2b565b90506000612cd36101f48361386b565b9050600060298210158015612ce85750605182105b15612cf1575060015b60518210158015612d025750607982105b15612d0b575060025b60798210158015612d1c575060a182105b15612d25575060035b60a18210158015612d36575060c982105b15612d3f575060045b60c98210158015612d51575061010582105b15612d5a575060055b6101058210158015612d6d575061011982105b15612d76575060065b6101198210611bd357506007949350505050565b600080612da9612d9984611a9e565b604051602001612b159190613b63565b90506000612db860f08361386b565b90506000600a8210158015612dcd5750601482105b15612dd6575060015b60148210158015612de75750601e82105b15612df0575060025b601e8210158015612e015750602882105b15612e0a575060035b60288210158015612e1b5750603282105b15612e24575060045b60328210158015612e355750603c82105b15612e3e575060055b603c8210158015612e4f5750604682105b15612e58575060065b60468210158015612e695750605082105b15612e72575060075b60508210158015612e835750605a82105b15612e8c575060085b605a8210158015612e9d5750606482105b15612ea6575060095b60648210158015612eb75750606e82105b15612ec05750600a5b606e8210158015612ed15750607882105b15612eda5750600b5b60788210158015612eeb5750608282105b15612ef45750600c5b60828210611bd35750600d949350505050565b600080612f26612f1684611a9e565b604051602001612b159190613b9b565b90506000612f3560788361386b565b90506000600a8210158015612f4a5750601482105b15612f53575060015b60148210158015612f645750601e82105b15612f6d575060025b601e8210158015612f7e5750602882105b15612f87575060035b60288210611bd357506004949350505050565b600081604051602001612fad9190613be0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012092915050565b6040518061028001604052806014905b6060815260200190600190039081612ff95790505090565b60408051610120810190915260608152600860208201612ff9565b60005b8381101561304757818101518382015260200161302f565b50506000910152565b602081526000825180602084015261306f81604085016020870161302c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000602082840312156130b357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146110ec57600080fd5b600080604083850312156130f157600080fd5b6130fa836130ba565b946020939093013593505050565b803580151581146110ec57600080fd5b60008060006040848603121561312d57600080fd5b833567ffffffffffffffff8082111561314557600080fd5b818601915086601f83011261315957600080fd5b81358181111561316857600080fd5b8760208260051b850101111561317d57600080fd5b6020928301955093506131939186019050613108565b90509250925092565b6000806000606084860312156131b157600080fd5b6131ba846130ba565b92506131c8602085016130ba565b9150604084013590509250925092565b600080604083850312156131eb57600080fd5b6131f4836130ba565b915061320260208401613108565b90509250929050565b60006020828403121561321d57600080fd5b6111a2826130ba565b60008060008060006080868803121561323e57600080fd5b613247866130ba565b9450613255602087016130ba565b935060408601359250606086013567ffffffffffffffff8082111561327957600080fd5b818801915088601f83011261328d57600080fd5b81358181111561329c57600080fd5b8960208285010111156132ae57600080fd5b9699959850939650602001949392505050565b600080604083850312156132d457600080fd5b6132dd836130ba565b9150613202602084016130ba565b600181811c908216806132ff57607f821691505b602082108103613338577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036133cd576133cd61336d565b5060010190565b818103818111156107105761071061336d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006020828403121561342857600080fd5b81517fffffffff00000000000000000000000000000000000000000000000000000000811681146111a257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011683010190509695505050505050565b7f7b226e616d65223a2022576f726d7a202300000000000000000000000000000081526000845161350f81601185016020890161302c565b7f222c20226465736372697074696f6e223a2022412066756c6c79206f6e2d63686011918401918201527f61696e2067616d65207574696c6973696e672074686520657870657269656d6560318201527f6e74616c20746f6b656e207374616e646172642c204552432d3430342077686960518201527f636820656e61626c65732070657273697374656e74206c69717569646974792060718201527f616e642073656d692d66756e676962696c6974792e2200000000000000000000609182015284516135e48160a784016020890161302c565b7f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b62617360a792909101918201527f6536342c0000000000000000000000000000000000000000000000000000000060c782015283516136488160cb84016020880161302c565b61367a60cb828401017f227d000000000000000000000000000000000000000000000000000000000000815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516136bd81601d85016020870161302c565b91909101601d0192915050565b600181815b8085111561372357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156137095761370961336d565b8085161561371657918102915b93841c93908002906136cf565b509250929050565b60008261373a57506001610710565b8161374757506000610710565b816001811461375d576002811461376757613783565b6001915050610710565b60ff8411156137785761377861336d565b50506001821b610710565b5060208310610133831016604e8410600b84101617156137a6575081810a610710565b6137b083836136ca565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156137e2576137e261336d565b029392505050565b60006111a260ff84168361372b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613837576138376137f9565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008261387a5761387a6137f9565b500690565b808201808211156107105761071061336d565b6000895160206138a58285838f0161302c565b8a51918401916138b88184848f0161302c565b8a519201916138ca8184848e0161302c565b89519201916138dc8184848d0161302c565b88519201916138ee8184848c0161302c565b87519201916139008184848b0161302c565b86519201916139128184848a0161302c565b8551920191613924818484890161302c565b919091019b9a5050505050505050505050565b60008851602061394a8285838e0161302c565b89519184019161395d8184848e0161302c565b895192019161396f8184848d0161302c565b88519201916139818184848c0161302c565b87519201916139938184848b0161302c565b86519201916139a58184848a0161302c565b85519201916139b7818484890161302c565b919091019a9950505050505050505050565b60008a516139db818460208f0161302c565b8a516139ed8183860160208f0161302c565b8a519184010190613a02818360208e0161302c565b8951613a148183850160208e0161302c565b8951929091010190613a2a818360208c0161302c565b8751613a3c8183850160208c0161302c565b8751929091010190613a52818360208a0161302c565b8551613a648183850160208a0161302c565b8551929091010190613a7a81836020880161302c565b019b9a5050505050505050505050565b80820281158282048414176107105761071061336d565b7f4241534520434f4c4f5200000000000000000000000000000000000000000000815260008251613ad981600a85016020870161302c565b91909101600a0192915050565b7f4c41594552205448524545000000000000000000000000000000000000000000815260008251613b1e81600b85016020870161302c565b91909101600b0192915050565b7f4c4159455220464f555200000000000000000000000000000000000000000000815260008251613ad981600a85016020870161302c565b7f4c41594552204649564500000000000000000000000000000000000000000000815260008251613ad981600a85016020870161302c565b7f4c41594552205349580000000000000000000000000000000000000000000000815260008251613bd381600985016020870161302c565b9190910160090192915050565b60008251613bf281846020870161302c565b919091019291505056fe227d2c207b2274726169745f74797065223a20224163636573736f7279222c2276616c7565223a20223c7376672069643d22782220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d22302030203330203330223e3c706174682066696c6c3d22233633383539362220643d224d30203068333076333048307a222f3e207b2274726169745f74797065223a202245796577656172222c2276616c7565223a20225a6f6d626965227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a20225a6f6d626965227d2c2220643d224d3232203130763132682d327632682d3176314835762d316831762d316831762d316831762d316831762d316832762d316832762d396831563968325638682d31563768337631683176316832763168317a222f3e3c706174682066696c6c3d22233030302220643d224d342032347632683136762d32682d3176314835762d3148347a4d36203233483576316831762d317a4d37203232483676316831762d317a4d38203231483776316831762d317a4d39203230483876316831762d317a4d3131203139483976316832762d317a4d31322031307638682d3176316832762d39682d317a4d31342031305639682d31763168317a4d313520385637682d31763268325638682d317a4d31382036682d337631683356367a4d31392037682d317631683156377a4d32312038682d327631683256387a4d32332032325639682d327631683176313268317a4d3231203234762d316831762d31682d32763268317a4d313520313368317631682d31762d317a4d323020313368317631682d31762d317a4d313820313568327631682d32762d317a4d313720313868337631682d33762d317a222f3e3c706174682066696c6c3d2223303030222066696c6c2d6f7061636974793d222e322220643d224d3137203133682d3176316831762d317a4d3232203133682d3176316831762d317a222f3e3c706174682066696c6c3d2223303030222066696c6c2d6f7061636974793d222e342220643d224d3137203132682d3276316832762d317a4d323020313276316832762d31682d327a4d3232203231682d397631683176316836762d316832762d317a4d3132203139682d3176366832762d31682d31762d357a4d3130203235762d354839763568317a4d38203235762d334837763368317a4d36203234483576316831762d317a222f3e3c7374796c653e23787b73686170652d72656e646572696e673a20637269737065646765733b7d3c2f7374796c653e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f2c202261747472696275746573223a205b7b2274726169745f74797065223a202254797065222c2276616c7565223a2022416c69656e227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a2022416c69656e227d2c227d2c207b2274726169745f74797065223a20224865616477656172222c2276616c7565223a20224e6f726d616c227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a2022417065227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a2022417065227d2c3c70617468207374726f6b653d22233030302220643d224d31332031312e3568396d2d37203368326d2e352d2e35762d326d32203076326d2e352e3568326d2d372e352d2e35762d32222f3e3c70617468207374726f6b653d22233543333930462220643d224d31352031322e3568326d3320306832222f3e3c70617468207374726f6b653d22234337373531342220643d224d31352031332e3568326d3320306832222f3e3c706174682066696c6c3d22234646443932362220643d224d313220313468317631682d317a222f3e3c706174682066696c6c3d22233030302220643d224d313320313168397631682d347632682d317631682d32762d31682d31762d32682d31762d317a222f3e3c706174682066696c6c3d22233443344334432220643d224d3133203768397634682d397a222f3e3c706174682066696c6c3d22233030302220643d224d3133203130682d31563868315637683156366837763168327632682d315638682d315637682d377631682d3176327a222f3e3c70617468207374726f6b653d22233633363336332220643d224d313420392e3568316d302d316831222f3e3c70617468207374726f6b653d22233030302220643d224d32302031372e3568376d312031682d316d302031682d37222f3e3c70617468207374726f6b653d22234437443144312220643d224d32302031382e356836222f3e3c70617468207374726f6b653d22234537413630302220643d224d32362031382e356831222f3e3c706174682066696c6c3d2223666666222066696c6c2d6f7061636974793d222e342220643d224d323620313168317635682d317a222f3e3c706174682066696c6c3d22233343433330302220643d224d313420313068377631682d377a222f3e3c706174682066696c6c3d22233030363043332220643d224d313620367634682d345638683156376831563668327a222f3e3c706174682066696c6c3d22234436303430342220643d224d31392036763468345638682d315637682d315636682d327a222f3e3c706174682066696c6c3d22234534454231372220643d224d313420396831563868315636683376326831763168317631682d3756397a222f3e3c706174682066696c6c3d22233030302220643d224d3137203568317631682d317a222f3e3c706174682066696c6c3d22233030363043332220643d224d3135203468357631682d357a222f3e3c706174682066696c6c3d22234630463046302220643d224d31322031316831317634682d39762d33682d32762d317a222f3e3c706174682066696c6c3d22234644333233322220643d224d313920313268337632682d337a222f3e3c706174682066696c6c3d22233332384446442220643d224d313520313268337632682d337a222f3e3c70617468207374726f6b653d22234136364532432220643d224d31362e35203230762d326d332e352d2e35682d336d332e352e357632222f3e3c70617468207374726f6b653d22234332383934362220643d224d31362031372e3568316d3320306831222f3e3c706174682066696c6c3d22233030302220643d224d3133203133762d3168397633682d32762d32682d337632682d32762d32682d327a222f3e3c70617468207374726f6b653d22233030302220643d224d32302031372e3568376d312031682d316d302031682d37222f3e3c70617468207374726f6b653d22233539353935392220643d224d32302031382e356836222f3e3c70617468207374726f6b653d22233030343046462220643d224d32362031382e356831222f3e3c706174682066696c6c3d22233030302220643d224d313320326839763168317635683176316831763148313056396831563868315633683156327a222f3e3c706174682066696c6c3d22234443314431442220643d224d3132203768313176314831327a222f3e3c706174682066696c6c3d22233531353135312220643d224d3133203668397634682d3956367a222f3e3c70617468207374726f6b653d22233030302220643d224d31322031302e356831322e3556396d2d2e352d2e35682d386d302031682d316d382d32682d316d302d31682d316d302d31682d376d302031682d316d2d2e352e357633222f3e3c70617468207374726f6b653d22233335333533352220643d224d323420392e35682d386d2d312d33682d316d302031682d31222f3e3c70617468207374726f6b653d22233030302220643d224d313220342e3568326d34203068356d2d3134203168316d3220306831306d32203068326d2d313720316831366d2d313620316831376d2d313620316831356d2d3136203168396d32203068356d2d3137203168376d32203068326d32203068336d2d3134203168346d39203068326d2d3136203168356d39203068326d2d3136203168316d31203068336d392e352d2e3576324d31302031342e3568346d2d3420316832222f3e3c706174682066696c6c3d22233030302220643d224d313620313968317631682d317a222f3e3c706174682066696c6c3d22233344324631452220643d224d392039683156386833563668315634683156336835763168317632683176326833763168317631483956397a222f3e3c706174682066696c6c3d22233030302220643d224d3132203768313176314831327a222f3e3c706174682066696c6c3d2223666666222066696c6c2d6f7061636974793d222e352220643d224d313420313268337633682d337a4d313920313268337633682d337a222f3e3c706174682066696c6c3d22233030302220643d224d31332031316831317632682d31762d31682d347631682d32762d31682d337631682d31762d327a222f3e3c706174682066696c6c3d22233141343343382220643d224d313320376839763348313076334839762d3348385639683556377a222f3e3c70617468207374726f6b653d22233136333741342220643d224d323220392e35682d316d302031682d336d302d31682d346d382e352d2e3556376d2d2e352d2e35682d386d302031682d316d302031682d316d302031682d316d302031682d316d302d314839222f3e3c70617468207374726f6b653d22233134324337432220643d224d31312031312e35682d316d322d31682d316d322d31682d31222f3e3c706174682066696c6c3d22233739344231312220643d224d382037683176316834563468315633683276316833563368327631683176346834563768317632682d31763148395639483856377a222f3e3c706174682066696c6c3d22233530324630352220643d224d3132203768313176314831327a222f3e3c706174682066696c6c3d22233030302220643d224d3134203756356831563468317631683156346831763168315634683176316831763268317632682d337631682d317631682d31762d31682d315639682d33563768317a4d31322039763168315639682d317a222f3e3c706174682066696c6c3d22234338464246422220643d224d3232203130763132682d327632682d3176314835762d316831762d316831762d316831762d316831762d316832762d316832762d396831563968325638682d31563768337631683176316832763168317a222f3e3c70617468207374726f6b653d22233735424442442220643d224d31352e3520313276316d352d317631222f3e3c706174682066696c6c3d22233030302220643d224d3231203139762d31682d35763168357a4d31352031336831762d3168317631682d317631682d31762d317a4d323120313268317631682d317631682d31762d316831762d317a222f3e3c706174682066696c6c3d22233942453045302220643d224d3232203231682d397631683176316836762d316832762d317a4d3132203139682d3176366832762d31682d31762d357a4d3130203235762d354839763568317a4d38203235762d334837763368317a4d36203234483576316831762d317a4d3137203133682d3176316831762d317a4d3232203133682d3176316831762d317a4d3139203134682d3176336831762d337a222f3e3c706174682066696c6c3d22233030302220643d224d31332031326831317632682d317631682d32762d31682d31762d31682d327631682d317631682d32762d31682d31762d31682d31762d317a222f3e3c70617468207374726f6b653d22233030302220643d224d32302031382e3568316d30203168316d30203168316d30203168312e35762d3268345632326d2d31203076316d2d2e352e35682d346d302d31682d316d302d31682d316d302d31682d316d302d31682d31222f3e3c70617468207374726f6b653d22233835353131342220643d224d32302031392e3568316d30203168316d30203168316d30203168336d2d312d3268336d2d3220316831222f3e3c70617468207374726f6b653d22233638334330382220643d224d32352032312e3568316d30203168316d302d316831222f3e3c70617468207374726f6b653d222366666622207374726f6b652d6f7061636974793d222e342220643d224d32362e3520313276312e356d3020304832356d312e3520304832384d32362e3520313576316d3020317631222f3e3c706174682066696c6c3d22233631353033442220643d224d3232203130763132682d327632682d3176314835762d316831762d316831762d316831762d316831762d316832762d316832762d396831563968325638682d31563768337631683176316832763168317a222f3e3c706174682066696c6c3d222339353841374422207374726f6b653d22233935384137442220643d224d31362e352031392e35762d31682d31762d316831762d32682d31762d31682d31762d336832762d316833763168327634682d31763268317631682d317631682d347a222f3e3c706174682066696c6c3d2223303030222066696c6c2d6f7061636974793d222e342220643d224d3137203132682d3276316832762d317a4d323020313276316832762d31682d327a4d3232203231682d397631683176316836762d316832762d317a4d3132203139682d3176366832762d31682d31762d357a4d3130203235762d354839763568317a4d38203235762d334837763368317a4d36203234483576316831762d317a222f3e3c706174682066696c6c3d22233030302220643d224d3136203133682d3176316831762d317a4d3231203133682d3176316831762d317a4d3138203136762d31682d31763168317a4d313720313876316833762d31682d337a4d31392e373234203136762d31682d31763168317a222f3e3c706174682066696c6c3d22234141413139372220643d224d3137203134682d31762d31683176317a4d3232203134682d31762d31683176317a222f3e3c706174682066696c6c3d22233236333134412220643d224d3132203568313176354831327a222f3e3c70617468207374726f6b653d22236666662220643d224d313320382e3568316d31203068316d31203068316d31203068316d3120306831222f3e3c70617468207374726f6b653d22234646443830302220643d224d313720362e356831222f3e3c706174682066696c6c3d2223303030222066696c6c2d72756c653d226576656e6f64642220643d224d323320365635682d345634682d337631682d347631682d317632683176326833763168395639682d31563868315636682d317a6d302030682d345635682d337631682d34763268317631683156386831763268385639682d315638683156367a6d2d37203368315638682d3176317a6d32203068315638682d3176317a6d32203068315638682d3176317a2220636c69702d72756c653d226576656e6f6464222f3e3c706174682066696c6c3d22234234423442342220643d224d313420313168397634682d397a222f3e3c70617468207374726f6b653d22233030302220643d224d31342031352e3568386d2d382d3568384d31332e3520313476316d31302d3476346d2d31302d3476316d32202e3576316836762d31682d367a222f3e3c70617468207374726f6b653d22233844384438442220643d224d31332e3520313276326d31203076316d302d3476316d382d3176316d3020327631222f3e3c706174682066696c6c3d22233831313942372220643d224d3132203768315636683156356837763168317632683376316831763148313256377a222f3e3c70617468207374726f6b653d22234232363144432220643d224d323120372e35682d316d302d31682d31222f3e3c706174682066696c6c3d22233744413236392220643d224d3232203130763132682d327632682d3176314835762d316831762d316831762d316831762d316831762d316832762d316832762d396831563968325638682d31563768337631683176316832763168317a222f3e3c706174682066696c6c3d2223303030222066696c6c2d6f7061636974793d222e342220643d224d3137203132682d3276316832762d317a4d323020313276316832762d31682d327a4d3232203231682d397631683176316836762d316832762d317a4d3132203139682d3176366832762d31682d31762d357a4d3130203235762d354839763568317a4d38203235762d334837763368317a4d36203234483576316831762d317a4d3136203134682d3176316831762d317a4d3231203134682d3176316831762d317a4d3138203139682d3176316831762d317a222f3e3c706174682066696c6c3d227265642220643d224d313520313368317631682d31762d317a4d323020313368317631682d31762d317a222f3e3c706174682066696c6c3d22233030302220643d224d3137203133682d3176316831762d317a4d3232203133682d3176316831762d317a4d3230203136762d31682d32763168327a4d313720313876316833762d31682d337a222f3e3c706174682066696c6c3d22233030302220643d224d313620313768317631682d317a222f3e3c706174682066696c6c3d22233030302220643d224d313420313168317631682d317a4d313520313068317631682d317a4d3138203968317633682d317a4d3132203968367631682d367a4d313320313068317631682d317a4d313120313068317631682d317a4d3131203868337631682d337a4d3132203768327631682d327a4d3133203668327631682d327a4d3134203568367631682d367a4d3231203568317632682d317a4d3231203768337631682d337a4d323120313068337631682d337a4d3230203868337632682d337a4d3135203768347632682d347a222f3e3c706174682066696c6c3d22233030302220643d224d3137203668347632682d347a222f3e3c706174682066696c6c3d22233030302220643d224d3134203668347633682d347a222f3e3c70617468207374726f6b653d22233030302220643d224d313420352e3568366d31203068316d2d39203168396d2d313020316831326d2d3133203168386d31203068336d2d3131203168376d31203068336d2d3132203168316d31203068316d31203068316d2d32203168316d332e352d312e3576326d322e352d312e356833222f3e3c706174682066696c6c3d22234341344531312220643d224d31342037682d31763368395637682d315636682d3776317a222f3e3c706174682066696c6c3d22233933333730392220643d224d313220386831317632682d315639682d317631682d315639682d317631682d315639682d317631682d315639682d317631682d315639682d317631682d3156387a222f3e3c70617468207374726f6b653d22233030302220643d224d31312e3520313056386d31203056376d31203056366d2e352d2e3568376d2e352e3576316d31203076316d3120307632222f3e000000000000000000000000b680082e0424ec0818b4201d0cc3e59378915d9d

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063644c43b411610104578063b0d1b56f116100a2578063dd62ed3e11610071578063dd62ed3e14610458578063e985e9c514610483578063f2fde38b146104b1578063fc66ed84146104c457600080fd5b8063b0d1b56f14610417578063b88d4fde1461041f578063bbb1471314610432578063c87b56dd1461044557600080fd5b806395d89b41116100de57806395d89b41146103c65780639b19251a146103ce578063a22cb465146103f1578063a9059cbb1461040457600080fd5b8063644c43b41461037d57806370a08231146103865780638da5cb5b146103a657600080fd5b80632b968958116101715780634f02c4201161014b5780634f02c4201461032957806353d6fd591461033257806356ba88b8146103455780636352211e1461036a57600080fd5b80632b968958146102d5578063313ce567146102dd57806342842e0e1461031657600080fd5b806318160ddd116101ad57806318160ddd146102705780631e6b6ab3146102a55780632311930b146102ba57806323b872dd146102c257600080fd5b806306fdde03146101d4578063081812fc146101f2578063095ea7b31461024d575b600080fd5b6101dc6104d1565b6040516101e99190613050565b60405180910390f35b6102286102003660046130a1565b60066020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e9565b61026061025b3660046130de565b61055f565b60405190151581526020016101e9565b6102977f00000000000000000000000000000000000000000000043c33c193756480000081565b6040519081526020016101e9565b6102b86102b3366004613118565b610716565b005b6102b86108a4565b6102b86102d036600461319c565b61091f565b6102b8610e0b565b6103047f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff90911681526020016101e9565b6102b861032436600461319c565b610eb0565b61029760035481565b6102b86103403660046131d8565b610fe9565b605d5461022890610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6102286103783660046130a1565b611090565b610297605c5481565b61029761039436600461320b565b60046020526000908152604090205481565b6000546102289073ffffffffffffffffffffffffffffffffffffffff1681565b6101dc6110f1565b6102606103dc36600461320b565b600b6020526000908152604090205460ff1681565b6102b86103ff3660046131d8565b6110fe565b6102606104123660046130de565b611195565b6102b86111a9565b6102b861042d366004613226565b611227565b61022861044036600461320b565b61134e565b6101dc6104533660046130a1565b611538565b6102976104663660046132c1565b600560209081526000928352604080842090915290825290205481565b6102606104913660046132c1565b600760209081526000928352604080842090915290825290205460ff1681565b6102b86104bf36600461320b565b6115de565b605d546102609060ff1681565b600180546104de906132eb565b80601f016020809104026020016040519081016040528092919081815260200182805461050a906132eb565b80156105575780601f1061052c57610100808354040283529160200191610557565b820191906000526020600020905b81548152906001019060200180831161053a57829003601f168201915b505050505081565b600060035482111580156105735750600082115b156106a35760008281526008602052604090205473ffffffffffffffffffffffffffffffffffffffff163381148015906105de575073ffffffffffffffffffffffffffffffffffffffff8116600090815260076020908152604080832033845290915290205460ff16155b15610615576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526006602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35061070c565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610767576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42600d54116107d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f677265796c697374206f7665720000000000000000000000000000000000000060448201526064015b60405180910390fd5b600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560005b8281101561089e5781600c60008686858181106108245761082461333e565b9050602002016020810190610839919061320b565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055806108968161339c565b915050610805565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108f5576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6003548111610d645760008181526008602052604090205473ffffffffffffffffffffffffffffffffffffffff848116911614610988576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166109d5576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff841614801590610a2c575073ffffffffffffffffffffffffffffffffffffffff8316600090815260076020908152604080832033845290915290205460ff16155b8015610a5c575060008181526006602052604090205473ffffffffffffffffffffffffffffffffffffffff163314155b15610a93576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a9b6116ec565b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602052604081208054909190610ad09084906133d4565b90915550610ade90506116ec565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260046020908152604080832080549096019095558582526008815284822080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690941790556006815284822080549093169092559186168252600990529081208054610b6d906001906133d4565b81548110610b7d57610b7d61333e565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff87168352600982526040808420868552600a90935290922054815492935083928110610bce57610bce61333e565b600091825260208083209091019290925573ffffffffffffffffffffffffffffffffffffffff86168152600990915260409020805480610c1057610c106133e7565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908101839055909201909255838252600a81526040808320548484528184205573ffffffffffffffffffffffffffffffffffffffff8616808452600983529083208054600181810183558286529385200186905592529054610c9f91906133d4565b6000838152600a6020526040808220929092559051839173ffffffffffffffffffffffffffffffffffffffff80871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487610d4d6116ec565b60405190815260200160405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526005602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df857610dc682826133d4565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602090815260408083203384529091529020555b610e0384848461171e565b50505b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b610ebb83838361091f565b73ffffffffffffffffffffffffffffffffffffffff82163b15801590610fb257506040517f150b7a020000000000000000000000000000000000000000000000000000000080825233600483015273ffffffffffffffffffffffffffffffffffffffff858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610f69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8d9190613416565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b15610e06576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461103a576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60008181526008602052604090205473ffffffffffffffffffffffffffffffffffffffff16806110ec576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600280546104de906132eb565b33600081815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60006111a233848461171e565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111fa576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b605d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b61123285858561091f565b73ffffffffffffffffffffffffffffffffffffffff84163b1580159061131757506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff86169063150b7a02906112af9033908a90899089908990600401613458565b6020604051808303816000875af11580156112ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f29190613416565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b15610e03576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1633146113a0576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b605d5460ff161561140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f67617264656e206c6f636b65642100000000000000000000000000000000000060448201526064016107ce565b605d54610100900473ffffffffffffffffffffffffffffffffffffffff161561149e57605d805473ffffffffffffffffffffffffffffffffffffffff61010091829004811660009081526004602090815260408083208390559454939093049091168152600b9091522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b50605d805473ffffffffffffffffffffffffffffffffffffffff9283166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9093169290921783556000908152600b6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055605c546004909252909120559054041690565b60606000611545836119f1565b9050600061159561155585611a9e565b61155e84611bdb565b61156f61156a8661214c565b6125d8565b604051602001611581939291906134d7565b6040516020818303038152906040526125d8565b9050806040516020016115a89190613685565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461162f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811661167c576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b60006117197f0000000000000000000000000000000000000000000000000000000000000012600a6137ea565b905090565b6000806117296116ec565b73ffffffffffffffffffffffffffffffffffffffff8087166000818152600460205260408082208054948a168352908220549282529394509192909186919061177283866133d4565b909155505073ffffffffffffffffffffffffffffffffffffffff86166000908152600460205260409020805486019055600e5460ff16801561180a575073ffffffffffffffffffffffffffffffffffffffff87166000908152600c602052604090205460ff16158061180a575073ffffffffffffffffffffffffffffffffffffffff86166000908152600c602052604090205460ff16155b15611841576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152600b602052604090205460ff166118de5773ffffffffffffffffffffffffffffffffffffffff871660009081526004602052604081205461189f908590613828565b6118a98585613828565b6118b391906133d4565b905060005b818110156118db576118c9896127b5565b806118d38161339c565b9150506118b8565b50505b73ffffffffffffffffffffffffffffffffffffffff86166000908152600b602052604090205460ff1661197d5760006119178483613828565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260046020526040902054611948908690613828565b61195291906133d4565b905060005b8181101561197a576119688861296d565b806119728161339c565b915050611957565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487876040516119dc91815260200190565b60405180910390a35060019695505050505050565b611a236040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b611a556040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b611a5e83612af6565b8152611a6983612beb565b6020820152611a7783612ca4565b6040820152611a8583612d8a565b6060820152611a9383612f07565b608082015292915050565b606081600003611ae157505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611b0b5780611af58161339c565b9150611b049050600a83613828565b9150611ae5565b60008167ffffffffffffffff811115611b2657611b2661383c565b6040519080825280601f01601f191660200182016040528015611b50576020820181803683370190505b5090505b8415611bd357611b656001836133d4565b9150611b72600a8661386b565b611b7d90603061387f565b60f81b818381518110611b9257611b9261333e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611bcc600a86613828565b9450611b54565b949350505050565b6060611be5612fe9565b6040518060600160405280603181526020016140276031913981526020830151600303611c2b57604051806060016040528060348152602001613cd96034913960208201525b8260200151600403611c56576040518060600160405280603281526020016140586032913960408201525b8260200151600503611c81576040518060600160405280602e81526020016140dd602e913960608201525b600383602001511080611c98575060058360200151115b15611dc7576040518060600160405280602b81526020016140b2602b91396080820152602083015160179060078110611cd357611cd361333e565b018054611cdf906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0b906132eb565b8015611d585780601f10611d2d57610100808354040283529160200191611d58565b820191906000526020600020905b815481529060010190602001808311611d3b57829003601f168201915b505050505081600560148110611d7057611d7061333e565b60200201819052506040518060400160405280600381526020017f227d2c000000000000000000000000000000000000000000000000000000000081525081600660148110611dc157611dc161333e565b60200201525b604051806060016040528060248152602001613cb56024913960e0820152604083015160259060088110611dfd57611dfd61333e565b018054611e09906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611e35906132eb565b8015611e825780601f10611e5757610100808354040283529160200191611e82565b820191906000526020600020905b815481529060010190602001808311611e6557829003601f168201915b505050505081600860148110611e9a57611e9a61333e565b602002018190525060405180606001604052806028815260200161408a602891396101208201526060830151603590600e8110611ed957611ed961333e565b018054611ee5906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611f11906132eb565b8015611f5e5780601f10611f3357610100808354040283529160200191611f5e565b820191906000526020600020905b815481529060010190602001808311611f4157829003601f168201915b505050505081600a60148110611f7657611f7661333e565b6020020181905250604051806060016040528060298152602001613bfd60299139610160820152608083015160519060058110611fb557611fb561333e565b018054611fc1906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611fed906132eb565b801561203a5780601f1061200f5761010080835404028352916020019161203a565b820191906000526020600020905b81548152906001019060200180831161201d57829003601f168201915b505050505081600c601481106120525761205261333e565b60200201819052506040518060400160405280600581526020017f227d5d2c2000000000000000000000000000000000000000000000000000000081525081600d601481106120a3576120a361333e565b602090810291909101919091528151828201516040808501516060860151608087015160a088015160c089015160e08a015195516000996120e79998979101613892565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290526101008401516101208501516101408601516101608701516101808801516101a08901519597506115a896889690602001613937565b6060612156613011565b6040518060c00160405280608f8152602001613c26608f9139815260408051808201909152600c81527f3c706174682066696c6c3d220000000000000000000000000000000000000000602082015281600160200201528251600f90600881106121c2576121c261333e565b0180546121ce906132eb565b80601f01602080910402602001604051908101604052809291908181526020018280546121fa906132eb565b80156122475780601f1061221c57610100808354040283529160200191612247565b820191906000526020600020905b81548152906001019060200180831161222a57829003601f168201915b50505050508160026009811061225f5761225f61333e565b6020020181905250604051806102e001604052806102a58152602001613d0d6102a5913960608201526020830151601e90600781106122a0576122a061333e565b0180546122ac906132eb565b80601f01602080910402602001604051908101604052809291908181526020018280546122d8906132eb565b80156123255780601f106122fa57610100808354040283529160200191612325565b820191906000526020600020905b81548152906001019060200180831161230857829003601f168201915b50505050508160046009811061233d5761233d61333e565b60200201526040830151602d906008811061235a5761235a61333e565b018054612366906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054612392906132eb565b80156123df5780601f106123b4576101008083540402835291602001916123df565b820191906000526020600020905b8154815290600101906020018083116123c257829003601f168201915b5050505050816005600981106123f7576123f761333e565b60200201526060830151604390600e81106124145761241461333e565b018054612420906132eb565b80601f016020809104026020016040519081016040528092919081815260200182805461244c906132eb565b80156124995780601f1061246e57610100808354040283529160200191612499565b820191906000526020600020905b81548152906001019060200180831161247c57829003601f168201915b5050505050816006600981106124b1576124b161333e565b60200201526080830151605690600581106124ce576124ce61333e565b0180546124da906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054612506906132eb565b80156125535780601f1061252857610100808354040283529160200191612553565b820191906000526020600020905b81548152906001019060200180831161253657829003601f168201915b50505050508160076009811061256b5761256b61333e565b6020020181905250604051806060016040528060358152602001613fb260359139610100820181905281516020808401516040808601516060870151608088015160a089015160c08a015160e08b0151955160009a6115a89a9996979596949593949293929091016139c9565b805160609060008190036125fc575050604080516020810190915260008152919050565b6000600361260b83600261387f565b6126159190613828565b612620906004613a8a565b9050600061262f82602061387f565b67ffffffffffffffff8111156126475761264761383c565b6040519080825280601f01601f191660200182016040528015612671576020820181803683370190505b5090506000604051806060016040528060408152602001613fe7604091399050600181016020830160005b868110156126fd576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b83526004909201910161269c565b5060038606600181146127175760028114612761576127a7565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8301526127a7565b7f3d000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301525b505050918152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116612802576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604081208054612835906001906133d4565b815481106128455761284561333e565b90600052602060002001549050600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806128a0576128a06133e7565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908101839055909201909255828252600a815260408083208390556008825280832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909155600690925280832080549092169091555182919073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b73ffffffffffffffffffffffffffffffffffffffff81166129ba576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001019081905560008181526008602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612a21576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260086020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8716908117909155808452600983529083208054600181810183558286529385200185905592529054612a9e91906133d4565b6000828152600a6020526040808220929092559051829173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080612b29612b0584611a9e565b604051602001612b159190613aa1565b604051602081830303815290604052612f9a565b90506000612b38604f8361386b565b90506000600a8210158015612b4d5750601482105b15612b56575060015b60148210158015612b675750601e82105b15612b70575060025b601e8210158015612b815750602882105b15612b8a575060035b60288210158015612b9b5750603282105b15612ba4575060045b60328210158015612bb55750603c82105b15612bbe575060055b603c8210158015612bcf5750604682105b15612bd8575060065b60468210611bd357506007949350505050565b600080612c0a612bfa84611a9e565b604051602001612b159190613ae6565b90506000612c1960aa8361386b565b90506000602e8210158015612c2e5750604082105b15612c37575060015b60408210158015612c485750605182105b15612c51575060025b60518210158015612c625750605582105b15612c6b575060035b81605503612c77575060045b60568210158015612c885750605882105b15612c91575060055b60588210611bd357506006949350505050565b600080612cc3612cb384611a9e565b604051602001612b159190613b2b565b90506000612cd36101f48361386b565b9050600060298210158015612ce85750605182105b15612cf1575060015b60518210158015612d025750607982105b15612d0b575060025b60798210158015612d1c575060a182105b15612d25575060035b60a18210158015612d36575060c982105b15612d3f575060045b60c98210158015612d51575061010582105b15612d5a575060055b6101058210158015612d6d575061011982105b15612d76575060065b6101198210611bd357506007949350505050565b600080612da9612d9984611a9e565b604051602001612b159190613b63565b90506000612db860f08361386b565b90506000600a8210158015612dcd5750601482105b15612dd6575060015b60148210158015612de75750601e82105b15612df0575060025b601e8210158015612e015750602882105b15612e0a575060035b60288210158015612e1b5750603282105b15612e24575060045b60328210158015612e355750603c82105b15612e3e575060055b603c8210158015612e4f5750604682105b15612e58575060065b60468210158015612e695750605082105b15612e72575060075b60508210158015612e835750605a82105b15612e8c575060085b605a8210158015612e9d5750606482105b15612ea6575060095b60648210158015612eb75750606e82105b15612ec05750600a5b606e8210158015612ed15750607882105b15612eda5750600b5b60788210158015612eeb5750608282105b15612ef45750600c5b60828210611bd35750600d949350505050565b600080612f26612f1684611a9e565b604051602001612b159190613b9b565b90506000612f3560788361386b565b90506000600a8210158015612f4a5750601482105b15612f53575060015b60148210158015612f645750601e82105b15612f6d575060025b601e8210158015612f7e5750602882105b15612f87575060035b60288210611bd357506004949350505050565b600081604051602001612fad9190613be0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012092915050565b6040518061028001604052806014905b6060815260200190600190039081612ff95790505090565b60408051610120810190915260608152600860208201612ff9565b60005b8381101561304757818101518382015260200161302f565b50506000910152565b602081526000825180602084015261306f81604085016020870161302c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000602082840312156130b357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146110ec57600080fd5b600080604083850312156130f157600080fd5b6130fa836130ba565b946020939093013593505050565b803580151581146110ec57600080fd5b60008060006040848603121561312d57600080fd5b833567ffffffffffffffff8082111561314557600080fd5b818601915086601f83011261315957600080fd5b81358181111561316857600080fd5b8760208260051b850101111561317d57600080fd5b6020928301955093506131939186019050613108565b90509250925092565b6000806000606084860312156131b157600080fd5b6131ba846130ba565b92506131c8602085016130ba565b9150604084013590509250925092565b600080604083850312156131eb57600080fd5b6131f4836130ba565b915061320260208401613108565b90509250929050565b60006020828403121561321d57600080fd5b6111a2826130ba565b60008060008060006080868803121561323e57600080fd5b613247866130ba565b9450613255602087016130ba565b935060408601359250606086013567ffffffffffffffff8082111561327957600080fd5b818801915088601f83011261328d57600080fd5b81358181111561329c57600080fd5b8960208285010111156132ae57600080fd5b9699959850939650602001949392505050565b600080604083850312156132d457600080fd5b6132dd836130ba565b9150613202602084016130ba565b600181811c908216806132ff57607f821691505b602082108103613338577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036133cd576133cd61336d565b5060010190565b818103818111156107105761071061336d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006020828403121561342857600080fd5b81517fffffffff00000000000000000000000000000000000000000000000000000000811681146111a257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011683010190509695505050505050565b7f7b226e616d65223a2022576f726d7a202300000000000000000000000000000081526000845161350f81601185016020890161302c565b7f222c20226465736372697074696f6e223a2022412066756c6c79206f6e2d63686011918401918201527f61696e2067616d65207574696c6973696e672074686520657870657269656d6560318201527f6e74616c20746f6b656e207374616e646172642c204552432d3430342077686960518201527f636820656e61626c65732070657273697374656e74206c69717569646974792060718201527f616e642073656d692d66756e676962696c6974792e2200000000000000000000609182015284516135e48160a784016020890161302c565b7f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b62617360a792909101918201527f6536342c0000000000000000000000000000000000000000000000000000000060c782015283516136488160cb84016020880161302c565b61367a60cb828401017f227d000000000000000000000000000000000000000000000000000000000000815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516136bd81601d85016020870161302c565b91909101601d0192915050565b600181815b8085111561372357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156137095761370961336d565b8085161561371657918102915b93841c93908002906136cf565b509250929050565b60008261373a57506001610710565b8161374757506000610710565b816001811461375d576002811461376757613783565b6001915050610710565b60ff8411156137785761377861336d565b50506001821b610710565b5060208310610133831016604e8410600b84101617156137a6575081810a610710565b6137b083836136ca565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156137e2576137e261336d565b029392505050565b60006111a260ff84168361372b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613837576138376137f9565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008261387a5761387a6137f9565b500690565b808201808211156107105761071061336d565b6000895160206138a58285838f0161302c565b8a51918401916138b88184848f0161302c565b8a519201916138ca8184848e0161302c565b89519201916138dc8184848d0161302c565b88519201916138ee8184848c0161302c565b87519201916139008184848b0161302c565b86519201916139128184848a0161302c565b8551920191613924818484890161302c565b919091019b9a5050505050505050505050565b60008851602061394a8285838e0161302c565b89519184019161395d8184848e0161302c565b895192019161396f8184848d0161302c565b88519201916139818184848c0161302c565b87519201916139938184848b0161302c565b86519201916139a58184848a0161302c565b85519201916139b7818484890161302c565b919091019a9950505050505050505050565b60008a516139db818460208f0161302c565b8a516139ed8183860160208f0161302c565b8a519184010190613a02818360208e0161302c565b8951613a148183850160208e0161302c565b8951929091010190613a2a818360208c0161302c565b8751613a3c8183850160208c0161302c565b8751929091010190613a52818360208a0161302c565b8551613a648183850160208a0161302c565b8551929091010190613a7a81836020880161302c565b019b9a5050505050505050505050565b80820281158282048414176107105761071061336d565b7f4241534520434f4c4f5200000000000000000000000000000000000000000000815260008251613ad981600a85016020870161302c565b91909101600a0192915050565b7f4c41594552205448524545000000000000000000000000000000000000000000815260008251613b1e81600b85016020870161302c565b91909101600b0192915050565b7f4c4159455220464f555200000000000000000000000000000000000000000000815260008251613ad981600a85016020870161302c565b7f4c41594552204649564500000000000000000000000000000000000000000000815260008251613ad981600a85016020870161302c565b7f4c41594552205349580000000000000000000000000000000000000000000000815260008251613bd381600985016020870161302c565b9190910160090192915050565b60008251613bf281846020870161302c565b919091019291505056fe227d2c207b2274726169745f74797065223a20224163636573736f7279222c2276616c7565223a20223c7376672069643d22782220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d22302030203330203330223e3c706174682066696c6c3d22233633383539362220643d224d30203068333076333048307a222f3e207b2274726169745f74797065223a202245796577656172222c2276616c7565223a20225a6f6d626965227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a20225a6f6d626965227d2c2220643d224d3232203130763132682d327632682d3176314835762d316831762d316831762d316831762d316831762d316832762d316832762d396831563968325638682d31563768337631683176316832763168317a222f3e3c706174682066696c6c3d22233030302220643d224d342032347632683136762d32682d3176314835762d3148347a4d36203233483576316831762d317a4d37203232483676316831762d317a4d38203231483776316831762d317a4d39203230483876316831762d317a4d3131203139483976316832762d317a4d31322031307638682d3176316832762d39682d317a4d31342031305639682d31763168317a4d313520385637682d31763268325638682d317a4d31382036682d337631683356367a4d31392037682d317631683156377a4d32312038682d327631683256387a4d32332032325639682d327631683176313268317a4d3231203234762d316831762d31682d32763268317a4d313520313368317631682d31762d317a4d323020313368317631682d31762d317a4d313820313568327631682d32762d317a4d313720313868337631682d33762d317a222f3e3c706174682066696c6c3d2223303030222066696c6c2d6f7061636974793d222e322220643d224d3137203133682d3176316831762d317a4d3232203133682d3176316831762d317a222f3e3c706174682066696c6c3d2223303030222066696c6c2d6f7061636974793d222e342220643d224d3137203132682d3276316832762d317a4d323020313276316832762d31682d327a4d3232203231682d397631683176316836762d316832762d317a4d3132203139682d3176366832762d31682d31762d357a4d3130203235762d354839763568317a4d38203235762d334837763368317a4d36203234483576316831762d317a222f3e3c7374796c653e23787b73686170652d72656e646572696e673a20637269737065646765733b7d3c2f7374796c653e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f2c202261747472696275746573223a205b7b2274726169745f74797065223a202254797065222c2276616c7565223a2022416c69656e227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a2022416c69656e227d2c227d2c207b2274726169745f74797065223a20224865616477656172222c2276616c7565223a20224e6f726d616c227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a2022417065227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a2022417065227d2c

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

000000000000000000000000b680082e0424ec0818b4201d0cc3e59378915d9d

-----Decoded View---------------
Arg [0] : _owner (address): 0xB680082e0424ec0818b4201d0cc3e59378915d9d

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


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.