Source Code
Overview
HYPE Balance
HYPE Value
Less Than $0.01 (@ $22.08/HYPE)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 9,543 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 25543509 | 4 hrs ago | IN | 0 HYPE | 0.00002477 | ||||
| Set Approval For... | 25535576 | 7 hrs ago | IN | 0 HYPE | 0.00020252 | ||||
| Set Approval For... | 25519780 | 11 hrs ago | IN | 0 HYPE | 0.00001255 | ||||
| Set Approval For... | 25518409 | 11 hrs ago | IN | 0 HYPE | 0.00014952 | ||||
| Set Approval For... | 22697318 | 32 days ago | IN | 0 HYPE | 0.00001242 | ||||
| Set Approval For... | 22017939 | 40 days ago | IN | 0 HYPE | 0.00004118 | ||||
| Set Approval For... | 21536707 | 45 days ago | IN | 0 HYPE | 0.00004262 | ||||
| Set Approval For... | 20330171 | 59 days ago | IN | 0 HYPE | 0.00006512 | ||||
| Set Approval For... | 20063644 | 62 days ago | IN | 0 HYPE | 0.00013116 | ||||
| Set Approval For... | 19431539 | 69 days ago | IN | 0 HYPE | 0.00002779 | ||||
| Set Approval For... | 19139202 | 73 days ago | IN | 0 HYPE | 0.00006759 | ||||
| Set Approval For... | 19139197 | 73 days ago | IN | 0 HYPE | 0.00006649 | ||||
| Set Approval For... | 18792054 | 77 days ago | IN | 0 HYPE | 0.00009721 | ||||
| Set Approval For... | 18791665 | 77 days ago | IN | 0 HYPE | 0.00056537 | ||||
| Set Approval For... | 18791353 | 77 days ago | IN | 0 HYPE | 0.00033007 | ||||
| Set Approval For... | 18790504 | 77 days ago | IN | 0 HYPE | 0.00013525 | ||||
| Set Approval For... | 18789982 | 77 days ago | IN | 0 HYPE | 0.00010725 | ||||
| Set Approval For... | 18306204 | 82 days ago | IN | 0 HYPE | 0.00007982 | ||||
| Set Approval For... | 18212622 | 83 days ago | IN | 0 HYPE | 0.00006286 | ||||
| Set Approval For... | 18212012 | 83 days ago | IN | 0 HYPE | 0.00007381 | ||||
| Set Approval For... | 18207640 | 83 days ago | IN | 0 HYPE | 0.00016121 | ||||
| Set Approval For... | 17536758 | 91 days ago | IN | 0 HYPE | 0.0000124 | ||||
| Set Approval For... | 17536697 | 91 days ago | IN | 0 HYPE | 0.00001211 | ||||
| Set Approval For... | 17443432 | 92 days ago | IN | 0 HYPE | 0.00000608 | ||||
| Set Approval For... | 16999686 | 97 days ago | IN | 0 HYPE | 0.00001804 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
HyperFrogs
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 500 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "../@openzeppelin/contracts/access/AccessControl.sol";
import "../@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "../@openzeppelin/contracts/utils/Strings.sol";
import "../@openzeppelin/contracts/utils/Base64.sol";
import "../erc721a/contracts/ERC721A.sol";
import "../@openzeppelin/contracts/token/common/ERC2981.sol";
// Trait contracts
import "./traits/FrogsBody.sol";
import "./traits/FrogsHats.sol";
import "./traits/FrogsEyesA.sol";
import "./traits/FrogsEyesB.sol";
import "./traits/FrogsMouth.sol";
import "./traits/FrogsFeet.sol";
import "./traits/FrogsBackdrop.sol";
import "./traits/FrogsOneOfOne.sol";
contract HyperFrogs is ERC721A, AccessControl, ReentrancyGuard, ERC2981 {
using Strings for uint256;
// Roles
bytes32 public constant CONTROLLER_ROLE = keccak256("CONTROLLER_ROLE");
// Custom errors for gas efficiency.
error MintNotActive();
error ExceedsMaxPerTx();
error IncorrectEthSent();
error WalletLimitReached();
error SoldOut();
error NoContracts();
error FreeMintNotActive();
error NotOnWhitelist();
error NoMoreFreeFrogs();
error TransferFailed();
/// Mint Settings
uint public constant maxSupply = 2222;
uint public mintPrice = 1 ether; // is 1 HYPE
uint public maxFree = 200;
uint public freeCount = 0;
bool public mintEnabled = false;
bool public freeMintEnabled = false;
/// Mint Rules
uint public maxMintPerTrans = 3;
uint public maxMintPerWallet = 3;
uint public maxMintOnWhitelist = 2;
/// One-of-one settings
uint public constant maxOneOfOne = 2;
uint public mintedOneOfOne = 0;
/// Whitelist Settings
mapping(address => bool) public freeList;
mapping(address => bool) public whitelist;
mapping(address => uint) public mintAmount;
uint public whitelistEndTime;
/// Trait structure (note: eyes now uses a combined selection from EyesA and EyesB)
struct TraitStruct {
bool oneOfOne;
uint oneOfOneIndex;
uint backdrop;
uint hat;
uint eyesIndex; // The chosen index from the eyes contract
bool eyesIsA; // true if selected from EyesA; false if from EyesB
uint mouth;
uint body;
uint feet;
}
mapping(uint => TraitStruct) public tokenTraits;
// Immutable external trait contracts
FrogsBody public immutable frogsBody;
FrogsHats public immutable frogsHats;
FrogsEyesA public immutable frogsEyesA;
FrogsEyesB public immutable frogsEyesB;
FrogsMouth public immutable frogsMouth;
FrogsFeet public immutable frogsFeet;
FrogsBackdrop public immutable frogsBackdrop;
FrogsOneOfOne public immutable frogsOneOfOne;
constructor(
address _body,
address _hats,
address _eyesA,
address _eyesB,
address _mouth,
address _feet,
address _backdrop,
address _oneOfOne
) ERC721A("HyperFrogs", "HYF") {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
_grantRole(CONTROLLER_ROLE, msg.sender);
frogsBody = FrogsBody(_body);
frogsHats = FrogsHats(_hats);
frogsEyesA = FrogsEyesA(_eyesA);
frogsEyesB = FrogsEyesB(_eyesB);
frogsMouth = FrogsMouth(_mouth);
frogsFeet = FrogsFeet(_feet);
frogsBackdrop = FrogsBackdrop(_backdrop);
frogsOneOfOne = FrogsOneOfOne(_oneOfOne);
_setDefaultRoyalty(msg.sender, 222);
}
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, AccessControl, ERC2981) returns (bool) {
return super.supportsInterface(interfaceId);
}
// Override to start token IDs at 1.
function _startTokenId() internal pure override returns (uint256) {
return 1;
}
function shouldMintOneOfOne(uint256 randomValue) internal view returns (bool) {
uint256 totalMinted = _totalMinted();
uint256 remainingSupply = maxSupply - totalMinted;
uint256 availableOneOfOne = maxOneOfOne - mintedOneOfOne;
// Probability: availableOneOfOne/remainingSupply.
return (availableOneOfOne > 0 && (randomValue % remainingSupply) < availableOneOfOne);
}
// Standard minting function using custom errors.
function mint(uint256 quantity) external payable {
if (!mintEnabled) revert MintNotActive();
if (quantity > maxMintPerTrans) revert ExceedsMaxPerTx();
// Calculate the total mints by this wallet
uint256 totalMintedByWallet = mintAmount[msg.sender] + quantity;
if (block.timestamp < whitelistEndTime) {
// Only whitelisted addresses can mint during this phase
if (!whitelist[msg.sender]) revert NotOnWhitelist();
if (totalMintedByWallet > maxMintOnWhitelist) revert ExceedsMaxPerTx();
} else {
// Public minting phase
if (totalMintedByWallet > maxMintPerWallet) revert ExceedsMaxPerTx();
}
if (msg.value != quantity * mintPrice) revert IncorrectEthSent();
mintAmount[msg.sender] = totalMintedByWallet;
// Proceed with minting
_internalMint(quantity);
}
function free_mint() external {
if (!freeList[msg.sender]) revert NotOnWhitelist();
if (!freeMintEnabled) revert FreeMintNotActive();
if (freeCount + 1 > maxFree) revert NoMoreFreeFrogs();
freeList[msg.sender] = false;
freeCount++;
_internalMint(1);
}
/// Generates traits for a given token.
function _generateTraits(uint256 tokenId, bytes32 blockHash) internal returns (TraitStruct memory) {
uint[5] memory randomSeeds = _randomSeed(blockHash, tokenId);
uint backdropTrait = 0;
// Decide if the token is a one-of-one
if (shouldMintOneOfOne(randomSeeds[0])) {
mintedOneOfOne++;
uint oneOfOneIndex = randomSeeds[1] % frogsOneOfOne.totalOneOfOne();
return TraitStruct({
oneOfOne: true,
oneOfOneIndex: oneOfOneIndex,
backdrop: backdropTrait,
hat: 0,
eyesIndex: 0,
eyesIsA: true,
mouth: 0,
body: 0,
feet: 0
});
}
// Generate normal traits
uint hatTrait = _pickTraitCumulative(randomSeeds[0], frogsHats.getHatsProbability(), 0);
uint mouthTrait = _pickTraitCumulative(randomSeeds[1], frogsMouth.getMouthProbability(), 0);
uint bodyTrait = _pickTraitCumulative(randomSeeds[2], frogsBody.getBodyProbability(), 0);
uint feetTrait = _pickTraitCumulative(randomSeeds[3], frogsFeet.getFeetProbability(), 0);
// Combined eyes trait selection:
uint eyesRandom = (randomSeeds[4] % 100) + 1; // Random number in [1, 100]
bool eyesIsA;
uint eyesIndex;
// EyesA cumulative probability is assumed to have a ceiling of 43.
if (eyesRandom <= 43) {
eyesIsA = true;
eyesIndex = _pickTraitCumulative(eyesRandom, frogsEyesA.getEyesAProbability(), 0);
} else {
eyesIsA = false;
uint adjustedRandom = eyesRandom - 43; // Adjust for EyesB range (total remaining 57)
eyesIndex = _pickTraitCumulative(adjustedRandom, frogsEyesB.getEyesBProbability(), 43);
}
return TraitStruct({
oneOfOne: false,
oneOfOneIndex: 0,
backdrop: backdropTrait,
hat: hatTrait,
eyesIndex: eyesIndex,
eyesIsA: eyesIsA,
mouth: mouthTrait,
body: bodyTrait,
feet: feetTrait
});
}
/// Helper: Iterates over a cumulative probability array.
/// The `offset` is used to normalize the thresholds.
function _pickTraitCumulative(uint randomValue, uint[] memory cumulativeArray, uint offset) internal pure returns (uint) {
for (uint i = 0; i < cumulativeArray.length; i++) {
if (randomValue <= cumulativeArray[i] - offset) {
return i;
}
}
return cumulativeArray.length - 1;
}
function _internalMint(uint256 quantity) internal {
uint256 totalMinted = _totalMinted();
if (totalMinted + quantity > maxSupply) revert SoldOut();
if (msg.sender != tx.origin) revert NoContracts();
uint256 startTokenID = _startTokenId() + totalMinted;
bytes32 currentBlockHash = blockhash(block.number - 1);
for (uint256 i = 0; i < quantity; i++) {
uint256 tokenId = startTokenID + i;
tokenTraits[tokenId] = _generateTraits(tokenId, currentBlockHash);
}
_safeMint(msg.sender, quantity);
}
/// Generates an array of 5 random seeds.
function _randomSeed(bytes32 _lastBlockHash, uint256 _tokenId) internal view returns (uint[5] memory _randomSeeds) {
bytes32 combinedSeed = keccak256(abi.encodePacked(_lastBlockHash, _tokenId, msg.sender, block.prevrandao, block.timestamp));
for (uint i = 0; i < 5; i++) {
unchecked {
_randomSeeds[i] = uint256(keccak256(abi.encodePacked(combinedSeed, i))) % 101;
}
}
return _randomSeeds;
}
function tokenURI(uint256 tokenId) public view override returns (string memory) {
string memory image = buildSVG(tokenId);
string memory base64Image = Base64.encode(bytes(image));
string memory json = string(
abi.encodePacked(
'{"name": "Hyper Frog #', tokenId.toString(), '",',
'"description": "Hyper Frogs are pure ASCII art frogs and live 100% onchain on Hyperliquid.",',
'"attributes": [', _getFrogTraits(tokenId), '],',
'"image": "data:image/svg+xml;base64,', base64Image, '"}'
)
);
return string(abi.encodePacked("data:application/json;base64,", Base64.encode(bytes(json))));
}
function buildSVG(uint tokenId) public view returns (string memory) {
require(_exists(tokenId), "Token does not exist");
TraitStruct memory traits = tokenTraits[tokenId];
if (traits.oneOfOne) {
return string(
abi.encodePacked(
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 90 90" shape-rendering="crispEdges" width="512" height="512">',
'<style>',
'svg {',
'width: 100%;',
'height: 100%;',
'margin: 0;',
'padding: 0;',
'overflow: hidden;',
'display: flex;',
'justify-content: center;',
'background:', frogsBackdrop.getBackdropData(traits.backdrop), ';',
'}',
'</style>',
'<rect width="90" height="90" fill="', frogsBackdrop.getBackdropData(traits.backdrop), '"/>',
_getSVGTraitData(frogsOneOfOne.getOneOfOneData(traits.oneOfOneIndex)),
'</svg>'
)
);
}
return string(
abi.encodePacked(
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 90 90" shape-rendering="crispEdges" width="512" height="512">',
'<style>',
'svg {',
'width: 100%;',
'height: 100%;',
'margin: 0;',
'padding: 0;',
'overflow: hidden;',
'display: flex;',
'justify-content: center;',
'background:', frogsBackdrop.getBackdropData(traits.backdrop), ';',
'}',
'</style>',
'<rect width="90" height="90" fill="', frogsBackdrop.getBackdropData(traits.backdrop), '"/>',
_getSVGTraitData(frogsBody.getBodyData(traits.body)),
_getSVGTraitData(frogsHats.getHatsData(traits.hat)),
// Choose eyes data from the appropriate trait contract.
_getSVGTraitData(traits.eyesIsA ? frogsEyesA.getEyesAData(traits.eyesIndex) : frogsEyesB.getEyesBData(traits.eyesIndex)),
_getSVGTraitData(frogsMouth.getMouthData(traits.mouth)),
_getSVGTraitData(frogsFeet.getFeetData(traits.feet)),
'</svg>'
)
);
}
function trimTrailingZeros(bytes memory data) internal pure returns (bytes memory) {
uint256 len = data.length;
// Find the last index that is not zero.
while (len > 0 && data[len - 1] == 0) {
len--;
}
// Create a new bytes array of the trimmed length.
bytes memory trimmed = new bytes(len);
for (uint256 i = 0; i < len; i++) {
trimmed[i] = data[i];
}
return trimmed;
}
function _getSVGTraitData(bytes memory data) internal pure returns (string memory) {
if (data.length == 0) return "";
// Trim trailing zero bytes before converting to string.
bytes memory trimmedData = trimTrailingZeros(data);
return string(trimmedData);
}
function _getFrogTraits(uint tokenId) internal view returns (string memory) {
TraitStruct memory traits = tokenTraits[tokenId];
// If this token is a one-of-one, return only its one-of-one trait.
if (traits.oneOfOne) {
string memory traitName = frogsOneOfOne.getOneOfOneTrait(traits.oneOfOneIndex);
return string(
abi.encodePacked(
'{"trait_type":"Backdrop", "value":"', frogsBackdrop.getBackdropTrait(traits.backdrop), '"},',
'{"trait_type":"Hat", "value":"', traitName, '"},',
'{"trait_type":"Eyes", "value":"', traitName, '"},',
'{"trait_type":"Mouth", "value":"', traitName, '"},',
'{"trait_type":"Body", "value":"', traitName, '"},',
'{"trait_type":"Feet", "value":"', traitName, '"}'
)
);
}
// Otherwise, return the standard traits.
string memory eyesTrait = traits.eyesIsA
? frogsEyesA.getEyesATrait(traits.eyesIndex)
: frogsEyesB.getEyesBTrait(traits.eyesIndex);
return string(
abi.encodePacked(
'{"trait_type":"Backdrop", "value":"', frogsBackdrop.getBackdropTrait(traits.backdrop), '"},',
'{"trait_type":"Hat", "value":"', frogsHats.getHatsTrait(traits.hat), '"},',
'{"trait_type":"Eyes", "value":"', eyesTrait, '"},',
'{"trait_type":"Mouth", "value":"', frogsMouth.getMouthTrait(traits.mouth), '"},',
'{"trait_type":"Body", "value":"', frogsBody.getBodyTrait(traits.body), '"},',
'{"trait_type":"Feet", "value":"', frogsFeet.getFeetTrait(traits.feet), '"}'
)
);
}
// --- Admin Functions (protected by DEFAULT_ADMIN_ROLE) ---
function toggleMinting() external onlyRole(DEFAULT_ADMIN_ROLE) {
mintEnabled = !mintEnabled;
}
function toggleFreeMinting() external onlyRole(DEFAULT_ADMIN_ROLE) {
freeMintEnabled = !freeMintEnabled;
}
function setMaxFree(uint _newMaxFree) external onlyRole(DEFAULT_ADMIN_ROLE) {
maxFree = _newMaxFree;
}
function devMint(uint _quantity) external onlyRole(DEFAULT_ADMIN_ROLE) {
_internalMint(_quantity);
}
function setWhitelistDuration(uint _whitelistDuration) external onlyRole(DEFAULT_ADMIN_ROLE) {
whitelistEndTime = block.timestamp + _whitelistDuration;
}
function addToWhitelist(address[] calldata addresses) external onlyRole(CONTROLLER_ROLE) nonReentrant {
for (uint i = 0; i < addresses.length; i++) {
whitelist[addresses[i]] = true;
}
}
function addToFreeList(address[] calldata addresses) external onlyRole(CONTROLLER_ROLE) nonReentrant {
for (uint i = 0; i < addresses.length; i++) {
freeList[addresses[i]] = true;
}
}
function withdraw() external onlyRole(DEFAULT_ADMIN_ROLE) nonReentrant {
(bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
if (!success) revert TransferFailed();
}
function setMintPrice(uint _newPrice) external onlyRole(DEFAULT_ADMIN_ROLE) {
mintPrice = _newPrice;
}
function setmaxMintOnWhitelist(uint _max) external onlyRole(DEFAULT_ADMIN_ROLE) {
maxMintOnWhitelist = _max;
}
function setMaxMintPerWallet(uint _max) external onlyRole(DEFAULT_ADMIN_ROLE) {
maxMintPerWallet = _max;
}
function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyRole(DEFAULT_ADMIN_ROLE) {
_setDefaultRoyalty(receiver, feeNumerator);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)
pragma solidity ^0.8.20;
import {IAccessControl} from "./IAccessControl.sol";
import {Context} from "../utils/Context.sol";
import {ERC165} from "../utils/introspection/ERC165.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```solidity
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```solidity
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
* to enforce additional security measures for this role.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address account => bool) hasRole;
bytes32 adminRole;
}
mapping(bytes32 role => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with an {AccessControlUnauthorizedAccount} error including the required role.
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual returns (bool) {
return _roles[role].hasRole[account];
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
* is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
* is missing `role`.
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert AccessControlUnauthorizedAccount(account, role);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleGranted} event.
*/
function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleRevoked} event.
*/
function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*
* May emit a {RoleRevoked} event.
*/
function renounceRole(bytes32 role, address callerConfirmation) public virtual {
if (callerConfirmation != _msgSender()) {
revert AccessControlBadConfirmation();
}
_revokeRole(role, callerConfirmation);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
if (!hasRole(role, account)) {
_roles[role].hasRole[account] = true;
emit RoleGranted(role, account, _msgSender());
return true;
} else {
return false;
}
}
/**
* @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
if (hasRole(role, account)) {
_roles[role].hasRole[account] = false;
emit RoleRevoked(role, account, _msgSender());
return true;
} else {
return false;
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (access/IAccessControl.sol)
pragma solidity ^0.8.20;
/**
* @dev External interface of AccessControl declared to support ERC-165 detection.
*/
interface IAccessControl {
/**
* @dev The `account` is missing a role.
*/
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
/**
* @dev The caller of a function is not the expected one.
*
* NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
*/
error AccessControlBadConfirmation();
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).
* Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*/
function renounceRole(bytes32 role, address callerConfirmation) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC2981.sol)
pragma solidity ^0.8.20;
import {IERC165} from "../utils/introspection/IERC165.sol";
/**
* @dev Interface for the NFT Royalty Standard.
*
* A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
* support for royalty payments across all NFT marketplaces and ecosystem participants.
*/
interface IERC2981 is IERC165 {
/**
* @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
* exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
*
* NOTE: ERC-2981 allows setting the royalty to 100% of the price. In that case all the price would be sent to the
* royalty receiver and 0 tokens to the seller. Contracts dealing with royalty should consider empty transfers.
*/
function royaltyInfo(
uint256 tokenId,
uint256 salePrice
) external view returns (address receiver, uint256 royaltyAmount);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/common/ERC2981.sol)
pragma solidity ^0.8.20;
import {IERC2981} from "../../interfaces/IERC2981.sol";
import {IERC165, ERC165} from "../../utils/introspection/ERC165.sol";
/**
* @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
*
* Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
* specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
*
* Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
* fee is specified in basis points by default.
*
* IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
* https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the ERC. Marketplaces are expected to
* voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
*/
abstract contract ERC2981 is IERC2981, ERC165 {
struct RoyaltyInfo {
address receiver;
uint96 royaltyFraction;
}
RoyaltyInfo private _defaultRoyaltyInfo;
mapping(uint256 tokenId => RoyaltyInfo) private _tokenRoyaltyInfo;
/**
* @dev The default royalty set is invalid (eg. (numerator / denominator) >= 1).
*/
error ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator);
/**
* @dev The default royalty receiver is invalid.
*/
error ERC2981InvalidDefaultRoyaltyReceiver(address receiver);
/**
* @dev The royalty set for a specific `tokenId` is invalid (eg. (numerator / denominator) >= 1).
*/
error ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator);
/**
* @dev The royalty receiver for `tokenId` is invalid.
*/
error ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver);
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {
return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @inheritdoc IERC2981
*/
function royaltyInfo(
uint256 tokenId,
uint256 salePrice
) public view virtual returns (address receiver, uint256 amount) {
RoyaltyInfo storage _royaltyInfo = _tokenRoyaltyInfo[tokenId];
address royaltyReceiver = _royaltyInfo.receiver;
uint96 royaltyFraction = _royaltyInfo.royaltyFraction;
if (royaltyReceiver == address(0)) {
royaltyReceiver = _defaultRoyaltyInfo.receiver;
royaltyFraction = _defaultRoyaltyInfo.royaltyFraction;
}
uint256 royaltyAmount = (salePrice * royaltyFraction) / _feeDenominator();
return (royaltyReceiver, royaltyAmount);
}
/**
* @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
* fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
* override.
*/
function _feeDenominator() internal pure virtual returns (uint96) {
return 10000;
}
/**
* @dev Sets the royalty information that all ids in this contract will default to.
*
* Requirements:
*
* - `receiver` cannot be the zero address.
* - `feeNumerator` cannot be greater than the fee denominator.
*/
function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
uint256 denominator = _feeDenominator();
if (feeNumerator > denominator) {
// Royalty fee will exceed the sale price
revert ERC2981InvalidDefaultRoyalty(feeNumerator, denominator);
}
if (receiver == address(0)) {
revert ERC2981InvalidDefaultRoyaltyReceiver(address(0));
}
_defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
}
/**
* @dev Removes default royalty information.
*/
function _deleteDefaultRoyalty() internal virtual {
delete _defaultRoyaltyInfo;
}
/**
* @dev Sets the royalty information for a specific token id, overriding the global default.
*
* Requirements:
*
* - `receiver` cannot be the zero address.
* - `feeNumerator` cannot be greater than the fee denominator.
*/
function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {
uint256 denominator = _feeDenominator();
if (feeNumerator > denominator) {
// Royalty fee will exceed the sale price
revert ERC2981InvalidTokenRoyalty(tokenId, feeNumerator, denominator);
}
if (receiver == address(0)) {
revert ERC2981InvalidTokenRoyaltyReceiver(tokenId, address(0));
}
_tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
}
/**
* @dev Resets royalty information for the token id back to the global default.
*/
function _resetTokenRoyalty(uint256 tokenId) internal virtual {
delete _tokenRoyaltyInfo[tokenId];
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/Base64.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides a set of functions to operate with Base64 strings.
*/
library Base64 {
/**
* @dev Base64 Encoding/Decoding Table
* See sections 4 and 5 of https://datatracker.ietf.org/doc/html/rfc4648
*/
string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
string internal constant _TABLE_URL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
/**
* @dev Converts a `bytes` to its Bytes64 `string` representation.
*/
function encode(bytes memory data) internal pure returns (string memory) {
return _encode(data, _TABLE, true);
}
/**
* @dev Converts a `bytes` to its Bytes64Url `string` representation.
* Output is not padded with `=` as specified in https://www.rfc-editor.org/rfc/rfc4648[rfc4648].
*/
function encodeURL(bytes memory data) internal pure returns (string memory) {
return _encode(data, _TABLE_URL, false);
}
/**
* @dev Internal table-agnostic conversion
*/
function _encode(bytes memory data, string memory table, bool withPadding) private 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 "";
// If padding is enabled, the final length should be `bytes` data length divided by 3 rounded up and then
// multiplied by 4 so that it leaves room for padding the last chunk
// - `data.length + 2` -> Prepare for division rounding up
// - `/ 3` -> Number of 3-bytes chunks (rounded up)
// - `4 *` -> 4 characters for each chunk
// This is equivalent to: 4 * Math.ceil(data.length / 3)
//
// If padding is disabled, the final length should be `bytes` data length multiplied by 4/3 rounded up as
// opposed to when padding is required to fill the last chunk.
// - `4 * data.length` -> 4 characters for each chunk
// - ` + 2` -> Prepare for division rounding up
// - `/ 3` -> Number of 3-bytes chunks (rounded up)
// This is equivalent to: Math.ceil((4 * data.length) / 3)
uint256 resultLength = withPadding ? 4 * ((data.length + 2) / 3) : (4 * data.length + 2) / 3;
string memory result = new string(resultLength);
assembly ("memory-safe") {
// Prepare the lookup table (skip the first "length" byte)
let tablePtr := add(table, 1)
// Prepare result pointer, jump over length
let resultPtr := add(result, 0x20)
let dataPtr := data
let endPtr := add(data, mload(data))
// In some cases, the last iteration will read bytes after the end of the data. We cache the value, and
// set it to zero to make sure no dirty bytes are read in that section.
let afterPtr := add(endPtr, 0x20)
let afterCache := mload(afterPtr)
mstore(afterPtr, 0x00)
// Run over the input, 3 bytes at a time
for {
} lt(dataPtr, endPtr) {
} {
// Advance 3 bytes
dataPtr := add(dataPtr, 3)
let input := mload(dataPtr)
// To write each character, shift the 3 byte (24 bits) chunk
// 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
// and apply logical AND with 0x3F to bitmask the least significant 6 bits.
// Use this as an index into the lookup table, mload an entire word
// so the desired character is in the least significant byte, and
// mstore8 this least significant byte into the result and continue.
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
}
// Reset the value that was cached
mstore(afterPtr, afterCache)
if withPadding {
// 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;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)
pragma solidity ^0.8.20;
/**
* @dev Helper library for emitting standardized panic codes.
*
* ```solidity
* contract Example {
* using Panic for uint256;
*
* // Use any of the declared internal constants
* function foo() { Panic.GENERIC.panic(); }
*
* // Alternatively
* function foo() { Panic.panic(Panic.GENERIC); }
* }
* ```
*
* Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].
*
* _Available since v5.1._
*/
// slither-disable-next-line unused-state
library Panic {
/// @dev generic / unspecified error
uint256 internal constant GENERIC = 0x00;
/// @dev used by the assert() builtin
uint256 internal constant ASSERT = 0x01;
/// @dev arithmetic underflow or overflow
uint256 internal constant UNDER_OVERFLOW = 0x11;
/// @dev division or modulo by zero
uint256 internal constant DIVISION_BY_ZERO = 0x12;
/// @dev enum conversion error
uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;
/// @dev invalid encoding in storage
uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;
/// @dev empty array pop
uint256 internal constant EMPTY_ARRAY_POP = 0x31;
/// @dev array out of bounds access
uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;
/// @dev resource error (too large allocation or too large array)
uint256 internal constant RESOURCE_ERROR = 0x41;
/// @dev calling invalid internal function
uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;
/// @dev Reverts with a panic code. Recommended to use with
/// the internal constants with predefined codes.
function panic(uint256 code) internal pure {
assembly ("memory-safe") {
mstore(0x00, 0x4e487b71)
mstore(0x20, code)
revert(0x1c, 0x24)
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)
pragma solidity ^0.8.20;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
* consider using {ReentrancyGuardTransient} instead.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be NOT_ENTERED
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// Any calls to nonReentrant after this point will fail
_status = ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.2.0) (utils/Strings.sol)
pragma solidity ^0.8.20;
import {Math} from "./math/Math.sol";
import {SafeCast} from "./math/SafeCast.sol";
import {SignedMath} from "./math/SignedMath.sol";
/**
* @dev String operations.
*/
library Strings {
using SafeCast for *;
bytes16 private constant HEX_DIGITS = "0123456789abcdef";
uint8 private constant ADDRESS_LENGTH = 20;
/**
* @dev The `value` string doesn't fit in the specified `length`.
*/
error StringsInsufficientHexLength(uint256 value, uint256 length);
/**
* @dev The string being parsed contains characters that are not in scope of the given base.
*/
error StringsInvalidChar();
/**
* @dev The string being parsed is not a properly formatted address.
*/
error StringsInvalidAddressFormat();
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
assembly ("memory-safe") {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
assembly ("memory-safe") {
mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `int256` to its ASCII `string` decimal representation.
*/
function toStringSigned(int256 value) internal pure returns (string memory) {
return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
uint256 localValue = value;
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_DIGITS[localValue & 0xf];
localValue >>= 4;
}
if (localValue != 0) {
revert StringsInsufficientHexLength(value, length);
}
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);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal
* representation, according to EIP-55.
*/
function toChecksumHexString(address addr) internal pure returns (string memory) {
bytes memory buffer = bytes(toHexString(addr));
// hash the hex part of buffer (skip length + 2 bytes, length 40)
uint256 hashValue;
assembly ("memory-safe") {
hashValue := shr(96, keccak256(add(buffer, 0x22), 40))
}
for (uint256 i = 41; i > 1; --i) {
// possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)
if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {
// case shift by xoring with 0x20
buffer[i] ^= 0x20;
}
hashValue >>= 4;
}
return string(buffer);
}
/**
* @dev Returns true if the two strings are equal.
*/
function equal(string memory a, string memory b) internal pure returns (bool) {
return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
}
/**
* @dev Parse a decimal string and returns the value as a `uint256`.
*
* Requirements:
* - The string must be formatted as `[0-9]*`
* - The result must fit into an `uint256` type
*/
function parseUint(string memory input) internal pure returns (uint256) {
return parseUint(input, 0, bytes(input).length);
}
/**
* @dev Variant of {parseUint} that parses a substring of `input` located between position `begin` (included) and
* `end` (excluded).
*
* Requirements:
* - The substring must be formatted as `[0-9]*`
* - The result must fit into an `uint256` type
*/
function parseUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {
(bool success, uint256 value) = tryParseUint(input, begin, end);
if (!success) revert StringsInvalidChar();
return value;
}
/**
* @dev Variant of {parseUint-string} that returns false if the parsing fails because of an invalid character.
*
* NOTE: This function will revert if the result does not fit in a `uint256`.
*/
function tryParseUint(string memory input) internal pure returns (bool success, uint256 value) {
return _tryParseUintUncheckedBounds(input, 0, bytes(input).length);
}
/**
* @dev Variant of {parseUint-string-uint256-uint256} that returns false if the parsing fails because of an invalid
* character.
*
* NOTE: This function will revert if the result does not fit in a `uint256`.
*/
function tryParseUint(
string memory input,
uint256 begin,
uint256 end
) internal pure returns (bool success, uint256 value) {
if (end > bytes(input).length || begin > end) return (false, 0);
return _tryParseUintUncheckedBounds(input, begin, end);
}
/**
* @dev Implementation of {tryParseUint} that does not check bounds. Caller should make sure that
* `begin <= end <= input.length`. Other inputs would result in undefined behavior.
*/
function _tryParseUintUncheckedBounds(
string memory input,
uint256 begin,
uint256 end
) private pure returns (bool success, uint256 value) {
bytes memory buffer = bytes(input);
uint256 result = 0;
for (uint256 i = begin; i < end; ++i) {
uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));
if (chr > 9) return (false, 0);
result *= 10;
result += chr;
}
return (true, result);
}
/**
* @dev Parse a decimal string and returns the value as a `int256`.
*
* Requirements:
* - The string must be formatted as `[-+]?[0-9]*`
* - The result must fit in an `int256` type.
*/
function parseInt(string memory input) internal pure returns (int256) {
return parseInt(input, 0, bytes(input).length);
}
/**
* @dev Variant of {parseInt-string} that parses a substring of `input` located between position `begin` (included) and
* `end` (excluded).
*
* Requirements:
* - The substring must be formatted as `[-+]?[0-9]*`
* - The result must fit in an `int256` type.
*/
function parseInt(string memory input, uint256 begin, uint256 end) internal pure returns (int256) {
(bool success, int256 value) = tryParseInt(input, begin, end);
if (!success) revert StringsInvalidChar();
return value;
}
/**
* @dev Variant of {parseInt-string} that returns false if the parsing fails because of an invalid character or if
* the result does not fit in a `int256`.
*
* NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.
*/
function tryParseInt(string memory input) internal pure returns (bool success, int256 value) {
return _tryParseIntUncheckedBounds(input, 0, bytes(input).length);
}
uint256 private constant ABS_MIN_INT256 = 2 ** 255;
/**
* @dev Variant of {parseInt-string-uint256-uint256} that returns false if the parsing fails because of an invalid
* character or if the result does not fit in a `int256`.
*
* NOTE: This function will revert if the absolute value of the result does not fit in a `uint256`.
*/
function tryParseInt(
string memory input,
uint256 begin,
uint256 end
) internal pure returns (bool success, int256 value) {
if (end > bytes(input).length || begin > end) return (false, 0);
return _tryParseIntUncheckedBounds(input, begin, end);
}
/**
* @dev Implementation of {tryParseInt} that does not check bounds. Caller should make sure that
* `begin <= end <= input.length`. Other inputs would result in undefined behavior.
*/
function _tryParseIntUncheckedBounds(
string memory input,
uint256 begin,
uint256 end
) private pure returns (bool success, int256 value) {
bytes memory buffer = bytes(input);
// Check presence of a negative sign.
bytes1 sign = begin == end ? bytes1(0) : bytes1(_unsafeReadBytesOffset(buffer, begin)); // don't do out-of-bound (possibly unsafe) read if sub-string is empty
bool positiveSign = sign == bytes1("+");
bool negativeSign = sign == bytes1("-");
uint256 offset = (positiveSign || negativeSign).toUint();
(bool absSuccess, uint256 absValue) = tryParseUint(input, begin + offset, end);
if (absSuccess && absValue < ABS_MIN_INT256) {
return (true, negativeSign ? -int256(absValue) : int256(absValue));
} else if (absSuccess && negativeSign && absValue == ABS_MIN_INT256) {
return (true, type(int256).min);
} else return (false, 0);
}
/**
* @dev Parse a hexadecimal string (with or without "0x" prefix), and returns the value as a `uint256`.
*
* Requirements:
* - The string must be formatted as `(0x)?[0-9a-fA-F]*`
* - The result must fit in an `uint256` type.
*/
function parseHexUint(string memory input) internal pure returns (uint256) {
return parseHexUint(input, 0, bytes(input).length);
}
/**
* @dev Variant of {parseHexUint} that parses a substring of `input` located between position `begin` (included) and
* `end` (excluded).
*
* Requirements:
* - The substring must be formatted as `(0x)?[0-9a-fA-F]*`
* - The result must fit in an `uint256` type.
*/
function parseHexUint(string memory input, uint256 begin, uint256 end) internal pure returns (uint256) {
(bool success, uint256 value) = tryParseHexUint(input, begin, end);
if (!success) revert StringsInvalidChar();
return value;
}
/**
* @dev Variant of {parseHexUint-string} that returns false if the parsing fails because of an invalid character.
*
* NOTE: This function will revert if the result does not fit in a `uint256`.
*/
function tryParseHexUint(string memory input) internal pure returns (bool success, uint256 value) {
return _tryParseHexUintUncheckedBounds(input, 0, bytes(input).length);
}
/**
* @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an
* invalid character.
*
* NOTE: This function will revert if the result does not fit in a `uint256`.
*/
function tryParseHexUint(
string memory input,
uint256 begin,
uint256 end
) internal pure returns (bool success, uint256 value) {
if (end > bytes(input).length || begin > end) return (false, 0);
return _tryParseHexUintUncheckedBounds(input, begin, end);
}
/**
* @dev Implementation of {tryParseHexUint} that does not check bounds. Caller should make sure that
* `begin <= end <= input.length`. Other inputs would result in undefined behavior.
*/
function _tryParseHexUintUncheckedBounds(
string memory input,
uint256 begin,
uint256 end
) private pure returns (bool success, uint256 value) {
bytes memory buffer = bytes(input);
// skip 0x prefix if present
bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2("0x"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty
uint256 offset = hasPrefix.toUint() * 2;
uint256 result = 0;
for (uint256 i = begin + offset; i < end; ++i) {
uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i)));
if (chr > 15) return (false, 0);
result *= 16;
unchecked {
// Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check).
// This guaratees that adding a value < 16 will not cause an overflow, hence the unchecked.
result += chr;
}
}
return (true, result);
}
/**
* @dev Parse a hexadecimal string (with or without "0x" prefix), and returns the value as an `address`.
*
* Requirements:
* - The string must be formatted as `(0x)?[0-9a-fA-F]{40}`
*/
function parseAddress(string memory input) internal pure returns (address) {
return parseAddress(input, 0, bytes(input).length);
}
/**
* @dev Variant of {parseAddress} that parses a substring of `input` located between position `begin` (included) and
* `end` (excluded).
*
* Requirements:
* - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}`
*/
function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) {
(bool success, address value) = tryParseAddress(input, begin, end);
if (!success) revert StringsInvalidAddressFormat();
return value;
}
/**
* @dev Variant of {parseAddress-string} that returns false if the parsing fails because the input is not a properly
* formatted address. See {parseAddress} requirements.
*/
function tryParseAddress(string memory input) internal pure returns (bool success, address value) {
return tryParseAddress(input, 0, bytes(input).length);
}
/**
* @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is not a properly
* formatted address. See {parseAddress} requirements.
*/
function tryParseAddress(
string memory input,
uint256 begin,
uint256 end
) internal pure returns (bool success, address value) {
if (end > bytes(input).length || begin > end) return (false, address(0));
bool hasPrefix = (end > begin + 1) && bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2("0x"); // don't do out-of-bound (possibly unsafe) read if sub-string is empty
uint256 expectedLength = 40 + hasPrefix.toUint() * 2;
// check that input is the correct length
if (end - begin == expectedLength) {
// length guarantees that this does not overflow, and value is at most type(uint160).max
(bool s, uint256 v) = _tryParseHexUintUncheckedBounds(input, begin, end);
return (s, address(uint160(v)));
} else {
return (false, address(0));
}
}
function _tryParseChr(bytes1 chr) private pure returns (uint8) {
uint8 value = uint8(chr);
// Try to parse `chr`:
// - Case 1: [0-9]
// - Case 2: [a-f]
// - Case 3: [A-F]
// - otherwise not supported
unchecked {
if (value > 47 && value < 58) value -= 48;
else if (value > 96 && value < 103) value -= 87;
else if (value > 64 && value < 71) value -= 55;
else return type(uint8).max;
}
return value;
}
/**
* @dev Reads a bytes32 from a bytes array without bounds checking.
*
* NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the
* assembly block as such would prevent some optimizations.
*/
function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) {
// This is not memory safe in the general case, but all calls to this private function are within bounds.
assembly ("memory-safe") {
value := mload(add(buffer, add(0x20, offset)))
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[ERC].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/Math.sol)
import {Panic} from "../Panic.sol";
import {SafeCast} from "./SafeCast.sol";
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Floor, // Toward negative infinity
Ceil, // Toward positive infinity
Trunc, // Toward zero
Expand // Away from zero
}
/**
* @dev Returns the addition of two unsigned integers, with an success flag (no overflow).
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an success flag (no overflow).
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an success flag (no overflow).
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a success flag (no division by zero).
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.
*
* IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.
* However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute
* one branch when needed, making this function more expensive.
*/
function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {
unchecked {
// branchless ternary works because:
// b ^ (a ^ b) == a
// b ^ 0 == b
return b ^ ((a ^ b) * SafeCast.toUint(condition));
}
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return ternary(a > b, a, b);
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return ternary(a < b, a, b);
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds towards infinity instead
* of rounding towards zero.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
if (b == 0) {
// Guarantee the same behavior as in a regular Solidity division.
Panic.panic(Panic.DIVISION_BY_ZERO);
}
// The following calculation ensures accurate ceiling division without overflow.
// Since a is non-zero, (a - 1) / b will not overflow.
// The largest possible result occurs when (a - 1) / b is type(uint256).max,
// but the largest value we can obtain is type(uint256).max - 1, which happens
// when a = type(uint256).max and b = 1.
unchecked {
return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);
}
}
/**
* @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or
* denominator == 0.
*
* Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by
* Uniswap Labs also under MIT license.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use
// the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2²⁵⁶ + prod0.
uint256 prod0 = x * y; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
// Solidity will revert if denominator == 0, unlike the div opcode on its own.
// The surrounding unchecked block does not change this fact.
// See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
return prod0 / denominator;
}
// Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.
if (denominator <= prod1) {
Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));
}
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator.
// Always >= 1. See https://cs.stackexchange.com/q/138556/92363.
uint256 twos = denominator & (0 - denominator);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such
// that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv ≡ 1 mod 2⁴.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also
// works in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2⁸
inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶
inverse *= 2 - denominator * inverse; // inverse mod 2³²
inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴
inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸
inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is
// less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @dev Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);
}
/**
* @dev Calculate the modular multiplicative inverse of a number in Z/nZ.
*
* If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.
* If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.
*
* If the input value is not inversible, 0 is returned.
*
* NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the
* inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.
*/
function invMod(uint256 a, uint256 n) internal pure returns (uint256) {
unchecked {
if (n == 0) return 0;
// The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)
// Used to compute integers x and y such that: ax + ny = gcd(a, n).
// When the gcd is 1, then the inverse of a modulo n exists and it's x.
// ax + ny = 1
// ax = 1 + (-y)n
// ax ≡ 1 (mod n) # x is the inverse of a modulo n
// If the remainder is 0 the gcd is n right away.
uint256 remainder = a % n;
uint256 gcd = n;
// Therefore the initial coefficients are:
// ax + ny = gcd(a, n) = n
// 0a + 1n = n
int256 x = 0;
int256 y = 1;
while (remainder != 0) {
uint256 quotient = gcd / remainder;
(gcd, remainder) = (
// The old remainder is the next gcd to try.
remainder,
// Compute the next remainder.
// Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd
// where gcd is at most n (capped to type(uint256).max)
gcd - remainder * quotient
);
(x, y) = (
// Increment the coefficient of a.
y,
// Decrement the coefficient of n.
// Can overflow, but the result is casted to uint256 so that the
// next value of y is "wrapped around" to a value between 0 and n - 1.
x - y * int256(quotient)
);
}
if (gcd != 1) return 0; // No inverse exists.
return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.
}
}
/**
* @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.
*
* From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is
* prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that
* `a**(p-2)` is the modular multiplicative inverse of a in Fp.
*
* NOTE: this function does NOT check that `p` is a prime greater than `2`.
*/
function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {
unchecked {
return Math.modExp(a, p - 2, p);
}
}
/**
* @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)
*
* Requirements:
* - modulus can't be zero
* - underlying staticcall to precompile must succeed
*
* IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make
* sure the chain you're using it on supports the precompiled contract for modular exponentiation
* at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,
* the underlying function will succeed given the lack of a revert, but the result may be incorrectly
* interpreted as 0.
*/
function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {
(bool success, uint256 result) = tryModExp(b, e, m);
if (!success) {
Panic.panic(Panic.DIVISION_BY_ZERO);
}
return result;
}
/**
* @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).
* It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying
* to operate modulo 0 or if the underlying precompile reverted.
*
* IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain
* you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in
* https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack
* of a revert, but the result may be incorrectly interpreted as 0.
*/
function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {
if (m == 0) return (false, 0);
assembly ("memory-safe") {
let ptr := mload(0x40)
// | Offset | Content | Content (Hex) |
// |-----------|------------|--------------------------------------------------------------------|
// | 0x00:0x1f | size of b | 0x0000000000000000000000000000000000000000000000000000000000000020 |
// | 0x20:0x3f | size of e | 0x0000000000000000000000000000000000000000000000000000000000000020 |
// | 0x40:0x5f | size of m | 0x0000000000000000000000000000000000000000000000000000000000000020 |
// | 0x60:0x7f | value of b | 0x<.............................................................b> |
// | 0x80:0x9f | value of e | 0x<.............................................................e> |
// | 0xa0:0xbf | value of m | 0x<.............................................................m> |
mstore(ptr, 0x20)
mstore(add(ptr, 0x20), 0x20)
mstore(add(ptr, 0x40), 0x20)
mstore(add(ptr, 0x60), b)
mstore(add(ptr, 0x80), e)
mstore(add(ptr, 0xa0), m)
// Given the result < m, it's guaranteed to fit in 32 bytes,
// so we can use the memory scratch space located at offset 0.
success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)
result := mload(0x00)
}
}
/**
* @dev Variant of {modExp} that supports inputs of arbitrary length.
*/
function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {
(bool success, bytes memory result) = tryModExp(b, e, m);
if (!success) {
Panic.panic(Panic.DIVISION_BY_ZERO);
}
return result;
}
/**
* @dev Variant of {tryModExp} that supports inputs of arbitrary length.
*/
function tryModExp(
bytes memory b,
bytes memory e,
bytes memory m
) internal view returns (bool success, bytes memory result) {
if (_zeroBytes(m)) return (false, new bytes(0));
uint256 mLen = m.length;
// Encode call args in result and move the free memory pointer
result = abi.encodePacked(b.length, e.length, mLen, b, e, m);
assembly ("memory-safe") {
let dataPtr := add(result, 0x20)
// Write result on top of args to avoid allocating extra memory.
success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)
// Overwrite the length.
// result.length > returndatasize() is guaranteed because returndatasize() == m.length
mstore(result, mLen)
// Set the memory pointer after the returned data.
mstore(0x40, add(dataPtr, mLen))
}
}
/**
* @dev Returns whether the provided byte array is zero.
*/
function _zeroBytes(bytes memory byteArray) private pure returns (bool) {
for (uint256 i = 0; i < byteArray.length; ++i) {
if (byteArray[i] != 0) {
return false;
}
}
return true;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded
* towards zero.
*
* This method is based on Newton's method for computing square roots; the algorithm is restricted to only
* using integer operations.
*/
function sqrt(uint256 a) internal pure returns (uint256) {
unchecked {
// Take care of easy edge cases when a == 0 or a == 1
if (a <= 1) {
return a;
}
// In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a
// sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between
// the current value as `ε_n = | x_n - sqrt(a) |`.
//
// For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root
// of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is
// bigger than any uint256.
//
// By noticing that
// `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`
// we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar
// to the msb function.
uint256 aa = a;
uint256 xn = 1;
if (aa >= (1 << 128)) {
aa >>= 128;
xn <<= 64;
}
if (aa >= (1 << 64)) {
aa >>= 64;
xn <<= 32;
}
if (aa >= (1 << 32)) {
aa >>= 32;
xn <<= 16;
}
if (aa >= (1 << 16)) {
aa >>= 16;
xn <<= 8;
}
if (aa >= (1 << 8)) {
aa >>= 8;
xn <<= 4;
}
if (aa >= (1 << 4)) {
aa >>= 4;
xn <<= 2;
}
if (aa >= (1 << 2)) {
xn <<= 1;
}
// We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).
//
// We can refine our estimation by noticing that the middle of that interval minimizes the error.
// If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).
// This is going to be our x_0 (and ε_0)
xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)
// From here, Newton's method give us:
// x_{n+1} = (x_n + a / x_n) / 2
//
// One should note that:
// x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a
// = ((x_n² + a) / (2 * x_n))² - a
// = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a
// = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)
// = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)
// = (x_n² - a)² / (2 * x_n)²
// = ((x_n² - a) / (2 * x_n))²
// ≥ 0
// Which proves that for all n ≥ 1, sqrt(a) ≤ x_n
//
// This gives us the proof of quadratic convergence of the sequence:
// ε_{n+1} = | x_{n+1} - sqrt(a) |
// = | (x_n + a / x_n) / 2 - sqrt(a) |
// = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |
// = | (x_n - sqrt(a))² / (2 * x_n) |
// = | ε_n² / (2 * x_n) |
// = ε_n² / | (2 * x_n) |
//
// For the first iteration, we have a special case where x_0 is known:
// ε_1 = ε_0² / | (2 * x_0) |
// ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))
// ≤ 2**(2*e-4) / (3 * 2**(e-1))
// ≤ 2**(e-3) / 3
// ≤ 2**(e-3-log2(3))
// ≤ 2**(e-4.5)
//
// For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:
// ε_{n+1} = ε_n² / | (2 * x_n) |
// ≤ (2**(e-k))² / (2 * 2**(e-1))
// ≤ 2**(2*e-2*k) / 2**e
// ≤ 2**(e-2*k)
xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5) -- special case, see above
xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9) -- general case with k = 4.5
xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18) -- general case with k = 9
xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36) -- general case with k = 18
xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72) -- general case with k = 36
xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144) -- general case with k = 72
// Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision
// ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either
// sqrt(a) or sqrt(a) + 1.
return xn - SafeCast.toUint(xn > a / xn);
}
}
/**
* @dev Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);
}
}
/**
* @dev Return the log in base 2 of a positive value rounded towards zero.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
uint256 exp;
unchecked {
exp = 128 * SafeCast.toUint(value > (1 << 128) - 1);
value >>= exp;
result += exp;
exp = 64 * SafeCast.toUint(value > (1 << 64) - 1);
value >>= exp;
result += exp;
exp = 32 * SafeCast.toUint(value > (1 << 32) - 1);
value >>= exp;
result += exp;
exp = 16 * SafeCast.toUint(value > (1 << 16) - 1);
value >>= exp;
result += exp;
exp = 8 * SafeCast.toUint(value > (1 << 8) - 1);
value >>= exp;
result += exp;
exp = 4 * SafeCast.toUint(value > (1 << 4) - 1);
value >>= exp;
result += exp;
exp = 2 * SafeCast.toUint(value > (1 << 2) - 1);
value >>= exp;
result += exp;
result += SafeCast.toUint(value > 1);
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);
}
}
/**
* @dev Return the log in base 10 of a positive value rounded towards zero.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10 ** 64) {
value /= 10 ** 64;
result += 64;
}
if (value >= 10 ** 32) {
value /= 10 ** 32;
result += 32;
}
if (value >= 10 ** 16) {
value /= 10 ** 16;
result += 16;
}
if (value >= 10 ** 8) {
value /= 10 ** 8;
result += 8;
}
if (value >= 10 ** 4) {
value /= 10 ** 4;
result += 4;
}
if (value >= 10 ** 2) {
value /= 10 ** 2;
result += 2;
}
if (value >= 10 ** 1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);
}
}
/**
* @dev Return the log in base 256 of a positive value rounded towards zero.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
uint256 isGt;
unchecked {
isGt = SafeCast.toUint(value > (1 << 128) - 1);
value >>= isGt * 128;
result += isGt * 16;
isGt = SafeCast.toUint(value > (1 << 64) - 1);
value >>= isGt * 64;
result += isGt * 8;
isGt = SafeCast.toUint(value > (1 << 32) - 1);
value >>= isGt * 32;
result += isGt * 4;
isGt = SafeCast.toUint(value > (1 << 16) - 1);
value >>= isGt * 16;
result += isGt * 2;
result += SafeCast.toUint(value > (1 << 8) - 1);
}
return result;
}
/**
* @dev Return the log in base 256, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);
}
}
/**
* @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
*/
function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
return uint8(rounding) % 2 == 1;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)
// This file was procedurally generated from scripts/generate/templates/SafeCast.js.
/**
* @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow
* checks.
*
* Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
* easily result in undesired exploitation or bugs, since developers usually
* assume that overflows raise errors. `SafeCast` restores this intuition by
* reverting the transaction when such an operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeCast {
/**
* @dev Value doesn't fit in an uint of `bits` size.
*/
error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);
/**
* @dev An int value doesn't fit in an uint of `bits` size.
*/
error SafeCastOverflowedIntToUint(int256 value);
/**
* @dev Value doesn't fit in an int of `bits` size.
*/
error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);
/**
* @dev An uint value doesn't fit in an int of `bits` size.
*/
error SafeCastOverflowedUintToInt(uint256 value);
/**
* @dev Returns the downcasted uint248 from uint256, reverting on
* overflow (when the input is greater than largest uint248).
*
* Counterpart to Solidity's `uint248` operator.
*
* Requirements:
*
* - input must fit into 248 bits
*/
function toUint248(uint256 value) internal pure returns (uint248) {
if (value > type(uint248).max) {
revert SafeCastOverflowedUintDowncast(248, value);
}
return uint248(value);
}
/**
* @dev Returns the downcasted uint240 from uint256, reverting on
* overflow (when the input is greater than largest uint240).
*
* Counterpart to Solidity's `uint240` operator.
*
* Requirements:
*
* - input must fit into 240 bits
*/
function toUint240(uint256 value) internal pure returns (uint240) {
if (value > type(uint240).max) {
revert SafeCastOverflowedUintDowncast(240, value);
}
return uint240(value);
}
/**
* @dev Returns the downcasted uint232 from uint256, reverting on
* overflow (when the input is greater than largest uint232).
*
* Counterpart to Solidity's `uint232` operator.
*
* Requirements:
*
* - input must fit into 232 bits
*/
function toUint232(uint256 value) internal pure returns (uint232) {
if (value > type(uint232).max) {
revert SafeCastOverflowedUintDowncast(232, value);
}
return uint232(value);
}
/**
* @dev Returns the downcasted uint224 from uint256, reverting on
* overflow (when the input is greater than largest uint224).
*
* Counterpart to Solidity's `uint224` operator.
*
* Requirements:
*
* - input must fit into 224 bits
*/
function toUint224(uint256 value) internal pure returns (uint224) {
if (value > type(uint224).max) {
revert SafeCastOverflowedUintDowncast(224, value);
}
return uint224(value);
}
/**
* @dev Returns the downcasted uint216 from uint256, reverting on
* overflow (when the input is greater than largest uint216).
*
* Counterpart to Solidity's `uint216` operator.
*
* Requirements:
*
* - input must fit into 216 bits
*/
function toUint216(uint256 value) internal pure returns (uint216) {
if (value > type(uint216).max) {
revert SafeCastOverflowedUintDowncast(216, value);
}
return uint216(value);
}
/**
* @dev Returns the downcasted uint208 from uint256, reverting on
* overflow (when the input is greater than largest uint208).
*
* Counterpart to Solidity's `uint208` operator.
*
* Requirements:
*
* - input must fit into 208 bits
*/
function toUint208(uint256 value) internal pure returns (uint208) {
if (value > type(uint208).max) {
revert SafeCastOverflowedUintDowncast(208, value);
}
return uint208(value);
}
/**
* @dev Returns the downcasted uint200 from uint256, reverting on
* overflow (when the input is greater than largest uint200).
*
* Counterpart to Solidity's `uint200` operator.
*
* Requirements:
*
* - input must fit into 200 bits
*/
function toUint200(uint256 value) internal pure returns (uint200) {
if (value > type(uint200).max) {
revert SafeCastOverflowedUintDowncast(200, value);
}
return uint200(value);
}
/**
* @dev Returns the downcasted uint192 from uint256, reverting on
* overflow (when the input is greater than largest uint192).
*
* Counterpart to Solidity's `uint192` operator.
*
* Requirements:
*
* - input must fit into 192 bits
*/
function toUint192(uint256 value) internal pure returns (uint192) {
if (value > type(uint192).max) {
revert SafeCastOverflowedUintDowncast(192, value);
}
return uint192(value);
}
/**
* @dev Returns the downcasted uint184 from uint256, reverting on
* overflow (when the input is greater than largest uint184).
*
* Counterpart to Solidity's `uint184` operator.
*
* Requirements:
*
* - input must fit into 184 bits
*/
function toUint184(uint256 value) internal pure returns (uint184) {
if (value > type(uint184).max) {
revert SafeCastOverflowedUintDowncast(184, value);
}
return uint184(value);
}
/**
* @dev Returns the downcasted uint176 from uint256, reverting on
* overflow (when the input is greater than largest uint176).
*
* Counterpart to Solidity's `uint176` operator.
*
* Requirements:
*
* - input must fit into 176 bits
*/
function toUint176(uint256 value) internal pure returns (uint176) {
if (value > type(uint176).max) {
revert SafeCastOverflowedUintDowncast(176, value);
}
return uint176(value);
}
/**
* @dev Returns the downcasted uint168 from uint256, reverting on
* overflow (when the input is greater than largest uint168).
*
* Counterpart to Solidity's `uint168` operator.
*
* Requirements:
*
* - input must fit into 168 bits
*/
function toUint168(uint256 value) internal pure returns (uint168) {
if (value > type(uint168).max) {
revert SafeCastOverflowedUintDowncast(168, value);
}
return uint168(value);
}
/**
* @dev Returns the downcasted uint160 from uint256, reverting on
* overflow (when the input is greater than largest uint160).
*
* Counterpart to Solidity's `uint160` operator.
*
* Requirements:
*
* - input must fit into 160 bits
*/
function toUint160(uint256 value) internal pure returns (uint160) {
if (value > type(uint160).max) {
revert SafeCastOverflowedUintDowncast(160, value);
}
return uint160(value);
}
/**
* @dev Returns the downcasted uint152 from uint256, reverting on
* overflow (when the input is greater than largest uint152).
*
* Counterpart to Solidity's `uint152` operator.
*
* Requirements:
*
* - input must fit into 152 bits
*/
function toUint152(uint256 value) internal pure returns (uint152) {
if (value > type(uint152).max) {
revert SafeCastOverflowedUintDowncast(152, value);
}
return uint152(value);
}
/**
* @dev Returns the downcasted uint144 from uint256, reverting on
* overflow (when the input is greater than largest uint144).
*
* Counterpart to Solidity's `uint144` operator.
*
* Requirements:
*
* - input must fit into 144 bits
*/
function toUint144(uint256 value) internal pure returns (uint144) {
if (value > type(uint144).max) {
revert SafeCastOverflowedUintDowncast(144, value);
}
return uint144(value);
}
/**
* @dev Returns the downcasted uint136 from uint256, reverting on
* overflow (when the input is greater than largest uint136).
*
* Counterpart to Solidity's `uint136` operator.
*
* Requirements:
*
* - input must fit into 136 bits
*/
function toUint136(uint256 value) internal pure returns (uint136) {
if (value > type(uint136).max) {
revert SafeCastOverflowedUintDowncast(136, value);
}
return uint136(value);
}
/**
* @dev Returns the downcasted uint128 from uint256, reverting on
* overflow (when the input is greater than largest uint128).
*
* Counterpart to Solidity's `uint128` operator.
*
* Requirements:
*
* - input must fit into 128 bits
*/
function toUint128(uint256 value) internal pure returns (uint128) {
if (value > type(uint128).max) {
revert SafeCastOverflowedUintDowncast(128, value);
}
return uint128(value);
}
/**
* @dev Returns the downcasted uint120 from uint256, reverting on
* overflow (when the input is greater than largest uint120).
*
* Counterpart to Solidity's `uint120` operator.
*
* Requirements:
*
* - input must fit into 120 bits
*/
function toUint120(uint256 value) internal pure returns (uint120) {
if (value > type(uint120).max) {
revert SafeCastOverflowedUintDowncast(120, value);
}
return uint120(value);
}
/**
* @dev Returns the downcasted uint112 from uint256, reverting on
* overflow (when the input is greater than largest uint112).
*
* Counterpart to Solidity's `uint112` operator.
*
* Requirements:
*
* - input must fit into 112 bits
*/
function toUint112(uint256 value) internal pure returns (uint112) {
if (value > type(uint112).max) {
revert SafeCastOverflowedUintDowncast(112, value);
}
return uint112(value);
}
/**
* @dev Returns the downcasted uint104 from uint256, reverting on
* overflow (when the input is greater than largest uint104).
*
* Counterpart to Solidity's `uint104` operator.
*
* Requirements:
*
* - input must fit into 104 bits
*/
function toUint104(uint256 value) internal pure returns (uint104) {
if (value > type(uint104).max) {
revert SafeCastOverflowedUintDowncast(104, value);
}
return uint104(value);
}
/**
* @dev Returns the downcasted uint96 from uint256, reverting on
* overflow (when the input is greater than largest uint96).
*
* Counterpart to Solidity's `uint96` operator.
*
* Requirements:
*
* - input must fit into 96 bits
*/
function toUint96(uint256 value) internal pure returns (uint96) {
if (value > type(uint96).max) {
revert SafeCastOverflowedUintDowncast(96, value);
}
return uint96(value);
}
/**
* @dev Returns the downcasted uint88 from uint256, reverting on
* overflow (when the input is greater than largest uint88).
*
* Counterpart to Solidity's `uint88` operator.
*
* Requirements:
*
* - input must fit into 88 bits
*/
function toUint88(uint256 value) internal pure returns (uint88) {
if (value > type(uint88).max) {
revert SafeCastOverflowedUintDowncast(88, value);
}
return uint88(value);
}
/**
* @dev Returns the downcasted uint80 from uint256, reverting on
* overflow (when the input is greater than largest uint80).
*
* Counterpart to Solidity's `uint80` operator.
*
* Requirements:
*
* - input must fit into 80 bits
*/
function toUint80(uint256 value) internal pure returns (uint80) {
if (value > type(uint80).max) {
revert SafeCastOverflowedUintDowncast(80, value);
}
return uint80(value);
}
/**
* @dev Returns the downcasted uint72 from uint256, reverting on
* overflow (when the input is greater than largest uint72).
*
* Counterpart to Solidity's `uint72` operator.
*
* Requirements:
*
* - input must fit into 72 bits
*/
function toUint72(uint256 value) internal pure returns (uint72) {
if (value > type(uint72).max) {
revert SafeCastOverflowedUintDowncast(72, value);
}
return uint72(value);
}
/**
* @dev Returns the downcasted uint64 from uint256, reverting on
* overflow (when the input is greater than largest uint64).
*
* Counterpart to Solidity's `uint64` operator.
*
* Requirements:
*
* - input must fit into 64 bits
*/
function toUint64(uint256 value) internal pure returns (uint64) {
if (value > type(uint64).max) {
revert SafeCastOverflowedUintDowncast(64, value);
}
return uint64(value);
}
/**
* @dev Returns the downcasted uint56 from uint256, reverting on
* overflow (when the input is greater than largest uint56).
*
* Counterpart to Solidity's `uint56` operator.
*
* Requirements:
*
* - input must fit into 56 bits
*/
function toUint56(uint256 value) internal pure returns (uint56) {
if (value > type(uint56).max) {
revert SafeCastOverflowedUintDowncast(56, value);
}
return uint56(value);
}
/**
* @dev Returns the downcasted uint48 from uint256, reverting on
* overflow (when the input is greater than largest uint48).
*
* Counterpart to Solidity's `uint48` operator.
*
* Requirements:
*
* - input must fit into 48 bits
*/
function toUint48(uint256 value) internal pure returns (uint48) {
if (value > type(uint48).max) {
revert SafeCastOverflowedUintDowncast(48, value);
}
return uint48(value);
}
/**
* @dev Returns the downcasted uint40 from uint256, reverting on
* overflow (when the input is greater than largest uint40).
*
* Counterpart to Solidity's `uint40` operator.
*
* Requirements:
*
* - input must fit into 40 bits
*/
function toUint40(uint256 value) internal pure returns (uint40) {
if (value > type(uint40).max) {
revert SafeCastOverflowedUintDowncast(40, value);
}
return uint40(value);
}
/**
* @dev Returns the downcasted uint32 from uint256, reverting on
* overflow (when the input is greater than largest uint32).
*
* Counterpart to Solidity's `uint32` operator.
*
* Requirements:
*
* - input must fit into 32 bits
*/
function toUint32(uint256 value) internal pure returns (uint32) {
if (value > type(uint32).max) {
revert SafeCastOverflowedUintDowncast(32, value);
}
return uint32(value);
}
/**
* @dev Returns the downcasted uint24 from uint256, reverting on
* overflow (when the input is greater than largest uint24).
*
* Counterpart to Solidity's `uint24` operator.
*
* Requirements:
*
* - input must fit into 24 bits
*/
function toUint24(uint256 value) internal pure returns (uint24) {
if (value > type(uint24).max) {
revert SafeCastOverflowedUintDowncast(24, value);
}
return uint24(value);
}
/**
* @dev Returns the downcasted uint16 from uint256, reverting on
* overflow (when the input is greater than largest uint16).
*
* Counterpart to Solidity's `uint16` operator.
*
* Requirements:
*
* - input must fit into 16 bits
*/
function toUint16(uint256 value) internal pure returns (uint16) {
if (value > type(uint16).max) {
revert SafeCastOverflowedUintDowncast(16, value);
}
return uint16(value);
}
/**
* @dev Returns the downcasted uint8 from uint256, reverting on
* overflow (when the input is greater than largest uint8).
*
* Counterpart to Solidity's `uint8` operator.
*
* Requirements:
*
* - input must fit into 8 bits
*/
function toUint8(uint256 value) internal pure returns (uint8) {
if (value > type(uint8).max) {
revert SafeCastOverflowedUintDowncast(8, value);
}
return uint8(value);
}
/**
* @dev Converts a signed int256 into an unsigned uint256.
*
* Requirements:
*
* - input must be greater than or equal to 0.
*/
function toUint256(int256 value) internal pure returns (uint256) {
if (value < 0) {
revert SafeCastOverflowedIntToUint(value);
}
return uint256(value);
}
/**
* @dev Returns the downcasted int248 from int256, reverting on
* overflow (when the input is less than smallest int248 or
* greater than largest int248).
*
* Counterpart to Solidity's `int248` operator.
*
* Requirements:
*
* - input must fit into 248 bits
*/
function toInt248(int256 value) internal pure returns (int248 downcasted) {
downcasted = int248(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(248, value);
}
}
/**
* @dev Returns the downcasted int240 from int256, reverting on
* overflow (when the input is less than smallest int240 or
* greater than largest int240).
*
* Counterpart to Solidity's `int240` operator.
*
* Requirements:
*
* - input must fit into 240 bits
*/
function toInt240(int256 value) internal pure returns (int240 downcasted) {
downcasted = int240(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(240, value);
}
}
/**
* @dev Returns the downcasted int232 from int256, reverting on
* overflow (when the input is less than smallest int232 or
* greater than largest int232).
*
* Counterpart to Solidity's `int232` operator.
*
* Requirements:
*
* - input must fit into 232 bits
*/
function toInt232(int256 value) internal pure returns (int232 downcasted) {
downcasted = int232(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(232, value);
}
}
/**
* @dev Returns the downcasted int224 from int256, reverting on
* overflow (when the input is less than smallest int224 or
* greater than largest int224).
*
* Counterpart to Solidity's `int224` operator.
*
* Requirements:
*
* - input must fit into 224 bits
*/
function toInt224(int256 value) internal pure returns (int224 downcasted) {
downcasted = int224(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(224, value);
}
}
/**
* @dev Returns the downcasted int216 from int256, reverting on
* overflow (when the input is less than smallest int216 or
* greater than largest int216).
*
* Counterpart to Solidity's `int216` operator.
*
* Requirements:
*
* - input must fit into 216 bits
*/
function toInt216(int256 value) internal pure returns (int216 downcasted) {
downcasted = int216(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(216, value);
}
}
/**
* @dev Returns the downcasted int208 from int256, reverting on
* overflow (when the input is less than smallest int208 or
* greater than largest int208).
*
* Counterpart to Solidity's `int208` operator.
*
* Requirements:
*
* - input must fit into 208 bits
*/
function toInt208(int256 value) internal pure returns (int208 downcasted) {
downcasted = int208(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(208, value);
}
}
/**
* @dev Returns the downcasted int200 from int256, reverting on
* overflow (when the input is less than smallest int200 or
* greater than largest int200).
*
* Counterpart to Solidity's `int200` operator.
*
* Requirements:
*
* - input must fit into 200 bits
*/
function toInt200(int256 value) internal pure returns (int200 downcasted) {
downcasted = int200(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(200, value);
}
}
/**
* @dev Returns the downcasted int192 from int256, reverting on
* overflow (when the input is less than smallest int192 or
* greater than largest int192).
*
* Counterpart to Solidity's `int192` operator.
*
* Requirements:
*
* - input must fit into 192 bits
*/
function toInt192(int256 value) internal pure returns (int192 downcasted) {
downcasted = int192(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(192, value);
}
}
/**
* @dev Returns the downcasted int184 from int256, reverting on
* overflow (when the input is less than smallest int184 or
* greater than largest int184).
*
* Counterpart to Solidity's `int184` operator.
*
* Requirements:
*
* - input must fit into 184 bits
*/
function toInt184(int256 value) internal pure returns (int184 downcasted) {
downcasted = int184(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(184, value);
}
}
/**
* @dev Returns the downcasted int176 from int256, reverting on
* overflow (when the input is less than smallest int176 or
* greater than largest int176).
*
* Counterpart to Solidity's `int176` operator.
*
* Requirements:
*
* - input must fit into 176 bits
*/
function toInt176(int256 value) internal pure returns (int176 downcasted) {
downcasted = int176(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(176, value);
}
}
/**
* @dev Returns the downcasted int168 from int256, reverting on
* overflow (when the input is less than smallest int168 or
* greater than largest int168).
*
* Counterpart to Solidity's `int168` operator.
*
* Requirements:
*
* - input must fit into 168 bits
*/
function toInt168(int256 value) internal pure returns (int168 downcasted) {
downcasted = int168(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(168, value);
}
}
/**
* @dev Returns the downcasted int160 from int256, reverting on
* overflow (when the input is less than smallest int160 or
* greater than largest int160).
*
* Counterpart to Solidity's `int160` operator.
*
* Requirements:
*
* - input must fit into 160 bits
*/
function toInt160(int256 value) internal pure returns (int160 downcasted) {
downcasted = int160(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(160, value);
}
}
/**
* @dev Returns the downcasted int152 from int256, reverting on
* overflow (when the input is less than smallest int152 or
* greater than largest int152).
*
* Counterpart to Solidity's `int152` operator.
*
* Requirements:
*
* - input must fit into 152 bits
*/
function toInt152(int256 value) internal pure returns (int152 downcasted) {
downcasted = int152(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(152, value);
}
}
/**
* @dev Returns the downcasted int144 from int256, reverting on
* overflow (when the input is less than smallest int144 or
* greater than largest int144).
*
* Counterpart to Solidity's `int144` operator.
*
* Requirements:
*
* - input must fit into 144 bits
*/
function toInt144(int256 value) internal pure returns (int144 downcasted) {
downcasted = int144(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(144, value);
}
}
/**
* @dev Returns the downcasted int136 from int256, reverting on
* overflow (when the input is less than smallest int136 or
* greater than largest int136).
*
* Counterpart to Solidity's `int136` operator.
*
* Requirements:
*
* - input must fit into 136 bits
*/
function toInt136(int256 value) internal pure returns (int136 downcasted) {
downcasted = int136(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(136, value);
}
}
/**
* @dev Returns the downcasted int128 from int256, reverting on
* overflow (when the input is less than smallest int128 or
* greater than largest int128).
*
* Counterpart to Solidity's `int128` operator.
*
* Requirements:
*
* - input must fit into 128 bits
*/
function toInt128(int256 value) internal pure returns (int128 downcasted) {
downcasted = int128(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(128, value);
}
}
/**
* @dev Returns the downcasted int120 from int256, reverting on
* overflow (when the input is less than smallest int120 or
* greater than largest int120).
*
* Counterpart to Solidity's `int120` operator.
*
* Requirements:
*
* - input must fit into 120 bits
*/
function toInt120(int256 value) internal pure returns (int120 downcasted) {
downcasted = int120(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(120, value);
}
}
/**
* @dev Returns the downcasted int112 from int256, reverting on
* overflow (when the input is less than smallest int112 or
* greater than largest int112).
*
* Counterpart to Solidity's `int112` operator.
*
* Requirements:
*
* - input must fit into 112 bits
*/
function toInt112(int256 value) internal pure returns (int112 downcasted) {
downcasted = int112(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(112, value);
}
}
/**
* @dev Returns the downcasted int104 from int256, reverting on
* overflow (when the input is less than smallest int104 or
* greater than largest int104).
*
* Counterpart to Solidity's `int104` operator.
*
* Requirements:
*
* - input must fit into 104 bits
*/
function toInt104(int256 value) internal pure returns (int104 downcasted) {
downcasted = int104(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(104, value);
}
}
/**
* @dev Returns the downcasted int96 from int256, reverting on
* overflow (when the input is less than smallest int96 or
* greater than largest int96).
*
* Counterpart to Solidity's `int96` operator.
*
* Requirements:
*
* - input must fit into 96 bits
*/
function toInt96(int256 value) internal pure returns (int96 downcasted) {
downcasted = int96(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(96, value);
}
}
/**
* @dev Returns the downcasted int88 from int256, reverting on
* overflow (when the input is less than smallest int88 or
* greater than largest int88).
*
* Counterpart to Solidity's `int88` operator.
*
* Requirements:
*
* - input must fit into 88 bits
*/
function toInt88(int256 value) internal pure returns (int88 downcasted) {
downcasted = int88(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(88, value);
}
}
/**
* @dev Returns the downcasted int80 from int256, reverting on
* overflow (when the input is less than smallest int80 or
* greater than largest int80).
*
* Counterpart to Solidity's `int80` operator.
*
* Requirements:
*
* - input must fit into 80 bits
*/
function toInt80(int256 value) internal pure returns (int80 downcasted) {
downcasted = int80(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(80, value);
}
}
/**
* @dev Returns the downcasted int72 from int256, reverting on
* overflow (when the input is less than smallest int72 or
* greater than largest int72).
*
* Counterpart to Solidity's `int72` operator.
*
* Requirements:
*
* - input must fit into 72 bits
*/
function toInt72(int256 value) internal pure returns (int72 downcasted) {
downcasted = int72(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(72, value);
}
}
/**
* @dev Returns the downcasted int64 from int256, reverting on
* overflow (when the input is less than smallest int64 or
* greater than largest int64).
*
* Counterpart to Solidity's `int64` operator.
*
* Requirements:
*
* - input must fit into 64 bits
*/
function toInt64(int256 value) internal pure returns (int64 downcasted) {
downcasted = int64(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(64, value);
}
}
/**
* @dev Returns the downcasted int56 from int256, reverting on
* overflow (when the input is less than smallest int56 or
* greater than largest int56).
*
* Counterpart to Solidity's `int56` operator.
*
* Requirements:
*
* - input must fit into 56 bits
*/
function toInt56(int256 value) internal pure returns (int56 downcasted) {
downcasted = int56(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(56, value);
}
}
/**
* @dev Returns the downcasted int48 from int256, reverting on
* overflow (when the input is less than smallest int48 or
* greater than largest int48).
*
* Counterpart to Solidity's `int48` operator.
*
* Requirements:
*
* - input must fit into 48 bits
*/
function toInt48(int256 value) internal pure returns (int48 downcasted) {
downcasted = int48(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(48, value);
}
}
/**
* @dev Returns the downcasted int40 from int256, reverting on
* overflow (when the input is less than smallest int40 or
* greater than largest int40).
*
* Counterpart to Solidity's `int40` operator.
*
* Requirements:
*
* - input must fit into 40 bits
*/
function toInt40(int256 value) internal pure returns (int40 downcasted) {
downcasted = int40(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(40, value);
}
}
/**
* @dev Returns the downcasted int32 from int256, reverting on
* overflow (when the input is less than smallest int32 or
* greater than largest int32).
*
* Counterpart to Solidity's `int32` operator.
*
* Requirements:
*
* - input must fit into 32 bits
*/
function toInt32(int256 value) internal pure returns (int32 downcasted) {
downcasted = int32(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(32, value);
}
}
/**
* @dev Returns the downcasted int24 from int256, reverting on
* overflow (when the input is less than smallest int24 or
* greater than largest int24).
*
* Counterpart to Solidity's `int24` operator.
*
* Requirements:
*
* - input must fit into 24 bits
*/
function toInt24(int256 value) internal pure returns (int24 downcasted) {
downcasted = int24(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(24, value);
}
}
/**
* @dev Returns the downcasted int16 from int256, reverting on
* overflow (when the input is less than smallest int16 or
* greater than largest int16).
*
* Counterpart to Solidity's `int16` operator.
*
* Requirements:
*
* - input must fit into 16 bits
*/
function toInt16(int256 value) internal pure returns (int16 downcasted) {
downcasted = int16(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(16, value);
}
}
/**
* @dev Returns the downcasted int8 from int256, reverting on
* overflow (when the input is less than smallest int8 or
* greater than largest int8).
*
* Counterpart to Solidity's `int8` operator.
*
* Requirements:
*
* - input must fit into 8 bits
*/
function toInt8(int256 value) internal pure returns (int8 downcasted) {
downcasted = int8(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(8, value);
}
}
/**
* @dev Converts an unsigned uint256 into a signed int256.
*
* Requirements:
*
* - input must be less than or equal to maxInt256.
*/
function toInt256(uint256 value) internal pure returns (int256) {
// Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive
if (value > uint256(type(int256).max)) {
revert SafeCastOverflowedUintToInt(value);
}
return int256(value);
}
/**
* @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.
*/
function toUint(bool b) internal pure returns (uint256 u) {
assembly ("memory-safe") {
u := iszero(iszero(b))
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)
import {SafeCast} from "./SafeCast.sol";
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMath {
/**
* @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.
*
* IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.
* However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute
* one branch when needed, making this function more expensive.
*/
function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {
unchecked {
// branchless ternary works because:
// b ^ (a ^ b) == a
// b ^ 0 == b
return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));
}
}
/**
* @dev Returns the largest of two signed numbers.
*/
function max(int256 a, int256 b) internal pure returns (int256) {
return ternary(a > b, a, b);
}
/**
* @dev Returns the smallest of two signed numbers.
*/
function min(int256 a, int256 b) internal pure returns (int256) {
return ternary(a < b, a, b);
}
/**
* @dev Returns the average of two signed numbers without overflow.
* The result is rounded towards zero.
*/
function average(int256 a, int256 b) internal pure returns (int256) {
// Formula from the book "Hacker's Delight"
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// Formula from the "Bit Twiddling Hacks" by Sean Eron Anderson.
// Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,
// taking advantage of the most significant (or "sign" bit) in two's complement representation.
// This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,
// the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).
int256 mask = n >> 255;
// A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.
return uint256((n + mask) ^ mask);
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract FrogsBackdrop {
// Data for the backdrop trait
string[] internal backdrop_data = [
"#12221F" // Hyper
];
string[] internal backdrop_traits = [
'Hyper'
];
// Getter functions
function getBackdropTrait(uint index) external view returns (string memory) {
return backdrop_traits[index];
}
function getBackdropData(uint index) external view returns (string memory) {
return backdrop_data[index];
}
function totalBackdrop() external view returns (uint) {
return backdrop_traits.length;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
// Copyright (c) 2025 Berny Art
//
// This file and the associated art layers are proprietary.
// They may not be reused, copied, or sold in any form without explicit
// written permission from Berny Art.
contract FrogsBody {
// Data for the body trait
bytes[] internal body_data = [
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d31382e3032312036302e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e3930322e3231352d2e3236322e3433362d2e3438332e3636322d2e3636332e3233312d2e3138332e3435342d2e3332342e3636382d2e3432316c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d362e3539322d352e30363268312e3532346c332e31393320392e323633682d312e3532336c2d332e3139342d392e3236335a6d31392e32313920392e383033682d352e33343456363468352e33343476312e3237325a6d372e3230382030682d352e33343556363468352e33343476312e3237325a6d31312e3030392d2e35344836302e35336c332e3139342d392e32363368312e3531376c2d332e31393320392e3236335a6d392e3536322d342e30373261382e363420382e36342030203020312d2e31323920312e35323420382e33333820382e3333382030203020312d2e33353120312e33333620362e37313320362e3731332030203020312d2e35323220312e313320362e31343520362e3134352030203020312d2e3632372e393134632d2e3232322e32372d2e34352e3439392d2e3638352e36383661332e313120332e31312030203020312d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e363733632e3231392d2e3238352e3431362d2e3633372e3539322d312e3035352e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e31312d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e39313320372e3931332030203020302d2e3433342d312e34373720342e37323320342e3732332030203020302d2e3539322d312e303620332e35373220332e3537322030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353420382e3534203020302031202e343820322e3836762e31335a222f3e0000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d31382e3032312036302e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e3930322e3231352d2e3236322e3433362d2e3438332e3636322d2e3636332e3233312d2e3138332e3435342d2e3332342e3636382d2e3432316c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d362e34353920322e35323663302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437342d2e3038382e3137362030202e3333352e30332e3437352e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30313920312e3031392030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437352e3038322d2e31373520302d2e3333332d2e3032372d2e3437342d2e30383261312e303720312e30372030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d342e3437372d332e393434762d312e3537366c352e32373420322e31343576312e33336c2d352e32373420322e31355636312e35386c332e3335382d312e3132352e3335372d2e3131372d2e3335312d2e3131372d332e3336342d312e3130385a6d31302e3030362d2e3868312e3031366c322e31323920362e313735682d312e3031366c2d322e3132392d362e3137355a222f3e3c706174682066696c6c3d22234639302220643d224d34342e3633392035382e3836345635372e3438682e35333576312e333834682d2e3533355a6d2d312e30363520305635372e3438682e35333776312e333834682d2e3533365a6d312e30363520352e39325636332e34682e35333576312e333834682d2e3533355a6d2d312e30363520305636332e34682e35333776312e333834682d2e3533365a4d34322e373532203634762d352e37313268312e333736632e3435382030202e38342e30343820312e3134332e3134342e33312e30392e3534322e3234332e3639372e3435362e31362e3230382e32342e34392e32342e3834382030202e3231332d2e3032372e3430382d2e30382e3538342d2e3035342e3137362d2e3133312e33322d2e3233332e343332612e3638372e3638372030203020312d2e3336372e323136762e3034632e3135342e3033372e3239332e3130342e3431362e32612e3939352e393935203020302031202e3239362e343136632e3037342e3138312e3131312e3432312e3131312e37322030202e3334372d2e3037342e3634352d2e3232342e38393661312e343720312e34372030203020312d2e3634382e353638632d2e3237372e3132382d2e3630382e3139322d2e3939322e313932682d312e3733355a6d312e3531322d332e343438632e3236362030202e34352d2e3035362e3535322d2e3136382e312d2e3131322e3135322d2e3237352e3135322d2e34383820302d2e3231392d2e3036322d2e3337362d2e3138342d2e3437322d2e3132332d2e3039362d2e3331382d2e3134342d2e3538342d2e313434682d2e323476312e323732682e3330335a6d2d2e3330342e3936563633682e333931632e3237382030202e34372d2e30372e3537362d2e3230382e3131322d2e3134342e3136382d2e3333332e3136382d2e353638612e39312e39312030203020302d2e3037322d2e3337362e35312e35312030203020302d2e3234372d2e323438632d2e3131322d2e3035392d2e3236372d2e3038382d2e3436352d2e303838682d2e3335325a222f3e3c706174682066696c6c3d22234146463245322220643d224d34372e36382036342e343838682d312e3031326c322e3132392d362e31373568312e3031326c2d322e313320362e3137355a6d392e3032372d342e3237392d2e3339392e3134362e3339392e31343120332e323120312e30373276312e3538386c2d352e3138352d322e3135762d312e3331396c352e3138362d322e313576312e3538326c2d332e32313120312e30395a6d352e35393120322e38343863302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232322d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239392d2e3038382e3437342d2e3038382e3137362030202e3333352e30332e3437352e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30313920312e3031392030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333352d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335382d2e3232322e3938372e3938372030203020312d2e3232322d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d382e3639362d322e33393761382e363420382e36342030203020312d2e31323920312e35323420382e33333820382e3333382030203020312d2e33353120312e33333620362e37313320362e3731332030203020312d2e35323220312e313320362e31343520362e3134352030203020312d2e3632372e393134632d2e3232322e32372d2e34352e3439392d2e3638352e36383661332e313120332e31312030203020312d2e3638362e3432386c2d2e33312d2e3838632e3231342d2e3136332e3433312d2e3338382e36352d2e3637332e3231392d2e3238352e3431362d2e3633372e3539322d312e3035352e3137362d2e3431382e3331382d2e3930382e3432372d312e34372e31312d2e3536332e3136352d312e3230362e3136352d312e393238762d2e31353261392e3820392e382030203020302d2e31372d312e39323220372e39323820372e3932382030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e35373220332e3537322030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353420382e3534203020302031202e343820322e3836762e31335a222f3e00'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d37312e3937392036302e34363961392e333220392e33322030203020312d2e31323320312e35353320382e34363220382e3436322030203020312d2e33343620312e333437203720372030203020312d2e35303420312e313331632d2e3139352e33342d2e342e36342d2e3631352e39303261342e34313720342e3431372030203020312d2e3636322e36363220332e323420332e32342030203020312d2e3636382e3432326c2d2e3331372d2e383961332e363320332e3633203020302030202e3635362d2e3638632e32322d2e3238312e3431362d2e3633332e3539322d312e3035352e3137322d2e3431382e3331332d2e3930362e3432322d312e3436342e31312d2e35362e3136342d312e3139382e3136342d312e393136762d2e31353363302d2e3732332d2e3035352d312e3336332d2e3136342d312e39323261372e383220372e38322030203020302d2e3432322d312e34363520342e37313620342e3731362030203020302d2e3539322d312e303620332e36353120332e3635312030203020302d2e3635362d2e36386c2e3331372d2e383739632e3231342e3039382e3433372e3233382e3636382e3432322e3232362e3138342e3434372e3430362e3636322e3636382e3231352e3235382e34322e3535372e3631352e3839372e3139312e33342e33362e3731342e35303420312e3132352e3134342e3431342e32362e3836332e33343620312e33343761392e333520392e3335203020302031202e31323320312e353539762e3132395a6d2d352e31363920312e34313876312e3537366c2d352e3237342d322e313435762d312e33336c352e3237342d322e313576312e3538326c2d332e33353820312e3132352d2e3335372e3131372e3335312e31313720332e33363420312e3130385a6d2d31372e3736322d362e31353968352e333434563537682d352e333434762d312e3237325a222f3e3c706174682066696c6c3d227265642220643d224d34362e3037362036352e3533314834342e376c2d322e3139312d342e32373120322e31382d342e323668312e3337376c322e31383520342e32362d322e31373420342e3237315a6d2d312e39342d342e32373120312e31303820322e3531332e3133352e3339392e3134372d2e33393920312e3130312d322e3531332d312e31332d322e3533322d2e3132342d2e3339322d2e3132392e3337352d312e31303720322e3534395a222f3e3c706174682066696c6c3d22234146463245322220643d224d33362e3535342035352e37323868352e333434563537682d352e333434762d312e3237325a6d2d392e31373220352e3036332e3339392d2e3134362d2e3339392d2e3134312d332e32312d312e303732762d312e3538386c352e31383520322e313576312e3331396c2d352e31383620322e31355636312e38386c332e3231312d312e30395a6d2d382e35322d2e34353163302d2e3533352e3034332d312e3034332e3132392d312e3532342e3038352d2e3437362e3230332d2e3932322e3335312d312e3333362e3134392d2e3431342e3332322d2e37392e3532322d312e31332e3139352d2e3334342e3430342d2e3634392e3632372d2e3931342e3232322d2e32372e34352d2e3439382e3638352d2e36383661332e313120332e3131203020302031202e3638362d2e3432386c2e33312e383861332e353920332e35392030203020302d2e36352e36373320342e37353620342e3735362030203020302d2e35393220312e30353520372e35303420372e3530342030203020302d2e34323820312e34372031302e31332031302e31332030203020302d2e31363420312e393238762e3135326330202e37322e30353720312e33362e313720312e39323261372e393220372e3932203020302030202e34333420312e343737632e3137362e3432322e3337332e3737352e35393220312e30362e3231342e3238362e3432372e35312e3633382e3637346c2d2e33312e38373361332e313120332e31312030203020312d2e3638362d2e34323720342e37333920342e3733392030203020312d2e3638352d2e36383620362e31353220362e3135322030203020312d2e3632372d2e393134632d2e322d2e33342d2e3337332d2e3731372d2e3532322d312e313361382e353520382e35352030203020312d2e34382d322e3836762d2e31335a222f3e00'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d31382e3032312036302e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e3930322e3231352d2e3236322e3433362d2e3438332e3636322d2e3636332e3233312d2e3138332e3435342d2e3332342e3636382d2e3432316c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d372e36353920322e35323663302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30313920312e3031392030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e303720312e30372030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d352e3637372d332e393434762d312e3537366c352e32373420322e31343576312e33336c2d352e32373420322e31355636312e35386c332e3335382d312e3132352e3335372d2e3131372d2e3335312d2e3131372d332e3336342d312e3130385a6d31322e34373520362e313539682d352e33343456363468352e33343476312e3237325a6d372e3230382030682d352e33343556363468352e33343476312e3237325a6d332e3838342d352e3036332d2e3339392e3134362e3339392e31343120332e323120312e30373276312e3538386c2d352e3138352d322e3135762d312e3331396c352e3138362d322e313576312e3538326c2d332e32313120312e30395a6d362e37393120322e38343863302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e303838732e3333342e30332e3437342e303838632e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232332e3334632e3035342e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032382e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232332e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239382e3038322d2e3437342e303832732d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d392e3839362d322e33393761382e363420382e36342030203020312d2e31323920312e35323420382e33333820382e3333382030203020312d2e33353120312e33333620362e37313320362e3731332030203020312d2e35323220312e313320362e31343520362e3134352030203020312d2e3632372e393134632d2e3232322e32372d2e34352e3439392d2e3638352e36383661332e313120332e31312030203020312d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e363733632e3231392d2e3238352e3431362d2e3633372e3539322d312e3035352e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e31312d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e39313320372e3931332030203020302d2e3433342d312e34373720342e37323320342e3732332030203020302d2e3539322d312e303620332e35373220332e3537322030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353420382e3534203020302031202e343820322e3836762e31335a222f3e'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d31382e3532312036302e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e3930322e3231352d2e3236322e3433362d2e3438332e3636322d2e3636332e3233312d2e3138332e3435342d2e3332342e3636382d2e3432316c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d352e3339322d352e30363268312e3532346c332e31393320392e323633682d312e3532336c2d332e3139342d392e3236335a4d33392e373233203634682d2e383135762d312e383439682d312e323037563634682d2e383137762d342e323636682e38313776312e373568312e323037762d312e3735682e3831355636345a222f3e3c706174682066696c6c3d22234146463245322220643d226d34312e3336372036312e372e38342d312e393636682e3930366c2d312e33343220322e37394c34312e373638203634682d2e38326c2d2e3030332d312e3531322d312e3332312d322e373534682e3930326c2e383420312e3936365a222f3e3c706174682066696c6c3d22234146463245322220643d224d34332e37392036322e343335563634682d2e383233762d342e32363668312e343539632e3233322030202e3434322e3033352e36332e3130332e3138372e3036362e3334372e31362e3437372e3238312e3133332e31322e3233352e3236332e3330352e34332e3037322e3136392e3130382e3335352e3130382e35362030202e3139322d2e3033362e3336392d2e3130382e353361312e313920312e31392030203020312d2e3330352e343232632d2e31332e3131382d2e32392e32312d2e3437372e3237362d2e3138382e3036362d2e3339382e312d2e36332e31682d2e3633365a6d302d2e363637682e363336612e3830312e383031203020302030202e3330352d2e3035332e3539372e353937203020302030202e3334322d2e3335322e37322e3732203020302030202e3034342d2e32343963302d2e312d2e3031342d2e3139322d2e3034342d2e323738612e3630312e3630312030203020302d2e3334322d2e3337382e3736352e3736352030203020302d2e3330352d2e303536682d2e36333676312e3336365a6d342e3735332e3336324834362e373976312e32303568322e303438563634682d322e383734762d342e32363668322e383635762e363731682d322e303476312e30373568312e373533762e36355a6d312e3832362e323736682d2e363234563634682d2e383234762d342e32363668312e3433632e3233362030202e34352e3032392e3634322e3038352e3139312e3035352e3335342e3133362e3438392e3234332e3133372e3130382e3234312e3234322e3331332e3430322e3037352e31362e3131322e3334362e3131322e3535362030202e3135332d2e3031392e32392d2e3035362e34313461312e31303420312e3130342030203020312d2e3339382e3538632d2e3039342e3037322d2e322e3133342d2e3331372e3138376c2e39313720312e3736563634682d2e3838326c2d2e3830322d312e3539345a6d2d2e3632342d2e363638682e363039632e3233322030202e3431312d2e3035382e3533362d2e313735612e3633352e363335203020302030202e31392d2e34383763302d2e3231332d2e3036312d2e3337382d2e3138342d2e3439352d2e3132332d2e31322d2e3330352d2e3137392d2e3534352d2e313739682d2e36303676312e3333365a6d31322e36313220322e3939344836302e38346c332e3139332d392e32363368312e3531376c2d332e31393320392e3236335a6d382e3336332d342e30373261382e363420382e36342030203020312d2e313320312e35323420382e33333820382e3333382030203020312d2e333520312e33333620362e37313320362e3731332030203020312d2e35323220312e313320362e31343520362e3134352030203020312d2e3632372e393134632d2e3232332e32372d2e3435312e3439392d2e3638362e36383661332e313120332e31312030203020312d2e3638362e3432386c2d2e33312d2e383861332e353320332e3533203020302030202e36352d2e363733632e32322d2e3238352e3431362d2e3633372e3539322d312e3035352e3137362d2e3431382e3331392d2e3930382e3432382d312e34372e31312d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433332d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e35373220332e3537322030203020302d2e3633392d2e3637346c2e33312d2e383733632e3232332e3039372e3435322e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638362e3638362e3232322e3236362e3433312e35372e3632372e3931342e3139392e33342e3337332e3731372e35323120312e313361382e353420382e3534203020302031202e343820322e3836762e31335a6d2d32372e353120362e363132682d352e33343356363668352e33343476312e3237325a6d372e3230382030682d352e33343456363668352e33343476312e3237325a222f3e00'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d31382e3032312036302e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e3930322e3231352d2e3236322e3433362d2e3438332e3636322d2e3636332e3233312d2e3138332e3435342d2e3332342e3636382d2e3432316c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31332e3333362d312e343138762d312e3537366c352e32373420322e31343576312e33336c2d352e32373420322e31355636312e35386c332e3335382d312e3132352e3335372d2e3131372d2e3335312d2e3131372d332e3336342d312e3130385a6d31322e34373520362e313539682d352e33343456363468352e33343476312e3237325a6d372e3230382030682d352e33343556363468352e33343476312e3237325a6d332e3838342d352e3036332d2e3339392e3134362e3339392e31343120332e323120312e30373276312e3538386c2d352e3138352d322e3135762d312e3331396c352e3138362d322e313576312e3538326c2d332e32313120312e30395a6d31362e3638372e34353161382e363420382e36342030203020312d2e31323920312e35323420382e33333820382e3333382030203020312d2e33353120312e33333620362e37313320362e3731332030203020312d2e35323220312e313320362e31343520362e3134352030203020312d2e3632372e393134632d2e3232322e32372d2e34352e3439392d2e3638352e36383661332e313120332e31312030203020312d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e363733632e3231392d2e3238352e3431362d2e3633372e3539322d312e3035352e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e31312d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e39313320372e3931332030203020302d2e3433342d312e34373720342e37323320342e3732332030203020302d2e3539322d312e303620332e35373220332e3537322030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353420382e3534203020302031202e343820322e3836762e31335a222f3e00000000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d31382e3032312036302e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e3930322e3231352d2e3236322e3433362d2e3438332e3636322d2e3636332e3233312d2e3138332e3435342d2e3332342e3636382d2e3432316c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a222f3e3c706174682066696c6c3d22234536464635352220643d224d32362e31352036362e343032682d312e30325635352e343768312e30327631302e3933335a6d362e3030372030682d312e30325635352e343768312e30327631302e3933335a222f3e3c706174682066696c6c3d22234146463245322220643d224d33382e3936332035382e33313368312e3031366c322e31323920362e313735682d312e3031366c2d322e3132392d362e3137355a222f3e3c706174682066696c6c3d22234536464635352220643d224d34362e3331322036302e3638682d312e333939563634682d312e3039762d332e3332682d312e333739762d2e39303768312e3338762d312e343668312e303976312e343668312e333938762e3930375a222f3e3c706174682066696c6c3d22234146463245322220643d224d34372e3930362036342e343838682d312e3031316c322e3132382d362e31373568312e3031326c2d322e31323920362e3137355a222f3e3c706174682066696c6c3d22234536464635352220643d224d35382e3138372036362e343032682d312e30325635352e343768312e30327631302e3933335a6d362e3030372030682d312e30325635352e343768312e30327631302e3933335a222f3e3c706174682066696c6c3d22234146463245322220643d224d37312e32322036302e363661382e363520382e36352030203020312d2e31323820312e35323420382e33323720382e3332372030203020312d2e33353220312e33333620362e37303520362e3730352030203020312d2e35323120312e313320362e31353220362e3135322030203020312d2e3632372e393134632d2e3232332e32372d2e3435312e3439392d2e3638362e3638362d2e3233342e3138382d2e3436332e33332d2e3638352e3432386c2d2e33312d2e383861332e353920332e3539203020302030202e36352d2e363733632e3231382d2e3238352e3431362d2e3633372e3539312d312e3035352e3137362d2e3431382e3331392d2e3930382e3432382d312e34372e31312d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035362d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433332d312e34373720342e37323320342e3732332030203020302d2e3539322d312e303620332e35363920332e3536392030203020302d2e3633392d2e3637346c2e33312d2e383733632e3232332e3039372e3435322e32342e3638362e3432372e3233352e3138382e3436332e3431362e3638362e3638362e3232322e3236362e3433312e35372e3632372e3931342e3139392e33342e3337332e3731372e35323120312e313361382e353520382e3535203020302031202e343820322e3836762e31335a6d2d32382e303120362e363132682d352e33343356363668352e33343476312e3237325a6d372e3230382030682d352e33343456363668352e33343476312e3237325a222f3e000000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d31392e3032312036302e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e3930322e3231352d2e3236322e3433362d2e3438332e3636322d2e3636332e3233312d2e3138332e3435342d2e3332342e3636382d2e3432316c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d362e34353920322e35323663302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437342d2e3038382e3137362030202e3333352e30332e3437352e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30313920312e3031392030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437352e3038322d2e31373520302d2e3333332d2e3032372d2e3437342d2e30383261312e303720312e30372030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e36373720332e333435682d312e30325635352e343768312e30327631302e3933335a6d382e3339372d352e353037682d342e3838762d312e33313968342e383876312e3331395a6d332e36313620352e353037682d312e3031395635352e343768312e30327631302e3933335a6d342e3333382d332e33343563302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038332e32372e3038332e3432322030202e3134382d2e3032382e3238372d2e3038332e343136612e3938372e3938372030203020312d2e3232322e333420312e30313920312e3031392030203020312d2e3335322e323232632d2e31342e3035352d2e3239382e3038322d2e3437342e303832732d2e3333342d2e3032372d2e3437352d2e30383261312e30363920312e3036392030203020312d2e3335372d2e3232322e3938392e3938392030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e36373720332e333435682d312e30325635352e343768312e30327631302e3933335a6d342e3333372d332e33343563302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303220312e3032203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e303838612e3936342e393634203020302031202e3335322e3232392e39322e3932203020302031202e3232332e3334632e3035342e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032382e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232332e333420312e30313920312e3031392030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e303720312e30372030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323720312e3132372030203020312d2e3037362d2e3431365a6d382e3639362d322e33393761382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632362e393134632d2e3232332e32372d2e3435322e3439392d2e3638362e3638362d2e3233342e3138382d2e3436332e33332d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e31312d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e353720332e35372030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638362e3638362e3232322e3236362e3433312e35372e3632362e3931342e322e33342e3337342e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e00000000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d31372e3032312036302e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e3930322e3231352d2e3236322e3433362d2e3438332e3636322d2e3636332e3233312d2e3138332e3435342d2e3332342e3636382d2e3432316c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d362e34353920322e35323663302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437342d2e3038382e3137362030202e3333352e30332e3437352e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30313920312e3031392030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437352e3038322d2e31373520302d2e3333332d2e3032372d2e3437342d2e30383261312e303720312e30372030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d342e3437372d332e393434762d312e3537366c352e32373420322e31343576312e33336c2d352e32373420322e31355636312e35386c332e3335382d312e3132352e3335372d2e3131372d2e3335312d2e3131372d332e3336342d312e3130385a6d31322e3030392d2e3868312e3031356c322e313320362e313735682d312e3031376c2d322e3132382d362e3137355a6d362e34333820342e313935612e3736322e3736322030203020302d2e30352d2e32392e3631372e3631372030203020302d2e3135372d2e32333420312e30343120312e3034312030203020302d2e3238312d2e31393120332e31363620332e3136362030203020302d2e3431382d2e31373620372e33323120372e3332312030203020312d2e37322d2e32393720322e33353220322e3335322030203020312d2e3535342d2e33363320312e34373720312e3437372030203020312d2e3335312d2e343820312e35383620312e3538362030203020312d2e3132352d2e36353763302d2e3232312e3033372d2e3432332e3131332d2e3630352e3037362d2e3138352e3138322d2e3334352e33322d2e343861312e363120312e3631203020302031202e352d2e33323920322e3220322e32203020302031202e3635332d2e3136762d2e3834682e363235762e383438632e3233342e3033312e3434352e3039352e3633322e31393161312e36303120312e363031203020302031202e3738312e393236632e3037342e3230382e31312e3434332e31312e373033682d312e30383663302d2e3331352d2e3037322d2e3535332d2e3231352d2e373135612e3733332e3733332030203020302d2e3538322d2e32343620312e303120312e30312030203020302d2e3334372e3035352e3539382e3539382030203020302d2e33382e3337312e3838332e3838332030203020302d2e3034322e3238316330202e3130322e3031342e3139332e3034332e323734612e3632392e363239203020302030202e3135322e323138632e3037332e3036382e3136382e3133332e3238352e3139362e3131372e30362e3236332e31322e3433382e3138332e3236332e312e3530312e3230322e3731352e3330392e3231332e3130342e3339352e3232372e3534362e3336372e3135342e3133382e3237312e332e3335322e3438352e3038332e3138322e3132352e3339382e3132352e3634382030202e32332d2e3033382e3433362d2e3131332e3632312d2e3037362e3138322d2e3138342e33342d2e3332352e3437332d2e31342e3133332d2e33312e32342d2e3530372e333261322e343320322e34332030203020312d2e3636342e313532762e373636682d2e363232762d2e37363661322e35393820322e3539382030203020312d2e3634342d2e31343420312e373220312e37322030203020312d2e3535352d2e33333620312e36303620312e3630362030203020312d2e3338332d2e353520322e303320322e30332030203020312d2e3134342d2e38303668312e30396330202e3138382e3032372e3334362e3038322e343733612e3834322e383432203020302030202e32312e332e3831322e383132203020302030202e3330312e313537632e3131322e3033312e3232372e3034372e3334342e3034372e3237392030202e34392d2e3036352e3633332d2e313935612e36352e3635203020302030202e3231352d2e3530345a6d322e35303520312e3938682d312e3031326c322e3132392d362e31373568312e3031316c2d322e31323820362e3137355a6d392e3032362d342e3237392d2e3339382e3134362e3339382e31343120332e32313220312e30373276312e3538386c2d352e3138362d322e3135762d312e3331396c352e3138362d322e313576312e3538326c2d332e32313220312e30395a6d352e35393220322e38343863302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232322d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239392d2e3038382e3437342d2e3038382e3137362030202e3333342e30332e3437352e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30313920312e3031392030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437352e3038322d2e31373520302d2e3333342d2e3032372d2e3437342d2e30383261312e30363820312e3036382030203020312d2e3335382d2e3232322e3938372e3938372030203020312d2e3232322d2e333420312e31323720312e3132372030203020312d2e3037362d2e3431365a6d382e3639362d322e33393761382e363420382e36342030203020312d2e31323920312e35323420382e33333820382e3333382030203020312d2e33353120312e33333620362e37313320362e3731332030203020312d2e35323220312e313320362e31343520362e3134352030203020312d2e3632372e393134632d2e3232322e32372d2e3435312e3439392d2e3638352e36383661332e313120332e31312030203020312d2e3638362e3432386c2d2e33312d2e3838632e3231342d2e3136332e3433312d2e3338382e36352d2e3637332e3231392d2e3238352e3431362d2e3633372e3539322d312e3035352e3137352d2e3431382e3331382d2e3930382e3432372d312e34372e31312d2e3536332e3136352d312e3230362e3136352d312e393238762d2e31353261392e3820392e382030203020302d2e31372d312e39323220372e39323820372e3932382030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e35373220332e3537322030203020302d2e3633392d2e3637346c2e3331312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436322e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353420382e3534203020302031202e343820322e3836762e31335a222f3e00')
];
string[] internal body_traits = [
"Big",
"Bitcoin Maxi",
"Corporate",
"Frogger",
"Hype",
"Normal",
"Priest",
"Shirt",
"Wealthy"
];
uint[] internal body_probability = [
15,
20,
24,
39,
54,
69,
73,
88,
100
];
// Getter functions
function getBodyTrait(uint index) external view returns (string memory) {
return body_traits[index];
}
function getBodyData(uint index) external view returns (bytes memory) {
return body_data[index];
}
function getBodyProbability() external view returns (uint[] memory) {
return body_probability;
}
function totalBody() external view returns (uint) {
return body_traits.length;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
// Copyright (c) 2025 Berny Art
//
// This file and the associated art layers are proprietary.
// They may not be reused, copied, or sold in any form without explicit
// written permission from Berny Art.
contract FrogsEyesA {
// Data for the eyes trait
bytes[] internal eyes_data = [
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32342e3032312033362e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e39303261342e3420342e34203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a4d33312e323437203430632d2e34363720302d2e38342d2e3133372d312e31322d2e34312d2e3237332d2e3237332d2e34312d2e36342d2e34312d312e3120302d2e3438372e3134332d2e3836332e34332d312e31332e3239332d2e3237332e3732332d2e343120312e32392d2e3431682e3539762d312e31682d2e3539632d2e35363720302d2e3939372d2e3133332d312e32392d2e342d2e3238372d2e3237332d2e34332d2e3635332d2e34332d312e313420302d2e34362e3133372d2e3832372e34312d312e312e32382d2e3237332e3635332d2e343120312e31322d2e34312e3337332030202e3636372e30372e38382e32312e32322e31342e3337332e3332372e34362e35362e3039332e3233332e31342e34392e31342e3737762e383368312e31762d2e383363302d2e32382e3034332d2e3533372e31332d2e37372e3039332d2e3233332e3234372d2e34322e34362d2e35362e32322d2e31342e3531372d2e32312e38392d2e32312e3436372030202e3833372e31333720312e31312e34312e32382e3237332e34322e36342e343220312e312030202e3438372d2e3134332e3836372d2e343320312e31342d2e3238372e3236372d2e3731372e342d312e32392e34682d2e353976312e31682e3539632e353733203020312e3030332e31333720312e32392e34312e3238372e3236372e34332e3634332e343320312e31332030202e34362d2e31342e3832372d2e343220312e312d2e3237332e3237332d2e3634332e34312d312e31312e34312d2e33373320302d2e36372d2e30372d2e38392d2e323161312e31383120312e3138312030203020312d2e34362d2e353620322e31393720322e3139372030203020312d2e31332d2e3737762d2e3833682d312e31762e38336330202e32382d2e3034372e3533372d2e31342e37372d2e3038372e3233332d2e32342e34322d2e34362e35362d2e3231332e31342d2e3530372e32312d2e38382e32315a6d332e32382d352e3638762e3835682e3539632e3335332030202e36312d2e30372e37372d2e32312e31362d2e3134372e32342d2e3336332e32342d2e363520302d2e3239332d2e30382d2e3530332d2e32342d2e3633612e38382e38382030203020302d2e35382d2e3139632d2e323620302d2e3435372e3037372d2e35392e32332d2e3132372e3134372d2e31392e3334372d2e31392e365a6d2d332e30392e3835682e3539762d2e383563302d2e3235332d2e3036372d2e3435332d2e322d2e362d2e3132372d2e3135332d2e33322d2e32332d2e35382d2e3233612e39322e39322030203020302d2e35392e3139632d2e3135332e3132372d2e32332e3333372d2e32332e36332030202e3238372e30382e3530332e32342e36352e31362e31342e3431372e32312e37372e32315a6d312e323920312e373868312e31762d312e31682d312e3176312e315a6d2d312e343820322e3336632e32362030202e3435332d2e3037332e35382d2e32322e3133332d2e3135332e322d2e3335372e322d2e3631762d2e3835682d2e3539632d2e33353320302d2e36312e3037332d2e37372e32322d2e31362e31342d2e32342e3335332d2e32342e36342030202e3239332e3037372e3530332e32332e3633612e39322e3932203020302030202e35392e31395a6d332e32382d2e38336330202e3235332e3036332e3435372e31392e36312e3133332e3134372e33332e32322e35392e3232612e38382e3838203020302030202e35382d2e3139632e31362d2e3132372e32342d2e3333372e32342d2e363320302d2e3238372d2e30382d2e352d2e32342d2e36342d2e31362d2e3134372d2e3431372d2e32322d2e37372d2e3232682d2e3539762e38355a6d352e3239372e35373763302d2e3135332e3032362d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239382d2e3038382e3437342d2e303838732e3333342e30332e3437352e303838612e39362e3936203020302031202e3335312e3232392e39322e3932203020302031202e3232332e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232332e3334632d2e3039332e3039332d2e32312e3136372d2e3335312e3232322d2e31342e3035352d2e332e3038322d2e3437352e3038322d2e31373620302d2e3333342d2e3032372d2e3437342d2e30383261312e30363920312e3036392030203020312d2e3335382d2e3232322e3938392e3938392030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323037203063302d2e3135332e3032362d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239382d2e3038382e3437342d2e303838732e3333342e30332e3437352e303838612e39362e3936203020302031202e3335312e3232392e39322e3932203020302031202e3232332e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232332e333420312e30303520312e3030352030203020312d2e3335312e323232632d2e31342e3035352d2e332e3038322d2e3437352e3038322d2e31373620302d2e3333342d2e3032372d2e3437342d2e30383261312e30363820312e3036382030203020312d2e3335382d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d362e3737352e393433632d2e34363720302d2e38342d2e3133372d312e31322d2e34312d2e3237342d2e3237332d2e34312d2e36342d2e34312d312e3120302d2e3438372e3134332d2e3836332e34332d312e31332e3239332d2e3237332e3732332d2e343120312e32392d2e3431682e3539762d312e31682d2e3539632d2e35363720302d2e3939372d2e3133332d312e32392d2e342d2e3238372d2e3237332d2e34332d2e3635332d2e34332d312e313420302d2e34362e3133362d2e3832372e34312d312e312e32382d2e3237332e3635332d2e343120312e31322d2e34312e3337332030202e3636362e30372e38382e32312e32322e31342e3337332e3332372e34362e35362e3039332e3233332e31342e34392e31342e3737762e383368312e31762d2e383363302d2e32382e3034332d2e3533372e31332d2e37372e3039332d2e3233332e3234362d2e34322e34362d2e35362e32322d2e31342e3531362d2e32312e38392d2e32312e3436362030202e3833362e31333720312e31312e34312e32382e3237332e34322e36342e343220312e312030202e3438372d2e3134342e3836372d2e343320312e31342d2e3238372e3236372d2e3731372e342d312e32392e34682d2e353976312e31682e3539632e353733203020312e3030332e31333720312e32392e34312e3238362e3236372e34332e3634332e343320312e31332030202e34362d2e31342e3832372d2e343220312e312d2e3237342e3237332d2e3634342e34312d312e31312e34312d2e33373420302d2e36372d2e30372d2e38392d2e323161312e31383120312e3138312030203020312d2e34362d2e353620322e31393720322e3139372030203020312d2e31332d2e3737762d2e3833682d312e31762e38336330202e32382d2e3034372e3533372d2e31342e37372d2e3038372e3233332d2e32342e34322d2e34362e35362d2e3231342e31342d2e3530372e32312d2e38382e32315a6d332e32382d352e3638762e3835682e3539632e3335332030202e36312d2e30372e37372d2e32312e31362d2e3134372e32342d2e3336332e32342d2e363520302d2e3239332d2e30382d2e3530332d2e32342d2e3633612e38382e38382030203020302d2e35382d2e3139632d2e323620302d2e3435372e3037372d2e35392e32332d2e3132372e3134372d2e31392e3334372d2e31392e365a6d2d332e30392e3835682e3539762d2e383563302d2e3235332d2e3036372d2e3435332d2e322d2e362d2e3132372d2e3135332d2e33322d2e32332d2e35382d2e3233612e39322e39322030203020302d2e35392e3139632d2e3135342e3132372d2e32332e3333372d2e32332e36332030202e3238372e30382e3530332e32342e36352e31362e31342e3431362e32312e37372e32315a6d312e323920312e373868312e31762d312e31682d312e3176312e315a6d2d312e343820322e3336632e32362030202e3435332d2e3037332e35382d2e32322e3133332d2e3135332e322d2e3335372e322d2e3631762d2e3835682d2e3539632d2e33353420302d2e36312e3037332d2e37372e32322d2e31362e31342d2e32342e3335332d2e32342e36342030202e3239332e3037362e3530332e32332e3633612e39322e3932203020302030202e35392e31395a6d332e32382d2e38336330202e3235332e3036332e3435372e31392e36312e3133332e3134372e33332e32322e35392e3232612e38382e3838203020302030202e35382d2e3139632e31362d2e3132372e32342d2e3333372e32342d2e363320302d2e3238372d2e30382d2e352d2e32342d2e36342d2e31362d2e3134372d2e3431372d2e32322d2e37372d2e3232682d2e3539762e38355a6d372e3938362d312e383261382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e3638352d2e3233352e3138382d2e3436332e33332d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e353720332e35372030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e00000000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32352e3032312033362e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e39303261342e3420342e34203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d362e3539322d352e30363268312e3532346c332e31393320392e323633682d312e3532336c2d332e3139342d392e3236335a6d382e32373420372e35383863302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232322d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938392e3938392030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363920312e3036392030203020312d2e3335382d2e3232322e3938392e3938392030203020312d2e3232322d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323037203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e35343120312e363735682d312e3531386c332e3139342d392e32363368312e3531376c2d332e31393320392e3236335a6d392e3536322d342e30373261382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e3638352d2e3233352e3138382d2e3436332e33332d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e353720332e35372030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e000000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32322e3532312033362e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e39303261342e3420342e34203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31302e3834312d312e33353361362e39313720362e3931372030203020312d2e31323320312e303935632d2e30372e33362d2e3137352e3638342d2e3331362e39373361322e30343620322e3034362030203020312d2e3532372e36393720312e31383320312e3138332030203020312d2e3737342e323634632d2e31393920302d2e33382d2e3034392d2e3534352d2e31343761312e303620312e30362030203020312d2e33382d2e34333320312e34373920312e3437392030203020312d2e34342e34313620312e30303520312e3030352030203020312d2e3533392e313532632d2e32333420302d2e34342d2e3035322d2e3631352d2e31353861312e31393220312e3139322030203020312d2e3432382d2e343531632d2e31312d2e322d2e3138362d2e3433382d2e3232392d2e37313561342e30313820342e3031382030203020312d2e3031312d2e39323620352e303220352e3032203020302031202e3232382d312e30373820322e393120322e3931203020302031202e3433342d2e383220312e383120312e3831203020302031202e3632312d2e35323720312e363920312e3639203020302031202e3830332d2e313838632e3330342030202e3535322e3034352e3734342e31333561312e3720312e37203020302031202e3437342e33316c2d2e32353220332e30383861312e3120312e31203020302030202e3030362e323634632e3031362e3036322e3033382e31312e3036352e3134612e3230382e323038203020302030202e3130352e30362e3539362e353936203020302030202e3131372e3031632e3130322030202e3139342d2e3035322e3237362d2e3135372e3038362d2e3130362e31362d2e3235322e3232332d2e343461332e343520332e3435203020302030202e31342d2e363638632e3033352d2e3236312e3035332d2e3534372e3035332d2e38353561342e35373620342e3537362030203020302d2e3130362d312e32333720322e31363920322e3136392030203020302d2e3339322d2e38363720312e36323720312e3632372030203020302d2e3637342d2e35303420322e34373320322e3437332030203020302d2e3933322d2e313634632d2e33393820302d2e3735382e30392d312e3037382e323761322e34373820322e3437382030203020302d2e3831342e37333820332e383320332e38332030203020302d2e35323820312e3133632d2e3132382e3433342d2e322e3931312d2e32313620312e34332d2e30322e3532342e3031352e3938312e31303520312e3337322e3039342e33392e3233362e3731362e3432382e3937382e3139352e3235382e34342e3435312e3733322e35382e3239372e31332e3633372e31393420312e30322e31393461332e37353720332e373537203020302030202e37352d2e303838632e3132352d2e3033322e3234322d2e3036372e3335312d2e3130362e3131342d2e3033392e3231352d2e3038322e3330352d2e3132396c2e3138382e37393161312e36373220312e3637322030203020312d2e3335322e31393420332e313620332e31362030203020312d2e34312e3134632d2e3134352e3033362d2e32392e3036312d2e3433342e3037372d2e3134342e30322d2e3238332e3032392d2e3431362e3032392d2e353720302d312e3036322d2e3039342d312e3437362d2e32383161322e36363720322e3636372030203020312d312e3032362d2e38303320332e33383820332e3338382030203020312d2e3539312d312e32363620362e333120362e33312030203020312d2e3135332d312e363831632e30322d2e3631382e3132312d312e3139382e3330352d312e373461342e37333720342e373337203020302031202e3736322d312e34313920332e35383120332e35383120302030203120312e3134382d2e39353520332e30363320332e30363320302030203120312e3435392d2e333531632e34362030202e3837372e30383820312e3234382e3236342e3337312e3137312e3638342e3431372e3933372e3733382e3235382e3331362e3435322e3639372e353820312e3134322e31332e3434362e3138362e39342e313720312e3438335a6d2d332e3931342e373637632d2e3032332e34352e3031322e3738372e31303620312e3031342e3039382e3232362e3234322e33342e3433342e3334612e36362e3636203020302030202e3238372d2e30372e37392e3739203020302030202e32382d2e323838762d2e303335612e3137312e313731203020302030202e3030372d2e30346c2e3232322d322e3632612e3932362e3932362030203020302d2e3138312d2e3031382e3838392e3838392030203020302d2e3739312e3434632d2e3138342e3239332d2e3330352e3731392d2e33363420312e3237375a6d382e3232382e37313561382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e3638352d2e3233352e3138382d2e3436332e33332d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e35363620332e3536362030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a6d332e33313820322e33393763302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d362e303036203063302d2e3135332e3032362d2e3239332e3037372d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232332e3334632e3035342e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032382e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232332e333420312e30313920312e3031392030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e303720312e30372030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d352e3535372d322e35323663302d2e35352e30342d312e3036382e3132332d312e3535332e3038362d2e3438382e322d2e3933372e3334352d312e33343761372037203020302031202e3530342d312e313331632e3139362d2e33342e342d2e36342e3631352d2e3930322e3231352d2e3236322e3433362d2e3438332e3636332d2e36363261332e323420332e3234203020302031202e3636382d2e3432326c2e3331362e383961332e36353420332e3635342030203020302d2e3635362e363820342e35383620342e3538362030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331362e38373961332e32333620332e3233362030203020312d2e3636382d2e34323220342e363720342e36372030203020312d2e3636332d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30383420372e3038342030203020312d2e3530342d312e31323520382e37303120382e3730312030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31302e3834312d312e33353361362e39323920362e3932392030203020312d2e31323320312e303935632d2e30372e33362d2e3137362e3638342d2e3331372e39373361322e30343620322e3034362030203020312d2e3532372e36393720312e31383320312e3138332030203020312d2e3737342e32363420312e303420312e30342030203020312d2e3534342d2e31343720312e303620312e30362030203020312d2e3338312d2e34333320312e34373920312e3437392030203020312d2e34342e34313620312e30303520312e3030352030203020312d2e3533392e313532632d2e32333420302d2e34342d2e3035322d2e3631352d2e31353861312e313920312e31392030203020312d2e3432382d2e343531632d2e31312d2e322d2e3138352d2e3433382d2e3232382d2e37313561342e30323920342e3032392030203020312d2e3031322d2e39323620352035203020302031202e3232382d312e30373820322e393120322e3931203020302031202e3433342d2e383220312e383120312e3831203020302031202e3632312d2e35323720312e363920312e3639203020302031202e3830332d2e313838632e3330352030202e3535332e3034352e3734342e3133352e3139352e30392e3335342e3139332e3437352e33316c2d2e32353220332e30383861312e3120312e31203020302030202e3030352e323634632e3031362e3036322e3033382e31312e3036352e3134612e3230382e323038203020302030202e3130352e30362e36382e3638203020302030202e3131382e3031632e3130312030202e3139332d2e3035322e3237352d2e3135372e3038362d2e3130362e31362d2e3235322e3232332d2e343461332e343520332e3435203020302030202e31342d2e363638632e3033352d2e3236312e3035332d2e3534372e3035332d2e38353561342e35373320342e3537332030203020302d2e3130352d312e32333720322e313720322e31372030203020302d2e3339332d2e38363720312e36323720312e3632372030203020302d2e3637342d2e35303420322e343720322e34372030203020302d2e3933312d2e313634632d2e33393920302d2e3735382e30392d312e3037392e323761322e343820322e34382030203020302d2e3831342e37333820332e38333220332e3833322030203020302d2e35323720312e3133632d2e31332e3433342d2e3230322e3931312d2e32313720312e34332d2e30322e3532342e3031352e3938312e31303520312e3337322e3039342e33392e3233372e3731362e3432382e3937382e3139352e3235382e34342e3435312e3733322e35382e3239372e31332e3633372e31393420312e30322e31393461332e37353720332e373537203020302030202e37352d2e303838632e3132352d2e3033322e3234322d2e3036372e3335322d2e3130362e3131332d2e3033392e3231342d2e3038322e3330342d2e3132396c2e3138382e37393161312e36373320312e3637332030203020312d2e3335322e31393420332e31363420332e3136342030203020312d2e34312e313420332e333520332e33352030203020312d2e3433342e303737632d2e3134342e30322d2e3238332e3032392d2e3431362e3032392d2e353720302d312e3036322d2e3039342d312e3437362d2e32383161322e36363820322e3636382030203020312d312e3032362d2e38303320332e333920332e33392030203020312d2e3539312d312e32363620362e33303620362e3330362030203020312d2e3135332d312e363831632e30322d2e3631382e3132312d312e3139382e3330352d312e373461342e37333720342e373337203020302031202e3736322d312e34313920332e353820332e353820302030203120312e3134382d2e39353520332e30363320332e30363320302030203120312e34362d2e333531632e34362030202e3837362e30383820312e3234372e3236342e3337312e3137312e3638342e3431372e3933382e3733382e3235382e3331362e34352e3639372e353820312e3134322e3132392e3434362e3138352e39342e313720312e3438335a6d2d332e3931342e373637632d2e3032342e34352e3031312e3738372e31303520312e3031342e3039382e3232362e3234322e33342e3433342e3334612e36362e3636203020302030202e3238372d2e30372e37392e3739203020302030202e3238312d2e323838762d2e303335612e3137322e313732203020302030202e3030362d2e30346c2e3232322d322e3632612e3932352e3932352030203020302d2e3138312d2e3031382e3838392e3838392030203020302d2e3739312e3434632d2e3138342e3239332d2e3330352e3731392d2e33363320312e3237375a6d382e3232372e37313561382e363420382e36342030203020312d2e31323920312e35323420382e33333820382e3333382030203020312d2e33353120312e33333620362e37313320362e3731332030203020312d2e35323220312e313320362e31343520362e3134352030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e36383561332e313120332e31312030203020312d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e363733632e3231392d2e3238352e3431362d2e3633372e3539322d312e3035352e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e31312d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e39313320372e3931332030203020302d2e3433342d312e34373720342e37323320342e3732332030203020302d2e3539312d312e303620332e35373220332e3537322030203020302d2e36342d2e3637346c2e3331312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353420382e3534203020302031202e343820322e3836762e31335a222f3e00'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32322e3532312033362e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e39303261342e3420342e34203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31302e3531392e333634682d342e3838762d312e33313968342e383876312e3331395a6d342e3633362d2e32333561382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e3638352d2e3233352e3138382d2e3436332e33332d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e35363620332e3536362030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a6d332e33313820322e33393763302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d362e303036203063302d2e3135332e3032362d2e3239332e3037372d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232332e3334632e3035342e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032382e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232332e333420312e30313920312e3031392030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e303720312e30372030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d352e3535372d322e35323663302d2e35352e30342d312e3036382e3132332d312e3535332e3038362d2e3438382e322d2e3933372e3334352d312e33343761372037203020302031202e3530342d312e313331632e3139362d2e33342e342d2e36342e3631352d2e3930322e3231352d2e3236322e3433362d2e3438332e3636332d2e36363261332e323420332e3234203020302031202e3636382d2e3432326c2e3331362e383961332e36353420332e3635342030203020302d2e3635362e363820342e35383620342e3538362030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331362e38373961332e32333620332e3233362030203020312d2e3636382d2e34323220342e363720342e36372030203020312d2e3636332d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30383420372e3038342030203020312d2e3530342d312e31323520382e37303120382e3730312030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31302e3531382e333634682d342e3838762d312e33313968342e383876312e3331395a6d342e3633362d2e32333561382e363420382e36342030203020312d2e31323920312e35323420382e33333820382e3333382030203020312d2e33353120312e33333620362e37313320362e3731332030203020312d2e35323220312e313320362e31343520362e3134352030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e36383561332e313120332e31312030203020312d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e363733632e3231392d2e3238352e3431362d2e3633372e3539322d312e3035352e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e31312d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e39313320372e3931332030203020302d2e3433342d312e34373720342e37323320342e3732332030203020302d2e3539312d312e303620332e35373220332e3537322030203020302d2e36342d2e3637346c2e3331312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353420382e3534203020302031202e343820322e3836762e31335a222f3e00'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32322e3532312033362e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e39303261342e3420342e34203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31302e3435352d2e373332682d352e353433762d312e33333668352e35343376312e3333365a6d3020322e353235682d352e353433762d312e333368352e35343376312e33335a6d342e372d312e36363461382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e3638352d2e3233352e3138382d2e3436332e33332d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e35363620332e3536362030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a6d332e33313820322e33393763302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d362e303036203063302d2e3135332e3032362d2e3239332e3037372d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232332e3334632e3035342e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032382e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232332e333420312e30313920312e3031392030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e303720312e30372030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d352e3535372d322e35323663302d2e35352e30342d312e3036382e3132332d312e3535332e3038362d2e3438382e322d2e3933372e3334352d312e33343761372037203020302031202e3530342d312e313331632e3139362d2e33342e342d2e36342e3631352d2e3930322e3231352d2e3236322e3433362d2e3438332e3636332d2e36363261332e323420332e3234203020302031202e3636382d2e3432326c2e3331362e383961332e36353420332e3635342030203020302d2e3635362e363820342e35383620342e3538362030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331362e38373961332e32333620332e3233362030203020312d2e3636382d2e34323220342e363720342e36372030203020312d2e3636332d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30383420372e3038342030203020312d2e3530342d312e31323520382e37303120382e3730312030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31302e3435332d2e373332682d352e353432762d312e33333668352e35343376312e3333365a6d3020322e353235682d352e353432762d312e333368352e35343376312e33335a6d342e3730312d312e36363461382e363420382e36342030203020312d2e31323920312e35323420382e33333820382e3333382030203020312d2e33353120312e33333620362e37313320362e3731332030203020312d2e35323220312e313320362e31343520362e3134352030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e36383561332e313120332e31312030203020312d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e363733632e3231392d2e3238352e3431362d2e3633372e3539322d312e3035352e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e31312d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e39313320372e3931332030203020302d2e3433342d312e34373720342e37323320342e3732332030203020302d2e3539312d312e303620332e35373220332e3537322030203020302d2e36342d2e3637346c2e3331312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353420382e3534203020302031202e343820322e3836762e31335a222f3e00000000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32352e3532312033362e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e39303261342e3420342e34203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31302e3531392e333634682d342e3838762d312e33313968342e383876312e3331395a6d342e3633362d2e32333561382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e3638352d2e3233352e3138382d2e3436332e33332d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e35363620332e3536362030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a6d332e33313820322e33393763302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d362e303036203063302d2e3135332e3032362d2e3239332e3037372d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232332e3334632e3035342e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032382e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232332e333420312e30313920312e3031392030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e303720312e30372030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d31302e3235362d322e3639366330202e3534372d2e30373220312e3035312d2e32313720312e35313261332e34393120332e3439312030203020312d2e36323720312e313920322e38383620322e3838362030203020312d312e3030322e373739632d2e33392e3138332d2e3833322e3237352d312e3332342e323735613320332030203020312d312e3331332d2e32373520322e37363320322e3736332030203020312d2e3936362d2e373820332e35383420332e3538342030203020312d2e3539382d312e31383920352e32393920352e3239392030203020312d2e3230352d312e3531325633352e313261352e3320352e33203020302031202e3230352d312e353132632e3133372d2e34362e3333362d2e3835372e3539382d312e31383961322e373520322e3735203020302031202e39362d2e37383520322e393420322e393420302030203120312e3331332d2e323831632e3439362030202e39342e30393320312e33332e32382e3339352e3138382e3732392e343520312e3030322e3738362e3237332e3333322e3438332e3732392e36323720312e31392e3134352e34362e3231372e3936342e32313720312e35313176312e3234325a6d2d312e36372d312e32353463302d2e3334372d2e30332d2e3636372d2e3038382d2e393661322e333920322e33392030203020302d2e3236342d2e37353620312e33353420312e3335342030203020302d2e3436382d2e34393320312e32333720312e3233372030203020302d2e3638362d2e313831632d2e32363520302d2e3438382e30362d2e3636382e3138312d2e31382e3131382d2e3332342e3238322d2e3433342e34393361322e343920322e34392030203020302d2e3233342e37353620362e303820362e30382030203020302d2e30372e393676312e3235346330202e3334342e3032332e3636322e30372e3935352e3034372e3239332e3132352e3534372e3233342e3736322e31312e3231352e3235342e3338332e3433342e353034732e3430342e3138322e3637342e313832632e3236362030202e3439322d2e30362e36382d2e3138322e3139312d2e3132312e3334352d2e3238372e3436322d2e3439382e3132322d2e3231352e3231322d2e3436392e32372d2e37363261342e383720342e3837203020302030202e3038382d2e3936762d312e3235355a222f3e000000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32352e3032312033362e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e39303261342e3420342e34203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31322e3034322d312e33353361362e39313720362e3931372030203020312d2e31323320312e303935632d2e30372e33362d2e3137362e3638342d2e3331372e39373361322e30343620322e3034362030203020312d2e3532372e36393720312e31383320312e3138332030203020312d2e3737342e323634632d2e31393920302d2e33382d2e3034392d2e3534352d2e31343761312e303620312e30362030203020312d2e33382d2e34333320312e34373920312e3437392030203020312d2e34342e34313620312e30303520312e3030352030203020312d2e3533392e313532632d2e32333420302d2e34342d2e3035322d2e3631352d2e31353861312e31393220312e3139322030203020312d2e3432382d2e343531632d2e31312d2e322d2e3138352d2e3433382d2e3232382d2e37313561342e30313820342e3031382030203020312d2e3031322d2e39323620352e303220352e3032203020302031202e3232382d312e30373820322e393120322e3931203020302031202e3433342d2e383220312e383120312e3831203020302031202e3632312d2e35323720312e363920312e3639203020302031202e3830332d2e313838632e3330342030202e3535322e3034352e3734342e31333561312e3720312e37203020302031202e3437342e33316c2d2e32353220332e30383861312e3120312e31203020302030202e3030362e323634632e3031362e3036322e3033382e31312e3036352e3134612e3230382e323038203020302030202e3130352e30362e3539362e353936203020302030202e3131372e3031632e3130322030202e3139342d2e3035322e3237362d2e3135372e3038362d2e3130362e31362d2e3235322e3232322d2e34342e3036332d2e3138372e31312d2e34312e3134312d2e3636382e3033352d2e3236312e3035332d2e3534372e3035332d2e38353561342e35373620342e3537362030203020302d2e3130362d312e32333720322e31363920322e3136392030203020302d2e3339322d2e38363720312e36323720312e3632372030203020302d2e3637342d2e35303420322e34373320322e3437332030203020302d2e3933322d2e313634632d2e33393820302d2e3735382e30392d312e3037382e323761322e34373820322e3437382030203020302d2e3831342e37333820332e383320332e38332030203020302d2e35323820312e3133632d2e3132382e3433342d2e322e3931312d2e32313620312e34332d2e30322e3532342e3031352e3938312e31303520312e3337322e3039342e33392e3233362e3731362e3432382e3937382e3139352e3235382e34342e3435312e3733322e35382e3239372e31332e3633372e31393420312e30322e31393461332e37353720332e373537203020302030202e37352d2e303838632e3132352d2e3033322e3234322d2e3036372e3335312d2e3130362e3131342d2e3033392e3231352d2e3038322e3330352d2e3132396c2e3138382e37393161312e36373220312e3637322030203020312d2e3335322e31393420332e313620332e31362030203020312d2e34312e3134632d2e3134352e3033362d2e32392e3036312d2e3433342e3037372d2e3134342e30322d2e3238332e3032392d2e3431362e3032392d2e353720302d312e3036322d2e3039342d312e3437362d2e32383161322e36363720322e3636372030203020312d312e3032362d2e38303320332e33383820332e3338382030203020312d2e3539312d312e32363620362e333120362e33312030203020312d2e3135332d312e363831632e30322d2e3631382e3132312d312e3139382e3330352d312e373461342e37333720342e373337203020302031202e3736322d312e34313920332e35383120332e35383120302030203120312e3134382d2e39353520332e30363320332e30363320302030203120312e3435392d2e333531632e34362030202e3837372e30383820312e3234382e3236342e3337312e3137312e3638342e3431372e3933382e3733382e3235372e3331362e34352e3639372e353820312e3134322e3132392e3434362e3138352e39342e313720312e3438335a6d2d332e3931352e373637632d2e3032332e34352e3031322e3738372e31303620312e3031342e3039382e3232362e3234322e33342e3433342e3334612e36362e3636203020302030202e3238372d2e30372e37392e3739203020302030202e32382d2e323838762d2e303335612e3137312e313731203020302030202e3030372d2e30346c2e3232322d322e3632612e3932362e3932362030203020302d2e3138312d2e3031382e3838392e3838392030203020302d2e3739312e3434632d2e3138342e3239332d2e3330352e3731392d2e33363420312e3237375a6d362e37333920332e31313263302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232322d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938392e3938392030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363920312e3036392030203020312d2e3335382d2e3232322e3938392e3938392030203020312d2e3232322d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323037203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d31312e35392d332e38373961362e39303520362e3930352030203020312d2e31323320312e303935632d2e30372e33362d2e3137362e3638342d2e3331372e39373361322e30343620322e3034362030203020312d2e3532372e36393720312e31383320312e3138332030203020312d2e3737342e323634632d2e31393920302d2e33382d2e3034392d2e3534352d2e31343761312e303620312e30362030203020312d2e33382d2e34333320312e34373920312e3437392030203020312d2e34342e34313620312e30303520312e3030352030203020312d2e3533392e313532632d2e32333420302d2e34342d2e3035322d2e3631352d2e31353861312e31393220312e3139322030203020312d2e3432382d2e34353120322e313420322e31342030203020312d2e3232382d2e37313520342e30313820342e3031382030203020312d2e3031322d2e39323620352e303220352e3032203020302031202e3232382d312e30373820322e393120322e3931203020302031202e3433342d2e383220312e383120312e3831203020302031202e3632312d2e35323720312e363920312e3639203020302031202e3830332d2e313838632e3330352030202e3535332e3034352e3734342e3133352e3139352e30392e3335342e3139332e3437342e33316c2d2e32353120332e30383861312e3120312e31203020302030202e3030362e323634632e3031352e3036322e3033372e31312e3036342e3134612e3230382e323038203020302030202e3130352e30362e3539362e353936203020302030202e3131382e3031632e3130312030202e3139332d2e3035322e3237352d2e3135372e3038362d2e3130362e31362d2e3235322e3232332d2e343461332e343520332e3435203020302030202e31342d2e363638632e3033352d2e3236312e3035332d2e3534372e3035332d2e38353561342e35373620342e3537362030203020302d2e3130352d312e32333720322e31363920322e3136392030203020302d2e3339332d2e38363720312e36323720312e3632372030203020302d2e3637342d2e35303420322e343720322e34372030203020302d2e3933312d2e313634632d2e33393920302d2e3735382e30392d312e3037392e323761322e34373820322e3437382030203020302d2e3831342e37333820332e383320332e38332030203020302d2e35323720312e3133632d2e31332e3433342d2e3230322e3931312d2e32313720312e34332d2e30322e3532342e3031352e3938312e31303520312e3337322e3039342e33392e3233362e3731362e3432382e3937382e3139352e3235382e34342e3435312e3733322e35382e3239372e31332e3633372e31393420312e30322e31393461332e37353720332e373537203020302030202e37352d2e303838632e3132352d2e3033322e3234322d2e3036372e3335322d2e3130362e3131332d2e3033392e3231342d2e3038322e3330342d2e3132396c2e3138382e37393161312e36373220312e3637322030203020312d2e3335322e31393420332e313620332e31362030203020312d2e34312e3134632d2e3134352e3033362d2e32392e3036312d2e3433342e3037372d2e3134342e30322d2e3238332e3032392d2e3431362e3032392d2e353720302d312e3036322d2e3039342d312e3437362d2e32383161322e36363720322e3636372030203020312d312e3032362d2e38303320332e33383820332e3338382030203020312d2e3539312d312e32363620362e333120362e33312030203020312d2e3135332d312e363831632e30322d2e3631382e3132312d312e3139382e3330352d312e373461342e37333720342e373337203020302031202e3736322d312e34313920332e353820332e353820302030203120312e3134382d2e39353520332e30363320332e30363320302030203120312e3435392d2e333531632e3436312030202e3837372e30383820312e3234382e3236342e3337312e3137312e3638342e3431372e3933382e3733382e3235372e3331362e34352e3639372e353820312e3134322e3132392e3434362e3138352e39342e313720312e3438335a6d2d332e3931342e373637632d2e3032342e34352e3031312e3738372e31303520312e3031342e3039382e3232362e3234322e33342e3433342e3334612e36362e3636203020302030202e3238372d2e30372e37392e3739203020302030202e3238312d2e323838762d2e303335612e3137312e313731203020302030202e3030362d2e30346c2e3232322d322e3632612e3932362e3932362030203020302d2e3138312d2e3031382e3838392e3838392030203020302d2e3739312e3434632d2e3138342e3239332d2e3330352e3731392d2e33363420312e3237375a6d392e3432372e37313561382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e3638352d2e3233352e3138382d2e3436332e33332d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e353720332e35372030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e00000000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d36322e3533372034302e363433682e393936762d392e333436682d2e393936762d312e323668322e36327631312e383635682d322e3632762d312e32365a222f3e3c706174682066696c6c3d227265642220643d224d36302e3239332033327633682d36762d3368365a6d2d3620307633682d36762d3368365a6d2d3620307633682d36762d3368365a6d2d3620307633682d36762d3368365a6d2d3620307633682d36762d3368365a222f3e3c706174682066696c6c3d22234146463245322220643d224d32372e39352034312e393032682d322e3632365633302e30333768322e36323576312e3236682d312e30303276392e33343668312e30303276312e32365a6d31322e3032332d322e38343563302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437342d2e3038382e3137362030202e3333342e30332e3437352e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30313920312e3031392030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437352e3038322d2e31373520302d2e3333342d2e3032372d2e3437342d2e30383261312e30363720312e3036372030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323037203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232322d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239392d2e3038382e3437342d2e3038382e3137362030202e3333342e30332e3437352e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30313920312e3031392030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335382d2e3232322e3938372e3938372030203020312d2e3232322d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a222f3e0000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32352e3032312033362e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e39303261342e3420342e34203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d382e39383920312e303637682d312e3137384c33322e343034203430682d312e3034396c2e3432382d322e343032682d312e333336762d2e393968312e3531326c2e3330352d312e37682d312e333737762d312e30303268312e3535336c2e3433392d322e34333768312e3034336c2d2e34333420322e34333768312e3137386c2e3433342d322e34333768312e3035346c2d2e343420322e34333768312e32373276312e3030324833352e35346c2d2e33303520312e3768312e333037762e39394833352e30364c33342e3633203430682d312e3034396c2e3432382d322e3430325a6d2d312e3030322d2e393968312e3137376c2e332d312e37682d312e3137386c2d2e3320312e375a6d362e38373920322e34343963302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232322d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938392e3938392030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363920312e3036392030203020312d2e3335382d2e3232322e3938392e3938392030203020312d2e3232322d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323037203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d382e3533362d312e343539682d312e3137374c35342e303235203430682d312e3034386c2e3432372d322e343032682d312e333336762d2e393968312e3531326c2e3330352d312e37682d312e333737762d312e30303268312e3535326c2e34342d322e34333768312e3034336c2d2e34333420322e34333768312e3137386c2e3433342d322e34333768312e3035346c2d2e343420322e34333768312e32373276312e3030324835372e31366c2d2e33303420312e3768312e333036762e39394835362e36384c35362e323532203430682d312e3034396c2e3432382d322e3430325a6d2d312e3030312d2e393968312e3137386c2e3239382d312e37682d312e3137376c2d2e3320312e375a6d392e3536382e30353261382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e3638352d2e3233352e3138382d2e3436332e33332d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e353720332e35372030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e0000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32342e3032312033362e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e39303261342e3420342e34203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d392e33383620332e363133632d2e373620302d312e3432342d2e3131362d312e3939322d2e3334382d2e35362d2e32342d2e3939362d2e3538382d312e3330382d312e3034342d2e3331322d2e3436342d2e3436382d312e3032342d2e3436382d312e363820302d2e3436342e3038382d2e38382e3236342d312e3234382e3138342d2e3336382e3436382d2e36382e3835322d2e393336682d312e313136762d312e35313268342e323936632e3432342030202e3732342d2e3031362e392d2e3034382e3138342d2e3033322e3331362d2e3037362e3339362d2e3133322e3138342d2e3131322e3237362d2e3239362e3237362d2e35353220302d2e3232342d2e30362d2e34342d2e31382d2e36343861342e34323620342e3432362030203020302d2e3439322d2e3637326c312e3334342d2e3738632e3339322e34382e3635362e3930342e37393220312e323732732e3230342e3735362e32303420312e3136346330202e3230382d2e3033322e3432342d2e3039362e36343861312e343720312e34372030203020312d2e33362e3620312e353520312e35352030203020312d2e3332342e323634632d2e31322e30382d2e3236342e3134382d2e3433322e3230342e3432342e3237322e3733322e3630342e3932342e3939362e3139322e3339322e3238382e3835322e32383820312e33382030202e3934342d2e33323820312e3639322d2e39383420322e3234342d2e3635362e3535322d312e3538342e3832382d322e3738342e3832385a6d2e3031322d312e3536632e3435362030202e3833322d2e30383420312e3132382d2e3235322e3239362d2e3136382e3531362d2e3338382e36362d2e363661312e393920312e3939203020302030202e3231362d2e39323463302d2e3536382d2e3137362d312e30322d2e3532382d312e3335362d2e3334342d2e3333362d2e3833362d2e3530342d312e3437362d2e3530342d2e36353620302d312e31362e31382d312e3531322e35342d2e3334342e33362d2e3531362e382d2e35313620312e33322030202e3538342e313820312e3033362e353420312e3335362e33362e33322e3835362e343820312e3438382e34385a6d2d2e3032342d312e3032632d2e32393620302d2e3532382d2e3038342d2e3639362d2e323532612e38372e38372030203020312d2e32342d2e36323463302d2e3235362e3038342d2e3436382e3235322d2e363336612e3932352e393235203020302031202e3638342d2e323634632e32382030202e3530382e3038382e3638342e3236342e3137362e3136382e3236342e33382e3236342e363336612e3832382e3832382030203020312d2e3236342e363234632d2e3136382e3136382d2e3339362e3235322d2e3638342e3235325a6d362e36383720312e34393363302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303220312e3032203020302031202e3335372d2e323239632e31342d2e3035382e332d2e3038382e3437352d2e3038382e3137362030202e3333342e30332e3437342e303838612e3936342e393634203020302031202e3335322e3232392e39322e3932203020302031202e3232332e3334632e3035342e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032382e3238372d2e3038322e343136612e3938392e3938392030203020312d2e3232332e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239382e3038322d2e3437342e303832732d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323038203063302d2e3135332e3032352d2e3239332e3037352d2e343232612e39322e3932203020302031202e3232332d2e333420312e303220312e3032203020302031202e3335372d2e323239632e31342d2e3035382e332d2e3038382e3437352d2e3038382e3137362030202e3333342e30332e3437342e303838612e3936342e393634203020302031202e3335322e3232392e39322e3932203020302031202e3232332e3334632e3035342e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032382e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232332e333420312e303120312e30312030203020312d2e3335322e323232632d2e31342e3035352d2e3239382e3038322d2e3437342e303832732d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323720312e3132372030203020312d2e3037362d2e3431365a6d382e39333320312e303837632d2e373620302d312e3432342d2e3131362d312e3939322d2e3334382d2e35362d2e32342d2e3939362d2e3538382d312e3330382d312e3034342d2e3331322d2e3436342d2e3436382d312e3032342d2e3436382d312e363820302d2e3436342e3038382d2e38382e3236342d312e3234382e3138342d2e3336382e3436382d2e36382e3835322d2e393336682d312e313136762d312e35313268342e323936632e3432342030202e3732342d2e3031362e392d2e3034382e3138342d2e3033322e3331362d2e3037362e3339362d2e3133322e3138342d2e3131322e3237362d2e3239362e3237362d2e35353220302d2e3232342d2e30362d2e34342d2e31382d2e36343861342e34323620342e3432362030203020302d2e3439322d2e3637326c312e3334342d2e3738632e3339322e34382e3635362e3930342e37393220312e323732732e3230342e3735362e32303420312e3136346330202e3230382d2e3033322e3432342d2e3039362e36343861312e343720312e34372030203020312d2e33362e3620312e353520312e35352030203020312d2e3332342e323634632d2e31322e30382d2e3236342e3134382d2e3433322e3230342e3432342e3237322e3733322e3630342e3932342e3939362e3139322e3339322e3238382e3835322e32383820312e33382030202e3934342d2e33323820312e3639322d2e39383420322e3234342d2e3635362e3535322d312e3538342e3832382d322e3738342e3832385a6d2e3031322d312e3536632e3435362030202e3833322d2e30383420312e3132382d2e3235322e3239362d2e3136382e3531362d2e3338382e36362d2e363661312e393920312e3939203020302030202e3231362d2e39323463302d2e3536382d2e3137362d312e30322d2e3532382d312e3335362d2e3334342d2e3333362d2e3833362d2e3530342d312e3437362d2e3530342d2e36353620302d312e31362e31382d312e3531322e35342d2e3334342e33362d2e3531362e382d2e35313620312e33322030202e3538342e313820312e3033362e353420312e3335362e33362e33322e3835362e343820312e3438382e34385a6d2d2e3032342d312e3032632d2e32393620302d2e3532382d2e3038342d2e3639362d2e323532612e38372e38372030203020312d2e32342d2e36323463302d2e3235362e3038342d2e3436382e3235322d2e363336612e3932352e393235203020302031202e3638342d2e323634632e32382030202e3530382e3038382e3638342e3236342e3137362e3136382e3236342e33382e3236342e363336612e3832382e3832382030203020312d2e3236342e363234632d2e3136382e3136382d2e3339362e3235322d2e3638342e3235325a6d392e3337372d2e39303461382e363520382e36352030203020312d2e31323920312e35323420382e33333820382e3333382030203020312d2e33353220312e33333620362e36393820362e3639382030203020312d2e35323120312e313320362e31353220362e3135322030203020312d2e3632372e39313520342e37313620342e3731362030203020312d2e3638362e36383520332e313120332e31312030203020312d2e3638352e3432386c2d2e33312d2e3838632e3231342d2e3136332e3433312d2e3338382e36352d2e3637332e3231392d2e3238352e3431362d2e3633372e3539322d312e3035352e3137352d2e3431382e3331382d2e3930382e3432372d312e34372e31312d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035362d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433332d312e34373720342e37323320342e3732332030203020302d2e3539322d312e303620332e35363620332e3536362030203020302d2e3633392d2e3637346c2e33312d2e383733632e3232332e3039372e3435322e32342e3638362e3432372e3233352e3138382e3436332e3431362e3638362e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323120312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e00'),
bytes(hex'3c6720636c69702d706174683d2275726c28236129223e20203c706174682066696c6c3d22234146463245322220643d224d34302e3437332033392e30353763302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437342d2e3038382e3137362030202e3333342e30332e3437352e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30313920312e3031392030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437352e3038322d2e31373520302d2e3333342d2e3032372d2e3437342d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323037203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232322d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239392d2e3038382e3437342d2e3038382e3137362030202e3333342e30332e3437352e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30313920312e3031392030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e303720312e30372030203020312d2e3335382d2e3232322e3938372e3938372030203020312d2e3232322d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a222f3e20203c706174682066696c6c3d22234536464635352220643d224d3237203430762d3668313276364832375a222f3e20203c706174682066696c6c3d2223453646463535222066696c6c2d6f7061636974793d222e352220643d224d3339203430762d3668313276364833395a222f3e20203c706174682066696c6c3d22234536464635352220643d224d3531203430762d3668313276364835315a222f3e20203c706174682066696c6c3d2223453646463535222066696c6c2d6f7061636974793d222e352220643d224d3633203430762d3668313276364836335a6d31322030762d3668313276364837355a6d31322030762d3668313276364838375a222f3e3c2f673e3c646566733e20203c636c6970506174682069643d2261223e202020203c706174682066696c6c3d22236666662220643d224d30203068393076393048307a222f3e20203c2f636c6970506174683e3c2f646566733e00')
];
string[] internal eyes_traits = [
"Alien",
"Asian",
"Big Confused",
"Big Split",
"Big Squeezed",
"Bruised",
"Confused",
"Cyborg",
"Dazzled",
"Disapproved",
"Laser"
];
uint[] internal eyes_probability = [
1,
3,
9,
15,
21,
23,
29,
31,
36,
42,
43
];
// Getter functions
function getEyesATrait(uint index) external view returns (string memory) {
return eyes_traits[index];
}
function getEyesAData(uint index) external view returns (bytes memory) {
return eyes_data[index];
}
function getEyesAProbability() external view returns (uint[] memory) {
return eyes_probability;
}
function totalEyesA() external view returns (uint) {
return eyes_traits.length;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
// Copyright (c) 2025 Berny Art
//
// This file and the associated art layers are proprietary.
// They may not be reused, copied, or sold in any form without explicit
// written permission from Berny Art.
contract FrogsEyesB {
// Data for the eyes trait
bytes[] internal eyes_data = [
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32332e3032312033362e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e39303261342e3420342e34203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31332e3033362d322e34303176312e3034682d362e33355633312e3968312e333276322e323368352e30335a6d2d352e313220332e3876312e373368352e313876312e3034682d362e35762d322e373768312e33325a6d2d322e32392d312e393668382e333476312e3035682d332e343176312e3631682d312e3332762d312e3631682d332e3631762d312e30355a6d31312e32333220332e30383763302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303220312e3032203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e303838612e3936342e393634203020302031202e3335322e3232392e39322e3932203020302031202e3232332e3334632e3035342e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032382e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232332e333420312e30313920312e3031392030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363920312e3036392030203020312d2e3335372d2e3232322e3938392e3938392030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323037203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303220312e3032203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e303838732e3333342e30332e3437342e303838612e3936342e393634203020302031202e3335322e3232392e39322e3932203020302031202e3232332e3334632e3035342e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032382e3238372d2e3038322e343136612e3938392e3938392030203020312d2e3232332e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239382e3038322d2e3437342e303832732d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a4d35392e36372033342e313376312e3034682d362e33355633312e3968312e333276322e323368352e30335a6d2d352e313220332e3876312e373368352e313876312e3034682d362e35762d322e373768312e33325a6d2d322e32392d312e393668382e333476312e3035682d332e343176312e3631682d312e3332762d312e3631682d332e3631762d312e30355a6d31332e3932322e363961382e363420382e36342030203020312d2e313320312e35323420382e33333820382e3333382030203020312d2e333520312e33333620362e37313320362e3731332030203020312d2e35323220312e313320362e31343520362e3134352030203020312d2e3632372e39313520342e37313620342e3731362030203020312d2e3638362e36383520332e313120332e31312030203020312d2e3638352e3432386c2d2e33312d2e3838632e3231342d2e3136332e34332d2e3338382e36352d2e3637332e3231382d2e3238352e3431362d2e3633372e3539312d312e3035352e3137362d2e3431382e3331392d2e3930382e3432382d312e34372e31312d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353261392e3820392e382030203020302d2e31372d312e39323220372e39323820372e3932382030203020302d2e3433332d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e35373220332e3537322030203020302d2e3633392d2e3637346c2e33312d2e383733632e3232332e3039372e3435322e32342e3638362e3432372e3233352e3138382e3436332e3431362e3638362e3638362e3232322e3236362e3433312e35372e3632372e3931342e3139392e33342e3337332e3731372e35323120312e313361382e353420382e3534203020302031202e343820322e3836762e31335a222f3e0000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32352e3032312033362e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e39303261342e3420342e34203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a222f3e3c706174682066696c6c3d227265642220643d224d33322e303139203430762d372e31373668372e313736563430682d372e3137365a6d2e3434342d2e34343468332e313434762d362e323838682d332e31343476362e3238385a6d31352e30382d322e363631682d342e383831762d312e33313968342e383876312e3331395a4d35302e303238203430762d372e31373668372e313736563430682d372e3137365a6d2e3434342d2e34343468332e313434762d362e323838682d332e31343476362e3238385a222f3e3c706174682066696c6c3d22234146463245322220643d224d36342e31382033362e363661382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323120312e313320362e31353220362e3135322030203020312d2e3632372e39313520342e37313620342e3731362030203020312d2e3638362e36383520332e303920332e30392030203020312d2e3638352e3432386c2d2e33312d2e3838632e3231342d2e3136332e3433312d2e3338382e36352d2e36373361342e373620342e3736203020302030202e3539312d312e303535632e3137362d2e3431382e3331392d2e3930382e3432382d312e34372e31312d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035362d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433332d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e35373220332e3537322030203020302d2e3633392d2e3637346c2e33312d2e383733632e3232342e3039372e3435322e32342e3638362e3432372e3233352e3138382e3436332e3431362e3638362e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323120312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e0000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32352e3032312033362e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e39303261342e3420342e34203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31312e3536372e323233613520352030203020312d2e31393420312e34353920322e393220322e39322030203020312d2e35343420312e303535632d2e3233392e32382d2e35332e3439342d2e3837332e3633382d2e3334342e3134352d2e37332e3231372d312e31362e32313761322e393520322e39352030203020312d312e3135352d2e32313720322e33343320322e3334332030203020312d2e3837392d2e36333820332e30373620332e3037362030203020312d2e3535362d312e303535203520352030203020312d2e3139342d312e3436762d322e30333863302d2e35352e3036352d312e3033352e3139342d312e3435332e3132382d2e3432322e3331322d2e3737342e35352d312e3035352e3234322d2e3238352e3533332d2e352e3837332d2e36343561322e39353220322e39353220302030203120312e3135352d2e323136632e34332030202e3831362e30373220312e31362e3231362e3334342e3134352e3633352e33362e3837332e3634352e3234322e3238312e3432382e3633332e35353620312e3035352e31332e3431382e3139342e3930322e31393420312e34353376322e3033395a6d2d332e3931342d2e37303320322e3237332d312e363934632d2e3031322d2e3537342d2e3131312d312d2e3239392d312e3237372d2e3138372d2e3237372d2e3436382d2e3431362d2e3834332d2e3431362d2e333820302d2e3636322e3134362d2e38352e34342d2e3138372e3239332d2e3238312e3734342d2e32383120312e33353376312e3539345a6d322e3237332d2e3538362d322e32373320312e363837632e30322e3536332e3132332e39382e333120312e3235342e3138382e32372e3436352e3430342e3833322e3430342e3338332030202e3636362d2e3134382e38352d2e3434352e3138382d2e3239372e3238312d2e3735322e3238312d312e333635762d312e3533355a6d342e393420332e35393263302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232322d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938392e3938392030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363920312e3036392030203020312d2e3335382d2e3232322e3938392e3938392030203020312d2e3232322d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323037203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d31312e3131352d322e333033613520352030203020312d2e31393320312e343539632d2e3132352e3431382d2e3330372e37372d2e35343520312e3035352d2e3233392e32382d2e35332e3439342d2e3837332e3633382d2e3334342e3134352d2e37332e3231372d312e31362e32313761322e393520322e39352030203020312d312e3135352d2e32313720322e33343320322e3334332030203020312d2e3837392d2e36333820332e30373620332e3037362030203020312d2e3535362d312e303535203520352030203020312d2e3139342d312e3436762d322e30333863302d2e35352e3036352d312e3033352e3139342d312e34353361322e393420322e3934203020302031202e35352d312e303535632e3234332d2e3238352e3533342d2e352e3837332d2e36343561322e39353220322e39353220302030203120312e3135352d2e323136632e34332030202e3831362e30373220312e31362e3231362e3334342e3134352e3633352e33362e3837332e3634352e3234322e3238312e3432382e3633332e35353720312e3035352e3132392e3431382e3139332e3930322e31393320312e34353376322e3033395a6d2d332e3931342d2e37303320322e3237332d312e363934632d2e3031312d2e3537342d2e3131312d312d2e3239382d312e3237372d2e3138382d2e3237372d2e34372d2e3431362d2e3834342d2e3431362d2e333820302d2e3636322e3134362d2e38352e34342d2e3138372e3239332d2e3238312e3734342d2e32383120312e33353376312e3539345a6d322e3237332d2e3538362d322e32373320312e363837632e30322e3536332e3132332e39382e333120312e3235342e3138382e32372e3436352e3430342e3833332e3430342e3338322030202e3636352d2e3134382e38352d2e3434352e3138372d2e3239372e32382d2e3735322e32382d312e333635762d312e3533355a6d372e36323920312e31393561382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e3638352d2e3233352e3138382d2e3436332e33332d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e353720332e35372030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32352e3032312033362e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e39303261342e3420342e34203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d382e3931332d2e38393120312e3339342d312e393868312e3735326c2d322e31323720332e3131324c33372e313536203430682d312e3735386c2d312e3435392d322e3037344c33322e3439322034304833302e37336c322e3230332d332e3232382d322e3132322d332e31313268312e3735336c312e333720312e39385a6d352e39353320332e34313763302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232322d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938392e3938392030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363920312e3036392030203020312d2e3335382d2e3232322e3938392e3938392030203020312d2e3232322d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323037203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d382e3436312d332e34313720312e3339342d312e393868312e3735326c2d322e31323720332e3131324c35382e3737372034304835372e30326c2d312e3435392d322e3037344c35342e3131332034304835322e33356c322e3230332d332e3232382d322e3132312d332e31313268312e3735326c312e333720312e39385a6d382e36343220312e303261382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e3638352d2e3233352e3138382d2e3436332e33332d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e353720332e35372030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32312e3636322033362e383133682d312e323438563430682d312e363436762d382e35333168322e383539632e3437332030202e392e30353620312e3238332e31372e3338332e3130392e37312e3237312e3937392e3438362e3237332e3231352e3438322e3438322e3632372e3830332e3134382e33322e3232322e3639312e32323220312e3131332030202e3330352d2e3033372e35382d2e3131312e38323661322e323120322e32312030203020312d2e37393720312e3136632d2e3138372e3134352d2e3339382e32372d2e3633332e3337356c312e38333420332e353232563430682d312e3736336c2d312e3630362d332e3138385a6d2d312e3234382d312e33333668312e323139632e3436352030202e3832322d2e31313820312e3037322d2e3335322e3235342d2e3233382e33382d2e3536332e33382d2e39373320302d2e3432352d2e3132322d2e3735352d2e3336382d2e39392d2e3234362d2e3233382d2e36312d2e3335372d312e30392d2e333537682d312e32313376322e3637325a6d31302e3231312e3738354832372e313276322e34303868342e303935563430682d352e373438762d382e35333168352e373376312e3334314832372e313276322e313568332e35303476312e3330325a4d33312e393437203430762d382e35333168322e32303961332e383720332e383720302030203120312e3533352e323933632e34362e3139312e3835332e343620312e3137372e3830382e3332382e3334342e35382e3735362e37353620312e3233372e31382e34382e323720312e3030382e323720312e353832762e37303361342e343820342e34382030203020312d2e323720312e35383220332e36383220332e3638322030203020312d2e37343420312e323336632d2e33322e3334342d2e3730352e3631322d312e3135342e3830332d2e34352e3139312d2e3934352e3238372d312e3438392e323837682d322e32395a6d312e3635382d372e31393576352e3837682e363333632e3330382030202e3538342d2e3035382e3832362d2e3137352e3234362d2e3131372e3435332d2e3238372e36322d2e35312e3137332d2e3232322e3330332d2e3439322e3339332d2e3830382e30392d2e33322e3133352d2e3638342e3133352d312e3039762d2e37313563302d2e3338332d2e3034352d2e37332d2e3133352d312e30343361322e32393320322e3239332030203020302d2e3339322d2e38313520312e37363420312e3736342030203020302d2e3634352d2e35323720312e393820312e39382030203020302d2e3838342d2e313837682d2e3535315a6d392e31373920352e343134682d322e35364c33392e373138203430682d312e3733346c322e3739352d382e35333168312e3439344c34352e303136203430682d312e3733346c2d2e3439382d312e3738315a6d2d322e3135362d312e3468312e37376c2d2e3837342d332e3134312d2e38393620332e31345a6d31302e3439322e353039632d2e3032382e34332d2e3132322e3831362d2e32383220312e313661322e36363920322e3636392030203020312d2e3633332e383820322e383120322e38312030203020312d2e3934392e35363220332e363620332e36362030203020312d312e3231382e313933632d2e35303420302d2e3935322d2e3039322d312e3334322d2e32373561322e373920322e37392030203020312d2e3938352d2e373820332e35383320332e3538332030203020312d2e3630392d312e32303720352e33363320352e3336332030203020312d2e3231312d312e353436762d312e31343963302d2e3536362e3037342d312e3038342e3232332d312e35353361332e363220332e3632203020302031202e3633332d312e32303720322e383220322e3832203020302031202e39392d2e373739632e33392d2e3138382e3832382d2e32383120312e3331322d2e3238312e3436392030202e3838352e30363620312e3234382e3139392e3336372e3133332e36382e3332322e3933382e3536382e3235382e3234362e34362e3534372e36312e3930332e3134382e3335352e3234312e3735362e323820312e32682d312e363461322e36393620322e3639362030203020302d2e3131372d2e36363720312e313920312e31392030203020302d2e3236342d2e34373520312e303220312e30322030203020302d2e3433342d2e32383720312e37323620312e3732362030203020302d2e36322d2e3120312e323920312e32392030203020302d2e3636332e313635632d2e3138372e3130392d2e3334342e32372d2e3436392e34382d2e31322e3231312d2e32312e34372d2e32372e373861352e353620352e35362030203020302d2e30383720312e30343276312e31366330202e38342e31313720312e3436312e33353220312e3836342e3233382e3430322e3631332e36303320312e3132352e3630332e34332030202e3736392d2e31313320312e3031392d2e33342e32352d2e32332e3338392d2e3630312e3431362d312e31313368312e3634375a6d362e3935322d342e353138682d322e3633563430682d312e363533762d372e3139682d322e353936762d312e333468362e383876312e3334315a6d352e35383820332e343532682d332e35303476322e34303868342e303936563430682d352e373438762d382e35333168352e373376312e333431682d342e30373876322e313568332e35303476312e3330325a4d36342e393832203430762d382e35333168322e32303961332e383720332e383720302030203120312e3533352e323933632e34362e3139312e3835332e343620312e3137372e3830382e3332392e3334342e35382e3735362e37353620312e3233372e31382e34382e323720312e3030382e323720312e353832762e37303361342e343820342e34382030203020312d2e323720312e35383220332e36383320332e3638332030203020312d2e37343420312e323336632d2e33322e3334342d2e3730352e3631322d312e3135342e3830332d2e34352e3139312d2e3934352e3238372d312e3438382e323837682d322e3239315a6d312e3635382d372e31393576352e3837682e363333632e3330382030202e3538342d2e3035382e3832362d2e3137352e3234362d2e3131372e3435332d2e3238372e36322d2e35312e3137332d2e3232322e3330342d2e3439322e3339342d2e3830382e30392d2e33322e3133342d2e3638342e3133342d312e3039762d2e37313563302d2e3338332d2e3034352d2e37332d2e3133352d312e30343361322e32393120322e3239312030203020302d2e3339322d2e38313520312e37363320312e3736332030203020302d2e3634352d2e35323720312e393820312e39382030203020302d2e3838342d2e313837682d2e3535315a222f3e0000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32352e3032312033362e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e39303261342e3420342e34203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a222f3e3c706174682066696c6c3d22233546383246462220643d224d33332e38342033382e383136632e31362030202e3331322d2e3032332e3435372d2e30372e3134342d2e3034372e3237312d2e3131332e33382d2e32612e3837382e383738203020302030202e3235332d2e33312e3737372e373737203020302030202e3038322d2e34303468312e353335632e3030382e3332382d2e30362e3633332d2e3230352e3931342d2e31342e3238312d2e3333342e3532332d2e35382e37323761322e383420322e38342030203020312d2e3836322e3438632d2e3332342e3131332d2e3636382e31372d312e30332e31372d2e34393320302d2e3932352d2e3038322d312e3239362d2e32343661322e36363520322e3636352030203020312d2e3933312d2e36383620332e30313620332e3031362030203020312d2e3536332d312e30313320342e303920342e30392030203020312d2e3138372d312e323534762d2e31373663302d2e3434352e3036322d2e3836312e3138372d312e3234382e3132352d2e33392e3331332d2e37332e3536332d312e30322e32352d2e3238392e3535382d2e3531372e3932352d2e3638352e3337322d2e3136382e3830312d2e32353220312e32392d2e3235322e33392030202e3735312e30353920312e3038332e31373661322e3520322e35203020302031202e3835362e343938632e3234322e32312e34332e3436382e3536322e3737332e3133332e3330312e3139362e3633392e31383820312e303134682d312e35333561312e30363820312e3036382030203020302d2e30372d2e34343520312e30303320312e3030332030203020302d2e32342d2e33363420312e31353220312e3135322030203020302d2e3338322d2e323420312e323420312e32342030203020302d2e3438362d2e303934632d2e32353820302d2e34372e3035332d2e3633392e31353961312e31393720312e3139372030203020302d2e3430342e34323120322e30303320322e3030332030203020302d2e32312e36303420342e313320342e31332030203020302d2e30362e373033762e3137366330202e3234362e30322e3438342e30362e3731352e3033382e3232362e3130362e3432372e3230342e3630332e3130322e3137322e3233372e33312e3430352e3431362e3137312e3130362e3338382e3135382e36352e3135385a6d2e36323720312e3132352d2e3036352e333238632e31312e30322e3231372e3035312e3332332e3039342e3130352e3034372e3139392e31312e32382e313838612e3935332e393533203020302031202e322e323939632e30352e31322e3037362e3236352e3037362e3433332030202e3230372d2e3034332e3339352d2e3132392e35363361312e313520312e31352030203020312d2e3338362e34323720312e38393420312e3839342030203020312d2e3632372e323832632d2e32352e3036362d2e3534312e312d2e3837332e316c2d2e3034312d2e393338632e3139392030202e3336352d2e3033372e3439382d2e3131312e3133332d2e3037352e3139392d2e322e3139392d2e33373620302d2e3136342d2e3036392d2e3237372d2e3230352d2e33342d2e3133332d2e3036322d2e3334382d2e3130332d2e3634352d2e3132326c2e3138322d2e38323768312e3231335a222f3e3c706174682066696c6c3d22234146463245322220643d224d33392e3838372033392e30353763302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232322d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938392e3938392030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363920312e3036392030203020312d2e3335382d2e3232322e3938392e3938392030203020312d2e3232322d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323037203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a222f3e3c706174682066696c6c3d22233546383246462220643d224d35352e34362033382e383136632e3136312030202e3331332d2e3032332e3435382d2e30372e3134352d2e3034372e3237322d2e3131332e33382d2e32612e3837382e383738203020302030202e3235332d2e33312e3737372e373737203020302030202e3038322d2e34303468312e353335632e3030382e3332382d2e30362e3633332d2e3230352e3931342d2e31342e3238312d2e3333342e3532332d2e35382e37323761322e383420322e38342030203020312d2e3836312e343820332e313220332e31322030203020312d312e3033322e3137632d2e34393220302d2e3932342d2e3038322d312e3239352d2e32343661322e36363520322e3636352030203020312d2e3933312d2e36383620332e30313620332e3031362030203020312d2e3536332d312e30313320342e303920342e30392030203020312d2e3138372d312e323534762d2e31373663302d2e3434352e3036322d2e3836312e3138372d312e3234382e3132352d2e33392e3331332d2e37332e3536332d312e30322e32352d2e3238392e3535382d2e3531372e3932352d2e3638352e3337312d2e3136382e3830312d2e32353220312e32392d2e3235322e33392030202e3735322e30353920312e3038342e3137362e3333312e3131372e3631372e3238332e3835352e3439382e3234322e32312e34332e3436382e3536332e3737332e3133322e3330312e3139352e3633392e31383720312e303134682d312e35333561312e30363820312e3036382030203020302d2e30372d2e34343520312e30303320312e3030332030203020302d2e32342d2e33363420312e31353320312e3135332030203020302d2e3338322d2e323420312e323420312e32342030203020302d2e3438362d2e303934632d2e32353820302d2e34372e3035332d2e3633392e31353961312e31393720312e3139372030203020302d2e3430342e34323120322e30303320322e3030332030203020302d2e32312e36303420342e313320342e31332030203020302d2e30362e373033762e3137366330202e3234362e30322e3438342e30362e3731352e3033382e3232362e3130372e3432372e3230342e3630332e3130322e3137322e3233372e33312e3430342e3431362e3137322e3130362e33392e3135382e36352e3135385a6d2e36323820312e3132352d2e3036352e333238632e31312e30322e3231372e3035312e3332332e3039342e3130352e3034372e3139392e31312e3238312e313838612e3935332e393533203020302031202e322e323939632e30352e31322e3037352e3236352e3037352e3433332030202e3230372d2e3034332e3339352d2e3132392e35363361312e313520312e31352030203020312d2e3338362e34323720312e38393420312e3839342030203020312d2e3632372e323832632d2e32352e3036362d2e3534312e312d2e3837332e316c2d2e3034312d2e393338632e3139392030202e3336352d2e3033372e3439382d2e3131312e3133332d2e3037352e3139392d2e322e3139392d2e33373620302d2e3136342d2e3036382d2e3237372d2e3230352d2e33342d2e3133332d2e3036322d2e3334382d2e3130332d2e3634352d2e3132326c2e3138322d2e38323768312e3231335a222f3e3c706174682066696c6c3d22234146463245322220643d224d36342e3139372033362e363661382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e3638352d2e3233352e3138382d2e3436332e33332d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e353720332e35372030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e0000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32352e3032312033362e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e39303261342e3420342e34203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31312e3633372d352e3036322e30303620352e3635346330202e3437372d2e3036362e392d2e3220312e32373261322e35323220322e3532322030203020312d2e3536372e39343320322e34303420322e3430342030203020312d2e3930392e3538632d2e3335352e3133332d2e3736312e322d312e3231382e322d2e343320302d2e3831392d2e3036372d312e3136372d2e3261322e34333820322e3433382030203020312d2e3838342d2e353820322e36333420322e3633342030203020312d2e3537352d2e39333820332e383320332e38332030203020312d2e3139392d312e3237376c2e3030362d352e36353468312e3634376c2e30303520352e363534632e3030342e35352e3130342e3936372e3320312e3234382e3139392e3238312e3438382e3432322e3836372e3432322e3430322030202e3730382d2e31342e39322d2e3432322e3231342d2e3238312e3332342d2e3639372e3332382d312e3234386c2e3030352d352e36353468312e3633355a6d332e32323920372e35383863302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232322d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938392e3938392030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363920312e3036392030203020312d2e3335382d2e3232322e3938392e3938392030203020312d2e3232322d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323037203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d31312e3138362d372e3538382e30303520352e3635346330202e3437372d2e3036362e392d2e3220312e32373261322e35323220322e3532322030203020312d2e3536372e39343320322e34303420322e3430342030203020312d2e3930392e3538632d2e3335352e3133332d2e3736312e322d312e3231382e322d2e343320302d2e3831392d2e3036372d312e3136362d2e3261322e343420322e34342030203020312d2e3838352d2e353820322e36333620322e3633362030203020312d2e3537342d2e393338632d2e3133332d2e3337352d2e322d2e382d2e322d312e3237376c2e3030362d352e36353468312e3634376c2e30303620352e363534632e3030332e35352e3130332e3936372e32393820312e3234382e322e3238312e3438392e3432322e3836382e3432322e3430322030202e3730392d2e31342e39322d2e3432322e3231342d2e3238312e3332342d2e3639372e3332382d312e3234386c2e3030352d352e36353468312e3633355a6d352e39313720352e31393161382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e3638352d2e3233352e3138382d2e3436332e33332d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e353720332e35372030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e00'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32352e3032312033362e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e39303261342e3420342e34203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a4d33302e3934203430762d382e35333168322e32303861332e383720332e383720302030203120312e3533362e323933632e34362e3139312e3835332e343620312e3137372e3830382e3332392e3334342e35382e3735362e37353620312e3233372e31382e34382e323720312e3030382e323720312e353832762e37303361342e343820342e34382030203020312d2e323720312e35383220332e36383120332e3638312030203020312d2e37343420312e323336632d2e33322e3334342d2e3730352e3631322d312e3135342e38303341332e373620332e37362030203020312033332e3233203430682d322e32395a6d312e3635382d372e31393576352e3837682e363333632e3330382030202e3538342d2e3035382e3832362d2e3137352e3234362d2e3131372e3435332d2e3238372e36322d2e35312e3137332d2e3232322e3330332d2e3439322e3339332d2e3830382e30392d2e33322e3133352d2e3638342e3133352d312e3039762d2e37313563302d2e3338332d2e3034352d2e37332d2e3133352d312e30343361322e32393120322e3239312030203020302d2e3339322d2e38313520312e37363320312e3736332030203020302d2e3634352d2e35323720312e393820312e39382030203020302d2e3838352d2e313837682d2e35355a6d372e32383920362e32353263302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232322d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938392e3938392030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363920312e3036392030203020312d2e3335382d2e3232322e3938392e3938392030203020312d2e3232322d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323037203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a4d35322e3536203430762d382e35333168322e323161332e383720332e383720302030203120312e3533352e323933632e34362e3139312e3835332e343620312e3137372e3830382e3332382e3334342e35382e3735362e37353620312e3233372e31382e34382e323720312e3030382e323720312e353832762e37303361342e343820342e34382030203020312d2e323720312e35383220332e36383120332e3638312030203020312d2e37343420312e323336632d2e33322e3334342d2e3730352e3631322d312e3135342e38303361332e373720332e37372030203020312d312e3438382e3238374835322e35365a6d312e3635392d372e31393576352e3837682e363333632e3330382030202e3538342d2e3035382e3832362d2e3137352e3234362d2e3131372e3435332d2e3238372e36322d2e35312e3137332d2e3232322e3330342d2e3439322e3339332d2e3830382e30392d2e33322e3133352d2e3638342e3133352d312e3039762d2e37313563302d2e3338332d2e3034352d2e37332d2e3133352d312e30343361322e32393120322e3239312030203020302d2e3339322d2e38313520312e37363320312e3736332030203020302d2e3634352d2e35323720312e393820312e39382030203020302d2e3838352d2e313837682d2e35355a6d392e39373820332e38353561382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e3638352d2e3233352e3138382d2e3436332e33332d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e353720332e35372030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e00000000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32352e3032312033362e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e39303261342e3420342e34203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31312e3731392e333634682d342e3838762d312e33313968342e383876312e3331395a6d332e31343720322e31363263302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232322d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938392e3938392030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363920312e3036392030203020312d2e3335382d2e3232322e3938392e3938392030203020312d2e3232322d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323037203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d31312e3236372d322e313632682d342e3838762d312e33313968342e383876312e3331395a6d352e3833362d2e32333561382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e3638352d2e3233352e3138382d2e3436332e33332d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e353720332e35372030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e0000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32352e3032312033362e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e39303261342e3420342e34203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31312e3635352d2e373332682d352e353433762d312e33333668352e35343376312e3333365a6d3020322e353235682d352e353433762d312e333368352e35343376312e33335a6d332e3231312e37333363302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232322d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938392e3938392030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363920312e3036392030203020312d2e3335382d2e3232322e3938392e3938392030203020312d2e3232322d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323037203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d31312e3230332d332e323538682d352e353433762d312e33333668352e35343376312e3333365a6d3020322e353235682d352e353433762d312e333368352e35343376312e33335a6d352e392d312e36363461382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e3638352d2e3233352e3138382d2e3436332e33332d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e353720332e35372030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e00000000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32352e35203430762d366831327636682d31325a6d31382e3533332d332e313035682d342e3838762d312e33313968342e383876312e3331395a6d372e3230372030682d342e3838762d312e33313968342e383876312e3331395a4d35312e393134203430762d366831327636682d31325a6d2d31312e3934312d2e39343363302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437342d2e3038382e3137362030202e3333342e30332e3437352e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30313920312e3031392030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437352e3038322d2e31373520302d2e3333342d2e3032372d2e3437342d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323037203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232322d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239392d2e3038382e3437342d2e3038382e3137362030202e3333342e30332e3437352e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30313920312e3031392030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e303720312e30372030203020312d2e3335382d2e3232322e3938372e3938372030203020312d2e3232322d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a222f3e'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32352e3032312033362e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e39303261342e3420342e34203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31312e3838392d2e3933376330202e3331362d2e3034352e36312d2e3133352e3837392d2e3038352e32372d2e3230392e3530322d2e3336392e36393761312e36383320312e3638332030203020312d2e3536382e343531632d2e3232332e31312d2e3436372e3136342d2e3733332e3136342d2e31373120302d2e3333332d2e3031352d2e3438362d2e30343761322e33303120322e3330312030203020312d2e34342d2e313420322e38313320322e3831332030203020312d2e3432372d2e32343620342e303820342e30382030203020312d2e3433342d2e33353220322e39303120322e3930312030203020302d2e35352d2e33363320312e32313520312e3231352030203020302d2e35342d2e31332e3631362e3631362030203020302d2e3330342e3038332e3839372e3839372030203020302d2e3236342e32312e3938332e3938332030203020302d2e3234362e36356c2d312e3035352d2e31323863302d2e3331362e3034332d2e3630352e31332d2e3836372e3038352d2e3236352e3230362d2e3439322e3336332d2e36382e31362d2e3139312e33352d2e33342e3536382d2e3434352e3232332d2e3130352e3436372d2e3135382e3733322d2e3135382e33342030202e3635332e3036362e3933382e322e3238392e3133322e3537382e3332352e3836372e35382e3139312e3136332e3337332e3238362e3534352e3336382e3137362e3038322e3335312e3132332e3532372e313233612e3538332e353833203020302030202e332d2e3038322e3836332e383633203020302030202e3234352d2e323136632e30372d2e30392e3132372d2e3139322e31372d2e33303561312e303320312e3033203020302030202e3036352d2e3335386c312e3130312e3131325a6d322e39373720332e34363363302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232322d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938392e3938392030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363920312e3036392030203020312d2e3335382d2e3232322e3938392e3938392030203020312d2e3232322d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323037203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d31312e3433372d332e3436336330202e3331362d2e3034352e36312d2e3133342e38373961322e3120322e312030203020312d2e33372e36393720312e36383320312e3638332030203020312d2e3536382e343531632d2e3232332e31312d2e3436372e3136342d2e3733322e3136342d2e31373220302d2e3333342d2e3031352d2e3438372d2e30343761322e33303120322e3330312030203020312d2e34342d2e313420322e38313420322e3831342030203020312d2e3432372d2e32343641342e303920342e30392030203020312035342e393420333761322e39303420322e3930342030203020302d2e3535312d2e33363320312e32313520312e3231352030203020302d2e35342d2e31332e3631362e3631362030203020302d2e3330342e3038332e392e392030203020302d2e3236342e32312e3938332e3938332030203020302d2e3234362e36356c2d312e3035352d2e31323863302d2e3331362e3034332d2e3630352e31332d2e3836372e3038352d2e3236352e3230362d2e3439322e3336332d2e36382e31362d2e3139312e33352d2e33342e3536382d2e3434352e3232332d2e3130352e3436372d2e3135382e3733322d2e3135382e33342030202e3635332e3036362e3933382e322e3238392e3133322e3537382e3332352e3836372e35382e3139312e3136332e3337332e3238362e3534352e3336382e3137362e3038322e3335322e3132332e3532372e313233612e3538332e353833203020302030202e332d2e3038322e3836332e383633203020302030202e3234352d2e323136632e30372d2e30392e3132372d2e3139322e31372d2e33303561312e303320312e3033203020302030202e3036352d2e3335386c312e3130312e3131325a6d352e36363620312e30363661382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e3638352d2e3233352e3138382d2e3436332e33332d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e353720332e35372030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32352e3032312033362e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e39303261342e3420342e34203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31312e3930372d2e31376330202e3534372d2e30373220312e3035312d2e32313720312e35313261332e343920332e34392030203020312d2e36323720312e313920322e38383620322e3838362030203020312d312e3030322e373739632d2e33392e3138332d2e3833322e3237352d312e3332342e323735613320332030203020312d312e3331332d2e32373520322e37363220322e3736322030203020312d2e3936362d2e373820332e35383420332e3538342030203020312d2e3539382d312e31383920352e32393520352e3239352030203020312d2e3230352d312e3531325633352e313263302d2e3534372e3036382d312e30352e3230352d312e3531322e3133372d2e34362e3333362d2e3835372e3539382d312e3138392e3236312d2e3333362e3538312d2e3539382e39362d2e37383561322e393420322e393420302030203120312e3331332d2e323831632e3439362030202e39342e30393320312e33332e32382e3339352e3138382e3732382e343520312e3030322e3738362e3237332e3333322e3438322e3732392e36323720312e31392e3134352e34362e3231372e3936342e32313720312e35313176312e3234325a6d2d312e36372d312e32353463302d2e3334372d2e30332d2e3636372d2e3038382d2e393661322e33393220322e3339322030203020302d2e3236342d2e37353620312e33353320312e3335332030203020302d2e3436382d2e34393320312e32333720312e3233372030203020302d2e3638362d2e313831632d2e32363620302d2e3438382e30362d2e3636382e3138312d2e31382e3131382d2e3332342e3238322d2e3433342e34393361322e343920322e34392030203020302d2e3233342e37353620362e303820362e30382030203020302d2e30372e393676312e3235346330202e3334342e3032332e3636322e30372e3935352e3034372e3239332e3132352e3534372e3233342e3736322e31312e3231352e3235342e3338332e3433342e353034732e3430342e3138322e3637342e313832632e3236352030202e3439322d2e30362e36382d2e3138322e31392d2e3132312e3334352d2e3238372e3436322d2e34393861322e353620322e3536203020302030202e32372d2e373632632e3035382d2e3239332e3038382d2e3631332e3038382d2e3936762d312e3235355a6d342e36323920332e393563302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232322d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938392e3938392030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363920312e3036392030203020312d2e3335382d2e3232322e3938392e3938392030203020312d2e3232322d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d382e3839342e3831346330202e3232332d2e3033312e3435312d2e3039332e36383661332e35333220332e3533322030203020312d2e36323820312e33632d2e3134342e3139362d2e332e33372d2e3436382e3532326c2d2e3836312d2e34343561362e313320362e3133203020302030202e3230342d2e343238632e3036372d2e3134352e3132342d2e3239372e31372d2e34353761332e39303820332e393038203020302030202e3135332d312e313032762d312e333768312e35336c2d2e30303720312e3239345a6d332e3635312d332e30393963302d2e3436322e3036362d2e3838372e3139392d312e3237382e3133332d2e3339342e3332362d2e3733362e35382d312e3032352e3235382d2e32392e35372d2e3531362e3933372d2e363861332e31313520332e31313520302030203120312e3237322d2e323436632e3437372030202e392e30383220312e3237312e3234362e3337312e3136342e3638342e33392e3933382e36382e3235382e3238392e3435332e36332e35383620312e3032352e3133332e33392e322e3831362e3220312e323738762e3132336330202e3436342d2e3036372e3839342d2e3220312e3238392d2e3133332e33392d2e3332362e37332d2e353820312e303261322e363620322e36362030203020312d2e3933382e363739632d2e33372e31362d2e3739332e32342d312e3236352e32342d2e34373720302d2e3930332d2e30382d312e3237382d2e323461322e37313920322e3731392030203020312d2e3934332d2e363820322e39373720322e3937372030203020312d2e35382d312e303220342e30313520342e3031352030203020312d2e322d312e323838762d2e3132335a6d312e3632382e3132336330202e3236352e3032362e3531352e3037372e37352e30352e32332e31332e3433332e32342e3630392e31312e3137322e32352e3330392e3432322e34312e3137362e3130322e3338362e3135322e3633332e3135322e3233382030202e3434332d2e30352e3631352d2e313532732e33312d2e3233382e3431362d2e3431632e31312d2e3137362e31392d2e3337392e32342d2e36312e30352d2e3233342e3037362d2e3438342e3037362d2e3735762d2e31323263302d2e3235382d2e3032352d2e3530322d2e3037362d2e37333361312e393320312e39332030203020302d2e32342d2e363120312e31373820312e3137382030203020302d2e3431362d2e34313520312e32313220312e3231322030203020302d2e3632372d2e31353320312e3220312e322030203020302d2e3632312e313533632d2e3137322e3130312d2e3331332e32342d2e3432322e34313661312e393320312e39332030203020302d2e32342e3631632d2e3035312e32332d2e3037372e3437342d2e3037372e373332762e3132335a6d31302e3133372d2e32333561382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e3638352d2e3233352e3138382d2e3436332e33332d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e353720332e35372030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e0000')
];
string[] internal eyes_traits = [
"Lazy",
"Nouns",
"Open",
"R.I.P.",
"Redacted",
"Rekt",
"Saturated",
"Sides",
"Sigh",
"Squeezed",
"Sunglasses",
"Wavey",
"Wtf"
];
uint[] internal eyes_probability = [
46,
47,
53,
59,
60,
66,
72,
78,
84,
90,
91,
97,
100
];
// Getter functions
function getEyesBTrait(uint index) external view returns (string memory) {
return eyes_traits[index];
}
function getEyesBData(uint index) external view returns (bytes memory) {
return eyes_data[index];
}
function getEyesBProbability() external view returns (uint[] memory) {
return eyes_probability;
}
function totalEyesB() external view returns (uint) {
return eyes_traits.length;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
// Copyright (c) 2025 Berny Art
//
// This file and the associated art layers are proprietary.
// They may not be reused, copied, or sold in any form without explicit
// written permission from Berny Art.
contract FrogsFeet {
// Data for the feet trait
bytes[] internal feet_data = [
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32322e30362037332e393735682d312e3331326c312e38372d342e35303668312e3137376c312e38363320342e353036682d312e3330366c2d312e3033322d322e36362d2e3132332d2e3439332d2e3132332e3439322d312e30313420322e36365a6d31312e31382e393139682d342e3838762d312e33313868342e383876312e3331395a6d332e3233352d2e393139682d312e3331336c312e38372d342e35303668312e3137376c312e38363320342e353036682d312e3330366c2d312e3033322d322e36362d2e3132332d2e3439332d2e3132332e3439322d312e30313320322e36365a6d31342e3431342030682d312e3331336c312e38372d342e35303668312e3137376c312e38363320342e3530364835332e31386c2d312e3033322d322e36362d2e3132332d2e3439332d2e3132332e3439322d312e30313320322e36365a6d31312e3137392e393139682d342e3838762d312e33313868342e383876312e3331395a6d332e3233352d2e3931394836332e39396c312e38372d342e35303668312e3137376c312e38363320342e353036682d312e3330366c2d312e3033312d322e36362d2e3132342d2e3439332d2e3132332e3439322d312e30313320322e36365a222f3e00'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d31382e3437332037312e30353763302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437342d2e3038382e3137362030202e3333342e30332e3437352e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30303420312e3030342030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335382d2e3232322e3938372e3938372030203020312d2e3232322d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323037203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30303420312e3030342030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e303720312e30372030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323037203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232322d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938392e3938392030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363920312e3036392030203020312d2e3335382d2e3232322e3938392e3938392030203020312d2e3232322d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d32312e363231203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038332e32372e3038332e3432322030202e3134382d2e3032382e3238372d2e3038332e343136612e3938372e3938372030203020312d2e3232322e333420312e30303420312e3030342030203020312d2e3335322e323232632d2e31342e3035352d2e3239382e3038322d2e3437342e303832732d2e3333342d2e3032372d2e3437352d2e30383261312e30363920312e3036392030203020312d2e3335372d2e3232322e3938392e3938392030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323037203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e303838732e3333342e30332e3437342e303838632e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232332e3334632e3035342e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032382e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232332e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239382e3038322d2e3437342e303832732d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431365a6d372e323037203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e303838612e3936342e393634203020302031202e3335322e3232392e39322e3932203020302031202e3232332e3334632e3035342e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032382e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232332e333420312e30303420312e3030342030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e303720312e30372030203020312d2e3335372d2e3232322e3938372e3938372030203020312d2e3232332d2e333420312e31323720312e3132372030203020312d2e3037362d2e3431365a222f3e00000000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32322e3533332037302e383934682d342e3838762d312e33313868342e383876312e3331395a6d372e3230372030682d342e3838762d312e33313868342e383876312e3331395a6d372e3230372030682d342e3838762d312e33313868342e383876312e3331395a6d32312e3632312030682d342e3838762d312e33313868342e383876312e3331395a6d372e3230372030682d342e3838762d312e33313868342e383876312e3331395a6d372e3230372030682d342e3838762d312e33313868342e383876312e3331395a222f3e000000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d31372e352036392e373136762d2e366831302e303536762e364831372e355a6d3020312e32762d2e366831302e303536762e364831372e355a222f3e3c706174682066696c6c3d22234146463245322220643d224d32372e3535352036392e373136762d2e364833372e3631762e364832372e3535355a6d3020312e32762d2e364833372e3631762e364832372e3535355a6d32342e3436382d312e32762d2e364836322e3038762e364835322e3032335a6d3020312e32762d2e364836322e3038762e364835322e3032335a222f3e3c706174682066696c6c3d22234146463245322220643d224d36322e3037382036392e373136762d2e366831302e303536762e364836322e3037385a6d3020312e32762d2e366831302e303536762e364836322e3037385a222f3e00'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d31382e35362037312e393735682d312e3331326c312e38372d342e35303668312e3137376c312e38363320342e353036682d312e3330366c2d312e3033322d322e36362d2e3132332d2e3439332d2e3132332e3439322d312e30313420322e36365a6d372e3230382030682d312e3331336c312e38372d342e35303668312e3137376c312e38363320342e3530364832382e30366c2d312e3033322d322e36362d2e3132332d2e3439332d2e3132332e3439322d312e30313320322e36365a6d372e3230372030682d312e3331336c312e38372d342e35303668312e3137376c312e38363320342e353036682d312e3330366c2d312e3033322d322e36362d2e3132332d2e3439332d2e3132332e3439322d312e30313320322e36365a6d32312e3632312030682d312e3331336c312e38372d342e35303668312e3137376c312e38363320342e353036682d312e3330366c2d312e3033322d322e36362d2e3132332d2e3439332d2e3132332e3439322d312e30313320322e36365a6d372e32303720304836302e34396c312e38372d342e35303668312e3137376c312e38363320342e353036682d312e3330366c2d312e3033312d322e36362d2e3132332d2e3439332d2e3132342e3439322d312e30313320322e36365a6d372e3230372030682d312e3331336c312e38372d342e35303668312e3137376c312e38363320342e353036682d312e3330366c2d312e3033322d322e36362d2e3132332d2e3439332d2e3132332e3439322d312e30313320322e36365a222f3e'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d31382e3837372037312e303463302d2e322e3032372d2e3430352e3038322d2e36313661332e333520332e3335203020302031202e3232392d2e36323720332e383320332e3833203020302031202e33342d2e353734632e3132382d2e31382e3236392d2e3333382e3432312d2e3437356c2e37352e34363361342e33333820342e3333382030203020302d2e3336392e3832632d2e3039382e32392d2e3134362e3632332d2e31343620312e30303276312e303337682d312e333037762d312e30335a6d382e3837372d312e3136376330202e322d2e3032372e3430362d2e3038322e36323161332e33393520332e3339352030203020312d2e3232392e363231632d2e3039372e322d2e32312e33392d2e33342e35373561322e393320322e39332030203020312d2e3432312e3437346c2d2e3734342d2e343633632e3134382d2e3235342e3236392d2e3532372e3336332d2e38322e3039372d2e3239332e3134362d2e3632392e3134362d312e303038762d312e30313468312e33303776312e3031345a6d372e32303620306330202e322d2e3032362e3430362d2e3038312e36323161332e33393520332e3339352030203020312d2e3232392e363231632d2e3039372e322d2e32312e33392d2e33342e3537352d2e3132382e31382d2e3236392e3333372d2e3432312e3437346c2d2e3734352d2e343633632e3134392d2e3235342e32372d2e3532372e3336342d2e38322e3039372d2e3239332e3134362d2e3632392e3134362d312e303038762d312e30313468312e33303776312e3031345a6d31392e39353220312e31363763302d2e322e3032382d2e3430352e3038322d2e36313661332e333520332e3335203020302031202e3232392d2e36323720332e363620332e3636203020302031202e33342d2e353734632e3132382d2e31382e3236392d2e3333382e3432312d2e3437356c2e37352e34363361342e33333820342e3333382030203020302d2e3336392e3832632d2e3039372e32392d2e3134362e3632332d2e31343620312e30303276312e303337682d312e333037762d312e30335a6d382e3837382d312e3136376330202e322d2e3032382e3430362d2e3038332e3632312d2e3035352e3231312d2e31332e3431382d2e3232392e3632312d2e3039372e322d2e32312e33392d2e33342e3537352d2e3132382e31382d2e3236392e3333372d2e3432312e3437346c2d2e3734342d2e343633632e3134382d2e3235342e32372d2e3532372e3336332d2e38322e3039382d2e3239332e3134362d2e3632392e3134362d312e303038762d312e30313468312e33303776312e3031345a6d372e32303620306330202e322d2e3032372e3430362d2e3038322e36323161332e333920332e33392030203020312d2e3232382e363231632d2e3039382e322d2e3231312e33392d2e33342e35373561322e393320322e39332030203020312d2e3432322e3437346c2d2e3734342d2e343633632e3134382d2e3235342e32372d2e3532372e3336332d2e38322e3039382d2e3239332e3134362d2e3632392e3134362d312e303038762d312e30313468312e33303776312e3031345a222f3e0000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d382e3930362036332e34363968312e3532346c332e31393320392e3236334831322e314c382e3930362036332e34375a6d352e38303120342e323437762d2e366831302e303536762e364831342e3730375a6d3020312e32762d2e366831302e303536762e364831342e3730375a222f3e3c706174682066696c6c3d22234146463245322220643d224d32342e3736322036372e373136762d2e366831302e303536762e364832342e3736325a6d3020312e32762d2e366831302e303536762e364832342e3736325a222f3e3c706174682066696c6c3d22234146463245322220643d224d33342e3831362036372e373136762d2e366831302e303536762e364833342e3831365a6d3020312e32762d2e366831302e303536762e364833342e3831365a222f3e3c706174682066696c6c3d22234146463245322220643d224d34342e3837312036372e373136762d2e366831302e303536762e364834342e3837315a6d3020312e32762d2e366831302e303536762e364834342e3837315a222f3e3c706174682066696c6c3d22234146463245322220643d224d35342e3932362036372e373136762d2e366831302e303536762e364835342e3932365a6d3020312e32762d2e366831302e303536762e364835342e3932365a222f3e3c706174682066696c6c3d22234146463245322220643d224d36342e39382036372e373136762d2e366831302e303536762e364836342e3938325a6d3020312e32762d2e366831302e303536762e364836342e3938325a6d31322e38363220332e383136682d312e3531386c332e3139342d392e32363368312e3531376c2d332e31393320392e3236335a6d2d35332e35323220342e303463302d2e3436322e3036362d2e3838372e3139392d312e3237382e3133322d2e3339342e3332362d2e3733362e35382d312e3032352e3235372d2e32392e35372d2e3531362e3933372d2e363861332e31313520332e31313520302030203120312e3237322d2e323436632e3437362030202e392e30383220312e3237312e3234362e3337312e3136342e3638342e33392e3933382e36382e3235372e3238392e3435332e36332e35383520312e3032352e3133332e33392e322e3831372e3220312e323738762e3132326330202e3436352d2e3036372e3839352d2e3220312e323961322e393820322e39382030203020312d2e353820312e303220322e363620322e36362030203020312d2e3933372e363739632d2e3337312e31362d2e3739332e32342d312e3236362e32342d2e34373620302d2e3930322d2e30382d312e3237372d2e323461322e37313820322e3731382030203020312d2e3934332d2e363820322e39373720322e3937372030203020312d2e35382d312e303220342e30313520342e3031352030203020312d2e322d312e323839762d2e3132335a6d312e3632382e3132326330202e3236362e3032362e3531362e3037362e37352e3035312e3233312e3133312e3433342e32342e36312e31312e3137322e32352e3330382e3432322e34312e3137362e3130322e3338372e3135322e3633332e3135322e3233392030202e3434342d2e30352e3631362d2e3135322e3137312d2e3130322e33312d2e3233382e3431362d2e34312e3130392d2e3137362e3138392d2e3337392e32342d2e36312e30352d2e3233342e3037362d2e3438342e3037362d2e3735762d2e31323363302d2e3235372d2e3032352d2e3530322d2e3037362d2e37333261312e393320312e39332030203020302d2e32342d2e363120312e31373920312e3137392030203020302d2e3431362d2e34313520312e32313220312e3231322030203020302d2e3632372d2e31353320312e3220312e322030203020302d2e3632322e313533632d2e3137312e3130312d2e3331322e32342d2e3432312e3431362d2e31312e3137352d2e31392e3337392d2e32342e36312d2e3035312e32332d2e3037372e3437342d2e3037372e373331762e3132335a6d332e3535372d342e343634682d342e323737762d2e39363168342e323737762e39365a6d33302e383520342e33343263302d2e3436322e3036362d2e3838372e3139392d312e3237382e3133332d2e3339342e3332362d2e3733362e35382d312e3032352e3235382d2e32392e35372d2e3531362e3933372d2e363861332e31313520332e31313520302030203120312e3237322d2e323436632e3437362030202e392e30383220312e3237312e3234362e3337312e3136342e3638342e33392e3933382e36382e3235382e3238392e3435332e36332e35383620312e3032352e3133322e33392e3139392e3831372e31393920312e323738762e3132326330202e3436352d2e3036372e3839352d2e3220312e323961322e393820322e39382030203020312d2e353820312e303220322e363620322e36362030203020312d2e3933372e363739632d2e3337312e31362d2e3739332e32342d312e3236362e32342d2e34373620302d2e3930322d2e30382d312e3237372d2e323461322e37313820322e3731382030203020312d2e3934332d2e363820322e39373820322e3937382030203020312d2e35382d312e303220342e30313820342e3031382030203020312d2e322d312e323839762d2e3132335a6d312e3632382e3132326330202e3236362e3032362e3531362e3037372e37352e30352e3233312e31332e3433342e32342e36312e31312e3137322e32352e3330382e3432322e34312e3137352e3130322e3338362e3135322e3633332e3135322e3233382030202e3434332d2e30352e3631352d2e313532732e33312d2e3233382e3431362d2e3431632e31312d2e3137362e31392d2e3337392e32342d2e36312e30352d2e3233342e3037362d2e3438342e3037362d2e3735762d2e31323363302d2e3235372d2e3032352d2e3530322d2e3037362d2e37333261312e393320312e39332030203020302d2e32342d2e363120312e31373720312e3137372030203020302d2e3431362d2e34313520312e32313120312e3231312030203020302d2e3632372d2e31353320312e3220312e322030203020302d2e3632312e313533632d2e3137322e3130312d2e3331332e32342d2e3432322e34313661312e393320312e39332030203020302d2e32342e3631632d2e3035312e32332d2e3037372e3437342d2e3037372e373331762e3132335a6d332e3535372d342e343634682d342e323737762d2e39363168342e323737762e39365a222f3e00000000'),
bytes(hex'3c706174682066696c6c3d22233546383246462220643d224d382e3230332037312e3539346330202e3331362d2e3034352e36312d2e3133352e38373961322e303820322e30382030203020312d2e3336392e36393720312e36383320312e3638332030203020312d2e3536382e343531632d2e3232332e31312d2e3436372e3136342d2e3733332e31363461322e343220322e34322030203020312d2e3438362d2e30343720322e33303220322e3330322030203020312d2e34342d2e313420322e38313320322e3831332030203020312d2e3432372d2e32343641342e30393320342e30393320302030203120342e363120373361322e39303220322e3930322030203020302d2e35352d2e33363320312e32313520312e3231352030203020302d2e35342d2e31332e3631362e3631362030203020302d2e3330342e3038332e3839372e3839372030203020302d2e3236342e32312e3938342e3938342030203020302d2e3234362e36356c2d312e3035352d2e31323863302d2e3331362e3034332d2e3630352e31332d2e38363761322e303220322e3032203020302031202e3336332d2e3638632e31362d2e3139312e33352d2e33342e3536382d2e3434352e3232332d2e3130352e3436372d2e3135382e3733322d2e3135382e33342030202e3635332e3036362e3933382e322e3238392e3133322e3537382e3332352e3836372e35382e3139312e3136332e3337332e3238362e3534352e3336382e3137362e3038322e3335312e3132332e3532372e313233612e3538342e353834203020302030202e332d2e3038322e3836332e383633203020302030202e3234352d2e323137632e30372d2e30392e3132372d2e31392e31372d2e33303461312e303320312e3033203020302030202e3036352d2e3335386c312e3130312e3131325a6d372e32303720306330202e3331362d2e3034352e36312d2e3133352e3837392d2e3038352e32372d2e3230392e3530322d2e3336392e36393761312e36383320312e3638332030203020312d2e3536382e343531632d2e3232332e31312d2e3436372e3136342d2e3733322e3136342d2e31373220302d2e3333352d2e3031362d2e3438372d2e30343761322e33303120322e3330312030203020312d2e34342d2e313420322e38313320322e3831332030203020312d2e3432372d2e32343620342e303820342e30382030203020312d2e3433342d2e33353220322e39303120322e3930312030203020302d2e35352d2e33363320312e32313520312e3231352030203020302d2e35342d2e31332e3631362e3631362030203020302d2e3330342e3038332e3839372e3839372030203020302d2e3236342e32312e3938332e3938332030203020302d2e3234362e36356c2d312e3035352d2e31323863302d2e3331362e3034332d2e3630352e31332d2e38363761322e303220322e3032203020302031202e3336332d2e3638632e31362d2e3139312e33352d2e33342e3536382d2e3434352e3232332d2e3130352e3436372d2e3135382e3733322d2e3135382e33342030202e3635332e3036362e3933382e322e3238392e3133322e3537382e3332352e3836372e35382e3139312e3136332e3337332e3238362e3534352e3336382e3137362e3038322e3335312e3132332e3532372e313233612e3538332e353833203020302030202e332d2e3038322e3836332e383633203020302030202e3234352d2e323137632e30372d2e30392e3132372d2e31392e31372d2e33303461312e303320312e3033203020302030202e3036352d2e3335386c312e3130312e3131325a6d372e32303720306330202e3331362d2e3034352e36312d2e3133352e3837392d2e3038352e32372d2e3230392e3530322d2e3336392e36393761312e36383420312e3638342030203020312d2e3536382e343531632d2e3232332e31312d2e3436372e3136342d2e3733332e31363461322e343220322e34322030203020312d2e3438362d2e30343720322e3320322e332030203020312d2e34342d2e313420322e38313320322e3831332030203020312d2e3432372d2e32343620342e303920342e30392030203020312d2e3433342d2e33353220322e39303120322e3930312030203020302d2e35352d2e33363320312e32313520312e3231352030203020302d2e35342d2e31332e3631362e3631362030203020302d2e3330342e3038332e3839362e3839362030203020302d2e3236342e32312e3938352e3938352030203020302d2e3234362e36356c2d312e3035352d2e31323863302d2e3331362e3034332d2e3630352e31332d2e3836372e3038352d2e3236362e3230362d2e3439322e3336332d2e36382e31362d2e3139312e33352d2e33342e3536382d2e3434352e3232332d2e3130352e3436372d2e3135382e3733322d2e3135382e33342030202e3635332e3036362e3933382e322e3238392e3133322e3537382e3332352e3836372e35382e3139312e3136332e3337332e3238362e3534352e3336382e3137362e3038322e3335322e3132332e3532372e313233612e3538342e353834203020302030202e332d2e3038322e3836332e383633203020302030202e3234352d2e323137632e30372d2e30392e3132372d2e31392e31372d2e3330342e3034332d2e3131372e3036352d2e3233372e3036352d2e3335386c312e3130312e3131325a6d372e32303720306330202e3331362d2e3034352e36312d2e3133352e3837392d2e3038352e32372d2e3230392e3530322d2e3336392e36393761312e36383320312e3638332030203020312d2e3536382e343531632d2e3232332e31312d2e3436372e3136342d2e3733322e31363461322e343220322e34322030203020312d2e3438372d2e30343720322e33303120322e3330312030203020312d2e34342d2e313420322e38303920322e3830392030203020312d2e3432372d2e32343620342e3120342e312030203020312d2e3433342d2e33353220322e39303120322e3930312030203020302d2e35352d2e33363320312e32313520312e3231352030203020302d2e35342d2e31332e3631362e3631362030203020302d2e3330342e3038332e3839362e3839362030203020302d2e3236342e32312e3938332e3938332030203020302d2e3234362e36356c2d312e3035352d2e31323863302d2e3331362e3034332d2e3630352e31332d2e3836372e3038352d2e3236362e3230362d2e3439322e3336332d2e36382e31362d2e3139312e33352d2e33342e3536382d2e3434352e3232332d2e3130352e3436372d2e3135382e3733322d2e3135382e33342030202e3635332e3036362e3933382e322e3238392e3133322e3537382e3332352e3836372e35382e3139322e3136332e3337332e3238362e3534352e3336382e3137362e3038322e3335322e3132332e3532372e313233612e3538342e353834203020302030202e332d2e3038322e3836342e383634203020302030202e3234352d2e323137632e30372d2e30392e3132372d2e31392e31372d2e33303461312e303320312e3033203020302030202e3036352d2e3335386c312e3130312e3131325a6d372e32303720306330202e3331362d2e3034352e36312d2e3133342e38373961322e3120322e312030203020312d2e33372e36393720312e36383320312e3638332030203020312d2e3536382e343531632d2e3232332e31312d2e3436372e3136342d2e3733322e3136342d2e31373220302d2e3333342d2e3031362d2e3438372d2e30343761322e33303120322e3330312030203020312d2e34342d2e313420322e38313420322e3831342030203020312d2e3432372d2e32343641342e303920342e30392030203020312033332e343420373361322e39303420322e3930342030203020302d2e3535312d2e33363320312e32313520312e3231352030203020302d2e35342d2e31332e3631362e3631362030203020302d2e3330342e3038332e392e392030203020302d2e3236342e32312e3938332e3938332030203020302d2e3234362e36356c2d312e3035352d2e31323863302d2e3331362e3034332d2e3630352e31332d2e3836372e3038352d2e3236362e3230362d2e3439322e3336332d2e36382e31362d2e3139312e33352d2e33342e3536382d2e3434352e3232332d2e3130352e3436372d2e3135382e3733322d2e3135382e33342030202e3635332e3036362e3933382e322e3238392e3133322e3537382e3332352e3836372e35382e3139312e3136332e3337332e3238362e3534352e3336382e3137362e3038322e3335322e3132332e3532372e313233612e3538332e353833203020302030202e332d2e3038322e3836332e383633203020302030202e3234352d2e323137632e30372d2e30392e3132372d2e31392e31372d2e33303461312e303320312e3033203020302030202e3036352d2e3335386c312e3130312e3131325a6d372e32303720306330202e3331362d2e3034352e36312d2e3133352e3837392d2e3038352e32372d2e3230392e3530322d2e3336392e36393761312e36383420312e3638342030203020312d2e3536382e343531632d2e3232332e31312d2e3436372e3136342d2e3733322e31363461322e343220322e34322030203020312d2e3438372d2e30343720322e3320322e332030203020312d2e34342d2e313420322e38313320322e3831332030203020312d2e3432372d2e32343620342e303920342e30392030203020312d2e3433332d2e33353220322e39303120322e3930312030203020302d2e3535312d2e33363320312e32313520312e3231352030203020302d2e35342d2e31332e3631362e3631362030203020302d2e3330342e3038332e3839362e3839362030203020302d2e3236342e32312e3938352e3938352030203020302d2e3234362e36356c2d312e3035352d2e31323863302d2e3331362e3034342d2e3630352e31332d2e3836372e3038352d2e3236362e3230362d2e3439322e3336332d2e36382e31362d2e3139312e33352d2e33342e3536382d2e3434352e3232332d2e3130352e3436372d2e3135382e3733332d2e3135382e33342030202e3635322e3036362e3933372e322e3238392e3133322e3537382e3332352e3836372e35382e3139322e3136332e3337332e3238362e3534352e3336382e3137362e3038322e3335322e3132332e3532372e313233612e3538332e353833203020302030202e332d2e3038322e3836332e383633203020302030202e3234352d2e323137632e30372d2e30392e3132372d2e31392e31372d2e3330342e3034332d2e3131372e3036352d2e3233372e3036352d2e3335386c312e3130312e3131325a6d372e32303720306330202e3331362d2e3034352e36312d2e3133352e3837392d2e3038352e32372d2e3230382e3530322d2e3336392e36393761312e36383320312e3638332030203020312d2e3536382e343531632d2e3232332e31312d2e3436372e3136342d2e3733322e31363461322e343220322e34322030203020312d2e3438372d2e30343720322e33303420322e3330342030203020312d2e34342d2e313420322e38313320322e3831332030203020312d2e3432372d2e32343620342e3120342e312030203020312d2e3433342d2e33353220322e39303120322e3930312030203020302d2e35352d2e33363320312e32313520312e3231352030203020302d2e35342d2e31332e3631362e3631362030203020302d2e3330342e3038332e3839362e3839362030203020302d2e3236342e32312e3938332e3938332030203020302d2e3234362e36356c2d312e3035352d2e31323863302d2e3331362e3034342d2e3630352e31332d2e3836372e3038352d2e3236362e3230362d2e3439322e3336332d2e36382e31362d2e3139312e33352d2e33342e3536382d2e3434352e3232332d2e3130352e3436372d2e3135382e3733332d2e3135382e33342030202e3635322e3036362e3933372e322e32392e3133322e3537382e3332352e3836372e35382e3139322e3136332e3337332e3238362e3534352e3336382e3137362e3038322e3335322e3132332e3532382e313233612e3538342e353834203020302030202e3239382d2e3038322e3836342e383634203020302030202e3234362d2e323137632e30372d2e30392e3132372d2e31392e31372d2e33303461312e303320312e3033203020302030202e3036352d2e3335386c312e3130312e3131325a6d372e32303720306330202e3331362d2e3034352e36312d2e3133342e3837392d2e3038362e32372d2e32312e3530322d2e33372e36393761312e36383320312e3638332030203020312d2e3536382e343531632d2e3232332e31312d2e3436372e3136342d2e3733322e3136342d2e31373220302d2e3333342d2e3031362d2e3438372d2e30343761322e33303120322e3330312030203020312d2e34342d2e313420322e38313420322e3831342030203020312d2e3432372d2e32343641342e3120342e312030203020312035352e303620373361322e39303420322e3930342030203020302d2e35352d2e33363320312e32313520312e3231352030203020302d2e35342d2e31332e3631362e3631362030203020302d2e3330342e3038332e392e392030203020302d2e3236342e32312e3938332e3938332030203020302d2e3234362e36356c2d312e3035342d2e31323863302d2e3331362e3034332d2e3630352e3132392d2e3836372e3038352d2e3236362e3230362d2e3439322e3336332d2e36382e31362d2e3139312e33352d2e33342e3536382d2e3434352e3232332d2e3130352e3436372d2e3135382e3733332d2e3135382e33342030202e3635322e3036362e3933372e322e32392e3133322e3537382e3332352e3836372e35382e3139322e3136332e3337332e3238362e3534352e3336382e3137362e3038322e3335322e3132332e3532382e313233612e3538332e353833203020302030202e3239382d2e3038322e3836332e383633203020302030202e3234362d2e323137632e30372d2e30392e3132372d2e31392e31372d2e33303461312e303320312e3033203020302030202e3036352d2e3335386c312e3130312e3131325a6d372e32303820306330202e3331362d2e3034362e36312d2e3133352e3837392d2e3038362e32372d2e32312e3530322d2e33372e36393761312e36383420312e3638342030203020312d2e3536382e343531632d2e3232332e31312d2e3436372e3136342d2e3733322e31363461322e343220322e34322030203020312d2e3438372d2e30343720322e3320322e332030203020312d2e34342d2e313420322e38313320322e3831332030203020312d2e3432372d2e32343620342e303820342e30382030203020312d2e3433332d2e33353220322e39303120322e3930312030203020302d2e3535312d2e33363320312e32313520312e3231352030203020302d2e35342d2e31332e3631372e3631372030203020302d2e3330342e3038332e3839372e3839372030203020302d2e3236342e32312e3938352e3938352030203020302d2e3234362e36356c2d312e3035342d2e31323863302d2e3331362e3034332d2e3630352e3132392d2e3836372e3038352d2e3236362e3230362d2e3439322e3336332d2e36382e31362d2e3139312e33352d2e33342e3536382d2e3434352e3232332d2e3130352e3436372d2e3135382e3733332d2e3135382e33342030202e3635322e3036362e3933372e322e32392e3133322e3537382e3332352e3836372e35382e3139322e3136332e3337332e3238362e3534352e3336382e3137362e3038322e3335322e3132332e3532372e313233612e3538332e353833203020302030202e332d2e3038322e3836332e383633203020302030202e3234352d2e323137632e30372d2e30392e3132372d2e31392e31372d2e3330342e3034332d2e3131372e3036352d2e3233372e3036352d2e3335386c312e3130312e3131325a6d372e32303620306330202e3331362d2e3034342e36312d2e3133342e3837392d2e3038362e32372d2e32312e3530322d2e33372e36393761312e36383420312e3638342030203020312d2e3536382e343531632d2e3232322e31312d2e3436372e3136342d2e3733322e31363461322e343220322e34322030203020312d2e3438372d2e30343720322e33303420322e3330342030203020312d2e34342d2e313420322e38313320322e3831332030203020312d2e3432372d2e32343620342e303920342e30392030203020312d2e3433332d2e33353220322e39303120322e3930312030203020302d2e3535312d2e33363320312e32313520312e3231352030203020302d2e35342d2e31332e3631362e3631362030203020302d2e3330342e3038332e3839362e3839362030203020302d2e3236342e32312e3938332e3938332030203020302d2e3234362e36356c2d312e3035342d2e31323863302d2e3331362e3034332d2e3630352e3132382d2e3836372e3038372d2e3236362e3230382d2e3439322e3336342d2e36382e31362d2e3139312e33352d2e33342e3536382d2e3434352e3232332d2e3130352e3436372d2e3135382e3733332d2e3135382e33342030202e3635322e3036362e3933372e322e32392e3133322e3537382e3332352e3836372e35382e3139322e3136332e3337332e3238362e3534352e3336382e3137362e3038322e3335322e3132332e3532382e313233612e3538342e353834203020302030202e3239382d2e3038322e3836342e383634203020302030202e3234372d2e323137632e30372d2e30392e3132362d2e31392e31372d2e33303461312e303320312e3033203020302030202e3036342d2e3335386c312e3130312e3131325a6d372e32303720306330202e3331362d2e3034342e36312d2e3133342e3837392d2e3038362e32372d2e32312e3530322d2e33372e36393761312e36383320312e3638332030203020312d2e3536382e343531632d2e3232322e31312d2e3436372e3136342d2e3733322e3136342d2e31373220302d2e3333342d2e3031362d2e3438372d2e30343761322e33303120322e3330312030203020312d2e3433392d2e313420322e38313420322e3831342030203020312d2e3432382d2e32343620342e3120342e312030203020312d2e3433332d2e33353220322e39303420322e3930342030203020302d2e3535312d2e33363320312e32313520312e3231352030203020302d2e35342d2e31332e3631362e3631362030203020302d2e3330342e3038332e392e392030203020302d2e3236342e32312e3938332e3938332030203020302d2e3234362e36356c2d312e3035342d2e31323863302d2e3331362e3034332d2e3630352e3132392d2e38363761322e303220322e3032203020302031202e3336332d2e3638632e31362d2e3139312e33352d2e33342e3536382d2e3434352e3232332d2e3130352e3436372d2e3135382e3733332d2e3135382e33342030202e3635322e3036362e3933372e322e32392e3133322e3537382e3332352e3836372e35382e3139322e3136332e3337332e3238362e3534352e3336382e3137362e3038322e3335322e3132332e3532382e313233612e3538342e353834203020302030202e3239382d2e3038322e3836332e383633203020302030202e3234362d2e323137632e30372d2e30392e3132372d2e31392e31372d2e33303461312e303320312e3033203020302030202e3036352d2e3335386c312e3130312e3131325a6d372e32303720306330202e3331362d2e3034342e36312d2e3133342e3837392d2e3038362e32372d2e32312e3530322d2e33372e36393761312e36383420312e3638342030203020312d2e3536382e343531632d2e3232322e31312d2e3436372e3136342d2e3733322e31363461322e343220322e34322030203020312d2e3438372d2e30343720322e3320322e332030203020312d2e3433392d2e313420322e38313320322e3831332030203020312d2e3432382d2e32343641342e303820342e30382030203020312038332e383920373361322e39303120322e3930312030203020302d2e3535312d2e33363320312e32313520312e3231352030203020302d2e35342d2e31332e3631372e3631372030203020302d2e3330342e3038332e3839372e3839372030203020302d2e3236332e32312e3938352e3938352030203020302d2e3234362e36356c2d312e3035352d2e31323863302d2e3331362e3034332d2e3630352e3132392d2e38363761322e303120322e3031203020302031202e3336332d2e3638632e31362d2e3139312e33352d2e33342e3536382d2e3434352e3232332d2e3130352e3436372d2e3135382e3733332d2e3135382e33342030202e3635322e3036362e3933372e322e32392e3133322e3537382e3332352e3836372e35382e3139322e3136332e3337332e3238362e3534352e3336382e3137362e3038322e3335322e3132332e3532382e313233612e3538332e353833203020302030202e3239382d2e3038322e3836332e383633203020302030202e3234362d2e323137632e30372d2e30392e3132372d2e31392e31372d2e3330342e3034332d2e3131372e3036352d2e3233372e3036352d2e3335386c312e3130322e3131325a222f3e0000')
];
string[] internal feet_traits = [
"Big Feet",
"Dots",
"Flat Toes",
"Flat",
"Pointy",
"Sharp",
"Skater",
"Wet"
];
uint[] internal feet_probability = [
15,
30,
45,
60,
75,
90,
95,
100
];
// Getter functions
function getFeetTrait(uint index) external view returns (string memory) {
return feet_traits[index];
}
function getFeetData(uint index) external view returns (bytes memory) {
return feet_data[index];
}
function getFeetProbability() external view returns (uint[] memory) {
return feet_probability;
}
function totalFeet() external view returns (uint) {
return feet_traits.length;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
// Copyright (c) 2025 Berny Art
//
// This file and the associated art layers are proprietary.
// They may not be reused, copied, or sold in any form without explicit
// written permission from Berny Art.
contract FrogsHats {
// Data for the hats trait
bytes[] internal hats_data = [
bytes(hex'3c706174682066696c6c3d22234146463245322220643d226d34342e34303620362e3236382d322e3239372d2e3536332e3338372d312e32303120322e3139372e3937332d2e32312d322e35323668312e3238336c2d2e32323920322e35363720322e31382d2e3935352e33383620312e3232342d322e3333312e35333320312e353720312e3839332d312e3034332e3735362d312e3233362d322e31382d312e32333720322e3131352d312e3034392d2e373220312e36332d312e3931365a4d34302e34312031382e373332682d312e3531376c332e3139332d392e32363368312e3531376c2d332e31393320392e3236335a6d352e3830372d392e32363368312e3532336c332e31393420392e3236334834392e34314c34362e32313720392e34375a6d2d392e34312031392e323633682d312e3531386c332e3139332d392e3236334834306c2d332e31393320392e3236335a6d31302e3631312e353339682d352e33343456323868352e33343476312e3237315a6d322e3430322d392e38303268312e3532346c332e31393320392e323633682d312e3532334c34392e38322031392e34375a6d2d312e38303620322e303539612e35372e35372030203020302d2e3033382d2e32312e35312e35312030203020302d2e32392d2e3238342e3631322e3631322030203020302d2e3233382d2e3034352e3631322e3631322030203020302d2e3233372e3034342e34382e34382030203020302d2e3137362e3131342e3533352e3533352030203020302d2e3135322e33382e3532382e353238203020302030202e3135322e33382e3530312e353031203020302030202e3137362e3131632e30372e3032382e31352e3034322e3233372e303432612e3635312e363531203020302030202e3233372d2e3034312e3533352e353335203020302030202e31382d2e3131322e3439332e343933203020302030202e31312d2e31372e3536322e353632203020302030202e3033392d2e3230385a6d2d352e3030372d332e30303863302d2e312d2e3031342d2e3230332d2e3034312d2e33303861312e36373720312e3637372030203020302d2e3131342d2e33313420312e39323320312e3932332030203020302d2e31372d2e32383720312e34363220312e3436322030203020302d2e3231312d2e3233376c2d2e3337352e323332632e3037342e3132362e3133352e3236332e3138342e34312e30352e3134342e3037332e3331312e3037332e35762e3532682e363534762d2e3531375a6d2e35353920362e3431366330202e31312e3031362e3232352e3034372e33343261312e373720312e3737203020302030202e3331342e3635632e3037322e3039382e31352e3138352e3233342e3236316c2e34332d2e32323261332e30333320332e3033332030203020312d2e3130322d2e32313420312e36363120312e3636312030203020312d2e3038352d2e32323920312e39363320312e3936332030203020312d2e3037362d2e3535762d2e363836682d2e3736356c2e3030332e3634385a222f3e00'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d33362e3431382031372e323731682d352e33343456313668352e33343476312e3237315a6d372e3230372030682d352e33343456313668352e33343476312e3237315a6d372e3230372030682d352e33343456313668352e33343476312e3237315a6d372e3230382030682d352e33343556313668352e33343476312e3237315a4d32352e3830372032382e373332682d312e3531386c332e3139332d392e3236334832396c2d332e31393320392e3236335a6d31302e3631312e353339682d352e33343456323868352e33343476312e3237315a6d372e3230372030682d352e33343456323868352e33343476312e3237315a6d372e3230372030682d352e33343456323868352e33343476312e3237315a6d372e3230382030682d352e33343556323868352e33343476312e3237315a6d322e3430312d392e38303268312e3532346c332e31393320392e323633682d312e3532334c36302e34342031392e34375a4d33372e3532382032332e3838612e3537322e3537322030203020302d2e3033382d2e3231362e3436322e3436322030203020302d2e3131372d2e3137362e3737392e3737392030203020302d2e32312d2e31343320322e33373420322e3337342030203020302d2e3331342d2e31333220352e34373220352e3437322030203020312d2e35342d2e32323320312e37363220312e3736322030203020312d2e3431352d2e32373220312e31303820312e3130382030203020312d2e3236342d2e333620312e313920312e31392030203020312d2e3039342d2e34393363302d2e3136362e3032392d2e3331372e3038352d2e34353461312e303620312e3036203020302031202e32342d2e3336632e3130342d2e3130322e3232392d2e3138342e3337352d2e3234362e3134372d2e3036332e33312d2e3130332e34392d2e3132762d2e3633682e343638762e363335632e3137362e3032342e3333342e3037322e3437352e31343461312e3220312e32203020302031202e3538362e363934632e3035352e3135372e3038322e3333322e3038322e353238682d2e38313563302d2e3233372d2e3035332d2e3431352d2e31362d2e353337612e35352e35352030203020302d2e3433372d2e3138342e37352e37352030203020302d2e32362e3034312e3434392e3434392030203020302d2e3238352e3237382e3636332e3636332030203020302d2e3033322e3231316330202e3037362e30312e3134352e3033322e323035612e3437322e343732203020302030202e3131342e313634632e3035352e3035312e3132362e312e3231342e3134372e3038382e3034352e3139372e30392e3332382e3133382e3139372e3037342e3337362e31352e3533362e3233312e31362e3037382e3239372e31372e34312e3237352e3131362e3130342e3230332e3232352e3236342e3336342e3036332e3133362e3039342e3239392e3039342e3438362030202e3137322d2e3032392e3332372d2e3038352e34363661312e30313820312e3031382030203020312d2e3234332e333534632d2e3130362e312d2e3233332e31382d2e3338312e323461312e38323720312e3832372030203020312d2e3439382e313135762e353734682d2e343636762d2e35373461312e39343920312e3934392030203020312d2e3438332d2e31303920312e32393120312e3239312030203020312d2e3431362d2e32353220312e32303220312e3230322030203020312d2e3238382d2e34313320312e35323120312e3532312030203020312d2e3130382d2e363033682e383138612e392e39203020302030202e3036312e3335342e36332e3633203020302030202e3135382e3232362e3630372e363037203020302030202e3232362e313137632e3038342e3032342e31372e3033352e3235382e3033352e3230392030202e3336372d2e3034392e3437342d2e313436612e3438372e343837203020302030202e3136312d2e3337385a4d34312e383033203235682d2e383135762d312e383439682d312e323037563235682d2e383137762d342e323636682e38313776312e373568312e323037762d312e3735682e3831355632355a6d322e3234342d322e332e38342d312e393636682e3930366c2d312e33343220322e37394c34342e343438203235682d2e38326c2d2e3030332d312e3531322d312e3332312d322e373534682e3930326c2e383420312e3936365a6d332e3032332e373336563235682d2e383233762d342e32363668312e3436632e3233312030202e3434312e3033352e3632392e3130332e3138372e3036362e3334372e31362e3437372e3238312e3133332e31322e3233352e3236332e3330352e34332e3037322e3136392e3130392e3335352e3130392e35362030202e3139322d2e3033372e3336392d2e3130392e353361312e313920312e31392030203020312d2e3330352e343232632d2e31332e3131382d2e32392e32312d2e3437372e3237362d2e3138382e3036362d2e3339382e312d2e36332e31682d2e3633365a6d302d2e363638682e363336612e382e38203020302030202e3330352d2e3035332e3539372e353937203020302030202e3334322d2e3335322e37322e3732203020302030202e3034342d2e32343963302d2e312d2e3031342d2e3139322d2e3034342d2e323738612e3630312e3630312030203020302d2e3334322d2e3337382e3736342e3736342030203020302d2e3330352d2e303536682d2e36333676312e3336365a6d352e3335332e3336324835302e363776312e32303568322e303438563235682d322e383734762d342e32363668322e383635762e363731682d322e303476312e30373568312e373533762e36355a222f3e00'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d34302e3132352031372e323731682d352e33343456313668352e33343476312e3237315a6d372e3230372030682d352e33343456313668352e33343476312e3237315a6d372e3230382030682d352e33343556313668352e33343476312e3237315a4d33302e38352033302e343032682d312e30325631392e343768312e30327631302e3933335a6d392e3237352d312e313331682d352e33343456323868352e33343476312e3237315a6d372e3230372030682d352e33343456323868352e33343476312e3237315a6d372e3230382030682d352e33343556323868352e33343476312e3237315a6d352e31333820312e313331682d312e30325631392e343768312e30327631302e3933335a6d392e3237352d312e3133314836332e363156323868352e33343476312e3237315a222f3e000000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d33392e39313820352e323731682d352e333434563468352e33343476312e3237315a6d372e3230372030682d352e333434563468352e33343476312e3237315a6d372e3230372030682d352e333434563468352e33343476312e3237315a6d2d32352e38313120372e323663302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e33343761372e303120372e3031203020302031202e3530342d312e313331632e3139352d2e33342e342d2e36342e3631352d2e39303261342e343120342e3431203020302031202e3636322d2e36363220332e323320332e3233203020302031202e3636382d2e3432326c2e3331372e383961332e36353520332e3635352030203020302d2e3635362e363820342e35393220342e3539322030203020302d2e35393220312e30353520372e38313820372e3831382030203020302d2e34323220312e34363520392e39383320392e3938332030203020302d2e31363420312e393136762e3135326330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432312e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d33312e3936392e31323961382e363420382e36342030203020312d2e31323920312e35323420382e33333820382e3333382030203020312d2e33353120312e33333620362e37313320362e3731332030203020312d2e35323220312e313320362e31343520362e3134352030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439372d2e3638352e36383561332e313120332e31312030203020312d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e363733632e3231392d2e3238352e3431362d2e3633372e3539322d312e3035352e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230352e3136342d312e393238762d2e31353261392e3820392e382030203020302d2e31372d312e39323220372e39323820372e3932382030203020302d2e3433342d312e34373720342e37323620342e3732362030203020302d2e3539322d312e303620332e353720332e35372030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353420382e3534203020302031202e343820322e3836762e31335a4d33342e3234362033302e343032682d312e30325631392e343768312e30327631302e3933335a6d392e3237362d312e313331682d352e33343456323868352e33343476312e3237315a6d372e3230362030682d352e33343356323868352e33343376312e3237315a6d352e31333920312e313331682d312e30325631392e343768312e30327631302e3933335a222f3e0000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32332e3630342031322e37373163302d2e34362e3036362d2e3838362e3139392d312e3237372e3133332d2e3339342e3332362d2e3733362e35382d312e3032352e3235382d2e32392e35372d2e3531362e3933372d2e363861332e31313620332e31313620302030203120312e3237322d2e323436632e3437362030202e392e30383220312e3237312e3234362e3337312e3136342e3638342e33392e3933382e36382e3235382e3238392e3435332e36332e35383620312e3032352e3133332e33392e3139392e3831362e31393920312e323737762e3132336330202e3436352d2e3036362e3839352d2e3220312e32392d2e3133322e33392d2e3332352e37332d2e353820312e303261322e363620322e36362030203020312d2e3933372e363739632d2e3337312e31362d2e3739332e32342d312e3236352e32342d2e34373720302d2e3930332d2e30382d312e3237382d2e323461322e37313820322e3731382030203020312d2e3934332d2e363820322e39373820322e3937382030203020312d2e35382d312e303220342e30313820342e3031382030203020312d2e322d312e323838762d2e3132335a6d312e3632382e3132336330202e3236362e3032362e3531362e3037372e37352e30352e3233312e31332e3433342e32342e36312e31312e3137322e32352e3330392e3432322e34312e3137352e3130322e3338362e3135322e3633332e3135322e3233382030202e3434332d2e30352e3631352d2e3135322e3137322d2e3130312e33312d2e3233382e3431362d2e34312e31312d2e3137362e31392d2e3337392e32342d2e36312e30352d2e3233342e3037362d2e3438342e3037362d2e3735762d2e31323363302d2e3235372d2e3032352d2e3530322d2e3037362d2e3733322d2e30352d2e32332d2e31332d2e3433342d2e32342d2e363161312e31373920312e3137392030203020302d2e3431362d2e34313520312e32313220312e3231322030203020302d2e3632372d2e31353320312e3220312e322030203020302d2e3632312e313533632d2e3137322e3130312d2e3331332e32342d2e3432322e3431362d2e31312e3137352d2e31392e3337392d2e32342e36312d2e3035312e32332d2e3037372e3437342d2e3037372e373332762e3132335a222f3e3c706174682066696c6c3d227265642220643d224d33392e3838372031352e30353763302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232322d2e3334632e3039382d2e3039382e3231372d2e3137342e3335382d2e3232392e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938392e3938392030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363920312e3036392030203020312d2e3335382d2e3232332e3938392e3938392030203020312d2e3232322d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431355a6d372e323037203063302d2e3135332e3032352d2e3239332e3037362d2e343232612e39322e3932203020302031202e3232332d2e333420312e303120312e3031203020302031202e3335372d2e323239632e31342d2e3035382e3239392d2e3038382e3437352d2e3038382e3137352030202e3333342e30332e3437342e3038382e31342e3035352e3235382e3133312e3335322e323239612e39322e3932203020302031202e3232322e3334632e3035352e3132392e3038322e32372e3038322e3432322030202e3134382d2e3032372e3238372d2e3038322e343136612e3938372e3938372030203020312d2e3232322e333420312e30303520312e3030352030203020312d2e3335322e323232632d2e31342e3035352d2e3239392e3038322d2e3437342e3038322d2e31373620302d2e3333342d2e3032372d2e3437352d2e30383261312e30363820312e3036382030203020312d2e3335372d2e3232332e3938372e3938372030203020312d2e3232332d2e333420312e31323520312e3132352030203020312d2e3037362d2e3431355a222f3e3c706174682066696c6c3d22234146463245322220643d224d35392e3633392031322e37373163302d2e34362e3036362d2e3838362e3139392d312e3237372e3133332d2e3339342e3332362d2e3733362e35382d312e3032352e3235382d2e32392e35372d2e3531362e3933382d2e363861332e31313620332e31313620302030203120312e3237312d2e323436632e3437362030202e392e30383220312e3237312e3234362e3337312e3136342e3638342e33392e3933382e36382e3235382e3238392e3435332e36332e35383620312e3032352e3133332e33392e322e3831362e3220312e323737762e3132336330202e3436352d2e3036372e3839352d2e3220312e32392d2e3133332e33392d2e3332362e37332d2e353820312e303261322e363620322e36362030203020312d2e3933382e363739632d2e33372e31362d2e3739332e32342d312e3236352e32342d2e34373720302d2e3930332d2e30382d312e3237382d2e323461322e37313820322e3731382030203020312d2e3934332d2e363820322e39373820322e3937382030203020312d2e35382d312e303220342e30313820342e3031382030203020312d2e322d312e323838762d2e3132335a6d312e3632392e3132336330202e3236362e3032352e3531362e3037362e37352e30352e3233312e31332e3433342e32342e36312e31312e3137322e32352e3330392e3432322e34312e3137362e3130322e3338372e3135322e3633332e3135322e3233382030202e3434332d2e30352e3631352d2e3135322e3137322d2e3130312e33312d2e3233382e3431362d2e34312e31312d2e3137362e31392d2e3337392e32342d2e36312e30352d2e3233342e3037362d2e3438342e3037362d2e3735762d2e31323363302d2e3235372d2e3032352d2e3530322d2e3037362d2e37333261312e393320312e39332030203020302d2e32342d2e363120312e31373720312e3137372030203020302d2e3431362d2e34313520312e32313220312e3231322030203020302d2e3632372d2e31353320312e3220312e322030203020302d2e3632312e313533632d2e3137322e3130312d2e3331332e32342d2e3432322e3431362d2e31312e3137352d2e31392e3337392d2e32342e36312d2e3035312e32332d2e3037362e3437342d2e3037362e373332762e3132335a222f3e3c706174682066696c6c3d22234536464635352220643d224d32372e3134332033302e343032682d312e30325631392e343768312e30327631302e3933335a6d342e34372d31302e39333368312e3532346c332e31393320392e323633682d312e3532336c2d332e3139342d392e3236335a6d382e36303720392e323633682d312e3531376c332e3139342d392e32363368312e3531376c2d332e31393320392e3236335a6d352e3830372d392e32363368312e3532346c332e31393320392e323633682d312e3532336c2d332e3139342d392e3236335a6d382e36303820392e323633682d312e3531386c332e3139342d392e32363368312e3531376c2d332e31393320392e3236335a6d382e35343320312e3637682d312e30325631392e343768312e30327631302e3933335a222f3e000000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d34332e3632352031372e323731682d352e33343456313668352e33343476312e3237315a6d372e3230372030682d352e33343456313668352e33343476312e3237315a4d33332e3031342032382e373332682d312e3531386c332e3139342d392e32363368312e3531376c2d332e31393320392e3236335a6d31302e3631312e353339682d352e33343456323868352e33343476312e3237315a6d372e3230372030682d352e33343456323868352e33343476312e3237315a6d322e3430322d392e38303268312e3532346c332e31393320392e323633682d312e3532336c2d332e3139342d392e3236335a6d382e36303820392e323633682d312e3531386c332e3139342d392e32363368312e3531376c2d332e31393320392e3236335a222f3e'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d34302e3032322031372e323731682d352e33343456313668352e33343476312e3237315a6d372e3230362030682d352e33343356313668352e33343376312e3237315a6d372e3230372030682d352e33343356313668352e33343376312e3237315a4d32362e363034203238762d366831327636682d31325a222f3e3c706174682066696c6c3d22234146463245322220643d224d33382e363033203238762d366831327636682d31325a6d31322030762d366831327636682d31325a222f3e000000'),
bytes(hex'3c706174682066696c6c3d22234536464635352220643d224d3237203235762d3368367633682d365a6d362030762d3368367633682d365a6d362030762d3368367633682d365a6d362030762d3368367633682d365a6d362030762d3368367633682d365a6d362030762d3368367633682d365a222f3e00'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d34332e3632352031372e323731682d352e33343456313668352e33343476312e3237315a6d372e3230372030682d352e33343456313668352e33343476312e3237315a6d2d32312e363232203132682d352e33343356323868352e33343476312e3237315a6d352e313420312e313331682d312e30325631392e343768312e30327631302e3933335a6d392e3237352d312e313331682d352e33343456323868352e33343476312e3237315a6d372e3230372030682d352e33343456323868352e33343476312e3237315a6d352e31333820312e313331682d312e3031395631392e343768312e30327631302e3933335a6d392e3237362d312e313331682d352e33343456323868352e33343476312e3237315a222f3e00'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32362e313034203235762d366831327636682d31325a222f3e3c706174682066696c6c3d22234146463245322220643d224d33382e313033203235762d366831327636682d31325a222f3e3c706174682066696c6c3d2223414646324532222066696c6c2d6f7061636974793d222e352220643d224d35302e313033203235762d366831327636682d31325a222f3e3c706174682066696c6c3d22234146463245322220643d224d36382e3238322032302e37762e363736682d2e303437632d2e32313520302d2e3430352e3032382d2e35372e30383561312e32343120312e3234312030203020302d2e3432332e323420312e31363320312e3136332030203020302d2e3237352e33373220312e35303620312e3530362030203020302d2e3132362e34383420312e33393420312e333934203020302031202e3335312d2e32373320312e30353620312e303536203020302031202e3531382d2e313239632e3230342030202e33382e30342e3533312e3131372e3135332e3037372e32382e3138312e3338312e3331342e3130322e31332e3137372e3238342e3232362e34362e30352e3137342e3037362e3335372e3037362e35352030202e3230382d2e3033332e342d2e312e35373861312e33333520312e3333352030203020312d2e3733322e37373320312e35303820312e3530382030203020312d2e3539322e31313220312e343720312e34372030203020312d2e3631382d2e31323620312e333820312e33382030203020312d2e3436392d2e33353520312e36343220312e3634322030203020312d2e3239362d2e35333320322e31343520322e3134352030203020312d2e3130322d2e363737762d2e33313363302d2e3333382e3034362d2e36352e3133372d2e3933382e3039322d2e3238392e3232392d2e3533382e34312d2e37343761312e383720312e3837203020302031202e3637372d2e343932632e32372d2e31322e3538312d2e3137392e3933352d2e313739682e3130385a6d2d2e38303820322e313039612e36372e36372030203020302d2e33392e3131372e3734322e3734322030203020302d2e3235322e333032762e32346330202e3135362e3031362e3239332e3034372e3431612e3837362e383736203020302030202e3133382e3239332e3538352e353835203020302030202e3932382e3030362e3736382e373638203020302030202e3132362d2e3235632e30332d2e3039372e3034342d2e3230332e3034342d2e33313920302d2e3131352d2e3031342d2e3232312d2e3034342d2e333139612e3736322e3736322030203020302d2e3132362d2e3235322e3537322e3537322030203020302d2e3437322d2e3232395a6d322e38303920312e353433632e3231392030202e3430382d2e3032332e3536392d2e30372e31362d2e3034372e3239332d2e3131342e342d2e323032612e39312e3931203020302030202e3235332d2e333235632e30362d2e3132392e312d2e3237342e3131372d2e34333761312e30363720312e3036372030203020312d2e3738352e33632d2e32303320302d2e3338322d2e3033382d2e3533362d2e31313261312e313320312e31332030203020312d2e33392d2e33303520312e33373720312e3337372030203020312d2e3233372d2e34353420312e393620312e39362030203020312d2e30382d2e35363563302d2e3230372e3033332d2e3430322e3039372d2e3538332e3036372d2e3138342e3136322d2e3334342e3238352d2e34382e3132332d2e3133382e3237312d2e3234352e3434352d2e3332332e3137362d2e30382e3337332d2e31322e3539322d2e31322e3232322030202e3432322e3034332e362e3132392e3137382e3038362e3332382e3230362e3435312e333661312e3620312e36203020302031202e3238352e3535632e3036362e3231342e312e3434372e312e373031762e3238316330202e33342d2e3034332e3635332d2e3132372e39333861322e30323420322e3032342030203020312d2e33392e37343120312e3820312e382030203020312d2e36372e34383620322e34383220322e3438322030203020312d2e3937332e313733682d2e303631762d2e363833682e3035355a6d2e3734372d312e333635612e3632372e363237203020302030202e3531332d2e3235352e3732332e373233203020302030202e3039342d2e3137762d2e323963302d2e3135362d2e3031372d2e3239322d2e30352d2e3431612e3838332e3838332030203020302d2e3133322d2e3239332e3533312e3533312030203020302d2e3730332d2e3136342e35382e35382030203020302d2e3138382e3138352e3839372e3839372030203020302d2e3131372e32363620312e32363420312e3236342030203020302d2e3030332e363237632e3032362e312e3036342e3138372e3131352e323631612e3631342e363134203020302030202e3139362e313739632e3037382e3034332e31372e3036342e3237352e3036345a6d312e3938372d312e34393163302d2e3131332e3031362d2e32322e30352d2e3332612e3734362e373436203020302031202e3135352d2e32362e37352e3735203020302031202e32362d2e3137362e3932392e393239203020302031202e3336372d2e303637632e3134322030202e3236352e3032322e3336392e303637612e3731352e373135203020302031202e32362e313736632e3036392e3037342e31322e3136312e3135332e32362e3033352e312e3035332e3230372e3035332e3332762e323236612e3934352e3934352030203020312d2e3035332e3331362e3734352e3734352030203020312d2e3135332e32362e37322e37322030203020312d2e3235372e3137372e39352e39352030203020312d2e3336372e3036342e3937332e3937332030203020312d2e3336392d2e3036342e37352e37352030203020312d2e32362d2e3137362e3738342e3738342030203020312d2e3135362d2e32362e3934352e3934352030203020312d2e3035322d2e333137762d2e3232365a6d2e35352e3232366330202e3034352e3030352e3038382e3031352e313331612e33352e3335203020302030202e3034372e3131322e3236362e323636203020302030202e30392e3037362e3331332e333133203020302030202e3133362e3032362e3239332e323933203020302030202e3133312d2e3032362e32342e3234203020302030202e3038382d2e3037362e3335352e333535203020302030202e3034372d2e3131312e3539312e353931203020302030202e3031352d2e313332762d2e323236612e3535332e3535332030203020302d2e3031352d2e3132392e32392e32392030203020302d2e30352d2e3131312e32312e32312030203020302d2e3038382d2e3037362e3237362e3237362030203020302d2e3133342d2e30332e32372e32372030203020302d2e3133322e30332e3233352e3233352030203020302d2e3038382e3037362e3331392e3331392030203020302d2e3034372e3131312e3535382e3535382030203020302d2e3031352e3133762e3232355a6d312e31373220322e323963302d2e31312e3031382d2e3231362e3035332d2e333136612e3733312e373331203020302031202e3431362d2e34342e3936372e393637203020302031202e3336362d2e303634632e3134332030202e3236362e3032322e33372e303635612e372e37203020302031202e3431322e34342e3931362e393136203020302031202e3035332e333136762e323238612e3939342e3939342030203020312d2e30352e3331372e3731392e3731392030203020312d2e3431332e3433362e39352e39352030203020312d2e3336362e3036352e3937342e3937342030203020312d2e33372d2e3036352e3734332e3734332030203020312d2e3236332d2e3137362e3734372e3734372030203020312d2e3135352d2e32362e3934332e3934332030203020312d2e3035332d2e333137762d2e3232385a6d2e3535312e3233612e352e35203020302030202e3031382e3133312e3335342e333534203020302030202e3035322e3131312e3330382e333038203020302030202e3039312e303736632e3033372e3031382e30382e3032372e31332e3032372e30362030202e3130382d2e3030392e3134362d2e303236612e3231352e323135203020302030202e3038342d2e3037372e3239392e323939203020302030202e3033392d2e3131312e3932362e393236203020302030202e3030382d2e313332762d2e323238612e3535382e3535382030203020302d2e3031342d2e31332e32392e32392030203020302d2e30352d2e3130382e3230382e3230382030203020302d2e3038382d2e3037362e32372e32372030203020302d2e3133322d2e30332e3238362e3238362030203020302d2e3133352e30332e3230382e3230382030203020302d2e3038372e3037362e33322e33322030203020302d2e3034372e3130392e3535332e3535332030203020302d2e3031352e313239762e3232385a6d2d312e31362e3137382d2e3339392d2e313920312e3634342d332e3031322e3339382e31392d312e36343320332e3031325a222f3e00'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32372e3134332033302e343032682d312e30325631392e343768312e30327631302e3933335a6d352e3632352d362e343237682d312e3331336c312e38372d342e35303668312e3137376c312e38363320342e3530364833352e30366c2d312e3033322d322e36362d2e3132332d2e3439332d2e3132332e3439322d312e30313320322e36365a6d372e3230372030682d312e3331336c312e38372d342e35303668312e3137376c312e38363320342e353036682d312e3330366c2d312e3033322d322e36362d2e3132332d2e3439332d2e3132332e3439322d312e30313320322e36365a6d372e3230372030682d312e3331336c312e38372d342e35303668312e3137376c312e38363320342e353036682d312e3330366c2d312e3033322d322e36362d2e3132332d2e3439332d2e3132332e3439322d312e30313320322e36365a6d372e3230372030682d312e3331336c312e38372d342e35303668312e3137376c312e38363320342e3530364835362e36386c2d312e3033322d322e36362d2e3132332d2e3439332d2e3132332e3439322d312e30313320322e36365a6d382e37383920362e343237682d312e30325631392e343768312e30327631302e3933335a222f3e00000000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d33362e3431382032302e323731682d352e33343456313968352e33343476312e3237315a6d372e3230372030682d352e33343456313968352e33343476312e3237315a6d372e3230372030682d352e33343456313968352e33343476312e3237315a6d372e3230382030682d352e33343556313968352e33343476312e3237315a6d2d33332e3633342e31393868312e3532346c332e31393320392e3236334832372e366c2d332e3139342d392e3236335a6d31322e30313220392e383032682d352e33343456323968352e33343476312e3237315a6d372e3230372030682d352e33343456323968352e33343476312e3237315a6d372e3230372030682d352e33343456323968352e33343476312e3237315a6d372e3230382030682d352e33343556323968352e33343476312e3237315a6d332e3830322d2e353339682d312e3531386c332e3139342d392e32363368312e3531376c2d332e31393320392e3236335a6d2d31352e3133382d352e303633612e3931382e393138203020302031202e3232392d2e3037632e3037362030202e31342e3032372e3139332e303833612e3236352e3236352030203020312030202e3338372e3237322e3237322030203020312d2e3139332e3037392e3837352e3837352030203020312d2e3232392d2e30373520322e36303520322e3630352030203020312d2e35343520312e333134632e322e3034342e3239392e3134322e3239392e323935612e3237332e3237332030203020312d2e3037352e3139372e3234362e3234362030203020312d2e3139332e3038632d2e31363120302d2e3235332d2e3130332d2e3237372d2e33303861322e35383720322e3538372030203020312d312e3336372e3535382e3632312e363231203020302031202e3038382e3233332e3236332e3236332030203020312d2e3236382e3236382e32372e32372030203020312d2e3139332d2e3037352e32372e32372030203020312d2e3037352d2e31393363302d2e3035332e3033322d2e3133332e3039372d2e32343261322e35323420322e3532342030203020312d312e3335382d2e353637632d2e30322e3231372d2e3131332e3332362d2e3237372e333236612e32362e32362030203020312d2e3139382d2e30382e3238372e3238372030203020312d2e30372d2e31393763302d2e3135392e3130342d2e3235372e3331322d2e32393561322e34343220322e3434322030203020312d2e35352d312e33313420312e303220312e30322030203020312d2e3233372e3037352e3237322e3237322030203020312d2e3139332d2e30382e3236352e3236352030203020312d2e3038342d2e31393363302d2e3037362e3032372d2e31342e30382d2e313933612e32372e3237203020302031202e3139372d2e303833632e30332030202e3130392e3032332e3233382e30372e3035352d2e3530312e3233392d2e3934322e3534392d312e3332332d2e3230352d2e3032362d2e3330382d2e3131362d2e3330382d2e323638612e32372e3237203020302031202e30382d2e3139382e32372e3237203020302031202e3139372d2e303833632e3136342030202e3235382e3130322e3238322e33303861322e35353120322e35353120302030203120312e3330352d2e3535392e3537362e3537362030203020312d2e3036322d2e32323463302d2e3037332e3032352d2e3133362e3037352d2e313839612e3235362e323536203020302031202e3337382030202e3235322e323532203020302031202e3038332e31392e3530382e3530382030203020312d2e3038382e323332632e3438372e3033352e3932352e323120312e3331342e3532332e3039342d2e3138372e322d2e3238312e3331372d2e3238312e3037332030202e3133362e3032362e3138392e3037392e3035352e30352e3038332e3131342e3038332e3139332030202e3135362d2e312e3234382d2e3330332e3237372e3330352e3337352e34392e3831362e35353820312e3332335a6d2d312e3134322d312e32313361322e323120322e32312030203020302d312e3030372d2e3432322e38392e3839203020302031202e30382e3333392e37342e37342030203020312d2e3032372e31372e3830352e3830352030203020302d2e3032362e3138316330202e3034342e3030372e3130312e3032312e3137312e3032312e3131322e3033312e3232332e3033312e3333352e30382d2e30382e3136372d2e3135312e3236342d2e323136612e3637322e363732203020302030202e3234362d2e32362e3532392e353239203020302031202e31342d2e3138342e37362e3736203020302031202e3237382d2e3131345a6d2d312e3338352d2e34323261322e303620322e30362030203020302d2e39382e343232632e3132332e3033322e3231312e30372e3236342e313134612e3530332e353033203020302031202e3134352e313835632e3036342e31322e31362e3231342e3238362e3238312e3038322e3034342e31352e3038352e3230362e31323320302d2e3037392e3031322d2e3136352e3033352d2e3236612e37352e3735203020302030202e3032372d2e3137352e372e372030203020302d2e3033312d2e31382e3634342e3634342030203020312d2e30332d2e31373163302d2e312e3032362d2e3231332e3037382d2e3333395a6d322e30343420312e36333561322e32373420322e3237342030203020302d2e3339362d2e3936332e3933382e3933382030203020312d2e3333382e3339322e3734352e3734352030203020302d2e32352e32343620312e37353720312e3735372030203020312d2e3230332e323535632e3130362030202e3231352e3031342e33332e303434612e3637382e363738203020302030202e3136322e3032362e3539362e353936203020302030202e3138352d2e3033352e35382e3538203020302031202e3137362d2e303335632e3036342030202e3137352e3032332e3333342e30375a6d2d322e3530352d2e303761312e37353720312e3735372030203020312d2e3230322d2e3235352e3734352e3734352030203020302d2e32352d2e32343620312e30363520312e3036352030203020312d2e3334382d2e333833632d2e3230382e3330322d2e3333342e36322d2e3337382e3935342e31352d2e3034372e3235382d2e30372e3332352d2e3037612e35382e3538203020302031202e3137362e303335632e30372e3032332e3133322e3033352e3138352e303335612e3637382e363738203020302030202e3136322d2e303236632e3131342d2e30332e3232342d2e3034342e33332d2e3034345a6d2e3635392e373132612e3431342e343134203020302030202e3330332d2e3132382e3432392e34323920302030203020302d2e36312e3431342e3431342030203020302d2e3330332d2e3132382e3431342e3431342030203020302d2e3330332e3132372e3432392e3432392030203020302030202e36312e3431342e343134203020302030202e3330332e3132395a6d312e3835352d2e323437612e3933332e3933332030203020312d2e3334332e3038342e37352e37352030203020312d2e3137362d2e3032362e3637322e3637322030203020302d2e3138352d2e3033312e3830322e3830322030203020302d2e3136322e30323220312e36343320312e3634332030203020312d2e33332e303335632e30382e30382e31352e3136372e3231312e323634612e3638322e363832203020302030202e32362e323431632e31322e3036382e32332e31392e3332392e33363561322e3420322e34203020302030202e3339352d2e3935345a6d2d322e3531342e303834632d2e31303620302d2e3231352d2e3031322d2e33332d2e303335612e3830322e3830322030203020302d2e3136322d2e3032322e3637322e3637322030203020302d2e3138352e30332e37352e37352030203020312d2e3137362e3032372e3836392e3836392030203020312d2e3333342d2e303834632e3035332e3334332e3138352e3636312e3339362e393534612e38332e3833203020302031202e33322d2e3336352e3638322e363832203020302030202e32362d2e323431632e3036312d2e3039372e3133322d2e3138352e32312d2e3236345a6d2e34343420312e35363461312e30363220312e3036322030203020312d2e3036322d2e33313663302d2e3034372e30312d2e3130342e30332d2e313731612e3730382e373038203020302030202e3033322d2e3138352e37352e37352030203020302d2e3032372d2e31373620312e323520312e32352030203020312d2e3033352d2e323835632d2e3036342e3034362d2e31342e3039332d2e3232382e3134612e37332e37332030203020302d2e3238322e3237372e38372e38372030203020312d2e3336342e3333632e3238372e3139392e3539392e3332382e3933362e3338365a6d312e3337352d2e333836612e3832372e3832372030203020312d2e3337332d2e33332e36322e36322030203020302d2e3237332d2e3236342e3433362e3433362030203020312d2e3133362d2e303833762d2e3030396c2d2e3131392e3033762e303138612e3735342e3735342030203020312d2e3032322e3136332e3731382e3731382030203020302d2e30332e3138396330202e30352e3030382e3131312e3032362e313835612e3639382e363938203020302031202e3032362e3137312e3930332e3930332030203020312d2e30372e333038632e3333372d2e3034342e36362d2e31372e3937312d2e3337385a222f3e0000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d34302e3632352031372e323731682d352e33343456313668352e33343476312e3237315a6d372e3230372030682d352e33343456313668352e33343476312e3237315a6d372e3230382030682d352e33343556313668352e33343476312e3237315a6d2d32382e3833203132682d352e33343356323868352e33343476312e3237315a6d352e313420312e313331682d312e30325631392e343768312e30327631302e3933335a6d392e3237352d312e313331682d352e33343456323868352e33343476312e3237315a6d372e3230372030682d352e33343456323868352e33343476312e3237315a6d372e3230382030682d352e33343556323868352e33343476312e3237315a6d352e31333820312e313331682d312e30325631392e343768312e30327631302e3933335a222f3e3c706174682066696c6c3d22234536464635352220643d224d34342e3235342032352e32363463302d2e3035322d2e30312d2e3037382d2e30332d2e3037386c2d2e3133382e30363663302d2e3032382d2e3031362d2e3034382d2e3034382d2e30366c2d2e3034382d2e303036612e3235342e3235342030203020302d2e31322e3034322e34322e34322030203020302d2e30332d2e303620352e313920352e31392030203020312d2e3138362d2e3338342037362e3133322037362e3133322030203020302d2e3133382d2e3335346c2d2e3039362d2e32363461322e34303420322e3430342030203020312d2e3035342d2e32333420362e33303720362e3330372030203020312d2e30362d2e333936632e3034342e3032382e3037382e3034322e3130322e3034322e3032382030202e3035342d2e3034322e3037382d2e3132362e3031322e3031362e3033342e3032342e3036362e3032342e3032342030202e3034322d2e3030382e3035342d2e3032346c2e3039362d2e3134342e3130382e303336682e303036632e3030382030202e3031362d2e3030342e3032342d2e303132612e31342e3134203020302031202e3033362d2e303234632e3033322d2e30322e3035362d2e30332e3037322d2e30336c2e3031382e303036632e312e3034382e3136342e3133362e3139322e3236342e3037322e3330342e3134342e3435362e3231362e3435362e3037322030202e3135362d2e3037362e3235322d2e3232382e3034382d2e3037362e3039362d2e3136342e3134342d2e3236342e3035322d2e312e3130342d2e3231322e3135362d2e3333362e3030382e3034382e3031362e3037322e3032342e3037322e30322030202e3035342d2e30352e3130322d2e31352e3035322d2e312e3133342d2e3233382e3234362d2e3431342e3036342d2e3130382e3134342d2e32332e32342d2e3336366131392e3531382031392e353138203020302031202e3634322d2e383238632e3130382d2e3132382e3230342d2e3233382e3238382d2e33332e3038342d2e3039322e3134362d2e3135322e3138362d2e31382e3135322d2e3130342e3237322d2e3230342e33362d2e33612e3434362e3434362030203020312d2e3031382e3037382e3235332e3235332030203020302d2e3030362e3034326330202e3031362e3030382e3032342e3032342e3032346c2e3136382d2e303834762e3032346330202e3033322e3030382e3034382e3032342e3034382e3031322030202e3033362d2e3031382e3037322d2e303534612e32332e3233203020302030202e30362d2e3037386c2d2e3031322e3038342e3230342d2e31322d2e3034382e313038632e3036342d2e3034342e31312d2e3036362e3133382d2e3036362e3031362030202e3032382e30312e3033362e3033612e3130372e313037203020302031202e3031322e3034386330202e3032342d2e30312e3035322d2e30332e3038342d2e30322e3033322d2e3034362e30372d2e3037382e3131342d2e3032342e3033322d2e3036342e30382d2e31322e3134346c2d2e32342e3237632d2e3130382e3131362d2e3235322e3237382d2e3433322e34383661342e31373320342e3137332030203020302d2e3232322e323736632d2e312e3132382d2e3231342e3237382d2e3334322e34356135362e33352035362e33352030203020302d2e3337322e35312032342e35332032342e35332030203020302d2e33332e34363820342e393220342e39322030203020302d2e3230342e3330366c2d2e3337322e36332d2e3139382e33333661312e32383220312e3238322030203020312d2e3331382e3336366c2d2e3035342d2e30332d2e3034382e30332d2e3035342e30365a222f3e0000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32392e3431382031372e323731682d352e33343456313668352e33343476312e3237315a6d372e3230372030682d352e33343456313668352e33343476312e3237315a6d372e3230372030682d352e33343456313668352e33343476312e3237315a6d372e3230382030682d352e33343556313668352e33343476312e3237315a6d372e3230362030682d352e33343456313668352e33343476312e3237315a6d372e32303720304836302e313156313668352e33343476312e3237315a4d32332e3734362033302e343032682d312e30325631392e343768312e30327631302e3933335a6d392e3237362d312e313331682d352e33343456323868352e33343476312e3237315a6d372e3230362030682d352e33343356323868352e33343376312e3237315a6d372e3230372030682d352e33343356323868352e33343376312e3237315a6d372e3230382030682d352e33343456323868352e33343476312e3237315a6d372e3230372030682d352e33343456323868352e33343476312e3237315a6d352e31333820312e313331682d312e30325631392e343768312e30327631302e3933335a6d2d34382e3138312031302e3333682d312e3531386c332e3139332d392e3236334832326c2d332e31393320392e3236335a6d34392e3034392d392e32363368312e3532336c332e31393320392e3236334837312e30356c2d332e3139342d392e3236335a222f3e00'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d34302e30323220342e323731682d352e333434563368352e33343476312e3237315a6d372e3230362030682d352e333433563368352e33343376312e3237315a6d372e3230372030682d352e333433563368352e33343376312e3237315a4d33342e33352031372e343032682d312e303256362e343768312e30327631302e3933335a6d32312e36322030682d312e30313956362e343768312e30327631302e3933335a4d32392e32312032382e323731682d352e33343356323768352e33343476312e3237315a6d352e313420312e313331682d312e30325631382e343768312e30327631302e3933335a6d392e3237352d312e313331682d352e33343456323768352e33343476312e3237315a6d372e3230372030682d352e33343456323768352e33343476312e3237315a6d352e31333820312e313331682d312e3031395631382e343768312e30327631302e3933335a6d392e3237362d312e313331682d352e33343456323768352e33343476312e3237315a222f3e0000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32392e34313820352e323731682d352e333434563468352e33343476312e3237315a6d372e3230372030682d352e333434563468352e33343476312e3237315a6d372e3230372030682d352e333434563468352e33343476312e3237315a6d372e3230382030682d352e333435563468352e33343476312e3237315a4d32322e34312031362e373332682d312e3531376c332e3139332d392e32363368312e3531386c2d332e31393420392e3236335a6d31302e3631322e353339682d352e33343456313668352e33343476312e3237315a222f3e3c706174682066696c6c3d22234536464635352220643d226d33382e3439342031322e3437322e3637322d312e31342d312e322d2e3531362e3235322d2e37353620312e3237322e3238382e3133322d312e333038682e3739326c2e31333220312e333220312e32362d2e332e3235322e3735362d312e3231322e3531362e36393620312e31342d2e3634382e3436382d2e3837362d312e3030382d2e38383820312e3030382d2e3633362d2e3436385a222f3e3c706174682066696c6c3d22234146463245322220643d224d35342e363320372e34363968312e3532346c332e31393420392e323633682d312e3532344c35342e36333120372e34375a4d32322e32312032392e323731682d352e33343356323868352e33343476312e3237315a6d332e3830342d2e353339682d312e3531386c332e3139342d392e32363368312e3531376c2d332e31393320392e3236335a6d31302e3631312e353339682d352e33343456323868352e33343476312e3237315a6d372e3230372030682d352e33343456323868352e33343476312e3237315a6d372e3230382030682d352e33343556323868352e33343476312e3237315a6d372e3230362030682d352e33343456323868352e33343476312e3237315a6d322e3430322d392e38303268312e3532346c332e31393320392e323633682d312e3532336c2d332e3139342d392e3236335a6d31322e30313220392e383032682d352e33343456323868352e33343476312e3237315a222f3e3c706174682066696c6c3d22234536464635352220643d226d33322e3437362032342e3437322e3637322d312e31342d312e322d2e3531362e3235322d2e37353620312e3237322e3238382e3133322d312e333038682e3739326c2e31333220312e333220312e32362d2e332e3235322e3735362d312e3231322e3531362e36393620312e31342d2e3634382e3436384c33342032332e3933326c2d2e38383820312e3030382d2e3633362d2e3436385a6d31352d34202e3637322d312e31342d312e322d2e3531362e3235322d2e37353620312e3237322e3238382e3133322d312e333038682e3739326c2e31333220312e333220312e32362d2e332e3235322e3735362d312e3231322e3531362e36393620312e31342d2e3634382e3436384c34392031392e3933326c2d2e38383820312e3030382d2e3633362d2e3436385a222f3e')
];
string[] internal hats_traits = [
"Birthday Hat",
"Bucket Hat",
"Cap",
"Chef",
"Crown",
"Cycling Cap",
"Docker Cap",
"Halo",
"Hat",
"Loading",
"Party Hat",
"Sailor",
"Snapback",
"Trapper Hat",
"Variant13",
"Wizard Hat"
];
uint[] internal hats_probability = [
3,
14,
30,
35,
36,
46,
51,
52,
68,
70,
75,
83,
93,
98,
98,
100
];
// Getter functions
function getHatsTrait(uint index) external view returns (string memory) {
return hats_traits[index];
}
function getHatsData(uint index) external view returns (bytes memory) {
return hats_data[index];
}
function getHatsProbability() external view returns (uint[] memory) {
return hats_probability;
}
function totalHats() external view returns (uint) {
return hats_traits.length;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
// Copyright (c) 2025 Berny Art
//
// This file and the associated art layers are proprietary.
// They may not be reused, copied, or sold in any form without explicit
// written permission from Berny Art.
contract FrogsMouth {
// Data for the mouth trait
bytes[] internal mouth_data = [
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d31352e3032312034382e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038362d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e3930322e3231352d2e3236322e3433362d2e3438332e3636322d2e3636332e3233312d2e3138332e3435342d2e3332342e3636382d2e3432316c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31322e3034322d312e33353361362e39313720362e3931372030203020312d2e31323320312e303935632d2e30372e33362d2e3137362e3638342d2e3331372e39373361322e30343620322e3034362030203020312d2e3532372e36393720312e31383320312e3138332030203020312d2e3737342e323634632d2e31393920302d2e33382d2e3034392d2e3534352d2e31343761312e303620312e30362030203020312d2e33382d2e34333320312e34373920312e3437392030203020312d2e34342e34313620312e30303520312e3030352030203020312d2e3533392e313532632d2e32333420302d2e34342d2e3035322d2e3631352d2e31353861312e31393220312e3139322030203020312d2e3432382d2e343531632d2e31312d2e322d2e3138362d2e3433382d2e3232392d2e37313561342e30313820342e3031382030203020312d2e3031312d2e39323620352e303220352e3032203020302031202e3232382d312e30373820322e393120322e3931203020302031202e3433342d2e383220312e383120312e3831203020302031202e3632312d2e35323720312e363920312e3639203020302031202e3830332d2e313838632e3330342030202e3535322e3034352e3734342e31333561312e3720312e37203020302031202e3437342e33316c2d2e32353220332e30383861312e3120312e31203020302030202e3030362e323634632e3031362e3036322e3033372e31312e3036352e3134612e3230382e323038203020302030202e3130352e30362e3539362e353936203020302030202e3131372e3031632e3130322030202e3139342d2e3035322e3237362d2e3135372e3038362d2e3130362e31362d2e3235322e3232332d2e343461332e343520332e3435203020302030202e31342d2e363638632e3033352d2e3236312e3035332d2e3534372e3035332d2e38353561342e35373620342e3537362030203020302d2e3130362d312e32333720322e31363920322e3136392030203020302d2e3339322d2e38363720312e36323720312e3632372030203020302d2e3637342d2e35303420322e34373320322e3437332030203020302d2e3933322d2e313634632d2e33393820302d2e3735382e30392d312e3037382e323761322e34373820322e3437382030203020302d2e3831342e37333820332e383320332e38332030203020302d2e35323820312e3133632d2e3132382e3433342d2e322e3931312d2e32313620312e34332d2e30322e3532342e3031352e3938312e31303520312e3337322e3039342e33392e3233362e3731362e3432382e3937382e3139352e3235382e34342e3435312e3733322e35382e3239372e31332e3633372e31393420312e30322e31393461332e37353720332e373537203020302030202e37352d2e303838632e3132352d2e3033322e3234322d2e3036372e3335312d2e3130362e3131342d2e3033392e3231352d2e3038322e3330352d2e3132396c2e3138382e37393161312e36373220312e3637322030203020312d2e3335322e31393420332e313620332e31362030203020312d2e34312e3134632d2e3134352e3033362d2e32392e3036312d2e3433342e3037372d2e3134342e30322d2e3238332e3032392d2e3431362e3032392d2e353720302d312e3036322d2e3039342d312e3437362d2e32383161322e36363720322e3636372030203020312d312e3032362d2e38303320332e33383820332e3338382030203020312d2e3539312d312e32363620362e333120362e33312030203020312d2e3135332d312e363831632e30322d2e3631382e3132312d312e3139382e3330352d312e373461342e37333720342e373337203020302031202e3736322d312e34313920332e35383120332e35383120302030203120312e3134382d2e39353520332e30363320332e30363320302030203120312e3435392d2e333531632e34362030202e3837372e30383820312e3234382e3236342e3337312e3137312e3638342e3431372e3933382e3733382e3235372e3331362e34352e3639372e353820312e3134322e3132382e3434362e3138352e39342e313720312e3438335a6d2d332e3931352e373637632d2e3032332e34352e3031322e3738372e31303620312e3031342e3039382e3232362e3234322e33342e3433332e3334612e36362e3636203020302030202e3238382d2e30372e37392e3739203020302030202e32382d2e323838762d2e303335612e3137312e313731203020302030202e3030372d2e30346c2e3232322d322e3632612e3932362e3932362030203020302d2e3138312d2e3031382e3838392e3838392030203020302d2e3739312e3434632d2e3138342e3239332d2e3330352e3731392d2e33363420312e3237375a6d392e3432382e37313561382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e3638352d2e3233352e3138382d2e3436332e33332d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e35363620332e3536362030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a6d322e3034352d2e333434762d2e366831302e303536762e364833342e3632315a222f3e3c706174682066696c6c3d22234146463245322220643d224d34342e3637362034382e333136762d2e366831302e303536762e364834342e3637365a6d31322e3037362e32313563302d2e35352e3034312d312e3036382e3132332d312e3535332e3038362d2e3438382e3230312d2e3933372e3334362d312e33343761372037203020302031202e3530342d312e313331632e3139352d2e33342e342d2e36342e3631352d2e39303261342e343120342e3431203020302031202e3636322d2e363633632e32332d2e3138332e3435332d2e3332342e3636382d2e3432316c2e3331362e383961332e36353420332e3635342030203020302d2e3635362e363820342e35383620342e3538362030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e3130392e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231392e3238352e3433382e3531322e3635362e36386c2d2e3331362e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e36363520342e3636352030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30383420372e3038342030203020312d2e3530342d312e31323520382e37303120382e3730312030203020312d2e3334362d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31322e3034312d312e33353361362e39323920362e3932392030203020312d2e31323320312e303935632d2e30372e33362d2e3137362e3638342d2e3331372e39373361322e30343620322e3034362030203020312d2e3532372e36393720312e31383320312e3138332030203020312d2e3737332e323634632d2e3220302d2e3338312d2e3034392d2e3534352d2e31343761312e303620312e30362030203020312d2e3338312d2e34333320312e34373920312e3437392030203020312d2e34342e34313620312e30303520312e3030352030203020312d2e3533392e313532632d2e32333420302d2e3433392d2e3035322d2e3631352d2e31353861312e313920312e31392030203020312d2e3432372d2e343531632d2e31312d2e322d2e3138362d2e3433382d2e3232392d2e37313561342e30323320342e3032332030203020312d2e3031322d2e393236632e3034332d2e3339382e31322d2e3735382e3232392d312e30373861322e393120322e3931203020302031202e3433332d2e383220312e383120312e3831203020302031202e3632312d2e353237632e3233392d2e3132362e3530362d2e3138382e3830332d2e3138382e3330352030202e3535332e3034352e3734342e3133352e3139362e30392e3335342e3139332e3437352e33316c2d2e32353220332e303838632d2e3030382e3131332d2e3030362e3230312e3030362e3236342e3031352e3036322e3033372e31312e3036342e3134612e32312e3231203020302030202e3130362e30362e3539362e353936203020302030202e3131372e3031632e3130322030202e3139332d2e3035322e3237352d2e3135372e3038362d2e3130362e31362d2e3235322e3232332d2e34342e3036332d2e3138372e31312d2e34312e31342d2e3636382e3033362d2e3236312e3035332d2e3534372e3035332d2e38353561342e35373320342e3537332030203020302d2e3130352d312e32333720322e313720322e31372030203020302d2e3339332d2e38363720312e36323720312e3632372030203020302d2e3637332d2e35303420322e34373320322e3437332030203020302d2e3933322d2e313634632d2e33393920302d2e3735382e30392d312e3037382e323761322e343820322e34382030203020302d2e3831352e37333820332e38333220332e3833322030203020302d2e35323720312e313320352e36313920352e3631392030203020302d2e32313720312e3433632d2e30322e3532342e3031362e3938312e31303620312e3337322e3039332e33392e3233362e3731362e3432372e3937382e3139362e3235382e34342e3435312e3733332e35382e3239372e31332e3633362e31393420312e30322e31393461332e37353720332e373537203020302030202e37352d2e303838632e3132342d2e3033322e3234312d2e3036372e33352d2e3130362e3131342d2e3033392e3231362d2e3038322e3330352d2e3132396c2e3138382e37393161312e36373220312e3637322030203020312d2e3335322e31393420332e31373120332e3137312030203020312d2e34312e313420332e333520332e33352030203020312d2e3433332e303737632d2e3134352e30322d2e3238342e3032392d2e3431362e3032392d2e353720302d312e3036332d2e3039342d312e3437372d2e32383161322e36363820322e3636382030203020312d312e3032352d2e38303320332e333920332e33392030203020312d2e3539322d312e32363620362e333120362e33312030203020312d2e3135322d312e363831632e30322d2e3631382e31322d312e3139382e3330342d312e373461342e37333720342e373337203020302031202e3736322d312e34313920332e353820332e353820302030203120312e3134382d2e39353520332e30363320332e30363320302030203120312e34362d2e333531632e34362030202e3837362e30383820312e3234382e3236342e33372e3137312e3638332e3431372e3933372e3733382e3235382e3331362e3435312e3639372e353820312e3134322e3132392e3434362e3138362e39342e313720312e3438335a6d2d332e3931342e373637632d2e3032332e34352e3031322e3738372e31303520312e3031342e3039382e3232362e3234332e33342e3433342e3334612e36362e3636203020302030202e3238372d2e30372e37392e3739203020302030202e3238312d2e323838762d2e303335612e3137322e313732203020302030202e3030362d2e30346c2e3232332d322e3632612e3932352e3932352030203020302d2e3138322d2e3031382e3838392e3838392030203020302d2e37392e3434632d2e3138342e3239332d2e3330352e3731392d2e33363420312e3237375a6d392e3432382e37313561382e363420382e36342030203020312d2e313320312e35323420382e33333820382e3333382030203020312d2e333520312e33333620362e37313320362e3731332030203020312d2e35323220312e313320362e31343520362e3134352030203020312d2e3632372e39313520342e37313620342e3731362030203020312d2e3638362e36383520332e313120332e31312030203020312d2e3638352e3432386c2d2e33312d2e3838632e3231342d2e3136332e34332d2e3338382e36352d2e3637332e3231382d2e3238352e3431352d2e3633372e3539312d312e3035352e3137362d2e3431382e3331392d2e3930382e3432382d312e34372e31312d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353261392e3820392e382030203020302d2e31372d312e39323220372e39323820372e3932382030203020302d2e3433332d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e35373220332e3537322030203020302d2e3633392d2e3637346c2e33312d2e383733632e3232332e3039372e3435322e32342e3638362e3432372e3233352e3138382e3436332e3431362e3638362e3638362e3232322e3236362e3433312e35372e3632372e3931342e3139392e33342e3337332e3731372e35323120312e313361382e353420382e3534203020302031202e343820322e3836762e31335a222f3e00'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d31382e3532312034382e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e3930322e3231352d2e3236322e3433362d2e3438332e3636322d2e3636332e3233312d2e3138332e3435342d2e3332342e3636382d2e3432316c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31312e3731392e333634682d342e3838762d312e33313968342e383876312e3331395a6d352e3833362d2e32333561382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e3638352d2e3233352e3138382d2e3436332e33332d2e3638362e3432386c2d2e33312d2e383861332e353620332e3536203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331382d2e3930382e3432372d312e34372e31312d2e3536332e3136352d312e3230362e3136352d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e35363620332e3536362030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a6d322e3034352d2e393434762d2e366831302e303536762e364833382e3132315a6d3020312e32762d2e366831302e303536762e364833382e3132315a222f3e3c706174682066696c6c3d22234146463245322220643d224d34382e3137362034372e373136762d2e366831302e303536762e364834382e3137365a6d3020312e32762d2e366831302e303536762e364834382e3137365a6d31322e38363120332e3831364835392e35326c332e3139332d392e32363368312e3531386c2d332e31393420392e3236335a4d37302e362034382e363661382e363520382e36352030203020312d2e313320312e35323420382e33323720382e3332372030203020312d2e333520312e33333620362e37303520362e3730352030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e39313520342e37363620342e3736362030203020312d2e3638362e36383520332e313120332e31312030203020312d2e3638352e3432386c2d2e33312d2e3838632e3231342d2e3136332e34332d2e3338382e36352d2e36373361342e373620342e3736203020302030202e3539312d312e303535632e3137362d2e3431382e3331392d2e3930382e3432382d312e34372e31312d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37313920342e3731392030203020302d2e3539312d312e303620332e35363920332e3536392030203020302d2e3633392d2e3637346c2e33312d2e383733632e3232332e3039372e3435322e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638362e3638362e3232322e3236362e3433312e35372e3632372e3931342e3139392e33342e3337332e3731372e35323120312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e0000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32322e3532312034382e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e3930322e3231352d2e3236322e3433362d2e3438332e3636322d2e3636332e3233312d2e3138332e3435342d2e3332342e3636382d2e3432316c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d362e3539322d352e30363268312e3532346c332e31393320392e323633682d312e3532336c2d332e3139342d392e3236335a6d352e38303120342e383437762d2e364834342e3937762e364833342e3931345a222f3e3c706174682066696c6c3d22234146463245322220643d224d34342e3936392034382e333136762d2e366831302e303536762e364834342e3936395a6d31322e38363120342e343136682d312e3531376c332e3139332d392e32363368312e3531376c2d332e31393320392e3236335a6d392e3536332d342e30373261382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e39313520342e37313620342e3731362030203020312d2e3638362e36383520332e313120332e31312030203020312d2e3638352e3432386c2d2e3331312d2e383861332e353320332e3533203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331392d2e3930382e3432382d312e34372e31312d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433332d312e34373720342e37323320342e3732332030203020302d2e3539322d312e303620332e35363620332e3536362030203020302d2e3633392d2e3637346c2e33312d2e383733632e3232332e3039372e3435322e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638362e3638362e3232322e3236362e3433312e35372e3632372e3931342e3139392e33342e3337332e3731372e35323120312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e000000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32322e3532312034382e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e3930322e3231352d2e3236322e3433362d2e3438332e3636322d2e3636332e3233312d2e3138332e3435342d2e3332342e3636382d2e3432316c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d362e3539322d352e30363268312e3532346c332e31393320392e323633682d312e3532336c2d332e3139342d392e3236335a6d352e38303120342e323437762d2e364834342e3937762e364833342e3931345a6d3020312e32762d2e364834342e3937762e364833342e3931345a222f3e3c706174682066696c6c3d22234146463245322220643d224d34342e3936392034372e373136762d2e366831302e303536762e364834342e3936395a6d3020312e32762d2e366831302e303536762e364834342e3936395a6d31322e38363120332e383136682d312e3531376c332e3139332d392e32363368312e3531376c2d332e31393320392e3236335a6d392e3536332d342e30373261382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e39313520342e37313620342e3731362030203020312d2e3638362e36383520332e313120332e31312030203020312d2e3638352e3432386c2d2e3331312d2e383861332e353320332e3533203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331392d2e3930382e3432382d312e34372e31312d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433332d312e34373720342e37323320342e3732332030203020302d2e3539322d312e303620332e35363620332e3536362030203020302d2e3633392d2e3637346c2e33312d2e383733632e3232332e3039372e3435322e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638362e3638362e3232322e3236362e3433312e35372e3632372e3931342e3139392e33342e3337332e3731372e35323120312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e000000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32302e3532312034382e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e3930322e3231352d2e3236322e3433362d2e3438332e3636322d2e3636332e3233312d2e3138332e3435342d2e3332342e3636382d2e3432316c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d362e3539322d352e30363268312e3532346c332e31393320392e323633682d312e3532336c2d332e3139342d392e3236335a4d33322e393134203532762d366831327636682d31325a6d31322030762d366831327636682d31325a6d31342e3830362e373332682d312e3531376c332e3139342d392e32363368312e3531376c2d332e31393320392e3236335a6d392e3536332d342e30373261382e363520382e36352030203020312d2e31323920312e35323420382e33323720382e3332372030203020312d2e33353120312e33333620362e36393820362e3639382030203020312d2e35323220312e313320362e31343520362e3134352030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e36383561332e313120332e31312030203020312d2e3638362e3432386c2d2e33312d2e383861332e353920332e3539203020302030202e36352d2e363733632e3231392d2e3238352e3431362d2e3633372e3539322d312e3035352e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433342d312e34373720342e37323320342e3732332030203020302d2e3539322d312e303620332e35363920332e3536392030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e0000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32322e3532312034382e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e3930322e3231352d2e3236322e3433362d2e3438332e3636322d2e3636332e3233312d2e3138332e3435342d2e3332342e3636382d2e3432316c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31302e3334392e31323961382e363420382e36342030203020312d2e313320312e35323420382e33333820382e3333382030203020312d2e33353120312e33333620362e37313320362e3731332030203020312d2e35323220312e313320362e31343520362e3134352030203020312d2e3632372e393135632d2e3232322e3236392d2e34352e3439382d2e3638352e36383561332e313120332e31312030203020312d2e3638362e3432386c2d2e33312d2e3838632e3231342d2e3136332e3433312d2e3338382e36352d2e3637332e3231392d2e3238352e3431362d2e3633372e3539322d312e3035352e3137362d2e3431382e3331382d2e3930382e3432382d312e34372e3130392d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353261392e3820392e382030203020302d2e31372d312e39323220372e39323820372e3932382030203020302d2e3433342d312e34373720342e37323720342e3732372030203020302d2e3539322d312e303620332e35373220332e3537322030203020302d2e3633382d2e3637346c2e33312d2e383733632e3232332e3039372e3435312e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638352e3638362e3232332e3236362e3433322e35372e3632372e3931342e322e33342e3337332e3731372e35323220312e313361382e353420382e3534203020302031202e343820322e3836762e31335a6d322e3034342d2e393434762d2e364834342e3937762e364833342e3931345a6d3020312e32762d2e364834342e3937762e364833342e3931345a222f3e3c706174682066696c6c3d22234146463245322220643d224d34342e3936392034372e373136762d2e366831302e303536762e364834342e3936395a6d3020312e32762d2e366831302e303536762e364834342e3936395a6d31322e3037362d2e33383563302d2e35352e30342d312e3036382e3132332d312e3535332e3038362d2e3438382e3230312d2e3933372e3334362d312e33343761372037203020302031202e3530342d312e313331632e3139352d2e33342e342d2e36342e3631352d2e39303261342e343120342e3431203020302031202e3636322d2e363633632e32332d2e3138332e3435332d2e3332342e3636382d2e3432316c2e3331362e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38323420372e3832342030203020302d2e34323220312e343634632d2e3130392e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231392e3238352e3433382e3531322e3635362e36386c2d2e3331362e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363720342e36372030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30383420372e3038342030203020312d2e3530342d312e31323520382e363920382e36392030203020312d2e3334362d312e33343720392e33333320392e3333332030203020312d2e3132332d312e353539762d2e3132395a6d31302e3334382e31323961382e33343820382e3334382030203020312d2e343820322e383620362e37303620362e3730362030203020312d2e35323220312e313320362e31353220362e3135322030203020312d2e3632372e39313520342e37313620342e3731362030203020312d2e3638362e36383520332e313120332e31312030203020312d2e3638352e3432386c2d2e3331312d2e383861332e353320332e3533203020302030202e36352d2e36373320342e373620342e3736203020302030202e3539322d312e303535632e3137362d2e3431382e3331392d2e3930382e3432382d312e34372e31312d2e3536332e3136342d312e3230362e3136342d312e393238762d2e31353263302d2e37322d2e3035372d312e33362d2e31372d312e39323261372e393220372e39322030203020302d2e3433332d312e34373720342e37323320342e3732332030203020302d2e3539322d312e303620332e35363620332e3536362030203020302d2e3633392d2e3637346c2e33312d2e383733632e3232332e3039372e3435322e32342e3638362e3432372e3233342e3138382e3436332e3431362e3638362e3638362e3232322e3236362e3433312e35372e3632372e3931342e3139392e33342e3337332e3731372e35323120312e313361382e353520382e3535203020302031202e343820322e3836762e31335a222f3e00'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32332e3532312034382e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e3930322e3231352d2e3236322e3433362d2e3438332e3636322d2e3636332e3233312d2e3138332e3435342d2e3332342e3636382d2e3432316c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31332e3739392d352e30363268312e3532346c332e31393320392e323633682d312e3532334c33372e33322034332e34375a4d34372e313033203530762d3368367633682d365a6d362030762d3368367633682d365a6d362030762d3368367633682d365a222f3e3c706174682066696c6c3d22234639302220643d224d36352e313033203530762d3368367633682d365a222f3e000000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d32342e3032312034382e35333163302d2e35352e3034312d312e3036382e3132332d312e3535332e3038372d2e3438382e3230322d2e3933372e3334362d312e3334372e3134352d2e3431342e3331332d2e3739312e3530342d312e3133312e3139352d2e33342e342d2e36342e3631352d2e3930322e3231352d2e3236322e3433362d2e3438332e3636322d2e3636332e3233312d2e3138332e3435342d2e3332342e3636382d2e3432316c2e3331372e383961332e36353420332e3635342030203020302d2e3635362e363820342e353920342e35392030203020302d2e35393220312e30353520372e38313620372e3831362030203020302d2e34323220312e343634632d2e31312e35362d2e31363420312e3139382d2e31363420312e393136762e3135336330202e3732332e30353520312e3336332e31363420312e3932322e31312e3535382e323520312e3034372e34323220312e3436352e3137362e3432322e3337332e3737352e35393220312e30362e3231382e3238352e3433372e3531322e3635362e36386c2d2e3331372e38373961332e32333320332e3233332030203020312d2e3636382d2e34323220342e363620342e36362030203020312d2e3636322d2e36363820362e333120362e33312030203020312d2e3631352d2e38393720372e30393320372e3039332030203020312d2e3530342d312e31323520382e37313320382e3731332030203020312d2e3334352d312e33343720392e33343420392e3334342030203020312d2e3132332d312e353539762d2e3132395a6d31332e3739392d352e30363268312e3532346c332e31393320392e323633682d312e3532334c33372e38322034332e34375a6d31322e35303420342e3132356330202e3331362d2e3034352e36312d2e3133342e38373961322e3120322e312030203020312d2e33372e36393720312e36383320312e3638332030203020312d2e3536382e343531632d2e3232332e31312d2e3436372e3136342d2e3733332e31363461322e343220322e34322030203020312d2e3438362d2e30343720322e33303120322e3330312030203020312d2e34342d2e313420322e38303920322e3830392030203020312d2e3432372d2e32343620342e3120342e312030203020312d2e3433342d2e33353220322e39303120322e3930312030203020302d2e35352d2e33363320312e32313520312e3231352030203020302d2e35342d2e31332e3631362e3631362030203020302d2e3330342e3038332e3839362e3839362030203020302d2e3236342e32312e3938332e3938332030203020302d2e3234362e36356c2d312e3035352d2e31323863302d2e3331362e3034332d2e3630352e31332d2e3836372e3038352d2e3236352e3230362d2e3439322e3336332d2e36382e31362d2e3139312e33352d2e33342e3536382d2e3434352e3232332d2e3130352e3436372d2e3135382e3733322d2e3135382e33342030202e3635332e3036362e3933382e322e3238392e3133322e3537382e3332352e3836372e35382e3139312e3136332e3337332e3238362e3534352e3336382e3137362e3038322e3335322e3132332e3532372e313233612e3538342e353834203020302030202e332d2e3038322e3836342e383634203020302030202e3234352d2e323136632e30372d2e30392e3132372d2e3139322e31372d2e33303561312e303320312e3033203020302030202e3036352d2e3335386c312e3130312e3131325a6d372e32303720306330202e3331362d2e3034352e36312d2e3133342e38373961322e3120322e312030203020312d2e33372e36393720312e36383320312e3638332030203020312d2e3536382e343531632d2e3232332e31312d2e3436372e3136342d2e3733322e3136342d2e31373220302d2e3333342d2e3031352d2e3438372d2e30343761322e33303120322e3330312030203020312d2e34342d2e313420322e38313420322e3831342030203020312d2e3432372d2e32343641342e303920342e30392030203020312035332e393420343961322e39303420322e3930342030203020302d2e3535312d2e33363320312e32313520312e3231352030203020302d2e35342d2e31332e3631362e3631362030203020302d2e3330342e3038332e392e392030203020302d2e3236342e32312e3938332e3938332030203020302d2e3234362e36356c2d312e3035352d2e31323863302d2e3331362e3034332d2e3630352e31332d2e3836372e3038352d2e3236352e3230362d2e3439322e3336332d2e36382e31362d2e3139312e33352d2e33342e3536382d2e3434352e3232332d2e3130352e3436372d2e3135382e3733322d2e3135382e33342030202e3635332e3036362e3933382e322e3238392e3133322e3537382e3332352e3836372e35382e3139312e3136332e3337332e3238362e3534352e3336382e3137362e3038322e3335322e3132332e3532372e313233612e3538332e353833203020302030202e332d2e3038322e3836332e383633203020302030202e3234352d2e323136632e30372d2e30392e3132372d2e3139322e31372d2e33303561312e303320312e3033203020302030202e3036352d2e3335386c312e3130312e3131325a6d372e32303720306330202e3331362d2e3034352e36312d2e3133352e3837392d2e3038352e32372d2e3230392e3530322d2e3336392e36393761312e36383420312e3638342030203020312d2e3536382e343531632d2e3232332e31312d2e3436372e3136342d2e3733322e31363461322e343220322e34322030203020312d2e3438372d2e30343720322e3320322e332030203020312d2e34342d2e313420322e38313320322e3831332030203020312d2e3432372d2e32343620342e303920342e30392030203020312d2e3433332d2e33353220322e39303120322e3930312030203020302d2e3535312d2e33363320312e32313520312e3231352030203020302d2e35342d2e31332e3631362e3631362030203020302d2e3330342e3038332e3839362e3839362030203020302d2e3236342e32312e3938352e3938352030203020302d2e3234362e36356c2d312e3035352d2e31323863302d2e3331362e3034342d2e3630352e31332d2e3836372e3038352d2e3236352e3230362d2e3439322e3336332d2e36382e31362d2e3139312e33352d2e33342e3536382d2e3434352e3232332d2e3130352e3436372d2e3135382e3733332d2e3135382e33342030202e3635322e3036362e3933372e322e3238392e3133322e3537382e3332352e3836372e35382e3139322e3136332e3337332e3238362e3534352e3336382e3137362e3038322e3335322e3132332e3532372e313233612e3538332e353833203020302030202e332d2e3038322e3836332e383633203020302030202e3234352d2e323136632e30372d2e30392e3132372d2e3139322e31372d2e3330352e3034332d2e3131372e3036352d2e3233372e3036352d2e3335386c312e3130312e3131325a6d372e32303720306330202e3331362d2e3034352e36312d2e3133342e3837392d2e3038362e32372d2e32312e3530322d2e33372e36393761312e36383320312e3638332030203020312d2e3536382e343531632d2e3232332e31312d2e3436372e3136342d2e3733322e31363461322e343220322e34322030203020312d2e3438372d2e30343720322e33303420322e3330342030203020312d2e34342d2e313420322e38313320322e3831332030203020312d2e3432372d2e32343620342e3120342e312030203020312d2e3433342d2e33353220322e39303120322e3930312030203020302d2e35352d2e33363320312e32313520312e3231352030203020302d2e35342d2e31332e3631362e3631362030203020302d2e3330342e3038332e3839362e3839362030203020302d2e3236342e32312e3938332e3938332030203020302d2e3234362e36356c2d312e3035352d2e31323863302d2e3331362e3034332d2e3630352e31332d2e3836372e3038352d2e3236352e3230372d2e3439322e3336332d2e36382e31362d2e3139312e33352d2e33342e3536382d2e3434352e3232332d2e3130352e3436372d2e3135382e3733332d2e3135382e33342030202e3635322e3036362e3933372e322e32392e3133322e3537382e3332352e3836372e35382e3139322e3136332e3337332e3238362e3534352e3336382e3137362e3038322e3335322e3132332e3532372e313233612e3538342e353834203020302030202e332d2e3038322e3836342e383634203020302030202e3234352d2e323136632e30372d2e30392e3132372d2e3139322e31372d2e33303561312e303320312e3033203020302030202e3036352d2e3335386c312e3130312e3131325a6d312e31303820312e31373863302d2e3436322e3036362d2e3838372e3139392d312e3237382e3133332d2e3339342e3332362d2e3733362e35382d312e3032352e3235382d2e32392e35372d2e3531362e3933382d2e363861332e31313520332e31313520302030203120312e3237312d2e323436632e3437372030202e392e30383220312e3237322e3234362e33372e3136342e3638332e33392e3933372e36382e3235382e3238392e3435332e36332e35383620312e3032352e3133332e33392e322e3831362e3220312e323738762e3132336330202e3436342d2e3036372e3839342d2e3220312e3238392d2e3133332e33392d2e3332362e37332d2e353820312e303261322e363620322e36362030203020312d2e3933382e363739632d2e33372e31362d2e3739332e32342d312e3236352e32342d2e34373720302d2e3930332d2e30382d312e3237382d2e323461322e37313820322e3731382030203020312d2e3934332d2e363820322e39373720322e3937372030203020312d2e35382d312e303220342e30313520342e3031352030203020312d2e322d312e323838762d2e3132335a6d312e3632392e3132336330202e3236352e3032352e3531352e3037362e37352e30352e32332e31332e3433332e32342e3630392e31312e3137322e32352e3330392e3432322e34312e3137362e3130322e3338372e3135322e3633332e3135322e3233382030202e3434332d2e30352e3631352d2e313532732e33312d2e3233382e3431362d2e3431632e31312d2e3137362e31392d2e3337392e32342d2e36312e3035312d2e3233342e3037362d2e3438342e3037362d2e3735762d2e31323263302d2e3235382d2e3032352d2e3530322d2e3037362d2e37333361312e393320312e39332030203020302d2e32342d2e363120312e31373920312e3137392030203020302d2e3431362d2e34313520312e32313220312e3231322030203020302d2e3632372d2e31353320312e3220312e322030203020302d2e3632312e313533632d2e3137322e3130312d2e3331332e32342d2e3432322e3431362d2e31312e3137352d2e31392e3337392d2e32342e36312d2e3035312e32332d2e3037362e3437342d2e3037362e373332762e3132335a222f3e00')
];
string[] internal mouth_traits = [
"Air Pockets",
"Chewing",
"Frog",
"Lipped",
"Open",
"Ribbit",
"Smoker",
"Tongue"
];
uint[] internal mouth_probability = [
14,
28,
42,
56,
70,
83,
87,
100
];
// Getter functions
function getMouthTrait(uint index) external view returns (string memory) {
return mouth_traits[index];
}
function getMouthData(uint index) external view returns (bytes memory) {
return mouth_data[index];
}
function getMouthProbability() external view returns (uint[] memory) {
return mouth_probability;
}
function totalMouth() external view returns (uint) {
return mouth_traits.length;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
contract FrogsOneOfOne {
// Data for the 1 of 1 traits
bytes[] internal OneOfOne_data = [
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d34342e38362034322e3636386330202e3531362d2e30383720312e3031322d2e32353820312e34383861342e30353720342e3035372030203020312d2e37323720312e32363620332e3620332e362030203020312d312e3131332e383739632d2e34332e3231382d2e3930372e3332382d312e34332e3332382d2e33363720302d2e37312d2e3033352d312e3033312d2e31303661342e33363820342e3336382030203020312d2e3931342d2e33313620362e31393620362e3139362030203020312d2e3930332d2e353136632d2e3238392d2e3230332d2e35392d2e3433372d2e3930322d2e37303361382e32373720382e3237372030203020302d2e37352d2e353520332e34383520332e3438352030203020302d2e3730332d2e33383720322e333420322e33342030203020302d2e3530342d2e31353320322e37353620322e3735362030203020302d2e3531362d2e303436632d2e32373320302d2e35332e3035382d2e3737332e31373561312e393320312e39332030203020302d2e36312e34343620322e32353220322e3235322030203020302d2e34312e36393120322e32343920322e3234392030203020302d2e3135322e3833326c2d312e35372d2e3263302d2e3531352e3038362d312e3030372e3235382d312e34373661332e3820332e38203020302031202e3732362d312e323320332e33313520332e33313520302030203120312e3130322d2e38333220332e3220332e3220302030203120312e34332d2e333137632e3335392030202e3639392e303420312e3031392e3131382e3332382e30372e3634342e3137352e39352e3331362e3330342e31342e362e3331332e38392e353136613133203133203020302031202e3930322e3638632e3230332e3137312e3339382e3332372e3538362e34363861342e3920342e39203020302030202e35352e3334632e3231322e3131372e3432372e3230372e3634352e32372e32322e3035342e3434362e3037382e36382e30372e3237332030202e3532372d2e3036332e3736322d2e31383861322e303820322e3038203020302030202e3633332d2e353034632e3137312d2e3230332e3330382d2e3434312e34312d2e3731352e3130312d2e3237332e3135322d2e3535382e3135322d2e3835356c312e35372e3231315a6d322e30313520322e32313563302d2e3931342e3133332d312e3736322e3339382d322e35343361362e30343420362e30343420302030203120312e3134392d322e303520352e31393620352e31393620302030203120312e3830352d312e3336632e37312d2e33333620312e3531312d2e35303420322e3430322d2e3530342e383938203020312e3730332e31363820322e3431342e35303461352e32383520352e32383520302030203120312e38323820312e333620362e31353220362e31353220302030203120312e31333720322e3035632e3236352e3738312e33393820312e3632392e33393820322e353433762e3235386330202e3931342d2e31333320312e3736312d2e33393820322e35343361362e31373420362e3137342030203020312d312e31333720322e30333920352e33313520352e3331352030203020312d312e38313620312e333539632d2e3731312e3332382d312e3531322e3439322d322e3430332e3439322d2e38393820302d312e3730372d2e3136342d322e3432352d2e34393261352e31393720352e3139372030203020312d312e3830352d312e333620362e30363520362e3036352030203020312d312e3134392d322e30333820372e38353320372e3835332030203020312d2e3339382d322e353433762d2e3235385a6d322e3136382e3235386330202e3632352e30373420312e3232322e32323320312e3739332e3134382e3536322e33373520312e3035382e363820312e3438382e3239362e34332e3637312e373720312e31323420312e30322e3435332e32352e39382e33373420312e3538322e3337342e353934203020312e3131342d2e31323520312e3535392d2e33373561332e333820332e333820302030203020312e3133372d312e3032632e3239372d2e3432392e35322d2e3932352e3636382d312e34383761372e313120372e3131203020302030202e3232322d312e373933762d2e32353861362e353820362e35382030203020302d2e3233342d312e373720342e36393220342e3639322030203020302d2e3636382d312e3520332e33383120332e3338312030203020302d312e3133372d312e3032632d2e3434352d2e3235372d2e3936382d2e3338362d312e35372d2e3338362d2e36303220302d312e3132352e3132392d312e35372e3338372d2e3434362e32352d2e3831372e35392d312e31313420312e303261342e353820342e35382030203020302d2e363820312e3520362e39303920362e3930392030203020302d2e32323220312e373639762e3235385a222f3e0a3c706174682066696c6c3d22234146463245322220643d224d35312e3334342034342e39333463302d2e3436312e31342d2e3835362e3432322d312e3138342e32382d2e3332382e3730372d2e34393220312e3237372d2e3439322e3536332030202e3938382e31363420312e3237372e3439322e3239372e33322e3434362e3731352e34343620312e3138342030202e34362d2e3134392e3834372d2e34343620312e31362d2e3239372e3331322d2e3732322e3436382d312e3237372e3436382d2e35363320302d2e3938382d2e3135362d312e3237372d2e34363861312e36393820312e3639382030203020312d2e3432322d312e31365a222f3e00000000'),
bytes(hex'3c706174682066696c6c3d22234146463245322220643d224d34352e3936392033352e33303963302d2e3931342e3133332d312e3736322e3339382d322e35343361362e30343320362e30343320302030203120312e3134392d322e30353120352e31393820352e31393820302030203120312e3830342d312e3336632e3731312d2e33333520312e3531322d2e35303320322e3430332d2e3530332e383938203020312e3730332e31363820322e3431342e35303361352e32383520352e32383520302030203120312e38323820312e333620362e31353620362e31353620302030203120312e31333720322e3035632e3236352e3738322e33393820312e36332e33393820322e353434762e3235376330202e3931342d2e31333320312e3736322d2e33393820322e35343361362e31373520362e3137352030203020312d312e31333720322e303420352e33313320352e3331332030203020312d312e38313720312e333539632d2e37312e3332382d312e3531312e3439322d322e3430322e3439322d2e38393820302d312e3730372d2e3136342d322e3432362d2e34393261352e31393720352e3139372030203020312d312e3830342d312e333620362e30363120362e3036312030203020312d312e3134392d322e30333920372e38353320372e3835332030203020312d2e3339382d322e353433762d2e3235375a6d322e3136382e3235376330202e3632352e30373420312e3232332e32323220312e3739332e3134392e3536332e33373520312e3035392e363820312e3438392e3239372e34332e3637322e373720312e31323520312e30322e3435332e32352e39382e33373420312e3538322e3337342e353934203020312e3131332d2e31323520312e3535392d2e3337352e3435332d2e32352e3833322d2e353920312e3133362d312e303261342e363820342e3638203020302030202e3636382d312e343838632e3134392d2e35372e3232332d312e3136382e3232332d312e373933762d2e32353763302d2e3631382d2e3037382d312e3230372d2e3233342d312e373761342e36393420342e3639342030203020302d2e3636382d312e3520332e33383120332e3338312030203020302d312e3133372d312e3032632d2e3434352d2e3235372d2e3936392d2e3338362d312e35372d2e3338362d2e36303220302d312e3132352e3132392d312e35372e3338372d2e3434362e32352d2e3831372e35392d312e31313420312e303261342e35333820342e3533382030203020302d2e363820312e3520362e39303520362e3930352030203020302d2e32323220312e373639762e3235375a222f3e0a3c706174682066696c6c3d22234146463245322220643d224d34392e3733342033352e36373663302d2e3436312e3134312d2e3835362e3432322d312e3138342e3238322d2e3332382e3730372d2e34393220312e3237382d2e3439322e3536322030202e3938382e31363420312e3237372e3439322e3239372e33322e3434352e3731352e34343520312e3138342030202e34362d2e3134382e3834372d2e34343520312e31362d2e3239372e3331322d2e3732332e3436392d312e3237372e3436392d2e35363320302d2e3938392d2e3135372d312e3237382d2e343761312e36393820312e3639382030203020312d2e3432322d312e31365a6d31322031382e32303763302d2e3931342e3133332d312e3736322e3339392d322e35343361362e30343220362e30343220302030203120312e3134382d322e303520352e31393720352e31393720302030203120312e3830352d312e3336632e37312d2e33333620312e3531322d2e35303420322e3430322d2e3530342e383939203020312e3730332e31363820322e3431342e35303461352e32383520352e32383520302030203120312e38323920312e333620362e31353220362e31353220302030203120312e31333620322e3035632e3236362e3738312e33393920312e3632392e33393920322e353433762e3235386330202e3931342d2e31333320312e3736312d2e33393920322e35343361362e31373420362e3137342030203020312d312e31333620322e30333920352e33313520352e3331352030203020312d312e38313720312e333539632d2e37312e3332382d312e3531322e3439322d322e3430322e3439322d2e38393920302d312e3730372d2e3136342d322e3432362d2e34393261352e31393820352e3139382030203020312d312e3830352d312e333620362e30363320362e3036332030203020312d312e3134382d322e30333820372e38353320372e3835332030203020312d2e3339392d322e353433762d2e3235385a6d322e3136382e3235386330202e3632352e30373520312e3232322e32323320312e3739332e3134382e3536322e33373520312e3035382e363820312e3438382e3239372e34332e3637322e373720312e31323520312e30322e3435332e32352e39382e33373420312e3538322e3337342e353934203020312e3131332d2e31323520312e3535382d2e3337352e3435332d2e32352e3833322d2e353920312e3133372d312e30322e3239372d2e3432392e35322d2e3932352e3636382d312e34383761372e313120372e3131203020302030202e3232332d312e373933762d2e32353861362e3620362e362030203020302d2e3233352d312e373720342e36393420342e3639342030203020302d2e3636382d312e3520332e33383120332e3338312030203020302d312e3133362d312e3032632d2e3434362d2e3235372d2e39372d2e3338362d312e35372d2e3338362d2e36303220302d312e3132362e3132392d312e3537312e3338372d2e3434352e32352d2e3831362e35392d312e31313320312e303261342e35313820342e3531382030203020302d2e363820312e3520362e39303920362e3930392030203020302d2e32323320312e373639762e3235385a222f3e0a3c706174682066696c6c3d22234146463245322220643d224d36352e352035342e323563302d2e34362e31342d2e3835352e3432322d312e3138342e3238312d2e3332382e3730372d2e34393220312e3237372d2e3439322e3536332030202e3938392e31363420312e3237382e3439322e3239362e33322e3434352e3731352e34343520312e3138342030202e34362d2e3134392e3834382d2e34343520312e31362d2e3239372e3331332d2e3732332e3436392d312e3237382e3436392d2e35363220302d2e3938382d2e3135362d312e3237372d2e34363961312e36393820312e3639382030203020312d2e3432322d312e31365a6d2d32322e3736362d362e33363763302d2e3931342e3133332d312e3736322e3339392d322e35343361362e30343220362e30343220302030203120312e3134382d322e303520352e31393720352e31393720302030203120312e3830352d312e3336632e37312d2e33333620312e3531322d2e35303420322e3430322d2e3530342e383939203020312e3730332e31363820322e3431342e35303461352e32383520352e32383520302030203120312e38323820312e333620362e31353220362e31353220302030203120312e31333720322e3035632e3236362e3738312e33393920312e3632392e33393920322e353433762e3235386330202e3931342d2e31333320312e3736312d2e33393920322e35343361362e31373420362e3137342030203020312d312e31333620322e30333920352e33313520352e3331352030203020312d312e38313720312e333539632d2e37312e3332382d312e3531322e3439322d322e3430322e3439322d2e38393920302d312e3730372d2e3136342d322e3432362d2e34393261352e31393820352e3139382030203020312d312e3830352d312e333620362e30363320362e3036332030203020312d312e3134382d322e30333820372e38353320372e3835332030203020312d2e3339392d322e353433762d2e3235385a6d322e3136382e3235386330202e3632352e30373520312e3232322e32323320312e3739332e3134382e3536322e33373520312e3035382e363820312e3438382e3239372e34332e3637322e373720312e31323520312e30322e3435332e32352e39382e33373420312e3538322e3337342e353933203020312e3131332d2e31323520312e3535382d2e3337352e3435332d2e32352e3833322d2e353920312e3133372d312e30322e3239372d2e3432392e35322d2e3932352e3636382d312e34383761372e313120372e3131203020302030202e3232332d312e373933762d2e32353861362e353620362e35362030203020302d2e3233352d312e373720342e36393420342e3639342030203020302d2e3636382d312e3520332e33383120332e3338312030203020302d312e3133362d312e3032632d2e3434362d2e3235372d2e39372d2e3338362d312e35372d2e3338362d2e36303220302d312e3132362e3132392d312e3537312e3338372d2e3434352e32352d2e3831362e35392d312e31313320312e303261342e35313820342e3531382030203020302d2e363820312e3520362e39303920362e3930392030203020302d2e32323320312e373639762e3235385a222f3e0a3c706174682066696c6c3d22234146463245322220643d224d34362e352034382e323563302d2e34362e31342d2e3835352e3432322d312e3138342e3238312d2e3332382e3730372d2e34393220312e3237372d2e3439322e3536332030202e3938392e31363420312e3237382e3439322e3239362e33322e3434352e3731352e34343520312e3138342030202e34362d2e3134392e3834382d2e34343520312e31362d2e3239372e3331332d2e3732332e3436392d312e3237382e3436392d2e35363220302d2e3938382d2e3135362d312e3237372d2e34363961312e36393820312e3639382030203020312d2e3432322d312e31365a6d342e32333420392e36333363302d2e3931342e3133332d312e3736322e3339392d322e35343361362e30343220362e30343220302030203120312e3134382d322e303520352e31393720352e31393720302030203120312e3830352d312e3336632e37312d2e33333620312e3531322d2e35303420322e3430322d2e3530342e383939203020312e3730332e31363820322e3431342e35303461352e32383520352e32383520302030203120312e38323820312e333620362e31353220362e31353220302030203120312e31333720322e3035632e3236362e3738312e33393920312e3632392e33393920322e353433762e3235386330202e3931342d2e31333320312e3736312d2e33393920322e35343361362e31373420362e3137342030203020312d312e31333620322e30333920352e33313520352e3331352030203020312d312e38313720312e333539632d2e37312e3332382d312e3531322e3439322d322e3430322e3439322d2e38393920302d312e3730372d2e3136342d322e3432362d2e34393261352e31393820352e3139382030203020312d312e3830352d312e333620362e30363320362e3036332030203020312d312e3134382d322e30333820372e38353320372e3835332030203020312d2e3339392d322e353433762d2e3235385a6d322e3136382e3235386330202e3632352e30373520312e3232322e32323320312e3739332e3134382e3536322e33373520312e3035382e363820312e3438382e3239372e34332e3637322e373720312e31323520312e30322e3435332e32352e39382e33373420312e3538322e3337342e353933203020312e3131332d2e31323520312e3535382d2e3337352e3435332d2e32352e3833322d2e353920312e3133372d312e30322e3239372d2e3432392e35322d2e3932352e3636382d312e34383761372e313120372e3131203020302030202e3232332d312e373933762d2e32353861362e353620362e35362030203020302d2e3233352d312e373720342e36393420342e3639342030203020302d2e3636382d312e3520332e33383120332e3338312030203020302d312e3133362d312e3032632d2e3434362d2e3235372d2e39372d2e3338362d312e35372d2e3338362d2e36303220302d312e3132362e3132392d312e3537312e3338372d2e3434352e32352d2e3831362e35392d312e31313320312e303261342e35313820342e3531382030203020302d2e363820312e3520362e39303920362e3930392030203020302d2e32323320312e373639762e3235385a222f3e0a3c706174682066696c6c3d22234146463245322220643d224d35342e352035382e323563302d2e34362e31342d2e3835352e3432322d312e3138342e3238312d2e3332382e3730372d2e34393220312e3237372d2e3439322e3536332030202e3938392e31363420312e3237382e3439322e3239362e33322e3434352e3731352e34343520312e3138342030202e34362d2e3134392e3834382d2e34343520312e31362d2e3239372e3331332d2e3732332e3436392d312e3237382e3436392d2e35363220302d2e3938382d2e3135362d312e3237372d2e34363961312e36393820312e3639382030203020312d2e3432322d312e31365a6d31302e3233342d31362e33363763302d2e3931342e3133332d312e3736322e3339392d322e35343361362e30343220362e30343220302030203120312e3134382d322e303520352e31393720352e31393720302030203120312e3830352d312e3336632e37312d2e33333620312e3531322d2e35303420322e3430322d2e3530342e383939203020312e3730332e31363820322e3431342e35303461352e32383520352e32383520302030203120312e38323920312e333620362e31353220362e31353220302030203120312e31333620322e3035632e3236362e3738312e33393920312e3632392e33393920322e353433762e3235386330202e3931342d2e31333320312e3736312d2e33393920322e35343361362e31373420362e3137342030203020312d312e31333620322e30333920352e33313520352e3331352030203020312d312e38313720312e333539632d2e37312e3332382d312e3531322e3439322d322e3430322e3439322d2e38393920302d312e3730372d2e3136342d322e3432362d2e34393261352e31393820352e3139382030203020312d312e3830352d312e333620362e30363320362e3036332030203020312d312e3134382d322e30333820372e38353320372e3835332030203020312d2e3339392d322e353433762d2e3235385a6d322e3136382e3235386330202e3632352e30373520312e3232322e32323320312e3739332e3134382e3536322e33373520312e3035382e363820312e3438382e3239372e34332e3637322e373720312e31323520312e30322e3435332e32352e39382e33373420312e3538322e3337342e353934203020312e3131332d2e31323520312e3535382d2e3337352e3435332d2e32352e3833322d2e353920312e3133372d312e30322e3239372d2e3432392e35322d2e3932352e3636382d312e34383761372e313120372e3131203020302030202e3232332d312e373933762d2e32353861362e3620362e362030203020302d2e3233352d312e373720342e36393420342e3639342030203020302d2e3636382d312e3520332e33383120332e3338312030203020302d312e3133362d312e3032632d2e3434362d2e3235372d2e39372d2e3338362d312e35372d2e3338362d2e36303220302d312e3132362e3132392d312e3537312e3338372d2e3434352e32352d2e3831362e35392d312e31313320312e303261342e35313820342e3531382030203020302d2e363820312e3520362e39303920362e3930392030203020302d2e32323320312e373639762e3235385a222f3e0a3c706174682066696c6c3d22234146463245322220643d224d36382e352034322e323563302d2e34362e31342d2e3835352e3432322d312e3138342e3238312d2e3332382e3730372d2e34393220312e3237372d2e3439322e3536332030202e3938392e31363420312e3237382e3439322e3239362e33322e3434352e3731352e34343520312e3138342030202e34362d2e3134392e3834382d2e34343520312e31362d2e3239372e3331332d2e3732332e3436392d312e3237382e3436392d2e35363220302d2e3938382d2e3135362d312e3237372d2e34363961312e36393820312e3639382030203020312d2e3432322d312e31365a4d35362e3733342033312e38383363302d2e3931342e3133332d312e3736322e3339392d322e35343361362e30343220362e30343220302030203120312e3134382d322e303520352e31393720352e31393720302030203120312e3830352d312e3336632e37312d2e33333620312e3531322d2e35303420322e3430322d2e3530342e383939203020312e3730332e31363820322e3431342e35303461352e32383520352e32383520302030203120312e38323920312e333620362e31353220362e31353220302030203120312e31333620322e3035632e3236362e3738312e33393920312e3632392e33393920322e353433762e3235386330202e3931342d2e31333320312e3736312d2e33393920322e35343361362e31373420362e3137342030203020312d312e31333620322e30333920352e33313520352e3331352030203020312d312e38313720312e333539632d2e37312e3332382d312e3531322e3439322d322e3430322e3439322d2e38393920302d312e3730372d2e3136342d322e3432362d2e34393261352e31393820352e3139382030203020312d312e3830352d312e333620362e30363320362e3036332030203020312d312e3134382d322e30333820372e38353320372e3835332030203020312d2e3339392d322e353433762d2e3235385a6d322e3136382e3235386330202e3632352e30373520312e3232322e32323320312e3739332e3134382e3536322e33373520312e3035382e363820312e3438382e3239372e34332e3637322e373720312e31323520312e30322e3435332e32352e39382e33373420312e3538322e3337342e353933203020312e3131332d2e31323520312e3535382d2e3337352e3435332d2e32352e3833322d2e353920312e3133372d312e30322e3239372d2e3432392e35322d2e3932352e3636382d312e34383761372e313120372e3131203020302030202e3232332d312e373933762d2e32353861362e3620362e362030203020302d2e3233352d312e373720342e36393420342e3639342030203020302d2e3636382d312e3520332e33383120332e3338312030203020302d312e3133362d312e3032632d2e3434362d2e3235372d2e39372d2e3338362d312e35372d2e3338362d2e36303220302d312e3132362e3132392d312e3537312e3338372d2e3434352e32352d2e3831362e35392d312e31313320312e303261342e35313820342e3531382030203020302d2e363820312e3520362e39303920362e3930392030203020302d2e32323320312e373639762e3235385a222f3e0a3c706174682066696c6c3d22234146463245322220643d224d36302e352033322e323563302d2e34362e31342d2e3835352e3432322d312e3138342e3238312d2e3332382e3730372d2e34393220312e3237372d2e3439322e3536332030202e3938392e31363420312e3237382e3439322e3239362e33322e3434352e3731352e34343520312e3138342030202e34362d2e3134392e3834382d2e34343520312e31362d2e3239372e3331332d2e3732332e3436392d312e3237382e3436392d2e35363220302d2e3938382d2e3135362d312e3237372d2e34363961312e36393820312e3639382030203020312d2e3432322d312e31365a6d2d362e3736362031322e36333363302d2e3931342e3133332d312e3736322e3339392d322e35343361362e30343220362e30343220302030203120312e3134382d322e303520352e31393720352e31393720302030203120312e3830352d312e3336632e37312d2e33333620312e3531322d2e35303420322e3430322d2e3530342e383939203020312e3730332e31363820322e3431342e35303461352e32383520352e32383520302030203120312e38323820312e333620362e31353220362e31353220302030203120312e31333720322e3035632e3236362e3738312e33393920312e3632392e33393920322e353433762e3235386330202e3931342d2e31333320312e3736312d2e33393920322e35343361362e31373420362e3137342030203020312d312e31333720322e30333920352e33313520352e3331352030203020312d312e38313620312e333539632d2e37312e3332382d312e3531322e3439322d322e3430322e3439322d2e38393920302d312e3730372d2e3136342d322e3432362d2e34393261352e31393820352e3139382030203020312d312e3830352d312e333620362e30363320362e3036332030203020312d312e3134382d322e30333820372e38353320372e3835332030203020312d2e3339392d322e353433762d2e3235385a6d322e3136382e3235386330202e3632352e30373520312e3232322e32323320312e3739332e3134382e3536322e33373520312e3035382e363820312e3438382e3239372e34332e3637322e373720312e31323520312e30322e3435332e32352e39382e33373420312e3538322e3337342e353933203020312e3131332d2e31323520312e3535382d2e3337352e3435332d2e32352e3833322d2e353920312e3133372d312e30322e3239372d2e3432392e35322d2e3932352e3636382d312e34383761372e313120372e3131203020302030202e3232332d312e373933762d2e32353861362e353620362e35362030203020302d2e3233352d312e373720342e36393420342e3639342030203020302d2e3636382d312e3520332e33383120332e3338312030203020302d312e3133362d312e3032632d2e3434362d2e3235372d2e39372d2e3338362d312e35372d2e3338362d2e36303220302d312e3132362e3132392d312e3537312e3338372d2e3434352e32352d2e3831362e35392d312e31313320312e303261342e35313820342e3531382030203020302d2e363820312e3520362e39303920362e3930392030203020302d2e32323320312e373639762e3235385a222f3e0a3c706174682066696c6c3d22234146463245322220643d224d35372e352034352e323563302d2e34362e31342d2e3835352e3432322d312e3138342e3238312d2e3332382e3730372d2e34393220312e3237372d2e3439322e3536332030202e3938392e31363420312e3237382e3439322e3239362e33322e3434352e3731352e34343520312e3138342030202e34362d2e3134392e3834382d2e34343520312e31362d2e3239372e3331332d2e3732332e3436392d312e3237382e3436392d2e35363220302d2e3938382d2e3135362d312e3237372d2e34363961312e36393820312e3639382030203020312d2e3432322d312e31365a6d2d32352e3736362e36333363302d2e3931342e3133332d312e3736322e3339392d322e35343361362e30343220362e30343220302030203120312e3134382d322e303520352e31393720352e31393720302030203120312e3830352d312e3336632e37312d2e33333620312e3531322d2e35303420322e3430322d2e3530342e383939203020312e3730332e31363820322e3431342e35303461352e32383520352e32383520302030203120312e38323820312e333620362e31353220362e31353220302030203120312e31333720322e3035632e3236362e3738312e33393920312e3632392e33393920322e353433762e3235386330202e3931342d2e31333320312e3736312d2e33393920322e35343361362e31373420362e3137342030203020312d312e31333620322e30333920352e33313520352e3331352030203020312d312e38313720312e333539632d2e37312e3332382d312e3531322e3439322d322e3430322e3439322d2e38393920302d312e3730372d2e3136342d322e3432362d2e34393261352e31393820352e3139382030203020312d312e3830352d312e333620362e30363320362e3036332030203020312d312e3134382d322e30333820372e38353320372e3835332030203020312d2e3339392d322e353433762d2e3235385a6d322e3136382e3235386330202e3632352e30373520312e3232322e32323320312e3739332e3134382e3536322e33373520312e3035382e363820312e3438382e3239372e34332e3637322e373720312e31323520312e30322e3435332e32352e39382e33373420312e3538322e3337342e353933203020312e3131332d2e31323520312e3535382d2e3337352e3435332d2e32352e3833322d2e353920312e3133372d312e30322e3239372d2e3432392e35322d2e3932352e3636382d312e34383761372e313120372e3131203020302030202e3232332d312e373933762d2e32353861362e353620362e35362030203020302d2e3233352d312e373720342e36393420342e3639342030203020302d2e3636382d312e3520332e33383120332e3338312030203020302d312e3133362d312e3032632d2e3434362d2e3235372d2e39372d2e3338362d312e35372d2e3338362d2e36303220302d312e3132362e3132392d312e3537312e3338372d2e3434352e32352d2e3831362e35392d312e31313320312e303261342e35313820342e3531382030203020302d2e363820312e3520362e39303920362e3930392030203020302d2e32323320312e373639762e3235385a222f3e0a3c706174682066696c6c3d22234146463245322220643d224d33352e352034362e323563302d2e34362e31342d2e3835352e3432322d312e3138342e3238312d2e3332382e3730372d2e34393220312e3237372d2e3439322e3536332030202e3938392e31363420312e3237382e3439322e3239362e33322e3434352e3731352e34343520312e3138342030202e34362d2e3134392e3834382d2e34343520312e31362d2e3239372e3331332d2e3732332e3436392d312e3237382e3436392d2e35363220302d2e3938382d2e3135362d312e3237372d2e34363961312e36393820312e3639382030203020312d2e3432322d312e31365a6d2d31332e3736362d372e33363763302d2e3931342e3133332d312e3736322e3339392d322e35343361362e30343220362e30343220302030203120312e3134382d322e303520352e31393720352e31393720302030203120312e3830352d312e3336632e37312d2e33333620312e3531322d2e35303420322e3430322d2e3530342e383939203020312e3730332e31363820322e3431342e35303461352e32383520352e32383520302030203120312e38323820312e333620362e31353220362e31353220302030203120312e31333720322e3035632e3236362e3738312e33393920312e3632392e33393920322e353433762e3235386330202e3931342d2e31333320312e3736312d2e33393920322e35343361362e31373420362e3137342030203020312d312e31333620322e30333920352e33313520352e3331352030203020312d312e38313720312e333539632d2e37312e3332382d312e3531322e3439322d322e3430322e3439322d2e38393920302d312e3730372d2e3136342d322e3432362d2e34393261352e31393820352e3139382030203020312d312e3830352d312e333620362e30363320362e3036332030203020312d312e3134382d322e30333820372e38353320372e3835332030203020312d2e3339392d322e353433762d2e3235385a6d322e3136382e3235386330202e3632352e30373520312e3232322e32323320312e3739332e3134382e3536322e33373520312e3035382e363820312e3438382e3239372e34332e3637322e373720312e31323520312e30322e3435332e32352e39382e33373420312e3538322e3337342e353933203020312e3131332d2e31323520312e3535382d2e3337352e3435332d2e32352e3833322d2e353920312e3133372d312e30322e3239372d2e3432392e35322d2e3932352e3636382d312e34383761372e313120372e3131203020302030202e3232332d312e373933762d2e32353861362e353620362e35362030203020302d2e3233352d312e373720342e36393420342e3639342030203020302d2e3636382d312e3520332e33383120332e3338312030203020302d312e3133362d312e3032632d2e3434362d2e3235372d2e39372d2e3338362d312e35372d2e3338362d2e36303220302d312e3132362e3132392d312e3537312e3338372d2e3434352e32352d2e3831362e35392d312e31313320312e303261342e35313820342e3531382030203020302d2e363820312e3520362e39303920362e3930392030203020302d2e32323320312e373639762e3235385a222f3e0a3c706174682066696c6c3d22234146463245322220643d224d32352e352033392e323563302d2e34362e31342d2e3835352e3432322d312e3138342e3238312d2e3332382e3730372d2e34393220312e3237372d2e3439322e3536332030202e3938382e31363420312e3237382e3439322e3239362e33322e3434352e3731352e34343520312e3138342030202e34362d2e3134392e3834382d2e34343520312e31362d2e3239372e3331332d2e3732332e3436392d312e3237382e3436392d2e35363220302d2e3938382d2e3135362d312e3237372d2e34363961312e36393820312e3639382030203020312d2e3432322d312e31365a6d2d31312e37363620392e36333363302d2e3931342e3133332d312e3736322e3339392d322e35343361362e30343220362e30343220302030203120312e3134382d322e303520352e31393720352e31393720302030203120312e3830352d312e3336632e37312d2e33333620312e3531322d2e35303420322e3430322d2e3530342e383939203020312e3730332e31363820322e3431342e35303461352e32383520352e32383520302030203120312e38323820312e333620362e31353220362e31353220302030203120312e31333720322e3035632e3236362e3738312e33393920312e3632392e33393920322e353433762e3235386330202e3931342d2e31333320312e3736312d2e33393920322e35343361362e31373420362e3137342030203020312d312e31333720322e30333920352e33313520352e3331352030203020312d312e38313620312e333539632d2e37312e3332382d312e3531322e3439322d322e3430322e3439322d2e38393920302d312e3730372d2e3136342d322e3432362d2e34393261352e31393820352e3139382030203020312d312e3830352d312e333620362e30363320362e3036332030203020312d312e3134382d322e30333820372e38353320372e3835332030203020312d2e3339392d322e353433762d2e3235385a6d322e3136382e3235386330202e3632352e30373520312e3232322e32323320312e3739332e3134382e3536322e33373520312e3035382e363820312e3438382e3239372e34332e3637322e373720312e31323520312e30322e3435332e32352e39382e33373420312e3538322e3337342e353933203020312e3131332d2e31323520312e3535382d2e3337352e3435332d2e32352e3833322d2e353920312e3133372d312e30322e3239372d2e3432392e35322d2e3932352e3636382d312e34383761372e313120372e3131203020302030202e3232332d312e373933762d2e32353861362e353620362e35362030203020302d2e3233352d312e373720342e36393420342e3639342030203020302d2e3636382d312e3520332e33383120332e3338312030203020302d312e3133362d312e3032632d2e3434362d2e3235372d2e39372d2e3338362d312e35372d2e3338362d2e36303220302d312e3132362e3132392d312e3537312e3338372d2e3434352e32352d2e3831362e35392d312e31313320312e303261342e35313820342e3531382030203020302d2e363820312e3520362e39303920362e3930392030203020302d2e32323320312e373639762e3235385a222f3e0a3c706174682066696c6c3d22234146463245322220643d224d31372e352034392e323563302d2e34362e31342d2e3835352e3432322d312e3138342e3238312d2e3332382e3730372d2e34393220312e3237372d2e3439322e3536332030202e3938382e31363420312e3237382e3439322e3239362e33322e3434352e3731352e34343520312e3138342030202e34362d2e3134392e3834382d2e34343520312e31362d2e3239372e3331332d2e3732332e3436392d312e3237382e3436392d2e35363220302d2e3938382d2e3135362d312e3237372d2e34363961312e36393820312e3639382030203020312d2e3432322d312e31365a6d362e32333420362e36333363302d2e3931342e3133332d312e3736322e3339392d322e35343361362e30343220362e30343220302030203120312e3134382d322e303520352e31393720352e31393720302030203120312e3830352d312e3336632e37312d2e33333620312e3531322d2e35303420322e3430322d2e3530342e383939203020312e3730332e31363820322e3431342e35303461352e32383520352e32383520302030203120312e38323820312e333620362e31353220362e31353220302030203120312e31333720322e3035632e3236362e3738312e33393920312e3632392e33393920322e353433762e3235386330202e3931342d2e31333320312e3736312d2e33393920322e35343361362e31373420362e3137342030203020312d312e31333620322e30333920352e33313520352e3331352030203020312d312e38313720312e333539632d2e37312e3332382d312e3531322e3439322d322e3430322e3439322d2e38393920302d312e3730372d2e3136342d322e3432362d2e34393261352e31393820352e3139382030203020312d312e3830352d312e333620362e30363320362e3036332030203020312d312e3134382d322e30333820372e38353320372e3835332030203020312d2e3339392d322e353433762d2e3235385a6d322e3136382e3235386330202e3632352e30373520312e3232322e32323320312e3739332e3134382e3536322e33373520312e3035382e363820312e3438382e3239372e34332e3637322e373720312e31323520312e30322e3435332e32352e39382e33373420312e3538322e3337342e353933203020312e3131332d2e31323520312e3535382d2e3337352e3435332d2e32352e3833322d2e353920312e3133372d312e30322e3239372d2e3432392e35322d2e3932352e3636382d312e34383761372e313120372e3131203020302030202e3232332d312e373933762d2e32353861362e353620362e35362030203020302d2e3233352d312e373720342e36393420342e3639342030203020302d2e3636382d312e3520332e33383120332e3338312030203020302d312e3133362d312e3032632d2e3434362d2e3235372d2e39372d2e3338362d312e35372d2e3338362d2e36303220302d312e3132362e3132392d312e3537312e3338372d2e3434352e32352d2e3831362e35392d312e31313320312e303261342e35313820342e3531382030203020302d2e363820312e3520362e39303920362e3930392030203020302d2e32323320312e373639762e3235385a222f3e0a3c706174682066696c6c3d22234146463245322220643d224d32372e352035362e323563302d2e34362e31342d2e3835352e3432322d312e3138342e3238312d2e3332382e3730372d2e34393220312e3237372d2e3439322e3536332030202e3938382e31363420312e3237382e3439322e3239362e33322e3434352e3731352e34343520312e3138342030202e34362d2e3134392e3834382d2e34343520312e31362d2e3239372e3331332d2e3732332e3436392d312e3237382e3436392d2e35363220302d2e3938382d2e3135362d312e3237372d2e34363961312e36393820312e3639382030203020312d2e3432322d312e31365a222f3e00000000')
];
string[] internal OneOfOne_traits = [
"Tadpole",
"Frogspawn"
];
// Getter functions
function getOneOfOneTrait(uint index) external view returns (string memory) {
return OneOfOne_traits[index];
}
function getOneOfOneData(uint index) external view returns (bytes memory) {
return OneOfOne_data[index];
}
function totalOneOfOne() external view returns (uint) {
return OneOfOne_traits.length;
}
}// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.3.0
// Creator: Chiru Labs
pragma solidity ^0.8.4;
import './IERC721A.sol';
/**
* @dev Interface of ERC721 token receiver.
*/
interface ERC721A__IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
/**
* @title ERC721A
*
* @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
* Non-Fungible Token Standard, including the Metadata extension.
* Optimized for lower gas during batch mints.
*
* Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
* starting from `_startTokenId()`.
*
* The `_sequentialUpTo()` function can be overriden to enable spot mints
* (i.e. non-consecutive mints) for `tokenId`s greater than `_sequentialUpTo()`.
*
* Assumptions:
*
* - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
* - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
*/
contract ERC721A is IERC721A {
// Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
struct TokenApprovalRef {
address value;
}
// =============================================================
// CONSTANTS
// =============================================================
// Mask of an entry in packed address data.
uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;
// The bit position of `numberMinted` in packed address data.
uint256 private constant _BITPOS_NUMBER_MINTED = 64;
// The bit position of `numberBurned` in packed address data.
uint256 private constant _BITPOS_NUMBER_BURNED = 128;
// The bit position of `aux` in packed address data.
uint256 private constant _BITPOS_AUX = 192;
// Mask of all 256 bits in packed address data except the 64 bits for `aux`.
uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;
// The bit position of `startTimestamp` in packed ownership.
uint256 private constant _BITPOS_START_TIMESTAMP = 160;
// The bit mask of the `burned` bit in packed ownership.
uint256 private constant _BITMASK_BURNED = 1 << 224;
// The bit position of the `nextInitialized` bit in packed ownership.
uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;
// The bit mask of the `nextInitialized` bit in packed ownership.
uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;
// The bit position of `extraData` in packed ownership.
uint256 private constant _BITPOS_EXTRA_DATA = 232;
// Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;
// The mask of the lower 160 bits for addresses.
uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;
// The maximum `quantity` that can be minted with {_mintERC2309}.
// This limit is to prevent overflows on the address data entries.
// For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
// is required to cause an overflow, which is unrealistic.
uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;
// The `Transfer` event signature is given by:
// `keccak256(bytes("Transfer(address,address,uint256)"))`.
bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;
// =============================================================
// STORAGE
// =============================================================
// The next token ID to be minted.
uint256 private _currentIndex;
// The number of tokens burned.
uint256 private _burnCounter;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to ownership details
// An empty struct value does not necessarily mean the token is unowned.
// See {_packedOwnershipOf} implementation for details.
//
// Bits Layout:
// - [0..159] `addr`
// - [160..223] `startTimestamp`
// - [224] `burned`
// - [225] `nextInitialized`
// - [232..255] `extraData`
mapping(uint256 => uint256) private _packedOwnerships;
// Mapping owner address to address data.
//
// Bits Layout:
// - [0..63] `balance`
// - [64..127] `numberMinted`
// - [128..191] `numberBurned`
// - [192..255] `aux`
mapping(address => uint256) private _packedAddressData;
// Mapping from token ID to approved address.
mapping(uint256 => TokenApprovalRef) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
// The amount of tokens minted above `_sequentialUpTo()`.
// We call these spot mints (i.e. non-sequential mints).
uint256 private _spotMinted;
// =============================================================
// CONSTRUCTOR
// =============================================================
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_currentIndex = _startTokenId();
if (_sequentialUpTo() < _startTokenId()) _revert(SequentialUpToTooSmall.selector);
}
// =============================================================
// TOKEN COUNTING OPERATIONS
// =============================================================
/**
* @dev Returns the starting token ID for sequential mints.
*
* Override this function to change the starting token ID for sequential mints.
*
* Note: The value returned must never change after any tokens have been minted.
*/
function _startTokenId() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev Returns the maximum token ID (inclusive) for sequential mints.
*
* Override this function to return a value less than 2**256 - 1,
* but greater than `_startTokenId()`, to enable spot (non-sequential) mints.
*
* Note: The value returned must never change after any tokens have been minted.
*/
function _sequentialUpTo() internal view virtual returns (uint256) {
return type(uint256).max;
}
/**
* @dev Returns the next token ID to be minted.
*/
function _nextTokenId() internal view virtual returns (uint256) {
return _currentIndex;
}
/**
* @dev Returns the total number of tokens in existence.
* Burned tokens will reduce the count.
* To get the total number of tokens minted, please see {_totalMinted}.
*/
function totalSupply() public view virtual override returns (uint256 result) {
// Counter underflow is impossible as `_burnCounter` cannot be incremented
// more than `_currentIndex + _spotMinted - _startTokenId()` times.
unchecked {
// With spot minting, the intermediate `result` can be temporarily negative,
// and the computation must be unchecked.
result = _currentIndex - _burnCounter - _startTokenId();
if (_sequentialUpTo() != type(uint256).max) result += _spotMinted;
}
}
/**
* @dev Returns the total amount of tokens minted in the contract.
*/
function _totalMinted() internal view virtual returns (uint256 result) {
// Counter underflow is impossible as `_currentIndex` does not decrement,
// and it is initialized to `_startTokenId()`.
unchecked {
result = _currentIndex - _startTokenId();
if (_sequentialUpTo() != type(uint256).max) result += _spotMinted;
}
}
/**
* @dev Returns the total number of tokens burned.
*/
function _totalBurned() internal view virtual returns (uint256) {
return _burnCounter;
}
/**
* @dev Returns the total number of tokens that are spot-minted.
*/
function _totalSpotMinted() internal view virtual returns (uint256) {
return _spotMinted;
}
// =============================================================
// ADDRESS DATA OPERATIONS
// =============================================================
/**
* @dev Returns the number of tokens in `owner`'s account.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
if (owner == address(0)) _revert(BalanceQueryForZeroAddress.selector);
return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the number of tokens minted by `owner`.
*/
function _numberMinted(address owner) internal view returns (uint256) {
return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the number of tokens burned by or on behalf of `owner`.
*/
function _numberBurned(address owner) internal view returns (uint256) {
return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
}
/**
* Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
*/
function _getAux(address owner) internal view returns (uint64) {
return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
}
/**
* Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
* If there are multiple variables, please pack them into a uint64.
*/
function _setAux(address owner, uint64 aux) internal virtual {
uint256 packed = _packedAddressData[owner];
uint256 auxCasted;
// Cast `aux` with assembly to avoid redundant masking.
assembly {
auxCasted := aux
}
packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
_packedAddressData[owner] = packed;
}
// =============================================================
// IERC165
// =============================================================
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
* to learn more about how these ids are created.
*
* This function call must use less than 30000 gas.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
// The interface IDs are constants representing the first 4 bytes
// of the XOR of all function selectors in the interface.
// See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
// (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
return
interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
}
// =============================================================
// IERC721Metadata
// =============================================================
/**
* @dev Returns the token collection name.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the token collection symbol.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
if (!_exists(tokenId)) _revert(URIQueryForNonexistentToken.selector);
string memory baseURI = _baseURI();
return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, it can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return '';
}
// =============================================================
// OWNERSHIPS OPERATIONS
// =============================================================
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
return address(uint160(_packedOwnershipOf(tokenId)));
}
/**
* @dev Gas spent here starts off proportional to the maximum mint batch size.
* It gradually moves to O(1) as tokens get transferred around over time.
*/
function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnershipOf(tokenId));
}
/**
* @dev Returns the unpacked `TokenOwnership` struct at `index`.
*/
function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
return _unpackedOwnership(_packedOwnerships[index]);
}
/**
* @dev Returns whether the ownership slot at `index` is initialized.
* An uninitialized slot does not necessarily mean that the slot has no owner.
*/
function _ownershipIsInitialized(uint256 index) internal view virtual returns (bool) {
return _packedOwnerships[index] != 0;
}
/**
* @dev Initializes the ownership slot minted at `index` for efficiency purposes.
*/
function _initializeOwnershipAt(uint256 index) internal virtual {
if (_packedOwnerships[index] == 0) {
_packedOwnerships[index] = _packedOwnershipOf(index);
}
}
/**
* @dev Returns the packed ownership data of `tokenId`.
*/
function _packedOwnershipOf(uint256 tokenId) private view returns (uint256 packed) {
if (_startTokenId() <= tokenId) {
packed = _packedOwnerships[tokenId];
if (tokenId > _sequentialUpTo()) {
if (_packedOwnershipExists(packed)) return packed;
_revert(OwnerQueryForNonexistentToken.selector);
}
// If the data at the starting slot does not exist, start the scan.
if (packed == 0) {
if (tokenId >= _currentIndex) _revert(OwnerQueryForNonexistentToken.selector);
// Invariant:
// There will always be an initialized ownership slot
// (i.e. `ownership.addr != address(0) && ownership.burned == false`)
// before an unintialized ownership slot
// (i.e. `ownership.addr == address(0) && ownership.burned == false`)
// Hence, `tokenId` will not underflow.
//
// We can directly compare the packed value.
// If the address is zero, packed will be zero.
for (;;) {
unchecked {
packed = _packedOwnerships[--tokenId];
}
if (packed == 0) continue;
if (packed & _BITMASK_BURNED == 0) return packed;
// Otherwise, the token is burned, and we must revert.
// This handles the case of batch burned tokens, where only the burned bit
// of the starting slot is set, and remaining slots are left uninitialized.
_revert(OwnerQueryForNonexistentToken.selector);
}
}
// Otherwise, the data exists and we can skip the scan.
// This is possible because we have already achieved the target condition.
// This saves 2143 gas on transfers of initialized tokens.
// If the token is not burned, return `packed`. Otherwise, revert.
if (packed & _BITMASK_BURNED == 0) return packed;
}
_revert(OwnerQueryForNonexistentToken.selector);
}
/**
* @dev Returns the unpacked `TokenOwnership` struct from `packed`.
*/
function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
ownership.addr = address(uint160(packed));
ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
ownership.burned = packed & _BITMASK_BURNED != 0;
ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
}
/**
* @dev Packs ownership data into a single uint256.
*/
function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
assembly {
// Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
owner := and(owner, _BITMASK_ADDRESS)
// `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
}
}
/**
* @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
*/
function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
// For branchless setting of the `nextInitialized` flag.
assembly {
// `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
}
}
// =============================================================
// APPROVAL OPERATIONS
// =============================================================
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
*/
function approve(address to, uint256 tokenId) public payable virtual override {
_approve(to, tokenId, true);
}
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
if (!_exists(tokenId)) _revert(ApprovalQueryForNonexistentToken.selector);
return _tokenApprovals[tokenId].value;
}
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom}
* for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_operatorApprovals[_msgSenderERC721A()][operator] = approved;
emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
}
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted. See {_mint}.
*/
function _exists(uint256 tokenId) internal view virtual returns (bool result) {
if (_startTokenId() <= tokenId) {
if (tokenId > _sequentialUpTo()) return _packedOwnershipExists(_packedOwnerships[tokenId]);
if (tokenId < _currentIndex) {
uint256 packed;
while ((packed = _packedOwnerships[tokenId]) == 0) --tokenId;
result = packed & _BITMASK_BURNED == 0;
}
}
}
/**
* @dev Returns whether `packed` represents a token that exists.
*/
function _packedOwnershipExists(uint256 packed) private pure returns (bool result) {
assembly {
// The following is equivalent to `owner != address(0) && burned == false`.
// Symbolically tested.
result := gt(and(packed, _BITMASK_ADDRESS), and(packed, _BITMASK_BURNED))
}
}
/**
* @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
*/
function _isSenderApprovedOrOwner(
address approvedAddress,
address owner,
address msgSender
) private pure returns (bool result) {
assembly {
// Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
owner := and(owner, _BITMASK_ADDRESS)
// Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
msgSender := and(msgSender, _BITMASK_ADDRESS)
// `msgSender == owner || msgSender == approvedAddress`.
result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
}
}
/**
* @dev Returns the storage slot and value for the approved address of `tokenId`.
*/
function _getApprovedSlotAndAddress(uint256 tokenId)
private
view
returns (uint256 approvedAddressSlot, address approvedAddress)
{
TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
// The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
assembly {
approvedAddressSlot := tokenApproval.slot
approvedAddress := sload(approvedAddressSlot)
}
}
// =============================================================
// TRANSFER OPERATIONS
// =============================================================
/**
* @dev Transfers `tokenId` from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token
* by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public payable virtual override {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
// Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
from = address(uint160(uint256(uint160(from)) & _BITMASK_ADDRESS));
if (address(uint160(prevOwnershipPacked)) != from) _revert(TransferFromIncorrectOwner.selector);
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
// The nested ifs save around 20+ gas over a compound boolean condition.
if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
if (!isApprovedForAll(from, _msgSenderERC721A())) _revert(TransferCallerNotOwnerNorApproved.selector);
_beforeTokenTransfers(from, to, tokenId, 1);
// Clear approvals from the previous owner.
assembly {
if approvedAddress {
// This is equivalent to `delete _tokenApprovals[tokenId]`.
sstore(approvedAddressSlot, 0)
}
}
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
unchecked {
// We can directly increment and decrement the balances.
--_packedAddressData[from]; // Updates: `balance -= 1`.
++_packedAddressData[to]; // Updates: `balance += 1`.
// Updates:
// - `address` to the next owner.
// - `startTimestamp` to the timestamp of transfering.
// - `burned` to `false`.
// - `nextInitialized` to `true`.
_packedOwnerships[tokenId] = _packOwnershipData(
to,
_BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
);
// If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
uint256 nextTokenId = tokenId + 1;
// If the next slot's address is zero and not burned (i.e. packed value is zero).
if (_packedOwnerships[nextTokenId] == 0) {
// If the next slot is within bounds.
if (nextTokenId != _currentIndex) {
// Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
_packedOwnerships[nextTokenId] = prevOwnershipPacked;
}
}
}
}
// Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS;
assembly {
// Emit the `Transfer` event.
log4(
0, // Start of data (0, since no data).
0, // End of data (0, since no data).
_TRANSFER_EVENT_SIGNATURE, // Signature.
from, // `from`.
toMasked, // `to`.
tokenId // `tokenId`.
)
}
if (toMasked == 0) _revert(TransferToZeroAddress.selector);
_afterTokenTransfers(from, to, tokenId, 1);
}
/**
* @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public payable virtual override {
safeTransferFrom(from, to, tokenId, '');
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token
* by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement
* {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public payable virtual override {
transferFrom(from, to, tokenId);
if (to.code.length != 0)
if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
_revert(TransferToNonERC721ReceiverImplementer.selector);
}
}
/**
* @dev Hook that is called before a set of serially-ordered token IDs
* are about to be transferred. This includes minting.
* And also called before burning one token.
*
* `startTokenId` - the first token ID to be transferred.
* `quantity` - the amount to be transferred.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, `tokenId` will be burned by `from`.
* - `from` and `to` are never both zero.
*/
function _beforeTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
/**
* @dev Hook that is called after a set of serially-ordered token IDs
* have been transferred. This includes minting.
* And also called after one token has been burned.
*
* `startTokenId` - the first token ID to be transferred.
* `quantity` - the amount to be transferred.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
* transferred to `to`.
* - When `from` is zero, `tokenId` has been minted for `to`.
* - When `to` is zero, `tokenId` has been burned by `from`.
* - `from` and `to` are never both zero.
*/
function _afterTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
/**
* @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
*
* `from` - Previous owner of the given token ID.
* `to` - Target address that will receive the token.
* `tokenId` - Token ID to be transferred.
* `_data` - Optional data to send along with the call.
*
* Returns whether the call correctly returned the expected magic value.
*/
function _checkContractOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
bytes4 retval
) {
return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
_revert(TransferToNonERC721ReceiverImplementer.selector);
}
assembly {
revert(add(32, reason), mload(reason))
}
}
}
// =============================================================
// MINT OPERATIONS
// =============================================================
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `quantity` must be greater than 0.
*
* Emits a {Transfer} event for each mint.
*/
function _mint(address to, uint256 quantity) internal virtual {
uint256 startTokenId = _currentIndex;
if (quantity == 0) _revert(MintZeroQuantity.selector);
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are incredibly unrealistic.
// `balance` and `numberMinted` have a maximum limit of 2**64.
// `tokenId` has a maximum limit of 2**256.
unchecked {
// Updates:
// - `address` to the owner.
// - `startTimestamp` to the timestamp of minting.
// - `burned` to `false`.
// - `nextInitialized` to `quantity == 1`.
_packedOwnerships[startTokenId] = _packOwnershipData(
to,
_nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
);
// Updates:
// - `balance += quantity`.
// - `numberMinted += quantity`.
//
// We can directly add to the `balance` and `numberMinted`.
_packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
// Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS;
if (toMasked == 0) _revert(MintToZeroAddress.selector);
uint256 end = startTokenId + quantity;
uint256 tokenId = startTokenId;
if (end - 1 > _sequentialUpTo()) _revert(SequentialMintExceedsLimit.selector);
do {
assembly {
// Emit the `Transfer` event.
log4(
0, // Start of data (0, since no data).
0, // End of data (0, since no data).
_TRANSFER_EVENT_SIGNATURE, // Signature.
0, // `address(0)`.
toMasked, // `to`.
tokenId // `tokenId`.
)
}
// The `!=` check ensures that large values of `quantity`
// that overflows uint256 will make the loop run out of gas.
} while (++tokenId != end);
_currentIndex = end;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* This function is intended for efficient minting only during contract creation.
*
* It emits only one {ConsecutiveTransfer} as defined in
* [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
* instead of a sequence of {Transfer} event(s).
*
* Calling this function outside of contract creation WILL make your contract
* non-compliant with the ERC721 standard.
* For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
* {ConsecutiveTransfer} event is only permissible during contract creation.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `quantity` must be greater than 0.
*
* Emits a {ConsecutiveTransfer} event.
*/
function _mintERC2309(address to, uint256 quantity) internal virtual {
uint256 startTokenId = _currentIndex;
if (to == address(0)) _revert(MintToZeroAddress.selector);
if (quantity == 0) _revert(MintZeroQuantity.selector);
if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) _revert(MintERC2309QuantityExceedsLimit.selector);
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are unrealistic due to the above check for `quantity` to be below the limit.
unchecked {
// Updates:
// - `balance += quantity`.
// - `numberMinted += quantity`.
//
// We can directly add to the `balance` and `numberMinted`.
_packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
// Updates:
// - `address` to the owner.
// - `startTimestamp` to the timestamp of minting.
// - `burned` to `false`.
// - `nextInitialized` to `quantity == 1`.
_packedOwnerships[startTokenId] = _packOwnershipData(
to,
_nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
);
if (startTokenId + quantity - 1 > _sequentialUpTo()) _revert(SequentialMintExceedsLimit.selector);
emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);
_currentIndex = startTokenId + quantity;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Safely mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - If `to` refers to a smart contract, it must implement
* {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
* - `quantity` must be greater than 0.
*
* See {_mint}.
*
* Emits a {Transfer} event for each mint.
*/
function _safeMint(
address to,
uint256 quantity,
bytes memory _data
) internal virtual {
_mint(to, quantity);
unchecked {
if (to.code.length != 0) {
uint256 end = _currentIndex;
uint256 index = end - quantity;
do {
if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
_revert(TransferToNonERC721ReceiverImplementer.selector);
}
} while (index < end);
// This prevents reentrancy to `_safeMint`.
// It does not prevent reentrancy to `_safeMintSpot`.
if (_currentIndex != end) revert();
}
}
}
/**
* @dev Equivalent to `_safeMint(to, quantity, '')`.
*/
function _safeMint(address to, uint256 quantity) internal virtual {
_safeMint(to, quantity, '');
}
/**
* @dev Mints a single token at `tokenId`.
*
* Note: A spot-minted `tokenId` that has been burned can be re-minted again.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` must be greater than `_sequentialUpTo()`.
* - `tokenId` must not exist.
*
* Emits a {Transfer} event for each mint.
*/
function _mintSpot(address to, uint256 tokenId) internal virtual {
if (tokenId <= _sequentialUpTo()) _revert(SpotMintTokenIdTooSmall.selector);
uint256 prevOwnershipPacked = _packedOwnerships[tokenId];
if (_packedOwnershipExists(prevOwnershipPacked)) _revert(TokenAlreadyExists.selector);
_beforeTokenTransfers(address(0), to, tokenId, 1);
// Overflows are incredibly unrealistic.
// The `numberMinted` for `to` is incremented by 1, and has a max limit of 2**64 - 1.
// `_spotMinted` is incremented by 1, and has a max limit of 2**256 - 1.
unchecked {
// Updates:
// - `address` to the owner.
// - `startTimestamp` to the timestamp of minting.
// - `burned` to `false`.
// - `nextInitialized` to `true` (as `quantity == 1`).
_packedOwnerships[tokenId] = _packOwnershipData(
to,
_nextInitializedFlag(1) | _nextExtraData(address(0), to, prevOwnershipPacked)
);
// Updates:
// - `balance += 1`.
// - `numberMinted += 1`.
//
// We can directly add to the `balance` and `numberMinted`.
_packedAddressData[to] += (1 << _BITPOS_NUMBER_MINTED) | 1;
// Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS;
if (toMasked == 0) _revert(MintToZeroAddress.selector);
assembly {
// Emit the `Transfer` event.
log4(
0, // Start of data (0, since no data).
0, // End of data (0, since no data).
_TRANSFER_EVENT_SIGNATURE, // Signature.
0, // `address(0)`.
toMasked, // `to`.
tokenId // `tokenId`.
)
}
++_spotMinted;
}
_afterTokenTransfers(address(0), to, tokenId, 1);
}
/**
* @dev Safely mints a single token at `tokenId`.
*
* Note: A spot-minted `tokenId` that has been burned can be re-minted again.
*
* Requirements:
*
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}.
* - `tokenId` must be greater than `_sequentialUpTo()`.
* - `tokenId` must not exist.
*
* See {_mintSpot}.
*
* Emits a {Transfer} event.
*/
function _safeMintSpot(
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_mintSpot(to, tokenId);
unchecked {
if (to.code.length != 0) {
uint256 currentSpotMinted = _spotMinted;
if (!_checkContractOnERC721Received(address(0), to, tokenId, _data)) {
_revert(TransferToNonERC721ReceiverImplementer.selector);
}
// This prevents reentrancy to `_safeMintSpot`.
// It does not prevent reentrancy to `_safeMint`.
if (_spotMinted != currentSpotMinted) revert();
}
}
}
/**
* @dev Equivalent to `_safeMintSpot(to, tokenId, '')`.
*/
function _safeMintSpot(address to, uint256 tokenId) internal virtual {
_safeMintSpot(to, tokenId, '');
}
// =============================================================
// APPROVAL OPERATIONS
// =============================================================
/**
* @dev Equivalent to `_approve(to, tokenId, false)`.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_approve(to, tokenId, false);
}
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the
* zero address clears previous approvals.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function _approve(
address to,
uint256 tokenId,
bool approvalCheck
) internal virtual {
address owner = ownerOf(tokenId);
if (approvalCheck && _msgSenderERC721A() != owner)
if (!isApprovedForAll(owner, _msgSenderERC721A())) {
_revert(ApprovalCallerNotOwnerNorApproved.selector);
}
_tokenApprovals[tokenId].value = to;
emit Approval(owner, to, tokenId);
}
// =============================================================
// BURN OPERATIONS
// =============================================================
/**
* @dev Equivalent to `_burn(tokenId, false)`.
*/
function _burn(uint256 tokenId) internal virtual {
_burn(tokenId, false);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
address from = address(uint160(prevOwnershipPacked));
(uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
if (approvalCheck) {
// The nested ifs save around 20+ gas over a compound boolean condition.
if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
if (!isApprovedForAll(from, _msgSenderERC721A())) _revert(TransferCallerNotOwnerNorApproved.selector);
}
_beforeTokenTransfers(from, address(0), tokenId, 1);
// Clear approvals from the previous owner.
assembly {
if approvedAddress {
// This is equivalent to `delete _tokenApprovals[tokenId]`.
sstore(approvedAddressSlot, 0)
}
}
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
unchecked {
// Updates:
// - `balance -= 1`.
// - `numberBurned += 1`.
//
// We can directly decrement the balance, and increment the number burned.
// This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
_packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;
// Updates:
// - `address` to the last owner.
// - `startTimestamp` to the timestamp of burning.
// - `burned` to `true`.
// - `nextInitialized` to `true`.
_packedOwnerships[tokenId] = _packOwnershipData(
from,
(_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
);
// If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
uint256 nextTokenId = tokenId + 1;
// If the next slot's address is zero and not burned (i.e. packed value is zero).
if (_packedOwnerships[nextTokenId] == 0) {
// If the next slot is within bounds.
if (nextTokenId != _currentIndex) {
// Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
_packedOwnerships[nextTokenId] = prevOwnershipPacked;
}
}
}
}
emit Transfer(from, address(0), tokenId);
_afterTokenTransfers(from, address(0), tokenId, 1);
// Overflow not possible, as `_burnCounter` cannot be exceed `_currentIndex + _spotMinted` times.
unchecked {
_burnCounter++;
}
}
// =============================================================
// EXTRA DATA OPERATIONS
// =============================================================
/**
* @dev Directly sets the extra data for the ownership data `index`.
*/
function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
uint256 packed = _packedOwnerships[index];
if (packed == 0) _revert(OwnershipNotInitializedForExtraData.selector);
uint256 extraDataCasted;
// Cast `extraData` with assembly to avoid redundant masking.
assembly {
extraDataCasted := extraData
}
packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
_packedOwnerships[index] = packed;
}
/**
* @dev Called during each token transfer to set the 24bit `extraData` field.
* Intended to be overridden by the cosumer contract.
*
* `previousExtraData` - the value of `extraData` before transfer.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, `tokenId` will be burned by `from`.
* - `from` and `to` are never both zero.
*/
function _extraData(
address from,
address to,
uint24 previousExtraData
) internal view virtual returns (uint24) {}
/**
* @dev Returns the next extra data for the packed ownership data.
* The returned result is shifted into position.
*/
function _nextExtraData(
address from,
address to,
uint256 prevOwnershipPacked
) private view returns (uint256) {
uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
}
// =============================================================
// OTHER OPERATIONS
// =============================================================
/**
* @dev Returns the message sender (defaults to `msg.sender`).
*
* If you are writing GSN compatible contracts, you need to override this function.
*/
function _msgSenderERC721A() internal view virtual returns (address) {
return msg.sender;
}
/**
* @dev Converts a uint256 to its ASCII string decimal representation.
*/
function _toString(uint256 value) internal pure virtual returns (string memory str) {
assembly {
// The maximum value of a uint256 contains 78 digits (1 byte per digit), but
// we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
// We will need 1 word for the trailing zeros padding, 1 word for the length,
// and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
let m := add(mload(0x40), 0xa0)
// Update the free memory pointer to allocate.
mstore(0x40, m)
// Assign the `str` to the end.
str := sub(m, 0x20)
// Zeroize the slot after the string.
mstore(str, 0)
// Cache the end of the memory to calculate the length later.
let end := str
// We write the string from rightmost digit to leftmost digit.
// The following is essentially a do-while loop that also handles the zero case.
// prettier-ignore
for { let temp := value } 1 {} {
str := sub(str, 1)
// Write the character to the pointer.
// The ASCII index of the '0' character is 48.
mstore8(str, add(48, mod(temp, 10)))
// Keep dividing `temp` until zero.
temp := div(temp, 10)
// prettier-ignore
if iszero(temp) { break }
}
let length := sub(end, str)
// Move the pointer 32 bytes leftwards to make room for the length.
str := sub(str, 0x20)
// Store the length.
mstore(str, length)
}
}
/**
* @dev For more efficient reverts.
*/
function _revert(bytes4 errorSelector) internal pure {
assembly {
mstore(0x00, errorSelector)
revert(0x00, 0x04)
}
}
}// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.3.0
// Creator: Chiru Labs
pragma solidity ^0.8.4;
/**
* @dev Interface of ERC721A.
*/
interface IERC721A {
/**
* The caller must own the token or be an approved operator.
*/
error ApprovalCallerNotOwnerNorApproved();
/**
* The token does not exist.
*/
error ApprovalQueryForNonexistentToken();
/**
* Cannot query the balance for the zero address.
*/
error BalanceQueryForZeroAddress();
/**
* Cannot mint to the zero address.
*/
error MintToZeroAddress();
/**
* The quantity of tokens minted must be more than zero.
*/
error MintZeroQuantity();
/**
* The token does not exist.
*/
error OwnerQueryForNonexistentToken();
/**
* The caller must own the token or be an approved operator.
*/
error TransferCallerNotOwnerNorApproved();
/**
* The token must be owned by `from`.
*/
error TransferFromIncorrectOwner();
/**
* Cannot safely transfer to a contract that does not implement the
* ERC721Receiver interface.
*/
error TransferToNonERC721ReceiverImplementer();
/**
* Cannot transfer to the zero address.
*/
error TransferToZeroAddress();
/**
* The token does not exist.
*/
error URIQueryForNonexistentToken();
/**
* The `quantity` minted with ERC2309 exceeds the safety limit.
*/
error MintERC2309QuantityExceedsLimit();
/**
* The `extraData` cannot be set on an unintialized ownership slot.
*/
error OwnershipNotInitializedForExtraData();
/**
* `_sequentialUpTo()` must be greater than `_startTokenId()`.
*/
error SequentialUpToTooSmall();
/**
* The `tokenId` of a sequential mint exceeds `_sequentialUpTo()`.
*/
error SequentialMintExceedsLimit();
/**
* Spot minting requires a `tokenId` greater than `_sequentialUpTo()`.
*/
error SpotMintTokenIdTooSmall();
/**
* Cannot mint over a token that already exists.
*/
error TokenAlreadyExists();
/**
* The feature is not compatible with spot mints.
*/
error NotCompatibleWithSpotMints();
// =============================================================
// STRUCTS
// =============================================================
struct TokenOwnership {
// The address of the owner.
address addr;
// Stores the start time of ownership with minimal overhead for tokenomics.
uint64 startTimestamp;
// Whether the token has been burned.
bool burned;
// Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
uint24 extraData;
}
// =============================================================
// TOKEN COUNTERS
// =============================================================
/**
* @dev Returns the total number of tokens in existence.
* Burned tokens will reduce the count.
* To get the total number of tokens minted, please see {_totalMinted}.
*/
function totalSupply() external view returns (uint256);
// =============================================================
// IERC165
// =============================================================
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
* to learn more about how these ids are created.
*
* This function call must use less than 30000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
// =============================================================
// IERC721
// =============================================================
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables
* (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in `owner`'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`,
* checking first that contract recipients are aware of the ERC721 protocol
* to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move
* this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement
* {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external payable;
/**
* @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external payable;
/**
* @dev Transfers `tokenId` from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom}
* whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token
* by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external payable;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the
* zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external payable;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom}
* for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
// =============================================================
// IERC721Metadata
// =============================================================
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
// =============================================================
// IERC2309
// =============================================================
/**
* @dev Emitted when tokens in `fromTokenId` to `toTokenId`
* (inclusive) is transferred from `from` to `to`, as defined in the
* [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
*
* See {_mintERC2309} for more details.
*/
event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}{
"evmVersion": "paris",
"libraries": {},
"optimizer": {
"enabled": true,
"runs": 500
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"viaIR": true
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_body","type":"address"},{"internalType":"address","name":"_hats","type":"address"},{"internalType":"address","name":"_eyesA","type":"address"},{"internalType":"address","name":"_eyesB","type":"address"},{"internalType":"address","name":"_mouth","type":"address"},{"internalType":"address","name":"_feet","type":"address"},{"internalType":"address","name":"_backdrop","type":"address"},{"internalType":"address","name":"_oneOfOne","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidDefaultRoyalty","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidDefaultRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidTokenRoyalty","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidTokenRoyaltyReceiver","type":"error"},{"inputs":[],"name":"ExceedsMaxPerTx","type":"error"},{"inputs":[],"name":"FreeMintNotActive","type":"error"},{"inputs":[],"name":"IncorrectEthSent","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintNotActive","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NoContracts","type":"error"},{"inputs":[],"name":"NoMoreFreeFrogs","type":"error"},{"inputs":[],"name":"NotCompatibleWithSpotMints","type":"error"},{"inputs":[],"name":"NotOnWhitelist","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"SequentialMintExceedsLimit","type":"error"},{"inputs":[],"name":"SequentialUpToTooSmall","type":"error"},{"inputs":[],"name":"SoldOut","type":"error"},{"inputs":[],"name":"SpotMintTokenIdTooSmall","type":"error"},{"inputs":[],"name":"TokenAlreadyExists","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"WalletLimitReached","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CONTROLLER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToFreeList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"buildSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"free_mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"frogsBackdrop","outputs":[{"internalType":"contract FrogsBackdrop","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"frogsBody","outputs":[{"internalType":"contract FrogsBody","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"frogsEyesA","outputs":[{"internalType":"contract FrogsEyesA","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"frogsEyesB","outputs":[{"internalType":"contract FrogsEyesB","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"frogsFeet","outputs":[{"internalType":"contract FrogsFeet","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"frogsHats","outputs":[{"internalType":"contract FrogsHats","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"frogsMouth","outputs":[{"internalType":"contract FrogsMouth","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"frogsOneOfOne","outputs":[{"internalType":"contract FrogsOneOfOne","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintOnWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTrans","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxOneOfOne","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedOneOfOne","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxFree","type":"uint256"}],"name":"setMaxFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistDuration","type":"uint256"}],"name":"setWhitelistDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setmaxMintOnWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleFreeMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenTraits","outputs":[{"internalType":"bool","name":"oneOfOne","type":"bool"},{"internalType":"uint256","name":"oneOfOneIndex","type":"uint256"},{"internalType":"uint256","name":"backdrop","type":"uint256"},{"internalType":"uint256","name":"hat","type":"uint256"},{"internalType":"uint256","name":"eyesIndex","type":"uint256"},{"internalType":"bool","name":"eyesIsA","type":"bool"},{"internalType":"uint256","name":"mouth","type":"uint256"},{"internalType":"uint256","name":"body","type":"uint256"},{"internalType":"uint256","name":"feet","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6101806040523461012e57610024610015610187565b96959095949194939293610258565b60405161409b908161078182396080518181816113480152818161207d0152818161323301526139b9015260a0518181816109f5015281816120e40152818161316801526138fd015260c0518181816113d9015281816121550152818161308f0152613a98015260e051818181610bd20152818161247c015281816135260152613b6e01526101005181818161141d015281816121bb015281816131cb015261395c015261012051818181610a81015281816122330152818161329c0152613a170152610140518181816115c701528181611fe30152818161253f015281816131000152613611015261016051818181610f59015281816125e4015281816135a80152613c020152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b0381118382101761016e57604052565b610133565b51906001600160a01b038216820361012e57565b61487c90610100823803928361019c81610149565b94859283398101031261012e576101b282610173565b916101bf60208201610173565b926101cc60408301610173565b926101d960608401610173565b926101e660808201610173565b926101f360a08301610173565b9261020c60e061020560c08601610173565b9401610173565b919796959493929190565b6102216040610149565b90600a825269487970657246726f677360b01b6020830152565b6102456040610149565b906003825262242ca360e91b6020830152565b610271610263610217565b61026b61023b565b90610336565b610282670de0b6b3a7640000600d55565b61028c60c8600e55565b6102966000600f55565b6102a560ff1960105416601055565b6102b561ff001960105416601055565b6102bf6003601155565b6102c96003601255565b6102d36002601355565b6102dd6000601455565b6102e6336105ff565b506102f03361067b565b506001600160a01b0390811660805290811660a05290811660c05290811660e05290811661010052908116610120529081166101405216610160526103343361071c565b565b8051906001600160401b03821161016e5761035b82610356600254610442565b61047c565b602090601f83116001146103b85791806103919261039995946000926103ad575b50508160011b916000199060031b1c19161790565b600255610521565b6103a36001600055565b6103346001600a55565b01519050388061037c565b6002600052601f19831691907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9260005b81811061042a575091600193918561039997969410610411575b505050811b01600255610521565b015160001960f88460031b161c19169055388080610403565b929360206001819287860151815501950193016103e9565b90600182811c92168015610472575b602083101461045c57565b634e487b7160e01b600052602260045260246000fd5b91607f1691610451565b601f8111610488575050565b60026000526020600020906020601f840160051c830193106104c5575b601f0160051c01905b8181106104b9575050565b600081556001016104ae565b90915081906104a5565b601f82116104dc57505050565b6000526020600020906020601f840160051c83019310610517575b601f0160051c01905b81811061050b575050565b60008155600101610500565b90915081906104f7565b80519091906001600160401b03811161016e5761054a81610543600354610442565b60036104cf565b602092601f82116001146105805761057b929382916000926103ad5750508160011b916000199060031b1c19161790565b600355565b6003600052601f198216937fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9160005b8681106105e757508360019596106105ce575b505050811b01600355565b015160001960f88460031b161c191690553880806105c3565b919260206001819286850151815501940192016105b0565b6001600160a01b038116600090815260008051602061483c833981519152602052604090205460ff16610675576001600160a01b0316600081815260008051602061483c83398151915260205260408120805460ff1916600117905533919060008051602061481c8339815191528180a4600190565b50600090565b6001600160a01b038116600090815260008051602061485c833981519152602052604090205460ff16610675576001600160a01b038116600090815260008051602061485c83398151915260205260409020805460ff1916600117905533906001600160a01b03167f7b765e0e932d348852a6f810bfa1ab891e259123f02db8cdcde614c57022335760008051602061481c833981519152600080a4600190565b6001600160a01b0381161561076a5760408051919082016001600160401b0381118382101761016e576040526001600160a01b031680825260de602090920191909152606f60a11b17600b55565b635b6cc80560e11b600052600060045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146103e757806304634d8d146103e2578063055d822c146103dd57806306fdde03146103d8578063081812fc146103d3578063092c5b3b146103ce578063095ea7b3146103c957806318160ddd146103c457806323b872dd146103bf578063248a9ca3146103ba57806327db591e146103b55780632a55205a146103b05780632c3f9afd146103ab5780632f2ff15d146103a657806332b7e8e6146103a15780633447d35c1461039c57806336568abe14610397578063375a069a146103925780633ccfd60b1461038d5780633e53eb28146103885780633f9d55f01461038357806342842e0e1461037e57806344f5b5cb14610379578063485a68a3146103745780634a7d3e811461036f5780634ea792ce1461036a57806362ad68aa146103655780636352211e146103605780636817c76c1461035b57806370a08231146103565780637a930da3146103515780637d55094d1461034c5780637f6497831461034757806391d14854146103425780639312afa11461033d57806395d89b41146103385780639b19251a14610333578063a0712d681461032e578063a217fddf14610329578063a22cb46514610324578063a4c19a9f1461031f578063a6c377ef1461031a578063a6f48c9014610315578063a825a99c14610310578063a882efd81461030b578063adb5f7e114610306578063afdf613414610301578063b228d925146102fc578063b88d4fde146102f7578063bd29482d146102f2578063c82cac1c146102ed578063c87b56dd146102e8578063d1239730146102e3578063d547741f146102de578063d5abeb01146102d9578063d755bf99146102d4578063e05c57bf146102cf578063e985e9c5146102ca578063ebdfd722146102c5578063ed288f99146102c05763f4a0a528146102bb57600080fd5b611b0e565b611af0565b611ad2565b611a74565b6119d4565b6119b3565b611996565b611953565b611930565b6115eb565b6115a7565b611586565b6114fa565b611462565b611441565b6113fd565b6113b9565b61138a565b61136c565b611328565b611269565b6111c7565b6111ab565b611078565b611035565b610f7d565b610f39565b610ee2565b610e74565b610e43565b610e25565b610dc6565b610da8565b610d79565b610d53565b610d35565b610cfb565b610cdd565b610c6f565b610bf6565b610bb2565b610b7f565b610b2f565b610b0b565b610ac1565b610aa5565b610a61565b610a19565b6109d5565b610948565b610905565b6108d0565b6108be565b61086b565b610798565b61075d565b610709565b610613565b610579565b610484565b610403565b6001600160e01b03198116036103fe57565b600080fd5b346103fe5760203660031901126103fe576020600435610422816103ec565b63ffffffff60e01b1663152a902d60e11b8114908115610448575b506040519015158152f35b637965db0b60e01b811491508115610462575b503861043d565b6301ffc9a760e01b1490503861045b565b6001600160a01b038116036103fe57565b346103fe5760403660031901126103fe576004356104a181610473565b602435906bffffffffffffffffffffffff82168083036103fe576104c361285e565b612710811161055f57506001600160a01b0381161561054957610512610547926104fd6104ee6114bd565b6001600160a01b039094168452565b6bffffffffffffffffffffffff166020830152565b80516020919091015160a01b73ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039190911617600b55565b005b635b6cc80560e11b600052600060045260246000fd5b636f483d0960e01b60005260045261271060245260446000fd5b346103fe5760203660031901126103fe576001600160a01b0360043561059e81610473565b1660005260176020526020604060002054604051908152f35b60005b8381106105ca5750506000910152565b81810151838201526020016105ba565b906020916105f3815180928185528580860191016105b7565b601f01601f1916010190565b9060206106109281815201906105da565b90565b346103fe5760003660031901126103fe5760405160006002548060011c90600181169081156106ff575b6020831082146106eb5782855260208501919081156106d2575060011461067f575b61067b8461066f81860382611496565b604051918291826105ff565b0390f35b600260009081529250907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b8184106106be5750500161066f8261065f565b8054848401526020909301926001016106ab565b60ff191682525090151560051b01905061066f8261065f565b634e487b7160e01b84526022600452602484fd5b91607f169161063d565b346103fe5760203660031901126103fe576004356107268161297e565b1561074c57600052600660205260206001600160a01b0360406000205416604051908152f35b6333d1c03960e21b60005260046000fd5b346103fe5760003660031901126103fe5760206040517f7b765e0e932d348852a6f810bfa1ab891e259123f02db8cdcde614c5702233578152f35b60403660031901126103fe576004356107b081610473565b602435906001600160a01b036107c583612a42565b1690813303610834575b8061080b6001600160a01b03926107f0866000526006602052604060002090565b906001600160a01b03166001600160a01b0319825416179055565b16907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b81600052600760205260ff610860336040600020906001600160a01b0316600052602052604060002090565b54166107cf576129cd565b346103fe5760003660031901126103fe576000546001546040519103600019018152602090f35b60609060031901126103fe576004356108aa81610473565b906024356108b781610473565b9060443590565b6105476108ca36610892565b91611b2f565b346103fe5760203660031901126103fe5760206108fd600435600052600960205260016040600020015490565b604051908152f35b346103fe5760203660031901126103fe576001600160a01b0360043561092a81610473565b166000526015602052602060ff604060002054166040519015158152f35b346103fe5760403660031901126103fe5760043560243590600052600c602052604060002054906001600160a01b0382169160a01c82156109bd575b612710916bffffffffffffffffffffffff6109a0921690611d32565b604080516001600160a01b03949094168452919004602083015290f35b50600b546001600160a01b038116925060a01c610984565b346103fe5760003660031901126103fe5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103fe5760403660031901126103fe57610547602435600435610a3c82610473565b610a5c610a5782600052600960205260016040600020015490565b612923565b612ab2565b346103fe5760003660031901126103fe5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103fe5760003660031901126103fe57602060405160028152f35b346103fe5760403660031901126103fe57600435602435610ae181610473565b336001600160a01b03821603610afa5761054791612b56565b63334bd91960e11b60005260046000fd5b346103fe5760203660031901126103fe57610547600435610b2a61285e565b612d43565b346103fe5760003660031901126103fe57610b4861285e565b610b50612da3565b600080808047335af1610b61611d70565b5015610b6e576001600a55005b6312171d8360e31b60005260046000fd5b346103fe5760203660031901126103fe5761067b610b9e600435611f89565b6040519182916020835260208301906105da565b346103fe5760003660031901126103fe5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b610547610c0236610892565b9060405192610c12602085611496565b6000845261281b565b9060206003198301126103fe5760043567ffffffffffffffff81116103fe57826023820112156103fe5780600401359267ffffffffffffffff84116103fe5760248460051b830101116103fe576024019190565b346103fe57610c7d36610c1b565b90610c866128b1565b610c8e612da3565b60005b828110610c9f576001600a55005b806001600160a01b03610cb560019386866127c0565b35610cbf81610473565b16600052601560205260406000208260ff1982541617905501610c91565b346103fe5760003660031901126103fe576020600e54604051908152f35b346103fe5760003660031901126103fe57610d1461285e565b60105461ff0060ff8260081c161560081b169061ff00191617601055600080f35b346103fe5760003660031901126103fe576020601454604051908152f35b346103fe5760003660031901126103fe57602060ff60105460081c166040519015158152f35b346103fe5760203660031901126103fe5760206001600160a01b03610d9f600435612a42565b16604051908152f35b346103fe5760003660031901126103fe576020600d54604051908152f35b346103fe5760203660031901126103fe576001600160a01b03600435610deb81610473565b168015610e14576000526005602052602067ffffffffffffffff60406000205416604051908152f35b6323d3ad8160e21b60005260046000fd5b346103fe5760003660031901126103fe576020601354604051908152f35b346103fe5760003660031901126103fe57610e5c61285e565b60105460ff80821615169060ff191617601055600080f35b346103fe57610e8236610c1b565b90610e8b6128b1565b610e93612da3565b60005b828110610ea4576001600a55005b806001600160a01b03610eba60019386866127c0565b35610ec481610473565b16600052601660205260406000208260ff1982541617905501610e96565b346103fe5760403660031901126103fe57602060ff610f2d602435600435610f0982610473565b600052600984526040600020906001600160a01b0316600052602052604060002090565b54166040519015158152f35b346103fe5760003660031901126103fe5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103fe5760003660031901126103fe5760405160006003548060011c906001811690811561102b575b6020831082146106eb5782855260208501919081156106d25750600114610fd85761067b8461066f81860382611496565b600360009081529250907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8184106110175750500161066f8261065f565b805484840152602090930192600101611004565b91607f1691610fa7565b346103fe5760203660031901126103fe576001600160a01b0360043561105a81610473565b166000526016602052602060ff604060002054166040519015158152f35b60203660031901126103fe5760043561109a61109660105460ff1690565b1590565b61119a57601154811161115d576110ce816110c8336001600160a01b03166000526017602052604060002090565b546127ff565b90601854421060001461117f576111056110966110fe336001600160a01b03166000526016602052604060002090565b5460ff1690565b61116e57601354821161115d575b61111f600d5482611d32565b340361114c5761054791611146336001600160a01b03166000526017602052604060002090565b55612d43565b634c5b39e360e01b60005260046000fd5b638cc2fc5560e01b60005260046000fd5b63522fc3bd60e01b60005260046000fd5b60125482111561111357638cc2fc5560e01b60005260046000fd5b63914edb0f60e01b60005260046000fd5b346103fe5760003660031901126103fe57602060405160008152f35b346103fe5760403660031901126103fe576004356111e481610473565b602435801515918282036103fe576112396001600160a01b0392336000526007602052611228836040600020906001600160a01b0316600052602052604060002090565b9060ff801983541691151516179055565b60405192835216907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b346103fe5760003660031901126103fe57336000526015602052611296611096604060002060ff90541690565b61116e576010546112ab9060081c60ff161590565b611318576112ba600f546127d5565b600e5410611307576112ec6112e2336001600160a01b03166000526015602052604060002090565b805460ff19169055565b6112ff6112fa600f5461280c565b600f55565b610547612c9d565b637b96017360e11b60005260046000fd5b62335e4b60ea1b60005260046000fd5b346103fe5760003660031901126103fe5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103fe5760003660031901126103fe576020600f54604051908152f35b346103fe5760203660031901126103fe576004356113a661285e565b42018042116113b457601855005b611cec565b346103fe5760003660031901126103fe5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103fe5760003660031901126103fe5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103fe5760203660031901126103fe5760043561145d61285e565b601255005b346103fe5760003660031901126103fe576020601254604051908152f35b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176114b857604052565b611480565b604051906114cc604083611496565b565b604051906114cc61012083611496565b67ffffffffffffffff81116114b857601f01601f191660200190565b60803660031901126103fe5760043561151281610473565b6024359061151f82610473565b6044356064359267ffffffffffffffff84116103fe57366023850112156103fe5783600401359261154f846114de565b9361155d6040519586611496565b80855236602482880101116103fe5760208160009260246105479901838901378601015261281b565b346103fe5760203660031901126103fe576004356115a261285e565b601355005b346103fe5760003660031901126103fe5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103fe5760203660031901126103fe5760043561161061160b82611f89565b612fa8565b90600081807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000811015611908575b806d04ee2d6d415b85acef8100000000600a9210156118ec575b662386f26fc100008110156118d7575b6305f5e1008110156118c5575b6127108110156118b5575b60648110156118a6575b101561189b575b6116d6602161169d6001850161300f565b938401015b60001901917f3031323334353637383961626364656600000000000000000000000000000000600a82061a8353600a900490565b9081156116e6576116d6906116a2565b61067b61185861066f61186661175461160b602061185861184a8d6117546118148f8f6117546117dd61176861175a61172161180696613041565b946040519e8f9d8e016016907f7b226e616d65223a202248797065722046726f6720230000000000000000000081520190565b90611f72565b61088b60f21b815260020190565b7f226465736372697074696f6e223a202248797065722046726f6773206172652081527f70757265204153434949206172742066726f677320616e64206c69766520313060208201527f3025206f6e636861696e206f6e2048797065726c69717569642e222c000000006040820152605c0190565b7f2261747472696275746573223a205b00000000000000000000000000000000008152600f0190565b61174b60f21b815260020190565b7f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b626173815263194d8d0b60e21b602082015260240190565b61227d60f01b815260020190565b03601f198101835282611496565b6040517f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006020820152928391603d8301611754565b60019091019061168c565b60029060649004930192611685565b600490612710900493019261167b565b6008906305f5e1009004930192611670565b601090662386f26fc100009004930192611663565b6020906d04ee2d6d415b85acef81000000009004930192611653565b50604091507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008304611639565b346103fe5760003660031901126103fe57602060ff601054166040519015158152f35b346103fe5760403660031901126103fe5761054760243560043561197682610473565b611991610a5782600052600960205260016040600020015490565b612b56565b346103fe5760003660031901126103fe5760206040516108ae8152f35b346103fe5760203660031901126103fe576004356119cf61285e565b600e55005b346103fe5760203660031901126103fe576004356000526019602052604060002060ff81541661067b6001830154926002810154906003810154600482015460ff600584015416906006840154926008600786015495015495604051998a998a95926101009794919a9998959261012088019b151588526020880152604087015260608601526080850152151560a084015260c083015260e08201520152565b346103fe5760403660031901126103fe57602060ff610f2d600435611a9881610473565b6001600160a01b0360243591611aad83610473565b16600052600784526040600020906001600160a01b0316600052602052604060002090565b346103fe5760003660031901126103fe576020601854604051908152f35b346103fe5760003660031901126103fe576020601154604051908152f35b346103fe5760203660031901126103fe57600435611b2a61285e565b600d55005b9190916001600160a01b03611b4383612a42565b911692836001600160a01b03831603611ce757600083815260066020526040902080549290611b816001600160a01b03871633908114908614171590565b611c9e575b6001600160a01b0393611c94575b50611bb2856001600160a01b03166000526005602052604060002090565b8054600019019055611bd7826001600160a01b03166000526005602052604060002090565b805460010190556001600160a01b0382164260a01b17600160e11b17611c07856000526004602052604060002090565b55600160e11b811615611c4a575b501680927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a415611c4557565b6129ff565b60018401611c62816000526004602052604060002090565b5415611c6f575b50611c15565b6000548114611c6957611c8c906000526004602052604060002090565b553880611c69565b6000905538611b94565b611cdd6110966110fe33611cc58a6001600160a01b03166000526007602052604060002090565b906001600160a01b0316600052602052604060002090565b15611b86576129ee565b6129de565b634e487b7160e01b600052601160045260246000fd5b908160021b917f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116036113b457565b818102929181159184041417156113b457565b634e487b7160e01b600052601260045260246000fd5b60405190611d6a602083611496565b60008252565b3d15611d9b573d90611d81826114de565b91611d8f6040519384611496565b82523d6000602084013e565b606090565b15611da757565b60405162461bcd60e51b815260206004820152601460248201527f546f6b656e20646f6573206e6f742065786973740000000000000000000000006044820152606490fd5b906008611df76114ce565b92611e0c611e06825460ff1690565b15158552565b60018101546020850152600281015460408501526003810154606085015260048101546080850152611e4e611e45600583015460ff1690565b151560a0860152565b600681015460c0850152600781015460e08501520154610100830152565b6020818303126103fe5780519067ffffffffffffffff82116103fe570181601f820112156103fe5760208151910190611ea4816114de565b92611eb26040519485611496565b818452818301116103fe576106109160208401906105b7565b6040513d6000823e3d90fd5b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f737667222076696577426f783d2230203020393020393022207368617060208201527f652d72656e646572696e673d2263726973704564676573222077696474683d2260408201527f35313222206865696768743d22353132223e0000000000000000000000000000606082015260720190565b90611f85602092828151948592016105b7565b0190565b611fb1611fb691611fa1611f9c8261297e565b611da0565b6000526019602052604060002090565b611dec565b8051612518576040818101805191516336a3880960e11b8152600481019290925290916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600084602481845afa92831561244257612047946000946124f7575b50516040516336a3880960e11b81526004810191909152936000918591829081906024820190565b03915afa928315612442576000936124da575b5060e081015160405163db5cc18160e01b815260048101919091526000816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015612442576120bf9160009161241f575b50612dc5565b6060820151604051630c0a76ed60e41b815260048101919091529091906000816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015612442576121259160009161241f5750612dc5565b60a08201516000901561245b57506080820151604051633d04ca4360e11b815260048101919091526000816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015612442576121969160009161241f5750612dc5565b60c083015160405163f708887760e01b815260048101919091529091906000816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115612442576101006122056122279360009384916124475750612dc5565b9501516040518093819263c8e1f0e560e01b8352600483019190602083019252565b03816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa80156124425761226c9160009161241f5750612dc5565b936040519687966020880161228090611ed7565b661e39ba3cb6329f60c91b815260070164737667207b60d81b81526005016b77696474683a20313030253b60a01b8152600c016c6865696768743a20313030253b60981b8152600d01696d617267696e3a20303b60b01b8152600a016a70616464696e673a20303b60a81b8152600b01706f766572666c6f773a2068696464656e3b60781b81526011016d646973706c61793a20666c65783b60901b8152600e017f6a7573746966792d636f6e74656e743a2063656e7465723b000000000000000081526018016a3130b1b5b3b937bab7321d60a91b8152600b0161236491611f72565b603b60f81b8152600101607d60f81b8152600101671e17b9ba3cb6329f60c11b81526008017f3c726563742077696474683d22393022206865696768743d223930222066696c815262361e9160e91b60208201526023016123c491611f72565b6211179f60e91b81526003016123d991611f72565b6123e291611f72565b6123eb91611f72565b6123f491611f72565b6123fd91611f72565b651e17b9bb339f60d11b81526006015b03601f19810182526106109082611496565b61243c91503d806000833e6124348183611496565b810190611e6c565b386120b9565b611ecb565b61243c91503d8086833e6124348183611496565b608083015160405163093a2e0160e41b8152600481019190915281816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115612442578261219693926124bf575b5050612dc5565b6124d392503d8091833e6124348183611496565b38806124b8565b6124f09193503d806000833e6124348183611496565b913861205a565b600092919450612510903d8085833e6124348183611496565b93909161201f565b6040818101805191516336a3880960e11b8152600481019290925290916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600084602481845afa928315612442576125a2946000946124f75750516040516336a3880960e11b81526004810191909152936000918591829081906024820190565b03915afa92831561244257600093612784575b506020015160405163d4c4205f60e01b8152600481019190915260008180602481015b03816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa80156124425761261d9160009161241f5750612dc5565b60405192839261262f60208501611ed7565b661e39ba3cb6329f60c91b815260070164737667207b60d81b81526005016b77696474683a20313030253b60a01b8152600c016c6865696768743a20313030253b60981b8152600d01696d617267696e3a20303b60b01b8152600a016a70616464696e673a20303b60a81b8152600b01706f766572666c6f773a2068696464656e3b60781b81526011016d646973706c61793a20666c65783b60901b8152600e017f6a7573746966792d636f6e74656e743a2063656e7465723b000000000000000081526018016a3130b1b5b3b937bab7321d60a91b8152600b0161271391611f72565b603b60f81b8152600101607d60f81b8152600101671e17b9ba3cb6329f60c11b81526008017f3c726563742077696474683d22393022206865696768743d223930222066696c815262361e9160e91b602082015260230161277391611f72565b6211179f60e91b81526003016123f4565b6125d891935060206127a16000923d8085833e6124348183611496565b949250506125b5565b634e487b7160e01b600052603260045260246000fd5b91908110156127d05760051b0190565b6127aa565b90600182018092116113b457565b60010190816001116113b457565b90600282018092116113b457565b919082018092116113b457565b60001981146113b45760010190565b929190612829828286611b2f565b803b612836575b50505050565b61283f93612f77565b1561284d5738808080612830565b6368d2bf6b60e11b60005260046000fd5b3360009081527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b602052604090205460ff161561289757565b63e2517d3f60e01b60005233600452600060245260446000fd5b3360009081527f8c4af4b3e409a4e4c1d5953bf32c229250bfc1acdfc654ce3bba3cb8b8feea0b602052604090205460ff16156128ea57565b63e2517d3f60e01b600052336004527f7b765e0e932d348852a6f810bfa1ab891e259123f02db8cdcde614c57022335760245260446000fd5b80600052600960205260ff61294f336040600020906001600160a01b0316600052602052604060002090565b5416156129595750565b63e2517d3f60e01b6000523360045260245260446000fd5b80156113b4576000190190565b90600091806001111561298e5750565b600054811061299a5750565b9091505b80600052600460205260406000205490816129c2576129bd9150612971565b61299e565b50600160e01b161590565b6367d9dca160e11b60005260046000fd5b62a1148160e81b60005260046000fd5b632ce44b5f60e11b60005260046000fd5b633a954ecd60e21b60005260046000fd5b636f96cda160e11b60005260046000fd5b63b562e8dd60e01b60005260046000fd5b622e076360e81b60005260046000fd5b80600111612a1057612a5e816000526004602052604060002090565b54908115612a755750600160e01b8116612a105790565b9050600054811015612a10575b60001901600081815260046020526040902054908115612aab5750600160e01b8116612a105790565b9050612a82565b80600052600960205260ff612ade836040600020906001600160a01b0316600052602052604060002090565b5416612b4f57806000526009602052612b0e826040600020906001600160a01b0316600052602052604060002090565b805460ff1916600117905533916001600160a01b0316907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d600080a4600190565b5050600090565b80600052600960205260ff612b82836040600020906001600160a01b0316600052602052604060002090565b541615612b4f57806000526009602052612bb3826040600020906001600160a01b0316600052602052604060002090565b805460ff1916905533916001600160a01b0316907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b600080a4600190565b6000198101919082116113b457565b602a198101919082116113b457565b90610100600891612c35612c238251151590565b859060ff801983541691151516179055565b60208101516001850155604081015160028501556060810151600385015560808101516004850155612c82612c6d60a0830151151590565b600586019060ff801983541691151516179055565b60c0810151600685015560e081015160078501550151910155565b6000546000198101908082116113b4576108ae10612d3257323303612d2157612cc5906127e3565b612cce43612bf1565b4060005b60018110612ce8575050506114cc600133613cc3565b80612d1b612cf8600193866127ff565b612d16612d0586836138c5565b916000526019602052604060002090565b612c0f565b01612cd2565b63875fdad760e01b60005260046000fd5b6352df9fe560e01b60005260046000fd5b600019600054018181018082116113b4576108ae10612d3257323303612d2157612d6c906127e3565b612d7543612bf1565b4060005b838110612d8d575050506114cc9033613cc3565b80612d9d612cf8600193866127ff565b01612d79565b6002600a5414612db4576002600a55565b633ee5aeb560e01b60005260046000fd5b90815115612e775781515b80151580612e51575b15612dec57612de790612971565b612dd0565b612df58161300f565b9060005b818110612e07575090925050565b80612e3d612e1760019388613dfa565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60001a612e4a8286613dfa565b5301612df9565b5060001981018181116113b457612e70612e1760ff60f81b9286613dfa565b1615612dd9565b9050604051612e87602082611496565b6000815290565b908160209103126103fe5751610610816103ec565b90926001600160a01b03608093816106109796168452166020830152604082015281606082015201906105da565b91612f019260209260006001600160a01b03604051809781968295630a85bd0160e11b8452853360048601612ea3565b0393165af160009181612f46575b50612f3057612f1c611d70565b805115612f2b57805190602001fd5b61284d565b6001600160e01b031916630a85bd0160e11b1490565b612f6991925060203d602011612f70575b612f618183611496565b810190612e8e565b9038612f0f565b503d612f57565b9060209260006001600160a01b03612f01969460405197889687958693630a85bd0160e11b85523360048601612ea3565b60405161061091612fba606083611496565b604082527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208301527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040830152613e0b565b90613019826114de565b6130266040519182611496565b8281528092613037601f19916114de565b0190602036910137565b611fb1613058916000526019602052604060002090565b80516135855760a081015160009190156135055760808101516040516280c7e960e31b8152600481019190915291506000826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015612442576130f4926000916134ea575b50905b600060408201516040518095819263ae11c58960e01b8352600483019190602083019252565b03816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa9182156124425761315c936000936134cd575b5060006060830151604051809681926385a96b9560e01b8352600483019190602083019252565b03816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa938415612442576000946134aa575b5060c08201516040516359c9d30b60e01b81526004810191909152919060008380602481015b03816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa908115612442576132279360009261348d575b50600060e08401516040518096819263c433cd6d60e01b8352600483019190602083019252565b03816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa928315612442576132909460009461346a575b5061010060009101516040518096819263ef3b9a8b60e01b8352600483019190602083019252565b03816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa9384156124425760009461344d575b50604080517f7b2274726169745f74797065223a224261636b64726f70222c202276616c7565602082015262111d1160e91b918101919091529586956043870161331691611f72565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a22486174222c202276616c7565223a2200008152601e0161335191611f72565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2245796573222c202276616c7565223a22008152601f0161338c91611f72565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a224d6f757468222c202276616c7565223a2281526020016133c791611f72565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a22426f6479222c202276616c7565223a22008152601f0161340291611f72565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2246656574222c202276616c7565223a22008152601f0161343d91611f72565b61227d60f01b815260020161240d565b6134639194503d806000833e6124348183611496565b92386132cd565b6000919450613485610100913d8085833e6124348183611496565b949150613268565b6134a39192503d806000833e6124348183611496565b9038613200565b6131bf929194506134c5903d806000833e6124348183611496565b939091613199565b6134e39193503d806000833e6124348183611496565b9138613135565b6134ff91503d806000833e6124348183611496565b386130cb565b6080810151604051630ff6ff9d60e11b8152600481019190915282816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561244257836130f4949261356a575b5050906130ce565b61357e92503d8091833e6124348183611496565b3880613562565b60208101516040516374f8a20b60e01b81526004810191909152906000826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa91821561244257600092613796575b50604090810151905163ae11c58960e01b8152600481019190915260008180602481015b03816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa9081156124425760009161377b575b50604080517f7b2274726169745f74797065223a224261636b64726f70222c202276616c7565602082015262111d1160e91b918101919091529182916043830161368b91611f72565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a22486174222c202276616c7565223a2200008152601e016136c79082611f72565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2245796573222c202276616c7565223a22008152601f016137039082611f72565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a224d6f757468222c202276616c7565223a22815260200161373f9082611f72565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a22426f6479222c202276616c7565223a22008152601f016134029082611f72565b61379091503d806000833e6124348183611496565b38613642565b60406137b260009261360594953d8091833e6124348183611496565b939250506135e1565b60405190610120820182811067ffffffffffffffff8211176114b8576040526000610100838281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e08201520152565b9060058110156127d05760051b0190565b908160209103126103fe575190565b811561383b570690565b611d45565b6020818303126103fe5780519067ffffffffffffffff82116103fe57019080601f830112156103fe5781519167ffffffffffffffff83116114b8578260051b90604051936138916020840186611496565b84526020808501928201019283116103fe57602001905b8282106138b55750505090565b81518152602091820191016138a8565b6138d7916138d16137bb565b50613eef565b6138e18151613fa2565b613bce57805160405163e08b9d1f60e01b8152906000826004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156124425761394092600092613b20575b50613ff7565b90602081015160405163612c825160e11b8152906000826004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156124425761399e92600092613b205750613ff7565b6040820151604051639984fb8760e01b8152906000826004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115612442576139fb92600092613b205750613ff7565b90606083015160405163481ec82360e01b8152906000826004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561244257613a64613a7392613a6b92613a7895600092613b205750613ff7565b9560800190565b516064900690565b6127d5565b602b8111613b45576040516374665b6d60e01b81526001906000816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561244257613b0d93613add92600092613b205750613ff7565b613ae56114ce565b966000885260006020890152600060408901526060880152608087015260a086019015159052565b60c084015260e083015261010082015290565b613b3e9192503d806000833e613b368183611496565b810190613840565b903861393a565b613b50600091612c00565b906040516336c4392760e11b81526000816004816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa801561244257613b0d93613bac92600092613bb1575b50614034565b613add565b613bc79192503d806000833e613b368183611496565b9038613ba6565b613beb90613be5613be060145461280c565b601455565b60200190565b51604051637fc1383360e01b8152906020826004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561244257613c4592600092613c92575b50613831565b613c4d6114ce565b60018152906020820152600060408201526000606082015260006080820152613c7960a0820160019052565b600060c0820152600060e0820152600061010082015290565b613cb591925060203d602011613cbc575b613cad8183611496565b810190613822565b9038613c3f565b503d613ca3565b9160405190613cd3602083611496565b60008252600054918315613df5576001600160a01b0385164260a01b6001861460e11b1717613d0c846000526004602052604060002090565b55613d2a856001600160a01b03166000526005602052604060002090565b68010000000000000001850281540190556001600160a01b038516938415613df057808401939560015b15613d88575b60008787827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4613d54565b9560010195848703613d5a5792955092909350600055803b613da957505050565b9091926000549283039260015b15613dda575b6000613dd061109687600188019787612ed1565b15613db65761284d565b808410613dbc579250925050600054036103fe57565b612a32565b612a21565b9081518110156127d0570160200190565b919091805115613ee457613e39613e34613e2f613e2884516127f1565b6003900490565b611d02565b61300f565b9060208201908081518201956020870190815192600083525b888110613e965750506003939495965052510680600114613e8357600214613e78575090565b603d90600019015390565b50603d9081600019820153600119015390565b600360049199969901986001603f8b5182828260121c16870101518453828282600c1c16870101518385015382828260061c1687010151600285015316840101516003820153019497613e52565b509050610610611d5b565b9190611858613f4d60405194613f0660a087611496565b60a036873760408051602081019283529081019490945233606090811b6bffffffffffffffffffffffff1916908501524460748501524260948501529291829060b4820190565b5190209160005b60058110613f6157509150565b604080516020810186815291810183905260019291613f9191613f878160608101611858565b5190206065900690565b613f9b8285613811565b5201613f54565b6000549060016000198301926108ae03016108ae81116113b457601454918260020392600284116113b457600214159384613fdf575b5050505090565b90919293506108ae1461383b57061038808080613fd8565b60005b82518110156140225760208160051b8401015182111561401c57600101613ffa565b91505090565b50505160001981019081116113b45790565b60005b82518110156140225760208160051b84010151602a1981019081116113b45782111561401c5760010161403756fea26469706673582212204d4326e159ee656002f6e7ca3889d5820df622813735cd65d5aebb919229c50a64736f6c634300081c00332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0dec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b8c4af4b3e409a4e4c1d5953bf32c229250bfc1acdfc654ce3bba3cb8b8feea0b000000000000000000000000dd541b89d4c89fe351828f698660f04dee6d6a930000000000000000000000003a95fb432520d7ab9d136958e96915479f7284bb0000000000000000000000008582aaced82ae034eeb05f869d843634450db428000000000000000000000000f315bc82cf65ec3c4e77d57f84cff1473652afa40000000000000000000000008d2489ff3c82a92bc2b2f6c717ee7316cdb13ea400000000000000000000000068160933deb55de5291dbd18016e20c18350113e0000000000000000000000005bb638ea28314116514daa924310e9575c3a78f80000000000000000000000009e763207b713e70cacb40f5d33142e76ed7ffb20
Deployed Bytecode
0x6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146103e757806304634d8d146103e2578063055d822c146103dd57806306fdde03146103d8578063081812fc146103d3578063092c5b3b146103ce578063095ea7b3146103c957806318160ddd146103c457806323b872dd146103bf578063248a9ca3146103ba57806327db591e146103b55780632a55205a146103b05780632c3f9afd146103ab5780632f2ff15d146103a657806332b7e8e6146103a15780633447d35c1461039c57806336568abe14610397578063375a069a146103925780633ccfd60b1461038d5780633e53eb28146103885780633f9d55f01461038357806342842e0e1461037e57806344f5b5cb14610379578063485a68a3146103745780634a7d3e811461036f5780634ea792ce1461036a57806362ad68aa146103655780636352211e146103605780636817c76c1461035b57806370a08231146103565780637a930da3146103515780637d55094d1461034c5780637f6497831461034757806391d14854146103425780639312afa11461033d57806395d89b41146103385780639b19251a14610333578063a0712d681461032e578063a217fddf14610329578063a22cb46514610324578063a4c19a9f1461031f578063a6c377ef1461031a578063a6f48c9014610315578063a825a99c14610310578063a882efd81461030b578063adb5f7e114610306578063afdf613414610301578063b228d925146102fc578063b88d4fde146102f7578063bd29482d146102f2578063c82cac1c146102ed578063c87b56dd146102e8578063d1239730146102e3578063d547741f146102de578063d5abeb01146102d9578063d755bf99146102d4578063e05c57bf146102cf578063e985e9c5146102ca578063ebdfd722146102c5578063ed288f99146102c05763f4a0a528146102bb57600080fd5b611b0e565b611af0565b611ad2565b611a74565b6119d4565b6119b3565b611996565b611953565b611930565b6115eb565b6115a7565b611586565b6114fa565b611462565b611441565b6113fd565b6113b9565b61138a565b61136c565b611328565b611269565b6111c7565b6111ab565b611078565b611035565b610f7d565b610f39565b610ee2565b610e74565b610e43565b610e25565b610dc6565b610da8565b610d79565b610d53565b610d35565b610cfb565b610cdd565b610c6f565b610bf6565b610bb2565b610b7f565b610b2f565b610b0b565b610ac1565b610aa5565b610a61565b610a19565b6109d5565b610948565b610905565b6108d0565b6108be565b61086b565b610798565b61075d565b610709565b610613565b610579565b610484565b610403565b6001600160e01b03198116036103fe57565b600080fd5b346103fe5760203660031901126103fe576020600435610422816103ec565b63ffffffff60e01b1663152a902d60e11b8114908115610448575b506040519015158152f35b637965db0b60e01b811491508115610462575b503861043d565b6301ffc9a760e01b1490503861045b565b6001600160a01b038116036103fe57565b346103fe5760403660031901126103fe576004356104a181610473565b602435906bffffffffffffffffffffffff82168083036103fe576104c361285e565b612710811161055f57506001600160a01b0381161561054957610512610547926104fd6104ee6114bd565b6001600160a01b039094168452565b6bffffffffffffffffffffffff166020830152565b80516020919091015160a01b73ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039190911617600b55565b005b635b6cc80560e11b600052600060045260246000fd5b636f483d0960e01b60005260045261271060245260446000fd5b346103fe5760203660031901126103fe576001600160a01b0360043561059e81610473565b1660005260176020526020604060002054604051908152f35b60005b8381106105ca5750506000910152565b81810151838201526020016105ba565b906020916105f3815180928185528580860191016105b7565b601f01601f1916010190565b9060206106109281815201906105da565b90565b346103fe5760003660031901126103fe5760405160006002548060011c90600181169081156106ff575b6020831082146106eb5782855260208501919081156106d2575060011461067f575b61067b8461066f81860382611496565b604051918291826105ff565b0390f35b600260009081529250907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b8184106106be5750500161066f8261065f565b8054848401526020909301926001016106ab565b60ff191682525090151560051b01905061066f8261065f565b634e487b7160e01b84526022600452602484fd5b91607f169161063d565b346103fe5760203660031901126103fe576004356107268161297e565b1561074c57600052600660205260206001600160a01b0360406000205416604051908152f35b6333d1c03960e21b60005260046000fd5b346103fe5760003660031901126103fe5760206040517f7b765e0e932d348852a6f810bfa1ab891e259123f02db8cdcde614c5702233578152f35b60403660031901126103fe576004356107b081610473565b602435906001600160a01b036107c583612a42565b1690813303610834575b8061080b6001600160a01b03926107f0866000526006602052604060002090565b906001600160a01b03166001600160a01b0319825416179055565b16907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b81600052600760205260ff610860336040600020906001600160a01b0316600052602052604060002090565b54166107cf576129cd565b346103fe5760003660031901126103fe576000546001546040519103600019018152602090f35b60609060031901126103fe576004356108aa81610473565b906024356108b781610473565b9060443590565b6105476108ca36610892565b91611b2f565b346103fe5760203660031901126103fe5760206108fd600435600052600960205260016040600020015490565b604051908152f35b346103fe5760203660031901126103fe576001600160a01b0360043561092a81610473565b166000526015602052602060ff604060002054166040519015158152f35b346103fe5760403660031901126103fe5760043560243590600052600c602052604060002054906001600160a01b0382169160a01c82156109bd575b612710916bffffffffffffffffffffffff6109a0921690611d32565b604080516001600160a01b03949094168452919004602083015290f35b50600b546001600160a01b038116925060a01c610984565b346103fe5760003660031901126103fe5760206040516001600160a01b037f0000000000000000000000003a95fb432520d7ab9d136958e96915479f7284bb168152f35b346103fe5760403660031901126103fe57610547602435600435610a3c82610473565b610a5c610a5782600052600960205260016040600020015490565b612923565b612ab2565b346103fe5760003660031901126103fe5760206040516001600160a01b037f00000000000000000000000068160933deb55de5291dbd18016e20c18350113e168152f35b346103fe5760003660031901126103fe57602060405160028152f35b346103fe5760403660031901126103fe57600435602435610ae181610473565b336001600160a01b03821603610afa5761054791612b56565b63334bd91960e11b60005260046000fd5b346103fe5760203660031901126103fe57610547600435610b2a61285e565b612d43565b346103fe5760003660031901126103fe57610b4861285e565b610b50612da3565b600080808047335af1610b61611d70565b5015610b6e576001600a55005b6312171d8360e31b60005260046000fd5b346103fe5760203660031901126103fe5761067b610b9e600435611f89565b6040519182916020835260208301906105da565b346103fe5760003660031901126103fe5760206040516001600160a01b037f000000000000000000000000f315bc82cf65ec3c4e77d57f84cff1473652afa4168152f35b610547610c0236610892565b9060405192610c12602085611496565b6000845261281b565b9060206003198301126103fe5760043567ffffffffffffffff81116103fe57826023820112156103fe5780600401359267ffffffffffffffff84116103fe5760248460051b830101116103fe576024019190565b346103fe57610c7d36610c1b565b90610c866128b1565b610c8e612da3565b60005b828110610c9f576001600a55005b806001600160a01b03610cb560019386866127c0565b35610cbf81610473565b16600052601560205260406000208260ff1982541617905501610c91565b346103fe5760003660031901126103fe576020600e54604051908152f35b346103fe5760003660031901126103fe57610d1461285e565b60105461ff0060ff8260081c161560081b169061ff00191617601055600080f35b346103fe5760003660031901126103fe576020601454604051908152f35b346103fe5760003660031901126103fe57602060ff60105460081c166040519015158152f35b346103fe5760203660031901126103fe5760206001600160a01b03610d9f600435612a42565b16604051908152f35b346103fe5760003660031901126103fe576020600d54604051908152f35b346103fe5760203660031901126103fe576001600160a01b03600435610deb81610473565b168015610e14576000526005602052602067ffffffffffffffff60406000205416604051908152f35b6323d3ad8160e21b60005260046000fd5b346103fe5760003660031901126103fe576020601354604051908152f35b346103fe5760003660031901126103fe57610e5c61285e565b60105460ff80821615169060ff191617601055600080f35b346103fe57610e8236610c1b565b90610e8b6128b1565b610e93612da3565b60005b828110610ea4576001600a55005b806001600160a01b03610eba60019386866127c0565b35610ec481610473565b16600052601660205260406000208260ff1982541617905501610e96565b346103fe5760403660031901126103fe57602060ff610f2d602435600435610f0982610473565b600052600984526040600020906001600160a01b0316600052602052604060002090565b54166040519015158152f35b346103fe5760003660031901126103fe5760206040516001600160a01b037f0000000000000000000000009e763207b713e70cacb40f5d33142e76ed7ffb20168152f35b346103fe5760003660031901126103fe5760405160006003548060011c906001811690811561102b575b6020831082146106eb5782855260208501919081156106d25750600114610fd85761067b8461066f81860382611496565b600360009081529250907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8184106110175750500161066f8261065f565b805484840152602090930192600101611004565b91607f1691610fa7565b346103fe5760203660031901126103fe576001600160a01b0360043561105a81610473565b166000526016602052602060ff604060002054166040519015158152f35b60203660031901126103fe5760043561109a61109660105460ff1690565b1590565b61119a57601154811161115d576110ce816110c8336001600160a01b03166000526017602052604060002090565b546127ff565b90601854421060001461117f576111056110966110fe336001600160a01b03166000526016602052604060002090565b5460ff1690565b61116e57601354821161115d575b61111f600d5482611d32565b340361114c5761054791611146336001600160a01b03166000526017602052604060002090565b55612d43565b634c5b39e360e01b60005260046000fd5b638cc2fc5560e01b60005260046000fd5b63522fc3bd60e01b60005260046000fd5b60125482111561111357638cc2fc5560e01b60005260046000fd5b63914edb0f60e01b60005260046000fd5b346103fe5760003660031901126103fe57602060405160008152f35b346103fe5760403660031901126103fe576004356111e481610473565b602435801515918282036103fe576112396001600160a01b0392336000526007602052611228836040600020906001600160a01b0316600052602052604060002090565b9060ff801983541691151516179055565b60405192835216907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b346103fe5760003660031901126103fe57336000526015602052611296611096604060002060ff90541690565b61116e576010546112ab9060081c60ff161590565b611318576112ba600f546127d5565b600e5410611307576112ec6112e2336001600160a01b03166000526015602052604060002090565b805460ff19169055565b6112ff6112fa600f5461280c565b600f55565b610547612c9d565b637b96017360e11b60005260046000fd5b62335e4b60ea1b60005260046000fd5b346103fe5760003660031901126103fe5760206040516001600160a01b037f000000000000000000000000dd541b89d4c89fe351828f698660f04dee6d6a93168152f35b346103fe5760003660031901126103fe576020600f54604051908152f35b346103fe5760203660031901126103fe576004356113a661285e565b42018042116113b457601855005b611cec565b346103fe5760003660031901126103fe5760206040516001600160a01b037f0000000000000000000000008582aaced82ae034eeb05f869d843634450db428168152f35b346103fe5760003660031901126103fe5760206040516001600160a01b037f0000000000000000000000008d2489ff3c82a92bc2b2f6c717ee7316cdb13ea4168152f35b346103fe5760203660031901126103fe5760043561145d61285e565b601255005b346103fe5760003660031901126103fe576020601254604051908152f35b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176114b857604052565b611480565b604051906114cc604083611496565b565b604051906114cc61012083611496565b67ffffffffffffffff81116114b857601f01601f191660200190565b60803660031901126103fe5760043561151281610473565b6024359061151f82610473565b6044356064359267ffffffffffffffff84116103fe57366023850112156103fe5783600401359261154f846114de565b9361155d6040519586611496565b80855236602482880101116103fe5760208160009260246105479901838901378601015261281b565b346103fe5760203660031901126103fe576004356115a261285e565b601355005b346103fe5760003660031901126103fe5760206040516001600160a01b037f0000000000000000000000005bb638ea28314116514daa924310e9575c3a78f8168152f35b346103fe5760203660031901126103fe5760043561161061160b82611f89565b612fa8565b90600081807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000811015611908575b806d04ee2d6d415b85acef8100000000600a9210156118ec575b662386f26fc100008110156118d7575b6305f5e1008110156118c5575b6127108110156118b5575b60648110156118a6575b101561189b575b6116d6602161169d6001850161300f565b938401015b60001901917f3031323334353637383961626364656600000000000000000000000000000000600a82061a8353600a900490565b9081156116e6576116d6906116a2565b61067b61185861066f61186661175461160b602061185861184a8d6117546118148f8f6117546117dd61176861175a61172161180696613041565b946040519e8f9d8e016016907f7b226e616d65223a202248797065722046726f6720230000000000000000000081520190565b90611f72565b61088b60f21b815260020190565b7f226465736372697074696f6e223a202248797065722046726f6773206172652081527f70757265204153434949206172742066726f677320616e64206c69766520313060208201527f3025206f6e636861696e206f6e2048797065726c69717569642e222c000000006040820152605c0190565b7f2261747472696275746573223a205b00000000000000000000000000000000008152600f0190565b61174b60f21b815260020190565b7f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b626173815263194d8d0b60e21b602082015260240190565b61227d60f01b815260020190565b03601f198101835282611496565b6040517f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006020820152928391603d8301611754565b60019091019061168c565b60029060649004930192611685565b600490612710900493019261167b565b6008906305f5e1009004930192611670565b601090662386f26fc100009004930192611663565b6020906d04ee2d6d415b85acef81000000009004930192611653565b50604091507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008304611639565b346103fe5760003660031901126103fe57602060ff601054166040519015158152f35b346103fe5760403660031901126103fe5761054760243560043561197682610473565b611991610a5782600052600960205260016040600020015490565b612b56565b346103fe5760003660031901126103fe5760206040516108ae8152f35b346103fe5760203660031901126103fe576004356119cf61285e565b600e55005b346103fe5760203660031901126103fe576004356000526019602052604060002060ff81541661067b6001830154926002810154906003810154600482015460ff600584015416906006840154926008600786015495015495604051998a998a95926101009794919a9998959261012088019b151588526020880152604087015260608601526080850152151560a084015260c083015260e08201520152565b346103fe5760403660031901126103fe57602060ff610f2d600435611a9881610473565b6001600160a01b0360243591611aad83610473565b16600052600784526040600020906001600160a01b0316600052602052604060002090565b346103fe5760003660031901126103fe576020601854604051908152f35b346103fe5760003660031901126103fe576020601154604051908152f35b346103fe5760203660031901126103fe57600435611b2a61285e565b600d55005b9190916001600160a01b03611b4383612a42565b911692836001600160a01b03831603611ce757600083815260066020526040902080549290611b816001600160a01b03871633908114908614171590565b611c9e575b6001600160a01b0393611c94575b50611bb2856001600160a01b03166000526005602052604060002090565b8054600019019055611bd7826001600160a01b03166000526005602052604060002090565b805460010190556001600160a01b0382164260a01b17600160e11b17611c07856000526004602052604060002090565b55600160e11b811615611c4a575b501680927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a415611c4557565b6129ff565b60018401611c62816000526004602052604060002090565b5415611c6f575b50611c15565b6000548114611c6957611c8c906000526004602052604060002090565b553880611c69565b6000905538611b94565b611cdd6110966110fe33611cc58a6001600160a01b03166000526007602052604060002090565b906001600160a01b0316600052602052604060002090565b15611b86576129ee565b6129de565b634e487b7160e01b600052601160045260246000fd5b908160021b917f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116036113b457565b818102929181159184041417156113b457565b634e487b7160e01b600052601260045260246000fd5b60405190611d6a602083611496565b60008252565b3d15611d9b573d90611d81826114de565b91611d8f6040519384611496565b82523d6000602084013e565b606090565b15611da757565b60405162461bcd60e51b815260206004820152601460248201527f546f6b656e20646f6573206e6f742065786973740000000000000000000000006044820152606490fd5b906008611df76114ce565b92611e0c611e06825460ff1690565b15158552565b60018101546020850152600281015460408501526003810154606085015260048101546080850152611e4e611e45600583015460ff1690565b151560a0860152565b600681015460c0850152600781015460e08501520154610100830152565b6020818303126103fe5780519067ffffffffffffffff82116103fe570181601f820112156103fe5760208151910190611ea4816114de565b92611eb26040519485611496565b818452818301116103fe576106109160208401906105b7565b6040513d6000823e3d90fd5b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f737667222076696577426f783d2230203020393020393022207368617060208201527f652d72656e646572696e673d2263726973704564676573222077696474683d2260408201527f35313222206865696768743d22353132223e0000000000000000000000000000606082015260720190565b90611f85602092828151948592016105b7565b0190565b611fb1611fb691611fa1611f9c8261297e565b611da0565b6000526019602052604060002090565b611dec565b8051612518576040818101805191516336a3880960e11b8152600481019290925290916001600160a01b037f0000000000000000000000005bb638ea28314116514daa924310e9575c3a78f816600084602481845afa92831561244257612047946000946124f7575b50516040516336a3880960e11b81526004810191909152936000918591829081906024820190565b03915afa928315612442576000936124da575b5060e081015160405163db5cc18160e01b815260048101919091526000816024817f000000000000000000000000dd541b89d4c89fe351828f698660f04dee6d6a936001600160a01b03165afa8015612442576120bf9160009161241f575b50612dc5565b6060820151604051630c0a76ed60e41b815260048101919091529091906000816024817f0000000000000000000000003a95fb432520d7ab9d136958e96915479f7284bb6001600160a01b03165afa8015612442576121259160009161241f5750612dc5565b60a08201516000901561245b57506080820151604051633d04ca4360e11b815260048101919091526000816024817f0000000000000000000000008582aaced82ae034eeb05f869d843634450db4286001600160a01b03165afa8015612442576121969160009161241f5750612dc5565b60c083015160405163f708887760e01b815260048101919091529091906000816024817f0000000000000000000000008d2489ff3c82a92bc2b2f6c717ee7316cdb13ea46001600160a01b03165afa908115612442576101006122056122279360009384916124475750612dc5565b9501516040518093819263c8e1f0e560e01b8352600483019190602083019252565b03816001600160a01b037f00000000000000000000000068160933deb55de5291dbd18016e20c18350113e165afa80156124425761226c9160009161241f5750612dc5565b936040519687966020880161228090611ed7565b661e39ba3cb6329f60c91b815260070164737667207b60d81b81526005016b77696474683a20313030253b60a01b8152600c016c6865696768743a20313030253b60981b8152600d01696d617267696e3a20303b60b01b8152600a016a70616464696e673a20303b60a81b8152600b01706f766572666c6f773a2068696464656e3b60781b81526011016d646973706c61793a20666c65783b60901b8152600e017f6a7573746966792d636f6e74656e743a2063656e7465723b000000000000000081526018016a3130b1b5b3b937bab7321d60a91b8152600b0161236491611f72565b603b60f81b8152600101607d60f81b8152600101671e17b9ba3cb6329f60c11b81526008017f3c726563742077696474683d22393022206865696768743d223930222066696c815262361e9160e91b60208201526023016123c491611f72565b6211179f60e91b81526003016123d991611f72565b6123e291611f72565b6123eb91611f72565b6123f491611f72565b6123fd91611f72565b651e17b9bb339f60d11b81526006015b03601f19810182526106109082611496565b61243c91503d806000833e6124348183611496565b810190611e6c565b386120b9565b611ecb565b61243c91503d8086833e6124348183611496565b608083015160405163093a2e0160e41b8152600481019190915281816024817f000000000000000000000000f315bc82cf65ec3c4e77d57f84cff1473652afa46001600160a01b03165afa908115612442578261219693926124bf575b5050612dc5565b6124d392503d8091833e6124348183611496565b38806124b8565b6124f09193503d806000833e6124348183611496565b913861205a565b600092919450612510903d8085833e6124348183611496565b93909161201f565b6040818101805191516336a3880960e11b8152600481019290925290916001600160a01b037f0000000000000000000000005bb638ea28314116514daa924310e9575c3a78f816600084602481845afa928315612442576125a2946000946124f75750516040516336a3880960e11b81526004810191909152936000918591829081906024820190565b03915afa92831561244257600093612784575b506020015160405163d4c4205f60e01b8152600481019190915260008180602481015b03816001600160a01b037f0000000000000000000000009e763207b713e70cacb40f5d33142e76ed7ffb20165afa80156124425761261d9160009161241f5750612dc5565b60405192839261262f60208501611ed7565b661e39ba3cb6329f60c91b815260070164737667207b60d81b81526005016b77696474683a20313030253b60a01b8152600c016c6865696768743a20313030253b60981b8152600d01696d617267696e3a20303b60b01b8152600a016a70616464696e673a20303b60a81b8152600b01706f766572666c6f773a2068696464656e3b60781b81526011016d646973706c61793a20666c65783b60901b8152600e017f6a7573746966792d636f6e74656e743a2063656e7465723b000000000000000081526018016a3130b1b5b3b937bab7321d60a91b8152600b0161271391611f72565b603b60f81b8152600101607d60f81b8152600101671e17b9ba3cb6329f60c11b81526008017f3c726563742077696474683d22393022206865696768743d223930222066696c815262361e9160e91b602082015260230161277391611f72565b6211179f60e91b81526003016123f4565b6125d891935060206127a16000923d8085833e6124348183611496565b949250506125b5565b634e487b7160e01b600052603260045260246000fd5b91908110156127d05760051b0190565b6127aa565b90600182018092116113b457565b60010190816001116113b457565b90600282018092116113b457565b919082018092116113b457565b60001981146113b45760010190565b929190612829828286611b2f565b803b612836575b50505050565b61283f93612f77565b1561284d5738808080612830565b6368d2bf6b60e11b60005260046000fd5b3360009081527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b602052604090205460ff161561289757565b63e2517d3f60e01b60005233600452600060245260446000fd5b3360009081527f8c4af4b3e409a4e4c1d5953bf32c229250bfc1acdfc654ce3bba3cb8b8feea0b602052604090205460ff16156128ea57565b63e2517d3f60e01b600052336004527f7b765e0e932d348852a6f810bfa1ab891e259123f02db8cdcde614c57022335760245260446000fd5b80600052600960205260ff61294f336040600020906001600160a01b0316600052602052604060002090565b5416156129595750565b63e2517d3f60e01b6000523360045260245260446000fd5b80156113b4576000190190565b90600091806001111561298e5750565b600054811061299a5750565b9091505b80600052600460205260406000205490816129c2576129bd9150612971565b61299e565b50600160e01b161590565b6367d9dca160e11b60005260046000fd5b62a1148160e81b60005260046000fd5b632ce44b5f60e11b60005260046000fd5b633a954ecd60e21b60005260046000fd5b636f96cda160e11b60005260046000fd5b63b562e8dd60e01b60005260046000fd5b622e076360e81b60005260046000fd5b80600111612a1057612a5e816000526004602052604060002090565b54908115612a755750600160e01b8116612a105790565b9050600054811015612a10575b60001901600081815260046020526040902054908115612aab5750600160e01b8116612a105790565b9050612a82565b80600052600960205260ff612ade836040600020906001600160a01b0316600052602052604060002090565b5416612b4f57806000526009602052612b0e826040600020906001600160a01b0316600052602052604060002090565b805460ff1916600117905533916001600160a01b0316907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d600080a4600190565b5050600090565b80600052600960205260ff612b82836040600020906001600160a01b0316600052602052604060002090565b541615612b4f57806000526009602052612bb3826040600020906001600160a01b0316600052602052604060002090565b805460ff1916905533916001600160a01b0316907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b600080a4600190565b6000198101919082116113b457565b602a198101919082116113b457565b90610100600891612c35612c238251151590565b859060ff801983541691151516179055565b60208101516001850155604081015160028501556060810151600385015560808101516004850155612c82612c6d60a0830151151590565b600586019060ff801983541691151516179055565b60c0810151600685015560e081015160078501550151910155565b6000546000198101908082116113b4576108ae10612d3257323303612d2157612cc5906127e3565b612cce43612bf1565b4060005b60018110612ce8575050506114cc600133613cc3565b80612d1b612cf8600193866127ff565b612d16612d0586836138c5565b916000526019602052604060002090565b612c0f565b01612cd2565b63875fdad760e01b60005260046000fd5b6352df9fe560e01b60005260046000fd5b600019600054018181018082116113b4576108ae10612d3257323303612d2157612d6c906127e3565b612d7543612bf1565b4060005b838110612d8d575050506114cc9033613cc3565b80612d9d612cf8600193866127ff565b01612d79565b6002600a5414612db4576002600a55565b633ee5aeb560e01b60005260046000fd5b90815115612e775781515b80151580612e51575b15612dec57612de790612971565b612dd0565b612df58161300f565b9060005b818110612e07575090925050565b80612e3d612e1760019388613dfa565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60001a612e4a8286613dfa565b5301612df9565b5060001981018181116113b457612e70612e1760ff60f81b9286613dfa565b1615612dd9565b9050604051612e87602082611496565b6000815290565b908160209103126103fe5751610610816103ec565b90926001600160a01b03608093816106109796168452166020830152604082015281606082015201906105da565b91612f019260209260006001600160a01b03604051809781968295630a85bd0160e11b8452853360048601612ea3565b0393165af160009181612f46575b50612f3057612f1c611d70565b805115612f2b57805190602001fd5b61284d565b6001600160e01b031916630a85bd0160e11b1490565b612f6991925060203d602011612f70575b612f618183611496565b810190612e8e565b9038612f0f565b503d612f57565b9060209260006001600160a01b03612f01969460405197889687958693630a85bd0160e11b85523360048601612ea3565b60405161061091612fba606083611496565b604082527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208301527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040830152613e0b565b90613019826114de565b6130266040519182611496565b8281528092613037601f19916114de565b0190602036910137565b611fb1613058916000526019602052604060002090565b80516135855760a081015160009190156135055760808101516040516280c7e960e31b8152600481019190915291506000826024817f0000000000000000000000008582aaced82ae034eeb05f869d843634450db4286001600160a01b03165afa8015612442576130f4926000916134ea575b50905b600060408201516040518095819263ae11c58960e01b8352600483019190602083019252565b03816001600160a01b037f0000000000000000000000005bb638ea28314116514daa924310e9575c3a78f8165afa9182156124425761315c936000936134cd575b5060006060830151604051809681926385a96b9560e01b8352600483019190602083019252565b03816001600160a01b037f0000000000000000000000003a95fb432520d7ab9d136958e96915479f7284bb165afa938415612442576000946134aa575b5060c08201516040516359c9d30b60e01b81526004810191909152919060008380602481015b03816001600160a01b037f0000000000000000000000008d2489ff3c82a92bc2b2f6c717ee7316cdb13ea4165afa908115612442576132279360009261348d575b50600060e08401516040518096819263c433cd6d60e01b8352600483019190602083019252565b03816001600160a01b037f000000000000000000000000dd541b89d4c89fe351828f698660f04dee6d6a93165afa928315612442576132909460009461346a575b5061010060009101516040518096819263ef3b9a8b60e01b8352600483019190602083019252565b03816001600160a01b037f00000000000000000000000068160933deb55de5291dbd18016e20c18350113e165afa9384156124425760009461344d575b50604080517f7b2274726169745f74797065223a224261636b64726f70222c202276616c7565602082015262111d1160e91b918101919091529586956043870161331691611f72565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a22486174222c202276616c7565223a2200008152601e0161335191611f72565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2245796573222c202276616c7565223a22008152601f0161338c91611f72565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a224d6f757468222c202276616c7565223a2281526020016133c791611f72565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a22426f6479222c202276616c7565223a22008152601f0161340291611f72565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2246656574222c202276616c7565223a22008152601f0161343d91611f72565b61227d60f01b815260020161240d565b6134639194503d806000833e6124348183611496565b92386132cd565b6000919450613485610100913d8085833e6124348183611496565b949150613268565b6134a39192503d806000833e6124348183611496565b9038613200565b6131bf929194506134c5903d806000833e6124348183611496565b939091613199565b6134e39193503d806000833e6124348183611496565b9138613135565b6134ff91503d806000833e6124348183611496565b386130cb565b6080810151604051630ff6ff9d60e11b8152600481019190915282816024817f000000000000000000000000f315bc82cf65ec3c4e77d57f84cff1473652afa46001600160a01b03165afa90811561244257836130f4949261356a575b5050906130ce565b61357e92503d8091833e6124348183611496565b3880613562565b60208101516040516374f8a20b60e01b81526004810191909152906000826024817f0000000000000000000000009e763207b713e70cacb40f5d33142e76ed7ffb206001600160a01b03165afa91821561244257600092613796575b50604090810151905163ae11c58960e01b8152600481019190915260008180602481015b03816001600160a01b037f0000000000000000000000005bb638ea28314116514daa924310e9575c3a78f8165afa9081156124425760009161377b575b50604080517f7b2274726169745f74797065223a224261636b64726f70222c202276616c7565602082015262111d1160e91b918101919091529182916043830161368b91611f72565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a22486174222c202276616c7565223a2200008152601e016136c79082611f72565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2245796573222c202276616c7565223a22008152601f016137039082611f72565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a224d6f757468222c202276616c7565223a22815260200161373f9082611f72565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a22426f6479222c202276616c7565223a22008152601f016134029082611f72565b61379091503d806000833e6124348183611496565b38613642565b60406137b260009261360594953d8091833e6124348183611496565b939250506135e1565b60405190610120820182811067ffffffffffffffff8211176114b8576040526000610100838281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e08201520152565b9060058110156127d05760051b0190565b908160209103126103fe575190565b811561383b570690565b611d45565b6020818303126103fe5780519067ffffffffffffffff82116103fe57019080601f830112156103fe5781519167ffffffffffffffff83116114b8578260051b90604051936138916020840186611496565b84526020808501928201019283116103fe57602001905b8282106138b55750505090565b81518152602091820191016138a8565b6138d7916138d16137bb565b50613eef565b6138e18151613fa2565b613bce57805160405163e08b9d1f60e01b8152906000826004817f0000000000000000000000003a95fb432520d7ab9d136958e96915479f7284bb6001600160a01b03165afa9081156124425761394092600092613b20575b50613ff7565b90602081015160405163612c825160e11b8152906000826004817f0000000000000000000000008d2489ff3c82a92bc2b2f6c717ee7316cdb13ea46001600160a01b03165afa9081156124425761399e92600092613b205750613ff7565b6040820151604051639984fb8760e01b8152906000826004817f000000000000000000000000dd541b89d4c89fe351828f698660f04dee6d6a936001600160a01b03165afa908115612442576139fb92600092613b205750613ff7565b90606083015160405163481ec82360e01b8152906000826004817f00000000000000000000000068160933deb55de5291dbd18016e20c18350113e6001600160a01b03165afa90811561244257613a64613a7392613a6b92613a7895600092613b205750613ff7565b9560800190565b516064900690565b6127d5565b602b8111613b45576040516374665b6d60e01b81526001906000816004817f0000000000000000000000008582aaced82ae034eeb05f869d843634450db4286001600160a01b03165afa801561244257613b0d93613add92600092613b205750613ff7565b613ae56114ce565b966000885260006020890152600060408901526060880152608087015260a086019015159052565b60c084015260e083015261010082015290565b613b3e9192503d806000833e613b368183611496565b810190613840565b903861393a565b613b50600091612c00565b906040516336c4392760e11b81526000816004816001600160a01b037f000000000000000000000000f315bc82cf65ec3c4e77d57f84cff1473652afa4165afa801561244257613b0d93613bac92600092613bb1575b50614034565b613add565b613bc79192503d806000833e613b368183611496565b9038613ba6565b613beb90613be5613be060145461280c565b601455565b60200190565b51604051637fc1383360e01b8152906020826004817f0000000000000000000000009e763207b713e70cacb40f5d33142e76ed7ffb206001600160a01b03165afa90811561244257613c4592600092613c92575b50613831565b613c4d6114ce565b60018152906020820152600060408201526000606082015260006080820152613c7960a0820160019052565b600060c0820152600060e0820152600061010082015290565b613cb591925060203d602011613cbc575b613cad8183611496565b810190613822565b9038613c3f565b503d613ca3565b9160405190613cd3602083611496565b60008252600054918315613df5576001600160a01b0385164260a01b6001861460e11b1717613d0c846000526004602052604060002090565b55613d2a856001600160a01b03166000526005602052604060002090565b68010000000000000001850281540190556001600160a01b038516938415613df057808401939560015b15613d88575b60008787827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4613d54565b9560010195848703613d5a5792955092909350600055803b613da957505050565b9091926000549283039260015b15613dda575b6000613dd061109687600188019787612ed1565b15613db65761284d565b808410613dbc579250925050600054036103fe57565b612a32565b612a21565b9081518110156127d0570160200190565b919091805115613ee457613e39613e34613e2f613e2884516127f1565b6003900490565b611d02565b61300f565b9060208201908081518201956020870190815192600083525b888110613e965750506003939495965052510680600114613e8357600214613e78575090565b603d90600019015390565b50603d9081600019820153600119015390565b600360049199969901986001603f8b5182828260121c16870101518453828282600c1c16870101518385015382828260061c1687010151600285015316840101516003820153019497613e52565b509050610610611d5b565b9190611858613f4d60405194613f0660a087611496565b60a036873760408051602081019283529081019490945233606090811b6bffffffffffffffffffffffff1916908501524460748501524260948501529291829060b4820190565b5190209160005b60058110613f6157509150565b604080516020810186815291810183905260019291613f9191613f878160608101611858565b5190206065900690565b613f9b8285613811565b5201613f54565b6000549060016000198301926108ae03016108ae81116113b457601454918260020392600284116113b457600214159384613fdf575b5050505090565b90919293506108ae1461383b57061038808080613fd8565b60005b82518110156140225760208160051b8401015182111561401c57600101613ffa565b91505090565b50505160001981019081116113b45790565b60005b82518110156140225760208160051b84010151602a1981019081116113b45782111561401c5760010161403756fea26469706673582212204d4326e159ee656002f6e7ca3889d5820df622813735cd65d5aebb919229c50a64736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000dd541b89d4c89fe351828f698660f04dee6d6a930000000000000000000000003a95fb432520d7ab9d136958e96915479f7284bb0000000000000000000000008582aaced82ae034eeb05f869d843634450db428000000000000000000000000f315bc82cf65ec3c4e77d57f84cff1473652afa40000000000000000000000008d2489ff3c82a92bc2b2f6c717ee7316cdb13ea400000000000000000000000068160933deb55de5291dbd18016e20c18350113e0000000000000000000000005bb638ea28314116514daa924310e9575c3a78f80000000000000000000000009e763207b713e70cacb40f5d33142e76ed7ffb20
-----Decoded View---------------
Arg [0] : _body (address): 0xdD541b89d4c89fe351828F698660F04deE6D6a93
Arg [1] : _hats (address): 0x3A95FB432520d7AB9d136958e96915479F7284Bb
Arg [2] : _eyesA (address): 0x8582aACeD82Ae034Eeb05F869d843634450dB428
Arg [3] : _eyesB (address): 0xF315bc82CF65EC3c4e77d57F84CfF1473652aFa4
Arg [4] : _mouth (address): 0x8D2489ff3c82A92BC2b2F6c717eE7316cDb13Ea4
Arg [5] : _feet (address): 0x68160933deB55de5291dbd18016E20C18350113E
Arg [6] : _backdrop (address): 0x5bB638Ea28314116514daa924310E9575C3a78f8
Arg [7] : _oneOfOne (address): 0x9e763207b713e70cacb40f5d33142e76eD7FfB20
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000dd541b89d4c89fe351828f698660f04dee6d6a93
Arg [1] : 0000000000000000000000003a95fb432520d7ab9d136958e96915479f7284bb
Arg [2] : 0000000000000000000000008582aaced82ae034eeb05f869d843634450db428
Arg [3] : 000000000000000000000000f315bc82cf65ec3c4e77d57f84cff1473652afa4
Arg [4] : 0000000000000000000000008d2489ff3c82a92bc2b2f6c717ee7316cdb13ea4
Arg [5] : 00000000000000000000000068160933deb55de5291dbd18016e20c18350113e
Arg [6] : 0000000000000000000000005bb638ea28314116514daa924310e9575c3a78f8
Arg [7] : 0000000000000000000000009e763207b713e70cacb40f5d33142e76ed7ffb20
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in HYPE
Token Allocations
HYPE
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| HYPEREVM | 100.00% | $22.08 | 0.000000000001 | <$0.000001 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.