ETH Price: $3,811.66 (+5.01%)

Contract

0xa55c2D182B44D932aDB114e1E2A5ca16574447E9
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Age:1H
Reset Filter

Transaction Hash
Method
Block
From
To

There are no matching entries

Update your filters to view other transactions

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x30525a67...210584e34
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
MergeFlowerArt

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 20 runs

Other Settings:
default evmVersion
File 1 of 4 : MergeFlowerArt.sol
// SPDX-License-Identifier: MIT
// Copyright (c) 2022 Lawrence X. Rogers

pragma solidity ^0.8.9;

import "@openzeppelin/contracts/utils/Base64.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import {BUD_STUB_1, BUD_STUB_2, FLOWER_ANIMATIONS, FLOWER_DEFS} from "contracts/Encodings.sol";

/// @title MergeFlowersArt
/// @author Lawrence X Rogers
/// @notice This smart contract creates the art for the MergeFlowers NFT.

contract MergeFlowerArt {
    using Strings for uint256;

    uint constant NUM_ATTRIBUTES = 4;

    /// @notice color information about the flower
    struct Palette {
        uint h1;            // hue1
        uint h2;            // hue2
        uint s;             // saturation
        uint l;             // lightness
        bool lwalk;         // whether to increase lightness per layer
        uint cycle;         // how many different colors in the palette
        Interval interval;  
        uint opacity;      
        Mutation mutation;  
    }

    /// @notice 
    struct FlowerTraits {
        Palette palette;
        uint maxDistance;      // starting distance of petals on first layer
        uint distanceDecrease; // how much to shrink each layer
        uint minCount;         // starting petal count on first layer
        uint countIncrease;    // how much to increase petal count each layer
        uint maxRadius;        // starting petal size on first layer
        uint radiusDecrease;   // how much to decrease the radius each layer
        uint levels;           // how many layers 
        uint petalSeed;        // seed storing what types of petals are on each layer
        Mutation mutation;     // what "Mutation" this flower has
        bool bg;               // whether or not this flower has a background
    }

    /// @notice this struct packs details for each layer to avoid stack-too-deep errors
    struct LayerDeets {
        uint distance;
        uint count;
        uint countEvened;
        uint radius;
        bool glow;
    }

    enum Interval {MONO, ANALAGOUS, TERTIARY, TRIADIC}
    uint constant NUM_MUTATIONS = 4;
    enum Mutation {NONE, BIO, VEINS, ALBINO}

    /// UTILITY FUNCTIONS
    /// @notice convert a byte to a number between min and max
    function randomValue(bytes1 seed, uint min, uint max) internal pure returns (uint value){
        uint percent = (100* (1 + uint32(uint8(seed)))) / 256;
        value = min + ((percent * (max - min)) / 100);
    }

    /// @notice the corehue is constant between the buds and the flowers, and is based on tokenId
    function getCoreHueFromTokenId(uint tokenId) internal view returns (uint) {
        bytes32 seed = keccak256(abi.encodePacked(tokenId));
        uint hue = uint(uint8(seed[0])) * uint(uint8(seed[10])) % 360;
        return hue % 360;
    }

    /// @notice convert hue, saturation, and lightness values to an HSL(x,y,z) string
    function getColor(uint _h, uint _s, uint _l) internal pure returns (bytes memory color) {
        color = abi.encodePacked("hsl(", _h.toString(), ", ", _s.toString(), "%, ", _l.toString(), "%)");
    }

    /// @notice return strings for each mutation, for attribute metadata
    function getMutationNames() internal pure returns(string[NUM_MUTATIONS] memory) {
        return ["None", "Bioluminescence", "Veins", "Albino"];
    }

    /// @notice each mutation has an opacity override
    function getMutationOpacity(Palette memory _p) internal pure returns(uint) {
        uint[NUM_MUTATIONS] memory opacities = [_p.opacity, 50, 30, 100];
        return opacities[uint(_p.mutation)];
    }

    /// @notice these are color intervals, in terms of degrees in the color wheel 
    function getIntervals() internal pure returns(uint8[4] memory) {
        return [0, 15, 60, 120];
    }

    /// FLOWER DESIGN

    /// @notice given a random seed and tokenId, generate all traits of the flower.
    function getFlowerTraits(uint _seed, uint tokenId) internal view returns (FlowerTraits memory f) {
        bytes32 seed = keccak256(abi.encodePacked(_seed, tokenId));
        
        uint h1 = getCoreHueFromTokenId(tokenId);
        uint s = 1; //the seed indexes could be hard-coded but tracking it with this variable makes coding much easier
        uint l = randomValue(seed[s++], 50, 70);
        uint maxDistance = randomValue(seed[s++], 250, 300);
        uint levels = randomValue(seed[s++], 2, 6);
        uint minCount = randomValue(seed[s++], 2, 6) * 2;
        Mutation mutation = randomValue(seed[s++], 0, 100) < 10 ? Mutation(randomValue(seed[s++], 0, NUM_MUTATIONS)) : Mutation.NONE;

        return FlowerTraits(
            Palette(
                h1,       // hue1
                (h1 + 10 + randomValue(seed[s++], 0, 20)) % 360, // hue2
                mutation == Mutation.BIO ? 100 : randomValue(seed[s++], 40, 80), // saturation
                l,        // lightness
                l < 60 && uint8(seed[s++]) < 180, // lwalk
                uint8(seed[s++]) < 120 ? 1 : randomValue(seed[s++], 2, 4), // cycle
                Interval(randomValue(seed[s++], 0, 4)), // interval
                mutation == Mutation.BIO ? 50 : randomValue(seed[s++], 50, 100), // opacity
                mutation//mutation == Mutation.VEINS || mutation == Mutation.ALBINO// stroked
            ), 
            maxDistance,   // maxDistance
            (maxDistance - randomValue(seed[s++], 80, 120)) / levels, // distanceDecrease
            minCount,      // min Count
            minCount == 4 ? randomValue(seed[s++], 4, 6) : randomValue(seed[s++], 1, 6),   // count increase
            randomValue(seed[s++], 150, 200),   // max width
            randomValue(seed[s++], 70, 90),     // width decrease
            levels,                             // levels
            uint(uint8(seed[s++])),             // petalSeed
            mutation,
            randomValue(seed[s++], 0, 100) < 50 // bg color
        );
    }

    function getAttributes(FlowerTraits memory _traits) internal pure returns (bytes memory attributeBytes) {
        (string[NUM_ATTRIBUTES] memory names, string[NUM_ATTRIBUTES] memory values) = getTraitNamesAndValues(_traits);
        return generateAttributeMetadata(names, values);
    }

    /// @notice generate the metadata strings and store in two arrays
    function getTraitNamesAndValues(FlowerTraits memory _traits) internal pure returns (string[NUM_ATTRIBUTES] memory names, string[NUM_ATTRIBUTES] memory values) {
        names = ["Base Color", "Levels", "Background Color", "Mutation"];
        values[0] = _traits.palette.h1.toString();              // Base Color
        values[1] = _traits.levels.toString();                  // Levels
        values[2] = _traits.bg ? "Color" : "None";              // Background Color
        values[3] = getMutationNames()[uint(_traits.mutation)]; // Mutation names
    }

    /// @notice helper function to pack metadata into a single string
    function generateAttributeMetadata(string[NUM_ATTRIBUTES] memory names, string[NUM_ATTRIBUTES] memory values) internal pure returns (bytes memory attributeMetadata) {
        attributeMetadata = abi.encodePacked("[");
        for (uint i = 0; i < names.length - 1; i++) {
            attributeMetadata = abi.encodePacked(attributeMetadata,
                '{"trait_type":"', names[i], '",',
                '"value":"', values[i], '"},');
        }

        attributeMetadata = abi.encodePacked(attributeMetadata,
                '{"trait_type":"', names[names.length - 1], '",',
                '"value":"', values[names.length - 1], '"}]');
    }

    /// @notice perform color math to turn palette traits into a specific petal's color
    function getColorFromPalette(Palette memory _p, uint _h, uint _index) internal pure returns (bytes memory) {
        uint h = (_h == 1) ? _p.h1 : _p.h2;
        h += (_index % _p.cycle) * getIntervals()[uint(_p.interval)];
        uint l = _p.lwalk ? _p.l + (_index * 7) : _p.l;
        return getColor(
            h, _p.s, l
        );
    }

    /// @notice return the bud SVG with the color injected.
    function getBudArt(uint tokenId) external view returns (bytes memory budBytes) {
        return abi.encodePacked(
            "data:image/svg+xml;base64,",
            Base64.encode(
                abi.encodePacked(
                    BUD_STUB_1, 
                    "hsl(", getCoreHueFromTokenId(tokenId).toString(), ",80%,60%",
                    BUD_STUB_2)
            )
        );
    }

    /// @notice pack the art into a single base64 encoded SVG. Can return with or without animations.
    function packArt(bytes memory flowerBytes, bool animated, bytes memory bg) internal pure returns (bytes memory) {
        
        return abi.encodePacked(
            "data:image/svg+xml;base64,",
            Base64.encode(
                abi.encodePacked(
                    '<svg width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="thesvg" viewBox="-700 -700 1400 1400" ',
                    'style="background-color: ', bg,'">',
                    '<style>',
                    animated ? FLOWER_ANIMATIONS : abi.encodePacked(""),
                    '</style>',
                    flowerBytes, 
                    "</svg>"
                )
            )
        );
    }

    function getBGColor(FlowerTraits memory _traits) internal pure returns (bytes memory bgcolorbytes) {
        if (_traits.mutation == Mutation.BIO) {
            return abi.encodePacked("#000");
        }
        else if (_traits.bg) {
            uint hue = (_traits.palette.h1 + 180 + getIntervals()[uint(_traits.palette.interval)]) % 360;
            return abi.encodePacked("hsl(", hue.toString(), ",40%,60%)");
        }
        else {
            return abi.encodePacked("#FFF");
        }
    }

    function getFlowerArt(uint _seed, uint tokenId) external view returns (bytes memory still, bytes memory animated, bytes memory attributes) {
        bytes memory flowerBytes = FLOWER_DEFS;
        FlowerTraits memory _traits = getFlowerTraits(_seed, tokenId);
        bytes[] memory layers = getFlowerLayers(_traits);
        for (uint i = 0; i < layers.length; i++) {
            flowerBytes = abi.encodePacked(flowerBytes, layers[i]);
        }
        bytes memory bg = getBGColor(_traits);
        return (packArt(flowerBytes, false, bg), packArt(flowerBytes, true, bg), getAttributes(_traits));
    }

    /// FLOWER CONSTRUCTION

    /// @notice rounds down petal radii to avoid petals being too large around top layer
    function getAdjustedRadius(LayerDeets memory _deets) internal pure returns (uint) {
        uint maximumRadius = ((_deets.distance * 2 * 314) / 100) / _deets.countEvened;
        return maximumRadius < _deets.radius ? maximumRadius : _deets.radius;
    }

    /// @notice main construction function. Takes the flower traits and generates each layer
    function getFlowerLayers(FlowerTraits memory _traits) internal pure returns (bytes[] memory layers) {
        layers = new bytes[](_traits.levels + 1);
        LayerDeets memory deets = LayerDeets(
                                    _traits.maxDistance, 
                                    _traits.minCount,
                                    _traits.minCount,
                                    _traits.maxRadius,
                                    _traits.mutation == Mutation.BIO);

        for (uint i = 0; i < _traits.levels; i++) {
            layers[i] = createLayer(i, _traits.petalSeed, deets, _traits.palette);

            deets.distance -= _traits.distanceDecrease;
            deets.count += _traits.countIncrease;
            deets.countEvened = (deets.count / 2) * 2;
            deets.radius = (deets.radius * _traits.radiusDecrease) / 100;
        }
        layers[layers.length - 1] = createCore(deets.distance + _traits.distanceDecrease, _traits.palette, _traits.levels - 1);
        return layers;
    }

    /// @notice creates a given flower layer. Each layer is actually two layers of petals of the same type
    function createLayer(uint _index, uint _typeSeed, LayerDeets memory _deets, Palette memory _p) internal pure returns (bytes memory layerBytes) {
        
        layerBytes = abi.encodePacked(
            "<g style='transform: rotate(0deg) scale(100%); animation: scaleUp 8s cubic-bezier(.24,.95,.6,1) both ",
             (_index * 200).toString(), "ms'>",
            _deets.glow && _index == 0 ? "<g filter='url(#glow)'>" : "<g filter='url(#shadow)'>");
        uint8 petalType = uint8(keccak256(abi.encodePacked(_typeSeed))[_index]);
        uint rotationInterval = 36000 / _deets.countEvened;

        for (uint i = 0; i < _deets.countEvened; i+= 2) {
            bytes memory color = getColorFromPalette(_p, 1, _index);
            layerBytes = abi.encodePacked(
                layerBytes, 
                createPetal(
                    _p,
                    petalType,
                    _deets.distance + 5,
                    (i * rotationInterval) / 100,// (_index % 2 == 1 ? i * rotationInterval + (rotationInterval / 2): i * rotationInterval) / 100,
                    getAdjustedRadius(_deets) + 5, 
                    color));
        }

        layerBytes = abi.encodePacked(
            layerBytes, 
            "</g></g><g style='transform: rotate(0deg) scale(100%); animation: scaleUp 8s cubic-bezier(.24,.95,.6,1) both ",
             (_index * 200).toString(), "ms'>",
            _deets.glow && _index == 0 ? "<g filter='url(#glow)'>" : "<g filter='url(#shadow)'>");
        
        for (uint i = 1; i < _deets.countEvened; i+= 2) {
            bytes memory color = getColorFromPalette(_p, 2, _index);
            layerBytes = abi.encodePacked(
                layerBytes, 
                createPetal(
                    _p,
                    petalType,
                    _deets.distance - 5, 
                    (i * rotationInterval) / 100,//(_index % 2 == 1 ? i * rotationInterval + (rotationInterval / 2): i * rotationInterval) / 100,
                    getAdjustedRadius(_deets) - 5, 
                    color));
        }
        layerBytes = abi.encodePacked(layerBytes, "</g></g>");
    }

    /// @notice each petal has some basic attributes that are the same regardless of petal type
    function getBasicPetalAttributes(Palette memory _p, bytes memory _hue) internal pure returns (bytes memory petalBytes) {
        return abi.encodePacked(
                '" stroke="', _p.mutation == Mutation.ALBINO ? abi.encodePacked("black") : _hue,
                '" fill="', _p.mutation == Mutation.ALBINO ? abi.encodePacked("white") : _hue,
                '" fill-opacity="', getMutationOpacity(_p).toString() , "%"
        );
    }

    /// @notice create the petal. there are three types of petals, each of which are created slightly differently
    function createPetal(Palette memory _p, uint8 _type, uint _distance, uint _rotation, uint _radius, bytes memory _hue) internal pure returns (bytes memory petalBytes) {
        if (_type <  85) { // CIRCLE
            petalBytes = abi.encodePacked(
                '<circle cy="', _distance.toString(), 
                '" r="', _radius.toString(),
                '" stroke-width="', _p.mutation == Mutation.VEINS || _p.mutation == Mutation.ALBINO ? "10px" : "0px",
                getBasicPetalAttributes(_p, _hue),
                '" style="transform: rotate(', _rotation.toString(), 'deg)" />'
            );
        }
        else if (_type < 170) { // ELLIPSE
            petalBytes = abi.encodePacked(
                '<ellipse cy="', _distance.toString(), 
                '" rx="', ((_radius * 80)/100).toString(),
                '" ry="', ((_radius * 150)/100).toString(),
                '" stroke-width="', _p.mutation == Mutation.VEINS || _p.mutation == Mutation.ALBINO ? "10px" : "0px",
                getBasicPetalAttributes(_p, _hue),
                '" style="transform: rotate(', _rotation.toString(), 'deg)" />'
            );
        }
        else {
            uint scale = ((100 * _radius) / 180);// needs two decimal places

            petalBytes = abi.encodePacked( // POINTY
                '<path d="M 0 300 C 0 300 -150 240 -170 170 C -220 0 0 -300 0 -300 C 0 -300 220 0 170 170 C 150 240 0 300 0 300 Z', 
                '" stroke-width="', abi.encodePacked((_p.mutation == Mutation.VEINS || _p.mutation == Mutation.ALBINO ? (1000 / scale) : 0).toString(), "px"),
                getBasicPetalAttributes(_p, _hue),
                '" style="transform: rotate(', _rotation.toString(),
                     'deg) translate(0px, -', _distance.toString(), 
                     'px) scale(', scale.toString(), '%)"/>'
            );
        }
    }

    /// @notice create the "core" of the flower, the circle in the center. 
    function createCore(uint _radius, Palette memory _p, uint _index) internal pure returns (bytes memory coreBytes) {
        bytes memory id = abi.encodePacked(_p.h1.toString(), _p.h2.toString()); //abi.encodePacked(hue1, "-", hue2);
        coreBytes = abi.encodePacked(
            "<radialGradient id='", id,"'>",
                "<stop offset='0%' stop-color='", getColor(_p.h1, _p.s, _p.l), "'/>",
                "<stop offset='100%' stop-color='", getColor(_p.h2, _p.s, _p.l - 30), "'/>",
            "</radialGradient>",
            "<g style='transform: rotate(0deg) scale(100%); animation: scaleUp 8s cubic-bezier(.24,.95,.6,1) both ",
             (_index * 200).toString(), "ms'>",
            "<circle r='", _radius.toString(), 
            "' filter='url(#shadow)'",
            " stroke='", _p.mutation == Mutation.ALBINO ? abi.encodePacked("black") : getColorFromPalette(_p, 0, _index),
            "' stroke-width='", _p.mutation == Mutation.ALBINO ? "10px" : "0px",
            "' fill-opacity='", (_p.mutation == Mutation.ALBINO ? "100" : (_p.opacity + 25).toString()), "%'",
            " fill='", _p.mutation == Mutation.ALBINO ? abi.encodePacked("white") : abi.encodePacked("url(#", id, ")"), 
            
            "'/></g>"
        );
    }

}

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

