ETH Price: $3,339.87 (+0.10%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Dogewood

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-01
*/

pragma solidity 0.8.7;


// SPDX-License-Identifier: Unlicense
/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// Taken from Solmate: https://github.com/Rari-Capital/solmate
abstract contract ERC20 {
    /*///////////////////////////////////////////////////////////////
                                  EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

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

    function name() external view virtual returns (string memory);
    function symbol() external view virtual returns (string memory);
    function decimals() external view virtual returns (uint8);

    // string public constant name     = "TREAT";
    // string public constant symbol   = "TREAT";
    // uint8  public constant decimals = 18;

    /*///////////////////////////////////////////////////////////////
                             ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    mapping(address => bool) public isMinter;

    address public ruler;

    /*///////////////////////////////////////////////////////////////
                              ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    constructor() { ruler = msg.sender;}

    function approve(address spender, uint256 value) external returns (bool) {
        allowance[msg.sender][spender] = value;

        emit Approval(msg.sender, spender, value);

        return true;
    }

    function transfer(address to, uint256 value) external returns (bool) {
        balanceOf[msg.sender] -= value;

        // This is safe because the sum of all user
        // balances can't exceed type(uint256).max!
        unchecked {
            balanceOf[to] += value;
        }

        emit Transfer(msg.sender, to, value);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool) {
        if (allowance[from][msg.sender] != type(uint256).max) {
            allowance[from][msg.sender] -= value;
        }

        balanceOf[from] -= value;

        // This is safe because the sum of all user
        // balances can't exceed type(uint256).max!
        unchecked {
            balanceOf[to] += value;
        }

        emit Transfer(from, to, value);

        return true;
    }

    /*///////////////////////////////////////////////////////////////
                             PRIVILEGE
    //////////////////////////////////////////////////////////////*/

    function mint(address to, uint256 value) external {
        require(isMinter[msg.sender], "FORBIDDEN TO MINT");
        _mint(to, value);
    }

    function burn(address from, uint256 value) external {
        require(isMinter[msg.sender], "FORBIDDEN TO BURN");
        _burn(from, value);
    }

    /*///////////////////////////////////////////////////////////////
                         Ruler Function
    //////////////////////////////////////////////////////////////*/

    function setMinter(address minter, bool status) external {
        require(msg.sender == ruler, "NOT ALLOWED TO RULE");

        isMinter[minter] = status;
    }

    function setRuler(address ruler_) external {
        require(msg.sender == ruler ||ruler == address(0), "NOT ALLOWED TO RULE");

        ruler = ruler_;
    }


    /*///////////////////////////////////////////////////////////////
                          INTERNAL UTILS
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 value) internal {
        totalSupply += value;

        // This is safe because the sum of all user
        // balances can't exceed type(uint256).max!
        unchecked {
            balanceOf[to] += value;
        }

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

    function _burn(address from, uint256 value) internal {
        balanceOf[from] -= value;

        // This is safe because a user won't ever
        // have a balance larger than totalSupply!
        unchecked {
            totalSupply -= value;
        }

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

/// @notice Modern and gas efficient ERC-721 + ERC-20/EIP-2612-like implementation,
/// including the MetaData, and partially, Enumerable extensions.
contract ERC721 {
    /*///////////////////////////////////////////////////////////////
                                  EVENTS
    //////////////////////////////////////////////////////////////*/
    
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    
    event Approval(address indexed owner, address indexed spender, uint256 indexed tokenId);
    
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    
    /*///////////////////////////////////////////////////////////////
                             METADATA STORAGE
    //////////////////////////////////////////////////////////////*/
    
    address        implementation_;
    address public admin; //Lame requirement from opensea
    
    /*///////////////////////////////////////////////////////////////
                             ERC-721 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;
    uint256 public oldSupply;
    uint256 public minted;
    
    mapping(address => uint256) public balanceOf;
    
    mapping(uint256 => address) public ownerOf;
        
    mapping(uint256 => address) public getApproved;
 
    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*///////////////////////////////////////////////////////////////
                             VIEW FUNCTION
    //////////////////////////////////////////////////////////////*/

    function owner() external view returns (address) {
        return admin;
    }
    
    /*///////////////////////////////////////////////////////////////
                              ERC-20-LIKE LOGIC
    //////////////////////////////////////////////////////////////*/
    
    function transfer(address to, uint256 tokenId) external {
        require(msg.sender == ownerOf[tokenId], "NOT_OWNER");
        
        _transfer(msg.sender, to, tokenId);
        
    }
    
    /*///////////////////////////////////////////////////////////////
                              ERC-721 LOGIC
    //////////////////////////////////////////////////////////////*/
    
    function supportsInterface(bytes4 interfaceId) external pure returns (bool supported) {
        supported = interfaceId == 0x80ac58cd || interfaceId == 0x5b5e139f;
    }
    
    function approve(address spender, uint256 tokenId) external {
        address owner_ = ownerOf[tokenId];
        
        require(msg.sender == owner_ || isApprovedForAll[owner_][msg.sender], "NOT_APPROVED");
        
        getApproved[tokenId] = spender;
        
        emit Approval(owner_, spender, tokenId); 
    }
    
    function setApprovalForAll(address operator, bool approved) external {
        isApprovedForAll[msg.sender][operator] = approved;
        
        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(address from, address to, uint256 tokenId) public {
        require(
            msg.sender == from 
            || msg.sender == getApproved[tokenId]
            || isApprovedForAll[from][msg.sender], 
            "NOT_APPROVED"
        );
        
        _transfer(from, to, tokenId);
        
    }
    
    function safeTransferFrom(address from, address to, uint256 tokenId) external {
        safeTransferFrom(from, to, tokenId, "");
    }
    
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public {
        transferFrom(from, to, tokenId); 
        
        if (to.code.length != 0) {
            // selector = `onERC721Received(address,address,uint,bytes)`
            (, bytes memory returned) = to.staticcall(abi.encodeWithSelector(0x150b7a02,
                msg.sender, from, tokenId, data));
                
            bytes4 selector = abi.decode(returned, (bytes4));
            
            require(selector == 0x150b7a02, "NOT_ERC721_RECEIVER");
        }
    }
    
    /*///////////////////////////////////////////////////////////////
                          INTERNAL UTILS
    //////////////////////////////////////////////////////////////*/

    function _transfer(address from, address to, uint256 tokenId) internal {
        require(ownerOf[tokenId] == from, "not owner");

        balanceOf[from]--; 
        balanceOf[to]++;
        
        delete getApproved[tokenId];
        
        ownerOf[tokenId] = to;
        emit Transfer(from, to, tokenId); 

    }

    function _mint(address to, uint256 tokenId) internal { 
        require(ownerOf[tokenId] == address(0), "ALREADY_MINTED");

        totalSupply++;

        // This is safe because the sum of all user
        // balances can't exceed type(uint256).max!
        unchecked {
            balanceOf[to]++;
        }
        
        ownerOf[tokenId] = to;
                
        emit Transfer(address(0), to, tokenId); 
    }
    
    function _burn(uint256 tokenId) internal { 
        address owner_ = ownerOf[tokenId];
        
        require(ownerOf[tokenId] != address(0), "NOT_MINTED");
        
        totalSupply--;
        balanceOf[owner_]--;
        
        delete ownerOf[tokenId];
                
        emit Transfer(owner_, address(0), tokenId); 
    }
}

interface ITraits {
  function tokenURI(uint256 tokenId) external view returns (string memory);
  function tokenURINotRevealed(uint256 tokenId) external view returns (string memory);
  function tokenURITopTalents(uint8 topTalentNo, uint256 tokenId) external view returns (string memory);
}

interface IDrawSvg {
  function drawSvg(
    string memory svgBreedColor, string memory svgBreedHead, string memory svgOffhand, string memory svgArmor, string memory svgMainhand
  ) external view returns (string memory);
  function drawSvgNew(
    string memory svgBreedColor, string memory svgBreedHead, string memory svgOffhand, string memory svgArmor, string memory svgMainhand
  ) external view returns (string memory);
}

interface INameChange {
  function changeName(address owner, uint256 id, string memory newName) external;
}

interface IDogewood {
    // struct to store each token's traits
    struct Doge2 {
        uint8 head;
        uint8 breed;
        uint8 color;
        uint8 class;
        uint8 armor;
        uint8 offhand;
        uint8 mainhand;
        uint16 level;
        uint16 breedRerollCount;
        uint16 classRerollCount;
        uint8 artStyle; // 0: new, 1: old
    }

    function getTokenTraits(uint256 tokenId) external view returns (Doge2 memory);
    function getGenesisSupply() external view returns (uint256);
    function validateOwnerOfDoge(uint256 id, address who_) external view returns (bool);
    function unstakeForQuest(address[] memory owners, uint256[] memory ids) external;
    function updateQuestCooldown(uint256[] memory doges, uint88 timestamp) external;
    function pull(address owner, uint256[] calldata ids) external;
    function manuallyAdjustDoge(uint256 id, uint8 head, uint8 breed, uint8 color, uint8 class, uint8 armor, uint8 offhand, uint8 mainhand, uint16 level, uint16 breedRerollCount, uint16 classRerollCount, uint8 artStyle) external;
    function transfer(address to, uint256 tokenId) external;
    // function doges(uint256 id) external view returns(uint8 head, uint8 breed, uint8 color, uint8 class, uint8 armor, uint8 offhand, uint8 mainhand, uint16 level);
}

interface IDogewoodForCommonerSale {
    function validateDogeOwnerForClaim(uint256 id, address who_) external view returns (bool);
}

interface ICastleForCommonerSale {
    function dogeOwner(uint256 id) external view returns (address);
}

// interface DogeLike {
//     function pull(address owner, uint256[] calldata ids) external;
//     function manuallyAdjustDoge(uint256 id, uint8 head, uint8 breed, uint8 color, uint8 class, uint8 armor, uint8 offhand, uint8 mainhand, uint16 level) external;
//     function transfer(address to, uint256 tokenId) external;
//     function doges(uint256 id) external view returns(uint8 head, uint8 breed, uint8 color, uint8 class, uint8 armor, uint8 offhand, uint8 mainhand, uint16 level);
// }
interface PortalLike {
    function sendMessage(bytes calldata message_) external;
}

interface CastleLike {
    function pullCallback(address owner, uint256[] calldata ids) external;
}

interface ERC20Like {
    function balanceOf(address from) external view returns(uint256 balance);
    function burn(address from, uint256 amount) external;
    function mint(address from, uint256 amount) external;
    function transfer(address to, uint256 amount) external;
    function transferFrom(address from, address to, uint256 value) external;
}

interface ERC1155Like {
    function mint(address to, uint256 id, uint256 amount) external;
    function burn(address from, uint256 id, uint256 amount) external;
}

interface ERC721Like {
    function transferFrom(address from, address to, uint256 id) external;   
    function transfer(address to, uint256 id) external;
    function ownerOf(uint256 id) external view returns (address owner);
    function mint(address to, uint256 tokenid) external;
}

interface QuestLike {
    struct GroupConfig {
        uint16 lvlFrom;
        uint16 lvlTo;
        uint256 entryFee; // additional entry $TREAT
        uint256 initPrize; // init prize pool $TREAT
    }
    struct Action {
        uint256 id; // unique id to distinguish activities
        uint88 timestamp;
        uint256 doge;
        address owner;
        uint256 score;
        uint256 finalScore;
    }

    function doQuestByAdmin(uint256 doge, address owner, uint256 score, uint8 groupIndex, uint256 combatId) external;
}

interface IOracle {
    function request() external returns (uint64 key);
    function getRandom(uint64 id) external view returns(uint256 rand);
}

interface IVRF {
    function getRandom(uint256 seed) external returns (uint256);
    function getRandom(string memory seed) external returns (uint256);
    function getRand(uint256 nonce) external view returns (uint256);
    function getRange(uint min, uint max,uint nonce) external view returns(uint);
}

interface ICommoner {
    // struct to store each token's traits
    struct Commoner {
        uint8 head;
        uint8 breed;
        uint8 palette;
        uint8 bodyType;
        uint8 clothes;
        uint8 accessory;
        uint8 background;
        uint8 smithing;
        uint8 alchemy;
        uint8 cooking;
    }

    function getTokenTraits(uint256 tokenId) external view returns (Commoner memory);
    function getGenesisSupply() external view returns (uint256);
    function validateOwner(uint256 id, address who_) external view returns (bool);
    function pull(address owner, uint256[] calldata ids) external;
    function adjust(uint256 id, uint8 head, uint8 breed, uint8 palette, uint8 bodyType, uint8 clothes, uint8 accessory, uint8 background, uint8 smithing, uint8 alchemy, uint8 cooking) external;
    function transfer(address to, uint256 tokenId) external;
}

contract Dogewood is ERC721 {
    /*///////////////////////////////////////////////////////////////
                    Global STATE
    //////////////////////////////////////////////////////////////*/
    // max number of tokens that can be minted - 5000 in production
    uint256 public constant MAX_SUPPLY = 5000;
    uint256 public constant GENESIS_SUPPLY = 2500;
    uint256 public constant mintCooldown = 12 hours;

    // Helpers to get Percentages
    uint256 constant tenPct = (type(uint16).max / 100) * 10;
    uint256 constant fifteenPct = (type(uint16).max / 100) * 15;
    uint256 constant fiftyPct = (type(uint16).max / 100) * 50;

    bool public presaleActive;
    bool public saleActive;
    mapping (address => uint8) public whitelist;
    mapping (address => uint8) public ogWhitelist;

    uint256 public mintPriceEth;
    uint256 public mintPriceZug;
    uint16 public constant MAX_ZUG_MINT = 200;
    uint16 public zugMintCount;

    // list of probabilities for each trait type
    // 0 - 6 are associated with head, breed, color, class, armor, offhand, mainhand
    uint8[][7] public rarities;
    // list of aliases for Walker's Alias algorithm
    // 0 - 6 are associated with head, breed, color, class, armor, offhand, mainhand
    uint8[][7] public aliases;
    // mapping from hashed(tokenTrait) to the tokenId it's associated with
    // used to ensure there are no duplicates
    mapping(uint256 => uint256) public existingCombinations;

    bool public rerollTreatOnly;
    uint256 public rerollPriceEth;
    uint256 public rerollPriceZug;
    uint256[] public rerollPrice;

    // level 1-20
    uint256[] public upgradeLevelPrice;

    bytes32 internal entropySauce;

    ERC20 public treat;
    ERC20 public zug;

    mapping(address => bool) public auth;
    mapping(uint256 => Doge) internal doges;
    mapping(uint256 => Action) public activities;
    mapping(uint256 => Log) public mintLogs;
    mapping(RerollTypes => mapping(uint256 => uint256)) public rerollCountHistory; // rerollType => tokenId => rerollCount

    // reference to Traits
    ITraits public traits;

    mapping(uint256 => uint256) public rerollBlocks;

    // Layer2 migration data -------------
    // MetadataHandlerLike public metadaHandler;
    mapping(bytes4 => address) implementer;

    // TODO -- remove fallback?
    address constant impl = 0x7ef61741D9a2b483E75D8AA0876Ce864d98cE331;

    address public castle;

    mapping(uint256 => uint8) public artStyles; // tokenId => style (0: new, 1: old)

    /*///////////////////////////////////////////////////////////////
                    End of data
    //////////////////////////////////////////////////////////////*/

    function setImplementer(bytes4[] calldata funcs, address source) external onlyOwner {
        for (uint256 index = 0; index < funcs.length; index++) {
            implementer[funcs[index]] = source; 
        }
    }

    function setAddresses(
        address _traits,
        address _treat,
        address _zug,
        address _castle
    ) external onlyOwner {
        traits = ITraits(_traits);
        treat = ERC20(_treat);
        zug = ERC20(_zug);
        castle = _castle;
    }

    function setTreat(address t_) external {
        require(msg.sender == admin);
        treat = ERC20(t_);
    }

    function setZug(address z_) external {
        require(msg.sender == admin);
        zug = ERC20(z_);
    }

    function setCastle(address c_) external {
        require(msg.sender == admin);
        castle = c_;
    }

    function setTraits(address t_) external {
        require(msg.sender == admin);
        traits = ITraits(t_);
    }

    function setAuth(address add, bool isAuth) external onlyOwner {
        auth[add] = isAuth;
    }

    function transferOwnership(address newOwner) external onlyOwner {
        admin = newOwner;
    }

    function setPresaleStatus(bool _status) external onlyOwner {
        presaleActive = _status;
    }

    function setSaleStatus(bool _status) external onlyOwner {
        saleActive = _status;
    }

    function setMintPrice(uint256 _mintPriceEth, uint256 _mintPriceZug)
        external
        onlyOwner
    {
        mintPriceEth = _mintPriceEth;
        mintPriceZug = _mintPriceZug;
    }

    function setRerollTreatOnly(bool _rerollTreatOnly) external onlyOwner {
        rerollTreatOnly = _rerollTreatOnly;
    }

    function setRerollPrice(
        uint256 _rerollPriceEth,
        uint256 _rerollPriceZug,
        uint256[] calldata _rerollPriceTreat
    ) external onlyOwner {
        rerollPriceEth = _rerollPriceEth;
        rerollPriceZug = _rerollPriceZug;
        rerollPrice = _rerollPriceTreat;
    }

    function setUpgradeLevelPrice(uint256[] calldata _upgradeLevelPrice) external onlyOwner {
        upgradeLevelPrice = _upgradeLevelPrice;
    }

    // function editWhitelist(address[] calldata wlAddresses) external onlyOwner {
    //     for(uint256 i; i < wlAddresses.length; i++){
    //         whitelist[wlAddresses[i]] = 2;
    //     }
    // }

    // function editOGWhitelist(address[] calldata wlAddresses) external onlyOwner {
    //     for(uint256 i; i < wlAddresses.length; i++){
    //         ogWhitelist[wlAddresses[i]] = 1;
    //     }
    // }

    /** RENDER */

    function tokenURI(uint256 tokenId) public view returns (string memory) {
        // doges[tokenId] empty check
        require(rerollBlocks[tokenId] != block.number, "ERC721Metadata: URI query for nonexistent token");
        return traits.tokenURI(tokenId);
    }

    event ActionMade(
        address owner,
        uint256 id,
        uint256 timestamp,
        uint8 activity
    );

    /*///////////////////////////////////////////////////////////////
                DATA STRUCTURES 
    //////////////////////////////////////////////////////////////*/

    struct Doge {
        uint8 head;
        uint8 breed;
        uint8 color;
        uint8 class;
        uint8 armor;
        uint8 offhand;
        uint8 mainhand;
        uint16 level;
    }

    struct Doge2 {
        uint8 head;
        uint8 breed;
        uint8 color;
        uint8 class;
        uint8 armor;
        uint8 offhand;
        uint8 mainhand;
        uint16 level;
        uint16 breedRerollCount;
        uint16 classRerollCount;
        uint8 artStyle;
    }

    enum Actions {
        UNSTAKED,
        FARMING
    }
    struct Action {
        address owner;
        uint88 timestamp;
        Actions action;
    }
    struct Log {
        address owner;
        uint88 timestamp;
    }
    enum RerollTypes {
        BREED,
        CLASS
    }

    /*///////////////////////////////////////////////////////////////
                    CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/
    function initialize() public onlyOwner {
        admin = msg.sender;
        auth[msg.sender] = true;

        // initialize state
        presaleActive = false;
        saleActive = false;
        mintPriceEth = 0.065 ether;
        mintPriceZug = 300 ether;

        // I know this looks weird but it saves users gas by making lookup O(1)
        // A.J. Walker's Alias Algorithm
        // head
        rarities[0] = [173, 155, 255, 206, 206, 206, 114, 114, 114];
        aliases[0] = [2, 2, 8, 0, 0, 0, 0, 1, 1];
        // breed
        rarities[1] = [255, 255, 255, 255, 255, 255, 255, 255];
        aliases[1] = [7, 7, 7, 7, 7, 7, 7, 7];
        // color
        rarities[2] = [255, 188, 255, 229, 153, 76];
        aliases[2] = [2, 2, 5, 0, 0, 1];
        // class
        rarities[3] = [229, 127, 178, 255, 204, 204, 204, 102];
        aliases[3] = [2, 2, 3, 7, 0, 0, 1, 1];
        // armor
        rarities[4] = [255];
        aliases[4] = [0];
        // offhand
        rarities[5] = [255];
        aliases[5] = [0];
        // mainhand
        rarities[6] = [255];
        aliases[6] = [0];

        rerollTreatOnly = false;
        // set reroll price
        rerollPriceEth = 0.01 ether;
        rerollPriceZug = 50 ether;
        rerollPrice = [
            6 ether,
            12 ether,
            24 ether,
            48 ether,
            96 ether
        ];

        // set upgrade level price
        // level 1-20
        upgradeLevelPrice = [
            0 ether,
            12 ether,
            16 ether,
            20 ether,
            24 ether,
            30 ether,
            36 ether,
            42 ether,
            48 ether,
            54 ether,
            62 ether,
            70 ether,
            78 ether,
            86 ether,
            96 ether,
            106 ether,
            116 ether,
            126 ether,
            138 ether,
            150 ether
        ];
    }

    /*///////////////////////////////////////////////////////////////
                    MODIFIERS 
    //////////////////////////////////////////////////////////////*/

    modifier noCheaters() {
        uint256 size = 0;
        address acc = msg.sender;
        assembly {
            size := extcodesize(acc)
        }

        require(
            auth[msg.sender] || (msg.sender == tx.origin && size == 0),
            "you're trying to cheat!"
        );
        _;

        // We'll use the last caller hash to add entropy to next caller
        entropySauce = keccak256(abi.encodePacked(acc, block.coinbase, entropySauce));
    }

    modifier mintCoolDownPassed(uint256 id) {
        Log memory log_ = mintLogs[id];
        require(
            block.timestamp >= log_.timestamp + mintCooldown,
            "still in cool down"
        );
        _;
    }

    modifier isOwnerOfDoge(uint256 id) {
        require(
            ownerOf[id] == msg.sender || activities[id].owner == msg.sender,
            "not your doge"
        );
        _;
    }

    modifier ownerOfDoge(uint256 id, address who_) { 
        require(ownerOf[id] == who_ || activities[id].owner == who_, "not your doge");
        _;
    }

    modifier onlyOwner() {
        require(msg.sender == admin);
        _;
    }

    modifier genesisMinting(uint8 amount) {
        require(totalSupply + amount <= GENESIS_SUPPLY, "genesis all minted");
        _;
    }

    /*///////////////////////////////////////////////////////////////
                    PUBLIC FUNCTIONS
    //////////////////////////////////////////////////////////////*/

    function validateDogeOwnerForClaim(uint256 id, address who_) external view returns (bool) { 
        return (ownerOf[id] == who_ || activities[id].owner == who_ || ICastleForCommonerSale(castle).dogeOwner(id) == who_);
    }

    // function mintReserved(address to, uint8 amount) public genesisMinting(amount) onlyOwner {
    //     for (uint256 i = 0; i < amount; i++) {
    //         _mintDoge(to);
    //     }
    // }

    // function mintOG(address to, uint8 amount) public genesisMinting(amount) noCheaters {
    //     require(amount <= ogWhitelist[msg.sender], "Exceeds amount");

    //     ogWhitelist[msg.sender] = ogWhitelist[msg.sender] - amount;

    //     for (uint256 i = 0; i < amount; i++) {
    //         _mintDoge(to);
    //     }
    // }

    // function presaleMintWithEth(uint8 amount) public payable genesisMinting(amount) noCheaters {
    //     require(presaleActive, "Presale must be active to mint");
    //     require(amount <= whitelist[msg.sender], "Exceeds max amount");
    //     require(msg.value >= mintPriceEth * amount, "Value below price");

    //     whitelist[msg.sender] = whitelist[msg.sender] - amount;

    //     for (uint256 i = 0; i < amount; i++) {
    //         _mintDoge(msg.sender);
    //     }
    // }

    // function presaleMintWithZug(uint8 amount) public genesisMinting(amount) noCheaters {
    //     require(presaleActive, "Presale must be active to mint");
    //     require(whitelist[msg.sender] > 0, "No tokens reserved for this address");
    //     require(amount <= whitelist[msg.sender], "Exceeds max amount");
    //     require(zugMintCount+amount <= MAX_ZUG_MINT, "Exceeds max zug mint");

    //     whitelist[msg.sender] = whitelist[msg.sender] - amount;

    //     zug.transferFrom(msg.sender, address(this), mintPriceZug * amount);
    //     zugMintCount = zugMintCount + amount;
    //     for (uint256 i = 0; i < amount; i++) {
    //         _mintDoge(msg.sender);
    //     }
    // }

    // function mintWithEth(uint8 amount) public payable genesisMinting(amount) noCheaters {
    //     require(saleActive, "Sale must be active to mint");
    //     require(amount <= 2, "Exceeds max amount");
    //     require(msg.value >= mintPriceEth * amount, "Value below price");

    //     for (uint256 i = 0; i < amount; i++) {
    //         _mintDoge(msg.sender);
    //     }
    // }

    // function mintWithZug(uint8 amount) public genesisMinting(amount) noCheaters {
    //     require(saleActive, "Sale must be active to mint");
    //     require(amount <= 2, "Exceeds max amount");
    //     require(zugMintCount+amount <= MAX_ZUG_MINT, "Exceeds max zug mint");
    //     zug.transferFrom(msg.sender, address(this), mintPriceZug * amount);
    //     zugMintCount = zugMintCount + amount;
    //     for (uint256 i = 0; i < amount; i++) {
    //         _mintDoge(msg.sender);
    //     }
    // }

    function recruit(uint256 id) public ownerOfDoge(id, msg.sender) mintCoolDownPassed(id) noCheaters {
        require(totalSupply <= MAX_SUPPLY, "all supply minted");
        uint256 cost = _getMintingPrice();
        if (cost > 0) treat.burn(msg.sender, cost);
        mintLogs[id].timestamp = uint88(block.timestamp);
        _mintDoge(msg.sender);
    }

    function upgradeLevelWithTreat(uint256 id)
        public
        ownerOfDoge(id, msg.sender)
        mintCoolDownPassed(id)
        noCheaters
    {
        _claim(id); // Need to claim to not have equipment reatroactively multiplying

        uint16 curVal = doges[id].level;
        require(curVal < 20, "already max level");
        treat.burn(msg.sender, upgradeLevelPrice[curVal]);
        doges[id].level = curVal + 1;
    }

    function upgradeMultipleLevelWithTreat(uint256 id, uint16 toLevel)
        public
        ownerOfDoge(id, msg.sender)
        mintCoolDownPassed(id)
        noCheaters
    {
        uint16 curVal = doges[id].level;
        require(curVal < toLevel, "invalid level");
        require(toLevel <= 20, "exceeds max level");
        _claim(id); // Need to claim to not have equipment reatroactively multiplying

        treat.burn(msg.sender, getUpgradeLevelPrice(curVal, toLevel));
        doges[id].level = toLevel;
    }

    function getUpgradeLevelPrice(uint16 curLevel, uint16 toLevel) public view returns(uint256) {
        uint256 _price = 0;
        for (uint16 i = curLevel; i < toLevel; i++) {
            _price += upgradeLevelPrice[i];
        }
        return _price;
    }

    function changeArtStyle(uint256 id, uint8 style_) public ownerOfDoge(id, msg.sender) noCheaters {
        require(artStyles[id] != style_, "the same art style");
        artStyles[id] = style_;
    }

    // function rerollWithEth(uint256 id, RerollTypes rerollType)
    //     public
    //     payable
    //     ownerOfDoge(id, msg.sender)
    //     mintCoolDownPassed(id)
    //     noCheaters
    // {
    //     require(!rerollTreatOnly, "Only TREAT for reroll");
    //     require(msg.value >= rerollPriceEth, "Value below price");

    //     _reroll(id, rerollType);
    // }

    // function rerollWithZug(uint256 id, RerollTypes rerollType)
    //     public
    //     ownerOfDoge(id, msg.sender)
    //     mintCoolDownPassed(id)
    //     noCheaters
    // {
    //     require(!rerollTreatOnly, "Only TREAT for reroll");
    //     zug.transferFrom(msg.sender, address(this), rerollPriceZug);
    //     _reroll(id, rerollType);
    // }

    function rerollWithTreat(uint256 id, RerollTypes rerollType)
        public
        ownerOfDoge(id, msg.sender)
        mintCoolDownPassed(id)
        noCheaters
    {
        uint256 price_ = rerollPrice[
            rerollCountHistory[rerollType][id] < 5
                ? rerollCountHistory[rerollType][id]
                : 4
        ];
        treat.burn(msg.sender, price_);
        _reroll(id, rerollType);
    }

    function _reroll(
        uint256 id,
        RerollTypes rerollType
    ) internal {
        rerollBlocks[id] = block.number;
        uint256 rand_ = _rand();

        if (rerollType == RerollTypes.BREED) {
            doges[id].breed = uint8(_randomize(rand_, "BREED", id)) % uint8(rarities[1].length);
        } else if (rerollType == RerollTypes.CLASS) {
            uint16 randClass = uint16(_randomize(rand_, "CLASS", id));
            doges[id].class = selectTrait(randClass, 3);
        }
        rerollCountHistory[rerollType][id]++;
    }

    /**
    * allows owner to withdraw funds from minting
    */
    function withdraw() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
        zug.transfer(msg.sender, zug.balanceOf(address(this)));
    }

    function doAction(uint256 id, Actions action_)
        public
        ownerOfDoge(id, msg.sender)
        noCheaters
    {
        _doAction(id, msg.sender, action_, msg.sender);
    }

    function _doAction(
        uint256 id,
        address dogeOwner,
        Actions action_,
        address who_
    ) internal ownerOfDoge(id, who_) {
        Action memory action = activities[id];
        require(action.action != action_, "already doing that");

        // Picking the largest value between block.timestamp, action.timestamp and startingTime
        uint88 timestamp = uint88(
            block.timestamp > action.timestamp
                ? block.timestamp
                : action.timestamp
        );

        if (action.action == Actions.UNSTAKED) {
            require(doges[id].level == 20, "can't stake under level 20");
            _transfer(dogeOwner, address(this), id);
        } else {
            if (block.timestamp > action.timestamp) _claim(id);
            timestamp = timestamp > action.timestamp ? timestamp : action.timestamp;
        }

        address owner_ = action_ == Actions.UNSTAKED ? address(0) : dogeOwner;
        if (action_ == Actions.UNSTAKED) _transfer(address(this), dogeOwner, id);

        activities[id] = Action({
            owner: owner_,
            timestamp: timestamp,
            action: action_
        });
        emit ActionMade(dogeOwner, id, block.timestamp, uint8(action_));
    }

    function doActionWithManyDoges(uint256[] calldata ids, Actions action_)
        external
    {
        for (uint256 index = 0; index < ids.length; index++) {
            require(
                ownerOf[ids[index]] == msg.sender || activities[ids[index]].owner == msg.sender,
                "not your doge"
            );
            _doAction(ids[index], msg.sender, action_, msg.sender);
        }
    }

    function claim(uint256[] calldata ids) external {
        for (uint256 index = 0; index < ids.length; index++) {
            _claim(ids[index]);
        }
    }

    function _claim(uint256 id) internal noCheaters {
        Action memory action = activities[id];

        if (block.timestamp <= action.timestamp) return;

        uint256 timeDiff = uint256(block.timestamp - action.timestamp);

        if (action.action == Actions.FARMING && doges[id].level == 20)
            treat.mint(
                action.owner,
                claimableTreat(timeDiff, id, action.owner)
            );

        activities[id].timestamp = uint88(block.timestamp);
    }

    function pull(address owner_, uint256[] calldata ids) external {
        require (msg.sender == castle, "not castle");
        for (uint256 index = 0; index < ids.length; index++) {
            if (activities[ids[index]].action != Actions.UNSTAKED) _doAction(ids[index], owner_, Actions.UNSTAKED, owner_);
            _transfer(owner_, msg.sender, ids[index]);
        }
        CastleLike(msg.sender).pullCallback(owner_, ids);
    }

    function manuallyAdjustDoge(uint256 id, uint8 head, uint8 breed, uint8 color, uint8 class, uint8 armor, uint8 offhand, uint8 mainhand, uint16 level, uint16 breedRerollCount, uint16 classRerollCount, uint8 artStyle) external {
        require(msg.sender == admin || auth[msg.sender], "not authorized");
        doges[id].head = head;
        doges[id].breed = breed;
        doges[id].color = color;
        doges[id].class = class;
        doges[id].armor = armor;
        doges[id].offhand = offhand;
        doges[id].mainhand = mainhand;
        doges[id].level = level;
        rerollCountHistory[RerollTypes.BREED][id] = breedRerollCount;
        rerollCountHistory[RerollTypes.CLASS][id] = classRerollCount;
        artStyles[id] = artStyle;
    }

    /*///////////////////////////////////////////////////////////////
                    VIEWERS
    //////////////////////////////////////////////////////////////*/

    function getTokenTraits(uint256 tokenId) external view returns (Doge2 memory) {
        if (rerollBlocks[tokenId] == block.number) return Doge2({
            head: 0,
            breed: 0,
            color: 0,
            class: 0,
            armor: 0,
            offhand: 0,
            mainhand: 0,
            level: 0,
            breedRerollCount: 0,
            classRerollCount: 0,
            artStyle: 0
        });
        return Doge2({
            head: doges[tokenId].head,
            breed: doges[tokenId].breed,
            color: doges[tokenId].color,
            class: doges[tokenId].class,
            armor: doges[tokenId].armor,
            offhand: doges[tokenId].offhand,
            mainhand: doges[tokenId].mainhand,
            level: doges[tokenId].level,
            breedRerollCount: uint16(rerollCountHistory[RerollTypes.BREED][tokenId]),
            classRerollCount: uint16(rerollCountHistory[RerollTypes.CLASS][tokenId]),
            artStyle: artStyles[tokenId]
        });
    }

    function claimable(uint256 id) external view returns (uint256) {
        if (activities[id].action == Actions.FARMING) {
            uint256 timeDiff = block.timestamp > activities[id].timestamp
                ? uint256(block.timestamp - activities[id].timestamp)
                : 0;
            return claimableTreat(timeDiff, id, activities[id].owner);
        }
        return 0;
    }

    function getGenesisSupply() external pure returns (uint256) {
        return GENESIS_SUPPLY;
    }

    function name() external pure returns (string memory) {
        return "Doges";
    }

    function symbol() external pure returns (string memory) {
        return "Doges";
    }

    /*///////////////////////////////////////////////////////////////
                    MINT FUNCTION
    //////////////////////////////////////////////////////////////*/

    function _mintDoge(address to) internal {
        uint16 id = uint16(totalSupply + 1);
        rerollBlocks[id] = block.number;
        uint256 seed = random(id);
        generate(id, seed);
        _mint(to, id);
        mintLogs[id] = Log({
            owner: to,
            timestamp: uint88(block.timestamp)
        });
    }

    /*///////////////////////////////////////////////////////////////
                    INTERNAL  HELPERS
    //////////////////////////////////////////////////////////////*/

    function claimableTreat(uint256 timeDiff, uint256 id, address owner_)
        internal
        view
        returns (uint256)
    {
        Doge memory doge = doges[id];
        uint256 rand_ = _rand();

        uint256 treatAmount = (timeDiff * 1 ether) / 1 days;
        if (doge.class == 0) { // Warrior
            uint16 randPlus = uint16(_randomize(rand_, "Warrior1", id));
            if (randPlus < fifteenPct) return treatAmount * 115 / 100;

            randPlus = uint16(_randomize(rand_, "Warrior2", id));
            if (randPlus < fifteenPct) return treatAmount * 85 / 100;
            return treatAmount;
        } else if(doge.class == 1) { // Rogue
            uint16 randPlus = uint16(_randomize(rand_, "Rogue", id));
            if (randPlus < tenPct) return treatAmount * 3;
            return treatAmount;
        } else if(doge.class == 2) { // Mage
            uint16 randPlus = uint16(_randomize(rand_, "Mage", id));
            if (randPlus < fiftyPct) return treatAmount * 5 / 10;
            return treatAmount * 2;
        } else if(doge.class == 3) { // Hunter
            return treatAmount * 125 / 100;
        } else if(doge.class == 4) { // Cleric
            return treatAmount;
        } else if(doge.class == 5) { // Bard
            uint256 balance = balanceOf[owner_];
            uint256 boost = 10 + (balance > 10 ? 10 : balance);
            return treatAmount * boost / 10;
        } else if(doge.class == 6) { // Merchant
            return treatAmount * (8 + (rand_ % 6)) / 10;
        } else if(doge.class == 7) { // Forager
            return treatAmount * (3 + doge.level) / 3;
        }
        
        return treatAmount;
    }

    /**
    * generates traits for a specific token, checking to make sure it's unique
    * @param tokenId the id of the token to generate traits for
    * @param seed a pseudorandom 256 bit number to derive traits from
    * @return t - a struct of traits for the given token ID
    */
    function generate(uint256 tokenId, uint256 seed) internal returns (Doge memory t) {
        t = selectTraits(seed);
        doges[tokenId] = t;
        return t;

        // keep the following code for future use, current version using different seed, so no need for now
        // if (existingCombinations[structToHash(t)] == 0) {
        //     doges[tokenId] = t;
        //     existingCombinations[structToHash(t)] = tokenId;
        //     return t;
        // }
        // return generate(tokenId, random(seed));
    }

    /**
    * uses A.J. Walker's Alias algorithm for O(1) rarity table lookup
    * ensuring O(1) instead of O(n) reduces mint cost by more than 50%
    * probability & alias tables are generated off-chain beforehand
    * @param seed portion of the 256 bit seed to remove trait correlation
    * @param traitType the trait type to select a trait for 
    * @return the ID of the randomly selected trait
    */
    function selectTrait(uint16 seed, uint8 traitType) internal view returns (uint8) {
        uint8 trait = uint8(seed) % uint8(rarities[traitType].length);
        if (seed >> 8 < rarities[traitType][trait]) return trait;
        return aliases[traitType][trait];
    }

    /**
    * selects the species and all of its traits based on the seed value
    * @param seed a pseudorandom 256 bit number to derive traits from
    * @return t -  a struct of randomly selected traits
    */
    function selectTraits(uint256 seed) internal view returns (Doge memory t) {    
        t.head = selectTrait(uint16(seed & 0xFFFF), 0);
        seed >>= 16;
        t.breed = selectTrait(uint16(seed & 0xFFFF), 1);
        seed >>= 16;
        t.color = selectTrait(uint16(seed & 0xFFFF), 2);
        seed >>= 16;
        t.class = selectTrait(uint16(seed & 0xFFFF), 3);
        seed >>= 16;
        t.armor = selectTrait(uint16(seed & 0xFFFF), 4);
        seed >>= 16;
        t.offhand = selectTrait(uint16(seed & 0xFFFF), 5);
        seed >>= 16;
        t.mainhand = selectTrait(uint16(seed & 0xFFFF), 6);
        t.level = 1;
    }

    /**
    * converts a struct to a 256 bit hash to check for uniqueness
    * @param s the struct to pack into a hash
    * @return the 256 bit hash of the struct
    */
    function structToHash(Doge memory s) internal pure returns (uint256) {
        return uint256(bytes32(
        abi.encodePacked(
            s.head,
            s.breed,
            s.color,
            s.class,
            s.armor,
            s.offhand,
            s.mainhand,
            s.level
        )
        ));
    }

    /// @dev Create a bit more of randomness
    function _randomize(
        uint256 rand,
        string memory val,
        uint256 spicy
    ) internal pure returns (uint256) {
        return uint256(keccak256(abi.encode(rand, val, spicy)));
    }

    function _rand() internal view returns (uint256) {
        return
            uint256(
                keccak256(
                    abi.encodePacked(
                        tx.origin,
                        blockhash(block.number - 1),
                        block.timestamp,
                        entropySauce
                    )
                )
            );
    }

    /**
    * generates a pseudorandom number
    * @param seed a value ensure different outcomes for different sources in the same block
    * @return a pseudorandom value
    */
    function random(uint256 seed) internal view returns (uint256) {
        return uint256(keccak256(abi.encodePacked(
            tx.origin,
            blockhash(block.number - 1),
            block.timestamp,
            seed
        )));
    }

    function _getMintingPrice() internal view returns (uint256) {
        uint256 supply = totalSupply;
        if (supply < 2500) return 0;
        if (supply < 3000) return 4 ether;
        if (supply < 4600) return 25 ether;
        if (supply < 5000) return 85 ether;
        return 85 ether;
    }


    /*///////////////////////////////////////////////////////////////
                    FALLBACK HANDLER 
    //////////////////////////////////////////////////////////////*/


    function _delegate(address implementation) internal virtual {
        assembly {
            // Copy msg.data. We take full control of memory in this inline assembly
            // block because it will not return to Solidity code. We overwrite the
            // Solidity scratch pad at memory position 0.
            calldatacopy(0, 0, calldatasize())

            // Call the implementation.
            // out and outsize are 0 because we don't know the size yet.
            let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)

            // Copy the returned data.
            returndatacopy(0, 0, returndatasize())

            switch result
            // delegatecall returns 0 on error.
            case 0 {
                revert(0, returndatasize())
            }
            default {
                return(0, returndatasize())
            }
        }
    }
    

    fallback() external {
        if(implementer[msg.sig] == address(0)) {
            _delegate(impl);
        } else {
            _delegate(implementer[msg.sig]);
        }
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"activity","type":"uint8"}],"name":"ActionMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"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":"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"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"GENESIS_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ZUG_MINT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"activities","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint88","name":"timestamp","type":"uint88"},{"internalType":"enum Dogewood.Actions","name":"action","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"aliases","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"artStyles","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"auth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"castle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint8","name":"style_","type":"uint8"}],"name":"changeArtStyle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"enum Dogewood.Actions","name":"action_","type":"uint8"}],"name":"doAction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"enum Dogewood.Actions","name":"action_","type":"uint8"}],"name":"doActionWithManyDoges","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"existingCombinations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGenesisSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenTraits","outputs":[{"components":[{"internalType":"uint8","name":"head","type":"uint8"},{"internalType":"uint8","name":"breed","type":"uint8"},{"internalType":"uint8","name":"color","type":"uint8"},{"internalType":"uint8","name":"class","type":"uint8"},{"internalType":"uint8","name":"armor","type":"uint8"},{"internalType":"uint8","name":"offhand","type":"uint8"},{"internalType":"uint8","name":"mainhand","type":"uint8"},{"internalType":"uint16","name":"level","type":"uint16"},{"internalType":"uint16","name":"breedRerollCount","type":"uint16"},{"internalType":"uint16","name":"classRerollCount","type":"uint16"},{"internalType":"uint8","name":"artStyle","type":"uint8"}],"internalType":"struct Dogewood.Doge2","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"curLevel","type":"uint16"},{"internalType":"uint16","name":"toLevel","type":"uint16"}],"name":"getUpgradeLevelPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint8","name":"head","type":"uint8"},{"internalType":"uint8","name":"breed","type":"uint8"},{"internalType":"uint8","name":"color","type":"uint8"},{"internalType":"uint8","name":"class","type":"uint8"},{"internalType":"uint8","name":"armor","type":"uint8"},{"internalType":"uint8","name":"offhand","type":"uint8"},{"internalType":"uint8","name":"mainhand","type":"uint8"},{"internalType":"uint16","name":"level","type":"uint16"},{"internalType":"uint16","name":"breedRerollCount","type":"uint16"},{"internalType":"uint16","name":"classRerollCount","type":"uint16"},{"internalType":"uint8","name":"artStyle","type":"uint8"}],"name":"manuallyAdjustDoge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintCooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintLogs","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint88","name":"timestamp","type":"uint88"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPriceEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPriceZug","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ogWhitelist","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"pull","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rarities","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"recruit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rerollBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Dogewood.RerollTypes","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rerollCountHistory","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rerollPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rerollPriceEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rerollPriceZug","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rerollTreatOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"enum Dogewood.RerollTypes","name":"rerollType","type":"uint8"}],"name":"rerollWithTreat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_traits","type":"address"},{"internalType":"address","name":"_treat","type":"address"},{"internalType":"address","name":"_zug","type":"address"},{"internalType":"address","name":"_castle","type":"address"}],"name":"setAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"},{"internalType":"bool","name":"isAuth","type":"bool"}],"name":"setAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"c_","type":"address"}],"name":"setCastle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4[]","name":"funcs","type":"bytes4[]"},{"internalType":"address","name":"source","type":"address"}],"name":"setImplementer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPriceEth","type":"uint256"},{"internalType":"uint256","name":"_mintPriceZug","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setPresaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rerollPriceEth","type":"uint256"},{"internalType":"uint256","name":"_rerollPriceZug","type":"uint256"},{"internalType":"uint256[]","name":"_rerollPriceTreat","type":"uint256[]"}],"name":"setRerollPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_rerollTreatOnly","type":"bool"}],"name":"setRerollTreatOnly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"t_","type":"address"}],"name":"setTraits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"t_","type":"address"}],"name":"setTreat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_upgradeLevelPrice","type":"uint256[]"}],"name":"setUpgradeLevelPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"z_","type":"address"}],"name":"setZug","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"supported","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"traits","outputs":[{"internalType":"contract ITraits","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treat","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"upgradeLevelPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"upgradeLevelWithTreat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint16","name":"toLevel","type":"uint16"}],"name":"upgradeMultipleLevelWithTreat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"who_","type":"address"}],"name":"validateDogeOwnerForClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"zug","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"zugMintCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b50614ffc806100206000396000f3fe608060405234801561001057600080fd5b50600436106104745760003560e01c806370a0823111610257578063aeb94dcd11610146578063d897833e116100c3578063f2fde38b11610087578063f2fde38b14610b6b578063f4b2afc514610b7e578063f851a44014610ba1578063f9915c5214610bb4578063ffeef3cc14610bc757610474565b8063d897833e14610ad9578063dda8f65f14610aec578063e1fc334f14610b17578063e985e9c514610b2a578063ee75c24114610b5857610474565b8063c87b56dd1161010a578063c87b56dd14610a74578063c955947a14610a87578063cc02b89314610a9a578063cd5d211814610aa3578063d1d58b2514610ac657610474565b8063aeb94dcd14610a15578063afe455e814610a28578063b0c8df2514610a3b578063b88d4fde14610a4e578063c488051314610a6157610474565b80638da5cb5b116101d457806399ec67651161019857806399ec6765146109a35780639b19251a146109ac578063a1b8f374146109cf578063a22cb465146109ef578063a9059cbb14610a0257610474565b80638da5cb5b146109525780638ed5088a1461096357806394e568471461097657806395d89b41146105635780639690aeb61461099657610474565b80638129fc1c1161021b5780638129fc1c146108f85780638393f4781461090057806387982da21461092357806387cb802f146109365780638895283f1461093f57610474565b806370a082311461088c57806376bba70f146108ac57806376f0d51a146108bf5780637aef1b5e146108d25780637b1c9034146108e557610474565b806333df4b2c116103735780635aa450ac116102f05780636781013b116102b45780636781013b1461082e57806368428a1b1461084157806369491e9d146108535780636ba4c138146108665780636f4f73661461087957610474565b80635aa450ac146107cf5780635fce793e146107e25780636095a5fc146107ea5780636352211e146107fd57806366d4a16e1461082657610474565b806342842e0e1161033757806342842e0e14610780578063478241d1146107935780634a945f8d146107a65780634f02c420146107b957806353135ca0146107c257610474565b806333df4b2c1461072457806336838391146107495780633998251d1461075c5780633ccfd60b146107655780633f19ac881461076d57610474565b80630f47e751116104015780632000d430116103c55780632000d430146106e357806323b872dd146106ec57806326302a3c146106ff5780632c6962201461070857806332cb6b0c1461071b57610474565b80630f47e751146106315780630f5f3f2014610693578063174ffcdb146106a657806318160ddd146106c75780631e73ff4f146106d057610474565b806306fdde031161044857806306fdde0314610563578063081812fc1461058d578063095ea7b3146105b65780630b44a218146105c95780630d1657e8146105dc57610474565b8062f66038146104e657806301ffc9a7146105165780630442bfa814610539578063058508441461054c575b600080356001600160e01b0319168152602d60205260409020546001600160a01b03166104ba576104b8737ef61741d9a2b483e75d8aa0876ce864d98ce331610be7565b005b600080356001600160e01b0319168152602d60205260409020546104b8906001600160a01b0316610be7565b6025546104f9906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b610529610524366004614749565b610c10565b604051901515815260200161050d565b6104b86105473660046148ea565b610c47565b61055560035481565b60405190815260200161050d565b604080518082019091526005815264446f67657360d81b60208201525b60405161050d9190614b93565b6104f961059b36600461484b565b6007602052600090815260409020546001600160a01b031681565b6104b86105c43660046145fe565b610c69565b6104b86105d73660046145d0565b610d4e565b6106226105ea36600461484b565b6028602052600090815260409020546001600160a01b03811690600160a01b81046001600160581b031690600160f81b900460ff1683565b60405161050d93929190614b48565b61066c61063f36600461484b565b6029602052600090815260409020546001600160a01b03811690600160a01b90046001600160581b031682565b604080516001600160a01b0390931683526001600160581b0390911660208301520161050d565b6104b86106a13660046143bc565b610d90565b600e546106b49061ffff1681565b60405161ffff909116815260200161050d565b61055560025481565b6104b86106de36600461484b565b610dc9565b61055561a8c081565b6104b86106fa36600461448b565b61100f565b61055560205481565b610555610716366004614818565b6110b0565b61055561138881565b6107376107323660046148ea565b61110e565b60405160ff909116815260200161050d565b6107376107573660046148ea565b611154565b610555601f5481565b6104b8611164565b602e546104f9906001600160a01b031681565b6104b861078e36600461448b565b6112ae565b6104b86107a13660046143bc565b6112c9565b6104b86107b436600461442f565b611302565b61055560045481565b6009546105299060ff1681565b6105556107dd36600461484b565b611369565b6109c4610555565b6104b86107f83660046146c3565b61138a565b6104f961080b36600461484b565b6006602052600090815260409020546001600160a01b031681565b6106b460c881565b6104b861083c36600461462a565b61146a565b60095461052990610100900460ff1681565b6104b86108613660046143bc565b611502565b6104b8610874366004614681565b61153b565b6104b86108873660046143bc565b611579565b61055561089a3660046143bc565b60056020526000908152604090205481565b6104b86108ba36600461495f565b6115b2565b6104b86108cd3660046148a2565b611704565b6105296108e036600461487d565b6117cb565b6104b86108f33660046148a2565b6118a2565b6104b8611b1d565b61073761090e36600461484b565b602f6020526000908152604090205460ff1681565b6024546104f9906001600160a01b031681565b610555600d5481565b6104b861094d36600461470f565b612079565b6001546001600160a01b03166104f9565b6104b861097136600461490c565b6120a3565b61098961098436600461484b565b6120d7565b60405161050d9190614c30565b601e546105299060ff1681565b6105556109c481565b6107376109ba3660046143bc565b600a6020526000908152604090205460ff1681565b6105556109dd36600461484b565b601d6020526000908152604090205481565b6104b86109fd3660046145d0565b6122a7565b6104b8610a103660046145fe565b612313565b6104b8610a233660046148c7565b612374565b6104b8610a3636600461484b565b6125ec565b6104b8610a49366004614982565b612850565b6104b8610a5c3660046144cc565b612af1565b6104b8610a6f36600461470f565b612c27565b610580610a8236600461484b565b612c51565b610555610a9536600461484b565b612d4a565b610555600c5481565b610529610ab13660046143bc565b60266020526000908152604090205460ff1681565b610555610ad436600461484b565b612d5a565b6104b8610ae736600461470f565b612e13565b610555610afa366004614783565b602a60209081526000928352604080842090915290825290205481565b602b546104f9906001600160a01b031681565b610529610b383660046143f6565b600860209081526000928352604080842090915290825290205460ff1681565b6104b8610b66366004614681565b612e44565b6104b8610b793660046143bc565b612e67565b610737610b8c3660046143bc565b600b6020526000908152604090205460ff1681565b6001546104f9906001600160a01b031681565b6104b8610bc236600461457b565b612ea0565b610555610bd536600461484b565b602c6020526000908152604090205481565b3660008037600080366000845af43d6000803e808015610c06573d6000f35b3d6000fd5b505050565b60006380ac58cd60e01b6001600160e01b031983161480610c415750635b5e139f60e01b6001600160e01b03198316145b92915050565b6001546001600160a01b03163314610c5e57600080fd5b600c91909155600d55565b6000818152600660205260409020546001600160a01b031633811480610cb257506001600160a01b038116600090815260086020908152604080832033845290915290205460ff165b610cf25760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b60448201526064015b60405180910390fd5b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6001546001600160a01b03163314610d6557600080fd5b6001600160a01b03919091166000908152602660205260409020805460ff1916911515919091179055565b6001546001600160a01b03163314610da757600080fd5b602480546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260066020526040902054819033906001600160a01b0316811480610e0b57506000828152602860205260409020546001600160a01b038281169116145b610e275760405162461bcd60e51b8152600401610ce990614ba6565b6000838152602960209081526040918290208251808401909352546001600160a01b0381168352600160a01b90046001600160581b0316908201819052849190610e749061a8c090614daf565b421015610e935760405162461bcd60e51b8152600401610ce990614c04565b33600081815260266020526040902054813b919060ff1680610ebd57503332148015610ebd575081155b610ed95760405162461bcd60e51b8152600401610ce990614bcd565b6113886002541115610f215760405162461bcd60e51b8152602060048201526011602482015270185b1b081cdd5c1c1b1e481b5a5b9d1959607a1b6044820152606401610ce9565b6000610f2b612fff565b90508015610f965760248054604051632770a7eb60e21b81523360048201529182018390526001600160a01b031690639dc29fac90604401600060405180830381600087803b158015610f7d57600080fd5b505af1158015610f91573d6000803e3d6000fd5b505050505b600088815260296020526040902080546affffffffffffffffffffff60a01b1916600160a01b426001600160581b031602179055610fd333613074565b508041602354604051602001610feb93929190614a83565b60408051601f19818403018152919052805160209091012060235550505050505050565b336001600160a01b038416148061103c57506000818152600760205260409020546001600160a01b031633145b8061106a57506001600160a01b038316600090815260086020908152604080832033845290915290205460ff165b6110a55760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b6044820152606401610ce9565b610c0b83838361312c565b600080835b8361ffff168161ffff1610156111065760228161ffff16815481106110dc576110dc614f54565b9060005260206000200154826110f29190614daf565b9150806110fe81614e9f565b9150506110b5565b509392505050565b600f826007811061111e57600080fd5b01818154811061112d57600080fd5b9060005260206000209060209182820401919006915091509054906101000a900460ff1681565b6016826007811061111e57600080fd5b6001546001600160a01b0316331461117b57600080fd5b60405133904780156108fc02916000818181858888f193505050501580156111a7573d6000803e3d6000fd5b506025546040516370a0823160e01b81523060048201526001600160a01b039091169063a9059cbb90339083906370a082319060240160206040518083038186803b1580156111f557600080fd5b505afa158015611209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122d9190614864565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561127357600080fd5b505af1158015611287573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ab919061472c565b50565b610c0b83838360405180602001604052806000815250612af1565b6001546001600160a01b031633146112e057600080fd5b602e80546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316331461131957600080fd5b602b80546001600160a01b039586166001600160a01b03199182161790915560248054948616948216949094179093556025805492851692841692909217909155602e8054919093169116179055565b6021818154811061137957600080fd5b600091825260209091200154905081565b60005b828110156114645733600660008686858181106113ac576113ac614f54565b60209081029290920135835250810191909152604001600020546001600160a01b03161480611412575033602860008686858181106113ed576113ed614f54565b60209081029290920135835250810191909152604001600020546001600160a01b0316145b61142e5760405162461bcd60e51b8152600401610ce990614ba6565b61145284848381811061144357611443614f54565b90506020020135338433613244565b8061145c81614ec1565b91505061138d565b50505050565b6001546001600160a01b0316331461148157600080fd5b60005b828110156114645781602d60008686858181106114a3576114a3614f54565b90506020020160208101906114b89190614749565b6001600160e01b0319168152602081019190915260400160002080546001600160a01b0319166001600160a01b0392909216919091179055806114fa81614ec1565b915050611484565b6001546001600160a01b0316331461151957600080fd5b602580546001600160a01b0319166001600160a01b0392909216919091179055565b60005b81811015610c0b5761156783838381811061155b5761155b614f54565b90506020020135613603565b8061157181614ec1565b91505061153e565b6001546001600160a01b0316331461159057600080fd5b602b80546001600160a01b0319166001600160a01b0392909216919091179055565b600082815260066020526040902054829033906001600160a01b03168114806115f457506000828152602860205260409020546001600160a01b038281169116145b6116105760405162461bcd60e51b8152600401610ce990614ba6565b33600081815260266020526040902054813b919060ff168061163a5750333214801561163a575081155b6116565760405162461bcd60e51b8152600401610ce990614bcd565b6000868152602f602052604090205460ff868116911614156116af5760405162461bcd60e51b81526020600482015260126024820152717468652073616d6520617274207374796c6560701b6044820152606401610ce9565b6000868152602f6020908152604091829020805460ff191660ff891617905560235491516116e1928492419201614a83565b60408051601f198184030181529190528051602090910120602355505050505050565b600082815260066020526040902054829033906001600160a01b031681148061174657506000828152602860205260409020546001600160a01b038281169116145b6117625760405162461bcd60e51b8152600401610ce990614ba6565b33600081815260266020526040902054813b919060ff168061178c5750333214801561178c575081155b6117a85760405162461bcd60e51b8152600401610ce990614bcd565b6117b486338733613244565b80416023546040516020016116e193929190614a83565b6000828152600660205260408120546001600160a01b038381169116148061180c57506000838152602860205260409020546001600160a01b038381169116145b8061189b5750602e54604051630fb9a53760e31b8152600481018590526001600160a01b03848116921690637dcd29b89060240160206040518083038186803b15801561185857600080fd5b505afa15801561186c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189091906143d9565b6001600160a01b0316145b9392505050565b600082815260066020526040902054829033906001600160a01b03168114806118e457506000828152602860205260409020546001600160a01b038281169116145b6119005760405162461bcd60e51b8152600401610ce990614ba6565b6000848152602960209081526040918290208251808401909352546001600160a01b0381168352600160a01b90046001600160581b031690820181905285919061194d9061a8c090614daf565b42101561196c5760405162461bcd60e51b8152600401610ce990614c04565b33600081815260266020526040902054813b919060ff168061199657503332148015611996575081155b6119b25760405162461bcd60e51b8152600401610ce990614bcd565b600060216005602a60008b60018111156119ce576119ce614f3e565b60018111156119df576119df614f3e565b815260200190815260200160002060008c81526020019081526020016000205410611a0b576004611a53565b602a60008a6001811115611a2157611a21614f3e565b6001811115611a3257611a32614f3e565b815260200190815260200160002060008b8152602001908152602001600020545b81548110611a6357611a63614f54565b60009182526020909120015460248054604051632770a7eb60e21b81523360048201529182018390529192506001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015611abe57600080fd5b505af1158015611ad2573d6000803e3d6000fd5b50505050611ae08989613828565b508041602354604051602001611af893929190614a83565b60408051601f1981840301815291905280516020909101206023555050505050505050565b6001546001600160a01b03163314611b3457600080fd5b600180546001600160a01b031916339081178255600090815260266020908152604091829020805460ff19169093179092556009805461ffff1916815566e6ed27d6668000600c55681043561a8829300000600d5581516101208101835260ad8152609b9381019390935260ff9183019190915260ce606083018190526080830181905260a0830152607260c0830181905260e08301819052610100830152611bdf91600f916141c6565b506040805161012081018252600280825260208201526008918101919091526000606082018190526080820181905260a0820181905260c0820152600160e08201819052610100820152611c379060169060096141c6565b50604080516101008101825260ff80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810191909152611c879060109060086141c6565b506040805161010081018252600780825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810191909152611cd79060179060086141c6565b506040805160c08101825260ff80825260bc60208301529181019190915260e5606082015260996080820152604c60a0820152611d189060119060066141c6565b506040805160c081018252600280825260208201526005918101919091526000606082018190526080820152600160a0820152611d599060189060066141c6565b50604080516101008101825260e58152607f602082015260b29181019190915260ff606082015260cc6080820181905260a0820181905260c0820152606660e0820152611daa9060129060086141c6565b506040805161010081018252600280825260208201526003918101919091526007606082015260006080820181905260a0820152600160c0820181905260e0820152611dfa9060199060086141c6565b50604080516020810190915260ff8152611e189060139060016141c6565b50604080516020810190915260008152611e3690601a9060016141c6565b50604080516020810190915260ff8152611e549060149060016141c6565b50604080516020810190915260008152611e7290601b9060016141c6565b50604080516020810190915260ff8152611e909060159060016141c6565b50604080516020810190915260008152611eae90601c9060016141c6565b50601e805460ff19169055662386f26fc10000601f556802b5e3af16b188000060209081556040805160a0810182526753444835ec580000815267a688906bd8b000009281019290925268014d1120d7b16000009082015268029a2241af62c00000606082015268053444835ec58000006080820152611f3290602190600561426c565b5060408051610280810182526000815267a688906bd8b00000602082015267de0b6b3a76400000918101919091526801158e460913d00000606082015268014d1120d7b160000060808201526801a055690d9db8000060a08201526801f399b1438a10000060c0820152680246ddf9797668000060e082015268029a2241af62c000006101008201526802ed6689e54f18000061012082015268035c6c3f828a3800006101408201526803cb71f51fc558000061016082015268043a77aabd007800006101808201526804a97d605a3b9800006101a082015268053444835ec58000006101c08201526805bf0ba6634f6800006101e0820152680649d2c967d95000006102008201526806d499ec6c6338000061022082015268077b227cd83be80000610240820152680821ab0d44149800006102608201526112ab90602290601461426c565b6001546001600160a01b0316331461209057600080fd5b6009805460ff1916911515919091179055565b6001546001600160a01b031633146120ba57600080fd5b601f84905560208390556120d0602183836142b4565b5050505050565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526000828152602c60205260409020544314156121a45750506040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915290565b5060408051610160810182526000838152602760209081528382205460ff80821685526101008083048216848701526201000083048216868801526301000000830482166060870152640100000000830482166080870152650100000000008304821660a0870152600160301b8304821660c087015261ffff600160381b909304831660e08701528785527f25a1a901705ed15d5376e82511cff743d9474883c82d145cebcc7811e0424a9c8452868520548316908601528684527f3f32b1e6928a174926c4b104dac81e478b6c8ab881d899ad155ded3e9d1b4426835285842054909116610120850152948252602f9052919091205490911661014082015290565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000818152600660205260409020546001600160a01b031633146123655760405162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b6044820152606401610ce9565b61237033838361312c565b5050565b600082815260066020526040902054829033906001600160a01b03168114806123b657506000828152602860205260409020546001600160a01b038281169116145b6123d25760405162461bcd60e51b8152600401610ce990614ba6565b6000848152602960209081526040918290208251808401909352546001600160a01b0381168352600160a01b90046001600160581b031690820181905285919061241f9061a8c090614daf565b42101561243e5760405162461bcd60e51b8152600401610ce990614c04565b33600081815260266020526040902054813b919060ff168061246857503332148015612468575081155b6124845760405162461bcd60e51b8152600401610ce990614bcd565b60008881526027602052604090205461ffff600160381b909104811690881681106124e15760405162461bcd60e51b815260206004820152600d60248201526c1a5b9d985b1a59081b195d995b609a1b6044820152606401610ce9565b60148861ffff16111561252a5760405162461bcd60e51b8152602060048201526011602482015270195e18d959591cc81b585e081b195d995b607a1b6044820152606401610ce9565b61253389613603565b6024546001600160a01b0316639dc29fac3361254f848c6110b0565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561259557600080fd5b505af11580156125a9573d6000803e3d6000fd5b50505060008a815260276020908152604091829020805461ffff60381b1916600160381b61ffff8e16021790556023549151611af8945085935041929101614a83565b600081815260066020526040902054819033906001600160a01b031681148061262e57506000828152602860205260409020546001600160a01b038281169116145b61264a5760405162461bcd60e51b8152600401610ce990614ba6565b6000838152602960209081526040918290208251808401909352546001600160a01b0381168352600160a01b90046001600160581b03169082018190528491906126979061a8c090614daf565b4210156126b65760405162461bcd60e51b8152600401610ce990614c04565b33600081815260266020526040902054813b919060ff16806126e0575033321480156126e0575081155b6126fc5760405162461bcd60e51b8152600401610ce990614bcd565b61270587613603565b600087815260276020526040902054600160381b900461ffff16601481106127635760405162461bcd60e51b8152602060048201526011602482015270185b1c9958591e481b585e081b195d995b607a1b6044820152606401610ce9565b602454602280546001600160a01b0390921691639dc29fac91339161ffff861690811061279257612792614f54565b6000918252602090912001546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156127e457600080fd5b505af11580156127f8573d6000803e3d6000fd5b505050508060016128099190614d89565b600089815260276020908152604091829020805461ffff94909416600160381b0261ffff60381b19909416939093179092556023549051610feb9350849241929101614a83565b6001546001600160a01b031633148061287857503360009081526026602052604090205460ff165b6128b55760405162461bcd60e51b815260206004820152600e60248201526d1b9bdd08185d5d1a1bdc9a5e995960921b6044820152606401610ce9565b8a602760008e815260200190815260200160002060000160006101000a81548160ff021916908360ff16021790555089602760008e815260200190815260200160002060000160016101000a81548160ff021916908360ff16021790555088602760008e815260200190815260200160002060000160026101000a81548160ff021916908360ff16021790555087602760008e815260200190815260200160002060000160036101000a81548160ff021916908360ff16021790555086602760008e815260200190815260200160002060000160046101000a81548160ff021916908360ff16021790555085602760008e815260200190815260200160002060000160056101000a81548160ff021916908360ff16021790555084602760008e815260200190815260200160002060000160066101000a81548160ff021916908360ff16021790555083602760008e815260200190815260200160002060000160076101000a81548161ffff021916908361ffff1602179055508261ffff16602a6000806001811115612a4a57612a4a614f3e565b6001811115612a5b57612a5b614f3e565b815260200190815260200160002060008e8152602001908152602001600020819055508161ffff16602a6000600180811115612a9957612a99614f3e565b6001811115612aaa57612aaa614f3e565b8152602080820192909252604090810160009081209f81529e8252808f2092909255602f9052909b20805460ff191660ff909c169b909b17909a5550505050505050505050565b612afc84848461100f565b6001600160a01b0383163b15611464576000836001600160a01b031663150b7a0233878686604051602401612b349493929190614ac8565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051612b6d9190614aac565b600060405180830381855afa9150503d8060008114612ba8576040519150601f19603f3d011682016040523d82523d6000602084013e612bad565b606091505b50915050600081806020019051810190612bc79190614766565b9050630a85bd0160e11b6001600160e01b0319821614612c1f5760405162461bcd60e51b81526020600482015260136024820152722727aa2fa2a9219b9918afa922a1a2a4ab22a960691b6044820152606401610ce9565b505050505050565b6001546001600160a01b03163314612c3e57600080fd5b601e805460ff1916911515919091179055565b6000818152602c6020526040902054606090431415612cca5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610ce9565b602b5460405163c87b56dd60e01b8152600481018490526001600160a01b039091169063c87b56dd9060240160006040518083038186803b158015612d0e57600080fd5b505afa158015612d22573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c4191908101906147a1565b6022818154811061137957600080fd5b60006001600083815260286020526040902054600160f81b900460ff166001811115612d8857612d88614f3e565b1415612e0b57600082815260286020526040812054600160a01b90046001600160581b03164211612dba576000612de3565b600083815260286020526040902054612de390600160a01b90046001600160581b031642614e45565b60008481526028602052604090205490915061189b90829085906001600160a01b0316613996565b506000919050565b6001546001600160a01b03163314612e2a57600080fd5b600980549115156101000261ff0019909216919091179055565b6001546001600160a01b03163314612e5b57600080fd5b610c0b602283836142b4565b6001546001600160a01b03163314612e7e57600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b602e546001600160a01b03163314612ee75760405162461bcd60e51b815260206004820152600a6024820152696e6f7420636173746c6560b01b6044820152606401610ce9565b60005b81811015612fa057600060286000858585818110612f0a57612f0a614f54565b905060200201358152602001908152602001600020600001601f9054906101000a900460ff166001811115612f4157612f41614f3e565b14612f6b57612f6b838383818110612f5b57612f5b614f54565b9050602002013585600087613244565b612f8e8433858585818110612f8257612f82614f54565b9050602002013561312c565b80612f9881614ec1565b915050612eea565b506040516397adec1160e01b815233906397adec1190612fc890869086908690600401614afb565b600060405180830381600087803b158015612fe257600080fd5b505af1158015612ff6573d6000803e3d6000fd5b50505050505050565b6002546000906109c481101561301757600091505090565b610bb881101561303057673782dace9d90000091505090565b6111f881101561304a5768015af1d78b58c4000091505090565b6113888110156130645768049b9ca9a69434000091505090565b68049b9ca9a69434000091505090565b600060025460016130859190614daf565b61ffff81166000818152602c602052604081204390559192506130a790613d4d565b90506130b78261ffff1682613da7565b506130c6838361ffff16613ea5565b506040805180820182526001600160a01b0393841681526001600160581b03428116602080840191825261ffff9095166000908152602990955292909320905181549251909316600160a01b026001600160f81b03199092169290931691909117179055565b6000818152600660205260409020546001600160a01b038481169116146131815760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610ce9565b6001600160a01b03831660009081526005602052604081208054916131a583614e88565b90915550506001600160a01b03821660009081526005602052604081208054916131ce83614ec1565b9091555050600081815260076020908152604080832080546001600160a01b0319908116909155600690925280832080546001600160a01b038781169190941681179091559051849391928716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600084815260066020526040902054849082906001600160a01b038083169116148061328957506000828152602860205260409020546001600160a01b038281169116145b6132a55760405162461bcd60e51b8152600401610ce990614ba6565b6000868152602860209081526040808320815160608101835281546001600160a01b0381168252600160a01b81046001600160581b031694820194909452929091830190600160f81b900460ff16600181111561330457613304614f3e565b600181111561331557613315614f3e565b905250905084600181111561332c5761332c614f3e565b8160400151600181111561334257613342614f3e565b14156133855760405162461bcd60e51b8152602060048201526012602482015271185b1c9958591e48191bda5b99c81d1a185d60721b6044820152606401610ce9565b600081602001516001600160581b031642116133ae5781602001516001600160581b03166133b0565b425b90506000826040015160018111156133ca576133ca614f3e565b141561344957600088815260276020526040902054600160381b900461ffff166014146134395760405162461bcd60e51b815260206004820152601a60248201527f63616e2774207374616b6520756e646572206c6576656c2032300000000000006044820152606401610ce9565b61344487308a61312c565b613493565b81602001516001600160581b03164211156134675761346788613603565b81602001516001600160581b0316816001600160581b03161161348e578160200151613490565b805b90505b6000808760018111156134a8576134a8614f3e565b146134b357876134b6565b60005b905060008760018111156134cc576134cc614f3e565b14156134dd576134dd30898b61312c565b6040518060600160405280826001600160a01b03168152602001836001600160581b0316815260200188600181111561351857613518614f3e565b905260008a81526028602090815260409182902083518154928501516001600160581b0316600160a01b026001600160f81b03199093166001600160a01b03909116179190911780825591830151909182906001600160f81b0316600160f81b83600181111561358a5761358a614f3e565b02179055509050507f12e0cc56edd6c3536e9da2076ca9a265cc04a9b2064bc61ebbe5c25ea280c036888a428a60018111156135c8576135c8614f3e565b604080516001600160a01b03909516855260208501939093529183015260ff16606082015260800160405180910390a1505050505050505050565b33600081815260266020526040902054813b919060ff168061362d5750333214801561362d575081155b6136495760405162461bcd60e51b8152600401610ce990614bcd565b6000838152602860209081526040808320815160608101835281546001600160a01b0381168252600160a01b81046001600160581b031694820194909452929091830190600160f81b900460ff1660018111156136a8576136a8614f3e565b60018111156136b9576136b9614f3e565b81525050905080602001516001600160581b031642116136d957506137f1565b600081602001516001600160581b0316426136f49190614e45565b905060018260400151600181111561370e5761370e614f3e565b1480156137345750600085815260276020526040902054600160381b900461ffff166014145b156137ba5760245482516001600160a01b03909116906340c10f199061375b848983613996565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156137a157600080fd5b505af11580156137b5573d6000803e3d6000fd5b505050505b5050600083815260286020526040902080546affffffffffffffffffffff60a01b1916600160a01b426001600160581b0316021790555b804160235460405160200161380893929190614a83565b60408051601f198184030181529190528051602090910120602355505050565b6000828152602c60205260408120439055613841613f7b565b9050600082600181111561385757613857614f3e565b14156138be57601054604080518082019091526005815264109491515160da1b602082015261388890839086613fd7565b6138929190614ef0565b6000848152602760205260409020805460ff929092166101000261ff001990921691909117905561393c565b60018260018111156138d2576138d2614f3e565b141561393c5760006139028260405180604001604052806005815260200164434c41535360d81b81525086613fd7565b905061390f81600361400e565b6000858152602760205260409020805460ff9290921663010000000263ff00000019909216919091179055505b602a600083600181111561395257613952614f3e565b600181111561396357613963614f3e565b815260208082019290925260409081016000908120868252909252812080549161398c83614ec1565b9190505550505050565b600082815260276020908152604080832081516101008082018452915460ff80821683529281048316948201949094526201000084048216928101929092526301000000830481166060830152640100000000830481166080830152650100000000008304811660a0830152600160301b83041660c0820152600160381b90910461ffff1660e082015281613a29613f7b565b9050600062015180613a4388670de0b6b3a7640000614e26565b613a4d9190614de8565b9050826060015160ff1660001415613b43576000613a8c836040518060400160405280600881526020016757617272696f723160c01b81525089613fd7565b9050613a9b606461ffff614dc7565b613aa690600f614dfc565b61ffff168161ffff161015613ad7576064613ac2836073614e26565b613acc9190614de8565b94505050505061189b565b613b0283604051806040016040528060088152602001672bb0b93934b7b91960c11b81525089613fd7565b9050613b11606461ffff614dc7565b613b1c90600f614dfc565b61ffff168161ffff161015613b38576064613ac2836055614e26565b50925061189b915050565b826060015160ff1660011415613bb1576000613b7d8360405180604001604052806005815260200164526f67756560d81b81525089613fd7565b9050613b8c606461ffff614dc7565b613b9790600a614dfc565b61ffff168161ffff161015613b3857613acc826003614e26565b826060015160ff1660021415613c2b576000613bea83604051806040016040528060048152602001634d61676560e01b81525089613fd7565b9050613bf9606461ffff614dc7565b613c04906032614dfc565b61ffff168161ffff161015613c2057600a613ac2836005614e26565b613acc826002614e26565b826060015160ff1660031415613c5c576064613c4882607d614e26565b613c529190614de8565b935050505061189b565b826060015160ff1660041415613c7657925061189b915050565b826060015160ff1660051415613ce0576001600160a01b03851660009081526005602052604081205490600a8211613cae5781613cb1565b600a5b613cbc90600a614daf565b9050600a613cca8285614e26565b613cd49190614de8565b9550505050505061189b565b826060015160ff1660061415613d1257600a613cfd600684614edc565b613d08906008614daf565b613c489083614e26565b826060015160ff1660071415613d435760038360e001516003613d359190614d89565b613c489061ffff1683614e26565b9695505050505050565b600032613d5b600143614e45565b60405160609290921b6001600160601b03191660208301524060348201524260548201526074810183905260940160408051601f19818403018152919052805160209091012092915050565b613daf6142ef565b613db8826140ea565b6000938452602760209081526040948590208251815492840151968401516060850151608086015160a087015160c088015160e089015160ff96871661ffff19909916989098176101009c87169c909c029b909b1763ffff00001916620100009486169490940263ff0000001916939093176301000000928516929092029190911765ffff0000000019166401000000009184169190910265ff000000000019161765010000000000918316919091021768ffffff0000000000001916600160301b919097160261ffff60381b191695909517600160381b61ffff90921691909102179093555090919050565b6000818152600660205260409020546001600160a01b031615613efb5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610ce9565b60028054906000613f0b83614ec1565b90915550506001600160a01b038216600081815260056020908152604080832080546001019055848352600690915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600032613f89600143614e45565b60235460405160609390931b6001600160601b03191660208401529040603483015242605483015260748201526094016040516020818303038152906040528051906020012060001c905090565b6000838383604051602001613fee93929190614d07565b60408051601f198184030181529190528051602090910120949350505050565b600080600f8360ff166007811061402757614027614f54565b01546140339085614ef0565b9050600f8360ff166007811061404b5761404b614f54565b018160ff168154811061406057614060614f54565b60009182526020918290209181049091015460ff601f9092166101000a90048116600886901c9091161015614096579050610c41565b60168360ff16600781106140ac576140ac614f54565b018160ff16815481106140c1576140c1614f54565b90600052602060002090602091828204019190069054906101000a900460ff1691505092915050565b6140f26142ef565b6141018261ffff16600061400e565b60ff16815260109190911c9061411c61ffff8316600161400e565b60ff16602082015260109190911c9061413a61ffff8316600261400e565b60ff16604082015260109190911c9061415861ffff8316600361400e565b60ff16606082015260109190911c9061417661ffff8316600461400e565b60ff16608082015260109190911c9061419461ffff8316600561400e565b60ff1660a082015260109190911c906141b261ffff8316600661400e565b60ff1660c0820152600160e0820152919050565b82805482825590600052602060002090601f0160209004810192821561425c5791602002820160005b8382111561422d57835183826101000a81548160ff021916908360ff16021790555092602001926001016020816000010492830192600103026141ef565b801561425a5782816101000a81549060ff021916905560010160208160000104928301926001030261422d565b505b50614268929150614333565b5090565b82805482825590600052602060002090810192821561425c579160200282015b8281111561425c578251829068ffffffffffffffffff1690559160200191906001019061428c565b82805482825590600052602060002090810192821561425c579160200282015b8281111561425c5782358255916020019190600101906142d4565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b5b808211156142685760008155600101614334565b60008083601f84011261435a57600080fd5b50813567ffffffffffffffff81111561437257600080fd5b6020830191508360208260051b850101111561438d57600080fd5b9250929050565b803561ffff811681146143a657600080fd5b919050565b803560ff811681146143a657600080fd5b6000602082840312156143ce57600080fd5b813561189b81614f80565b6000602082840312156143eb57600080fd5b815161189b81614f80565b6000806040838503121561440957600080fd5b823561441481614f80565b9150602083013561442481614f80565b809150509250929050565b6000806000806080858703121561444557600080fd5b843561445081614f80565b9350602085013561446081614f80565b9250604085013561447081614f80565b9150606085013561448081614f80565b939692955090935050565b6000806000606084860312156144a057600080fd5b83356144ab81614f80565b925060208401356144bb81614f80565b929592945050506040919091013590565b600080600080608085870312156144e257600080fd5b84356144ed81614f80565b935060208501356144fd81614f80565b925060408501359150606085013567ffffffffffffffff81111561452057600080fd5b8501601f8101871361453157600080fd5b803561454461453f82614d61565b614d30565b81815288602083850101111561455957600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060006040848603121561459057600080fd5b833561459b81614f80565b9250602084013567ffffffffffffffff8111156145b757600080fd5b6145c386828701614348565b9497909650939450505050565b600080604083850312156145e357600080fd5b82356145ee81614f80565b9150602083013561442481614f95565b6000806040838503121561461157600080fd5b823561461c81614f80565b946020939093013593505050565b60008060006040848603121561463f57600080fd5b833567ffffffffffffffff81111561465657600080fd5b61466286828701614348565b909450925050602084013561467681614f80565b809150509250925092565b6000806020838503121561469457600080fd5b823567ffffffffffffffff8111156146ab57600080fd5b6146b785828601614348565b90969095509350505050565b6000806000604084860312156146d857600080fd5b833567ffffffffffffffff8111156146ef57600080fd5b6146fb86828701614348565b909450925050602084013561467681614fb9565b60006020828403121561472157600080fd5b813561189b81614f95565b60006020828403121561473e57600080fd5b815161189b81614f95565b60006020828403121561475b57600080fd5b813561189b81614fa3565b60006020828403121561477857600080fd5b815161189b81614fa3565b6000806040838503121561479657600080fd5b823561461c81614fb9565b6000602082840312156147b357600080fd5b815167ffffffffffffffff8111156147ca57600080fd5b8201601f810184136147db57600080fd5b80516147e961453f82614d61565b8181528560208385010111156147fe57600080fd5b61480f826020830160208601614e5c565b95945050505050565b6000806040838503121561482b57600080fd5b61483483614394565b915061484260208401614394565b90509250929050565b60006020828403121561485d57600080fd5b5035919050565b60006020828403121561487657600080fd5b5051919050565b6000806040838503121561489057600080fd5b82359150602083013561442481614f80565b600080604083850312156148b557600080fd5b82359150602083013561442481614fb9565b600080604083850312156148da57600080fd5b8235915061484260208401614394565b600080604083850312156148fd57600080fd5b50508035926020909101359150565b6000806000806060858703121561492257600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561494757600080fd5b61495387828801614348565b95989497509550505050565b6000806040838503121561497257600080fd5b82359150614842602084016143ab565b6000806000806000806000806000806000806101808d8f0312156149a557600080fd5b8c359b506149b560208e016143ab565b9a506149c360408e016143ab565b99506149d160608e016143ab565b98506149df60808e016143ab565b97506149ed60a08e016143ab565b96506149fb60c08e016143ab565b9550614a0960e08e016143ab565b9450614a186101008e01614394565b9350614a276101208e01614394565b9250614a366101408e01614394565b9150614a456101608e016143ab565b90509295989b509295989b509295989b565b60008151808452614a6f816020860160208601614e5c565b601f01601f19169290920160200192915050565b6001600160601b0319606094851b811682529290931b9091166014830152602882015260480190565b60008251614abe818460208701614e5c565b9190910192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d4390830184614a57565b6001600160a01b0384168152604060208201819052810182905260006001600160fb1b03831115614b2b57600080fd5b8260051b8085606085013760009201606001918252509392505050565b6001600160a01b03841681526001600160581b03831660208201526060810160028310614b8557634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b60208152600061189b6020830184614a57565b6020808252600d908201526c6e6f7420796f757220646f676560981b604082015260600190565b60208082526017908201527f796f7527726520747279696e6720746f20636865617421000000000000000000604082015260600190565b60208082526012908201527139ba34b6361034b71031b7b7b6103237bbb760711b604082015260600190565b815160ff16815261016081016020830151614c50602084018260ff169052565b506040830151614c65604084018260ff169052565b506060830151614c7a606084018260ff169052565b506080830151614c8f608084018260ff169052565b5060a0830151614ca460a084018260ff169052565b5060c0830151614cb960c084018260ff169052565b5060e0830151614ccf60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101409283015160ff16929091019190915290565b838152606060208201526000614d206060830185614a57565b9050826040830152949350505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715614d5957614d59614f6a565b604052919050565b600067ffffffffffffffff821115614d7b57614d7b614f6a565b50601f01601f191660200190565b600061ffff808316818516808303821115614da657614da6614f12565b01949350505050565b60008219821115614dc257614dc2614f12565b500190565b600061ffff80841680614ddc57614ddc614f28565b92169190910492915050565b600082614df757614df7614f28565b500490565b600061ffff80831681851681830481118215151615614e1d57614e1d614f12565b02949350505050565b6000816000190483118215151615614e4057614e40614f12565b500290565b600082821015614e5757614e57614f12565b500390565b60005b83811015614e77578181015183820152602001614e5f565b838111156114645750506000910152565b600081614e9757614e97614f12565b506000190190565b600061ffff80831681811415614eb757614eb7614f12565b6001019392505050565b6000600019821415614ed557614ed5614f12565b5060010190565b600082614eeb57614eeb614f28565b500690565b600060ff831680614f0357614f03614f28565b8060ff84160691505092915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146112ab57600080fd5b80151581146112ab57600080fd5b6001600160e01b0319811681146112ab57600080fd5b600281106112ab57600080fdfea2646970667358221220161fd5ed520acdcbab9955034cd43b5bc93e0d7fadb24d770e0129aed9df08f764736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106104745760003560e01c806370a0823111610257578063aeb94dcd11610146578063d897833e116100c3578063f2fde38b11610087578063f2fde38b14610b6b578063f4b2afc514610b7e578063f851a44014610ba1578063f9915c5214610bb4578063ffeef3cc14610bc757610474565b8063d897833e14610ad9578063dda8f65f14610aec578063e1fc334f14610b17578063e985e9c514610b2a578063ee75c24114610b5857610474565b8063c87b56dd1161010a578063c87b56dd14610a74578063c955947a14610a87578063cc02b89314610a9a578063cd5d211814610aa3578063d1d58b2514610ac657610474565b8063aeb94dcd14610a15578063afe455e814610a28578063b0c8df2514610a3b578063b88d4fde14610a4e578063c488051314610a6157610474565b80638da5cb5b116101d457806399ec67651161019857806399ec6765146109a35780639b19251a146109ac578063a1b8f374146109cf578063a22cb465146109ef578063a9059cbb14610a0257610474565b80638da5cb5b146109525780638ed5088a1461096357806394e568471461097657806395d89b41146105635780639690aeb61461099657610474565b80638129fc1c1161021b5780638129fc1c146108f85780638393f4781461090057806387982da21461092357806387cb802f146109365780638895283f1461093f57610474565b806370a082311461088c57806376bba70f146108ac57806376f0d51a146108bf5780637aef1b5e146108d25780637b1c9034146108e557610474565b806333df4b2c116103735780635aa450ac116102f05780636781013b116102b45780636781013b1461082e57806368428a1b1461084157806369491e9d146108535780636ba4c138146108665780636f4f73661461087957610474565b80635aa450ac146107cf5780635fce793e146107e25780636095a5fc146107ea5780636352211e146107fd57806366d4a16e1461082657610474565b806342842e0e1161033757806342842e0e14610780578063478241d1146107935780634a945f8d146107a65780634f02c420146107b957806353135ca0146107c257610474565b806333df4b2c1461072457806336838391146107495780633998251d1461075c5780633ccfd60b146107655780633f19ac881461076d57610474565b80630f47e751116104015780632000d430116103c55780632000d430146106e357806323b872dd146106ec57806326302a3c146106ff5780632c6962201461070857806332cb6b0c1461071b57610474565b80630f47e751146106315780630f5f3f2014610693578063174ffcdb146106a657806318160ddd146106c75780631e73ff4f146106d057610474565b806306fdde031161044857806306fdde0314610563578063081812fc1461058d578063095ea7b3146105b65780630b44a218146105c95780630d1657e8146105dc57610474565b8062f66038146104e657806301ffc9a7146105165780630442bfa814610539578063058508441461054c575b600080356001600160e01b0319168152602d60205260409020546001600160a01b03166104ba576104b8737ef61741d9a2b483e75d8aa0876ce864d98ce331610be7565b005b600080356001600160e01b0319168152602d60205260409020546104b8906001600160a01b0316610be7565b6025546104f9906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b610529610524366004614749565b610c10565b604051901515815260200161050d565b6104b86105473660046148ea565b610c47565b61055560035481565b60405190815260200161050d565b604080518082019091526005815264446f67657360d81b60208201525b60405161050d9190614b93565b6104f961059b36600461484b565b6007602052600090815260409020546001600160a01b031681565b6104b86105c43660046145fe565b610c69565b6104b86105d73660046145d0565b610d4e565b6106226105ea36600461484b565b6028602052600090815260409020546001600160a01b03811690600160a01b81046001600160581b031690600160f81b900460ff1683565b60405161050d93929190614b48565b61066c61063f36600461484b565b6029602052600090815260409020546001600160a01b03811690600160a01b90046001600160581b031682565b604080516001600160a01b0390931683526001600160581b0390911660208301520161050d565b6104b86106a13660046143bc565b610d90565b600e546106b49061ffff1681565b60405161ffff909116815260200161050d565b61055560025481565b6104b86106de36600461484b565b610dc9565b61055561a8c081565b6104b86106fa36600461448b565b61100f565b61055560205481565b610555610716366004614818565b6110b0565b61055561138881565b6107376107323660046148ea565b61110e565b60405160ff909116815260200161050d565b6107376107573660046148ea565b611154565b610555601f5481565b6104b8611164565b602e546104f9906001600160a01b031681565b6104b861078e36600461448b565b6112ae565b6104b86107a13660046143bc565b6112c9565b6104b86107b436600461442f565b611302565b61055560045481565b6009546105299060ff1681565b6105556107dd36600461484b565b611369565b6109c4610555565b6104b86107f83660046146c3565b61138a565b6104f961080b36600461484b565b6006602052600090815260409020546001600160a01b031681565b6106b460c881565b6104b861083c36600461462a565b61146a565b60095461052990610100900460ff1681565b6104b86108613660046143bc565b611502565b6104b8610874366004614681565b61153b565b6104b86108873660046143bc565b611579565b61055561089a3660046143bc565b60056020526000908152604090205481565b6104b86108ba36600461495f565b6115b2565b6104b86108cd3660046148a2565b611704565b6105296108e036600461487d565b6117cb565b6104b86108f33660046148a2565b6118a2565b6104b8611b1d565b61073761090e36600461484b565b602f6020526000908152604090205460ff1681565b6024546104f9906001600160a01b031681565b610555600d5481565b6104b861094d36600461470f565b612079565b6001546001600160a01b03166104f9565b6104b861097136600461490c565b6120a3565b61098961098436600461484b565b6120d7565b60405161050d9190614c30565b601e546105299060ff1681565b6105556109c481565b6107376109ba3660046143bc565b600a6020526000908152604090205460ff1681565b6105556109dd36600461484b565b601d6020526000908152604090205481565b6104b86109fd3660046145d0565b6122a7565b6104b8610a103660046145fe565b612313565b6104b8610a233660046148c7565b612374565b6104b8610a3636600461484b565b6125ec565b6104b8610a49366004614982565b612850565b6104b8610a5c3660046144cc565b612af1565b6104b8610a6f36600461470f565b612c27565b610580610a8236600461484b565b612c51565b610555610a9536600461484b565b612d4a565b610555600c5481565b610529610ab13660046143bc565b60266020526000908152604090205460ff1681565b610555610ad436600461484b565b612d5a565b6104b8610ae736600461470f565b612e13565b610555610afa366004614783565b602a60209081526000928352604080842090915290825290205481565b602b546104f9906001600160a01b031681565b610529610b383660046143f6565b600860209081526000928352604080842090915290825290205460ff1681565b6104b8610b66366004614681565b612e44565b6104b8610b793660046143bc565b612e67565b610737610b8c3660046143bc565b600b6020526000908152604090205460ff1681565b6001546104f9906001600160a01b031681565b6104b8610bc236600461457b565b612ea0565b610555610bd536600461484b565b602c6020526000908152604090205481565b3660008037600080366000845af43d6000803e808015610c06573d6000f35b3d6000fd5b505050565b60006380ac58cd60e01b6001600160e01b031983161480610c415750635b5e139f60e01b6001600160e01b03198316145b92915050565b6001546001600160a01b03163314610c5e57600080fd5b600c91909155600d55565b6000818152600660205260409020546001600160a01b031633811480610cb257506001600160a01b038116600090815260086020908152604080832033845290915290205460ff165b610cf25760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b60448201526064015b60405180910390fd5b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6001546001600160a01b03163314610d6557600080fd5b6001600160a01b03919091166000908152602660205260409020805460ff1916911515919091179055565b6001546001600160a01b03163314610da757600080fd5b602480546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260066020526040902054819033906001600160a01b0316811480610e0b57506000828152602860205260409020546001600160a01b038281169116145b610e275760405162461bcd60e51b8152600401610ce990614ba6565b6000838152602960209081526040918290208251808401909352546001600160a01b0381168352600160a01b90046001600160581b0316908201819052849190610e749061a8c090614daf565b421015610e935760405162461bcd60e51b8152600401610ce990614c04565b33600081815260266020526040902054813b919060ff1680610ebd57503332148015610ebd575081155b610ed95760405162461bcd60e51b8152600401610ce990614bcd565b6113886002541115610f215760405162461bcd60e51b8152602060048201526011602482015270185b1b081cdd5c1c1b1e481b5a5b9d1959607a1b6044820152606401610ce9565b6000610f2b612fff565b90508015610f965760248054604051632770a7eb60e21b81523360048201529182018390526001600160a01b031690639dc29fac90604401600060405180830381600087803b158015610f7d57600080fd5b505af1158015610f91573d6000803e3d6000fd5b505050505b600088815260296020526040902080546affffffffffffffffffffff60a01b1916600160a01b426001600160581b031602179055610fd333613074565b508041602354604051602001610feb93929190614a83565b60408051601f19818403018152919052805160209091012060235550505050505050565b336001600160a01b038416148061103c57506000818152600760205260409020546001600160a01b031633145b8061106a57506001600160a01b038316600090815260086020908152604080832033845290915290205460ff165b6110a55760405162461bcd60e51b815260206004820152600c60248201526b1393d517d054141493d5915160a21b6044820152606401610ce9565b610c0b83838361312c565b600080835b8361ffff168161ffff1610156111065760228161ffff16815481106110dc576110dc614f54565b9060005260206000200154826110f29190614daf565b9150806110fe81614e9f565b9150506110b5565b509392505050565b600f826007811061111e57600080fd5b01818154811061112d57600080fd5b9060005260206000209060209182820401919006915091509054906101000a900460ff1681565b6016826007811061111e57600080fd5b6001546001600160a01b0316331461117b57600080fd5b60405133904780156108fc02916000818181858888f193505050501580156111a7573d6000803e3d6000fd5b506025546040516370a0823160e01b81523060048201526001600160a01b039091169063a9059cbb90339083906370a082319060240160206040518083038186803b1580156111f557600080fd5b505afa158015611209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122d9190614864565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561127357600080fd5b505af1158015611287573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ab919061472c565b50565b610c0b83838360405180602001604052806000815250612af1565b6001546001600160a01b031633146112e057600080fd5b602e80546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316331461131957600080fd5b602b80546001600160a01b039586166001600160a01b03199182161790915560248054948616948216949094179093556025805492851692841692909217909155602e8054919093169116179055565b6021818154811061137957600080fd5b600091825260209091200154905081565b60005b828110156114645733600660008686858181106113ac576113ac614f54565b60209081029290920135835250810191909152604001600020546001600160a01b03161480611412575033602860008686858181106113ed576113ed614f54565b60209081029290920135835250810191909152604001600020546001600160a01b0316145b61142e5760405162461bcd60e51b8152600401610ce990614ba6565b61145284848381811061144357611443614f54565b90506020020135338433613244565b8061145c81614ec1565b91505061138d565b50505050565b6001546001600160a01b0316331461148157600080fd5b60005b828110156114645781602d60008686858181106114a3576114a3614f54565b90506020020160208101906114b89190614749565b6001600160e01b0319168152602081019190915260400160002080546001600160a01b0319166001600160a01b0392909216919091179055806114fa81614ec1565b915050611484565b6001546001600160a01b0316331461151957600080fd5b602580546001600160a01b0319166001600160a01b0392909216919091179055565b60005b81811015610c0b5761156783838381811061155b5761155b614f54565b90506020020135613603565b8061157181614ec1565b91505061153e565b6001546001600160a01b0316331461159057600080fd5b602b80546001600160a01b0319166001600160a01b0392909216919091179055565b600082815260066020526040902054829033906001600160a01b03168114806115f457506000828152602860205260409020546001600160a01b038281169116145b6116105760405162461bcd60e51b8152600401610ce990614ba6565b33600081815260266020526040902054813b919060ff168061163a5750333214801561163a575081155b6116565760405162461bcd60e51b8152600401610ce990614bcd565b6000868152602f602052604090205460ff868116911614156116af5760405162461bcd60e51b81526020600482015260126024820152717468652073616d6520617274207374796c6560701b6044820152606401610ce9565b6000868152602f6020908152604091829020805460ff191660ff891617905560235491516116e1928492419201614a83565b60408051601f198184030181529190528051602090910120602355505050505050565b600082815260066020526040902054829033906001600160a01b031681148061174657506000828152602860205260409020546001600160a01b038281169116145b6117625760405162461bcd60e51b8152600401610ce990614ba6565b33600081815260266020526040902054813b919060ff168061178c5750333214801561178c575081155b6117a85760405162461bcd60e51b8152600401610ce990614bcd565b6117b486338733613244565b80416023546040516020016116e193929190614a83565b6000828152600660205260408120546001600160a01b038381169116148061180c57506000838152602860205260409020546001600160a01b038381169116145b8061189b5750602e54604051630fb9a53760e31b8152600481018590526001600160a01b03848116921690637dcd29b89060240160206040518083038186803b15801561185857600080fd5b505afa15801561186c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189091906143d9565b6001600160a01b0316145b9392505050565b600082815260066020526040902054829033906001600160a01b03168114806118e457506000828152602860205260409020546001600160a01b038281169116145b6119005760405162461bcd60e51b8152600401610ce990614ba6565b6000848152602960209081526040918290208251808401909352546001600160a01b0381168352600160a01b90046001600160581b031690820181905285919061194d9061a8c090614daf565b42101561196c5760405162461bcd60e51b8152600401610ce990614c04565b33600081815260266020526040902054813b919060ff168061199657503332148015611996575081155b6119b25760405162461bcd60e51b8152600401610ce990614bcd565b600060216005602a60008b60018111156119ce576119ce614f3e565b60018111156119df576119df614f3e565b815260200190815260200160002060008c81526020019081526020016000205410611a0b576004611a53565b602a60008a6001811115611a2157611a21614f3e565b6001811115611a3257611a32614f3e565b815260200190815260200160002060008b8152602001908152602001600020545b81548110611a6357611a63614f54565b60009182526020909120015460248054604051632770a7eb60e21b81523360048201529182018390529192506001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015611abe57600080fd5b505af1158015611ad2573d6000803e3d6000fd5b50505050611ae08989613828565b508041602354604051602001611af893929190614a83565b60408051601f1981840301815291905280516020909101206023555050505050505050565b6001546001600160a01b03163314611b3457600080fd5b600180546001600160a01b031916339081178255600090815260266020908152604091829020805460ff19169093179092556009805461ffff1916815566e6ed27d6668000600c55681043561a8829300000600d5581516101208101835260ad8152609b9381019390935260ff9183019190915260ce606083018190526080830181905260a0830152607260c0830181905260e08301819052610100830152611bdf91600f916141c6565b506040805161012081018252600280825260208201526008918101919091526000606082018190526080820181905260a0820181905260c0820152600160e08201819052610100820152611c379060169060096141c6565b50604080516101008101825260ff80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810191909152611c879060109060086141c6565b506040805161010081018252600780825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810191909152611cd79060179060086141c6565b506040805160c08101825260ff80825260bc60208301529181019190915260e5606082015260996080820152604c60a0820152611d189060119060066141c6565b506040805160c081018252600280825260208201526005918101919091526000606082018190526080820152600160a0820152611d599060189060066141c6565b50604080516101008101825260e58152607f602082015260b29181019190915260ff606082015260cc6080820181905260a0820181905260c0820152606660e0820152611daa9060129060086141c6565b506040805161010081018252600280825260208201526003918101919091526007606082015260006080820181905260a0820152600160c0820181905260e0820152611dfa9060199060086141c6565b50604080516020810190915260ff8152611e189060139060016141c6565b50604080516020810190915260008152611e3690601a9060016141c6565b50604080516020810190915260ff8152611e549060149060016141c6565b50604080516020810190915260008152611e7290601b9060016141c6565b50604080516020810190915260ff8152611e909060159060016141c6565b50604080516020810190915260008152611eae90601c9060016141c6565b50601e805460ff19169055662386f26fc10000601f556802b5e3af16b188000060209081556040805160a0810182526753444835ec580000815267a688906bd8b000009281019290925268014d1120d7b16000009082015268029a2241af62c00000606082015268053444835ec58000006080820152611f3290602190600561426c565b5060408051610280810182526000815267a688906bd8b00000602082015267de0b6b3a76400000918101919091526801158e460913d00000606082015268014d1120d7b160000060808201526801a055690d9db8000060a08201526801f399b1438a10000060c0820152680246ddf9797668000060e082015268029a2241af62c000006101008201526802ed6689e54f18000061012082015268035c6c3f828a3800006101408201526803cb71f51fc558000061016082015268043a77aabd007800006101808201526804a97d605a3b9800006101a082015268053444835ec58000006101c08201526805bf0ba6634f6800006101e0820152680649d2c967d95000006102008201526806d499ec6c6338000061022082015268077b227cd83be80000610240820152680821ab0d44149800006102608201526112ab90602290601461426c565b6001546001600160a01b0316331461209057600080fd5b6009805460ff1916911515919091179055565b6001546001600160a01b031633146120ba57600080fd5b601f84905560208390556120d0602183836142b4565b5050505050565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526000828152602c60205260409020544314156121a45750506040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915290565b5060408051610160810182526000838152602760209081528382205460ff80821685526101008083048216848701526201000083048216868801526301000000830482166060870152640100000000830482166080870152650100000000008304821660a0870152600160301b8304821660c087015261ffff600160381b909304831660e08701528785527f25a1a901705ed15d5376e82511cff743d9474883c82d145cebcc7811e0424a9c8452868520548316908601528684527f3f32b1e6928a174926c4b104dac81e478b6c8ab881d899ad155ded3e9d1b4426835285842054909116610120850152948252602f9052919091205490911661014082015290565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000818152600660205260409020546001600160a01b031633146123655760405162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b6044820152606401610ce9565b61237033838361312c565b5050565b600082815260066020526040902054829033906001600160a01b03168114806123b657506000828152602860205260409020546001600160a01b038281169116145b6123d25760405162461bcd60e51b8152600401610ce990614ba6565b6000848152602960209081526040918290208251808401909352546001600160a01b0381168352600160a01b90046001600160581b031690820181905285919061241f9061a8c090614daf565b42101561243e5760405162461bcd60e51b8152600401610ce990614c04565b33600081815260266020526040902054813b919060ff168061246857503332148015612468575081155b6124845760405162461bcd60e51b8152600401610ce990614bcd565b60008881526027602052604090205461ffff600160381b909104811690881681106124e15760405162461bcd60e51b815260206004820152600d60248201526c1a5b9d985b1a59081b195d995b609a1b6044820152606401610ce9565b60148861ffff16111561252a5760405162461bcd60e51b8152602060048201526011602482015270195e18d959591cc81b585e081b195d995b607a1b6044820152606401610ce9565b61253389613603565b6024546001600160a01b0316639dc29fac3361254f848c6110b0565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561259557600080fd5b505af11580156125a9573d6000803e3d6000fd5b50505060008a815260276020908152604091829020805461ffff60381b1916600160381b61ffff8e16021790556023549151611af8945085935041929101614a83565b600081815260066020526040902054819033906001600160a01b031681148061262e57506000828152602860205260409020546001600160a01b038281169116145b61264a5760405162461bcd60e51b8152600401610ce990614ba6565b6000838152602960209081526040918290208251808401909352546001600160a01b0381168352600160a01b90046001600160581b03169082018190528491906126979061a8c090614daf565b4210156126b65760405162461bcd60e51b8152600401610ce990614c04565b33600081815260266020526040902054813b919060ff16806126e0575033321480156126e0575081155b6126fc5760405162461bcd60e51b8152600401610ce990614bcd565b61270587613603565b600087815260276020526040902054600160381b900461ffff16601481106127635760405162461bcd60e51b8152602060048201526011602482015270185b1c9958591e481b585e081b195d995b607a1b6044820152606401610ce9565b602454602280546001600160a01b0390921691639dc29fac91339161ffff861690811061279257612792614f54565b6000918252602090912001546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156127e457600080fd5b505af11580156127f8573d6000803e3d6000fd5b505050508060016128099190614d89565b600089815260276020908152604091829020805461ffff94909416600160381b0261ffff60381b19909416939093179092556023549051610feb9350849241929101614a83565b6001546001600160a01b031633148061287857503360009081526026602052604090205460ff165b6128b55760405162461bcd60e51b815260206004820152600e60248201526d1b9bdd08185d5d1a1bdc9a5e995960921b6044820152606401610ce9565b8a602760008e815260200190815260200160002060000160006101000a81548160ff021916908360ff16021790555089602760008e815260200190815260200160002060000160016101000a81548160ff021916908360ff16021790555088602760008e815260200190815260200160002060000160026101000a81548160ff021916908360ff16021790555087602760008e815260200190815260200160002060000160036101000a81548160ff021916908360ff16021790555086602760008e815260200190815260200160002060000160046101000a81548160ff021916908360ff16021790555085602760008e815260200190815260200160002060000160056101000a81548160ff021916908360ff16021790555084602760008e815260200190815260200160002060000160066101000a81548160ff021916908360ff16021790555083602760008e815260200190815260200160002060000160076101000a81548161ffff021916908361ffff1602179055508261ffff16602a6000806001811115612a4a57612a4a614f3e565b6001811115612a5b57612a5b614f3e565b815260200190815260200160002060008e8152602001908152602001600020819055508161ffff16602a6000600180811115612a9957612a99614f3e565b6001811115612aaa57612aaa614f3e565b8152602080820192909252604090810160009081209f81529e8252808f2092909255602f9052909b20805460ff191660ff909c169b909b17909a5550505050505050505050565b612afc84848461100f565b6001600160a01b0383163b15611464576000836001600160a01b031663150b7a0233878686604051602401612b349493929190614ac8565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051612b6d9190614aac565b600060405180830381855afa9150503d8060008114612ba8576040519150601f19603f3d011682016040523d82523d6000602084013e612bad565b606091505b50915050600081806020019051810190612bc79190614766565b9050630a85bd0160e11b6001600160e01b0319821614612c1f5760405162461bcd60e51b81526020600482015260136024820152722727aa2fa2a9219b9918afa922a1a2a4ab22a960691b6044820152606401610ce9565b505050505050565b6001546001600160a01b03163314612c3e57600080fd5b601e805460ff1916911515919091179055565b6000818152602c6020526040902054606090431415612cca5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610ce9565b602b5460405163c87b56dd60e01b8152600481018490526001600160a01b039091169063c87b56dd9060240160006040518083038186803b158015612d0e57600080fd5b505afa158015612d22573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c4191908101906147a1565b6022818154811061137957600080fd5b60006001600083815260286020526040902054600160f81b900460ff166001811115612d8857612d88614f3e565b1415612e0b57600082815260286020526040812054600160a01b90046001600160581b03164211612dba576000612de3565b600083815260286020526040902054612de390600160a01b90046001600160581b031642614e45565b60008481526028602052604090205490915061189b90829085906001600160a01b0316613996565b506000919050565b6001546001600160a01b03163314612e2a57600080fd5b600980549115156101000261ff0019909216919091179055565b6001546001600160a01b03163314612e5b57600080fd5b610c0b602283836142b4565b6001546001600160a01b03163314612e7e57600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b602e546001600160a01b03163314612ee75760405162461bcd60e51b815260206004820152600a6024820152696e6f7420636173746c6560b01b6044820152606401610ce9565b60005b81811015612fa057600060286000858585818110612f0a57612f0a614f54565b905060200201358152602001908152602001600020600001601f9054906101000a900460ff166001811115612f4157612f41614f3e565b14612f6b57612f6b838383818110612f5b57612f5b614f54565b9050602002013585600087613244565b612f8e8433858585818110612f8257612f82614f54565b9050602002013561312c565b80612f9881614ec1565b915050612eea565b506040516397adec1160e01b815233906397adec1190612fc890869086908690600401614afb565b600060405180830381600087803b158015612fe257600080fd5b505af1158015612ff6573d6000803e3d6000fd5b50505050505050565b6002546000906109c481101561301757600091505090565b610bb881101561303057673782dace9d90000091505090565b6111f881101561304a5768015af1d78b58c4000091505090565b6113888110156130645768049b9ca9a69434000091505090565b68049b9ca9a69434000091505090565b600060025460016130859190614daf565b61ffff81166000818152602c602052604081204390559192506130a790613d4d565b90506130b78261ffff1682613da7565b506130c6838361ffff16613ea5565b506040805180820182526001600160a01b0393841681526001600160581b03428116602080840191825261ffff9095166000908152602990955292909320905181549251909316600160a01b026001600160f81b03199092169290931691909117179055565b6000818152600660205260409020546001600160a01b038481169116146131815760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610ce9565b6001600160a01b03831660009081526005602052604081208054916131a583614e88565b90915550506001600160a01b03821660009081526005602052604081208054916131ce83614ec1565b9091555050600081815260076020908152604080832080546001600160a01b0319908116909155600690925280832080546001600160a01b038781169190941681179091559051849391928716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600084815260066020526040902054849082906001600160a01b038083169116148061328957506000828152602860205260409020546001600160a01b038281169116145b6132a55760405162461bcd60e51b8152600401610ce990614ba6565b6000868152602860209081526040808320815160608101835281546001600160a01b0381168252600160a01b81046001600160581b031694820194909452929091830190600160f81b900460ff16600181111561330457613304614f3e565b600181111561331557613315614f3e565b905250905084600181111561332c5761332c614f3e565b8160400151600181111561334257613342614f3e565b14156133855760405162461bcd60e51b8152602060048201526012602482015271185b1c9958591e48191bda5b99c81d1a185d60721b6044820152606401610ce9565b600081602001516001600160581b031642116133ae5781602001516001600160581b03166133b0565b425b90506000826040015160018111156133ca576133ca614f3e565b141561344957600088815260276020526040902054600160381b900461ffff166014146134395760405162461bcd60e51b815260206004820152601a60248201527f63616e2774207374616b6520756e646572206c6576656c2032300000000000006044820152606401610ce9565b61344487308a61312c565b613493565b81602001516001600160581b03164211156134675761346788613603565b81602001516001600160581b0316816001600160581b03161161348e578160200151613490565b805b90505b6000808760018111156134a8576134a8614f3e565b146134b357876134b6565b60005b905060008760018111156134cc576134cc614f3e565b14156134dd576134dd30898b61312c565b6040518060600160405280826001600160a01b03168152602001836001600160581b0316815260200188600181111561351857613518614f3e565b905260008a81526028602090815260409182902083518154928501516001600160581b0316600160a01b026001600160f81b03199093166001600160a01b03909116179190911780825591830151909182906001600160f81b0316600160f81b83600181111561358a5761358a614f3e565b02179055509050507f12e0cc56edd6c3536e9da2076ca9a265cc04a9b2064bc61ebbe5c25ea280c036888a428a60018111156135c8576135c8614f3e565b604080516001600160a01b03909516855260208501939093529183015260ff16606082015260800160405180910390a1505050505050505050565b33600081815260266020526040902054813b919060ff168061362d5750333214801561362d575081155b6136495760405162461bcd60e51b8152600401610ce990614bcd565b6000838152602860209081526040808320815160608101835281546001600160a01b0381168252600160a01b81046001600160581b031694820194909452929091830190600160f81b900460ff1660018111156136a8576136a8614f3e565b60018111156136b9576136b9614f3e565b81525050905080602001516001600160581b031642116136d957506137f1565b600081602001516001600160581b0316426136f49190614e45565b905060018260400151600181111561370e5761370e614f3e565b1480156137345750600085815260276020526040902054600160381b900461ffff166014145b156137ba5760245482516001600160a01b03909116906340c10f199061375b848983613996565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156137a157600080fd5b505af11580156137b5573d6000803e3d6000fd5b505050505b5050600083815260286020526040902080546affffffffffffffffffffff60a01b1916600160a01b426001600160581b0316021790555b804160235460405160200161380893929190614a83565b60408051601f198184030181529190528051602090910120602355505050565b6000828152602c60205260408120439055613841613f7b565b9050600082600181111561385757613857614f3e565b14156138be57601054604080518082019091526005815264109491515160da1b602082015261388890839086613fd7565b6138929190614ef0565b6000848152602760205260409020805460ff929092166101000261ff001990921691909117905561393c565b60018260018111156138d2576138d2614f3e565b141561393c5760006139028260405180604001604052806005815260200164434c41535360d81b81525086613fd7565b905061390f81600361400e565b6000858152602760205260409020805460ff9290921663010000000263ff00000019909216919091179055505b602a600083600181111561395257613952614f3e565b600181111561396357613963614f3e565b815260208082019290925260409081016000908120868252909252812080549161398c83614ec1565b9190505550505050565b600082815260276020908152604080832081516101008082018452915460ff80821683529281048316948201949094526201000084048216928101929092526301000000830481166060830152640100000000830481166080830152650100000000008304811660a0830152600160301b83041660c0820152600160381b90910461ffff1660e082015281613a29613f7b565b9050600062015180613a4388670de0b6b3a7640000614e26565b613a4d9190614de8565b9050826060015160ff1660001415613b43576000613a8c836040518060400160405280600881526020016757617272696f723160c01b81525089613fd7565b9050613a9b606461ffff614dc7565b613aa690600f614dfc565b61ffff168161ffff161015613ad7576064613ac2836073614e26565b613acc9190614de8565b94505050505061189b565b613b0283604051806040016040528060088152602001672bb0b93934b7b91960c11b81525089613fd7565b9050613b11606461ffff614dc7565b613b1c90600f614dfc565b61ffff168161ffff161015613b38576064613ac2836055614e26565b50925061189b915050565b826060015160ff1660011415613bb1576000613b7d8360405180604001604052806005815260200164526f67756560d81b81525089613fd7565b9050613b8c606461ffff614dc7565b613b9790600a614dfc565b61ffff168161ffff161015613b3857613acc826003614e26565b826060015160ff1660021415613c2b576000613bea83604051806040016040528060048152602001634d61676560e01b81525089613fd7565b9050613bf9606461ffff614dc7565b613c04906032614dfc565b61ffff168161ffff161015613c2057600a613ac2836005614e26565b613acc826002614e26565b826060015160ff1660031415613c5c576064613c4882607d614e26565b613c529190614de8565b935050505061189b565b826060015160ff1660041415613c7657925061189b915050565b826060015160ff1660051415613ce0576001600160a01b03851660009081526005602052604081205490600a8211613cae5781613cb1565b600a5b613cbc90600a614daf565b9050600a613cca8285614e26565b613cd49190614de8565b9550505050505061189b565b826060015160ff1660061415613d1257600a613cfd600684614edc565b613d08906008614daf565b613c489083614e26565b826060015160ff1660071415613d435760038360e001516003613d359190614d89565b613c489061ffff1683614e26565b9695505050505050565b600032613d5b600143614e45565b60405160609290921b6001600160601b03191660208301524060348201524260548201526074810183905260940160408051601f19818403018152919052805160209091012092915050565b613daf6142ef565b613db8826140ea565b6000938452602760209081526040948590208251815492840151968401516060850151608086015160a087015160c088015160e089015160ff96871661ffff19909916989098176101009c87169c909c029b909b1763ffff00001916620100009486169490940263ff0000001916939093176301000000928516929092029190911765ffff0000000019166401000000009184169190910265ff000000000019161765010000000000918316919091021768ffffff0000000000001916600160301b919097160261ffff60381b191695909517600160381b61ffff90921691909102179093555090919050565b6000818152600660205260409020546001600160a01b031615613efb5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610ce9565b60028054906000613f0b83614ec1565b90915550506001600160a01b038216600081815260056020908152604080832080546001019055848352600690915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600032613f89600143614e45565b60235460405160609390931b6001600160601b03191660208401529040603483015242605483015260748201526094016040516020818303038152906040528051906020012060001c905090565b6000838383604051602001613fee93929190614d07565b60408051601f198184030181529190528051602090910120949350505050565b600080600f8360ff166007811061402757614027614f54565b01546140339085614ef0565b9050600f8360ff166007811061404b5761404b614f54565b018160ff168154811061406057614060614f54565b60009182526020918290209181049091015460ff601f9092166101000a90048116600886901c9091161015614096579050610c41565b60168360ff16600781106140ac576140ac614f54565b018160ff16815481106140c1576140c1614f54565b90600052602060002090602091828204019190069054906101000a900460ff1691505092915050565b6140f26142ef565b6141018261ffff16600061400e565b60ff16815260109190911c9061411c61ffff8316600161400e565b60ff16602082015260109190911c9061413a61ffff8316600261400e565b60ff16604082015260109190911c9061415861ffff8316600361400e565b60ff16606082015260109190911c9061417661ffff8316600461400e565b60ff16608082015260109190911c9061419461ffff8316600561400e565b60ff1660a082015260109190911c906141b261ffff8316600661400e565b60ff1660c0820152600160e0820152919050565b82805482825590600052602060002090601f0160209004810192821561425c5791602002820160005b8382111561422d57835183826101000a81548160ff021916908360ff16021790555092602001926001016020816000010492830192600103026141ef565b801561425a5782816101000a81549060ff021916905560010160208160000104928301926001030261422d565b505b50614268929150614333565b5090565b82805482825590600052602060002090810192821561425c579160200282015b8281111561425c578251829068ffffffffffffffffff1690559160200191906001019061428c565b82805482825590600052602060002090810192821561425c579160200282015b8281111561425c5782358255916020019190600101906142d4565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b5b808211156142685760008155600101614334565b60008083601f84011261435a57600080fd5b50813567ffffffffffffffff81111561437257600080fd5b6020830191508360208260051b850101111561438d57600080fd5b9250929050565b803561ffff811681146143a657600080fd5b919050565b803560ff811681146143a657600080fd5b6000602082840312156143ce57600080fd5b813561189b81614f80565b6000602082840312156143eb57600080fd5b815161189b81614f80565b6000806040838503121561440957600080fd5b823561441481614f80565b9150602083013561442481614f80565b809150509250929050565b6000806000806080858703121561444557600080fd5b843561445081614f80565b9350602085013561446081614f80565b9250604085013561447081614f80565b9150606085013561448081614f80565b939692955090935050565b6000806000606084860312156144a057600080fd5b83356144ab81614f80565b925060208401356144bb81614f80565b929592945050506040919091013590565b600080600080608085870312156144e257600080fd5b84356144ed81614f80565b935060208501356144fd81614f80565b925060408501359150606085013567ffffffffffffffff81111561452057600080fd5b8501601f8101871361453157600080fd5b803561454461453f82614d61565b614d30565b81815288602083850101111561455957600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060006040848603121561459057600080fd5b833561459b81614f80565b9250602084013567ffffffffffffffff8111156145b757600080fd5b6145c386828701614348565b9497909650939450505050565b600080604083850312156145e357600080fd5b82356145ee81614f80565b9150602083013561442481614f95565b6000806040838503121561461157600080fd5b823561461c81614f80565b946020939093013593505050565b60008060006040848603121561463f57600080fd5b833567ffffffffffffffff81111561465657600080fd5b61466286828701614348565b909450925050602084013561467681614f80565b809150509250925092565b6000806020838503121561469457600080fd5b823567ffffffffffffffff8111156146ab57600080fd5b6146b785828601614348565b90969095509350505050565b6000806000604084860312156146d857600080fd5b833567ffffffffffffffff8111156146ef57600080fd5b6146fb86828701614348565b909450925050602084013561467681614fb9565b60006020828403121561472157600080fd5b813561189b81614f95565b60006020828403121561473e57600080fd5b815161189b81614f95565b60006020828403121561475b57600080fd5b813561189b81614fa3565b60006020828403121561477857600080fd5b815161189b81614fa3565b6000806040838503121561479657600080fd5b823561461c81614fb9565b6000602082840312156147b357600080fd5b815167ffffffffffffffff8111156147ca57600080fd5b8201601f810184136147db57600080fd5b80516147e961453f82614d61565b8181528560208385010111156147fe57600080fd5b61480f826020830160208601614e5c565b95945050505050565b6000806040838503121561482b57600080fd5b61483483614394565b915061484260208401614394565b90509250929050565b60006020828403121561485d57600080fd5b5035919050565b60006020828403121561487657600080fd5b5051919050565b6000806040838503121561489057600080fd5b82359150602083013561442481614f80565b600080604083850312156148b557600080fd5b82359150602083013561442481614fb9565b600080604083850312156148da57600080fd5b8235915061484260208401614394565b600080604083850312156148fd57600080fd5b50508035926020909101359150565b6000806000806060858703121561492257600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561494757600080fd5b61495387828801614348565b95989497509550505050565b6000806040838503121561497257600080fd5b82359150614842602084016143ab565b6000806000806000806000806000806000806101808d8f0312156149a557600080fd5b8c359b506149b560208e016143ab565b9a506149c360408e016143ab565b99506149d160608e016143ab565b98506149df60808e016143ab565b97506149ed60a08e016143ab565b96506149fb60c08e016143ab565b9550614a0960e08e016143ab565b9450614a186101008e01614394565b9350614a276101208e01614394565b9250614a366101408e01614394565b9150614a456101608e016143ab565b90509295989b509295989b509295989b565b60008151808452614a6f816020860160208601614e5c565b601f01601f19169290920160200192915050565b6001600160601b0319606094851b811682529290931b9091166014830152602882015260480190565b60008251614abe818460208701614e5c565b9190910192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d4390830184614a57565b6001600160a01b0384168152604060208201819052810182905260006001600160fb1b03831115614b2b57600080fd5b8260051b8085606085013760009201606001918252509392505050565b6001600160a01b03841681526001600160581b03831660208201526060810160028310614b8557634e487b7160e01b600052602160045260246000fd5b826040830152949350505050565b60208152600061189b6020830184614a57565b6020808252600d908201526c6e6f7420796f757220646f676560981b604082015260600190565b60208082526017908201527f796f7527726520747279696e6720746f20636865617421000000000000000000604082015260600190565b60208082526012908201527139ba34b6361034b71031b7b7b6103237bbb760711b604082015260600190565b815160ff16815261016081016020830151614c50602084018260ff169052565b506040830151614c65604084018260ff169052565b506060830151614c7a606084018260ff169052565b506080830151614c8f608084018260ff169052565b5060a0830151614ca460a084018260ff169052565b5060c0830151614cb960c084018260ff169052565b5060e0830151614ccf60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101409283015160ff16929091019190915290565b838152606060208201526000614d206060830185614a57565b9050826040830152949350505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715614d5957614d59614f6a565b604052919050565b600067ffffffffffffffff821115614d7b57614d7b614f6a565b50601f01601f191660200190565b600061ffff808316818516808303821115614da657614da6614f12565b01949350505050565b60008219821115614dc257614dc2614f12565b500190565b600061ffff80841680614ddc57614ddc614f28565b92169190910492915050565b600082614df757614df7614f28565b500490565b600061ffff80831681851681830481118215151615614e1d57614e1d614f12565b02949350505050565b6000816000190483118215151615614e4057614e40614f12565b500290565b600082821015614e5757614e57614f12565b500390565b60005b83811015614e77578181015183820152602001614e5f565b838111156114645750506000910152565b600081614e9757614e97614f12565b506000190190565b600061ffff80831681811415614eb757614eb7614f12565b6001019392505050565b6000600019821415614ed557614ed5614f12565b5060010190565b600082614eeb57614eeb614f28565b500690565b600060ff831680614f0357614f03614f28565b8060ff84160691505092915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146112ab57600080fd5b80151581146112ab57600080fd5b6001600160e01b0319811681146112ab57600080fd5b600281106112ab57600080fdfea2646970667358221220161fd5ed520acdcbab9955034cd43b5bc93e0d7fadb24d770e0129aed9df08f764736f6c63430008070033

