ETH Price: $3,103.12 (-0.78%)
Gas: 4 Gwei

Contract

0x68132EB4BfD84b2D6A23ec4fB1B106F5C8574F2D
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Withdraw92496722020-01-10 0:04:201591 days ago1578614660IN
CW: Inaugural Gate Keeper
0 ETH0.000605620
Revive89596152019-11-19 1:00:541643 days ago1574125254IN
CW: Inaugural Gate Keeper
0.09076977 ETH0.000034091
Conjure Wizard89272182019-11-13 15:38:351648 days ago1573659515IN
CW: Inaugural Gate Keeper
0.07 ETH0.000124731.5
Conjure Wizard89272182019-11-13 15:38:351648 days ago1573659515IN
CW: Inaugural Gate Keeper
0.07 ETH0.000124731.5
Conjure Wizard89272182019-11-13 15:38:351648 days ago1573659515IN
CW: Inaugural Gate Keeper
0.07 ETH0.000124731.5
Conjure Wizard89272182019-11-13 15:38:351648 days ago1573659515IN
CW: Inaugural Gate Keeper
0.07 ETH0.000124731.5
Conjure Wizard89272182019-11-13 15:38:351648 days ago1573659515IN
CW: Inaugural Gate Keeper
0.07 ETH0.000124731.5
Conjure Wizard89272182019-11-13 15:38:351648 days ago1573659515IN
CW: Inaugural Gate Keeper
0.07 ETH0.000124731.5
Conjure Wizard89272182019-11-13 15:38:351648 days ago1573659515IN
CW: Inaugural Gate Keeper
0.07 ETH0.000124731.5
Revive89254422019-11-13 8:34:321649 days ago1573634072IN
CW: Inaugural Gate Keeper
0.215 ETH0.000215175
Revive89254392019-11-13 8:34:141649 days ago1573634054IN
CW: Inaugural Gate Keeper
0.073 ETH0.00012913
Revive89254392019-11-13 8:34:141649 days ago1573634054IN
CW: Inaugural Gate Keeper
0.072 ETH0.00012913
Revive89254392019-11-13 8:34:141649 days ago1573634054IN
CW: Inaugural Gate Keeper
0.061 ETH0.00012913
Revive89254332019-11-13 8:32:541649 days ago1573633974IN
CW: Inaugural Gate Keeper
0.05 ETH0.000086072
Revive89254302019-11-13 8:32:201649 days ago1573633940IN
CW: Inaugural Gate Keeper
0.045 ETH0.000047331.1
Revive89254282019-11-13 8:31:491649 days ago1573633909IN
CW: Inaugural Gate Keeper
0.043 ETH0.000047331.1
Conjure Wizard89254122019-11-13 8:28:041649 days ago1573633684IN
CW: Inaugural Gate Keeper
0.07 ETH0.00017841.5
Conjure Wizard89254112019-11-13 8:28:011649 days ago1573633681IN
CW: Inaugural Gate Keeper
0.07 ETH0.00017841.5
Conjure Wizard89254112019-11-13 8:28:011649 days ago1573633681IN
CW: Inaugural Gate Keeper
0.07 ETH0.00020091.5
Revive89253682019-11-13 8:20:231649 days ago1573633223IN
CW: Inaugural Gate Keeper
0.043 ETH0.00012913
Revive89253292019-11-13 8:11:141649 days ago1573632674IN
CW: Inaugural Gate Keeper
0.043 ETH0.000142013.3
Conjure Wizard89252512019-11-13 7:50:461649 days ago1573631446IN
CW: Inaugural Gate Keeper
0.07 ETH0.0013393910
Conjure Wizard89251472019-11-13 7:22:241649 days ago1573629744IN
CW: Inaugural Gate Keeper
0.07 ETH0.000594695
Conjure Wizard89247222019-11-13 5:39:121649 days ago1573623552IN
CW: Inaugural Gate Keeper
0.07 ETH0.000401813
Conjure Wizard89244872019-11-13 4:46:261649 days ago1573620386IN
CW: Inaugural Gate Keeper
0.07 ETH0.000160721.2
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
92496722020-01-10 0:04:201591 days ago1578614660
CW: Inaugural Gate Keeper
687.20911238 ETH
89596152019-11-19 1:00:541643 days ago1574125254
CW: Inaugural Gate Keeper
0.04538488 ETH
89272182019-11-13 15:38:351648 days ago1573659515
CW: Inaugural Gate Keeper
0.035 ETH
89272182019-11-13 15:38:351648 days ago1573659515
CW: Inaugural Gate Keeper
0.035 ETH
89272182019-11-13 15:38:351648 days ago1573659515
CW: Inaugural Gate Keeper
0.035 ETH
89272182019-11-13 15:38:351648 days ago1573659515
CW: Inaugural Gate Keeper
0.035 ETH
89272182019-11-13 15:38:351648 days ago1573659515
CW: Inaugural Gate Keeper
0.035 ETH
89272182019-11-13 15:38:351648 days ago1573659515
CW: Inaugural Gate Keeper
0.035 ETH
89272182019-11-13 15:38:351648 days ago1573659515
CW: Inaugural Gate Keeper
0.035 ETH
89263362019-11-13 12:11:351648 days ago1573647095
CW: Inaugural Gate Keeper
0.035 ETH
89263362019-11-13 12:11:351648 days ago1573647095
CW: Inaugural Gate Keeper
0.07 ETH
89254422019-11-13 8:34:321649 days ago1573634072
CW: Inaugural Gate Keeper
0.1075 ETH
89254392019-11-13 8:34:141649 days ago1573634054
CW: Inaugural Gate Keeper
0.0365 ETH
89254392019-11-13 8:34:141649 days ago1573634054
CW: Inaugural Gate Keeper
0.036 ETH
89254392019-11-13 8:34:141649 days ago1573634054
CW: Inaugural Gate Keeper
0.0305 ETH
89254332019-11-13 8:32:541649 days ago1573633974
CW: Inaugural Gate Keeper
0.025 ETH
89254302019-11-13 8:32:201649 days ago1573633940
CW: Inaugural Gate Keeper
0.0225 ETH
89254282019-11-13 8:31:491649 days ago1573633909
CW: Inaugural Gate Keeper
0.0215 ETH
89254122019-11-13 8:28:041649 days ago1573633684
CW: Inaugural Gate Keeper
0.035 ETH
89254112019-11-13 8:28:011649 days ago1573633681
CW: Inaugural Gate Keeper
0.035 ETH
89254112019-11-13 8:28:011649 days ago1573633681
CW: Inaugural Gate Keeper
0.035 ETH
89253682019-11-13 8:20:231649 days ago1573633223
CW: Inaugural Gate Keeper
0.0215 ETH
89253292019-11-13 8:11:141649 days ago1573632674
CW: Inaugural Gate Keeper
0.0215 ETH
89252512019-11-13 7:50:461649 days ago1573631446
CW: Inaugural Gate Keeper
0.035 ETH
89252282019-11-13 7:42:581649 days ago1573630978
CW: Inaugural Gate Keeper
0.035 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
InauguralGateKeeper

Compiler Version
v0.5.8+commit.23d335f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-10-17
*/

pragma solidity >=0.5.6 <0.6.0;

/// @title Shared constants used throughout the Cheeze Wizards contracts
contract WizardConstants {
    // Wizards normally have their affinity set when they are first created,
    // but for example Exclusive Wizards can be created with no set affinity.
    // In this case the affinity can be set by the owner.
    uint8 internal constant ELEMENT_NOTSET = 0; //000
    // A neutral Wizard has no particular strength or weakness with specific
    // elements.
    uint8 internal constant ELEMENT_NEUTRAL = 1; //001
    // The fire, water and wind elements are used both to reflect an affinity
    // of Elemental Wizards for a specific element, and as the moves a
    // Wizard can make during a duel.
    // Note that if these values change then `moveMask` and `moveDelta` in
    // ThreeAffinityDuelResolver would need to be updated accordingly.
    uint8 internal constant ELEMENT_FIRE = 2; //010
    uint8 internal constant ELEMENT_WATER = 3; //011
    uint8 internal constant ELEMENT_WIND = 4; //100
    uint8 internal constant MAX_ELEMENT = ELEMENT_WIND;
}








/**
 * @title IERC165
 * @dev https://eips.ethereum.org/EIPS/eip-165
 */