pragma solidity ^0.8.0;

/**
 * @dev Provides a set of functions to operate with Base64 strings.
 *
 * _Available since v4.5._
 */
library Base64 {
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        /// @solidity memory-safe-assembly
        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

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

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

            } {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

File 4 of 4 : Encodings.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;

bytes constant BUD_STUB_1 = hex"3c7376672077696474683d22313030252220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672220786d6c6e733a786c696e6b3d22687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b222069643d22746865737667222076696577426f783d222d373030202d37303020313430302031343030223e202020203c7374796c653e406b65796672616d6573206c6561664c6f6164207b3025207b726f746174653a206e6f6e653b7d373025207b726f746174653a202d31306465673b7d31303025207b726f746174653a203336306465673b7d7d406b65796672616d6573207363616c655570207b3025207b726f746174653a2034356465673b7363616c653a203130253b7d31303025207b726f746174653a206e6f6e653b7363616c653a20313030253b7d7d406b65796672616d6573207363616c654f7363696c6c617465207b3025207b7472616e736c6174653a20303b7363616c653a20313030253b7d353025207b7472616e736c6174653a202d3570783b7363616c653a203938253b7d31303025207b7472616e736c6174653a20303b7363616c653a20313030253b7d7d406b65796672616d65732077696e64207b3025207b7472616e736c6174653a20303b7363616c653a20313030253b7d353025207b7472616e736c6174653a202d323070783b7363616c653a20313031253b7d31303025207b7472616e736c6174653a20303b7363616c653a20313030253b7d7d406b65796672616d65732077696e64526f74617465207b3025207b726f746174653a206e6f6e653b7d353025207b726f746174653a202d2e356465673b7d31303025207b726f746174653a206e6f6e653b7d7d237374656d207b7472616e73666f726d2d6f726967696e3a20626f74746f6d3b7d2e616e74686572207b616e696d6174696f6e3a20616e74686572426c6f6f6d2031307320656173652d696e2d6f75743b7d406b65796672616d657320616e74686572426c6f6f6d207b3025207b7363616c653a203230253b7d353025207b7363616c653a20313230253b7d31303025207b7363616c653a20313030253b7d7d3c2f7374796c653e202020203c646566733e20202020202020203c66696c7465722066696c746572556e6974733d227573657253706163654f6e557365222069643d22736861646f772220783d222d3530252220793d222d353025222077696474683d223230302522206865696768743d2232303025223e2020202020202020202020203c66654f666673657420726573756c743d226f66664f75742220696e3d22536f75726365416c706861222064783d2230222064793d2230223e3c2f66654f66667365743e2020202020202020202020203c6665476175737369616e426c757220726573756c743d22626c75724f75742220696e3d226f66664f75742220737464446576696174696f6e3d223230223e3c2f6665476175737369616e426c75723e2020202020202020202020203c6665426c656e6420696e3d22536f75726365477261706869632220696e323d22626c75724f757422206d6f64653d226e6f726d616c223e3c2f6665426c656e643e20202020202020203c2f66696c7465723e20202020202020203c66696c7465722069643d22736861646f772d736d616c6c2220783d222d3530252220793d222d353025222077696474683d223230302522206865696768743d2232303025223e2020202020202020202020203c6665476175737369616e426c757220726573756c743d22626c75724f75742220696e3d22536f75726365416c7068612220737464446576696174696f6e3d2235223e3c2f6665476175737369616e426c75723e2020202020202020202020203c6665426c656e6420696e3d22536f75726365477261706869632220696e323d22626c75724f757422206d6f64653d226e6f726d616c223e3c2f6665426c656e643e20202020202020203c2f66696c7465723e2020202020202020202020203c2f646566733e202020203c726563742069643d227374656d2220783d222d31302220793d2230222077696474683d22303022206865696768743d2232303030222066696c6c3d22677265656e223e3c2f726563743e202020203c672069643d22666c6f77657222207374796c653d22616e696d6174696f6e3a20347320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e672077696e643b223e3c672066696c7465723d2275726c2823736861646f7729223e3c7061746820643d224d202d302e343737202d3133372e3030362043202d302e343737202d3133372e303036202d36302e313037202d34342e313536202d35312e343436202d302e3336332043202d34362e3731342032332e353636202d32322e3939382035302e38343820312e3338372035302e32363720432032342e3638362034392e3731322034342e3934382032322e3339392034392e353037202d302e34353620432035382e303532202d34332e323933202d302e343737202d3133372e303036202d302e343737202d3133372e303036205a22207374796c653d227472616e73666f726d3a20726f74617465283064656729207363616c652831293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e33732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e337320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e367320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f706174683e3c7061746820643d224d202d302e343737202d3133372e3030362043202d302e343737202d3133372e303036202d36302e313037202d34342e313536202d35312e343436202d302e3336332043202d34362e3731342032332e353636202d32322e3939382035302e38343820312e3338372035302e32363720432032342e3638362034392e3731322034342e3934382032322e3339392034392e353037202d302e34353620432035382e303532202d34332e323933202d302e343737202d3133372e303036202d302e343737202d3133372e303036205a22207374796c653d227472616e73666f726d3a20726f746174652831383064656729207363616c652831293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e33732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e337320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e367320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f706174683e3c2f673e3c672066696c7465723d2275726c2823736861646f7729223e3c7061746820643d224d202d302e343737202d3133372e3030362043202d302e343737202d3133372e303036202d36302e313037202d34342e313536202d35312e343436202d302e3336332043202d34362e3731342032332e353636202d32322e3939382035302e38343820312e3338372035302e32363720432032342e3638362034392e3731322034342e3934382032322e3339392034392e353037202d302e34353620432035382e303532202d34332e323933202d302e343737202d3133372e303036202d302e343737202d3133372e303036205a22207374796c653d227472616e73666f726d3a20726f7461746528393064656729207363616c652831293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e33732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e337320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e367320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f706174683e3c7061746820643d224d202d302e343737202d3133372e3030362043202d302e343737202d3133372e303036202d36302e313037202d34342e313536202d35312e343436202d302e3336332043202d34362e3731342032332e353636202d32322e3939382035302e38343820312e3338372035302e32363720432032342e3638362034392e3731322034342e3934382032322e3339392034392e353037202d302e34353620432035382e303532202d34332e323933202d302e343737202d3133372e303036202d302e343737202d3133372e303036205a22207374796c653d227472616e73666f726d3a20726f746174652832373064656729207363616c652831293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e33732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e337320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e367320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f706174683e3c2f673e3c672066696c7465723d2275726c2823736861646f7729223e3c656c6c697073652063783d2230222063793d223430222072783d22333022207374796c653d227472616e73666f726d3a20726f746174652830646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e32732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e327320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e347320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223430222072783d22333022207374796c653d227472616e73666f726d3a20726f74617465283930646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e32732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e327320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e347320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223430222072783d22333022207374796c653d227472616e73666f726d3a20726f7461746528313830646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e32732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e327320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e347320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223430222072783d22333022207374796c653d227472616e73666f726d3a20726f7461746528323730646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e32732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e327320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e347320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c2f673e3c672066696c7465723d2275726c2823736861646f7729223e3c656c6c697073652063783d2230222063793d223430222072783d22333022207374796c653d227472616e73666f726d3a20726f74617465283435646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e32732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e327320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e347320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223430222072783d22333022207374796c653d227472616e73666f726d3a20726f7461746528313335646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e32732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e327320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e347320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223430222072783d22333022207374796c653d227472616e73666f726d3a20726f7461746528323235646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e32732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e327320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e347320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223430222072783d22333022207374796c653d227472616e73666f726d3a20726f7461746528333135646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e32732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e327320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e347320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c2f673e3c636972636c652066696c6c3d22";
bytes constant BUD_STUB_2 = hex"2220723d223130222069643d2268696e74223e3c2f636972636c653e3c672066696c7465723d2275726c2823736861646f772d736d616c6c223e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f746174652830646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f74617465283630646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f7461746528313230646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f7461746528313830646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f7461746528323430646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f7461746528333030646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c2f673e3c672066696c7465723d2275726c2823736861646f772d736d616c6c223e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f74617465283330646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f74617465283930646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f7461746528313530646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f7461746528323130646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f7461746528323730646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f7461746528333330646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c2f673e3c2f673e3c2f7376673e";
bytes constant FLOWER_STUB_NO_STYLES = hex"3c7376672077696474683d22313030252220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672220786d6c6e733a786c696e6b3d22687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b222069643d22746865737667222076696577426f783d222d373030202d37303020313430302031343030223e203c7374796c653e2020203c2f7374796c653e203c646566733e203c66696c7465722066696c746572556e6974733d227573657253706163654f6e557365222069643d22736861646f772220783d222d3530252220793d222d353025222077696474683d223230302522206865696768743d2232303025223e20203c6665476175737369616e426c757220726573756c743d22626c75724f75742220696e3d22536f75726365416c7068612220737464446576696174696f6e3d22323022202f3e20203c6665426c656e6420696e3d22536f75726365477261706869632220696e323d22626c75724f757422206d6f64653d226e6f726d616c22202f3e203c2f66696c7465723e203c66696c7465722066696c746572556e6974733d227573657253706163654f6e557365222069643d22736861646f772d736d616c6c2220783d222d3530252220793d222d353025222077696474683d223230302522206865696768743d2232303025223e20203c6665476175737369616e426c757220726573756c743d22626c75724f75742220696e3d22536f75726365416c7068612220737464446576696174696f6e3d223422202f3e20203c6665426c656e6420696e3d22536f75726365477261706869632220696e323d22626c75724f757422206d6f64653d226e6f726d616c22202f3e203c2f66696c7465723e203c2f646566733e";
bytes constant FLOWER_ANIMATIONS = hex"406b65796672616d6573206c6561664c6f6164207b203025207b20726f746174653a20306465673b207d20373025207b20726f746174653a202d31306465673b207d2031303025207b20726f746174653a203336306465673b207d7d20406b65796672616d6573207363616c655570207b203025207b7363616c653a20313025203130253b726f746174653a2034356465673b207d2031303025207b7363616c653a203130302520313030253b726f746174653a20306465673b207d7d406b65796672616d65732077696e64207b203025207b7472616e736c6174653a203070783b7363616c653a20313030253b207d20353025207b7472616e736c6174653a202d31303070783b7363616c653a203935253b207d2031303025207b7472616e736c6174653a203070783b7363616c653a20313030253b207d7d";
bytes constant FLOWER_DEFS = hex"3c646566733e203c7061747465726e2069643d227061747465726e2d636972636c65732220783d22302220793d2230222077696474683d22383022206865696768743d2233303022207061747465726e556e6974733d227573657253706163654f6e55736522207061747465726e436f6e74656e74556e6974733d227573657253706163654f6e557365223e203c7265637420783d22302220793d2230222077696474683d223130302522206865696768743d2231303025222066696c6c3d2270696e6b222f3e203c7465787420783d22302220793d22302220636c6173733d22686561767922207472616e73666f726d3d22726f7461746528393029223e204d455247453c2f746578743e203c2f7061747465726e3e203c66696c7465722069643d22736861646f77222020783d222d3430252220793d222d343025222077696474683d223138302522206865696768743d2231383025223e203c6665436f6c6f724d617472697820747970653d226d6174726978222076616c7565733d20202022302030203020302020203020302030203020302020203020302030203020302020203020302030203020302e372030222f3e203c6665476175737369616e426c757220737464446576696174696f6e3d2231382220726573756c743d22636f6c6f726564426c7572222f3e203c66654d657267653e203c66654d657267654e6f646520696e3d22636f6c6f726564426c7572222f3e203c66654d657267654e6f646520696e3d22536f7572636547726170686963222f3e203c2f66654d657267653e203c2f66696c7465723e203c66696c746572202069643d22736861646f772d736d616c6c2220783d222d3330252220793d222d333025222077696474683d223136302522206865696768743d2231363025223e203c6665476175737369616e426c757220726573756c743d22626c75724f75742220696e3d22536f75726365416c7068612220737464446576696174696f6e3d223422202f3e203c66654d657267653e203c66654d657267654e6f646520696e3d22626c75724f7574222f3e203c66654d657267654e6f646520696e3d22536f7572636547726170686963222f3e203c2f66654d657267653e203c2f66696c7465723e203c66696c7465722069643d22676c6f772220783d222d3330252220793d222d333025222077696474683d223136302522206865696768743d2231363025223e203c6665476175737369616e426c757220737464446576696174696f6e3d2233302220726573756c743d22636f6c6f726564426c7572222f3e203c66654d657267653e203c66654d657267654e6f646520696e3d22636f6c6f726564426c7572222f3e203c66654d657267654e6f646520696e3d22536f7572636547726170686963222f3e203c2f66654d657267653e203c2f66696c7465723e203c2f646566733e";

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getBudArt","outputs":[{"internalType":"bytes","name":"budBytes","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_seed","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFlowerArt","outputs":[{"internalType":"bytes","name":"still","type":"bytes"},{"internalType":"bytes","name":"animated","type":"bytes"},{"internalType":"bytes","name":"attributes","type":"bytes"}],"stateMutability":"view","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063511042b81461003b578063f50ca50914610066575b600080fd5b61004e610049366004611c33565b610086565b60405161005d93929190611cd2565b60405180910390f35b610079610074366004611d0b565b610162565b60405161005d9190611d2c565b6060806060600060405180610440016040528061041d8152602001613c1961041d9139905060006100b787876101fc565b905060006100c482610728565b905060005b815181101561012257838282815181106100e5576100e5611d3d565b60200260200101516040516020016100fe929190611d75565b6040516020818303038152906040529350808061011a90611da3565b9150506100c9565b50600061012e83610914565b905061013c846000836109f0565b610148856001846109f0565b61015185610a76565b965096509650505050509250925092565b60606101d660405180611ae00160405280611ab581526020016141b0611ab5913961019461018f85610a9a565b610af7565b6040518061112001604052806110f18152602001612b286110f191396040516020016101c293929190611de9565b604051602081830303815290604052610bf7565b6040516020016101e69190611e23565b6040516020818303038152906040529050919050565b610204611b07565b60408051602080820186905281830185905282518083038401815260609092019092528051910120600061023784610a9a565b90506001600061026a848361024b81611da3565b94506020811061025d5761025d611d3d565b1a60f81b60326046610d49565b9050600061029c858461027c81611da3565b95506020811061028e5761028e611d3d565b1a60f81b60fa61012c610d49565b905060006102cd86856102ae81611da3565b9650602081106102c0576102c0611d3d565b1a60f81b60026006610d49565b905060006102f187866102df81611da3565b9750602081106102c0576102c0611d3d565b6102fc906002611e52565b90506000600a61032f898861031081611da3565b99506020811061032257610322611d3d565b1a60f81b60006064610d49565b1061033b576000610379565b610368888761034981611da3565b98506020811061035b5761035b611d3d565b1a60f81b60006004610d49565b600381111561037957610379611e71565b90506040518061016001604052806040518061012001604052808a81526020016101686103ca8d8c806103ab90611da3565b9d50602081106103bd576103bd611d3d565b1a60f81b60006014610d49565b6103d58d600a611e87565b6103df9190611e87565b6103e99190611eb5565b8152602001600185600381111561040257610402611e71565b14610439576104348c8b61041581611da3565b9c506020811061042757610427611d3d565b1a60f81b60286050610d49565b61043c565b60645b8152602001888152602001603c89108015610474575060b48c8b61045f81611da3565b9c506020811061047157610471611d3d565b1a105b1515815260200160788c8b61048881611da3565b9c506020811061049a5761049a611d3d565b1a106104d2576104cd8c8b6104ae81611da3565b9c50602081106104c0576104c0611d3d565b1a60f81b60026004610d49565b6104d5565b60015b81526020016104fa8c8b6104e881611da3565b9c506020811061035b5761035b611d3d565b600381111561050b5761050b611e71565b600381111561051c5761051c611e71565b8152602001600185600381111561053557610535611e71565b1461056c576105678c8b61054881611da3565b9c506020811061055a5761055a611d3d565b1a60f81b60326064610d49565b61056f565b60325b815260200184600381111561058657610586611e71565b9052815260208101869052604001846105c28b8a6105a381611da3565b9b50602081106105b5576105b5611d3d565b1a60f81b60506078610d49565b6105cc9088611ec9565b6105d69190611ee0565b81526020018381526020018360041461061b576106168a896105f781611da3565b9a506020811061060957610609611d3d565b1a60f81b60016006610d49565b610648565b6106488a8961062981611da3565b9a506020811061063b5761063b611d3d565b1a60f81b60046006610d49565b815260200161067a8a8961065b81611da3565b9a506020811061066d5761066d611d3d565b1a60f81b609660c8610d49565b81526020016106ac8a8961068d81611da3565b9a506020811061069f5761069f611d3d565b1a60f81b6046605a610d49565b81526020018481526020018988806106c390611da3565b9950602081106106d5576106d5611d3d565b1a81526020018260038111156106ed576106ed611e71565b815260200160326107148b8a61070281611da3565b9b506020811061032257610322611d3d565b109052985050505050505050505b92915050565b60608160e00151600161073b9190611e87565b6001600160401b0381111561075257610752611ef8565b60405190808252806020026020018201604052801561078557816020015b60608152602001906001900390816107705790505b50905060006040518060a001604052808460200151815260200184606001518152602001846060015181526020018460a001518152602001600160038111156107d0576107d0611e71565b85610120015160038111156107e7576107e7611e71565b149052905060005b8360e001518110156108b75761081081856101000151848760000151610dae565b83828151811061082257610822611d3d565b60200260200101819052508360400151826000018181516108439190611ec9565b905250608084015160208301805161085c908390611e87565b905250602082015161087090600290611ee0565b61087b906002611e52565b604083015260c0840151606083015160649161089691611e52565b6108a09190611ee0565b6060830152806108af81611da3565b9150506107ef565b50604083015181516108e4916108cc91611e87565b845160e08601516108df90600190611ec9565b6110ba565b82600184516108f39190611ec9565b8151811061090357610903611d3d565b602002602001018190525050919050565b60606001826101200151600381111561092f5761092f611e71565b03610943576040516020016101e690611f1f565b816101400151156109e157600061016861095b6112de565b845160c00151600381111561097257610972611e71565b6004811061098257610982611d3d565b602002015184515160ff9091169061099b9060b4611e87565b6109a59190611e87565b6109af9190611eb5565b90506109ba81610af7565b6040516020016109ca9190611f43565b604051602081830303815290604052915050919050565b6040516020016101e690611f76565b6060610a4e8284610a1e57604051602001610a0a90611f81565b604051602081830303815290604052610a3b565b60405180610160016040528061013a815260200161403661013a91395b866040516020016101c293929190611fdd565b604051602001610a5e9190611e23565b60405160208183030381529060405290509392505050565b6060600080610a848461130f565b91509150610a92828261146b565b949350505050565b60008082604051602001610ab091815260200190565b60408051808303601f19018152919052805160209091012090506000610168610adf600a84901a84841a611e52565b610ae99190611eb5565b9050610a9261016882611eb5565b606081600003610b1e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610b485780610b3281611da3565b9150610b419050600a83611ee0565b9150610b22565b6000816001600160401b03811115610b6257610b62611ef8565b6040519080825280601f01601f191660200182016040528015610b8c576020820181803683370190505b5090505b8415610a9257610ba1600183611ec9565b9150610bae600a86611eb5565b610bb9906030611e87565b60f81b818381518110610bce57610bce611d3d565b60200101906001600160f81b031916908160001a905350610bf0600a86611ee0565b9450610b90565b60608151600003610c1657505060408051602081019091526000815290565b60006040518060600160405280604081526020016141706040913990506000600384516002610c459190611e87565b610c4f9190611ee0565b610c5a906004611e52565b6001600160401b03811115610c7157610c71611ef8565b6040519080825280601f01601f191660200182016040528015610c9b576020820181803683370190505b509050600182016020820185865187015b80821015610d07576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050610cac565b5050600386510660018114610d235760028114610d3657610d3e565b603d6001830353603d6002830353610d3e565b603d60018303535b509195945050505050565b600080610100610d5e60f887901c60016120fa565b610d69906064612124565b610d739190612152565b63ffffffff1690506064610d878585611ec9565b610d919083611e52565b610d9b9190611ee0565b610da59085611e87565b95945050505050565b6060610dbe61018f8660c8611e52565b83608001518015610dcd575085155b610e0857604051806040016040528060198152602001781e33903334b63a32b91e93bab9361411b9b430b237bb94939f60391b815250610e39565b604051806040016040528060178152602001761e33903334b63a32b91e93bab9361411b3b637bb94939f60491b8152505b604051602001610e4a9291906121fd565b60408051601f1981840301815282825260208301879052925060009101604051602081830303815290604052805190602001208660208110610e8e57610e8e611d3d565b604086015191901a9150600090610ea790618ca0611ee0565b905060005b8560400151811015610f46576000610ec68660018b611577565b905084610f0f87868a600001516005610edf9190611e87565b6064610eeb8989611e52565b610ef59190611ee0565b610efe8d611638565b610f09906005611e87565b87611693565b604051602001610f20929190611d75565b604051602081830303815290604052945050600281610f3f9190611e87565b9050610eac565b5082610f5661018f8960c8611e52565b86608001518015610f65575088155b610fa057604051806040016040528060198152602001781e33903334b63a32b91e93bab9361411b9b430b237bb94939f60391b815250610fd1565b604051806040016040528060178152602001761e33903334b63a32b91e93bab9361411b3b637bb94939f60491b8152505b604051602001610fe39392919061221f565b60408051601f19818403018152919052925060015b856040015181101561108d5760006110128660028b611577565b905084611056878660058b6000015161102b9190611ec9565b60646110378989611e52565b6110419190611ee0565b600561104c8e611638565b610f099190611ec9565b604051602001611067929190611d75565b6040516020818303038152906040529450506002816110869190611e87565b9050610ff8565b508260405160200161109f91906122df565b60405160208183030381529060405292505050949350505050565b606060006110cb8460000151610af7565b6110d88560200151610af7565b6040516020016110e9929190611d75565b604051602081830303815290604052905080611112856000015186604001518760600151611937565b61113586602001518760400151601e89606001516111309190611ec9565b611937565b61114361018f8760c8611e52565b61114c89610af7565b6003896101000151600381111561116557611165611e71565b1461117b576111768960008a611577565b61119a565b60405160200161118a9061230b565b6040516020818303038152906040525b60038a610100015160038111156111b3576111b3611e71565b146111d95760405180604001604052806003815260200162060e0f60eb1b8152506111f7565b6040518060400160405280600481526020016306260e0f60e31b8152505b60038b6101000151600381111561121057611210611e71565b1461122e576112298b60e00151601961018f9190611e87565b61124b565b6040518060400160405280600381526020016203130360ec1b8152505b60038c6101000151600381111561126457611264611e71565b1461128e578860405160200161127a9190612336565b6040516020818303038152906040526112ad565b60405160200161129d9061236a565b6040516020818303038152906040525b6040516020016112c599989796959493929190612421565b6040516020818303038152906040529150509392505050565b6112e6611b78565b506040805160808101825260008152600f6020820152603c918101919091526078606082015290565b611317611b96565b61131f611b96565b6040805160c081018252600a60808201908152692130b9b29021b7b637b960b11b60a083015281528151808301835260068152654c6576656c7360d01b6020828101919091528083019190915282518084018452601081526f2130b1b5b3b937bab7321021b7b637b960811b81830152828401528251808401909352600883526726baba30ba34b7b760c11b9083015260608101919091528351519092506113c690610af7565b815260e08301516113d690610af7565b602082015261014083015161140757604051806040016040528060048152602001634e6f6e6560e01b815250611426565b6040518060400160405280600581526020016421b7b637b960d91b8152505b6040820152611433611966565b836101200151600381111561144a5761144a611e71565b6004811061145a5761145a611d3d565b602002015160608201529092909150565b606060405160200161147c906125da565b604051602081830303815290604052905060005b61149c60016004611ec9565b81101561150857818482600481106114b6576114b6611d3d565b60200201518483600481106114cd576114cd611d3d565b60200201516040516020016114e493929190612635565b6040516020818303038152906040529150808061150090611da3565b915050611490565b50808361151760016004611ec9565b6004811061152757611527611d3d565b60200201518361153960016004611ec9565b6004811061154957611549611d3d565b602002015160405160200161156093929190612695565b604051602081830303815290604052905092915050565b606060008360011461158d578460200151611590565b84515b905061159a6112de565b8560c0015160038111156115b0576115b0611e71565b600481106115c0576115c0611d3d565b602002015160ff168560a00151846115d89190611eb5565b6115e29190611e52565b6115ec9082611e87565b90506000856080015161160357856060015161161d565b61160e846007611e52565b866060015161161d9190611e87565b905061162e82876040015183611937565b9695505050505050565b60008082604001516064846000015160026116539190611e52565b61165f9061013a611e52565b6116699190611ee0565b6116739190611ee0565b90508260600151811061168a57826060015161168c565b805b9392505050565b606060558660ff16101561176e576116aa85610af7565b6116b384610af7565b600289610100015160038111156116cc576116cc611e71565b14806116ee5750600389610100015160038111156116ec576116ec611e71565b145b6117135760405180604001604052806003815260200162060e0f60eb1b815250611731565b6040518060400160405280600481526020016306260e0f60e31b8152505b61173b8a86611a00565b61174488610af7565b604051602001611758959493929190612750565b604051602081830303815290604052905061162e565b60aa8660ff1610156118535761178385610af7565b61179d6064611793866050611e52565b61018f9190611ee0565b6117ad6064611793876096611e52565b60028a610100015160038111156117c6576117c6611e71565b14806117e8575060038a610100015160038111156117e6576117e6611e71565b145b61180d5760405180604001604052806003815260200162060e0f60eb1b81525061182b565b6040518060400160405280600481526020016306260e0f60e31b8152505b6118358b87611a00565b61183e89610af7565b604051602001611758969594939291906127fe565b600060b4611862856064611e52565b61186c9190611ee0565b90506118c36002896101000151600381111561188a5761188a611e71565b14806118ac5750600389610100015160038111156118aa576118aa611e71565b145b6118b7576000610af7565b61018f826103e8611ee0565b6040516020016118d391906128ae565b6040516020818303038152906040526118ec8985611a00565b6118f587610af7565b6118fe89610af7565b61190785610af7565b60405160200161191b9594939291906128f1565b6040516020818303038152906040529150509695505050505050565b606061194284610af7565b61194b84610af7565b61195484610af7565b604051602001610a5e93929190612a30565b61196e611b96565b506040805160c081018252600460808201908152634e6f6e6560e01b60a0830152815281518083018352600f81526e42696f6c756d696e657363656e636560881b602082810191909152808301919091528251808401845260058152645665696e7360d81b818301528284015282518084019093526006835265416c62696e6f60d01b90830152606081019190915290565b606060038361010001516003811115611a1b57611a1b611e71565b14611a265781611a45565b604051602001611a359061230b565b6040516020818303038152906040525b60038461010001516003811115611a5e57611a5e611e71565b14611a695782611a88565b604051602001611a789061236a565b6040516020818303038152906040525b611a9461018f86611aa6565b60405160200161156093929190612ad7565b60008060405180608001604052808460e00151815260200160328152602001601e815260200160648152509050808361010001516003811115611aeb57611aeb611e71565b60048110611afb57611afb611d3d565b60200201519392505050565b604051806101600160405280611b1b611bbd565b8152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006003811115611b6b57611b6b611e71565b8152600060209091015290565b60405180608001604052806004906020820280368337509192915050565b60405180608001604052806004905b6060815260200190600190039081611ba55790505090565b604051806101200160405280600081526020016000815260200160008152602001600081526020016000151581526020016000815260200160006003811115611c0857611c08611e71565b81526020016000815260200160006003811115611c2757611c27611e71565b905290565b8035610722565b60008060408385031215611c4957611c49600080fd5b6000611c558585611c2c565b9250506020611c6685828601611c2c565b9150509250929050565b60005b83811015611c8b578181015183820152602001611c73565b83811115611c9a576000848401525b50505050565b6000611caa825190565b808452602084019350611cc1818560208601611c70565b601f01601f19169290920192915050565b60608082528101611ce38186611ca0565b90508181036020830152611cf78185611ca0565b90508181036040830152610da58184611ca0565b600060208284031215611d2057611d20600080fd5b6000610a928484611c2c565b6020808252810161168c8184611ca0565b634e487b7160e01b600052603260045260246000fd5b6000611d5d825190565b611d6b818560208601611c70565b9290920192915050565b6000611d818285611d53565b9150610a928284611d53565b634e487b7160e01b600052601160045260246000fd5b60006000198203611db657611db6611d8d565b5060010190565b630d0e6d8560e31b815260005b5060040190565b672c3830252c36302560c01b815260005b5060080190565b6000611df58286611d53565b9150611e0082611dbd565b9150611e0c8285611d53565b9150611e1782611dd1565b9150610da58284611d53565b7919185d184e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60321b8152601a01600061168c8284611d53565b6000816000190483118215151615611e6c57611e6c611d8d565b500290565b634e487b7160e01b600052602160045260246000fd5b60008219821115611e9a57611e9a611d8d565b500190565b634e487b7160e01b600052601260045260246000fd5b600082611ec457611ec4611e9f565b500690565b600082821015611edb57611edb611d8d565b500390565b6000825b925082611ef357611ef3611e9f565b500490565b634e487b7160e01b600052604160045260246000fd5b630233030360e41b81526000611dca565b600061072282611f0e565b682c3430252c3630252960b81b815260005b5060090190565b6000611f4e82611dbd565b9150611f5a8284611d53565b915061168c82611f2a565b6311a3232360e11b81526000611dca565b600061072282611f65565b600081610722565b61111f60f11b815260005b5060020190565b661e39ba3cb6329f60c91b815260005b5060070190565b671e17b9ba3cb6329f60c11b81526000611de2565b651e17b9bb339f60d11b815260005b5060060190565b7f3c7376672077696474683d22313030252220786d6c6e733d22687474703a2f2f81527f7777772e77332e6f72672f323030302f7376672220786d6c6e733a786c696e6b60208201527f3d22687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b222060408201527f69643d22746865737667222076696577426f783d222d373030202d373030203160608201526901a181810189a181811160b51b608082015278039ba3cb6329e913130b1b5b3b937bab73216b1b7b637b91d1603d1b608a82015260a30160006120b68286611d53565b91506120c182611f89565b91506120cc82611f9b565b91506120d88285611d53565b91506120e382611fb2565b91506120ef8284611d53565b9150610da582611fc7565b600063ffffffff8216915063ffffffff831692508263ffffffff03821115611e9a57611e9a611d8d565b600063ffffffff8216915063ffffffff831692508163ffffffff0483118215151615611e6c57611e6c611d8d565b600063ffffffff8216915063ffffffff8316611ee4565b7f3c67207374796c653d277472616e73666f726d3a20726f74617465283064656781527f29207363616c652831303025293b20616e696d6174696f6e3a207363616c655560208201527f702038732063756269632d62657a696572282e32342c2e39352c2e362c31292060408201526403137ba34160dd1b606082015260650190565b6336b9939f60e11b81526000611dca565b600061220882612169565b91506122148285611d53565b9150611d81826121ec565b600061222b8286611d53565b7f3c2f673e3c2f673e3c67207374796c653d277472616e73666f726d3a20726f7481527f617465283064656729207363616c652831303025293b20616e696d6174696f6e60208201527f3a207363616c6555702038732063756269632d62657a696572282e32342c2e3960408201526c01a96171b161894903137ba341609d1b6060820152606d0191506122bf8285611d53565b9150611e17826121ec565b671e17b39f1e17b39f60c11b81526000611de2565b60006122eb8284611d53565b915061168c826122ca565b64626c61636b60d81b815260005b5060050190565b6000610722826122f6565b6475726c282360d81b81526000612304565b602960f81b81526000611db6565b600061234182612316565b915061234d8284611d53565b915061168c82612328565b64776869746560d81b81526000612304565b600061072282612358565b61139f60f11b81526000611f94565b6213979f60e91b815260005b5060030190565b68207374726f6b653d2760b81b81526000611f3c565b6f27207374726f6b652d77696474683d2760801b815260005b5060100190565b6f272066696c6c2d6f7061636974793d2760801b815260006123c6565b61252760f01b81526000611f94565b662066696c6c3d2760c81b81526000611fab565b6613979f1e17b39f60c91b81526000611fab565b733c72616469616c4772616469656e742069643d2760601b8152601401600061244a828c611d53565b915061245582612375565b7f3c73746f70206f66667365743d273025272073746f702d636f6c6f723d2700008152601e019150612487828b611d53565b915061249282612384565b7f3c73746f70206f66667365743d2731303025272073746f702d636f6c6f723d27815260200191506124c4828a611d53565b91506124cf82612384565b701e17b930b234b0b623b930b234b2b73a1f60791b815260110191506124f482612169565b91506125008289611d53565b915061250b826121ec565b6a3c636972636c6520723d2760a81b8152600b01915061252b8288611d53565b76272066696c7465723d2775726c2823736861646f77292760481b8152601701915061255682612397565b91506125628287611d53565b915061256d826123ad565b91506125798286611d53565b9150612584826123cd565b91506125908285611d53565b915061259b826123ea565b91506125a6826123f9565b91506125b28284611d53565b91506125bd8261240d565b9b9a5050505050505050505050565b605b60f81b81526000611db6565b6000610722826125cc565b6e3d913a3930b4ba2fba3cb832911d1160891b8152600f0190565b61088b60f21b81526000611f94565b68113b30b63ab2911d1160b91b81526000611f3c565b62089f4b60ea1b81526000612390565b60006126418286611d53565b915061264c826125e5565b91506126588285611d53565b915061266382612600565b915061266e8261260f565b915061267a8284611d53565b9150610da582612625565b62227d5d60e81b81526000612390565b60006126a18286611d53565b91506126ac826125e5565b91506126b88285611d53565b91506126c382612600565b91506126ce8261260f565b91506126da8284611d53565b9150610da582612685565b641110391e9160d91b81526000612304565b6f111039ba3937b5b296bbb4b23a341e9160811b815260006123c6565b7a04440e6e8f2d8ca7a44e8e4c2dce6ccdee4da7440e4dee8c2e8ca5602b1b8152601b0190565b673232b3949110179f60c11b81526000611de2565b6b1e31b4b931b6329031bc9e9160a11b8152600c0160006127718288611d53565b915061277c826126e5565b91506127888287611d53565b9150612793826126f7565b915061279f8286611d53565b91506127ab8285611d53565b91506127b682612714565b91506127c28284611d53565b91506127cd8261273b565b979650505050505050565b651110393c1e9160d11b81526000611fd6565b651110393c9e9160d11b81526000611fd6565b6c1e32b63634b839b29031bc9e9160991b8152600d0160006128208289611d53565b915061282b826127d8565b91506128378288611d53565b9150612842826127eb565b915061284e8287611d53565b9150612859826126f7565b91506128658286611d53565b91506128718285611d53565b915061287c82612714565b91506128888284611d53565b91506128938261273b565b98975050505050505050565b610e0f60f31b81526000611f94565b60006128ba8284611d53565b915061168c8261289f565b690e0f05240e6c6c2d8ca560b31b815260005b50600a0190565b64129491179f60d91b81526000612304565b7f3c7061746820643d224d2030203330302043203020333030202d31353020323481527f30202d313730203137302043202d32323020302030202d3330302030202d333060208201527f3020432030202d3330302032323020302031373020313730204320313530203260408201526f1a18101810199818101810199818102d60811b60608201526070016000612987826126f7565b91506129938288611d53565b915061299f8287611d53565b91506129aa82612714565b91506129b68286611d53565b7464656729207472616e736c617465283070782c202d60581b815260150191506129e08285611d53565b91506129eb826128c5565b91506129f78284611d53565b91506127cd826128df565b61016160f51b81526000611f94565b6201296160ed1b81526000612390565b61252960f01b81526000611f94565b6000612a3b82611dbd565b9150612a478286611d53565b9150612a5282612a02565b9150612a5e8285611d53565b9150612a6982612a11565b9150612a758284611d53565b9150610da582612a21565b69111039ba3937b5b29e9160b11b815260006128d8565b6711103334b6361e9160c11b81526000611de2565b6f11103334b63616b7b830b1b4ba3c9e9160811b815260006123c6565b602560f81b81526000611db6565b6000612ae282612a80565b9150612aee8286611d53565b9150612af982612a97565b9150612b058285611d53565b9150612b1082612aac565b9150612b1c8284611d53565b9150610da582612ac956fe2220723d223130222069643d2268696e74223e3c2f636972636c653e3c672066696c7465723d2275726c2823736861646f772d736d616c6c223e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f746174652830646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f74617465283630646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f7461746528313230646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f7461746528313830646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f7461746528323430646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f7461746528333030646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c2f673e3c672066696c7465723d2275726c2823736861646f772d736d616c6c223e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f74617465283330646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f74617465283930646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f7461746528313530646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f7461746528323130646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f7461746528323730646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223237222072783d22313522207374796c653d227472616e73666f726d3a20726f7461746528333330646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c2031292030732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c2f673e3c2f673e3c2f7376673e3c646566733e203c7061747465726e2069643d227061747465726e2d636972636c65732220783d22302220793d2230222077696474683d22383022206865696768743d2233303022207061747465726e556e6974733d227573657253706163654f6e55736522207061747465726e436f6e74656e74556e6974733d227573657253706163654f6e557365223e203c7265637420783d22302220793d2230222077696474683d223130302522206865696768743d2231303025222066696c6c3d2270696e6b222f3e203c7465787420783d22302220793d22302220636c6173733d22686561767922207472616e73666f726d3d22726f7461746528393029223e204d455247453c2f746578743e203c2f7061747465726e3e203c66696c7465722069643d22736861646f77222020783d222d3430252220793d222d343025222077696474683d223138302522206865696768743d2231383025223e203c6665436f6c6f724d617472697820747970653d226d6174726978222076616c7565733d20202022302030203020302020203020302030203020302020203020302030203020302020203020302030203020302e372030222f3e203c6665476175737369616e426c757220737464446576696174696f6e3d2231382220726573756c743d22636f6c6f726564426c7572222f3e203c66654d657267653e203c66654d657267654e6f646520696e3d22636f6c6f726564426c7572222f3e203c66654d657267654e6f646520696e3d22536f7572636547726170686963222f3e203c2f66654d657267653e203c2f66696c7465723e203c66696c746572202069643d22736861646f772d736d616c6c2220783d222d3330252220793d222d333025222077696474683d223136302522206865696768743d2231363025223e203c6665476175737369616e426c757220726573756c743d22626c75724f75742220696e3d22536f75726365416c7068612220737464446576696174696f6e3d223422202f3e203c66654d657267653e203c66654d657267654e6f646520696e3d22626c75724f7574222f3e203c66654d657267654e6f646520696e3d22536f7572636547726170686963222f3e203c2f66654d657267653e203c2f66696c7465723e203c66696c7465722069643d22676c6f772220783d222d3330252220793d222d333025222077696474683d223136302522206865696768743d2231363025223e203c6665476175737369616e426c757220737464446576696174696f6e3d2233302220726573756c743d22636f6c6f726564426c7572222f3e203c66654d657267653e203c66654d657267654e6f646520696e3d22636f6c6f726564426c7572222f3e203c66654d657267654e6f646520696e3d22536f7572636547726170686963222f3e203c2f66654d657267653e203c2f66696c7465723e203c2f646566733e406b65796672616d6573206c6561664c6f6164207b203025207b20726f746174653a20306465673b207d20373025207b20726f746174653a202d31306465673b207d2031303025207b20726f746174653a203336306465673b207d7d20406b65796672616d6573207363616c655570207b203025207b7363616c653a20313025203130253b726f746174653a2034356465673b207d2031303025207b7363616c653a203130302520313030253b726f746174653a20306465673b207d7d406b65796672616d65732077696e64207b203025207b7472616e736c6174653a203070783b7363616c653a20313030253b207d20353025207b7472616e736c6174653a202d31303070783b7363616c653a203935253b207d2031303025207b7472616e736c6174653a203070783b7363616c653a20313030253b207d7d4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c7376672077696474683d22313030252220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672220786d6c6e733a786c696e6b3d22687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b222069643d22746865737667222076696577426f783d222d373030202d37303020313430302031343030223e202020203c7374796c653e406b65796672616d6573206c6561664c6f6164207b3025207b726f746174653a206e6f6e653b7d373025207b726f746174653a202d31306465673b7d31303025207b726f746174653a203336306465673b7d7d406b65796672616d6573207363616c655570207b3025207b726f746174653a2034356465673b7363616c653a203130253b7d31303025207b726f746174653a206e6f6e653b7363616c653a20313030253b7d7d406b65796672616d6573207363616c654f7363696c6c617465207b3025207b7472616e736c6174653a20303b7363616c653a20313030253b7d353025207b7472616e736c6174653a202d3570783b7363616c653a203938253b7d31303025207b7472616e736c6174653a20303b7363616c653a20313030253b7d7d406b65796672616d65732077696e64207b3025207b7472616e736c6174653a20303b7363616c653a20313030253b7d353025207b7472616e736c6174653a202d323070783b7363616c653a20313031253b7d31303025207b7472616e736c6174653a20303b7363616c653a20313030253b7d7d406b65796672616d65732077696e64526f74617465207b3025207b726f746174653a206e6f6e653b7d353025207b726f746174653a202d2e356465673b7d31303025207b726f746174653a206e6f6e653b7d7d237374656d207b7472616e73666f726d2d6f726967696e3a20626f74746f6d3b7d2e616e74686572207b616e696d6174696f6e3a20616e74686572426c6f6f6d2031307320656173652d696e2d6f75743b7d406b65796672616d657320616e74686572426c6f6f6d207b3025207b7363616c653a203230253b7d353025207b7363616c653a20313230253b7d31303025207b7363616c653a20313030253b7d7d3c2f7374796c653e202020203c646566733e20202020202020203c66696c7465722066696c746572556e6974733d227573657253706163654f6e557365222069643d22736861646f772220783d222d3530252220793d222d353025222077696474683d223230302522206865696768743d2232303025223e2020202020202020202020203c66654f666673657420726573756c743d226f66664f75742220696e3d22536f75726365416c706861222064783d2230222064793d2230223e3c2f66654f66667365743e2020202020202020202020203c6665476175737369616e426c757220726573756c743d22626c75724f75742220696e3d226f66664f75742220737464446576696174696f6e3d223230223e3c2f6665476175737369616e426c75723e2020202020202020202020203c6665426c656e6420696e3d22536f75726365477261706869632220696e323d22626c75724f757422206d6f64653d226e6f726d616c223e3c2f6665426c656e643e20202020202020203c2f66696c7465723e20202020202020203c66696c7465722069643d22736861646f772d736d616c6c2220783d222d3530252220793d222d353025222077696474683d223230302522206865696768743d2232303025223e2020202020202020202020203c6665476175737369616e426c757220726573756c743d22626c75724f75742220696e3d22536f75726365416c7068612220737464446576696174696f6e3d2235223e3c2f6665476175737369616e426c75723e2020202020202020202020203c6665426c656e6420696e3d22536f75726365477261706869632220696e323d22626c75724f757422206d6f64653d226e6f726d616c223e3c2f6665426c656e643e20202020202020203c2f66696c7465723e2020202020202020202020203c2f646566733e202020203c726563742069643d227374656d2220783d222d31302220793d2230222077696474683d22303022206865696768743d2232303030222066696c6c3d22677265656e223e3c2f726563743e202020203c672069643d22666c6f77657222207374796c653d22616e696d6174696f6e3a20347320656173652d696e2d6f757420307320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e672077696e643b223e3c672066696c7465723d2275726c2823736861646f7729223e3c7061746820643d224d202d302e343737202d3133372e3030362043202d302e343737202d3133372e303036202d36302e313037202d34342e313536202d35312e343436202d302e3336332043202d34362e3731342032332e353636202d32322e3939382035302e38343820312e3338372035302e32363720432032342e3638362034392e3731322034342e3934382032322e3339392034392e353037202d302e34353620432035382e303532202d34332e323933202d302e343737202d3133372e303036202d302e343737202d3133372e303036205a22207374796c653d227472616e73666f726d3a20726f74617465283064656729207363616c652831293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e33732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e337320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e367320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f706174683e3c7061746820643d224d202d302e343737202d3133372e3030362043202d302e343737202d3133372e303036202d36302e313037202d34342e313536202d35312e343436202d302e3336332043202d34362e3731342032332e353636202d32322e3939382035302e38343820312e3338372035302e32363720432032342e3638362034392e3731322034342e3934382032322e3339392034392e353037202d302e34353620432035382e303532202d34332e323933202d302e343737202d3133372e303036202d302e343737202d3133372e303036205a22207374796c653d227472616e73666f726d3a20726f746174652831383064656729207363616c652831293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e33732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e337320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e367320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f706174683e3c2f673e3c672066696c7465723d2275726c2823736861646f7729223e3c7061746820643d224d202d302e343737202d3133372e3030362043202d302e343737202d3133372e303036202d36302e313037202d34342e313536202d35312e343436202d302e3336332043202d34362e3731342032332e353636202d32322e3939382035302e38343820312e3338372035302e32363720432032342e3638362034392e3731322034342e3934382032322e3339392034392e353037202d302e34353620432035382e303532202d34332e323933202d302e343737202d3133372e303036202d302e343737202d3133372e303036205a22207374796c653d227472616e73666f726d3a20726f7461746528393064656729207363616c652831293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e33732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e337320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e367320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f706174683e3c7061746820643d224d202d302e343737202d3133372e3030362043202d302e343737202d3133372e303036202d36302e313037202d34342e313536202d35312e343436202d302e3336332043202d34362e3731342032332e353636202d32322e3939382035302e38343820312e3338372035302e32363720432032342e3638362034392e3731322034342e3934382032322e3339392034392e353037202d302e34353620432035382e303532202d34332e323933202d302e343737202d3133372e303036202d302e343737202d3133372e303036205a22207374796c653d227472616e73666f726d3a20726f746174652832373064656729207363616c652831293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e33732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e337320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e367320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f706174683e3c2f673e3c672066696c7465723d2275726c2823736861646f7729223e3c656c6c697073652063783d2230222063793d223430222072783d22333022207374796c653d227472616e73666f726d3a20726f746174652830646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e32732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e327320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e347320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223430222072783d22333022207374796c653d227472616e73666f726d3a20726f74617465283930646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e32732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e327320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e347320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223430222072783d22333022207374796c653d227472616e73666f726d3a20726f7461746528313830646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e32732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e327320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e347320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223430222072783d22333022207374796c653d227472616e73666f726d3a20726f7461746528323730646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e32732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e327320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e347320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c2f673e3c672066696c7465723d2275726c2823736861646f7729223e3c656c6c697073652063783d2230222063793d223430222072783d22333022207374796c653d227472616e73666f726d3a20726f74617465283435646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e32732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e327320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e347320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223430222072783d22333022207374796c653d227472616e73666f726d3a20726f7461746528313335646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e32732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e327320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e347320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223430222072783d22333022207374796c653d227472616e73666f726d3a20726f7461746528323235646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e32732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e327320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e347320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c656c6c697073652063783d2230222063793d223430222072783d22333022207374796c653d227472616e73666f726d3a20726f7461746528333135646567293b20616e696d6174696f6e3a203130732063756269632d62657a69657228302e32342c20302e39352c20302e362c20312920302e32732031206e6f726d616c20626f74682072756e6e696e67207363616c6555702c20377320656173652d696e2d6f757420302e327320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67206c6561664c6f61642c20347320656173652d696e2d6f75742031302e347320696e66696e697465206e6f726d616c206e6f6e652072756e6e696e67207363616c654f7363696c6c6174653b222066696c6c3d2268736c283132362c203630252c2035302529222066696c6c2d6f7061636974793d22302e3722207374726f6b653d2268736c283132362c203630252c2035302529223e3c2f656c6c697073653e3c2f673e3c636972636c652066696c6c3d22a2646970667358221220e65c41d49f145c85a1f7e79f4392c165fa303a8bc221e425636b095a46e4dc8c64736f6c634300080f0033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

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

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.