Deployed Bytecode Sourcemap

16294:31403:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47577:1;47557:7;;-1:-1:-1;;;;;;47557:7:0;47545:20;;:11;:20;;;;;;-1:-1:-1;;;;;47545:20:0;47542:145;;47596:15;18718:42;47596:9;:15::i;:::-;16294:31403;47542:145;47654:20;47666:7;;-1:-1:-1;;;;;;47666:7:0;47654:20;;:11;:20;;;;;;47644:31;;-1:-1:-1;;;;;47654:20:0;47644:9;:31::i;18069:16::-;;;;;-1:-1:-1;;;;;18069:16:0;;;;;;-1:-1:-1;;;;;14750:32:1;;;14732:51;;14720:2;14705:18;18069:16:0;;;;;;;;7258:171;;;;;;:::i;:::-;;:::i;:::-;;;17598:14:1;;17591:22;17573:41;;17561:2;17546:18;7258:171:0;17433:187:1;20486:196:0;;;;;;:::i;:::-;;:::i;6073:24::-;;;;;;;;;26394:25:1;;;26382:2;26367:18;6073:24:0;26248:177:1;39415:87:0;39480:14;;;;;;;;;;;;-1:-1:-1;;;39480:14:0;;;;39415:87;;;;;;;:::i;6254:46::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;6254:46:0;;;7441:330;;;;;;:::i;:::-;;:::i;20060:99::-;;;;;;:::i;:::-;;:::i;18183:44::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;18183:44:0;;;-1:-1:-1;;;18183:44:0;;-1:-1:-1;;;;;18183:44:0;;-1:-1:-1;;;18183:44:0;;;;;;;;;;;;;;;:::i;18234:39::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;18234:39:0;;;-1:-1:-1;;;18234:39:0;;-1:-1:-1;;;;;18234:39:0;;;;;;;-1:-1:-1;;;;;16773:32:1;;;16755:51;;-1:-1:-1;;;;;16842:37:1;;;16837:2;16822:18;;16815:65;16728:18;18234:39:0;16583:303:1;19577:114:0;;;;;;:::i;:::-;;:::i;17239:26::-;;;;;;;;;;;;26229:6:1;26217:19;;;26199:38;;26187:2;26172:18;17239:26:0;26055:188:1;6040:26:0;;;;;;29971:360;;;;;;:::i;:::-;;:::i;16673:47::-;;16712:8;16673:47;;8000:334;;;;;;:::i;:::-;;:::i;17871:29::-;;;;;;31329:264;;;;;;:::i;:::-;;:::i;16573:41::-;;16610:4;16573:41;;17410:26;;;;;;:::i;:::-;;:::i;:::-;;;26968:4:1;26956:17;;;26938:36;;26926:2;26911:18;17410:26:0;26796:184:1;17582:25:0;;;;;;:::i;:::-;;:::i;17835:29::-;;;;;;33669:174;;;:::i;18769:21::-;;;;;-1:-1:-1;;;;;18769:21:0;;;8346:136;;;;;;:::i;:::-;;:::i;19817:109::-;;;;;;:::i;:::-;;:::i;19290:279::-;;;;;;:::i;:::-;;:::i;6104:21::-;;;;;;16958:25;;;;;;;;;17907:28;;;;;;:::i;:::-;;:::i;39307:100::-;16662:4;39307:100;;35342:416;;;;;;:::i;:::-;;:::i;6195:42::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;6195:42:0;;;17191:41;;17229:3;17191:41;;19063:219;;;;;;:::i;:::-;;:::i;16990:22::-;;;;;;;;;;;;19699:110;;;;;;:::i;:::-;;:::i;35766:164::-;;;;;;:::i;:::-;;:::i;19934:118::-;;;;;;:::i;:::-;;:::i;6138:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;31601:202;;;;;;:::i;:::-;;:::i;33851:190::-;;;;;;:::i;:::-;;:::i;26997:226::-;;;;;;:::i;:::-;;:::i;32591:432::-;;;;;;:::i;:::-;;:::i;23312:1999::-;;;:::i;18799:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;18044:18;;;;;-1:-1:-1;;;;;18044:18:0;;;17157:27;;;;;;20274:101;;;;;;:::i;:::-;;:::i;6574:80::-;6641:5;;-1:-1:-1;;;;;6641:5:0;6574:80;;20821:301;;;;;;:::i;:::-;;:::i;37849:1044::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;17801:27::-;;;;;;;;;16621:45;;16662:4;16621:45;;17019:43;;;;;;:::i;:::-;;;;;;;;;;;;;;;;17737:55;;;;;;:::i;:::-;;;;;;;;;;;;;;7783:209;;;;;;:::i;:::-;;:::i;6862:192::-;;;;;;:::i;:::-;;:::i;30790:531::-;;;;;;:::i;:::-;;:::i;30339:443::-;;;;;;:::i;:::-;;:::i;36903:766::-;;;;;;:::i;:::-;;:::i;8494:583::-;;;;;;:::i;:::-;;:::i;20690:123::-;;;;;;:::i;:::-;;:::i;21736:268::-;;;;;;:::i;:::-;;:::i;17963:34::-;;;;;;:::i;:::-;;:::i;17123:27::-;;;;;;18094:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;38901:398;;;;;;:::i;:::-;;:::i;20383:95::-;;;;;;:::i;:::-;;:::i;18280:77::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;18434:21;;;;;-1:-1:-1;;;;;18434:21:0;;;6310:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;21130:145;;;;;;:::i;:::-;;:::i;20167:99::-;;;;;;:::i;:::-;;:::i;17069:45::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5786:20;;;;;-1:-1:-1;;;;;5786:20:0;;;36454:441;;;;;;:::i;:::-;;:::i;18464:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;46579:918;46922:14;46919:1;46916;46903:34;47140:1;47137;47121:14;47118:1;47102:14;47095:5;47082:60;47219:16;47216:1;47213;47198:38;47259:6;47328:68;;;;47447:16;47444:1;47437:27;47328:68;47364:16;47361:1;47354:27;47252:227;;;46579:918;:::o;7258:171::-;7328:14;-1:-1:-1;;;;;;;;;7367:25:0;;;;:54;;-1:-1:-1;;;;;;;;;;7396:25:0;;;7367:54;7355:66;7258:171;-1:-1:-1;;7258:171:0:o;20486:196::-;26636:5;;-1:-1:-1;;;;;26636:5:0;26622:10;:19;26614:28;;;;;;20607:12:::1;:28:::0;;;;20646:12:::1;:28:::0;20486:196::o;7441:330::-;7512:14;7529:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7529:16:0;7574:10;:20;;;:60;;-1:-1:-1;;;;;;7598:24:0;;;;;;:16;:24;;;;;;;;7623:10;7598:36;;;;;;;;;;7574:60;7566:85;;;;-1:-1:-1;;;7566:85:0;;19871:2:1;7566:85:0;;;19853:21:1;19910:2;19890:18;;;19883:30;-1:-1:-1;;;19929:18:1;;;19922:42;19981:18;;7566:85:0;;;;;;;;;7672:20;;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;7672:30:0;-1:-1:-1;;;;;7672:30:0;;;;;;;;;7728:34;;7672:20;;7728:34;;;;;;;7501:270;7441:330;;:::o;20060:99::-;26636:5;;-1:-1:-1;;;;;26636:5:0;26622:10;:19;26614:28;;;;;;-1:-1:-1;;;;;20133:9:0;;;::::1;;::::0;;;:4:::1;:9;::::0;;;;:18;;-1:-1:-1;;20133:18:0::1;::::0;::::1;;::::0;;;::::1;::::0;;20060:99::o;19577:114::-;19649:5;;-1:-1:-1;;;;;19649:5:0;19635:10;:19;19627:28;;;;;;19666:5;:17;;-1:-1:-1;;;;;;19666:17:0;-1:-1:-1;;;;;19666:17:0;;;;;;;;;;19577:114::o;29971:360::-;26485:11;;;;:7;:11;;;;;;30019:2;;30023:10;;-1:-1:-1;;;;;26485:11:0;:19;;;:51;;-1:-1:-1;26508:14:0;;;;:10;:14;;;;;:20;-1:-1:-1;;;;;26508:28:0;;;:20;;:28;26485:51;26477:77;;;;-1:-1:-1;;;26477:77:0;;;;;;;:::i;:::-;26033:15:::1;26051:12:::0;;;:8:::1;:12;::::0;;;;;;;;26033:30;;;;::::1;::::0;;;;-1:-1:-1;;;;;26033:30:0;::::1;::::0;;-1:-1:-1;;;26033:30:0;::::1;-1:-1:-1::0;;;;;26033:30:0::1;::::0;;::::1;::::0;;;26051:12;;26033:30;26115:29:::1;::::0;16712:8:::1;::::0;26115:29:::1;:::i;:::-;26096:15;:48;;26074:116;;;;-1:-1:-1::0;;;26074:116:0::1;;;;;;;:::i;:::-;25568:10:::2;25527:12;25682:16:::0;;;:4:::2;:16;::::0;;;;;25621;::::2;::::0;25568:10;25682:16:::2;;::::0;:58:::2;;-1:-1:-1::0;25703:10:0::2;25717:9;25703:23;:36:::0;::::2;;;-1:-1:-1::0;25730:9:0;;25703:36:::2;25660:131;;;;-1:-1:-1::0;;;25660:131:0::2;;;;;;;:::i;:::-;16610:4:::3;30088:11;;:25;;30080:55;;;::::0;-1:-1:-1;;;30080:55:0;;19525:2:1;30080:55:0::3;::::0;::::3;19507:21:1::0;19564:2;19544:18;;;19537:30;-1:-1:-1;;;19583:18:1;;;19576:47;19640:18;;30080:55:0::3;19323:341:1::0;30080:55:0::3;30146:12;30161:18;:16;:18::i;:::-;30146:33:::0;-1:-1:-1;30194:8:0;;30190:42:::3;;30204:5;::::0;;:28:::3;::::0;-1:-1:-1;;;30204:28:0;;30215:10:::3;30204:28;::::0;::::3;16049:51:1::0;16116:18;;;16109:34;;;-1:-1:-1;;;;;30204:5:0::3;::::0;:10:::3;::::0;16022:18:1;;30204:28:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;30190:42;30243:12;::::0;;;:8:::3;:12;::::0;;;;:48;;-1:-1:-1;;;;30243:48:0::3;-1:-1:-1::0;;;30275:15:0::3;-1:-1:-1::0;;;;;30243:48:0::3;;;::::0;;30302:21:::3;30312:10;30302:9;:21::i;:::-;30069:262;25931:3:::2;25936:14;25952:12;;25914:51;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;25914:51:0;;::::2;::::0;;;;;;25904:62;;25914:51:::2;25904:62:::0;;::::2;::::0;25889:12:::2;:77:::0;-1:-1:-1;;;;;;;29971:360:0:o;8000:334::-;8105:10;-1:-1:-1;;;;;8105:18:0;;;;:70;;-1:-1:-1;8155:20:0;;;;:11;:20;;;;;;-1:-1:-1;;;;;8155:20:0;8141:10;:34;8105:70;:121;;;-1:-1:-1;;;;;;8192:22:0;;;;;;:16;:22;;;;;;;;8215:10;8192:34;;;;;;;;;;8105:121;8083:184;;;;-1:-1:-1;;;8083:184:0;;19871:2:1;8083:184:0;;;19853:21:1;19910:2;19890:18;;;19883:30;-1:-1:-1;;;19929:18:1;;;19922:42;19981:18;;8083:184:0;19669:336:1;8083:184:0;8288:28;8298:4;8304:2;8308:7;8288:9;:28::i;31329:264::-;31412:7;;31477:8;31461:101;31491:7;31487:11;;:1;:11;;;31461:101;;;31530:17;31548:1;31530:20;;;;;;;;;;:::i;:::-;;;;;;;;;31520:30;;;;;:::i;:::-;;-1:-1:-1;31500:3:0;;;;:::i;:::-;;;;31461:101;;;-1:-1:-1;31579:6:0;31329:264;-1:-1:-1;;;31329:264:0:o;17410:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17582:25::-;;;;;;;;;;;33669:174;26636:5;;-1:-1:-1;;;;;26636:5:0;26622:10;:19;26614:28;;;;;;33719:51:::1;::::0;33727:10:::1;::::0;33748:21:::1;33719:51:::0;::::1;;;::::0;::::1;::::0;;;33748:21;33727:10;33719:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;33781:3:0::1;::::0;33806:28:::1;::::0;-1:-1:-1;;;33806:28:0;;33828:4:::1;33806:28;::::0;::::1;14732:51:1::0;-1:-1:-1;;;;;33781:3:0;;::::1;::::0;:12:::1;::::0;33794:10:::1;::::0;33781:3;;33806:13:::1;::::0;14705:18:1;;33806:28:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33781:54;::::0;-1:-1:-1;;;;;;33781:54:0::1;::::0;;;;;;-1:-1:-1;;;;;16067:32:1;;;33781:54:0::1;::::0;::::1;16049:51:1::0;16116:18;;;16109:34;16022:18;;33781:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33669:174::o:0;8346:136::-;8435:39;8452:4;8458:2;8462:7;8435:39;;;;;;;;;;;;:16;:39::i;19817:109::-;19890:5;;-1:-1:-1;;;;;19890:5:0;19876:10;:19;19868:28;;;;;;19907:6;:11;;-1:-1:-1;;;;;;19907:11:0;-1:-1:-1;;;;;19907:11:0;;;;;;;;;;19817:109::o;19290:279::-;26636:5;;-1:-1:-1;;;;;26636:5:0;26622:10;:19;26614:28;;;;;;19449:6:::1;:25:::0;;-1:-1:-1;;;;;19449:25:0;;::::1;-1:-1:-1::0;;;;;;19449:25:0;;::::1;;::::0;;;19485:5:::1;:21:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;19517:3:::1;:17:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;19545:6:::1;:16:::0;;;;;::::1;::::0;::::1;;::::0;;19290:279::o;17907:28::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17907:28:0;:::o;35342:416::-;35453:13;35448:303;35472:18;;;35448:303;;;35565:10;35542:7;:19;35550:3;;35554:5;35550:10;;;;;;;:::i;:::-;;;;;;;;;;35542:19;;-1:-1:-1;35542:19:0;;;;;;;;-1:-1:-1;35542:19:0;;-1:-1:-1;;;;;35542:19:0;:33;;:79;;-1:-1:-1;35611:10:0;35579;:22;35590:3;;35594:5;35590:10;;;;;;;:::i;:::-;;;;;;;;;;35579:22;;-1:-1:-1;35579:22:0;;;;;;;;-1:-1:-1;35579:22:0;:28;-1:-1:-1;;;;;35579:28:0;:42;35542:79;35516:154;;;;-1:-1:-1;;;35516:154:0;;;;;;;:::i;:::-;35685:54;35695:3;;35699:5;35695:10;;;;;;;:::i;:::-;;;;;;;35707;35719:7;35728:10;35685:9;:54::i;:::-;35492:7;;;;:::i;:::-;;;;35448:303;;;;35342:416;;;:::o;19063:219::-;26636:5;;-1:-1:-1;;;;;26636:5:0;26622:10;:19;26614:28;;;;;;19163:13:::1;19158:117;19182:20:::0;;::::1;19158:117;;;19256:6;19228:11;:25;19240:5;;19246;19240:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;19228:25:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;19228:25:0;:34;;-1:-1:-1;;;;;;19228:34:0::1;-1:-1:-1::0;;;;;19228:34:0;;;::::1;::::0;;;::::1;::::0;;19204:7;::::1;::::0;::::1;:::i;:::-;;;;19158:117;;19699:110:::0;19769:5;;-1:-1:-1;;;;;19769:5:0;19755:10;:19;19747:28;;;;;;19786:3;:15;;-1:-1:-1;;;;;;19786:15:0;-1:-1:-1;;;;;19786:15:0;;;;;;;;;;19699:110::o;35766:164::-;35830:13;35825:98;35849:18;;;35825:98;;;35893:18;35900:3;;35904:5;35900:10;;;;;;;:::i;:::-;;;;;;;35893:6;:18::i;:::-;35869:7;;;;:::i;:::-;;;;35825:98;;19934:118;20007:5;;-1:-1:-1;;;;;20007:5:0;19993:10;:19;19985:28;;;;;;20024:6;:20;;-1:-1:-1;;;;;;20024:20:0;-1:-1:-1;;;;;20024:20:0;;;;;;;;;;19934:118::o;31601:202::-;26485:11;;;;:7;:11;;;;;;31670:2;;31674:10;;-1:-1:-1;;;;;26485:11:0;:19;;;:51;;-1:-1:-1;26508:14:0;;;;:10;:14;;;;;:20;-1:-1:-1;;;;;26508:28:0;;;:20;;:28;26485:51;26477:77;;;;-1:-1:-1;;;26477:77:0;;;;;;;:::i;:::-;25568:10:::1;25527:12;25682:16:::0;;;:4:::1;:16;::::0;;;;;25621;::::1;::::0;25568:10;25682:16:::1;;::::0;:58:::1;;-1:-1:-1::0;25703:10:0::1;25717:9;25703:23;:36:::0;::::1;;;-1:-1:-1::0;25730:9:0;;25703:36:::1;25660:131;;;;-1:-1:-1::0;;;25660:131:0::1;;;;;;;:::i;:::-;31716:13:::2;::::0;;;:9:::2;:13;::::0;;;;;:23:::2;::::0;;::::2;:13:::0;::::2;:23;;31708:54;;;::::0;-1:-1:-1;;;31708:54:0;;20903:2:1;31708:54:0::2;::::0;::::2;20885:21:1::0;20942:2;20922:18;;;20915:30;-1:-1:-1;;;20961:18:1;;;20954:48;21019:18;;31708:54:0::2;20701:342:1::0;31708:54:0::2;31773:13;::::0;;;:9:::2;:13;::::0;;;;;;;;:22;;-1:-1:-1;;31773:22:0::2;;::::0;::::2;;::::0;;25952:12:::1;::::0;25914:51;;::::1;::::0;25931:3;;25936:14:::1;::::0;25914:51:::1;;:::i;:::-;;::::0;;-1:-1:-1;;25914:51:0;;::::1;::::0;;;;;;25904:62;;25914:51:::1;25904:62:::0;;::::1;::::0;25889:12:::1;:77:::0;-1:-1:-1;;;;;;31601:202:0:o;33851:190::-;26485:11;;;;:7;:11;;;;;;33935:2;;33939:10;;-1:-1:-1;;;;;26485:11:0;:19;;;:51;;-1:-1:-1;26508:14:0;;;;:10;:14;;;;;:20;-1:-1:-1;;;;;26508:28:0;;;:20;;:28;26485:51;26477:77;;;;-1:-1:-1;;;26477:77:0;;;;;;;:::i;:::-;25568:10:::1;25527:12;25682:16:::0;;;:4:::1;:16;::::0;;;;;25621;::::1;::::0;25568:10;25682:16:::1;;::::0;:58:::1;;-1:-1:-1::0;25703:10:0::1;25717:9;25703:23;:36:::0;::::1;;;-1:-1:-1::0;25730:9:0;;25703:36:::1;25660:131;;;;-1:-1:-1::0;;;25660:131:0::1;;;;;;;:::i;:::-;33987:46:::2;33997:2;34001:10;34013:7;34022:10;33987:9;:46::i;:::-;25931:3:::1;25936:14;25952:12;;25914:51;;;;;;;;;;:::i;26997:226::-:0;27081:4;27107:11;;;:7;:11;;;;;;-1:-1:-1;;;;;27107:19:0;;;:11;;:19;;:51;;-1:-1:-1;27130:14:0;;;;:10;:14;;;;;:20;-1:-1:-1;;;;;27130:28:0;;;:20;;:28;27107:51;:107;;;-1:-1:-1;27185:6:0;;27162:44;;-1:-1:-1;;;27162:44:0;;;;;26394:25:1;;;-1:-1:-1;;;;;27162:52:0;;;;27185:6;;27162:40;;26367:18:1;;27162:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;27162:52:0;;27107:107;27099:116;26997:226;-1:-1:-1;;;26997:226:0:o;32591:432::-;26485:11;;;;:7;:11;;;;;;32689:2;;32693:10;;-1:-1:-1;;;;;26485:11:0;:19;;;:51;;-1:-1:-1;26508:14:0;;;;:10;:14;;;;;:20;-1:-1:-1;;;;;26508:28:0;;;:20;;:28;26485:51;26477:77;;;;-1:-1:-1;;;26477:77:0;;;;;;;:::i;:::-;26033:15:::1;26051:12:::0;;;:8:::1;:12;::::0;;;;;;;;26033:30;;;;::::1;::::0;;;;-1:-1:-1;;;;;26033:30:0;::::1;::::0;;-1:-1:-1;;;26033:30:0;::::1;-1:-1:-1::0;;;;;26033:30:0::1;::::0;;::::1;::::0;;;26051:12;;26033:30;26115:29:::1;::::0;16712:8:::1;::::0;26115:29:::1;:::i;:::-;26096:15;:48;;26074:116;;;;-1:-1:-1::0;;;26074:116:0::1;;;;;;;:::i;:::-;25568:10:::2;25527:12;25682:16:::0;;;:4:::2;:16;::::0;;;;;25621;::::2;::::0;25568:10;25682:16:::2;;::::0;:58:::2;;-1:-1:-1::0;25703:10:0::2;25717:9;25703:23;:36:::0;::::2;;;-1:-1:-1::0;25730:9:0;;25703:36:::2;25660:131;;;;-1:-1:-1::0;;;25660:131:0::2;;;;;;;:::i;:::-;32773:14:::3;32790:11;32853:1;32816:18;:30;32835:10;32816:30;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;32847:2;32816:34;;;;;;;;;;;;:38;:113;;32928:1;32816:113;;;32874:18;:30;32893:10;32874:30;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;32905:2;32874:34;;;;;;;;;;;;32816:113;32790:150;;;;;;;;:::i;:::-;;::::0;;;::::3;::::0;;;::::3;::::0;32951:5:::3;::::0;;:30:::3;::::0;-1:-1:-1;;;32951:30:0;;32962:10:::3;32951:30;::::0;::::3;16049:51:1::0;16116:18;;;16109:34;;;32790:150:0;;-1:-1:-1;;;;;;32951:5:0;;::::3;::::0;:10:::3;::::0;16022:18:1;;32951:30:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;32992:23;33000:2;33004:10;32992:7;:23::i;:::-;32762:261;25931:3:::2;25936:14;25952:12;;25914:51;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;25914:51:0;;::::2;::::0;;;;;;25904:62;;25914:51:::2;25904:62:::0;;::::2;::::0;25889:12:::2;:77:::0;-1:-1:-1;;;;;;;;32591:432:0:o;23312:1999::-;26636:5;;-1:-1:-1;;;;;26636:5:0;26622:10;:19;26614:28;;;;;;23362:5:::1;:18:::0;;-1:-1:-1;;;;;;23362:18:0::1;23370:10;23362:18:::0;;::::1;::::0;;-1:-1:-1;23391:16:0;;;:4:::1;:16;::::0;;;;;;;;:23;;-1:-1:-1;;23391:23:0::1;::::0;;::::1;::::0;;;23456:13:::1;:21:::0;;-1:-1:-1;;23488:18:0;;;23532:11:::1;23517:12;:26:::0;23569:9:::1;23554:12;:24:::0;23731:59;;::::1;::::0;::::1;::::0;;23746:3:::1;23731:59:::0;;23751:3:::1;23731:59:::0;;::::1;::::0;;;;23391:23:::1;23731:59:::0;;;;;;;23761:3:::1;23731:59:::0;;;;;;;;;;;;;;;;23776:3:::1;23731:59:::0;;;;;;;;;;;;23362:18:::1;23731:59:::0;;;::::1;::::0;:8:::1;::::0;:59:::1;:::i;:::-;-1:-1:-1::0;23801:40:0::1;::::0;;::::1;::::0;::::1;::::0;;23815:1:::1;23801:40:::0;;;::::1;::::0;::::1;::::0;23821:1:::1;23801:40:::0;;;;;;;-1:-1:-1;23801:40:0;;;;;;;;;;;;;;;;;;;;;;23836:1:::1;23801:40:::0;;;;;;;;;;::::1;::::0;:7:::1;::::0;:40:::1;;:::i;:::-;-1:-1:-1::0;23870:54:0::1;::::0;;::::1;::::0;::::1;::::0;;23885:3:::1;23870:54:::0;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;:11;;:54:::1;;:::i;:::-;-1:-1:-1::0;23935:37:0::1;::::0;;::::1;::::0;::::1;::::0;;23949:1:::1;23935:37:::0;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;:10;;:37:::1;;:::i;:::-;-1:-1:-1::0;24001:43:0::1;::::0;;::::1;::::0;::::1;::::0;;24016:3:::1;24001:43:::0;;;24021:3:::1;24001:43;::::0;::::1;::::0;;;;;;;;24031:3:::1;24001:43:::0;;;;24036:3:::1;24001:43:::0;;;;24041:2:::1;24001:43:::0;;;;::::1;::::0;:11;;:43:::1;;:::i;:::-;-1:-1:-1::0;24055:31:0::1;::::0;;::::1;::::0;::::1;::::0;;24069:1:::1;24055:31:::0;;;::::1;::::0;::::1;::::0;24075:1:::1;24055:31:::0;;;;;;;-1:-1:-1;24055:31:0;;;;;;;;;;24084:1:::1;24055:31:::0;;;;::::1;::::0;:10;;:31:::1;;:::i;:::-;-1:-1:-1::0;24115:54:0::1;::::0;;::::1;::::0;::::1;::::0;;24130:3:::1;24115:54:::0;;24135:3:::1;24115:54;::::0;::::1;::::0;24140:3:::1;24115:54:::0;;;;;;;::::1;::::0;;;;24150:3:::1;24115:54:::0;;;;;;;;;;;;;;;;24165:3:::1;24115:54:::0;;;;::::1;::::0;:11;;:54:::1;;:::i;:::-;-1:-1:-1::0;24180:37:0::1;::::0;;::::1;::::0;::::1;::::0;;24194:1:::1;24180:37:::0;;;::::1;::::0;::::1;::::0;24200:1:::1;24180:37:::0;;;;;;;24203:1:::1;24180:37:::0;;;;-1:-1:-1;24180:37:0;;;;;;;;;;24212:1:::1;24180:37:::0;;;;;;;;;;::::1;::::0;:10;;:37:::1;;:::i;:::-;-1:-1:-1::0;24246:19:0::1;::::0;;::::1;::::0;::::1;::::0;;;24261:3:::1;24246:19:::0;;::::1;::::0;:11;;:19:::1;;:::i;:::-;-1:-1:-1::0;24276:16:0::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;24276:16:0;;::::1;::::0;:10;;:16:::1;;:::i;:::-;-1:-1:-1::0;24323:19:0::1;::::0;;::::1;::::0;::::1;::::0;;;24338:3:::1;24323:19:::0;;::::1;::::0;:11;;:19:::1;;:::i;:::-;-1:-1:-1::0;24353:16:0::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;24353:16:0;;::::1;::::0;:10;;:16:::1;;:::i;:::-;-1:-1:-1::0;24401:19:0::1;::::0;;::::1;::::0;::::1;::::0;;;24416:3:::1;24401:19:::0;;::::1;::::0;:11;;:19:::1;;:::i;:::-;-1:-1:-1::0;24431:16:0::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;24431:16:0;;::::1;::::0;:10;;:16:::1;;:::i;:::-;-1:-1:-1::0;24460:15:0::1;:23:::0;;-1:-1:-1;;24460:23:0::1;::::0;;24540:10:::1;24523:14;:27:::0;24578:8:::1;24561:14;:25:::0;;;24597:139:::1;::::0;;::::1;::::0;::::1;::::0;;24626:7:::1;24597:139:::0;;24648:8:::1;24597:139:::0;;::::1;::::0;;;;24671:8:::1;24597:139:::0;;;;24694:8:::1;24597:139:::0;;;;24717:8:::1;24597:139:::0;;;;::::1;::::0;:11:::1;::::0;:139:::1;;:::i;:::-;-1:-1:-1::0;24808:495:0::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;24808:495:0;;24865:8:::1;24808:495;::::0;::::1;::::0;24888:8:::1;24808:495:::0;;;;;;;24911:8:::1;24808:495:::0;;;;24934:8:::1;24808:495:::0;;;;24957:8:::1;24808:495:::0;;;;24980:8:::1;24808:495:::0;;;;25003:8:::1;24808:495:::0;;;;25026:8:::1;24808:495:::0;;;;25049:8:::1;24808:495:::0;;;;25072:8:::1;24808:495:::0;;;;25095:8:::1;24808:495:::0;;;;25118:8:::1;24808:495:::0;;;;25141:8:::1;24808:495:::0;;;;25164:8:::1;24808:495:::0;;;;25187:9:::1;24808:495:::0;;;;25211:9:::1;24808:495:::0;;;;25235:9:::1;24808:495:::0;;;;25259:9:::1;24808:495:::0;;;;25283:9:::1;24808:495:::0;;;;::::1;::::0;:17:::1;::::0;:495:::1;;:::i;20274:101::-:0;26636:5;;-1:-1:-1;;;;;26636:5:0;26622:10;:19;26614:28;;;;;;20344:13:::1;:23:::0;;-1:-1:-1;;20344:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;20274:101::o;20821:301::-;26636:5;;-1:-1:-1;;;;;26636:5:0;26622:10;:19;26614:28;;;;;;20997:14:::1;:32:::0;;;21040:14:::1;:32:::0;;;21083:31:::1;:11;21097:17:::0;;21083:31:::1;:::i;:::-;;20821:301:::0;;;;:::o;37849:1044::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37942:21:0;;;;:12;:21;;;;;;37967:12;37942:37;37938:350;;;-1:-1:-1;;37988:300:0;;;;;;;;-1:-1:-1;37988:300:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37849:1044::o;37938:350::-;-1:-1:-1;38306:579:0;;;;;;;;-1:-1:-1;38333:14:0;;;:5;:14;;;;;;;:19;;;;;38306:579;;38333:19;38374:20;;;;;38306:579;;;;38416:20;;;;;38306:579;;;;38458:20;;;;;38306:579;;;;38500:20;;;;;38306:579;;;;38544:22;;;;;38306:579;;;;-1:-1:-1;;;38591:23:0;;;;38306:579;;;;38636:20;-1:-1:-1;;;38636:20:0;;;;;38306:579;;;;38696:46;;;:37;:46;;;;;;38306:579;;;;;;38783:46;;;:37;:46;;;;;;38306:579;;;;;;;38855:18;;;:9;:18;;;;;;;;;;38306:579;;;;;37849:1044::o;7783:209::-;7880:10;7863:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;7863:38:0;;;;;;;;;;;;:49;;-1:-1:-1;;7863:49:0;;;;;;;;;;7938:46;;17573:41:1;;;7863:38:0;;7880:10;7938:46;;17546:18:1;7938:46:0;;;;;;;7783:209;;:::o;6862:192::-;6951:16;;;;:7;:16;;;;;;-1:-1:-1;;;;;6951:16:0;6937:10;:30;6929:52;;;;-1:-1:-1;;;6929:52:0;;23405:2:1;6929:52:0;;;23387:21:1;23444:1;23424:18;;;23417:29;-1:-1:-1;;;23462:18:1;;;23455:39;23511:18;;6929:52:0;23203:332:1;6929:52:0;7002:34;7012:10;7024:2;7028:7;7002:9;:34::i;:::-;6862:192;;:::o;30790:531::-;26485:11;;;;:7;:11;;;;;;30894:2;;30898:10;;-1:-1:-1;;;;;26485:11:0;:19;;;:51;;-1:-1:-1;26508:14:0;;;;:10;:14;;;;;:20;-1:-1:-1;;;;;26508:28:0;;;:20;;:28;26485:51;26477:77;;;;-1:-1:-1;;;26477:77:0;;;;;;;:::i;:::-;26033:15:::1;26051:12:::0;;;:8:::1;:12;::::0;;;;;;;;26033:30;;;;::::1;::::0;;;;-1:-1:-1;;;;;26033:30:0;::::1;::::0;;-1:-1:-1;;;26033:30:0;::::1;-1:-1:-1::0;;;;;26033:30:0::1;::::0;;::::1;::::0;;;26051:12;;26033:30;26115:29:::1;::::0;16712:8:::1;::::0;26115:29:::1;:::i;:::-;26096:15;:48;;26074:116;;;;-1:-1:-1::0;;;26074:116:0::1;;;;;;;:::i;:::-;25568:10:::2;25527:12;25682:16:::0;;;:4:::2;:16;::::0;;;;;25621;::::2;::::0;25568:10;25682:16:::2;;::::0;:58:::2;;-1:-1:-1::0;25703:10:0::2;25717:9;25703:23;:36:::0;::::2;;;-1:-1:-1::0;25730:9:0;;25703:36:::2;25660:131;;;;-1:-1:-1::0;;;25660:131:0::2;;;;;;;:::i;:::-;30978:13:::3;30994:9:::0;;;:5:::3;:9;::::0;;;;:15;::::3;-1:-1:-1::0;;;30994:15:0;;::::3;::::0;::::3;::::0;31028:16;::::3;::::0;::::3;31020:42;;;::::0;-1:-1:-1;;;31020:42:0;;19183:2:1;31020:42:0::3;::::0;::::3;19165:21:1::0;19222:2;19202:18;;;19195:30;-1:-1:-1;;;19241:18:1;;;19234:43;19294:18;;31020:42:0::3;18981:337:1::0;31020:42:0::3;31092:2;31081:7;:13;;;;31073:43;;;::::0;-1:-1:-1;;;31073:43:0;;18495:2:1;31073:43:0::3;::::0;::::3;18477:21:1::0;18534:2;18514:18;;;18507:30;-1:-1:-1;;;18553:18:1;;;18546:47;18610:18;;31073:43:0::3;18293:341:1::0;31073:43:0::3;31127:10;31134:2;31127:6;:10::i;:::-;31216:5;::::0;-1:-1:-1;;;;;31216:5:0::3;:10;31227;31239:37;31260:6:::0;31268:7;31239:20:::3;:37::i;:::-;31216:61;::::0;-1:-1:-1;;;;;;31216:61:0::3;::::0;;;;;;-1:-1:-1;;;;;16067:32:1;;;31216:61:0::3;::::0;::::3;16049:51:1::0;16116:18;;;16109:34;16022:18;;31216:61:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;;31288:9:0::3;::::0;;;:5:::3;:9;::::0;;;;;;;;:25;;-1:-1:-1;;;;31288:25:0::3;-1:-1:-1::0;;;31288:25:0::3;::::0;::::3;;;::::0;;25952:12:::2;::::0;25914:51;;::::2;::::0;-1:-1:-1;25931:3:0;;-1:-1:-1;25936:14:0::2;::::0;25952:12;25914:51:::2;;:::i;30339:443::-:0;26485:11;;;;:7;:11;;;;;;30419:2;;30423:10;;-1:-1:-1;;;;;26485:11:0;:19;;;:51;;-1:-1:-1;26508:14:0;;;;:10;:14;;;;;:20;-1:-1:-1;;;;;26508:28:0;;;:20;;:28;26485:51;26477:77;;;;-1:-1:-1;;;26477:77:0;;;;;;;:::i;:::-;26033:15:::1;26051:12:::0;;;:8:::1;:12;::::0;;;;;;;;26033:30;;;;::::1;::::0;;;;-1:-1:-1;;;;;26033:30:0;::::1;::::0;;-1:-1:-1;;;26033:30:0;::::1;-1:-1:-1::0;;;;;26033:30:0::1;::::0;;::::1;::::0;;;26051:12;;26033:30;26115:29:::1;::::0;16712:8:::1;::::0;26115:29:::1;:::i;:::-;26096:15;:48;;26074:116;;;;-1:-1:-1::0;;;26074:116:0::1;;;;;;;:::i;:::-;25568:10:::2;25527:12;25682:16:::0;;;:4:::2;:16;::::0;;;;;25621;::::2;::::0;25568:10;25682:16:::2;;::::0;:58:::2;;-1:-1:-1::0;25703:10:0::2;25717:9;25703:23;:36:::0;::::2;;;-1:-1:-1::0;25730:9:0;;25703:36:::2;25660:131;;;;-1:-1:-1::0;;;25660:131:0::2;;;;;;;:::i;:::-;30503:10:::3;30510:2;30503:6;:10::i;:::-;30592:13;30608:9:::0;;;:5:::3;:9;::::0;;;;:15;-1:-1:-1;;;30608:15:0;::::3;;;30651:2;30642:11:::0;::::3;30634:41;;;::::0;-1:-1:-1;;;30634:41:0;;23059:2:1;30634:41:0::3;::::0;::::3;23041:21:1::0;23098:2;23078:18;;;23071:30;-1:-1:-1;;;23117:18:1;;;23110:47;23174:18;;30634:41:0::3;22857:341:1::0;30634:41:0::3;30686:5;::::0;30709:17:::3;:25:::0;;-1:-1:-1;;;;;30686:5:0;;::::3;::::0;:10:::3;::::0;30697::::3;::::0;30709:25:::3;::::0;::::3;::::0;;::::3;;;;;:::i;:::-;;::::0;;;::::3;::::0;;;::::3;::::0;30686:49:::3;::::0;-1:-1:-1;;;;;;30686:49:0::3;::::0;;;;;;-1:-1:-1;;;;;16067:32:1;;;30686:49:0::3;::::0;::::3;16049:51:1::0;16116:18;;;16109:34;16022:18;;30686:49:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;30764:6;30773:1;30764:10;;;;:::i;:::-;30746:9;::::0;;;:5:::3;:9;::::0;;;;;;;;:28;;::::3;::::0;;;::::3;-1:-1:-1::0;;;30746:28:0::3;-1:-1:-1::0;;;;30746:28:0;;::::3;::::0;;;::::3;::::0;;;25952:12:::2;::::0;25914:51;;::::2;::::0;-1:-1:-1;25931:3:0;;25936:14:::2;::::0;25952:12;25914:51:::2;;:::i;36903:766::-:0;37160:5;;-1:-1:-1;;;;;37160:5:0;37146:10;:19;;:39;;-1:-1:-1;37174:10:0;37169:16;;;;:4;:16;;;;;;;;37146:39;37138:66;;;;-1:-1:-1;;;37138:66:0;;21605:2:1;37138:66:0;;;21587:21:1;21644:2;21624:18;;;21617:30;-1:-1:-1;;;21663:18:1;;;21656:44;21717:18;;37138:66:0;21403:338:1;37138:66:0;37232:4;37215:5;:9;37221:2;37215:9;;;;;;;;;;;:14;;;:21;;;;;;;;;;;;;;;;;;37265:5;37247;:9;37253:2;37247:9;;;;;;;;;;;:15;;;:23;;;;;;;;;;;;;;;;;;37299:5;37281;:9;37287:2;37281:9;;;;;;;;;;;:15;;;:23;;;;;;;;;;;;;;;;;;37333:5;37315;:9;37321:2;37315:9;;;;;;;;;;;:15;;;:23;;;;;;;;;;;;;;;;;;37367:5;37349;:9;37355:2;37349:9;;;;;;;;;;;:15;;;:23;;;;;;;;;;;;;;;;;;37403:7;37383:5;:9;37389:2;37383:9;;;;;;;;;;;:17;;;:27;;;;;;;;;;;;;;;;;;37442:8;37421:5;:9;37427:2;37421:9;;;;;;;;;;;:18;;;:29;;;;;;;;;;;;;;;;;;37479:5;37461;:9;37467:2;37461:9;;;;;;;;;;;:15;;;:23;;;;;;;;;;;;;;;;;;37539:16;37495:60;;:18;:37;37514:17;37495:37;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:41;37533:2;37495:41;;;;;;;;;;;:60;;;;37610:16;37566:60;;:18;:37;37585:17;37566:37;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;37566:37:0;;;:41;;;;;;;;;:60;;;;37637:9;:13;;;;;:24;;-1:-1:-1;;37637:24:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;36903:766:0:o;8494:583::-;8600:31;8613:4;8619:2;8623:7;8600:12;:31::i;:::-;-1:-1:-1;;;;;8657:14:0;;;:19;8653:417;;8770:21;8795:2;-1:-1:-1;;;;;8795:13:0;8832:10;8861;8873:4;8879:7;8888:4;8809:84;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8809:84:0;;;;;;;;;;;8795:99;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8767:127;;;8927:15;8956:8;8945:30;;;;;;;;;;;;:::i;:::-;8927:48;-1:-1:-1;;;;;;;;;;9012:22:0;;;9004:54;;;;-1:-1:-1;;;9004:54:0;;22711:2:1;9004:54:0;;;22693:21:1;22750:2;22730:18;;;22723:30;-1:-1:-1;;;22769:18:1;;;22762:49;22828:18;;9004:54:0;22509:343:1;9004:54:0;8678:392;;8494:583;;;;:::o;20690:123::-;26636:5;;-1:-1:-1;;;;;26636:5:0;26622:10;:19;26614:28;;;;;;20771:15:::1;:34:::0;;-1:-1:-1;;20771:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;20690:123::o;21736:268::-;21865:21;;;;:12;:21;;;;;;21792:13;;21890:12;21865:37;;21857:97;;;;-1:-1:-1;;;21857:97:0;;22295:2:1;21857:97:0;;;22277:21:1;22334:2;22314:18;;;22307:30;22373:34;22353:18;;;22346:62;-1:-1:-1;;;22424:18:1;;;22417:45;22479:19;;21857:97:0;22093:411:1;21857:97:0;21972:6;;:24;;-1:-1:-1;;;21972:24:0;;;;;26394:25:1;;;-1:-1:-1;;;;;21972:6:0;;;;:15;;26367:18:1;;21972:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21972:24:0;;;;;;;;;;;;:::i;17963:34::-;;;;;;;;;;;;38901:398;38955:7;39004:15;38979:14;;;;:10;:14;;;;;:21;-1:-1:-1;;;38979:21:0;;;;:40;;;;;;;;:::i;:::-;;38975:298;;;39036:16;39073:14;;;:10;:14;;;;;:24;-1:-1:-1;;;39073:24:0;;-1:-1:-1;;;;;39073:24:0;39055:15;:42;:134;;39188:1;39055:134;;;39143:14;;;;:10;:14;;;;;:24;39125:42;;-1:-1:-1;;;39143:24:0;;-1:-1:-1;;;;;39143:24:0;39125:15;:42;:::i;:::-;39240:14;;;;:10;:14;;;;;:20;39036:153;;-1:-1:-1;39211:50:0;;39036:153;;39236:2;;-1:-1:-1;;;;;39240:20:0;39211:14;:50::i;38975:298::-;-1:-1:-1;39290:1:0;;38901:398;-1:-1:-1;38901:398:0:o;20383:95::-;26636:5;;-1:-1:-1;;;;;26636:5:0;26622:10;:19;26614:28;;;;;;20450:10:::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;20450:20:0;;::::1;::::0;;;::::1;::::0;;20383:95::o;21130:145::-;26636:5;;-1:-1:-1;;;;;26636:5:0;26622:10;:19;26614:28;;;;;;21229:38:::1;:17;21249:18:::0;;21229:38:::1;:::i;20167:99::-:0;26636:5;;-1:-1:-1;;;;;26636:5:0;26622:10;:19;26614:28;;;;;;20242:5:::1;:16:::0;;-1:-1:-1;;;;;;20242:16:0::1;-1:-1:-1::0;;;;;20242:16:0;;;::::1;::::0;;;::::1;::::0;;20167:99::o;36454:441::-;36551:6;;-1:-1:-1;;;;;36551:6:0;36537:10;:20;36528:44;;;;-1:-1:-1;;;36528:44:0;;20564:2:1;36528:44:0;;;20546:21:1;20603:2;20583:18;;;20576:30;-1:-1:-1;;;20622:18:1;;;20615:40;20672:18;;36528:44:0;20362:334:1;36528:44:0;36588:13;36583:246;36607:18;;;36583:246;;;36688:16;36655:10;:22;36666:3;;36670:5;36666:10;;;;;;;:::i;:::-;;;;;;;36655:22;;;;;;;;;;;:29;;;;;;;;;;;;:49;;;;;;;;:::i;:::-;;36651:110;;36706:55;36716:3;;36720:5;36716:10;;;;;;;:::i;:::-;;;;;;;36728:6;36736:16;36754:6;36706:9;:55::i;:::-;36776:41;36786:6;36794:10;36806:3;;36810:5;36806:10;;;;;;;:::i;:::-;;;;;;;36776:9;:41::i;:::-;36627:7;;;;:::i;:::-;;;;36583:246;;;-1:-1:-1;36839:48:0;;-1:-1:-1;;;36839:48:0;;36850:10;;36839:35;;:48;;36875:6;;36883:3;;;;36839:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36454:441;;;:::o;46080:305::-;46168:11;;46131:7;;46203:4;46194:13;;46190:27;;;46216:1;46209:8;;;46080:305;:::o;46190:27::-;46241:4;46232:6;:13;46228:33;;;46254:7;46247:14;;;46080:305;:::o;46228:33::-;46285:4;46276:6;:13;46272:34;;;46298:8;46291:15;;;46080:305;:::o;46272:34::-;46330:4;46321:6;:13;46317:34;;;46343:8;46336:15;;;46080:305;:::o;46317:34::-;46369:8;46362:15;;;46080:305;:::o;39785:340::-;39836:9;39855:11;;39869:1;39855:15;;;;:::i;:::-;39882:16;;;;;;;:12;:16;;;;;39901:12;39882:31;;39836:35;;-1:-1:-1;39939:10:0;;:6;:10::i;:::-;39924:25;;39960:18;39969:2;39960:18;;39973:4;39960:8;:18::i;:::-;;39989:13;39995:2;39999;39989:13;;:5;:13::i;:::-;-1:-1:-1;40028:89:0;;;;;;;;-1:-1:-1;;;;;40028:89:0;;;;;-1:-1:-1;;;;;40089:15:0;40028:89;;;;;;;;;40013:12;;;;-1:-1:-1;40013:12:0;;;:8;:12;;;;;;;:104;;;;;;;;;-1:-1:-1;;;40013:104:0;-1:-1:-1;;;;;;40013:104:0;;;;;;;;;;;;;;39785:340::o;9274:329::-;9364:16;;;;:7;:16;;;;;;-1:-1:-1;;;;;9364:24:0;;;:16;;:24;9356:46;;;;-1:-1:-1;;;9356:46:0;;24432:2:1;9356:46:0;;;24414:21:1;24471:1;24451:18;;;24444:29;-1:-1:-1;;;24489:18:1;;;24482:39;24538:18;;9356:46:0;24230:332:1;9356:46:0;-1:-1:-1;;;;;9415:15:0;;;;;;:9;:15;;;;;:17;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;9444:13:0;;;;;;:9;:13;;;;;:15;;;;;;:::i;:::-;;;;-1:-1:-1;;9487:20:0;;;;:11;:20;;;;;;;;9480:27;;-1:-1:-1;;;;;;9480:27:0;;;;;;9528:7;:16;;;;;;:21;;-1:-1:-1;;;;;9528:21:0;;;;;;;;;;;;9565:27;;9499:7;;9528:21;;9565:27;;;;;;9274:329;;;:::o;34049:1285::-;26485:11;;;;:7;:11;;;;;;;;34198:4;;-1:-1:-1;;;;;26485:19:0;;;:11;;:19;;:51;;-1:-1:-1;26508:14:0;;;;:10;:14;;;;;:20;-1:-1:-1;;;;;26508:28:0;;;:20;;:28;26485:51;26477:77;;;;-1:-1:-1;;;26477:77:0;;;;;;;:::i;:::-;34215:20:::1;34238:14:::0;;;:10:::1;:14;::::0;;;;;;;34215:37;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;34215:37:0;::::1;::::0;;-1:-1:-1;;;34215:37:0;::::1;-1:-1:-1::0;;;;;34215:37:0::1;::::0;;::::1;::::0;;;;;34238:14;;34215:37;;;-1:-1:-1;;;34215:37:0;::::1;;;::::0;;::::1;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;-1:-1:-1;34215:37:0;-1:-1:-1;34288:7:0;34271:24:::1;::::0;::::1;;;;;;:::i;:::-;:6;:13;;;:24;;;;;;;;:::i;:::-;;;34263:55;;;::::0;-1:-1:-1;;;34263:55:0;;23742:2:1;34263:55:0::1;::::0;::::1;23724:21:1::0;23781:2;23761:18;;;23754:30;-1:-1:-1;;;23800:18:1;;;23793:48;23858:18;;34263:55:0::1;23540:342:1::0;34263:55:0::1;34428:16;34486:6;:16;;;-1:-1:-1::0;;;;;34468:34:0::1;:15;:34;:105;;34557:6;:16;;;-1:-1:-1::0;;;;;34468:105:0::1;;;;34522:15;34468:105;34428:156:::0;-1:-1:-1;34618:16:0::1;34601:6;:13;;;:33;;;;;;;;:::i;:::-;;34597:349;;;34659:9;::::0;;;:5:::1;:9;::::0;;;;:15;-1:-1:-1;;;34659:15:0;::::1;;;34678:2;34659:21;34651:60;;;::::0;-1:-1:-1;;;34651:60:0;;21250:2:1;34651:60:0::1;::::0;::::1;21232:21:1::0;21289:2;21269:18;;;21262:30;21328:28;21308:18;;;21301:56;21374:18;;34651:60:0::1;21048:350:1::0;34651:60:0::1;34726:39;34736:9;34755:4;34762:2;34726:9;:39::i;:::-;34597:349;;;34820:6;:16;;;-1:-1:-1::0;;;;;34802:34:0::1;:15;:34;34798:50;;;34838:10;34845:2;34838:6;:10::i;:::-;34887:6;:16;;;-1:-1:-1::0;;;;;34875:28:0::1;:9;-1:-1:-1::0;;;;;34875:28:0::1;;:59;;34918:6;:16;;;34875:59;;;34906:9;34875:59;34863:71;;34597:349;34958:14;::::0;34975:7:::1;:27;;;;;;;;:::i;:::-;;:52;;35018:9;34975:52;;;35013:1;34975:52;34958:69:::0;-1:-1:-1;35053:16:0::1;35042:7;:27;;;;;;;;:::i;:::-;;35038:72;;;35071:39;35089:4;35096:9;35107:2;35071:9;:39::i;:::-;35140:112;;;;;;;;35169:6;-1:-1:-1::0;;;;;35140:112:0::1;;;;;35201:9;-1:-1:-1::0;;;;;35140:112:0::1;;;;;35233:7;35140:112;;;;;;;;:::i;:::-;::::0;;35123:14:::1;::::0;;;:10:::1;:14;::::0;;;;;;;;:129;;;;;;::::1;::::0;-1:-1:-1;;;;;35123:129:0::1;-1:-1:-1::0;;;35123:129:0::1;-1:-1:-1::0;;;;;;35123:129:0;;;-1:-1:-1;;;;;35123:129:0;;::::1;::::0;;;;::::1;::::0;;;;;::::1;::::0;:14;;;;-1:-1:-1;;;;;35123:129:0::1;-1:-1:-1::0;;;35123:129:0;;;::::1;;;;;;:::i;:::-;;;;;;;;;35268:58;35279:9;35290:2;35294:15;35317:7;35311:14;;;;;;;;:::i;:::-;35268:58;::::0;;-1:-1:-1;;;;;16399:32:1;;;16381:51;;16463:2;16448:18;;16441:34;;;;16491:18;;;16484:34;16566:4;16554:17;16549:2;16534:18;;16527:45;16368:3;16353:19;35268:58:0::1;;;;;;;34204:1130;;;34049:1285:::0;;;;;;:::o;35938:508::-;25568:10;25527:12;25682:16;;;:4;:16;;;;;;25621;;;25568:10;25682:16;;;:58;;-1:-1:-1;25703:10:0;25717:9;25703:23;:36;;;;-1:-1:-1;25730:9:0;;25703:36;25660:131;;;;-1:-1:-1;;;25660:131:0;;;;;;;:::i;:::-;35997:20:::1;36020:14:::0;;;:10:::1;:14;::::0;;;;;;;35997:37;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;35997:37:0;::::1;::::0;;-1:-1:-1;;;35997:37:0;::::1;-1:-1:-1::0;;;;;35997:37:0::1;::::0;;::::1;::::0;;;;;36020:14;;35997:37;;;-1:-1:-1;;;35997:37:0;::::1;;;::::0;;::::1;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;::::0;::::1;;;36070:6;:16;;;-1:-1:-1::0;;;;;36051:35:0::1;:15;:35;36047:48;;36088:7;;;36047:48;36107:16;36152:6;:16;;;-1:-1:-1::0;;;;;36134:34:0::1;:15;:34;;;;:::i;:::-;36107:62:::0;-1:-1:-1;36203:15:0::1;36186:6;:13;;;:32;;;;;;;;:::i;:::-;;:57;;;;-1:-1:-1::0;36222:9:0::1;::::0;;;:5:::1;:9;::::0;;;;:15;-1:-1:-1;;;36222:15:0;::::1;;;36241:2;36222:21;36186:57;36182:193;;;36258:5;::::0;36287:12;;-1:-1:-1;;;;;36258:5:0;;::::1;::::0;:10:::1;::::0;36318:42:::1;36333:8:::0;36343:2;36287:12;36318:14:::1;:42::i;:::-;36258:117;::::0;-1:-1:-1;;;;;;36258:117:0::1;::::0;;;;;;-1:-1:-1;;;;;16067:32:1;;;36258:117:0::1;::::0;::::1;16049:51:1::0;16116:18;;;16109:34;16022:18;;36258:117:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;36182:193;-1:-1:-1::0;;36388:14:0::1;::::0;;;:10:::1;:14;::::0;;;;:50;;-1:-1:-1;;;;36388:50:0::1;-1:-1:-1::0;;;36422:15:0::1;-1:-1:-1::0;;;;;36388:50:0::1;;;::::0;;25802:1:::1;25931:3:::0;25936:14;25952:12;;25914:51;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;25914:51:0;;;;;;;;;25904:62;;25914:51;25904:62;;;;25889:12;:77;-1:-1:-1;;;35938:508:0:o;33031:562::-;33129:16;;;;:12;:16;;;;;33148:12;33129:31;;33187:7;:5;:7::i;:::-;33171:23;-1:-1:-1;33225:17:0;33211:10;:31;;;;;;;;:::i;:::-;;33207:332;;;33323:11;:18;33283:30;;;;;;;;;;;;-1:-1:-1;;;33283:30:0;;;;;;33294:5;;33310:2;33283:10;:30::i;:::-;33277:65;;;;:::i;:::-;33259:9;;;;:5;:9;;;;;:83;;;;;;;;;-1:-1:-1;;33259:83:0;;;;;;;;;33207:332;;;33378:17;33364:10;:31;;;;;;;;:::i;:::-;;33360:179;;;33412:16;33438:30;33449:5;33438:30;;;;;;;;;;;;;-1:-1:-1;;;33438:30:0;;;33465:2;33438:10;:30::i;:::-;33412:57;;33502:25;33514:9;33525:1;33502:11;:25::i;:::-;33484:9;;;;:5;:9;;;;;:43;;;;;;;;;-1:-1:-1;;33484:43:0;;;;;;;;;-1:-1:-1;33360:179:0;33549:18;:30;33568:10;33549:30;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;33549:30:0;;;:34;;;;;;;;:36;;;;;;:::i;:::-;;;;;;33118:475;33031:562;;:::o;40315:1716::-;40435:7;40479:9;;;:5;:9;;;;;;;;40460:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40460:28:0;;;;;;;-1:-1:-1;;;40460:28:0;;;;;;;;;40435:7;40515;:5;:7::i;:::-;40499:23;-1:-1:-1;40535:19:0;40580:6;40558:18;:8;40569:7;40558:18;:::i;:::-;40557:29;;;;:::i;:::-;40535:51;;40601:4;:10;;;:15;;40615:1;40601:15;40597:1388;;;40644:15;40669:33;40680:5;40669:33;;;;;;;;;;;;;-1:-1:-1;;;40669:33:0;;;40699:2;40669:10;:33::i;:::-;40644:59;-1:-1:-1;16857:22:0;16876:3;16857:16;:22;:::i;:::-;16856:29;;16883:2;16856:29;:::i;:::-;40733:10;;40722:8;:21;;;40718:57;;;40772:3;40752:17;:11;40766:3;40752:17;:::i;:::-;:23;;;;:::i;:::-;40745:30;;;;;;;;40718:57;40810:33;40821:5;40810:33;;;;;;;;;;;;;-1:-1:-1;;;40810:33:0;;;40840:2;40810:10;:33::i;:::-;40792:52;-1:-1:-1;16857:22:0;16876:3;16857:16;:22;:::i;:::-;16856:29;;16883:2;16856:29;:::i;:::-;40874:10;;40863:8;:21;;;40859:56;;;40912:3;40893:16;:11;40907:2;40893:16;:::i;40859:56::-;-1:-1:-1;40937:11:0;-1:-1:-1;40930:18:0;;-1:-1:-1;;40930:18:0;40597:1388;40969:4;:10;;;:15;;40983:1;40969:15;40966:1019;;;41010:15;41035:30;41046:5;41035:30;;;;;;;;;;;;;-1:-1:-1;;;41035:30:0;;;41062:2;41035:10;:30::i;:::-;41010:56;-1:-1:-1;16791:22:0;16810:3;16791:16;:22;:::i;:::-;16790:29;;16817:2;16790:29;:::i;:::-;41096:6;;41085:8;:17;;;41081:45;;;41111:15;:11;41125:1;41111:15;:::i;40966:1019::-;41180:4;:10;;;:15;;41194:1;41180:15;41177:808;;;41220:15;41245:29;41256:5;41245:29;;;;;;;;;;;;;-1:-1:-1;;;41245:29:0;;;41271:2;41245:10;:29::i;:::-;41220:55;-1:-1:-1;16921:22:0;16940:3;16921:16;:22;:::i;:::-;16920:29;;16947:2;16920:29;:::i;:::-;41305:8;;41294;:19;;;41290:52;;;41340:2;41322:15;:11;41336:1;41322:15;:::i;41290:52::-;41364:15;:11;41378:1;41364:15;:::i;41177:808::-;41400:4;:10;;;:15;;41414:1;41400:15;41397:588;;;41469:3;41449:17;:11;41463:3;41449:17;:::i;:::-;:23;;;;:::i;:::-;41442:30;;;;;;;41397:588;41493:4;:10;;;:15;;41507:1;41493:15;41490:495;;;41542:11;-1:-1:-1;41535:18:0;;-1:-1:-1;;41535:18:0;41490:495;41574:4;:10;;;:15;;41588:1;41574:15;41571:414;;;-1:-1:-1;;;;;41632:17:0;;41614:15;41632:17;;;:9;:17;;;;;;;41696:2;41686:12;;:27;;41706:7;41686:27;;;41701:2;41686:27;41680:34;;:2;:34;:::i;:::-;41664:50;-1:-1:-1;41758:2:0;41736:19;41664:50;41736:11;:19;:::i;:::-;:24;;;;:::i;:::-;41729:31;;;;;;;;;41571:414;41781:4;:10;;;:15;;41795:1;41781:15;41778:207;;;41866:2;41852:9;41860:1;41852:5;:9;:::i;:::-;41847:15;;:1;:15;:::i;:::-;41832:31;;:11;:31;:::i;41778:207::-;41889:4;:10;;;:15;;41903:1;41889:15;41886:99;;;41972:1;41958:4;:10;;;41954:1;:14;;;;:::i;:::-;41939:30;;;;:11;:30;:::i;41886:99::-;42012:11;40315:1716;-1:-1:-1;;;;;;40315:1716:0:o;45822:250::-;45875:7;45951:9;45985:16;46000:1;45985:12;:16;:::i;:::-;45920:142;;13680:2:1;13676:15;;;;-1:-1:-1;;;;;;13672:53:1;45920:142:0;;;13660:66:1;45975:27:0;13742:12:1;;;13735:28;46017:15:0;13779:12:1;;;13772:28;13816:12;;;13809:28;;;13853:13;;45920:142:0;;;-1:-1:-1;;45920:142:0;;;;;;;;;45910:153;;45920:142;45910:153;;;;;45822:250;-1:-1:-1;;45822:250:0:o;42333:537::-;42400:13;;:::i;:::-;42430:18;42443:4;42430:12;:18::i;:::-;42459:14;;;;:5;:14;;;;;;;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42459:18:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42459:18:0;;;;;;;;;-1:-1:-1;;42459:18:0;;;;;;;;;;;;;;;;;-1:-1:-1;;42459:18:0;;;;;;;;;-1:-1:-1;;42459:18:0;;;;;;;;;;;-1:-1:-1;;42459:18:0;-1:-1:-1;;;42459:18:0;;;;;-1:-1:-1;;;;42459:18:0;;;;;-1:-1:-1;;;42459:18:0;;;;;;;;;;;;-1:-1:-1;42459:18:0;;42333:537;-1:-1:-1;42333:537:0:o;9611:436::-;9712:1;9684:16;;;:7;:16;;;;;;-1:-1:-1;;;;;9684:16:0;:30;9676:57;;;;-1:-1:-1;;;9676:57:0;;24089:2:1;9676:57:0;;;24071:21:1;24128:2;24108:18;;;24101:30;-1:-1:-1;;;24147:18:1;;;24140:44;24201:18;;9676:57:0;23887:338:1;9676:57:0;9746:11;:13;;;:11;:13;;;:::i;:::-;;;;-1:-1:-1;;;;;;;9903:13:0;;;;;;:9;:13;;;;;;;;:15;;;;;;9950:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9950:21:0;;;;;10005:33;9958:7;;9903:13;;10005:33;;9903:13;;10005:33;9611:436;;:::o;45239:390::-;45279:7;45420:9;45466:16;45481:1;45466:12;:16;:::i;:::-;45552:12;;45377:210;;13680:2:1;13676:15;;;;-1:-1:-1;;;;;;13672:53:1;45377:210:0;;;13660:66:1;45456:27:0;;13742:12:1;;;13735:28;45510:15:0;13779:12:1;;;13772:28;13816:12;;;13809:28;13853:13;;45377:210:0;;;;;;;;;;;;45345:261;;;;;;45319:302;;45299:322;;45239:390;:::o;45023:208::-;45148:7;45204:4;45210:3;45215:5;45193:28;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;45193:28:0;;;;;;;;;45183:39;;45193:28;45183:39;;;;;45023:208;-1:-1:-1;;;;45023:208:0:o;43297:271::-;43371:5;43389:11;43423:8;43432:9;43423:19;;;;;;;;;:::i;:::-;;:26;43403:47;;43409:4;43403:47;:::i;:::-;43389:61;;43477:8;43486:9;43477:19;;;;;;;;;:::i;:::-;;43497:5;43477:26;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;43473:1;43465:9;;;;;;:38;43461:56;;;43512:5;-1:-1:-1;43505:12:0;;43461:56;43535:7;43543:9;43535:18;;;;;;;;;:::i;:::-;;43554:5;43535:25;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;43528:32;;;43297:271;;;;:::o;43794:650::-;43853:13;;:::i;:::-;43892:37;43911:4;43918:6;43911:13;43927:1;43892:11;:37::i;:::-;43883:46;;;;43949:2;43940:11;;;;;43972:37;43998:6;43991:13;;44007:1;43972:11;:37::i;:::-;43962:47;;:7;;;:47;44029:2;44020:11;;;;;44052:37;44078:6;44071:13;;44087:1;44052:11;:37::i;:::-;44042:47;;:7;;;:47;44109:2;44100:11;;;;;44132:37;44158:6;44151:13;;44167:1;44132:11;:37::i;:::-;44122:47;;:7;;;:47;44189:2;44180:11;;;;;44212:37;44238:6;44231:13;;44247:1;44212:11;:37::i;:::-;44202:47;;:7;;;:47;44269:2;44260:11;;;;;44294:37;44320:6;44313:13;;44329:1;44294:11;:37::i;:::-;44282:49;;:9;;;:49;44351:2;44342:11;;;;;44377:37;44403:6;44396:13;;44412:1;44377:11;:37::i;:::-;44364:50;;:10;;;:50;44435:1;44425:7;;;:11;44364:1;43794:650;-1:-1:-1;43794:650:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:366:1;76:8;86:6;140:3;133:4;125:6;121:17;117:27;107:55;;158:1;155;148:12;107:55;-1:-1:-1;181:20:1;;224:18;213:30;;210:50;;;256:1;253;246:12;210:50;293:4;285:6;281:17;269:29;;353:3;346:4;336:6;333:1;329:14;321:6;317:27;313:38;310:47;307:67;;;370:1;367;360:12;307:67;14:366;;;;;:::o;385:159::-;452:20;;512:6;501:18;;491:29;;481:57;;534:1;531;524:12;481:57;385:159;;;:::o;549:156::-;615:20;;675:4;664:16;;654:27;;644:55;;695:1;692;685:12;710:247;769:6;822:2;810:9;801:7;797:23;793:32;790:52;;;838:1;835;828:12;790:52;877:9;864:23;896:31;921:5;896:31;:::i;962:251::-;1032:6;1085:2;1073:9;1064:7;1060:23;1056:32;1053:52;;;1101:1;1098;1091:12;1053:52;1133:9;1127:16;1152:31;1177:5;1152:31;:::i;1218:388::-;1286:6;1294;1347:2;1335:9;1326:7;1322:23;1318:32;1315:52;;;1363:1;1360;1353:12;1315:52;1402:9;1389:23;1421:31;1446:5;1421:31;:::i;:::-;1471:5;-1:-1:-1;1528:2:1;1513:18;;1500:32;1541:33;1500:32;1541:33;:::i;:::-;1593:7;1583:17;;;1218:388;;;;;:::o;1611:671::-;1697:6;1705;1713;1721;1774:3;1762:9;1753:7;1749:23;1745:33;1742:53;;;1791:1;1788;1781:12;1742:53;1830:9;1817:23;1849:31;1874:5;1849:31;:::i;:::-;1899:5;-1:-1:-1;1956:2:1;1941:18;;1928:32;1969:33;1928:32;1969:33;:::i;:::-;2021:7;-1:-1:-1;2080:2:1;2065:18;;2052:32;2093:33;2052:32;2093:33;:::i;:::-;2145:7;-1:-1:-1;2204:2:1;2189:18;;2176:32;2217:33;2176:32;2217:33;:::i;:::-;1611:671;;;;-1:-1:-1;1611:671:1;;-1:-1:-1;;1611:671:1:o;2287:456::-;2364:6;2372;2380;2433:2;2421:9;2412:7;2408:23;2404:32;2401:52;;;2449:1;2446;2439:12;2401:52;2488:9;2475:23;2507:31;2532:5;2507:31;:::i;:::-;2557:5;-1:-1:-1;2614:2:1;2599:18;;2586:32;2627:33;2586:32;2627:33;:::i;:::-;2287:456;;2679:7;;-1:-1:-1;;;2733:2:1;2718:18;;;;2705:32;;2287:456::o;2748:1016::-;2843:6;2851;2859;2867;2920:3;2908:9;2899:7;2895:23;2891:33;2888:53;;;2937:1;2934;2927:12;2888:53;2976:9;2963:23;2995:31;3020:5;2995:31;:::i;:::-;3045:5;-1:-1:-1;3102:2:1;3087:18;;3074:32;3115:33;3074:32;3115:33;:::i;:::-;3167:7;-1:-1:-1;3221:2:1;3206:18;;3193:32;;-1:-1:-1;3276:2:1;3261:18;;3248:32;3303:18;3292:30;;3289:50;;;3335:1;3332;3325:12;3289:50;3358:22;;3411:4;3403:13;;3399:27;-1:-1:-1;3389:55:1;;3440:1;3437;3430:12;3389:55;3476:2;3463:16;3501:48;3517:31;3545:2;3517:31;:::i;:::-;3501:48;:::i;:::-;3572:2;3565:5;3558:17;3612:7;3607:2;3602;3598;3594:11;3590:20;3587:33;3584:53;;;3633:1;3630;3623:12;3584:53;3688:2;3683;3679;3675:11;3670:2;3663:5;3659:14;3646:45;3732:1;3727:2;3722;3715:5;3711:14;3707:23;3700:34;3753:5;3743:15;;;;;2748:1016;;;;;;;:::o;3769:571::-;3864:6;3872;3880;3933:2;3921:9;3912:7;3908:23;3904:32;3901:52;;;3949:1;3946;3939:12;3901:52;3988:9;3975:23;4007:31;4032:5;4007:31;:::i;:::-;4057:5;-1:-1:-1;4113:2:1;4098:18;;4085:32;4140:18;4129:30;;4126:50;;;4172:1;4169;4162:12;4126:50;4211:69;4272:7;4263:6;4252:9;4248:22;4211:69;:::i;:::-;3769:571;;4299:8;;-1:-1:-1;4185:95:1;;-1:-1:-1;;;;3769:571:1:o;4345:382::-;4410:6;4418;4471:2;4459:9;4450:7;4446:23;4442:32;4439:52;;;4487:1;4484;4477:12;4439:52;4526:9;4513:23;4545:31;4570:5;4545:31;:::i;:::-;4595:5;-1:-1:-1;4652:2:1;4637:18;;4624:32;4665:30;4624:32;4665:30;:::i;4732:315::-;4800:6;4808;4861:2;4849:9;4840:7;4836:23;4832:32;4829:52;;;4877:1;4874;4867:12;4829:52;4916:9;4903:23;4935:31;4960:5;4935:31;:::i;:::-;4985:5;5037:2;5022:18;;;;5009:32;;-1:-1:-1;;;4732:315:1:o;5052:570::-;5146:6;5154;5162;5215:2;5203:9;5194:7;5190:23;5186:32;5183:52;;;5231:1;5228;5221:12;5183:52;5271:9;5258:23;5304:18;5296:6;5293:30;5290:50;;;5336:1;5333;5326:12;5290:50;5375:69;5436:7;5427:6;5416:9;5412:22;5375:69;:::i;:::-;5463:8;;-1:-1:-1;5349:95:1;-1:-1:-1;;5548:2:1;5533:18;;5520:32;5561:31;5520:32;5561:31;:::i;:::-;5611:5;5601:15;;;5052:570;;;;;:::o;5627:436::-;5713:6;5721;5774:2;5762:9;5753:7;5749:23;5745:32;5742:52;;;5790:1;5787;5780:12;5742:52;5830:9;5817:23;5863:18;5855:6;5852:30;5849:50;;;5895:1;5892;5885:12;5849:50;5934:69;5995:7;5986:6;5975:9;5971:22;5934:69;:::i;:::-;6022:8;;5908:95;;-1:-1:-1;5627:436:1;-1:-1:-1;;;;5627:436:1:o;6068:588::-;6175:6;6183;6191;6244:2;6232:9;6223:7;6219:23;6215:32;6212:52;;;6260:1;6257;6250:12;6212:52;6300:9;6287:23;6333:18;6325:6;6322:30;6319:50;;;6365:1;6362;6355:12;6319:50;6404:69;6465:7;6456:6;6445:9;6441:22;6404:69;:::i;:::-;6492:8;;-1:-1:-1;6378:95:1;-1:-1:-1;;6577:2:1;6562:18;;6549:32;6590:36;6549:32;6590:36;:::i;6661:241::-;6717:6;6770:2;6758:9;6749:7;6745:23;6741:32;6738:52;;;6786:1;6783;6776:12;6738:52;6825:9;6812:23;6844:28;6866:5;6844:28;:::i;6907:245::-;6974:6;7027:2;7015:9;7006:7;7002:23;6998:32;6995:52;;;7043:1;7040;7033:12;6995:52;7075:9;7069:16;7094:28;7116:5;7094:28;:::i;7157:245::-;7215:6;7268:2;7256:9;7247:7;7243:23;7239:32;7236:52;;;7284:1;7281;7274:12;7236:52;7323:9;7310:23;7342:30;7366:5;7342:30;:::i;7407:249::-;7476:6;7529:2;7517:9;7508:7;7504:23;7500:32;7497:52;;;7545:1;7542;7535:12;7497:52;7577:9;7571:16;7596:30;7620:5;7596:30;:::i;7661:336::-;7745:6;7753;7806:2;7794:9;7785:7;7781:23;7777:32;7774:52;;;7822:1;7819;7812:12;7774:52;7861:9;7848:23;7880:36;7910:5;7880:36;:::i;8002:635::-;8082:6;8135:2;8123:9;8114:7;8110:23;8106:32;8103:52;;;8151:1;8148;8141:12;8103:52;8184:9;8178:16;8217:18;8209:6;8206:30;8203:50;;;8249:1;8246;8239:12;8203:50;8272:22;;8325:4;8317:13;;8313:27;-1:-1:-1;8303:55:1;;8354:1;8351;8344:12;8303:55;8383:2;8377:9;8408:48;8424:31;8452:2;8424:31;:::i;8408:48::-;8479:2;8472:5;8465:17;8519:7;8514:2;8509;8505;8501:11;8497:20;8494:33;8491:53;;;8540:1;8537;8530:12;8491:53;8553:54;8604:2;8599;8592:5;8588:14;8583:2;8579;8575:11;8553:54;:::i;:::-;8626:5;8002:635;-1:-1:-1;;;;;8002:635:1:o;8642:256::-;8708:6;8716;8769:2;8757:9;8748:7;8744:23;8740:32;8737:52;;;8785:1;8782;8775:12;8737:52;8808:28;8826:9;8808:28;:::i;:::-;8798:38;;8855:37;8888:2;8877:9;8873:18;8855:37;:::i;:::-;8845:47;;8642:256;;;;;:::o;8903:180::-;8962:6;9015:2;9003:9;8994:7;8990:23;8986:32;8983:52;;;9031:1;9028;9021:12;8983:52;-1:-1:-1;9054:23:1;;8903:180;-1:-1:-1;8903:180:1:o;9088:184::-;9158:6;9211:2;9199:9;9190:7;9186:23;9182:32;9179:52;;;9227:1;9224;9217:12;9179:52;-1:-1:-1;9250:16:1;;9088:184;-1:-1:-1;9088:184:1:o;9277:315::-;9345:6;9353;9406:2;9394:9;9385:7;9381:23;9377:32;9374:52;;;9422:1;9419;9412:12;9374:52;9458:9;9445:23;9435:33;;9518:2;9507:9;9503:18;9490:32;9531:31;9556:5;9531:31;:::i;9597:332::-;9677:6;9685;9738:2;9726:9;9717:7;9713:23;9709:32;9706:52;;;9754:1;9751;9744:12;9706:52;9790:9;9777:23;9767:33;;9850:2;9839:9;9835:18;9822:32;9863:36;9893:5;9863:36;:::i;10275:252::-;10342:6;10350;10403:2;10391:9;10382:7;10378:23;10374:32;10371:52;;;10419:1;10416;10409:12;10371:52;10455:9;10442:23;10432:33;;10484:37;10517:2;10506:9;10502:18;10484:37;:::i;10532:248::-;10600:6;10608;10661:2;10649:9;10640:7;10636:23;10632:32;10629:52;;;10677:1;10674;10667:12;10629:52;-1:-1:-1;;10700:23:1;;;10770:2;10755:18;;;10742:32;;-1:-1:-1;10532:248:1:o;10785:572::-;10889:6;10897;10905;10913;10966:2;10954:9;10945:7;10941:23;10937:32;10934:52;;;10982:1;10979;10972:12;10934:52;11018:9;11005:23;10995:33;;11075:2;11064:9;11060:18;11047:32;11037:42;;11130:2;11119:9;11115:18;11102:32;11157:18;11149:6;11146:30;11143:50;;;11189:1;11186;11179:12;11143:50;11228:69;11289:7;11280:6;11269:9;11265:22;11228:69;:::i;:::-;10785:572;;;;-1:-1:-1;11316:8:1;-1:-1:-1;;;;10785:572:1:o;11362:250::-;11428:6;11436;11489:2;11477:9;11468:7;11464:23;11460:32;11457:52;;;11505:1;11502;11495:12;11457:52;11541:9;11528:23;11518:33;;11570:36;11602:2;11591:9;11587:18;11570:36;:::i;11617:969::-;11756:6;11764;11772;11780;11788;11796;11804;11812;11820;11828;11836:7;11845;11899:3;11887:9;11878:7;11874:23;11870:33;11867:53;;;11916:1;11913;11906:12;11867:53;11952:9;11939:23;11929:33;;11981:36;12013:2;12002:9;11998:18;11981:36;:::i;:::-;11971:46;;12036:36;12068:2;12057:9;12053:18;12036:36;:::i;:::-;12026:46;;12091:36;12123:2;12112:9;12108:18;12091:36;:::i;:::-;12081:46;;12146:37;12178:3;12167:9;12163:19;12146:37;:::i;:::-;12136:47;;12202:37;12234:3;12223:9;12219:19;12202:37;:::i;:::-;12192:47;;12258:37;12290:3;12279:9;12275:19;12258:37;:::i;:::-;12248:47;;12314:37;12346:3;12335:9;12331:19;12314:37;:::i;:::-;12304:47;;12370:38;12403:3;12392:9;12388:19;12370:38;:::i;:::-;12360:48;;12427:38;12460:3;12449:9;12445:19;12427:38;:::i;:::-;12417:48;;12485:38;12518:3;12507:9;12503:19;12485:38;:::i;:::-;12474:49;;12543:37;12575:3;12564:9;12560:19;12543:37;:::i;:::-;12532:48;;11617:969;;;;;;;;;;;;;;:::o;12591:257::-;12632:3;12670:5;12664:12;12697:6;12692:3;12685:19;12713:63;12769:6;12762:4;12757:3;12753:14;12746:4;12739:5;12735:16;12713:63;:::i;:::-;12830:2;12809:15;-1:-1:-1;;12805:29:1;12796:39;;;;12837:4;12792:50;;12591:257;-1:-1:-1;;12591:257:1:o;13028:414::-;-1:-1:-1;;;;;;13299:2:1;13295:15;;;13291:24;;13279:37;;13350:15;;;;13346:24;;;13341:2;13332:12;;13325:46;13396:2;13387:12;;13380:28;13433:2;13424:12;;13028:414::o;14307:274::-;14436:3;14474:6;14468:13;14490:53;14536:6;14531:3;14524:4;14516:6;14512:17;14490:53;:::i;:::-;14559:16;;;;;14307:274;-1:-1:-1;;14307:274:1:o;14794:488::-;-1:-1:-1;;;;;15063:15:1;;;15045:34;;15115:15;;15110:2;15095:18;;15088:43;15162:2;15147:18;;15140:34;;;15210:3;15205:2;15190:18;;15183:31;;;14988:4;;15231:45;;15256:19;;15248:6;15231:45;:::i;15287:583::-;-1:-1:-1;;;;;15504:32:1;;15486:51;;15573:2;15568;15553:18;;15546:30;;;15592:18;;15585:34;;;-1:-1:-1;;;;;;15631:31:1;;15628:51;;;15675:1;15672;15665:12;15628:51;15709:6;15706:1;15702:14;15766:6;15758;15753:2;15742:9;15738:18;15725:48;15843:1;15796:22;;15820:2;15792:31;15832:13;;;-1:-1:-1;15792:31:1;15287:583;-1:-1:-1;;;15287:583:1:o;16891:537::-;-1:-1:-1;;;;;17119:32:1;;17101:51;;-1:-1:-1;;;;;17188:37:1;;17183:2;17168:18;;17161:65;17089:2;17074:18;;17256:1;17245:13;;17235:144;;17301:10;17296:3;17292:20;17289:1;17282:31;17336:4;17333:1;17326:15;17364:4;17361:1;17354:15;17235:144;17415:6;17410:2;17399:9;17395:18;17388:34;16891:537;;;;;;:::o;18069:219::-;18218:2;18207:9;18200:21;18181:4;18238:44;18278:2;18267:9;18263:18;18255:6;18238:44;:::i;18639:337::-;18841:2;18823:21;;;18880:2;18860:18;;;18853:30;-1:-1:-1;;;18914:2:1;18899:18;;18892:43;18967:2;18952:18;;18639:337::o;20010:347::-;20212:2;20194:21;;;20251:2;20231:18;;;20224:30;20290:25;20285:2;20270:18;;20263:53;20348:2;20333:18;;20010:347::o;21746:342::-;21948:2;21930:21;;;21987:2;21967:18;;;21960:30;-1:-1:-1;;;22021:2:1;22006:18;;21999:48;22079:2;22064:18;;21746:342::o;24567:1483::-;24777:13;;13015:4;13004:16;12992:29;;24747:3;24732:19;;24849:4;24841:6;24837:17;24831:24;24864:52;24910:4;24899:9;24895:20;24881:12;13015:4;13004:16;12992:29;;12948:75;24864:52;;24965:4;24957:6;24953:17;24947:24;24980:54;25028:4;25017:9;25013:20;24997:14;13015:4;13004:16;12992:29;;12948:75;24980:54;;25083:4;25075:6;25071:17;25065:24;25098:54;25146:4;25135:9;25131:20;25115:14;13015:4;13004:16;12992:29;;12948:75;25098:54;;25201:4;25193:6;25189:17;25183:24;25216:54;25264:4;25253:9;25249:20;25233:14;13015:4;13004:16;12992:29;;12948:75;25216:54;;25319:4;25311:6;25307:17;25301:24;25334:54;25382:4;25371:9;25367:20;25351:14;13015:4;13004:16;12992:29;;12948:75;25334:54;;25437:4;25429:6;25425:17;25419:24;25452:54;25500:4;25489:9;25485:20;25469:14;13015:4;13004:16;12992:29;;12948:75;25452:54;;25555:4;25547:6;25543:17;25537:24;25570:55;25619:4;25608:9;25604:20;25588:14;12929:6;12918:18;12906:31;;12853:90;25570:55;-1:-1:-1;25644:6:1;25687:15;;;25681:22;12929:6;12918:18;;;25746;;;12906:31;;;;25784:6;25827:15;;;25821:22;12918:18;;;25886;;;12906:31;25924:6;25967:15;;;25961:22;13015:4;13004:16;26025:18;;;;12992:29;;;;24567:1483;:::o;26430:361::-;26635:6;26624:9;26617:25;26678:2;26673;26662:9;26658:18;26651:30;26598:4;26698:44;26738:2;26727:9;26723:18;26715:6;26698:44;:::i;:::-;26690:52;;26778:6;26773:2;26762:9;26758:18;26751:34;26430:361;;;;;;:::o;26985:275::-;27056:2;27050:9;27121:2;27102:13;;-1:-1:-1;;27098:27:1;27086:40;;27156:18;27141:34;;27177:22;;;27138:62;27135:88;;;27203:18;;:::i;:::-;27239:2;27232:22;26985:275;;-1:-1:-1;26985:275:1:o;27265:186::-;27313:4;27346:18;27338:6;27335:30;27332:56;;;27368:18;;:::i;:::-;-1:-1:-1;27434:2:1;27413:15;-1:-1:-1;;27409:29:1;27440:4;27405:40;;27265:186::o;27456:224::-;27495:3;27523:6;27556:2;27553:1;27549:10;27586:2;27583:1;27579:10;27617:3;27613:2;27609:12;27604:3;27601:21;27598:47;;;27625:18;;:::i;:::-;27661:13;;27456:224;-1:-1:-1;;;;27456:224:1:o;27685:128::-;27725:3;27756:1;27752:6;27749:1;27746:13;27743:39;;;27762:18;;:::i;:::-;-1:-1:-1;27798:9:1;;27685:128::o;27818:187::-;27857:1;27883:6;27916:2;27913:1;27909:10;27938:3;27928:37;;27945:18;;:::i;:::-;27983:10;;27979:20;;;;;27818:187;-1:-1:-1;;27818:187:1:o;28010:120::-;28050:1;28076;28066:35;;28081:18;;:::i;:::-;-1:-1:-1;28115:9:1;;28010:120::o;28135:258::-;28174:7;28206:6;28239:2;28236:1;28232:10;28269:2;28266:1;28262:10;28325:3;28321:2;28317:12;28312:3;28309:21;28302:3;28295:11;28288:19;28284:47;28281:73;;;28334:18;;:::i;:::-;28374:13;;28135:258;-1:-1:-1;;;;28135:258:1:o;28398:168::-;28438:7;28504:1;28500;28496:6;28492:14;28489:1;28486:21;28481:1;28474:9;28467:17;28463:45;28460:71;;;28511:18;;:::i;:::-;-1:-1:-1;28551:9:1;;28398:168::o;28571:125::-;28611:4;28639:1;28636;28633:8;28630:34;;;28644:18;;:::i;:::-;-1:-1:-1;28681:9:1;;28571:125::o;28701:258::-;28773:1;28783:113;28797:6;28794:1;28791:13;28783:113;;;28873:11;;;28867:18;28854:11;;;28847:39;28819:2;28812:10;28783:113;;;28914:6;28911:1;28908:13;28905:48;;;-1:-1:-1;;28949:1:1;28931:16;;28924:27;28701:258::o;28964:136::-;29003:3;29031:5;29021:39;;29040:18;;:::i;:::-;-1:-1:-1;;;29076:18:1;;28964:136::o;29105:197::-;29143:3;29171:6;29212:2;29205:5;29201:14;29239:2;29230:7;29227:15;29224:41;;;29245:18;;:::i;:::-;29294:1;29281:15;;29105:197;-1:-1:-1;;;29105:197:1:o;29307:135::-;29346:3;-1:-1:-1;;29367:17:1;;29364:43;;;29387:18;;:::i;:::-;-1:-1:-1;29434:1:1;29423:13;;29307:135::o;29447:112::-;29479:1;29505;29495:35;;29510:18;;:::i;:::-;-1:-1:-1;29544:9:1;;29447:112::o;29564:157::-;29594:1;29628:4;29625:1;29621:12;29652:3;29642:37;;29659:18;;:::i;:::-;29711:3;29704:4;29701:1;29697:12;29693:22;29688:27;;;29564:157;;;;:::o;29726:127::-;29787:10;29782:3;29778:20;29775:1;29768:31;29818:4;29815:1;29808:15;29842:4;29839:1;29832:15;29858:127;29919:10;29914:3;29910:20;29907:1;29900:31;29950:4;29947:1;29940:15;29974:4;29971:1;29964:15;29990:127;30051:10;30046:3;30042:20;30039:1;30032:31;30082:4;30079:1;30072:15;30106:4;30103:1;30096:15;30122:127;30183:10;30178:3;30174:20;30171:1;30164:31;30214:4;30211:1;30204:15;30238:4;30235:1;30228:15;30254:127;30315:10;30310:3;30306:20;30303:1;30296:31;30346:4;30343:1;30336:15;30370:4;30367:1;30360:15;30386:131;-1:-1:-1;;;;;30461:31:1;;30451:42;;30441:70;;30507:1;30504;30497:12;30522:118;30608:5;30601:13;30594:21;30587:5;30584:32;30574:60;;30630:1;30627;30620:12;30645:131;-1:-1:-1;;;;;;30719:32:1;;30709:43;;30699:71;;30766:1;30763;30756:12;30781:106;30861:1;30854:5;30851:12;30841:40;;30877:1;30874;30867:12

Swarm Source

ipfs://161fd5ed520acdcbab9955034cd43b5bc93e0d7fadb24d770e0129aed9df08f7

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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