interface IERC165 {
    /**
     * @notice Query if a contract implements an interface
     * @param interfaceId The interface identifier, as specified in ERC-165
     * @dev Interface identification is specified in ERC-165. This function
     * uses less than 30,000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) public view returns (uint256 balance);
    function ownerOf(uint256 tokenId) public view returns (address owner);

    function approve(address to, uint256 tokenId) public;
    function getApproved(uint256 tokenId) public view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) public;
    function isApprovedForAll(address owner, address operator) public view returns (bool);

    function transferFrom(address from, address to, uint256 tokenId) public;
    function safeTransferFrom(address from, address to, uint256 tokenId) public;

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public;
}


contract WizardGuildInterfaceId {
    bytes4 internal constant _INTERFACE_ID_WIZARDGUILD = 0x41d4d437;
}

/// @title The public interface of the Wizard Guild
/// @notice The methods listed in this interface (including the inherited ERC-721 interface),
///         make up the public interface of the Wizard Guild contract. Any contracts that wish
///         to make use of Cheeze Wizard NFTs (such as Cheeze Wizards Tournaments!) should use
///         these methods to ensure they are working correctly with the base NFTs.
contract WizardGuildInterface is IERC721, WizardGuildInterfaceId {

    /// @notice Returns the information associated with the given Wizard
    ///         owner - The address that owns this Wizard
    ///         innatePower - The innate power level of this Wizard, set when minted and entirely
    ///               immutable
    ///         affinity - The Elemental Affinity of this Wizard. For most Wizards, this is set
    ///               when they are minted, but some exclusive Wizards are minted with an affinity
    ///               of 0 (ELEMENT_NOTSET). A Wizard with an NOTSET affinity should NOT be able
    ///               to participate in Tournaments. Once the affinity of a Wizard is set to a non-zero
    ///               value, it can never be changed again.
    ///         metadata - A 256-bit hash of the Wizard's metadata, which is stored off chain. This
    ///               contract doesn't specify format of this hash, nor the off-chain storage mechanism
    ///               but, let's be honest, it's probably an IPFS SHA-256 hash.
    ///
    ///         NOTE: Series zero Wizards have one of four Affinities:  Neutral (1), Fire (2), Water (3)
    ///               or Air (4, sometimes called "Wind" in the code). Future Wizard Series may have
    ///               additional Affinities, and clients of this API should be prepared for that
    ///               eventuality.
    function getWizard(uint256 id) external view returns (address owner, uint88 innatePower, uint8 affinity, bytes32 metadata);

    /// @notice Sets the affinity for a Wizard that doesn't already have its elemental affinity chosen.
    ///         Only usable for Exclusive Wizards (all non-Exclusives must have their affinity chosen when
    ///         conjured.) Even Exclusives can't change their affinity once it's been chosen.
    ///
    ///         NOTE: This function can only be called by the series minter, and (therefore) only while the
    ///         series is open. A Wizard that has no affinity when a series is closed will NEVER have an Affinity.
    ///         BTW- This implies that a minter is responsible for either never minting ELEMENT_NOTSET
    ///         Wizards, or having some public mechanism for a Wizard owner to set the Affinity after minting.
    /// @param wizardId The id of the wizard
    /// @param newAffinity The new affinity of the wizard
    function setAffinity(uint256 wizardId, uint8 newAffinity) external;

    /// @notice A function to be called that conjures a whole bunch of Wizards at once! You know how
    ///         there's "a pride of lions", "a murder of crows", and "a parliament of owls"? Well, with this
    ///         here function you can conjure yourself "a stench of Cheeze Wizards"!
    ///
    ///         Unsurprisingly, this method can only be called by the registered minter for a Series.
    /// @param powers the power level of each wizard
    /// @param affinities the Elements of the wizards to create
    /// @param owner the address that will own the newly created Wizards
    function mintWizards(
        uint88[] calldata powers,
        uint8[] calldata affinities,
        address owner
        ) external returns (uint256[] memory wizardIds);

    /// @notice A function to be called that conjures a series of Wizards in the reserved ID range.
    /// @param wizardIds the ID values to use for each Wizard, must be in the reserved range of the current Series
    /// @param affinities the Elements of the wizards to create
    /// @param powers the power level of each wizard
    /// @param owner the address that will own the newly created Wizards
    function mintReservedWizards(
        uint256[] calldata wizardIds,
        uint88[] calldata powers,
        uint8[] calldata affinities,
        address owner
        ) external;

    /// @notice Sets the metadata values for a list of Wizards. The metadata for a Wizard can only be set once,
    ///         can only be set by the COO or Minter, and can only be set while the Series is still open. Once
    ///         a Series is closed, the metadata is locked forever!
    /// @param wizardIds the ID values of the Wizards to apply metadata changes to.
    /// @param metadata the raw metadata values for each Wizard. This contract does not define how metadata
    ///         should be interpreted, but it is likely to be a 256-bit hash of a complete metadata package
    ///         accessible via IPFS or similar.
    function setMetadata(uint256[] calldata wizardIds, bytes32[] calldata metadata) external;

    /// @notice Returns true if the given "spender" address is allowed to manipulate the given token
    ///         (either because it is the owner of that token, has been given approval to manage that token)
    function isApprovedOrOwner(address spender, uint256 tokenId) external view returns (bool);

    /// @notice Verifies that a given signature represents authority to control the given Wizard ID,
    ///         reverting otherwise. It handles three cases:
    ///             - The simplest case: The signature was signed with the private key associated with
    ///               an external address that is the owner of this Wizard.
    ///             - The signature was generated with the private key associated with an external address
    ///               that is "approved" for working with this Wizard ID. (See the Wizard Guild and/or
    ///               the ERC-721 spec for more information on "approval".)
    ///             - The owner or approval address (as in cases one or two) is a smart contract
    ///               that conforms to ERC-1654, and accepts the given signature as being valid
    ///               using its own internal logic.
    ///
    ///        NOTE: This function DOES NOT accept a signature created by an address that was given "operator
    ///               status" (as granted by ERC-721's setApprovalForAll() functionality). Doing so is
    ///               considered an extreme edge case that can be worked around where necessary.
    /// @param wizardId The Wizard ID whose control is in question
    /// @param hash The message hash we are authenticating against
    /// @param sig the signature data; can be longer than 65 bytes for ERC-1654
    function verifySignature(uint256 wizardId, bytes32 hash, bytes calldata sig) external view;

    /// @notice Convenience function that verifies signatures for two wizards using equivalent logic to
    ///         verifySignature(). Included to save on cross-contract calls in the common case where we
    ///         are verifying the signatures of two Wizards who wish to enter into a Duel.
    /// @param wizardId1 The first Wizard ID whose control is in question
    /// @param wizardId2 The second Wizard ID whose control is in question
    /// @param hash1 The message hash we are authenticating against for the first Wizard
    /// @param hash2 The message hash we are authenticating against for the first Wizard
    /// @param sig1 the signature data corresponding to the first Wizard; can be longer than 65 bytes for ERC-1654
    /// @param sig2 the signature data corresponding to the second Wizard; can be longer than 65 bytes for ERC-1654
    function verifySignatures(
        uint256 wizardId1,
        uint256 wizardId2,
        bytes32 hash1,
        bytes32 hash2,
        bytes calldata sig1,
        bytes calldata sig2) external view;
}






/// @title ERC165Interface
/// @dev https://eips.ethereum.org/EIPS/eip-165
interface ERC165Interface {
    /// @notice Query if a contract implements an interface
    /// @param interfaceId The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///      uses less than 30,000 gas.
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


// This is kind of a hacky way to expose this constant, but it's the best that Solidity offers!
contract TournamentInterfaceId {
    bytes4 internal constant _INTERFACE_ID_TOURNAMENT = 0xbd059098;
}

/// @title Tournament interface, known to GateKeeper
contract TournamentInterface is TournamentInterfaceId, ERC165Interface {

    // function enter(uint256 tokenId, uint96 power, uint8 affinity) external payable;
    function revive(uint256 wizardId) external payable;

    function enterWizards(uint256[] calldata wizardIds, uint88[] calldata powers) external payable;

    // Returns true if the Tournament is currently running and active.
    function isActive() external view returns (bool);

    function powerScale() external view returns (uint256);

    function destroy() external;
}



/// @title Contract that manages addresses and access modifiers for certain operations.
/// @author Dapper Labs Inc. (https://www.dapperlabs.com)
contract AccessControl {

    /// @dev The address of the master administrator account that has the power to
    ///      update itself and all of the other administrator addresses.
    ///      The CEO account is not expected to be used regularly, and is intended to
    ///      be stored offline (i.e. a hardware device kept in a safe).
    address public ceoAddress;

    /// @dev The address of the "day-to-day" operator of various privileged
    ///      functions inside the smart contract. Although the CEO has the power
    ///      to replace the COO, the CEO address doesn't actually have the power
    ///      to do "COO-only" operations. This is to discourage the regular use
    ///      of the CEO account.
    address public cooAddress;

    /// @dev The address that is allowed to move money around. Kept separate from
    ///      the COO because the COO address typically lives on an internet-connected
    ///      computer.
    address payable public cfoAddress;

    // Events to indicate when access control role addresses are updated.
    event CEOTransferred(address previousCeo, address newCeo);
    event COOTransferred(address previousCoo, address newCoo);
    event CFOTransferred(address previousCfo, address newCfo);

    /// @dev The AccessControl constructor sets the `ceoAddress` to the sender account. Also
    ///      initializes the COO and CFO to the passed values (CFO is optional and can be address(0)).
    /// @param newCooAddress The initial COO address to set
    /// @param newCfoAddress The initial CFO to set (optional)
    constructor(address newCooAddress, address payable newCfoAddress) public {
        _setCeo(msg.sender);
        setCoo(newCooAddress);

        if (newCfoAddress != address(0)) {
            setCfo(newCfoAddress);
        }
    }

    /// @notice Access modifier for CEO-only functionality
    modifier onlyCEO() {
        require(msg.sender == ceoAddress, "Only CEO");
        _;
    }

    /// @notice Access modifier for COO-only functionality
    modifier onlyCOO() {
        require(msg.sender == cooAddress, "Only COO");
        _;
    }

    /// @notice Access modifier for CFO-only functionality
    modifier onlyCFO() {
        require(msg.sender == cfoAddress, "Only CFO");
        _;
    }

    function checkControlAddress(address newController) internal view {
        require(newController != address(0) && newController != ceoAddress, "Invalid CEO address");
    }

    /// @notice Assigns a new address to act as the CEO. Only available to the current CEO.
    /// @param newCeo The address of the new CEO
    function setCeo(address newCeo) external onlyCEO {
        checkControlAddress(newCeo);
        _setCeo(newCeo);
    }

    /// @dev An internal utility function that updates the CEO variable and emits the
    ///      transfer event. Used from both the public setCeo function and the constructor.
    function _setCeo(address newCeo) private {
        emit CEOTransferred(ceoAddress, newCeo);
        ceoAddress = newCeo;
    }

    /// @notice Assigns a new address to act as the COO. Only available to the current CEO.
    /// @param newCoo The address of the new COO
    function setCoo(address newCoo) public onlyCEO {
        checkControlAddress(newCoo);
        emit COOTransferred(cooAddress, newCoo);
        cooAddress = newCoo;
    }

    /// @notice Assigns a new address to act as the CFO. Only available to the current CEO.
    /// @param newCfo The address of the new CFO
    function setCfo(address payable newCfo) public onlyCEO {
        checkControlAddress(newCfo);
        emit CFOTransferred(cfoAddress, newCfo);
        cfoAddress = newCfo;
    }
}




/// @title WizardPresaleInterface
/// @notice This interface represents the single method that the final tournament and master Wizard contracts
///         will use to import the presale wizards when those contracts have been finalized a released on
///         mainnet. Once all presale Wizards have been absorbed, this temporary pre-sale contract can be
///         destroyed.
contract WizardPresaleInterface {

    // See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md on how
    // to calculate this
    bytes4 public constant _INTERFACE_ID_WIZARDPRESALE = 0x4df71efb;

    /// @notice This function is used to bring a presale Wizard into the final contracts. It can
    ///         ONLY be called by the official gatekeeper contract (as set by the Owner of the presale
    ///         contract). It does a number of things:
    ///            1. Check that the presale Wizard exists, and has not already been absorbed
    ///            2. Transfer the Eth used to create the presale Wizard to the caller
    ///            3. Mark the Wizard as having been absorbed, reclaiming the storage used by the presale info
    ///            4. Return the Wizard information (its owner, minting price, and elemental alignment)
    /// @param id the id of the presale Wizard to be absorbed
    function absorbWizard(uint256 id) external returns (address owner, uint256 power, uint8 affinity);

    /// @notice A convenience function that allows multiple Wizards to be moved to the final contracts
    ///         simultaneously, works the same as the previous function, but in a batch.
    /// @param ids An array of ids indicating which presale Wizards are to be absorbed
    function absorbWizardMulti(uint256[] calldata ids) external
        returns (address[] memory owners, uint256[] memory powers, uint8[] memory affinities);

    function powerToCost(uint256 power) public pure returns (uint256 cost);
    function costToPower(uint256 cost) public pure returns (uint256 power);
}




/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract IERC721Receiver {
    /**
     * @notice Handle the receipt of an NFT
     * @dev The ERC721 smart contract calls this function on the recipient
     * after a `safeTransfer`. This function MUST return the function selector,
     * otherwise the caller will revert the transaction. The selector to be
     * returned can be obtained as `this.onERC721Received.selector`. This
     * function MAY throw to revert and reject the transfer.
     * Note: the ERC721 contract address is always the message sender.
     * @param operator The address which called `safeTransferFrom` function
     * @param from The address which previously owned the token
     * @param tokenId The NFT identifier which is being transferred
     * @param data Additional data with no specified format
     * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data)
    public returns (bytes4);
}



/// Utility library of inline functions on address payables.
/// Modified from original by OpenZeppelin.
contract Address {
    /// @notice Returns whether the target address is a contract.
    /// @dev This function will return false if invoked during the constructor of a contract,
    /// as the code is not actually created until after the constructor finishes.
    /// @param account address of the account to check
    /// @return whether the target address is a contract
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        // XXX Currently there is no better way to check if there is a contract in an address
        // than to check the size of the code at that address.
        // See https://ethereum.stackexchange.com/a/14016/36603
        // for more details about how this works.
        // TODO Check this again before the Serenity release, because all addresses will be
        // contracts then.
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) } // solium-disable-line security/no-inline-assembly
        return size > 0;
    }
}


/// @title The Inaugural Cheeze Wizards Gate Keeper contract
/// @notice The GateKeeper is responsible for determining which Wizards are allowed to enter into
///         a Tournament. This particular GateKeeper is designed to manage the first, official
///         Cheeze Wizards Tournament! It's much more complicated than a typical GateKeeper
///         implementation because it needs to juggle two additional issues that most GateKeepers
///         don't need to deal with: Importing Wizards from the Presale contract and minting tokens
///         to represent newly conjured Wizards.
contract InauguralGateKeeper is AccessControl, WizardConstants, Address, WizardGuildInterfaceId, TournamentInterfaceId {
    // The Tournament contract.
    TournamentInterface public tournament;

    // The Wizard guild contract.
    // TODO: Replace with the address of the contract once it's deployed.
    WizardGuildInterface public constant WIZARD_GUILD = WizardGuildInterface(address(0x0d8c864DA1985525e0af0acBEEF6562881827bd5));

    // The Wizard presale contract.
    WizardPresaleInterface public constant WIZARD_PRESALE = WizardPresaleInterface(address(0));

    /// @dev The ratio between the cost of a Wizard (in wei) and the power of the Wizard.
    ///      power = cost / MAX_POWER_SCALE
    ///      cost = power * MAX_POWER_SCALE
    uint256 internal constant MAX_POWER_SCALE = 1000;
    uint256 internal tournamentPowerScale;

    function getTournamentPowerScale() external view returns (uint256) {
        return tournamentPowerScale;
    }

    /// @dev The constant conversion factor used for elementalWizardIncrement
    uint256 private constant TENTH_BASIS_POINTS = 100000;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // We pack these values together to save storage costs (and since they are all access together)
    struct WizardCosts {
        /// @dev The cost of Neutral Wizards (in wei).
        uint96 neutralWizardCost;

        /// @dev The cost of the _next_ Elemental Wizard (in wei); increases with each Elemental Wizard
        ///      sold, at the rate defined in `elementalWizardIncrement`
        uint96 elementalWizardCost;

        /// @dev The increment ratio in cost between sequential Elemental Wizards, multiplied by 100k for
        ///      greater granularity (TENTH_BASIS_POINTS)
        uint32 elementalWizardIncrement;
    }

    WizardCosts public wizardCosts;

    /// @param setCooAddress The initial COO address.
    /// @param setCfoAddress The initial CFO address.
    /// @param setNeutralWizardCost The cost of the Neutral Wizards, in wei.
    /// @param setElementalWizardCost The starting cost of the Elemental Wizards, in wei.
    /// @param setElementalWizardIncrement The rate at which the Elemental Wizards cost increases.
    constructor(
        address setCooAddress,
        address payable setCfoAddress,
        uint256 setNeutralWizardCost,
        uint256 setElementalWizardCost,
        uint256 setElementalWizardIncrement)
        public AccessControl(setCooAddress, setCfoAddress)
    {
        wizardCosts = WizardCosts ({
            neutralWizardCost: uint96(setNeutralWizardCost),
            elementalWizardCost: uint96(setElementalWizardCost),
            elementalWizardIncrement: uint32(setElementalWizardIncrement)
        });
    }

    modifier onlyWizardController(uint256 wizardId) {
        require(WIZARD_GUILD.isApprovedOrOwner(msg.sender, wizardId), "Must be Wizard controller");
        _;
    }

    /// @dev The presale contract will be sending Ether directly to this contract,
    ///      so we need it to have a payable fallback.
    function() external payable {
        require(msg.sender == address(WIZARD_PRESALE) || msg.sender == address(tournament), "Don't send funds to GateKeeper");
    }

    /// @notice Registers the address of the Tournament with the GateKeeper. This can't be passed
    ///         into the constructor, because the Tournament itself needs a reference to the GateKeeper
    ///         in its constructor!
    ///
    ///         NOTE: Technically, most of the functions below should have some kind of modifier
    ///               that ensures that the Tournament is set before they are called, but that
    ///               just adds gas. In practice, multiple draft Gatekeeper contracts may be
    ///               deployed, so what matters is that we call this function before sharing
    ///               the address of this contract publicly. No need to enforce that on chain,
    ///               with its associated gas costs!
    function registerTournament(address setTournament) external onlyCOO {
        require(address(tournament) == address(0), "Tournament already registered");
        tournament = TournamentInterface(setTournament);
        require(
            (setTournament != address(0)) &&
            tournament.supportsInterface(_INTERFACE_ID_TOURNAMENT), "Invalid Tournament");

        tournamentPowerScale = tournament.powerScale();
        require(tournamentPowerScale <= MAX_POWER_SCALE, "Power scale too high");
    }

    /// @notice This is it folks, the main event! The way for the world to get new Wizards! Does
    ///         pretty much what it says on the box; let's you conjure a new Wizard with a specified
    ///         elemental affinity. The call must include enough Ether to cover the cost of the new
    ///         Wizard, and any excess is refunded. The power of the Wizard is derived from
    ///         the cost. YOU CAN NOT PAY EXTRA TO RAISE INITIAL POWER LATER. Returns the ID
    ///         of the newly conjured Wizard.
    ///
    ///         While you cannot increase power later, you can conjure some more Wizards!
    /// @param affinity The elemental affinity you want for the Wizard. Valid elements are
    ///        defined in `WizardConstants`, see the constants with names starting `ELEMENT_`.
    ///        ELEMENT_NOTSET is not valid for regular Wizards (unlike Exclusive Wizards).
    function conjureWizard(uint8 affinity) external payable returns (uint256) {
        uint8[] memory affinities = new uint8[](1);

        affinities[0] = affinity;

        uint256[] memory wizardIds = conjureWizardMulti(affinities);

        return wizardIds[0];
    }

    /// @notice A convenience function that allows you to conjure a whole bunch of Wizards at once! You know how
    ///         there's "a pride of lions", "a murder of crows", and "a parliament of owls"? Well, with this
    ///         here function you can conjure yourself "a stench of Cheeze Wizards"!
    /// @dev This function is careful to bundle all of the external calls (_transferRefund() and onERC721Received())
    ///         at the end of the function to limit the risk of reentrancy attacks.
    /// @param affinities The elemental affinities of the Wizards, can mix and match any valid types.
    ///        Valid elements are defined in `WizardConstants`, see the constants with names starting
    ///        `ELEMENT_`. ELEMENT_NOTSET is not valid for regular Wizards (unlike Exclusive Wizards).
    function conjureWizardMulti(uint8[] memory affinities) public payable
            returns (uint256[] memory wizardIds)
    {
        (uint256 totalCost, uint256 contribution, uint88[] memory powers) = _computeWizardPowers(affinities);

        require(msg.value >= totalCost, "Insufficient funds");

        // Mint the requested Wizards in the guild contract, assigning ownership to the sender
        wizardIds = WIZARD_GUILD.mintWizards(powers, affinities, msg.sender);

        // Enter the new Wizards into the Tournament
        tournament.enterWizards.value(contribution)(wizardIds, powers);

        // Ensure the Wizards are being assigned to an ERC-721 aware address (either an external address,
        // or a smart contract that implements onERC721Received()). We must call onERC721Received() for
        // each token minted because it's allowed for an ERC-721 receiving contract to reject the
        // transfer based on the properties of the token.
        if (isContract(msg.sender)) {
            for (uint256 i = 0; i < wizardIds.length; i++) {
                bytes4 transferAccepted = IERC721Receiver(msg.sender).onERC721Received(msg.sender, address(0), wizardIds[i], "");
                require(transferAccepted == _ERC721_RECEIVED, "Contract owner didn't accept ERC721 transfer");
            }
        }

        // NOTE: _transferRefund() is only safe if msg.value >= totalCost. See the require() near the
        //       beginning of the function to feel better about this fact.
        _transferRefund(totalCost);
    }

    /// @notice Allows for the creation of Exclusive Wizards. This can only be done by the COO, who still has
    ///         to pay for the power imbued in these Wizards! Reverts if the owner address is a smart contract
    ///         that is not ERC-721 aware.
    /// @param wizardIds An array of IDs of the Wizards being conjured.
    /// @param powers The power levels of the Wizards, corresponding 1:1 to Wizard IDs.
    /// @param affinities The elemental affinities of the Wizards, corresponding 1:1 to Wizard IDs.
    ///                   Valid elements are defined in `WizardConstants`, see the constants with
    ///                   names starting `ELEMENT_`. ELEMENT_NOTSET is valid for Exclusive Wizards,
    ///                   unlike regular Wizards.
    /// @param owner The recipient address of the newly conjured Cheeze Wizards.
    function conjureExclusiveMulti(
        uint256[] calldata wizardIds,
        uint256[] calldata powers,
        uint8[] calldata affinities,
        address owner
    )
        external payable onlyCOO
    {
        // Ensure the arrays are all of the same length
        require(wizardIds.length == powers.length && powers.length == affinities.length, "Inconsistent parameter lengths");

        uint256 totalCost = 0;
        uint256 contribution = 0;
        uint88[] memory localPowers = new uint88[](powers.length);

        for (uint256 i = 0; i < powers.length; i++) {
            require(affinities[i] <= MAX_ELEMENT, "Invalid affinity");

            require(powers[i] < (1 << 88), "Invalid power level");
            localPowers[i] = uint88(powers[i]);
            uint256 wizardCost = powerToCost(localPowers[i]);

            totalCost += wizardCost;
            contribution += _potContribution(localPowers[i]);
        }

        require(msg.value >= totalCost, "Insufficient funds");

        // Mint the requested Wizards via the guild contract
        WIZARD_GUILD.mintReservedWizards(wizardIds, localPowers, affinities, owner);

        // Enter the new Wizards into the Tournament
        tournament.enterWizards.value(contribution)(wizardIds, localPowers);

        // Ensure the Wizards are being assigned to an ERC-721 aware address (either an external address,
        // or a smart contract that implements onERC721Received()). We must call onERC721Received for
        // each token minted because it's allowed for an ERC-721 receiving contract to reject the
        // transfer based on the properties of the token.
        if (isContract(owner)) {
            for (uint256 i = 0; i < wizardIds.length; i++) {
                bytes4 transferAccepted = IERC721Receiver(owner).onERC721Received(msg.sender, address(0), wizardIds[i], "");
                require(transferAccepted == _ERC721_RECEIVED, "Contract owner didn't accept ERC721 transfer");
            }
        }

        // NOTE: _transferRefund() is only safe if msg.value >= totalCost. See the require() near the
        //       middle of the function to feel better about this fact.
        _transferRefund(totalCost);
    }

    /// @notice Computes the powers, total cost, and prize pot contribution for an array of new Wizards
    ///         based on the provided affinities. This also checks that the affinity values are valid
    ///         for the Tournament, and updates the elementalWizardCost storage variable as relevant.
    function _computeWizardPowers(uint8[] memory affinities) internal
            returns(uint256 totalCost, uint256 contribution, uint88[] memory powers)
    {
        // Cache the Wizard costs in order to reduce the gas costs from reads and writes to storage.
        uint256 neutralWizardCost = wizardCosts.neutralWizardCost;
        uint256 elementalWizardCost = wizardCosts.elementalWizardCost;
        uint256 elementalWizardIncrement = wizardCosts.elementalWizardIncrement;

        totalCost = 0;
        contribution = 0;
        powers = new uint88[](affinities.length);

        for (uint256 i = 0; i < affinities.length; i++) {
            uint8 affinity = affinities[i];
            uint256 wizardCost;

            require(affinity > ELEMENT_NOTSET && affinity <= MAX_ELEMENT, "Invalid affinity");

            // Determine the price of the Wizard
            if (affinity == ELEMENT_NEUTRAL) {
                wizardCost = neutralWizardCost;
            } else {
                wizardCost = elementalWizardCost;

                // Update the cost of the next Elemental Wizard
                // NOTE: This math can't overflow because the total Ether supply in wei is well less than
                //       2^128. Multiplying a valid cost in wei by some number <100k
                //       cannot possibly overflow 256 bits. As cost is calculated
                //       ourselves (rather than user provided) we know it must
                //       be in the valid range.
                elementalWizardCost += (elementalWizardCost * elementalWizardIncrement) / TENTH_BASIS_POINTS;
            }

            powers[i] = costToPower(wizardCost);

            // IMPORTANT! Mathematically, you'd think we could just compute the pot contribution at the
            // end of the loop, but this risks rounding differences between
            // conjuring Wizards individually compared to conjuring them as a stench.
            contribution += _potContribution(powers[i]);
            totalCost += wizardCost;
        }

        // Update the cached elemental cost to storage. Conveniently this costs very little if
        // the value isn't actually changed.
        wizardCosts.elementalWizardCost = uint96(elementalWizardCost);
    }

    /// @notice Absorbs a number of presale Wizards into the final NFT contract, while also entering them into
    ///         the Tournament. Can handle any number of Wizards in a batch BUT THEY MUST ALL HAVE THE SAME OWNER.
    ///         Callable by anyone.
    /// @param wizardIds The IDs of the presale Wizards; note that all Wizards MUST have the same owner.
    function absorbPresaleWizards(uint256[] calldata wizardIds) external {
        // Bulk fetch the Wizards from the presale contract. Note that this will also delete those Wizards from the
        // presale contract, and will also transfer the funds used to purchase those Wizards to this contract.
        // Obviously, a failed require() statement later in this function will undo that transfer and those deletes.
        (
            address[] memory owners,
             uint256[] memory powers,
             uint8[] memory affinities
        ) = WIZARD_PRESALE.absorbWizardMulti(wizardIds);

        uint256 contribution = 0;
        address theOwner = owners[0];
        uint88[] memory localPowers = new uint88[](powers.length);

        for (uint256 i = 0; i < powers.length; i++) {
            require(owners[i] == theOwner, "All Wizards must have same owner");
            localPowers[i] = uint88(powers[i]);
            contribution += _potContribution(localPowers[i]);
        }

        // Mint the requested Wizards in the guild contract
        WIZARD_GUILD.mintReservedWizards(wizardIds, localPowers, affinities, theOwner);

        // Enter the new Wizards into the Tournament
        tournament.enterWizards.value(contribution)(wizardIds, localPowers);
    }

    /// @notice Revive a tired Wizard so they can duel again. The caller must own
    ///         the Wizard.
    /// @param wizardId The ID of the Wizard to revive.
    function revive(uint256 wizardId) external payable onlyWizardController(wizardId) {
        // We don't need to do any validation here, we can let the Tournament decide
        // if the pot contribution amount derived from msg.value represents a valid
        // power level to use for reviving this Wizard.
        uint88 purchasedPower = costToPower(msg.value);
        uint256 potContributionValue = _potContribution(purchasedPower);

        tournament.revive.value(potContributionValue)(wizardId);
    }

    /// @notice Sets the affinity for a Wizard that doesn't already have its elemental affinity chosen.
    ///         As a rule this is only ever expected to apply to Exclusive Wizards, as regular wizards
    ///         have their affinity set when they are conjured.
    function setAffinity(uint256 wizardId, uint8 newAffinity) external onlyWizardController(wizardId) {
        require(newAffinity > ELEMENT_NOTSET && newAffinity <= MAX_ELEMENT, "Must choose a valid affinity");

        // The guild will enforce the Wizard doesn't already have an affinity set.
        WIZARD_GUILD.setAffinity(wizardId, newAffinity);
    }

    /// @notice Determine the power of a Wizard based on their price.
    /// @param cost The price of the Wizard in wei.
    /// @return The power of the Wizard (cast to uint88).
    function costToPower(uint256 cost) public pure returns (uint88 power) {
        return uint88(cost / MAX_POWER_SCALE);
    }

    /// @param power The power of the Wizard.
    /// @return The cost of the Wizard in wei.
    function powerToCost(uint88 power) public pure returns (uint256 cost) {
        return power * MAX_POWER_SCALE;
    }

    /// @notice Computes the number of wei required to be sent to the Tournament
    ///         in order to match a given power level.
    /// @param wizardPower The power level
    /// @return The prize pot contribution necessary to match the given power
    function _potContribution(uint88 wizardPower) internal view returns (uint256) {
        return wizardPower * tournamentPowerScale;
    }

    /// @notice Allows the CFO to withdraw funds from this contract.
    function withdraw() external onlyCFO {
        // All of the pot contributions go directly into the Tournament contract, so
        // we can safely withdraw everything, with no hold-backs.
        msg.sender.transfer(address(this).balance);
    }


    /// @notice Allows the COO to destroy this contract if it's not needed anymore.
    /// @notice Can't be destoryed if the Tournament still exists.
    function destroy() external onlyCOO {
        require(address(this).balance == 0, "Drain the funds first");
        require(address(tournament) == address(0), "Destroy Tournament first");

        selfdestruct(msg.sender);
    }

    /// @notice Allow the COO to destroy the Tournament contract.
    function destroyTournament() external onlyCOO {
        if (address(tournament) != address(0)) {
            require(tournament.isActive() == false, "Tournament active");
            tournament.destroy();
            tournament = TournamentInterface(0);
        }
    }

    /// @notice Utility function that refunds any overpayment to the sender; smart
    ///      enough to only send the excess if the amount we are returning is more than the
    ///      cost of sending it!
    /// @dev Warning! This does not check for underflows (msg.value < actualPrice) - so
    ///      be sure to call this with correct values!
    /// @param actualPrice The actual price owed for the conjured Wizards.
    function _transferRefund(uint256 actualPrice) private {
        uint256 refund = msg.value - actualPrice;

        // Make sure the amount we're trying to refund is less than the actual cost of sending it!
        // See https://github.com/ethereum/wiki/wiki/Subtleties for magic values costs.  We can
        // safely ignore the 25000 additional gas cost for new accounts, as msg.sender is
        // guaranteed to exist at this point!
        if (refund > (tx.gasprice * (9000+700))) {
            msg.sender.transfer(refund);
        }
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"cfoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ceoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"wizardIds","type":"uint256[]"},{"name":"powers","type":"uint256[]"},{"name":"affinities","type":"uint8[]"},{"name":"owner","type":"address"}],"name":"conjureExclusiveMulti","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"tournament","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"power","type":"uint88"}],"name":"powerToCost","outputs":[{"name":"cost","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"newCfo","type":"address"}],"name":"setCfo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"WIZARD_PRESALE","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"affinity","type":"uint8"}],"name":"conjureWizard","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newCeo","type":"address"}],"name":"setCeo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"wizardId","type":"uint256"}],"name":"revive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"wizardId","type":"uint256"},{"name":"newAffinity","type":"uint8"}],"name":"setAffinity","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"setTournament","type":"address"}],"name":"registerTournament","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newCoo","type":"address"}],"name":"setCoo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTournamentPowerScale","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cooAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"wizardCosts","outputs":[{"name":"neutralWizardCost","type":"uint96"},{"name":"elementalWizardCost","type":"uint96"},{"name":"elementalWizardIncrement","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"destroyTournament","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"WIZARD_GUILD","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"affinities","type":"uint8[]"}],"name":"conjureWizardMulti","outputs":[{"name":"wizardIds","type":"uint256[]"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"cost","type":"uint256"}],"name":"costToPower","outputs":[{"name":"power","type":"uint88"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"wizardIds","type":"uint256[]"}],"name":"absorbPresaleWizards","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"setCooAddress","type":"address"},{"name":"setCfoAddress","type":"address"},{"name":"setNeutralWizardCost","type":"uint256"},{"name":"setElementalWizardCost","type":"uint256"},{"name":"setElementalWizardIncrement","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousCeo","type":"address"},{"indexed":false,"name":"newCeo","type":"address"}],"name":"CEOTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousCoo","type":"address"},{"indexed":false,"name":"newCoo","type":"address"}],"name":"COOTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousCfo","type":"address"},{"indexed":false,"name":"newCfo","type":"address"}],"name":"CFOTransferred","type":"event"}]

60806040523480156200001157600080fd5b5060405160a0806200299f833981018060405260a08110156200003357600080fd5b50805160208083015160408401516060850151608090950151939491939092859085906200006790339062000135811b901c565b62000078826200019f60201b60201c565b6001600160a01b03811615620000995762000099816200029460201b60201c565b5050604080516060810182526001600160601b03948516808252939094166020850181905263ffffffff929092169301839052600580546001600160601b031916909217600160601b600160c01b0319166c0100000000000000000000000090910217600160c01b63ffffffff0219167801000000000000000000000000000000000000000000000000909202919091179055506200041f9050565b600054604080516001600160a01b039283168152918316602083015280517f9d05f170f1d545b1aa21c4a4f79f17ff737f5f020ea1b333d88f29f0bbfa9fc69281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146200021957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4f6e6c792043454f000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6200022a816200038960201b60201c565b600154604080516001600160a01b039283168152918316602083015280517f1cd3afc04e6ae479d2b9f74533351b52218c5b2ae4f847f681a5eac514fe11849281900390910190a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146200030e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4f6e6c792043454f000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6200031f816200038960201b60201c565b600254604080516001600160a01b039283168152918316602083015280517fe1033d3cc535efc343c53636bdc05c52a44d9e70b089d4ad6e974379f2c651d69281900390910190a1600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811615801590620003b057506000546001600160a01b03828116911614155b6200041c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642043454f206164647265737300000000000000000000000000604482015290519081900360640190fd5b50565b612570806200042f6000396000f3fe6080604052600436106101405760003560e01c80638baecc21116100b6578063b83a0c441161006f578063b83a0c4414610509578063b95dbeb61461054e578063c9eb068b14610563578063ce6991fd14610578578063e5a604bf14610669578063f4038ec7146106af57610140565b80638baecc211461042957806398d7a414146104465780639934d7c3146104795780639986a0c6146104ac578063a60a9159146104df578063b047fb50146104f457610140565b80632d46ed56116101085780632d46ed56146103645780633ccfd60b1461039757806352a71ac9146103ac578063573f322f146103c157806383197ef0146103e157806388975198146103f657610140565b80630519ce79146101ad5780630a0f8168146101de5780630cff2fd0146101f35780631e0197e21461030a5780632b81860b1461031f575b33158061015757506003546001600160a01b031633145b6101ab5760408051600160e51b62461bcd02815260206004820152601e60248201527f446f6e27742073656e642066756e647320746f20476174654b65657065720000604482015290519081900360640190fd5b005b3480156101b957600080fd5b506101c261072a565b604080516001600160a01b039092168252519081900360200190f35b3480156101ea57600080fd5b506101c2610739565b6101ab6004803603608081101561020957600080fd5b810190602081018135600160201b81111561022357600080fd5b82018360208201111561023557600080fd5b803590602001918460208302840111600160201b8311171561025657600080fd5b919390929091602081019035600160201b81111561027357600080fd5b82018360208201111561028557600080fd5b803590602001918460208302840111600160201b831117156102a657600080fd5b919390929091602081019035600160201b8111156102c357600080fd5b8201836020820111156102d557600080fd5b803590602001918460208302840111600160201b831117156102f657600080fd5b9193509150356001600160a01b0316610748565b34801561031657600080fd5b506101c2610d5b565b34801561032b57600080fd5b506103526004803603602081101561034257600080fd5b50356001600160581b0316610d6a565b60408051918252519081900360200190f35b34801561037057600080fd5b506101ab6004803603602081101561038757600080fd5b50356001600160a01b0316610d7d565b3480156103a357600080fd5b506101ab610e40565b3480156103b857600080fd5b506101c2610ec0565b610352600480360360208110156103d757600080fd5b503560ff16610ec5565b3480156103ed57600080fd5b506101ab610f38565b34801561040257600080fd5b506101ab6004803603602081101561041957600080fd5b50356001600160a01b0316611043565b6101ab6004803603602081101561043f57600080fd5b50356110a5565b34801561045257600080fd5b506101ab6004803603604081101561046957600080fd5b508035906020013560ff1661120e565b34801561048557600080fd5b506101ab6004803603602081101561049c57600080fd5b50356001600160a01b03166113d2565b3480156104b857600080fd5b506101ab600480360360208110156104cf57600080fd5b50356001600160a01b031661165b565b3480156104eb57600080fd5b5061035261171e565b34801561050057600080fd5b506101c2611724565b34801561051557600080fd5b5061051e611733565b604080516001600160601b03948516815292909316602083015263ffffffff168183015290519081900360600190f35b34801561055a57600080fd5b506101ab61175d565b34801561056f57600080fd5b506101c2611908565b6106196004803603602081101561058e57600080fd5b810190602081018135600160201b8111156105a857600080fd5b8201836020820111156105ba57600080fd5b803590602001918460208302840111600160201b831117156105db57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611920945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561065557818101518382015260200161063d565b505050509050019250505060405180910390f35b34801561067557600080fd5b506106936004803603602081101561068c57600080fd5b5035611d3f565b604080516001600160581b039092168252519081900360200190f35b3480156106bb57600080fd5b506101ab600480360360208110156106d257600080fd5b810190602081018135600160201b8111156106ec57600080fd5b8201836020820111156106fe57600080fd5b803590602001918460208302840111600160201b8311171561071f57600080fd5b509092509050611d47565b6002546001600160a01b031681565b6000546001600160a01b031681565b6001546001600160a01b031633146107985760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c7920434f4f02604482015290519081900360640190fd5b85841480156107a657508382145b6107fa5760408051600160e51b62461bcd02815260206004820152601e60248201527f496e636f6e73697374656e7420706172616d65746572206c656e677468730000604482015290519081900360640190fd5b604080518581526020808702820101909152600090819060609087801561082b578160200160208202803883390190505b50905060005b8781101561099a57600487878381811061084757fe5b9050602002013560ff1660ff1611156108a05760408051600160e51b62461bcd0281526020600482015260106024820152600160801b6f496e76616c696420616666696e69747902604482015290519081900360640190fd5b600160581b8989838181106108b157fe5b905060200201351061090d5760408051600160e51b62461bcd02815260206004820152601360248201527f496e76616c696420706f776572206c6576656c00000000000000000000000000604482015290519081900360640190fd5b88888281811061091957fe5b9050602002013582828151811061092c57fe5b60200260200101906001600160581b031690816001600160581b031681525050600061096a83838151811061095d57fe5b6020026020010151610d6a565b9050808501945061098d83838151811061098057fe5b602002602001015161223a565b9093019250600101610831565b50823410156109eb5760408051600160e51b62461bcd0281526020600482015260126024820152600160701b71496e73756666696369656e742066756e647302604482015290519081900360640190fd5b730d8c864da1985525e0af0acbeef6562881827bd56001600160a01b0316639d1580238b8b848a8a8a6040518763ffffffff1660e01b815260040180806020018060200180602001856001600160a01b03166001600160a01b0316815260200184810384528a8a828181526020019250602002808284376000838201819052601f909101601f191690920186810385528a5181528a51602091820193828d0193509102908190849084905b83811015610aae578181015183820152602001610a96565b505050509050018481038252878782818152602001925060200280828437600081840152601f19601f8201169050808301925050509950505050505050505050600060405180830381600087803b158015610b0857600080fd5b505af1158015610b1c573d6000803e3d6000fd5b505060035460408051600160e01b63b9d95abb02815260048101918252604481018e90526001600160a01b03909216935063b9d95abb925085918e918e91879190819060248101906064018660208702808284376000838201819052601f909101601f1916909201858103845286518152865160209182019382890193509102908190849084905b83811015610bbc578181015183820152602001610ba4565b50505050905001955050505050506000604051808303818588803b158015610be357600080fd5b505af1158015610bf7573d6000803e3d6000fd5b5050505050610c058461224d565b15610d465760005b89811015610d44576000856001600160a01b031663150b7a023360008f8f87818110610c3557fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b0316815260200182815260200180602001828103825260008152602001602001945050505050602060405180830381600087803b158015610cb857600080fd5b505af1158015610ccc573d6000803e3d6000fd5b505050506040513d6020811015610ce257600080fd5b505190506001600160e01b03198116600160e11b630a85bd010214610d3b57604051600160e51b62461bcd02815260040180806020018281038252602c815260200180612519602c913960400191505060405180910390fd5b50600101610c0d565b505b610d4f83612253565b50505050505050505050565b6003546001600160a01b031681565b6001600160581b0381166103e802919050565b6000546001600160a01b03163314610dcd5760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c792043454f02604482015290519081900360640190fd5b610dd681612296565b600254604080516001600160a01b039283168152918316602083015280517fe1033d3cc535efc343c53636bdc05c52a44d9e70b089d4ad6e974379f2c651d69281900390910190a1600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b03163314610e905760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c792043464f02604482015290519081900360640190fd5b6040513390303180156108fc02916000818181858888f19350505050158015610ebd573d6000803e3d6000fd5b50565b600081565b60408051600180825281830190925260009160609190602080830190803883390190505090508281600081518110610ef957fe5b602002602001019060ff16908160ff16815250506060610f1882611920565b905080600081518110610f2757fe5b602002602001015192505050919050565b6001546001600160a01b03163314610f885760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c7920434f4f02604482015290519081900360640190fd5b303115610fdf5760408051600160e51b62461bcd02815260206004820152601560248201527f447261696e207468652066756e64732066697273740000000000000000000000604482015290519081900360640190fd5b6003546001600160a01b0316156110405760408051600160e51b62461bcd02815260206004820152601860248201527f44657374726f7920546f75726e616d656e742066697273740000000000000000604482015290519081900360640190fd5b33ff5b6000546001600160a01b031633146110935760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c792043454f02604482015290519081900360640190fd5b61109c81612296565b610ebd81612310565b60408051600160e01b63430c20810281523360048201526024810183905290518291730d8c864da1985525e0af0acbeef6562881827bd59163430c208191604480820192602092909190829003018186803b15801561110357600080fd5b505afa158015611117573d6000803e3d6000fd5b505050506040513d602081101561112d57600080fd5b50516111835760408051600160e51b62461bcd02815260206004820152601960248201527f4d7573742062652057697a61726420636f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b600061118e34611d3f565b9050600061119b8261223a565b60035460408051600160e01b638baecc210281526004810188905290519293506001600160a01b0390911691638baecc21918491602480830192600092919082900301818588803b1580156111ef57600080fd5b505af1158015611203573d6000803e3d6000fd5b505050505050505050565b60408051600160e01b63430c20810281523360048201526024810184905290518391730d8c864da1985525e0af0acbeef6562881827bd59163430c208191604480820192602092909190829003018186803b15801561126c57600080fd5b505afa158015611280573d6000803e3d6000fd5b505050506040513d602081101561129657600080fd5b50516112ec5760408051600160e51b62461bcd02815260206004820152601960248201527f4d7573742062652057697a61726420636f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b60ff8216158015906113025750600460ff831611155b6113565760408051600160e51b62461bcd02815260206004820152601c60248201527f4d7573742063686f6f736520612076616c696420616666696e69747900000000604482015290519081900360640190fd5b60408051600160e21b632635e9050281526004810185905260ff841660248201529051730d8c864da1985525e0af0acbeef6562881827bd5916398d7a41491604480830192600092919082900301818387803b1580156113b557600080fd5b505af11580156113c9573d6000803e3d6000fd5b50505050505050565b6001546001600160a01b031633146114225760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c7920434f4f02604482015290519081900360640190fd5b6003546001600160a01b0316156114835760408051600160e51b62461bcd02815260206004820152601d60248201527f546f75726e616d656e7420616c72656164792072656769737465726564000000604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0383169081179091551580159061152f575060035460408051600160e01b6301ffc9a7028152600160e31b6317a0b21302600482015290516001600160a01b03909216916301ffc9a791602480820192602092909190829003018186803b15801561150257600080fd5b505afa158015611516573d6000803e3d6000fd5b505050506040513d602081101561152c57600080fd5b50515b6115835760408051600160e51b62461bcd02815260206004820152601260248201527f496e76616c696420546f75726e616d656e740000000000000000000000000000604482015290519081900360640190fd5b600360009054906101000a90046001600160a01b03166001600160a01b031663ad81e4d66040518163ffffffff1660e01b815260040160206040518083038186803b1580156115d157600080fd5b505afa1580156115e5573d6000803e3d6000fd5b505050506040513d60208110156115fb57600080fd5b505160048190556103e81015610ebd5760408051600160e51b62461bcd02815260206004820152601460248201527f506f776572207363616c6520746f6f2068696768000000000000000000000000604482015290519081900360640190fd5b6000546001600160a01b031633146116ab5760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c792043454f02604482015290519081900360640190fd5b6116b481612296565b600154604080516001600160a01b039283168152918316602083015280517f1cd3afc04e6ae479d2b9f74533351b52218c5b2ae4f847f681a5eac514fe11849281900390910190a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b60045490565b6001546001600160a01b031681565b6005546001600160601b0380821691600160601b810490911690600160c01b900463ffffffff1683565b6001546001600160a01b031633146117ad5760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c7920434f4f02604482015290519081900360640190fd5b6003546001600160a01b03161561190657600360009054906101000a90046001600160a01b03166001600160a01b03166322f3e2d46040518163ffffffff1660e01b815260040160206040518083038186803b15801561180c57600080fd5b505afa158015611820573d6000803e3d6000fd5b505050506040513d602081101561183657600080fd5b50511561188d5760408051600160e51b62461bcd02815260206004820152601160248201527f546f75726e616d656e7420616374697665000000000000000000000000000000604482015290519081900360640190fd5b600360009054906101000a90046001600160a01b03166001600160a01b03166383197ef06040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156118dd57600080fd5b505af11580156118f1573d6000803e3d6000fd5b5050600380546001600160a01b031916905550505b565b730d8c864da1985525e0af0acbeef6562881827bd581565b606060008060606119308561237a565b925092509250823410156119865760408051600160e51b62461bcd0281526020600482015260126024820152600160701b71496e73756666696369656e742066756e647302604482015290519081900360640190fd5b604051600160e21b63157f6fbb0281523360448201819052606060048301908152835160648401528351730d8c864da1985525e0af0acbeef6562881827bd5936355fdbeec9386938b9391929091829160248101916084909101906020808901910280838360005b83811015611a065781810151838201526020016119ee565b50505050905001838103825285818151815260200191508051906020019060200280838360005b83811015611a45578181015183820152602001611a2d565b5050505090500195505050505050600060405180830381600087803b158015611a6d57600080fd5b505af1158015611a81573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611aaa57600080fd5b810190808051600160201b811115611ac157600080fd5b82016020810184811115611ad457600080fd5b81518560208202830111600160201b82111715611af057600080fd5b505060035460408051600160e01b63b9d95abb02815260048101918252835160448201528351939a506001600160a01b03909216955063b9d95abb94508793508992879282916024820191606401906020808801910280838360005b83811015611b64578181015183820152602001611b4c565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611ba3578181015183820152602001611b8b565b505050509050019450505050506000604051808303818588803b158015611bc957600080fd5b505af1158015611bdd573d6000803e3d6000fd5b5050505050611beb3361224d565b15611d2e5760005b8451811015611d2c576000336001600160a01b031663150b7a02336000898681518110611c1c57fe5b60200260200101516040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b0316815260200182815260200180602001828103825260008152602001602001945050505050602060405180830381600087803b158015611ca057600080fd5b505af1158015611cb4573d6000803e3d6000fd5b505050506040513d6020811015611cca57600080fd5b505190506001600160e01b03198116600160e11b630a85bd010214611d2357604051600160e51b62461bcd02815260040180806020018281038252602c815260200180612519602c913960400191505060405180910390fd5b50600101611bf3565b505b611d3783612253565b505050919050565b6103e8900490565b606080606060006001600160a01b031663476c4a5e86866040518363ffffffff1660e01b815260040180806020018281038252848482818152602001925060200280828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015611dc257600080fd5b505af1158015611dd6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526060811015611dff57600080fd5b810190808051600160201b811115611e1657600080fd5b82016020810184811115611e2957600080fd5b81518560208202830111600160201b82111715611e4557600080fd5b50509291906020018051600160201b811115611e6057600080fd5b82016020810184811115611e7357600080fd5b81518560208202830111600160201b82111715611e8f57600080fd5b50509291906020018051600160201b811115611eaa57600080fd5b82016020810184811115611ebd57600080fd5b81518560208202830111600160201b82111715611ed957600080fd5b50509291905050509250925092506000809050600084600081518110611efb57fe5b6020026020010151905060608451604051908082528060200260200182016040528015611f32578160200160208202803883390190505b50905060005b855181101561201857826001600160a01b0316878281518110611f5757fe5b60200260200101516001600160a01b031614611fbd5760408051600160e51b62461bcd02815260206004820181905260248201527f416c6c2057697a61726473206d75737420686176652073616d65206f776e6572604482015290519081900360640190fd5b858181518110611fc957fe5b6020026020010151828281518110611fdd57fe5b60200260200101906001600160581b031690816001600160581b03168152505061200c82828151811061098057fe5b90930192600101611f38565b50604051600160e01b639d1580230281526001600160a01b038316606482015260806004820190815260848201899052730d8c864da1985525e0af0acbeef6562881827bd591639d158023918b918b9186918a91899181906024810190604481019060a4018960208a02808284376000838201819052601f909101601f19169092018681038552895181528951602091820193828c0193509102908190849084905b838110156120d25781810151838201526020016120ba565b50505050905001848103825286818151815260200191508051906020019060200280838360005b838110156121115781810151838201526020016120f9565b5050505090500198505050505050505050600060405180830381600087803b15801561213c57600080fd5b505af1158015612150573d6000803e3d6000fd5b505060035460408051600160e01b63b9d95abb02815260048101918252604481018c90526001600160a01b03909216935063b9d95abb925086918c918c91879190819060248101906064018660208702808284376000838201819052601f909101601f1916909201858103845286518152865160209182019382890193509102908190849084905b838110156121f05781810151838201526020016121d8565b50505050905001955050505050506000604051808303818588803b15801561221757600080fd5b505af115801561222b573d6000803e3d6000fd5b50505050505050505050505050565b6004546001600160581b03821602919050565b3b151590565b348190036125e43a0281111561229257604051339082156108fc029083906000818181858888f19350505050158015612290573d6000803e3d6000fd5b505b5050565b6001600160a01b038116158015906122bc57506000546001600160a01b03828116911614155b610ebd5760408051600160e51b62461bcd02815260206004820152601360248201527f496e76616c69642043454f206164647265737300000000000000000000000000604482015290519081900360640190fd5b600054604080516001600160a01b039283168152918316602083015280517f9d05f170f1d545b1aa21c4a4f79f17ff737f5f020ea1b333d88f29f0bbfa9fc69281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b600554815160408051828152602080840282010190915260009283926060926001600160601b0380841693600160601b810490911692600160c01b90910463ffffffff16919080156123d6578160200160208202803883390190505b50935060005b87518110156124d65760008882815181106123f357fe5b6020026020010151905060008060ff168260ff161180156124185750600460ff831611155b6124625760408051600160e51b62461bcd0281526020600482015260106024820152600160801b6f496e76616c696420616666696e69747902604482015290519081900360640190fd5b60ff821660011415612475575084612482565b50620186a0838502048401935b61248b81611d3f565b87848151811061249757fe5b60200260200101906001600160581b031690816001600160581b0316815250506124c687848151811061098057fe5b98019790960195506001016123dc565b5050600580546001600160601b03909216600160601b0277ffffffffffffffffffffffff0000000000000000000000001990921691909117905550919390925056fe436f6e7472616374206f776e6572206469646e27742061636365707420455243373231207472616e73666572a165627a7a72305820ba3368783d58445cfa9dcff4274ab528423d2cd8e2b2937dc1ade7150f362dc90029000000000000000000000000d880d895ce716afc1e5e21cb901b5093701842e4000000000000000000000000c09f4f0eae0b92ec1e3d93baeac46d8a5391483b00000000000000000000000000000000000000000000000000f8b0a10e470000000000000000000000000000000000000000000000000000105e7bea83b0908e0000000000000000000000000000000000000000000000000000000000000082

Deployed Bytecode

0x6080604052600436106101405760003560e01c80638baecc21116100b6578063b83a0c441161006f578063b83a0c4414610509578063b95dbeb61461054e578063c9eb068b14610563578063ce6991fd14610578578063e5a604bf14610669578063f4038ec7146106af57610140565b80638baecc211461042957806398d7a414146104465780639934d7c3146104795780639986a0c6146104ac578063a60a9159146104df578063b047fb50146104f457610140565b80632d46ed56116101085780632d46ed56146103645780633ccfd60b1461039757806352a71ac9146103ac578063573f322f146103c157806383197ef0146103e157806388975198146103f657610140565b80630519ce79146101ad5780630a0f8168146101de5780630cff2fd0146101f35780631e0197e21461030a5780632b81860b1461031f575b33158061015757506003546001600160a01b031633145b6101ab5760408051600160e51b62461bcd02815260206004820152601e60248201527f446f6e27742073656e642066756e647320746f20476174654b65657065720000604482015290519081900360640190fd5b005b3480156101b957600080fd5b506101c261072a565b604080516001600160a01b039092168252519081900360200190f35b3480156101ea57600080fd5b506101c2610739565b6101ab6004803603608081101561020957600080fd5b810190602081018135600160201b81111561022357600080fd5b82018360208201111561023557600080fd5b803590602001918460208302840111600160201b8311171561025657600080fd5b919390929091602081019035600160201b81111561027357600080fd5b82018360208201111561028557600080fd5b803590602001918460208302840111600160201b831117156102a657600080fd5b919390929091602081019035600160201b8111156102c357600080fd5b8201836020820111156102d557600080fd5b803590602001918460208302840111600160201b831117156102f657600080fd5b9193509150356001600160a01b0316610748565b34801561031657600080fd5b506101c2610d5b565b34801561032b57600080fd5b506103526004803603602081101561034257600080fd5b50356001600160581b0316610d6a565b60408051918252519081900360200190f35b34801561037057600080fd5b506101ab6004803603602081101561038757600080fd5b50356001600160a01b0316610d7d565b3480156103a357600080fd5b506101ab610e40565b3480156103b857600080fd5b506101c2610ec0565b610352600480360360208110156103d757600080fd5b503560ff16610ec5565b3480156103ed57600080fd5b506101ab610f38565b34801561040257600080fd5b506101ab6004803603602081101561041957600080fd5b50356001600160a01b0316611043565b6101ab6004803603602081101561043f57600080fd5b50356110a5565b34801561045257600080fd5b506101ab6004803603604081101561046957600080fd5b508035906020013560ff1661120e565b34801561048557600080fd5b506101ab6004803603602081101561049c57600080fd5b50356001600160a01b03166113d2565b3480156104b857600080fd5b506101ab600480360360208110156104cf57600080fd5b50356001600160a01b031661165b565b3480156104eb57600080fd5b5061035261171e565b34801561050057600080fd5b506101c2611724565b34801561051557600080fd5b5061051e611733565b604080516001600160601b03948516815292909316602083015263ffffffff168183015290519081900360600190f35b34801561055a57600080fd5b506101ab61175d565b34801561056f57600080fd5b506101c2611908565b6106196004803603602081101561058e57600080fd5b810190602081018135600160201b8111156105a857600080fd5b8201836020820111156105ba57600080fd5b803590602001918460208302840111600160201b831117156105db57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611920945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561065557818101518382015260200161063d565b505050509050019250505060405180910390f35b34801561067557600080fd5b506106936004803603602081101561068c57600080fd5b5035611d3f565b604080516001600160581b039092168252519081900360200190f35b3480156106bb57600080fd5b506101ab600480360360208110156106d257600080fd5b810190602081018135600160201b8111156106ec57600080fd5b8201836020820111156106fe57600080fd5b803590602001918460208302840111600160201b8311171561071f57600080fd5b509092509050611d47565b6002546001600160a01b031681565b6000546001600160a01b031681565b6001546001600160a01b031633146107985760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c7920434f4f02604482015290519081900360640190fd5b85841480156107a657508382145b6107fa5760408051600160e51b62461bcd02815260206004820152601e60248201527f496e636f6e73697374656e7420706172616d65746572206c656e677468730000604482015290519081900360640190fd5b604080518581526020808702820101909152600090819060609087801561082b578160200160208202803883390190505b50905060005b8781101561099a57600487878381811061084757fe5b9050602002013560ff1660ff1611156108a05760408051600160e51b62461bcd0281526020600482015260106024820152600160801b6f496e76616c696420616666696e69747902604482015290519081900360640190fd5b600160581b8989838181106108b157fe5b905060200201351061090d5760408051600160e51b62461bcd02815260206004820152601360248201527f496e76616c696420706f776572206c6576656c00000000000000000000000000604482015290519081900360640190fd5b88888281811061091957fe5b9050602002013582828151811061092c57fe5b60200260200101906001600160581b031690816001600160581b031681525050600061096a83838151811061095d57fe5b6020026020010151610d6a565b9050808501945061098d83838151811061098057fe5b602002602001015161223a565b9093019250600101610831565b50823410156109eb5760408051600160e51b62461bcd0281526020600482015260126024820152600160701b71496e73756666696369656e742066756e647302604482015290519081900360640190fd5b730d8c864da1985525e0af0acbeef6562881827bd56001600160a01b0316639d1580238b8b848a8a8a6040518763ffffffff1660e01b815260040180806020018060200180602001856001600160a01b03166001600160a01b0316815260200184810384528a8a828181526020019250602002808284376000838201819052601f909101601f191690920186810385528a5181528a51602091820193828d0193509102908190849084905b83811015610aae578181015183820152602001610a96565b505050509050018481038252878782818152602001925060200280828437600081840152601f19601f8201169050808301925050509950505050505050505050600060405180830381600087803b158015610b0857600080fd5b505af1158015610b1c573d6000803e3d6000fd5b505060035460408051600160e01b63b9d95abb02815260048101918252604481018e90526001600160a01b03909216935063b9d95abb925085918e918e91879190819060248101906064018660208702808284376000838201819052601f909101601f1916909201858103845286518152865160209182019382890193509102908190849084905b83811015610bbc578181015183820152602001610ba4565b50505050905001955050505050506000604051808303818588803b158015610be357600080fd5b505af1158015610bf7573d6000803e3d6000fd5b5050505050610c058461224d565b15610d465760005b89811015610d44576000856001600160a01b031663150b7a023360008f8f87818110610c3557fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b0316815260200182815260200180602001828103825260008152602001602001945050505050602060405180830381600087803b158015610cb857600080fd5b505af1158015610ccc573d6000803e3d6000fd5b505050506040513d6020811015610ce257600080fd5b505190506001600160e01b03198116600160e11b630a85bd010214610d3b57604051600160e51b62461bcd02815260040180806020018281038252602c815260200180612519602c913960400191505060405180910390fd5b50600101610c0d565b505b610d4f83612253565b50505050505050505050565b6003546001600160a01b031681565b6001600160581b0381166103e802919050565b6000546001600160a01b03163314610dcd5760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c792043454f02604482015290519081900360640190fd5b610dd681612296565b600254604080516001600160a01b039283168152918316602083015280517fe1033d3cc535efc343c53636bdc05c52a44d9e70b089d4ad6e974379f2c651d69281900390910190a1600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b03163314610e905760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c792043464f02604482015290519081900360640190fd5b6040513390303180156108fc02916000818181858888f19350505050158015610ebd573d6000803e3d6000fd5b50565b600081565b60408051600180825281830190925260009160609190602080830190803883390190505090508281600081518110610ef957fe5b602002602001019060ff16908160ff16815250506060610f1882611920565b905080600081518110610f2757fe5b602002602001015192505050919050565b6001546001600160a01b03163314610f885760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c7920434f4f02604482015290519081900360640190fd5b303115610fdf5760408051600160e51b62461bcd02815260206004820152601560248201527f447261696e207468652066756e64732066697273740000000000000000000000604482015290519081900360640190fd5b6003546001600160a01b0316156110405760408051600160e51b62461bcd02815260206004820152601860248201527f44657374726f7920546f75726e616d656e742066697273740000000000000000604482015290519081900360640190fd5b33ff5b6000546001600160a01b031633146110935760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c792043454f02604482015290519081900360640190fd5b61109c81612296565b610ebd81612310565b60408051600160e01b63430c20810281523360048201526024810183905290518291730d8c864da1985525e0af0acbeef6562881827bd59163430c208191604480820192602092909190829003018186803b15801561110357600080fd5b505afa158015611117573d6000803e3d6000fd5b505050506040513d602081101561112d57600080fd5b50516111835760408051600160e51b62461bcd02815260206004820152601960248201527f4d7573742062652057697a61726420636f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b600061118e34611d3f565b9050600061119b8261223a565b60035460408051600160e01b638baecc210281526004810188905290519293506001600160a01b0390911691638baecc21918491602480830192600092919082900301818588803b1580156111ef57600080fd5b505af1158015611203573d6000803e3d6000fd5b505050505050505050565b60408051600160e01b63430c20810281523360048201526024810184905290518391730d8c864da1985525e0af0acbeef6562881827bd59163430c208191604480820192602092909190829003018186803b15801561126c57600080fd5b505afa158015611280573d6000803e3d6000fd5b505050506040513d602081101561129657600080fd5b50516112ec5760408051600160e51b62461bcd02815260206004820152601960248201527f4d7573742062652057697a61726420636f6e74726f6c6c657200000000000000604482015290519081900360640190fd5b60ff8216158015906113025750600460ff831611155b6113565760408051600160e51b62461bcd02815260206004820152601c60248201527f4d7573742063686f6f736520612076616c696420616666696e69747900000000604482015290519081900360640190fd5b60408051600160e21b632635e9050281526004810185905260ff841660248201529051730d8c864da1985525e0af0acbeef6562881827bd5916398d7a41491604480830192600092919082900301818387803b1580156113b557600080fd5b505af11580156113c9573d6000803e3d6000fd5b50505050505050565b6001546001600160a01b031633146114225760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c7920434f4f02604482015290519081900360640190fd5b6003546001600160a01b0316156114835760408051600160e51b62461bcd02815260206004820152601d60248201527f546f75726e616d656e7420616c72656164792072656769737465726564000000604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0383169081179091551580159061152f575060035460408051600160e01b6301ffc9a7028152600160e31b6317a0b21302600482015290516001600160a01b03909216916301ffc9a791602480820192602092909190829003018186803b15801561150257600080fd5b505afa158015611516573d6000803e3d6000fd5b505050506040513d602081101561152c57600080fd5b50515b6115835760408051600160e51b62461bcd02815260206004820152601260248201527f496e76616c696420546f75726e616d656e740000000000000000000000000000604482015290519081900360640190fd5b600360009054906101000a90046001600160a01b03166001600160a01b031663ad81e4d66040518163ffffffff1660e01b815260040160206040518083038186803b1580156115d157600080fd5b505afa1580156115e5573d6000803e3d6000fd5b505050506040513d60208110156115fb57600080fd5b505160048190556103e81015610ebd5760408051600160e51b62461bcd02815260206004820152601460248201527f506f776572207363616c6520746f6f2068696768000000000000000000000000604482015290519081900360640190fd5b6000546001600160a01b031633146116ab5760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c792043454f02604482015290519081900360640190fd5b6116b481612296565b600154604080516001600160a01b039283168152918316602083015280517f1cd3afc04e6ae479d2b9f74533351b52218c5b2ae4f847f681a5eac514fe11849281900390910190a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b60045490565b6001546001600160a01b031681565b6005546001600160601b0380821691600160601b810490911690600160c01b900463ffffffff1683565b6001546001600160a01b031633146117ad5760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b674f6e6c7920434f4f02604482015290519081900360640190fd5b6003546001600160a01b03161561190657600360009054906101000a90046001600160a01b03166001600160a01b03166322f3e2d46040518163ffffffff1660e01b815260040160206040518083038186803b15801561180c57600080fd5b505afa158015611820573d6000803e3d6000fd5b505050506040513d602081101561183657600080fd5b50511561188d5760408051600160e51b62461bcd02815260206004820152601160248201527f546f75726e616d656e7420616374697665000000000000000000000000000000604482015290519081900360640190fd5b600360009054906101000a90046001600160a01b03166001600160a01b03166383197ef06040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156118dd57600080fd5b505af11580156118f1573d6000803e3d6000fd5b5050600380546001600160a01b031916905550505b565b730d8c864da1985525e0af0acbeef6562881827bd581565b606060008060606119308561237a565b925092509250823410156119865760408051600160e51b62461bcd0281526020600482015260126024820152600160701b71496e73756666696369656e742066756e647302604482015290519081900360640190fd5b604051600160e21b63157f6fbb0281523360448201819052606060048301908152835160648401528351730d8c864da1985525e0af0acbeef6562881827bd5936355fdbeec9386938b9391929091829160248101916084909101906020808901910280838360005b83811015611a065781810151838201526020016119ee565b50505050905001838103825285818151815260200191508051906020019060200280838360005b83811015611a45578181015183820152602001611a2d565b5050505090500195505050505050600060405180830381600087803b158015611a6d57600080fd5b505af1158015611a81573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611aaa57600080fd5b810190808051600160201b811115611ac157600080fd5b82016020810184811115611ad457600080fd5b81518560208202830111600160201b82111715611af057600080fd5b505060035460408051600160e01b63b9d95abb02815260048101918252835160448201528351939a506001600160a01b03909216955063b9d95abb94508793508992879282916024820191606401906020808801910280838360005b83811015611b64578181015183820152602001611b4c565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611ba3578181015183820152602001611b8b565b505050509050019450505050506000604051808303818588803b158015611bc957600080fd5b505af1158015611bdd573d6000803e3d6000fd5b5050505050611beb3361224d565b15611d2e5760005b8451811015611d2c576000336001600160a01b031663150b7a02336000898681518110611c1c57fe5b60200260200101516040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b0316815260200182815260200180602001828103825260008152602001602001945050505050602060405180830381600087803b158015611ca057600080fd5b505af1158015611cb4573d6000803e3d6000fd5b505050506040513d6020811015611cca57600080fd5b505190506001600160e01b03198116600160e11b630a85bd010214611d2357604051600160e51b62461bcd02815260040180806020018281038252602c815260200180612519602c913960400191505060405180910390fd5b50600101611bf3565b505b611d3783612253565b505050919050565b6103e8900490565b606080606060006001600160a01b031663476c4a5e86866040518363ffffffff1660e01b815260040180806020018281038252848482818152602001925060200280828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015611dc257600080fd5b505af1158015611dd6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526060811015611dff57600080fd5b810190808051600160201b811115611e1657600080fd5b82016020810184811115611e2957600080fd5b81518560208202830111600160201b82111715611e4557600080fd5b50509291906020018051600160201b811115611e6057600080fd5b82016020810184811115611e7357600080fd5b81518560208202830111600160201b82111715611e8f57600080fd5b50509291906020018051600160201b811115611eaa57600080fd5b82016020810184811115611ebd57600080fd5b81518560208202830111600160201b82111715611ed957600080fd5b50509291905050509250925092506000809050600084600081518110611efb57fe5b6020026020010151905060608451604051908082528060200260200182016040528015611f32578160200160208202803883390190505b50905060005b855181101561201857826001600160a01b0316878281518110611f5757fe5b60200260200101516001600160a01b031614611fbd5760408051600160e51b62461bcd02815260206004820181905260248201527f416c6c2057697a61726473206d75737420686176652073616d65206f776e6572604482015290519081900360640190fd5b858181518110611fc957fe5b6020026020010151828281518110611fdd57fe5b60200260200101906001600160581b031690816001600160581b03168152505061200c82828151811061098057fe5b90930192600101611f38565b50604051600160e01b639d1580230281526001600160a01b038316606482015260806004820190815260848201899052730d8c864da1985525e0af0acbeef6562881827bd591639d158023918b918b9186918a91899181906024810190604481019060a4018960208a02808284376000838201819052601f909101601f19169092018681038552895181528951602091820193828c0193509102908190849084905b838110156120d25781810151838201526020016120ba565b50505050905001848103825286818151815260200191508051906020019060200280838360005b838110156121115781810151838201526020016120f9565b5050505090500198505050505050505050600060405180830381600087803b15801561213c57600080fd5b505af1158015612150573d6000803e3d6000fd5b505060035460408051600160e01b63b9d95abb02815260048101918252604481018c90526001600160a01b03909216935063b9d95abb925086918c918c91879190819060248101906064018660208702808284376000838201819052601f909101601f1916909201858103845286518152865160209182019382890193509102908190849084905b838110156121f05781810151838201526020016121d8565b50505050905001955050505050506000604051808303818588803b15801561221757600080fd5b505af115801561222b573d6000803e3d6000fd5b50505050505050505050505050565b6004546001600160581b03821602919050565b3b151590565b348190036125e43a0281111561229257604051339082156108fc029083906000818181858888f19350505050158015612290573d6000803e3d6000fd5b505b5050565b6001600160a01b038116158015906122bc57506000546001600160a01b03828116911614155b610ebd5760408051600160e51b62461bcd02815260206004820152601360248201527f496e76616c69642043454f206164647265737300000000000000000000000000604482015290519081900360640190fd5b600054604080516001600160a01b039283168152918316602083015280517f9d05f170f1d545b1aa21c4a4f79f17ff737f5f020ea1b333d88f29f0bbfa9fc69281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b600554815160408051828152602080840282010190915260009283926060926001600160601b0380841693600160601b810490911692600160c01b90910463ffffffff16919080156123d6578160200160208202803883390190505b50935060005b87518110156124d65760008882815181106123f357fe5b6020026020010151905060008060ff168260ff161180156124185750600460ff831611155b6124625760408051600160e51b62461bcd0281526020600482015260106024820152600160801b6f496e76616c696420616666696e69747902604482015290519081900360640190fd5b60ff821660011415612475575084612482565b50620186a0838502048401935b61248b81611d3f565b87848151811061249757fe5b60200260200101906001600160581b031690816001600160581b0316815250506124c687848151811061098057fe5b98019790960195506001016123dc565b5050600580546001600160601b03909216600160601b0277ffffffffffffffffffffffff0000000000000000000000001990921691909117905550919390925056fe436f6e7472616374206f776e6572206469646e27742061636365707420455243373231207472616e73666572a165627a7a72305820ba3368783d58445cfa9dcff4274ab528423d2cd8e2b2937dc1ade7150f362dc90029

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

000000000000000000000000d880d895ce716afc1e5e21cb901b5093701842e4000000000000000000000000c09f4f0eae0b92ec1e3d93baeac46d8a5391483b00000000000000000000000000000000000000000000000000f8b0a10e470000000000000000000000000000000000000000000000000000105e7bea83b0908e0000000000000000000000000000000000000000000000000000000000000082

-----Decoded View---------------
Arg [0] : setCooAddress (address): 0xD880d895Ce716AfC1E5e21cb901b5093701842e4
Arg [1] : setCfoAddress (address): 0xc09F4f0eAE0B92ec1e3D93BAeac46D8a5391483B
Arg [2] : setNeutralWizardCost (uint256): 70000000000000000
Arg [3] : setElementalWizardCost (uint256): 1179516399579598990
Arg [4] : setElementalWizardIncrement (uint256): 130

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000d880d895ce716afc1e5e21cb901b5093701842e4
Arg [1] : 000000000000000000000000c09f4f0eae0b92ec1e3d93baeac46d8a5391483b
Arg [2] : 00000000000000000000000000000000000000000000000000f8b0a10e470000
Arg [3] : 000000000000000000000000000000000000000000000000105e7bea83b0908e
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000082


Deployed Bytecode Sourcemap

21045:20160:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24392:10;:37;;:74;;-1:-1:-1;24455:10:0;;-1:-1:-1;;;;;24455:10:0;24433;:33;24392:74;24384:117;;;;;-1:-1:-1;;;;;24384:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21045:20160;13236:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13236:33:0;;;:::i;:::-;;;;-1:-1:-1;;;;;13236:33:0;;;;;;;;;;;;;;12618:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12618:25:0;;;:::i;30294:2261::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;30294:2261:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;30294:2261:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30294:2261:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30294:2261:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;30294:2261:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30294:2261:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30294:2261:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;30294:2261:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30294:2261:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30294:2261:0;;-1:-1:-1;30294:2261:0;-1:-1:-1;30294:2261:0;-1:-1:-1;;;;;30294:2261:0;;:::i;21204:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21204:37:0;;;:::i;38606:119::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38606:119:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38606:119:0;-1:-1:-1;;;;;38606:119:0;;:::i;:::-;;;;;;;;;;;;;;;;15842:181;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15842:181:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15842:181:0;-1:-1:-1;;;;;15842:181:0;;:::i;39210:251::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39210:251:0;;;:::i;21531:90::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21531:90:0;;;:::i;26740:276::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26740:276:0;;;;:::i;39624:233::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39624:233:0;;;:::i;14929:121::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14929:121:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14929:121:0;-1:-1:-1;;;;;14929:121:0;;:::i;37027:517::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37027:517:0;;:::i;37826:360::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37826:360:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37826:360:0;;;;;;;;;:::i;25299:518::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25299:518:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25299:518:0;-1:-1:-1;;;;;25299:518:0;;:::i;15518:173::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15518:173:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15518:173:0;-1:-1:-1;;;;;15518:173:0;;:::i;21912:113::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21912:113:0;;;:::i;13008:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13008:25:0;;;:::i;23064:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23064:30:0;;;:::i;:::-;;;;-1:-1:-1;;;;;23064:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39932:275;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39932:275:0;;;:::i;21360:125::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21360:125:0;;;:::i;27847:1576::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27847:1576:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;27847:1576:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;27847:1576:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27847:1576:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;27847:1576:0;;-1:-1:-1;27847:1576:0;;-1:-1:-1;;;;;27847:1576:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27847:1576:0;;;;;;;;;;;;;;;;;38377:126;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38377:126:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38377:126:0;;:::i;:::-;;;;-1:-1:-1;;;;;38377:126:0;;;;;;;;;;;;;;35549:1301;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35549:1301:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35549:1301:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;35549:1301:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;35549:1301:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;35549:1301:0;;-1:-1:-1;35549:1301:0;-1:-1:-1;35549:1301:0;:::i;13236:33::-;;;-1:-1:-1;;;;;13236:33:0;;:::o;12618:25::-;;;-1:-1:-1;;;;;12618:25:0;;:::o;30294:2261::-;14389:10;;-1:-1:-1;;;;;14389:10:0;14375;:24;14367:45;;;;;-1:-1:-1;;;;;14367:45:0;;;;;;;;;;;;-1:-1:-1;;;;;14367:45:0;;;;;;;;;;;;;;;30584:33;;;:71;;;;-1:-1:-1;30621:34:0;;;30584:71;30576:114;;;;;-1:-1:-1;;;;;30576:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30800:27;;;;;;;;;;;;;;;;30703:17;;;;30770:27;;30813:6;30800:27;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;30800:27:0;-1:-1:-1;30770:57:0;-1:-1:-1;30845:9:0;30840:413;30860:17;;;30840:413;;;1048:1;30907:10;;30918:1;30907:13;;;;;;;;;;;;;;;:28;;;;30899:57;;;;;-1:-1:-1;;;;;30899:57:0;;;;;;;;;;;;-1:-1:-1;;;;;30899:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;30981:6:0;;30988:1;30981:9;;;;;;;;;;;;;:21;30973:53;;;;;-1:-1:-1;;;;;30973:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31065:6;;31072:1;31065:9;;;;;;;;;;;;;31041:11;31053:1;31041:14;;;;;;;;;;;;;:34;-1:-1:-1;;;;;31041:34:0;;;-1:-1:-1;;;;;31041:34:0;;;;;31090:18;31111:27;31123:11;31135:1;31123:14;;;;;;;;;;;;;;31111:11;:27::i;:::-;31090:48;;31168:10;31155:23;;;;31209:32;31226:11;31238:1;31226:14;;;;;;;;;;;;;;31209:16;:32::i;:::-;31193:48;;;;-1:-1:-1;30879:3:0;;30840:413;;;;31286:9;31273;:22;;31265:53;;;;;-1:-1:-1;;;;;31265:53:0;;;;;;;;;;;;-1:-1:-1;;;;;31265:53:0;;;;;;;;;;;;;;;21441:42;-1:-1:-1;;;;;31393:32:0;;31426:9;;31437:11;31450:10;;31462:5;31393:75;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31393:75:0;-1:-1:-1;;;;;31393:75:0;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;;;137:4;117:14;;;-1:-1;;113:30;157:16;;;31393:75:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31393:75:0;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;31393:75:0;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;31393:75:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31393:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;31535:10:0;;:67;;;-1:-1:-1;;;;;31535:67:0;;;;;;;;;;;;;;-1:-1:-1;;;;;31535:10:0;;;;-1:-1:-1;31535:23:0;;-1:-1:-1;31565:12:0;;31579:9;;;;31590:11;;31535:67;;;;;;;;;31579:9;31535:67;;;;31579:9;31535:67;1:33:-1;99:1;81:16;;;74:27;;;137:4;117:14;;;-1:-1;;113:30;157:16;;;31535:67:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31535:67:0;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;31535:67:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31535:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31535:67:0;;;;;31987:17;31998:5;31987:10;:17::i;:::-;31983:350;;;32026:9;32021:301;32041:20;;;32021:301;;;32087:23;32129:5;-1:-1:-1;;;;;32113:39:0;;32153:10;32173:1;32177:9;;32187:1;32177:12;;;;;;;;;;;;;32113:81;;;;;;;;;;;;;-1:-1:-1;;;;;32113:81:0;-1:-1:-1;;;;;32113:81:0;;;;;;-1:-1:-1;;;;;32113:81:0;-1:-1:-1;;;;;32113:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32113:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32113:81:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32113:81:0;;-1:-1:-1;;;;;;;32221:36:0;;-1:-1:-1;;;;;32221:36:0;32213:93;;;;-1:-1:-1;;;;;32213:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32063:3:0;;32021:301;;;;31983:350;32521:26;32537:9;32521:15;:26::i;:::-;14423:1;;;30294:2261;;;;;;;:::o;21204:37::-;;;-1:-1:-1;;;;;21204:37:0;;:::o;38606:119::-;-1:-1:-1;;;;;38694:23:0;;21855:4;38694:23;38606:119;;;:::o;15842:181::-;14226:10;;-1:-1:-1;;;;;14226:10:0;14212;:24;14204:45;;;;;-1:-1:-1;;;;;14204:45:0;;;;;;;;;;;;-1:-1:-1;;;;;14204:45:0;;;;;;;;;;;;;;;15908:27;15928:6;15908:19;:27::i;:::-;15966:10;;15951:34;;;-1:-1:-1;;;;;15966:10:0;;;15951:34;;;;;;;;;;;;;;;;;;;;;15996:10;:19;;-1:-1:-1;;;;;;15996:19:0;-1:-1:-1;;;;;15996:19:0;;;;;;;;;;15842:181::o;39210:251::-;14552:10;;-1:-1:-1;;;;;14552:10:0;14538;:24;14530:45;;;;;-1:-1:-1;;;;;14530:45:0;;;;;;;;;;;;-1:-1:-1;;;;;14530:45:0;;;;;;;;;;;;;;;39411:42;;:10;;39439:4;39431:21;39411:42;;;;;;;;;39431:21;39411:10;:42;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39411:42:0;39210:251::o;21531:90::-;21618:1;21531:90;:::o;26740:276::-;26853:14;;;26865:1;26853:14;;;;;;;;;26805:7;;26825:25;;26853:14;;;;;;;105:10:-1;26853:14:0;88:34:-1;136:17;;-1:-1;26853:14:0;26825:42;;26896:8;26880:10;26891:1;26880:13;;;;;;;;;;;;;:24;;;;;;;;;;;26917:26;26946:30;26965:10;26946:18;:30::i;:::-;26917:59;;26996:9;27006:1;26996:12;;;;;;;;;;;;;;26989:19;;;;26740:276;;;:::o;39624:233::-;14389:10;;-1:-1:-1;;;;;14389:10:0;14375;:24;14367:45;;;;;-1:-1:-1;;;;;14367:45:0;;;;;;;;;;;;-1:-1:-1;;;;;14367:45:0;;;;;;;;;;;;;;;39687:4;39679:21;:26;39671:60;;;;;-1:-1:-1;;;;;39671:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39758:10;;-1:-1:-1;;;;;39758:10:0;39750:33;39742:70;;;;;-1:-1:-1;;;;;39742:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39838:10;39825:24;14929:121;14226:10;;-1:-1:-1;;;;;14226:10:0;14212;:24;14204:45;;;;;-1:-1:-1;;;;;14204:45:0;;;;;;;;;;;;-1:-1:-1;;;;;14204:45:0;;;;;;;;;;;;;;;14989:27;15009:6;14989:19;:27::i;:::-;15027:15;15035:6;15027:7;:15::i;37027:517::-;24095:52;;;-1:-1:-1;;;;;24095:52:0;;24126:10;24095:52;;;;;;;;;;;;37099:8;;21441:42;;24095:30;;:52;;;;;;;;;;;;;;;21441:42;24095:52;;;5:2:-1;;;;30:1;27;20:12;5:2;24095:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24095:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24095:52:0;24087:90;;;;;-1:-1:-1;;;;;24087:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37348:21;37372:22;37384:9;37372:11;:22::i;:::-;37348:46;;37405:28;37436:32;37453:14;37436:16;:32::i;:::-;37481:10;;:55;;;-1:-1:-1;;;;;37481:55:0;;;;;;;;;;37405:63;;-1:-1:-1;;;;;;37481:10:0;;;;:17;;37405:63;;37481:55;;;;;:10;;:55;;;;;;;37405:63;37481:10;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;37481:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37481:55:0;;;;;24188:1;;37027:517;;:::o;37826:360::-;24095:52;;;-1:-1:-1;;;;;24095:52:0;;24126:10;24095:52;;;;;;;;;;;;37914:8;;21441:42;;24095:30;;:52;;;;;;;;;;;;;;;21441:42;24095:52;;;5:2:-1;;;;30:1;27;20:12;5:2;24095:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24095:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24095:52:0;24087:90;;;;;-1:-1:-1;;;;;24087:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37943:28;;;;;;;:58;;-1:-1:-1;1048:1:0;37975:26;;;;;37943:58;37935:99;;;;;-1:-1:-1;;;;;37935:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38131:47;;;-1:-1:-1;;;;;38131:47:0;;;;;;;;;;;;;;;;;21441:42;;38131:24;;:47;;;;;-1:-1:-1;;38131:47:0;;;;;;;-1:-1:-1;21441:42:0;38131:47;;;5:2:-1;;;;30:1;27;20:12;5:2;38131:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38131:47:0;;;;37826:360;;;:::o;25299:518::-;14389:10;;-1:-1:-1;;;;;14389:10:0;14375;:24;14367:45;;;;;-1:-1:-1;;;;;14367:45:0;;;;;;;;;;;;-1:-1:-1;;;;;14367:45:0;;;;;;;;;;;;;;;25394:10;;-1:-1:-1;;;;;25394:10:0;25386:33;25378:75;;;;;-1:-1:-1;;;;;25378:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25464:10;:47;;-1:-1:-1;;;;;;25464:47:0;-1:-1:-1;;;;;25464:47:0;;;;;;;;25545:27;;;;25544:100;;-1:-1:-1;25590:10:0;;:54;;;-1:-1:-1;;;;;25590:54:0;;-1:-1:-1;;;;;25590:54:0;;;;;;-1:-1:-1;;;;;25590:10:0;;;;:28;;:54;;;;;;;;;;;;;;;:10;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;25590:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25590:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25590:54:0;25544:100;25522:145;;;;;-1:-1:-1;;;;;25522:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25703:10;;;;;;;;;-1:-1:-1;;;;;25703:10:0;-1:-1:-1;;;;;25703:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25703:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25703:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25703:23:0;25680:20;:46;;;21855:4;-1:-1:-1;25745:39:0;25737:72;;;;;-1:-1:-1;;;;;25737:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;15518:173;14226:10;;-1:-1:-1;;;;;14226:10:0;14212;:24;14204:45;;;;;-1:-1:-1;;;;;14204:45:0;;;;;;;;;;;;-1:-1:-1;;;;;14204:45:0;;;;;;;;;;;;;;;15576:27;15596:6;15576:19;:27::i;:::-;15634:10;;15619:34;;;-1:-1:-1;;;;;15634:10:0;;;15619:34;;;;;;;;;;;;;;;;;;;;;15664:10;:19;;-1:-1:-1;;;;;;15664:19:0;-1:-1:-1;;;;;15664:19:0;;;;;;;;;;15518:173::o;21912:113::-;21997:20;;21912:113;:::o;13008:25::-;;;-1:-1:-1;;;;;13008:25:0;;:::o;23064:30::-;;;-1:-1:-1;;;;;23064:30:0;;;;-1:-1:-1;;;23064:30:0;;;;;;-1:-1:-1;;;23064:30:0;;;;;:::o;39932:275::-;14389:10;;-1:-1:-1;;;;;14389:10:0;14375;:24;14367:45;;;;;-1:-1:-1;;;;;14367:45:0;;;;;;;;;;;;-1:-1:-1;;;;;14367:45:0;;;;;;;;;;;;;;;40001:10;;-1:-1:-1;;;;;40001:10:0;39993:33;39989:211;;40051:10;;;;;;;;;-1:-1:-1;;;;;40051:10:0;-1:-1:-1;;;;;40051:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40051:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40051:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40051:21:0;:30;40043:60;;;;;-1:-1:-1;;;;;40043:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40118:10;;;;;;;;;-1:-1:-1;;;;;40118:10:0;-1:-1:-1;;;;;40118:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40118:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;40153:10:0;:35;;-1:-1:-1;;;;;;40153:35:0;;;-1:-1:-1;;39989:211:0;39932:275::o;21360:125::-;21441:42;21360:125;:::o;27847:1576::-;27939:26;27984:17;28003:20;28025:22;28051:32;28072:10;28051:20;:32::i;:::-;27983:100;;;;;;28117:9;28104;:22;;28096:53;;;;;-1:-1:-1;;;;;28096:53:0;;;;;;;;;;;;-1:-1:-1;;;;;28096:53:0;;;;;;;;;;;;;;;28270:56;;-1:-1:-1;;;;;28270:56:0;;28315:10;28270:56;;;;;;;;;;;;;;;;;;;;;21441:42;;28270:24;;28295:6;;28303:10;;28315;;28270:56;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28270:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28270:56:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28270:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28270:56:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;28270:56:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;28270:56:0;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;-1:-1;;28393:10:0;;:62;;;-1:-1:-1;;;;;28393:62:0;;;;;;;;;;;;;;;;28270:56;;-1:-1:-1;;;;;;28393:10:0;;;;-1:-1:-1;28393:23:0;;-1:-1:-1;28423:12:0;;-1:-1:-1;28270:56:0;;28448:6;;28393:62;;;;;;;;;;;;;;;;;;:10;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28393:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28393:62:0;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28393:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28393:62:0;;;;;28842:22;28853:10;28842;:22::i;:::-;28838:360;;;28886:9;28881:306;28905:9;:16;28901:1;:20;28881:306;;;28947:23;28989:10;-1:-1:-1;;;;;28973:44:0;;29018:10;29038:1;29042:9;29052:1;29042:12;;;;;;;;;;;;;;28973:86;;;;;;;;;;;;;-1:-1:-1;;;;;28973:86:0;-1:-1:-1;;;;;28973:86:0;;;;;;-1:-1:-1;;;;;28973:86:0;-1:-1:-1;;;;;28973:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28973:86:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28973:86:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28973:86:0;;-1:-1:-1;;;;;;;29086:36:0;;-1:-1:-1;;;;;29086:36:0;29078:93;;;;-1:-1:-1;;;;;29078:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28923:3:0;;28881:306;;;;28838:360;29389:26;29405:9;29389:15;:26::i;:::-;27847:1576;;;;;;:::o;38377:126::-;21855:4;38472:22;;;38377:126::o;35549:1301::-;35991:23;36030;36069:25;21618:1;-1:-1:-1;;;;;36108:32:0;;36141:9;;36108:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;36108:43:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36108:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36108:43:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;36108:43:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;36108:43:0;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;0:373;;36108:43:0;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;0:373;;36108:43:0;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;0:373;;36108:43:0;;;;;;35976:175;;;;;;36164:20;36187:1;36164:24;;36199:16;36218:6;36225:1;36218:9;;;;;;;;;;;;;;36199:28;;36238:27;36281:6;:13;36268:27;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;36268:27:0;-1:-1:-1;36238:57:0;-1:-1:-1;36313:9:0;36308:249;36332:6;:13;36328:1;:17;36308:249;;;36388:8;-1:-1:-1;;;;;36375:21:0;:6;36382:1;36375:9;;;;;;;;;;;;;;-1:-1:-1;;;;;36375:21:0;;36367:66;;;;;-1:-1:-1;;;;;36367:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36472:6;36479:1;36472:9;;;;;;;;;;;;;;36448:11;36460:1;36448:14;;;;;;;;;;;;;:34;-1:-1:-1;;;;;36448:34:0;;;-1:-1:-1;;;;;36448:34:0;;;;;36513:32;36530:11;36542:1;36530:14;;;;;;;36513:32;36497:48;;;;36347:3;;36308:249;;;-1:-1:-1;36630:78:0;;-1:-1:-1;;;;;36630:78:0;;-1:-1:-1;;;;;36630:78:0;;;;;;;;;;;;;;;;;;;21441:42;;36630:32;;36663:9;;;;36674:11;;36687:10;;36699:8;;36630:78;;;;;;;;;;;;36663:9;36630:78;;;;36663:9;36630:78;1:33:-1;99:1;81:16;;;74:27;;;137:4;117:14;;;-1:-1;;113:30;157:16;;;36630:78:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36630:78:0;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36630:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36630:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36630:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;36775:10:0;;:67;;;-1:-1:-1;;;;;36775:67:0;;;;;;;;;;;;;;-1:-1:-1;;;;;36775:10:0;;;;-1:-1:-1;36775:23:0;;-1:-1:-1;36805:12:0;;36819:9;;;;36830:11;;36775:67;;;;;;;;;36819:9;36775:67;;;;36819:9;36775:67;1:33:-1;99:1;81:16;;;74:27;;;137:4;117:14;;;-1:-1;;113:30;157:16;;;36775:67:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36775:67:0;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36775:67:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36775:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36775:67:0;;;;;35549:1301;;;;;;;;:::o;38994:138::-;39104:20;;-1:-1:-1;;;;;39090:34:0;;;38994:138;;;:::o;19758:678::-;20330:20;20420:8;;;19758:678::o;40647:555::-;40729:9;:23;;;41129:8;41114:11;:24;41104:35;;41100:95;;;41156:27;;:10;;:27;;;;;41176:6;;41156:27;;;;41176:6;41156:10;:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41156:27:0;41100:95;40647:555;;:::o;14603:175::-;-1:-1:-1;;;;;14688:27:0;;;;;;:58;;-1:-1:-1;14736:10:0;;-1:-1:-1;;;;;14719:27:0;;;14736:10;;14719:27;;14688:58;14680:90;;;;;-1:-1:-1;;;;;14680:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;15238:129;15310:10;;15295:34;;;-1:-1:-1;;;;;15310:10:0;;;15295:34;;;;;;;;;;;;;;;;;;;;;15340:10;:19;;-1:-1:-1;;;;;;15340:19:0;-1:-1:-1;;;;;15340:19:0;;;;;;;;;;15238:129::o;32874:2296::-;33172:11;:29;33441:17;;33428:31;;;;;;;;;;;;;;;;32961:17;;;;33002:22;;-1:-1:-1;;;;;33172:29:0;;;;-1:-1:-1;;;33242:31:0;;;;;;-1:-1:-1;;;33319:36:0;;;;;;33428:31;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;33428:31:0;-1:-1:-1;33419:40:0;-1:-1:-1;33477:9:0;33472:1475;33496:10;:17;33492:1;:21;33472:1475;;;33535:14;33552:10;33563:1;33552:13;;;;;;;;;;;;;;33535:30;;33580:18;398:1;33623:25;;:8;:25;;;:52;;;;-1:-1:-1;1048:1:0;33652:23;;;;;33623:52;33615:81;;;;;-1:-1:-1;;;;;33615:81:0;;;;;;;;;;;;-1:-1:-1;;;;;33615:81:0;;;;;;;;;;;;;;;33767:27;;;550:1;33767:27;33763:754;;;-1:-1:-1;33828:17:0;33763:754;;;-1:-1:-1;22158:6:0;34433:46;;;34432:69;34409:92;;;33763:754;34545:23;34557:10;34545:11;:23::i;:::-;34533:6;34540:1;34533:9;;;;;;;;;;;;;:35;-1:-1:-1;;;;;34533:35:0;;;-1:-1:-1;;;;;34533:35:0;;;;;34870:27;34887:6;34894:1;34887:9;;;;;;;34870:27;34912:23;;;34854:43;;;;-1:-1:-1;33515:3:0;;33472:1475;;;-1:-1:-1;;35101:11:0;:61;;-1:-1:-1;;;;;35101:61:0;;;-1:-1:-1;;;35101:61:0;-1:-1:-1;;35101:61:0;;;;;;;;;-1:-1:-1;32874:2296:0;;;;-1:-1:-1;32874:2296:0:o

Swarm Source

bzzr://ba3368783d58445cfa9dcff4274ab528423d2cd8e2b2937dc1ade7150f362dc9

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
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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