Contract 0x989E1Fb123b67afd66e10574c8B409bC6e812D9A 1

 

Contract Overview

Drakons: DRKNS Token
Balance:
0.‍91574938 Ether

EtherValue:
$1,693.79 (@ $1,849.62/ETH)

Token:
 
Txn Hash
Method
Block
From
To
Value
0xea8870aa91910915650560533a48beb522d7137abfdcfca1419684e47b0b6dc2Set Approval For...153470182022-08-15 16:18:233 days 7 hrs ago0xdda8a9b856d6437c3e0622f036c3187da10eae3b IN  Drakons: DRKNS Token0 Ether0.‍00144688 31.‍43892813
0xb3293c6fd728dd7874808b88fa7a1d63e901cd1f0002c1ae9bcba1263e2e4b95Transfer From153258402022-08-12 8:02:316 days 15 hrs ago0x460832ef885a18846c2ccb5de9313f944d7173ca IN  Drakons: DRKNS Token0 Ether0.‍00056373 13.‍37233654
0x6abeeefc875edfffef4960d12172e4e91691d893594dda5ed8f4a7736ff9967bTransfer From153258312022-08-12 8:01:186 days 15 hrs ago0x460832ef885a18846c2ccb5de9313f944d7173ca IN  Drakons: DRKNS Token0 Ether0.‍00082318 17.‍53066532
0xee590658cfe31861079552d493d1dfdfcd4123a44eeb178c14e865094ad4802bTransfer From153258242022-08-12 8:00:076 days 15 hrs ago0x460832ef885a18846c2ccb5de9313f944d7173ca IN  Drakons: DRKNS Token0 Ether0.‍00110424 17.‍23845339
0x0646b78d1e5af8eccde937406b6d8df61722230ae57a53dadcbe98a0d3ddc723Transfer From153244042022-08-12 2:22:426 days 21 hrs ago0x9ef8c75d9d7edc1195a0f859ade665bad177fec3 IN  Drakons: DRKNS Token0 Ether0.‍000357 7.‍60284344
0xa2457a5c103c05b78100b2631f4030f211377500869dd5e97e6f829dfc4d45c9Transfer From153244042022-08-12 2:22:426 days 21 hrs ago0x9ef8c75d9d7edc1195a0f859ade665bad177fec3 IN  Drakons: DRKNS Token0 Ether0.‍0002087 7.‍74284344
0x72ff1cda7cb7c0cbc54c4cf6b835e58ec227dc431e0ae321a8279d05ae211a36Transfer From153244042022-08-12 2:22:426 days 21 hrs ago0x9ef8c75d9d7edc1195a0f859ade665bad177fec3 IN  Drakons: DRKNS Token0 Ether0.‍000357 7.‍60284344
0x6e832bf43a13e70290dc21c4034d9706427dd1e64721c6e6e72d322d50337753Transfer From153244042022-08-12 2:22:426 days 21 hrs ago0x9ef8c75d9d7edc1195a0f859ade665bad177fec3 IN  Drakons: DRKNS Token0 Ether0.‍000357 7.‍60284344
0x8c4c64809a7458eb046ee5eae5f784bc4851af333d183eeebbd3020231739223Transfer From153244042022-08-12 2:22:426 days 21 hrs ago0x9ef8c75d9d7edc1195a0f859ade665bad177fec3 IN  Drakons: DRKNS Token0 Ether0.‍00036358 7.‍74284344
0xe499353a0e7ba23256c65006a228f4cdcf857174c269d406f16847eb58da0f6bTransfer From153244042022-08-12 2:22:426 days 21 hrs ago0x9ef8c75d9d7edc1195a0f859ade665bad177fec3 IN  Drakons: DRKNS Token0 Ether0.‍00050174 7.‍83284344
0x0ef68d7c00637c7022a60409d927ea611d16da9bffac8622bd48034525d597c4Set Approval For...153040122022-08-08 21:28:2710 days 2 hrs agoENS Name pandapapa.eth IN  Drakons: DRKNS Token0 Ether0.‍00080401 17.‍47016969
0x469bc25db07f771a24ff24c113d318e7257de3b50553db389f9f5ce41cb1f15eTransfer From152677642022-08-03 6:00:4815 days 17 hrs ago0x47cdb84a7d15aee94afa3759932b3a5411d6c03c IN  Drakons: DRKNS Token0 Ether0.‍00038775 6.‍54362379
0xfccaeadd52efca259ec012794f921ebb2effcd1df4ddc620ddb195f22d4b3257Set Approval For...152310562022-07-28 12:38:1121 days 11 hrs agoENS Name dingomick.eth IN  Drakons: DRKNS Token0 Ether0.‍00154495 63.‍85687154
0x9cd240ce23426e8ff4894046e158dfa6b9ee47305f41818f849fa3451b6f85b5Set Approval For...152092172022-07-25 3:11:3024 days 20 hrs agoCryptoTonya: Deployer IN  Drakons: DRKNS Token0 Ether0.‍00025776 10.‍65408325
0xf933a67b253e133581cd94336adffb90c435e0c3be5f5070d592bb4569a776aaSet Approval For...151987592022-07-23 11:53:3626 days 11 hrs ago0x1133d9434b1890b826d81d13234984f8fed5de87 IN  Drakons: DRKNS Token0 Ether0.‍00038099 8.‍27854766
0x40385be1d3516aa119130e9e7ef0232348a723c2ef7008d73864f0fb6ce47274Create Siring Au...151900912022-07-22 3:49:0127 days 19 hrs agoDrakons: Deployer 1 IN  Drakons: DRKNS Token0 Ether0.‍00145558 11.‍20160324
0x9edcf56992baaad4fa5a41ecde19edac4e0cfb8d1eae18c895a42e0d98c7b6bcBid On Siring Au...151884632022-07-21 21:42:4328 days 2 hrs ago0xd56b8d59605e97f770202fd77b7eb3eef07f9a9d IN  Drakons: DRKNS Token0.‍012445 Ether0.‍00107797 11.‍01804691
0x2e99580fedb3641eb4802fb89b950ca4b5f7fff0c00e9e7958afb78e9d76ba02Bid On Siring Au...151860972022-07-21 13:13:2928 days 10 hrs ago0xd56b8d59605e97f770202fd77b7eb3eef07f9a9d IN  Drakons: DRKNS Token0.‍012445 Ether0.‍00116357 11.‍893039
0xb40dc73b297e90be846f0781f47508b44231a8636d56ee75cf022af3a83148d9Bid On Siring Au...151854272022-07-21 10:41:1728 days 13 hrs ago0xd56b8d59605e97f770202fd77b7eb3eef07f9a9d IN  Drakons: DRKNS Token0.‍012445 Ether0.‍00098763 10.‍09469712
0xc11f16e0be77df53a8aee0b079c8e7c47cd393b567f2729a2e527bc2dafa979eBid On Siring Au...151853212022-07-21 10:16:4428 days 13 hrs ago0xd56b8d59605e97f770202fd77b7eb3eef07f9a9d IN  Drakons: DRKNS Token0.‍012445 Ether0.‍00106666 10.‍9024392
0x21cd915dd5dba1752262dafa3d2ca3a68439d30c5007c34075a3969e439eb2d1Bid On Siring Au...151853132022-07-21 10:14:4628 days 13 hrs ago0xd56b8d59605e97f770202fd77b7eb3eef07f9a9d IN  Drakons: DRKNS Token0.‍012445 Ether0.‍00102669 10.‍49393675
0xcf6d050f447615b3fa7ff901c9a9a2e5090cb1f12aabd881e1cd5589c168236eBid On Siring Au...151849782022-07-21 8:58:2228 days 14 hrs ago0xd56b8d59605e97f770202fd77b7eb3eef07f9a9d IN  Drakons: DRKNS Token0.‍012445 Ether0.‍00136376 13.‍93915936
0xffdd9f73c0bb552f1ca4da0aa683e1b24db3b14decfc09e07224bc691b7f7e58Bid On Siring Au...151849682022-07-21 8:54:5828 days 14 hrs ago0xd56b8d59605e97f770202fd77b7eb3eef07f9a9d IN  Drakons: DRKNS Token0.‍012445 Ether0.‍00138675 14.‍17411704
0x0184e16e1fd3a17c03970806cb3af54c33e25d4bd0ba504952788b3b2a87ca65Bid On Siring Au...151849252022-07-21 8:44:3628 days 14 hrs ago0xd56b8d59605e97f770202fd77b7eb3eef07f9a9d IN  Drakons: DRKNS Token0.‍012445 Ether0.‍00081604 8.‍340911
0x7069986b77abbbf244a3d80b229593fa5fc90569fc4a15fc3004084f6c3aa423Bid On Siring Au...151847672022-07-21 8:07:4728 days 15 hrs ago0xd56b8d59605e97f770202fd77b7eb3eef07f9a9d IN  Drakons: DRKNS Token0.‍012445 Ether0.‍00081156 8.‍29505909
[ Download CSV Export 

OVERVIEW

Drakons is a strategy game where you get to collect and play elemental dragon non-fungible tokens or NFTs called DRAKONS in the Ethereum Blockchain and Polygon Network (Matic) sidechain. Drakon Masters will get to enjoy battles in Drakon Arenas for a chance to play-to-earn loo...

Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x9edcf56992baaad4fa5a41ecde19edac4e0cfb8d1eae18c895a42e0d98c7b6bc151884632022-07-21 21:42:4328 days 2 hrs ago 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df6 Drakons: DRKNS Token0 Ether
0x9edcf56992baaad4fa5a41ecde19edac4e0cfb8d1eae18c895a42e0d98c7b6bc151884632022-07-21 21:42:4328 days 2 hrs ago Drakons: DRKNS Token 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df60.‍0001 Ether
0x2e99580fedb3641eb4802fb89b950ca4b5f7fff0c00e9e7958afb78e9d76ba02151860972022-07-21 13:13:2928 days 10 hrs ago 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df6 Drakons: DRKNS Token0 Ether
0x2e99580fedb3641eb4802fb89b950ca4b5f7fff0c00e9e7958afb78e9d76ba02151860972022-07-21 13:13:2928 days 10 hrs ago Drakons: DRKNS Token 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df60.‍0001 Ether
0xb40dc73b297e90be846f0781f47508b44231a8636d56ee75cf022af3a83148d9151854272022-07-21 10:41:1728 days 13 hrs ago 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df6 Drakons: DRKNS Token0 Ether
0xb40dc73b297e90be846f0781f47508b44231a8636d56ee75cf022af3a83148d9151854272022-07-21 10:41:1728 days 13 hrs ago Drakons: DRKNS Token 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df60.‍0001 Ether
0xc11f16e0be77df53a8aee0b079c8e7c47cd393b567f2729a2e527bc2dafa979e151853212022-07-21 10:16:4428 days 13 hrs ago 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df6 Drakons: DRKNS Token0 Ether
0xc11f16e0be77df53a8aee0b079c8e7c47cd393b567f2729a2e527bc2dafa979e151853212022-07-21 10:16:4428 days 13 hrs ago Drakons: DRKNS Token 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df60.‍0001 Ether
0x21cd915dd5dba1752262dafa3d2ca3a68439d30c5007c34075a3969e439eb2d1151853132022-07-21 10:14:4628 days 13 hrs ago 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df6 Drakons: DRKNS Token0 Ether
0x21cd915dd5dba1752262dafa3d2ca3a68439d30c5007c34075a3969e439eb2d1151853132022-07-21 10:14:4628 days 13 hrs ago Drakons: DRKNS Token 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df60.‍0001 Ether
0xcf6d050f447615b3fa7ff901c9a9a2e5090cb1f12aabd881e1cd5589c168236e151849782022-07-21 8:58:2228 days 14 hrs ago 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df6 Drakons: DRKNS Token0 Ether
0xcf6d050f447615b3fa7ff901c9a9a2e5090cb1f12aabd881e1cd5589c168236e151849782022-07-21 8:58:2228 days 14 hrs ago Drakons: DRKNS Token 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df60.‍0001 Ether
0xffdd9f73c0bb552f1ca4da0aa683e1b24db3b14decfc09e07224bc691b7f7e58151849682022-07-21 8:54:5828 days 14 hrs ago 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df6 Drakons: DRKNS Token0 Ether
0xffdd9f73c0bb552f1ca4da0aa683e1b24db3b14decfc09e07224bc691b7f7e58151849682022-07-21 8:54:5828 days 14 hrs ago Drakons: DRKNS Token 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df60.‍0001 Ether
0x0184e16e1fd3a17c03970806cb3af54c33e25d4bd0ba504952788b3b2a87ca65151849252022-07-21 8:44:3628 days 14 hrs ago 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df6 Drakons: DRKNS Token0 Ether
0x0184e16e1fd3a17c03970806cb3af54c33e25d4bd0ba504952788b3b2a87ca65151849252022-07-21 8:44:3628 days 14 hrs ago Drakons: DRKNS Token 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df60.‍0001 Ether
0x7069986b77abbbf244a3d80b229593fa5fc90569fc4a15fc3004084f6c3aa423151847672022-07-21 8:07:4728 days 15 hrs ago 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df6 Drakons: DRKNS Token0 Ether
0x7069986b77abbbf244a3d80b229593fa5fc90569fc4a15fc3004084f6c3aa423151847672022-07-21 8:07:4728 days 15 hrs ago Drakons: DRKNS Token 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df60.‍0001 Ether
0x027b6c2e42d083c341385725a3c2d2e72ea49a372419f1c35c348c6f42bc3b1f151846932022-07-21 7:53:3428 days 15 hrs ago 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df6 Drakons: DRKNS Token0 Ether
0x027b6c2e42d083c341385725a3c2d2e72ea49a372419f1c35c348c6f42bc3b1f151846932022-07-21 7:53:3428 days 15 hrs ago Drakons: DRKNS Token 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df60.‍0001 Ether
0xc42eecaca04e8fd83cb75c7f092946daa3b8fda1db23ed44aef3719310819a39151846322022-07-21 7:40:1628 days 16 hrs ago 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df6 Drakons: DRKNS Token0 Ether
0xc42eecaca04e8fd83cb75c7f092946daa3b8fda1db23ed44aef3719310819a39151846322022-07-21 7:40:1628 days 16 hrs ago Drakons: DRKNS Token 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df60.‍0001 Ether
0x0dc1af39e7c2490dde6914113ac0dae086afa2f6882ee0fcba6d084d626f5e38151842442022-07-21 6:13:1328 days 17 hrs ago 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df6 Drakons: DRKNS Token0 Ether
0x0dc1af39e7c2490dde6914113ac0dae086afa2f6882ee0fcba6d084d626f5e38151842442022-07-21 6:13:1328 days 17 hrs ago Drakons: DRKNS Token 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df60.‍0001 Ether
0x8f534edd180490ce3c795554e0033356e2ddf97cce21e38821852ac563fe8c30151840302022-07-21 5:23:5228 days 18 hrs ago 0xf8b4a0516fd612191d9009e5a1e1a1fcdbc14df6 Drakons: DRKNS Token0 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DragonCore

Compiler Version
v0.5.10+commit.5a6ea5b1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-02-05
*/

// File: contracts/Ownable.sol

pragma solidity ^0.5.10;

contract Ownable {
    address public owner;


    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor() public {
        owner = msg.sender;
    }


    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }


    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        if (newOwner != address(0)) {
            owner = newOwner;
        }
    }

}

// File: contracts/Pausable.sol

pragma solidity ^0.5.10;


contract Pausable is Ownable {
    event Pause();
    event Unpause();

    bool public paused = false;


    /**
     * @dev modifier to allow actions only when the contract IS paused
     */
    modifier whenNotPaused() {
        require(!paused);
        _;
    }

    /**
     * @dev modifier to allow actions only when the contract IS NOT paused
     */
    modifier whenPaused {
        require(paused);
        _;
    }

    /**
     * @dev called by the owner to pause, triggers stopped state
     */
    function pause() public onlyOwner whenNotPaused returns (bool) {
        paused = true;
        emit Pause();
        return true;
    }

    /**
     * @dev called by the owner to unpause, returns to normal state
     */
    function unpause() public onlyOwner whenPaused returns (bool) {
        paused = false;
        emit Unpause();
        return true;
    }
}

// File: contracts/DragonAccessControl.sol

pragma solidity ^0.5.10;



contract DragonAccessControl {
    /// @dev Emited when contract is upgraded - See README.md for updgrade plan
    event ContractUpgrade(address newContract);

    // The addresses of the accounts (or contracts) that can execute actions within each roles.
    address payable public ceoAddress;
    address payable public cioAddress;
    address payable public cmoAddress;
    address payable public cooAddress;
    address payable public cfoAddress;

    // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked
    bool public paused = false;

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

    /// @dev Access modifier for CIO-only functionality
    modifier onlyCIO() {
        require(msg.sender == cioAddress);
        _;
    }

    /// @dev Access modifier for CMO-only functionality
    modifier onlyCMO() {
        require(msg.sender == cmoAddress);
        _;
    }

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

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

    modifier onlyCLevel() {
        require(
            msg.sender == ceoAddress ||
            msg.sender == cioAddress ||
            msg.sender == cmoAddress ||
            msg.sender == cooAddress ||
            msg.sender == cfoAddress
        );
        _;
    }

    /// @dev 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 payable _newCEO) external onlyCEO {
        require(_newCEO != address(0));

        ceoAddress = _newCEO;
    }

    /// @dev Assigns a new address to act as the CIO. Only available to the current CEO.
    /// @param _newCIO The address of the new CIO
    function setCIO(address payable _newCIO) external onlyCEO {
        require(_newCIO != address(0));

        cioAddress = _newCIO;
    }

    /// @dev Assigns a new address to act as the CMO. Only available to the current CEO.
    /// @param _newCMO The address of the new CMO
    function setCMO(address payable _newCMO) external onlyCEO {
        require(_newCMO != address(0));

        cmoAddress = _newCMO;
    }

    /// @dev 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 payable _newCOO) external onlyCEO {
        require(_newCOO != address(0));

        cooAddress = _newCOO;
    }

    /// @dev 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) external onlyCEO {
        require(_newCFO != address(0));

        cfoAddress = _newCFO;
    }

    /// @dev Modifier to allow actions only when the contract IS NOT paused
    modifier whenNotPaused() {
        require(!paused);
        _;
    }

    /// @dev Modifier to allow actions only when the contract IS paused
    modifier whenPaused {
        require(paused);
        _;
    }

    /// @dev Called by any "C-level" role to pause the contract. Used only when
    ///  a bug or exploit is detected and we need to limit damage.
    function pause() external onlyCLevel whenNotPaused {
        paused = true;
    }

    /// @dev Unpauses the smart contract. Can only be called by the CEO, since
    ///  one reason we may pause the contract is when CIO or CMO accounts are
    ///  compromised.
    /// @notice This is public rather than external so it can be called by
    ///  derived contracts.
    function unpause() public onlyCEO whenPaused {
        // can't unpause if contract was upgraded
        paused = false;
    }
}

// File: contracts/DragonERC721.sol

pragma solidity ^0.5.10;


/// @title ERC-721 Non-Fungible Token Standard
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x80ac58cd.
interface ERC721 /* is ERC165 */ {
    /// @dev This emits when ownership of any NFT changes by any mechanism.
    ///  This event emits when NFTs are created (`from` == 0) and destroyed
    ///  (`to` == 0). Exception: during contract creation, any number of NFTs
    ///  may be created and assigned without emitting Transfer. At the time of
    ///  any transfer, the approved address for that NFT (if any) is reset to none.
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    /// @dev This emits when the approved address for an NFT is changed or
    ///  reaffirmed. The zero address indicates there is no approved address.
    ///  When a Transfer event emits, this also indicates that the approved
    ///  address for that NFT (if any) is reset to none.
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

    /// @dev This emits when an operator is enabled or disabled for an owner.
    ///  The operator can manage all NFTs of the owner.
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /// @notice Count all NFTs assigned to an owner
    /// @dev NFTs assigned to the zero address are considered invalid, and this
    ///  function throws for queries about the zero address.
    /// @param _owner An address for whom to query the balance
    /// @return The number of NFTs owned by `_owner`, possibly zero
    function balanceOf(address _owner) external view returns (uint256);

    /// @notice Find the owner of an NFT
    /// @dev NFTs assigned to zero address are considered invalid, and queries
    ///  about them do throw.
    /// @param _tokenId The identifier for an NFT
    /// @return The address of the owner of the NFT
    function ownerOf(uint256 _tokenId) external view returns (address);

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to "".
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;

    /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
    ///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
    ///  THEY MAY BE PERMANENTLY LOST
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function transferFrom(address _from, address _to, uint256 _tokenId) external payable;

    /// @notice Change or reaffirm the approved address for an NFT
    /// @dev The zero address indicates there is no approved address.
    ///  Throws unless `msg.sender` is the current NFT owner, or an authorized
    ///  operator of the current owner.
    /// @param _approved The new approved NFT controller
    /// @param _tokenId The NFT to approve
    function approve(address _approved, uint256 _tokenId) external payable;

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///  all of `msg.sender`'s assets
    /// @dev Emits the ApprovalForAll event. The contract MUST allow
    ///  multiple operators per owner.
    /// @param _operator Address to add to the set of authorized operators
    /// @param _approved True if the operator is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external;

    /// @notice Get the approved address for a single NFT
    /// @dev Throws if `_tokenId` is not a valid NFT.
    /// @param _tokenId The NFT to find the approved address for
    /// @return The approved address for this NFT, or the zero address if there is none
    function getApproved(uint256 _tokenId) external view returns (address);

    /// @notice Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the NFTs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

interface ERC165 {
    /// @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.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

interface ERC721TokenReceiver {
    /// @notice Handle the receipt of an NFT
    /// @dev The ERC721 smart contract calls this function on the recipient
    ///  after a `transfer`. This function MAY throw to revert and reject the
    ///  transfer. Return of other than the magic value MUST result in the
    ///  transaction being reverted.
    ///  Note: the 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(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    ///  unless throwing
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4);
}

/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
/// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
///  Note: the ERC-165 identifier for this interface is 0x5b5e139f
interface ERC721Metadata /* is IERC721Base */ {
  /// @notice A descriptive name for a collection of NFTs in this contract
  function name() external pure returns (string memory _name);

  /// @notice An abbreviated name for NFTs in this contract
  function symbol() external pure returns (string memory _symbol);

  /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
  /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
  ///  3986. The URI may point to a JSON file that conforms to the "ERC721
  ///  Metadata JSON Schema".
  function tokenURI(uint256 _tokenId) external view returns (string memory);
}

/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x780e9d63.
interface ERC721Enumerable /* is ERC721 */ {
    /// @notice Count NFTs tracked by this contract
    /// @return A count of valid NFTs tracked by this contract, where each one of
    ///  them has an assigned and queryable owner not equal to the zero address
    function totalSupply() external view returns (uint256);

    /// @notice Enumerate valid NFTs
    /// @dev Throws if `_index` >= `totalSupply()`.
    /// @param _index A counter less than `totalSupply()`
    /// @return The token identifier for the `_index`th NFT,
    ///  (sort order not specified)
    function tokenByIndex(uint256 _index) external view returns (uint256);

    /// @notice Enumerate NFTs assigned to an owner
    /// @dev Throws if `_index` >= `balanceOf(_owner)` or if
    ///  `_owner` is the zero address, representing invalid NFTs.
    /// @param _owner An address where we are interested in NFTs owned by them
    /// @param _index A counter less than `balanceOf(_owner)`
    /// @return The token identifier for the `_index`th NFT assigned to `_owner`,
    ///   (sort order not specified)
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
}

//contract DragonERC721 is IERC721, ERC721Metadata, ERC721TokenReceiver, ERC721Enumerable {
contract DragonERC721 is ERC165, ERC721, ERC721Metadata, ERC721TokenReceiver, ERC721Enumerable {

    mapping (bytes4 => bool) internal supportedInterfaces;

    string public tokenURIPrefix = "https://www.drakons.io/server/api/dragon/metadata/";
    string public tokenURISuffix = "";

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

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

    function supportsInterface(bytes4 interfaceID) external view returns (bool) {
        return supportedInterfaces[interfaceID];
    }

    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4){
        return bytes4(keccak256("onERC721Received(address,uint256,bytes)"));
    }

}

// File: contracts/ClockAuctionBase.sol

pragma solidity ^0.5.10;


contract ClockAuctionBase {

    // Represents an auction on an NFT
    struct Auction {
        // Current owner of NFT
        address payable seller;
        // Price (in wei) at beginning of auction
        uint128 startingPrice;
        // Price (in wei) at end of auction
        uint128 endingPrice;
        // Duration (in seconds) of auction
        uint64 duration;
        // Time when auction started
        // NOTE: 0 if this auction has been concluded
        uint64 startedAt;
    }

    // Reference to contract tracking NFT ownership
    DragonERC721 public nonFungibleContract;

    // Cut owner takes on each auction, measured in basis points (1/100 of a percent).
    // Values 0-10,000 map to 0%-100%
    uint256 public ownerCut;

    address payable public ceoAddress;
    address payable public cfoAddress;

    modifier onlyCEOCFO() {
        require(
            msg.sender == ceoAddress ||
            msg.sender == cfoAddress
        );
        _;
    }

    modifier onlyCEO() {
        require(msg.sender == ceoAddress);
        _;
    }

    // Map from token ID to their corresponding auction.
    mapping (uint256 => Auction) tokenIdToAuction;

    event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);
    event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address buyer, address seller);
    event AuctionCancelled(uint256 tokenId);


    function setCEO(address payable _newCEO) external onlyCEO {
        require(_newCEO != address(0));

        ceoAddress = _newCEO;
    }

    function setCFO(address payable _newCFO) external onlyCEO {
        require(_newCFO != address(0));

        cfoAddress = _newCFO;
    }

    /// @dev Returns true if the claimant owns the token.
    /// @param _claimant - Address claiming to own the token.
    /// @param _tokenId - ID of token whose ownership to verify.
    function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {
        return (nonFungibleContract.ownerOf(_tokenId) == _claimant);
    }

    /// @dev Escrows the NFT, assigning ownership to this contract.
    /// Throws if the escrow fails.
    /// @param _owner - Current owner address of token to escrow.
    /// @param _tokenId - ID of token whose approval to verify.
    function _escrow(address _owner, uint256 _tokenId) internal {
        // it will throw if transfer fails
        nonFungibleContract.transferFrom(_owner, address(this), _tokenId);
    }

    /// @dev Transfers an NFT owned by this contract to another address.
    /// Returns true if the transfer succeeds.
    /// @param _receiver - Address to transfer NFT to.
    /// @param _tokenId - ID of token to transfer.
    function _transfer(address _receiver, uint256 _tokenId) internal {
        // it will throw if transfer fails
        //nonFungibleContract.transfer(_receiver, _tokenId);
        nonFungibleContract.transferFrom(address(this), _receiver, _tokenId);
    }

    /// @dev Adds an auction to the list of open auctions. Also fires the
    ///  AuctionCreated event.
    /// @param _tokenId The ID of the token to be put on auction.
    /// @param _auction Auction to add.
    function _addAuction(uint256 _tokenId, Auction memory _auction) internal {
        // Require that all auctions have a duration of
        // at least one minute. (Keeps our math from getting hairy!)
        require(_auction.duration >= 1 minutes);

        tokenIdToAuction[_tokenId] = _auction;

        //cpt added emit
        emit AuctionCreated(
            uint256(_tokenId),
            uint256(_auction.startingPrice),
            uint256(_auction.endingPrice),
            uint256(_auction.duration)
        );
    }

    /// @dev Cancels an auction unconditionally.
    function _cancelAuction(uint256 _tokenId, address _seller) internal {
        _removeAuction(_tokenId);
        _transfer(_seller, _tokenId);
        emit AuctionCancelled(_tokenId);
    }

    /// @dev Computes the price and transfers winnings.
    /// Does NOT transfer ownership of token.
    function _bid(uint256 _tokenId, uint256 _bidAmount)
    internal
    returns (uint256)
    {
        // Get a reference to the auction struct
        Auction storage auction = tokenIdToAuction[_tokenId];

        // Explicitly check that this auction is currently live.
        // (Because of how Ethereum mappings work, we can't just count
        // on the lookup above failing. An invalid _tokenId will just
        // return an auction object that is all zeros.)
        require(_isOnAuction(auction));

        // Check that the bid is greater than or equal to the current price
        uint256 price = _currentPrice(auction);
        require(_bidAmount >= price);

        // Grab a reference to the seller before the auction struct
        // gets deleted.
        address payable seller = auction.seller;

        // The bid is good! Remove the auction before sending the fees
        // to the sender so we can't have a reentrancy attack.
        _removeAuction(_tokenId);

        // Transfer proceeds to seller (if there are any!)
        if (price > 0) {
            // Calculate the auctioneer's cut.
            // (NOTE: _computeCut() is guaranteed to return a
            // value <= price, so this subtraction can't go negative.)
            uint256 auctioneerCut = _computeCut(price);
            uint256 sellerProceeds = price - auctioneerCut;

            // NOTE: Doing a transfer() in the middle of a complex
            // method like this is generally discouraged because of
            // reentrancy attacks and DoS attacks if the seller is
            // a contract with an invalid fallback function. We explicitly
            // guard against reentrancy attacks by removing the auction
            // before calling transfer(), and the only thing the seller
            // can DoS is the sale of their own asset! (And if it's an
            // accident, they can call cancelAuction(). )
            seller.transfer(sellerProceeds);
        }

        // Calculate any excess funds included with the bid. If the excess
        // is anything worth worrying about, transfer it back to bidder.
        // NOTE: We checked above that the bid amount is greater than or
        // equal to the price so this cannot underflow.
        uint256 bidExcess = _bidAmount - price;

        // Return the funds. Similar to the previous transfer, this is
        // not susceptible to a re-entry attack because the auction is
        // removed before any transfers occur.
        msg.sender.transfer(bidExcess);

        // Tell the world!
        emit AuctionSuccessful(_tokenId, price, msg.sender, seller);

        return price;
    }

    /// @dev Removes an auction from the list of open auctions.
    /// @param _tokenId - ID of NFT on auction.
    function _removeAuction(uint256 _tokenId) internal {
        delete tokenIdToAuction[_tokenId];
    }

    /// @dev Returns true if the NFT is on auction.
    /// @param _auction - Auction to check.
    function _isOnAuction(Auction storage _auction) internal view returns (bool) {
        return (_auction.startedAt > 0);
    }

    /// @dev Returns current price of an NFT on auction. Broken into two
    ///  functions (this one, that computes the duration from the auction
    ///  structure, and the other that does the price computation) so we
    ///  can easily test that the price computation works correctly.
    function _currentPrice(Auction storage _auction)
    internal
    view
    returns (uint256)
    {
        uint256 secondsPassed = 0;

        // A bit of insurance against negative values (or wraparound).
        // Probably not necessary (since Ethereum guarnatees that the
        // now variable doesn't ever go backwards).
        if (now > _auction.startedAt) {
            secondsPassed = now - _auction.startedAt;
        }

        return _computeCurrentPrice(
            _auction.startingPrice,
            _auction.endingPrice,
            _auction.duration,
            secondsPassed
        );
    }

    /// @dev Computes the current price of an auction. Factored out
    ///  from _currentPrice so we can run extensive unit tests.
    ///  When testing, make this function public and turn on
    ///  `Current price computation` test suite.
    function _computeCurrentPrice(
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        uint256 _secondsPassed
    )
    internal
    pure
    returns (uint256)
    {
        // NOTE: We don't use SafeMath (or similar) in this function because
        //  all of our public functions carefully cap the maximum values for
        //  time (at 64-bits) and currency (at 128-bits). _duration is
        //  also known to be non-zero (see the require() statement in
        //  _addAuction())
        if (_secondsPassed >= _duration) {
            // We've reached the end of the dynamic pricing portion
            // of the auction, just return the end price.
            return _endingPrice;
        } else {
            // Starting price can be higher than ending price (and often is!), so
            // this delta can be negative.
            int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);

            // This multiplication can't overflow, _secondsPassed will easily fit within
            // 64-bits, and totalPriceChange will easily fit within 128-bits, their product
            // will always fit within 256-bits.
            int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);

            // currentPriceChange can be negative, but if so, will have a magnitude
            // less that _startingPrice. Thus, this result will always end up positive.
            int256 currentPrice = int256(_startingPrice) + currentPriceChange;

            return uint256(currentPrice);
        }
    }

    /// @dev Computes owner's cut of a sale.
    /// @param _price - Sale price of NFT.
    function _computeCut(uint256 _price) internal view returns (uint256) {
        // NOTE: We don't use SafeMath (or similar) in this function because
        //  all of our entry functions carefully cap the maximum values for
        //  currency (at 128-bits), and ownerCut <= 10000 (see the require()
        //  statement in the ClockAuction constructor). The result of this
        //  function is always guaranteed to be <= _price.
        return _price * ownerCut / 10000;
    }
}

// File: contracts/ClockAuction.sol

pragma solidity ^0.5.10;



contract ClockAuction is Pausable, ClockAuctionBase {

    /// @dev The ERC-165 interface signature for ERC-721.
    ///  Ref: https://github.com/ethereum/EIPs/issues/165
    ///  Ref: https://github.com/ethereum/EIPs/issues/721
    //bytes4 constant InterfaceSignature_ERC721 = bytes4(0x5b5e139f);
    bytes4 constant InterfaceSignature_ERC721 = bytes4(0x80ac58cd);

    /// @dev Constructor creates a reference to the NFT ownership contract
    ///  and verifies the owner cut is in the valid range.
    /// @param _nftAddress - address of a deployed contract implementing
    ///  the Nonfungible Interface.
    /// @param _cut - percent cut the owner takes on each auction, must be
    ///  between 0-10,000.
    constructor (address _nftAddress, uint256 _cut) public {
        require(_cut <= 10000);
        ownerCut = _cut;

        ceoAddress = msg.sender;
        cfoAddress = msg.sender;

        DragonERC721 candidateContract = DragonERC721(_nftAddress);
        //require(candidateContract.supportsInterface(InterfaceSignature_ERC721));
        nonFungibleContract = candidateContract;
    }


    /// @dev Remove all Ether from the contract, which is the owner's cuts
    ///  as well as any Ether sent directly to the contract address.
    ///  Always transfers to the NFT contract, but can be called either by
    ///  the owner or the NFT contract.
    function withdrawBalance() external {
        address payable nftAddress = address(uint160(address(nonFungibleContract)));

        require(
            msg.sender == owner ||
            msg.sender == nftAddress
        );
        // We are using this boolean method to make sure that even if one fails it will still work
        //bool res = nftAddress.send(address(this).balance);
        nftAddress.transfer(address(this).balance);
    }

    /// @dev Creates and begins a new auction.
    /// @param _tokenId - ID of token to auction, sender must be owner.
    /// @param _startingPrice - Price of item (in wei) at beginning of auction.
    /// @param _endingPrice - Price of item (in wei) at end of auction.
    /// @param _duration - Length of time to move between starting
    ///  price and ending price (in seconds).
    /// @param _seller - Seller, if not the message sender
    function createAuction(
        uint256 _tokenId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        address payable _seller
    )
    external
    whenNotPaused
    {
        // Sanity check that no inputs overflow how many bits we've allocated
        // to store them in the auction struct.
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));

        require(_owns(msg.sender, _tokenId));
        _escrow(msg.sender, _tokenId);
        Auction memory auction = Auction(
            _seller,
            uint128(_startingPrice),
            uint128(_endingPrice),
            uint64(_duration),
            uint64(now)
        );
        _addAuction(_tokenId, auction);
    }

    /// @dev Bids on an open auction, completing the auction and transferring
    ///  ownership of the NFT if enough Ether is supplied.
    /// @param _tokenId - ID of token to bid on.
    function bid(uint256 _tokenId)
    external
    payable
    whenNotPaused
    {
        // _bid will throw if the bid or funds transfer fails
        _bid(_tokenId, msg.value);
        _transfer(msg.sender, _tokenId);
    }

    /// @dev Cancels an auction that hasn't been won yet.
    ///  Returns the NFT to original owner.
    /// @notice This is a state-modifying function that can
    ///  be called while the contract is paused.
    /// @param _tokenId - ID of token on auction
    function cancelAuction(uint256 _tokenId)
    external
    {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        address seller = auction.seller;
        require(msg.sender == seller || msg.sender == address(nonFungibleContract));
        _cancelAuction(_tokenId, seller);
    }

    /// @dev Cancels an auction when the contract is paused.
    ///  Only the owner may do this, and NFTs are returned to
    ///  the seller. This should only be used in emergencies.
    /// @param _tokenId - ID of the NFT on auction to cancel.
    function cancelAuctionWhenPaused(uint256 _tokenId)
    whenPaused
    onlyOwner
    external
    {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        _cancelAuction(_tokenId, auction.seller);
    }

    /// @dev Returns auction info for an NFT on auction.
    /// @param _tokenId - ID of NFT on auction.
    function getAuction(uint256 _tokenId)
    external
    view
    returns
    (
        address payable seller,
        uint256 startingPrice,
        uint256 endingPrice,
        uint256 duration,
        uint256 startedAt
    ) {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        return (
        auction.seller,
        auction.startingPrice,
        auction.endingPrice,
        auction.duration,
        auction.startedAt
        );
    }

    /// @dev Returns the current price of an auction.
    /// @param _tokenId - ID of the token price we are checking.
    function getCurrentPrice(uint256 _tokenId)
    external
    view
    returns (uint256)
    {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        return _currentPrice(auction);
    }
}

// File: contracts/SaleClockAuction.sol

pragma solidity ^0.5.10;


contract SaleClockAuction is ClockAuction {

    // @dev Sanity check that allows us to ensure that we are pointing to the
    //  right auction in our setSaleAuctionAddress() call.
    bool public isSaleClockAuction = true;

    // Delegate constructor
    constructor(address _nftAddr, uint256 _cut) public
    ClockAuction(_nftAddr, _cut) {}

    /// @dev Creates and begins a new auction.
    /// @param _tokenId - ID of token to auction, sender must be owner.
    /// @param _startingPrice - Price of item (in wei) at beginning of auction.
    /// @param _endingPrice - Price of item (in wei) at end of auction.
    /// @param _duration - Length of auction (in seconds).
    /// @param _seller - Seller, if not the message sender
    function createAuction(
        uint256 _tokenId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        address payable _seller
    )
    external
    {
        // Sanity check that no inputs overflow how many bits we've allocated
        // to store them in the auction struct.
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));

        require(msg.sender == address(nonFungibleContract));
        _escrow(_seller, _tokenId);

        Auction memory auction = Auction(
            _seller,
            uint128(_startingPrice),
            uint128(_endingPrice),
            uint64(_duration),
            uint64(now)
        );
        _addAuction(_tokenId, auction);
    }

    /// @dev Updates lastSalePrice if seller is the nft contract
    /// Otherwise, works the same as default bid method.
    function bid(uint256 _tokenId)
    external
    payable
    {
        // _bid verifies token ID size
        _bid(_tokenId, msg.value);
        _transfer(msg.sender, _tokenId);
    }

    function setOwnerCut(uint256 val) external onlyCEOCFO {
        ownerCut = val;
    }
}

// File: contracts/SiringClockAuction.sol

pragma solidity ^0.5.10;


contract SiringClockAuction is ClockAuction {

    // @dev Sanity check that allows us to ensure that we are pointing to the
    //  right auction in our setSiringAuctionAddress() call.
    bool public isSiringClockAuction = true;

    // Delegate constructor
    constructor(address _nftAddr, uint256 _cut) public
    ClockAuction(_nftAddr, _cut) {}

    /// @dev Creates and begins a new auction. Since this function is wrapped,
    /// require sender to be DragonCore contract.
    /// @param _tokenId - ID of token to auction, sender must be owner.
    /// @param _startingPrice - Price of item (in wei) at beginning of auction.
    /// @param _endingPrice - Price of item (in wei) at end of auction.
    /// @param _duration - Length of auction (in seconds).
    /// @param _seller - Seller, if not the message sender
    function createAuction(
        uint256 _tokenId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        address payable _seller
    )
    external
    {
        // Sanity check that no inputs overflow how many bits we've allocated
        // to store them in the auction struct.
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));

        require(msg.sender == address(nonFungibleContract));
        _escrow(_seller, _tokenId);
        Auction memory auction = Auction(
            _seller,
            uint128(_startingPrice),
            uint128(_endingPrice),
            uint64(_duration),
            uint64(now)
        );
        _addAuction(_tokenId, auction);
    }

    /// @dev Places a bid for siring. Requires the sender
    /// is the DragonCore contract because all bid methods
    /// should be wrapped. Also returns the Dragon to the
    /// seller rather than the winner.
    function bid(uint256 _tokenId)
    external
    payable
    {
        require(msg.sender == address(nonFungibleContract));
        address seller = tokenIdToAuction[_tokenId].seller;
        // _bid checks that token ID is valid and will throw if bid fails
        _bid(_tokenId, msg.value);
        // We transfer the dragon back to the seller, the winner will get
        // the offspring
        _transfer(seller, _tokenId);
    }

    function setOwnerCut(uint256 val) external onlyCEOCFO {
        ownerCut = val;
    }

}

// File: contracts/DragonBase.sol

pragma solidity ^0.5.10;





contract DragonBase is DragonAccessControl, DragonERC721 {

    event Birth(address owner, uint256 dragonId, uint256 matronId, uint256 sireId, uint256 dna, uint32 generation, uint64 runeLevel);
    event DragonAssetsUpdated(uint256 _dragonId, uint64 _rune, uint64 _agility, uint64 _strength, uint64 _intelligence);
    event DragonAssetRequest(uint256 _dragonId);
    //event Transfer(address from, address to, uint256 tokenId, uint32 generation);

    struct Dragon {
        // The Dragon's genetic code is packed into these 256-bits.
        uint256 dna;
        uint64 birthTime;
        uint64 breedTime;
        uint32 matronId;
        uint32 sireId;
        uint32 siringWithId;
        uint32 generation;
    }

    struct DragonAssets {
        uint64 runeLevel;
        uint64 agility;
        uint64 strength;
        uint64 intelligence;
    }

    Dragon[] dragons;
    mapping (uint256 => address) public dragonIndexToOwner;
    mapping (address => uint256) ownershipTokenCount;
    mapping (uint256 => address) public dragonIndexToApproved;
    mapping (uint256 => address) public sireAllowedToAddress;
    mapping (uint256 => DragonAssets) public dragonAssets;

    mapping (address => mapping (address => bool)) internal authorised;

    uint256 public updateAssetFee = 8 finney;

    SaleClockAuction public saleAuction;
    SiringClockAuction public siringAuction;

    modifier isValidToken(uint256 _tokenId) {
        require(dragonIndexToOwner[_tokenId] != address(0));
        _;
    }

    /// @dev Assigns ownership of a specific Dragon to an address.
    function _transfer(address _from, address _to, uint256 _tokenId) internal {
        // Since the number of dragons is capped to 2^32 we can't overflow this
        // Declaration: mapping (address => uint256) ownershipTokenCount;
        ownershipTokenCount[_to]++;
        // transfer ownership
        // Declaration: mapping (uint256 => address) public dragonIndexToOwner;
        dragonIndexToOwner[_tokenId] = _to;
        // When creating new dragons _from is 0x0, but we can't account that address.
        if (_from != address(0)) {
            ownershipTokenCount[_from]--;
            // once the dragon is transferred also clear sire allowances
            delete sireAllowedToAddress[_tokenId];
            // clear any previously approved ownership exchange
            delete dragonIndexToApproved[_tokenId];
        }

        //Dragon storage dragon = dragons[_tokenId];

        // Emit the transfer event.
        emit Transfer(_from, _to, _tokenId);
    }

    /// @dev An internal method that creates a new dragon and stores it. This
    ///  method doesn't do any checking and should only be called when the
    ///  input data is known to be valid. Will generate both a Birth event
    ///  and a Transfer event.
    /// @param _matronId The dragon ID of the matron of this dragon (zero for firstGen)
    /// @param _sireId The dragon ID of the sire of this dragon (zero for firstGen)
    /// @param _generation The generation number of this dragon, must be computed by caller.
    /// @param _dna The dragon's genetic code.
    /// @param _agility The dragon's agility
    /// @param _strength The dragon's strength
    /// @param _intelligence The dragon's intelligence
    /// @param _runelevel The dragon's rune level
    /// @param _owner The inital owner of this dragon, must be non-zero (except for the mythical beast, ID 0)
    function _createDragon(
        uint256 _matronId,
        uint256 _sireId,
        uint256 _generation,
        uint256 _dna,
        uint64 _agility,
        uint64 _strength,
        uint64 _intelligence,
        uint64 _runelevel,
        address _owner
    )
    internal
    returns (uint)
    {
        require(_matronId == uint256(uint32(_matronId)));
        require(_sireId == uint256(uint32(_sireId)));
        require(_generation == uint256(uint32(_generation)));

        Dragon memory _dragon = Dragon({
            dna: _dna,
            birthTime: uint64(now),
            breedTime: 0,
            matronId: uint32(_matronId),
            sireId: uint32(_sireId),
            siringWithId: 0,
            generation: uint32(_generation)
            });

        DragonAssets memory _dragonAssets = DragonAssets({
            runeLevel: _runelevel,
            agility: _agility,
            strength: _strength,
            intelligence: _intelligence
            });

        uint256 newDragonId = dragons.push(_dragon) - 1;

        dragonAssets[newDragonId] = _dragonAssets;

        // It's probably never going to happen, 4 billion dragons is A LOT, but
        // let's just be 100% sure we never let this happen.
        require(newDragonId == uint256(uint32(newDragonId)));

        // emit the birth event
        emit Birth(
            _owner,
            newDragonId,
            uint256(_dragon.matronId),
            uint256(_dragon.sireId),
            _dragon.dna,
            _dragon.generation,
            _runelevel
        );

        // This will assign ownership, and also emit the Transfer event as
        // per ERC721 draft
        _transfer(address(0), _owner, newDragonId);

        return newDragonId;
    }

    function setUpdateAssetFee(uint256 newFee) external onlyCLevel {
        updateAssetFee = newFee;
    }


    function updateDragonAsset(uint256 _dragonId, uint64 _rune, uint64 _agility, uint64 _strength, uint64 _intelligence)
    external
    whenNotPaused
    onlyCOO
    {

        DragonAssets storage currentDragonAsset = dragonAssets[_dragonId];

        require(_rune > currentDragonAsset.runeLevel);
        require(_agility >= currentDragonAsset.agility);
        require(_strength >= currentDragonAsset.strength);
        require(_intelligence >= currentDragonAsset.intelligence);

        DragonAssets memory _dragonAsset = DragonAssets({
            runeLevel: _rune,
            agility: _agility,
            strength: _strength,
            intelligence: _intelligence
            });

        dragonAssets[_dragonId] = _dragonAsset;
        msg.sender.transfer(updateAssetFee);
        emit DragonAssetsUpdated(_dragonId, _rune, _agility, _strength, _intelligence);

    }

    function requestAssetUpdate(uint256 _dragonId, uint256 _rune)
    external
    payable
    whenNotPaused
    {
        require(msg.value >= updateAssetFee);

        DragonAssets storage currentDragonAsset = dragonAssets[_dragonId];
        require(_rune > currentDragonAsset.runeLevel);

        emit DragonAssetRequest(_dragonId);

        //assetManagement.requestAssetUpdate.value(msg.value)(_dragonId);
    }

    /// @notice Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the NFTs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns (bool)
    {
        return authorised[_owner][_operator];
    }

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///  all of `msg.sender`'s assets
    /// @dev Emits the ApprovalForAll event. The contract MUST allow
    ///  multiple operators per owner.
    /// @param _operator Address to add to the set of authorized operators
    /// @param _approved True if the operator is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external
    {
        emit ApprovalForAll(msg.sender,_operator, _approved);
        authorised[msg.sender][_operator] = _approved;
    }

    function tokenURI(uint256 _tokenId) external view isValidToken(_tokenId) returns (string memory)
    {
        uint maxlength = 78;
        bytes memory reversed = new bytes(maxlength);
        uint i = 0;
        uint _tmpTokenId = _tokenId;
        uint _offset = 48;

        bytes memory _uriBase;
        _uriBase = bytes(tokenURIPrefix);

        while (_tmpTokenId != 0) {
            uint remainder = _tmpTokenId % 10;
            _tmpTokenId = _tmpTokenId / 10;
            reversed[i++] = byte(uint8(_offset + remainder));
        }

        bytes memory s = new bytes(_uriBase.length + i);
        uint j;

        //add the base to the final array
        for (j = 0; j < _uriBase.length; j++) {
            s[j] = _uriBase[j];
        }
        //add the tokenId to the final array
        for (j = 0; j < i; j++) {
            s[j + _uriBase.length] = reversed[i - 1 - j];
        }
        //turn it into a string and return it
        return string(s);
    }
}

// File: contracts/DragonOwnership.sol

pragma solidity ^0.5.10;


/// @title The facet of the BlockDragons core contract that manages ownership, ERC-721 (draft) compliant.
/// @author Zynappse Corporation (https://www.zynapse.com)
/// @dev Ref: https://github.com/ethereum/EIPs/issues/721
///  @dev Refer to the Dragon contract documentation for details in contract interactions.
contract DragonOwnership is DragonBase {

    /// @notice Name and symbol of the non fungible token, as defined in ERC721.
    string public constant name = "Drakons";
    string public constant symbol = "DRKNS";

    //bytes4 constant InterfaceSignature_ERC165 = bytes4(keccak256('supportsInterface(bytes4)'));

    //bytes4 constant InterfaceSignature_ERC721 =
    //bytes4(keccak256('name()')) ^
    //bytes4(keccak256('symbol()')) ^
    //bytes4(keccak256('totalSupply()')) ^
    //bytes4(keccak256('balanceOf(address)')) ^
    //bytes4(keccak256('ownerOf(uint256)')) ^
    //bytes4(keccak256('approve(address,uint256)')) ^
    //bytes4(keccak256('transfer(address,uint256)')) ^
    //bytes4(keccak256('transferFrom(address,address,uint256)')) ^
    //bytes4(keccak256('tokensOfOwner(address)')) ^
    //bytes4(keccak256('tokenMetadata(uint256,string)'));

    /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).
    ///  Returns true for any standardized interfaces implemented by this contract. We implement
    ///  ERC-165 (obviously!) and ERC-721.
    //function supportsInterface(bytes4 _interfaceID) external view returns (bool)
    //{
    //    return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));
    //}

    function setTokenURIAffixes(string calldata _prefix, string calldata _suffix) external onlyCEO {
        tokenURIPrefix = _prefix;
        tokenURISuffix = _suffix;
    }

    /// @dev Checks if a given address is the current owner of a particular Dragon.
    /// @param _claimant the address we are validating against.
    /// @param _tokenId dragon id, only valid when > 0
    function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {
        return dragonIndexToOwner[_tokenId] == _claimant;
    }

    /// @dev Checks if a given address currently has transferApproval for a particular Dragon.
    /// @param _claimant the address we are confirming dragon is approved for.
    /// @param _tokenId dragon id, only valid when > 0
    function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {
        return dragonIndexToApproved[_tokenId] == _claimant;
    }

    /// @dev Marks an address as being approved for transferFrom(), overwriting any previous
    ///  approval. Setting _approved to address(0) clears all transfer approval.
    ///  NOTE: _approve() does NOT send the Approval event. This is intentional because
    ///  _approve() and transferFrom() are used together for putting Dragons on auction, and
    ///  there is no value in spamming the log with Approval events in that case.
    function _approve(uint256 _tokenId, address _approved) internal {
        dragonIndexToApproved[_tokenId] = _approved;
    }

    /// @notice Returns the number of Dragons owned by a specific address.
    /// @param _owner The owner address to check.
    /// @dev Required for ERC-721 compliance
    function balanceOf(address _owner) public view returns (uint256 count) {
        return ownershipTokenCount[_owner];
    }

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) public payable
    {
        require(_to != address(0));
        require(_to != address(this));
        require(_to != address(saleAuction));
        require(_to != address(siringAuction));

        // Check for approval and valid ownership
        //require(_approvedFor(msg.sender, _tokenId));
        //require(_owns(_from, _tokenId));
        address owner = ownerOf(_tokenId);
        require(owner == _from);
        require (owner == msg.sender || dragonIndexToApproved[_tokenId] == msg.sender || authorised[owner][msg.sender]);

        // Reassign ownership, clearing pending approvals and emitting Transfer event.
        _transfer(_from, _to, _tokenId);

        uint32 size;
        assembly {
            size := extcodesize(_to)
        }

        if(size > 0) {
            ERC721TokenReceiver receiver = ERC721TokenReceiver(_to);
            require(receiver.onERC721Received(msg.sender,_from,_tokenId,data) == bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")));
        }
    }

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to "".
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable
    {
        safeTransferFrom(_from, _to, _tokenId, "");
    }

    /// @notice Transfers a Dragon to another address. If transferring to a smart
    ///  contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or
    ///  BlockDragonz specifically) or your Dragon may be lost forever. Seriously.
    /// @param _to The address of the recipient, can be a user or contract.
    /// @param _tokenId The ID of the Dragon to transfer.
    function transfer(
        address _to,
        uint256 _tokenId
    )
    external
    whenNotPaused
    {
        // Safety check to prevent against an unexpected 0x0 default.
        require(_to != address(0));
        // Disallow transfers to this contract to prevent accidental misuse.
        // The contract should never own any dragons (except very briefly
        // after a firstGen dragon is created and before it goes on auction).
        require(_to != address(this));
        // Disallow transfers to the auction contracts to prevent accidental
        // misuse. Auction contracts should only take ownership of dragons
        // through the allow + transferFrom flow.
        require(_to != address(saleAuction));
        require(_to != address(siringAuction));

        // You can only send your own dragon.
        require(_owns(msg.sender, _tokenId));

        // Reassign ownership, clear pending approvals, emit Transfer event.
        _transfer(msg.sender, _to, _tokenId);
    }

    /// @notice Returns the address currently assigned ownership of a given Dragon.
    /// @dev Required for ERC-721 compliance.
    function ownerOf(uint256 _tokenId) public view isValidToken(_tokenId) returns (address)
    {
        return dragonIndexToOwner[_tokenId];
    }

    /// @notice Grant another address the right to transfer a specific Dragon via
    ///  transferFrom(). This is the preferred flow for transfering NFTs to contracts.
    /// @param _approved The address to be granted transfer approval. Pass address(0) to
    ///  clear all approvals.
    /// @param _tokenId The ID of the Dragon that can be transferred if this call succeeds.
    /// @dev Required for ERC-721 compliance.
    //function approve( address _to, uint256 _tokenId) external whenNotPaused {
    function approve(address _approved, uint256 _tokenId) external payable whenNotPaused {
        // Only an owner can grant transfer approval.
        //require(_owns(msg.sender, _tokenId) || authorised[owner][msg.sender]);
        address owner = dragonIndexToOwner[_tokenId];
        require(owner == msg.sender || authorised[owner][msg.sender]);

        // Register the approval (replacing any previous approval).
        _approve(_tokenId, _approved);

        // Emit approval event.
        //emit Approval(msg.sender, _approved, _tokenId);
        emit Approval(owner, _approved, _tokenId);
    }

    /// @notice Get the approved address for a single NFT
    /// @dev Throws if `_tokenId` is not a valid NFT.
    /// @param _tokenId The NFT to find the approved address for
    /// @return The approved address for this NFT, or the zero address if there is none
    function getApproved(uint256 _tokenId) external view isValidToken(_tokenId) returns (address)
    {
        return dragonIndexToApproved[_tokenId];
    }


    /// @notice Transfer a Dragon owned by another address, for which the calling address
    ///  has previously been granted transfer approval by the owner.
    /// @param _from The address that owns the Dragon to be transfered.
    /// @param _to The address that should take ownership of the Dragon. Can be any address,
    ///  including the caller.
    /// @param _tokenId The ID of the Dragon to be transferred.
    /// @dev Required for ERC-721 compliance.
    function transferFrom(address _from, address _to, uint256 _tokenId) external payable whenNotPaused
    {
        // Safety check to prevent against an unexpected 0x0 default.
        require(_to != address(0));
        // Disallow transfers to this contract to prevent accidental misuse.
        // The contract should never own any dragons (except very briefly
        // after a firstGen dragon is created and before it goes on auction).
        require(_to != address(this));
        // Check for approval and valid ownership
        //require(_approvedFor(msg.sender, _tokenId));
        //require(_owns(_from, _tokenId));
        address owner = ownerOf(_tokenId);
        require(owner == _from);
        require (owner == msg.sender || dragonIndexToApproved[_tokenId] == msg.sender || authorised[owner][msg.sender]);

        // Reassign ownership (also clears pending approvals and emits Transfer event).
        _transfer(_from, _to, _tokenId);
    }

    /// @notice Returns the total number of Dragons currently in existence.
    /// @dev Required for ERC-721 compliance.
    function totalSupply() public view returns (uint) {
        return dragons.length - 1;
    }

    /// @notice Returns a list of all Dragon IDs assigned to an address.
    /// @param _owner The owner whose Dragons we are interested in.
    /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly
    ///  expensive (it walks the entire Dragon array looking for dragons belonging to owner),
    ///  but it also returns a dynamic array, which is only supported for web3 calls, and
    ///  not contract-to-contract calls.
    function tokensOfOwner(address _owner) external view returns(uint256[] memory ownerTokens) {
        uint256 tokenCount = balanceOf(_owner);

        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 totalDragons = totalSupply();
            uint256 resultIndex = 0;

            // We count on the fact that all dragons have IDs starting at 1 and increasing
            // sequentially up to the totalDragon count.
            uint256 dragonId;

            for (dragonId = 1; dragonId <= totalDragons; dragonId++) {
                if (dragonIndexToOwner[dragonId] == _owner) {
                    result[resultIndex] = dragonId;
                    resultIndex++;
                }
            }

            return result;
        }
    }

    /// @notice Enumerate valid NFTs
    /// @dev Throws if `_index` >= `totalSupply()`.
    /// @param _index A counter less than `totalSupply()`
    /// @return The token identifier for the `_index`th NFT,
    ///  (sort order not specified)
    function tokenByIndex(uint256 _index) external view returns (uint256)
    {
        return _index;
    }

    /// @notice Enumerate NFTs assigned to an owner
    /// @dev Throws if `_index` >= `balanceOf(_owner)` or if
    ///  `_owner` is the zero address, representing invalid NFTs.
    /// @param _owner An address where we are interested in NFTs owned by them
    /// @param _index A counter less than `balanceOf(_owner)`
    /// @return The token identifier for the `_index`th NFT assigned to `_owner`,
    ///   (sort order not specified)
    //function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256)
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256 dragonId)
    {
        uint256 count = 0;
        for (uint256 i = 1; i <= totalSupply(); ++i) {
            if (dragonIndexToOwner[i] == _owner) {
                if (count == _index) {
                    return i;
                } else {
                    count++;
                }
            }
        }
        revert();
    }
}

// File: contracts/DragonBreeding.sol

pragma solidity ^0.5.10;


/// @title DragonCore that manages Dragon siring, gestation, and birth.
/// @author Zynappse Corporation (https://www.zynapse.com)
/// @dev See the DragonCore contract documentation to understand how the various contract facets are arranged.
contract DragonBreeding is DragonOwnership {

    /// @dev The Pregnant event is fired when two dragons successfully breed and the pregnancy timer begins for the matron.
    event Pregnant(address owner, uint256 matronId, uint256 sireId);

    /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards
    ///  the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by
    ///  the CIO role as the gas price changes.
    uint256 public autoBirthFee = 2 finney;

    // Keeps track of number of pregnant dragons.
    uint256 public pregnantDragons;

    uint32 public BREEDING_LIMIT = 3;
    mapping(uint256 => uint64) breeding;

    /// @dev The address of the sibling contract that is used to implement the sooper-sekret genetic combination algorithm.
    //GeneScienceInterface public geneScience;

    /// @dev Update the address of the genetic contract, can only be called by the CEO.
    /// @param _address An address of a GeneScience contract instance to be used from this point forward.
    //function setGeneScienceAddress(address _address) external onlyCEO {
    //    GeneScienceInterface candidateContract = GeneScienceInterface(_address);

    // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117
    //    require(candidateContract.isGeneScience());

    // Set the new contract address
    //    geneScience = candidateContract;
    //}

    /// @dev Checks that a given Dragon is able to breed. Requires that the
    ///  current cooldown is finished (for sires) and also checks that there is
    ///  no pending pregnancy.
    function _isReadyToBreed(Dragon storage _dragon) internal view returns (bool) {
        // In addition to checking the cooldownEndBlock, we also need to check to see if
        // the dragon has a pending birth; there can be some period of time between the end
        // of the pregnacy timer and the birth event.
        return (_dragon.siringWithId == 0);
    }

    /// @dev Check if a sire has authorized breeding with this matron. True if both sire
    ///  and matron have the same owner, or if the sire has given siring permission to
    ///  the matron's owner (via approveSiring()).
    function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {
        address matronOwner = dragonIndexToOwner[_matronId];
        address sireOwner = dragonIndexToOwner[_sireId];

        // Siring is okay if they have same owner, or if the matron's owner was given
        // permission to breed with this sire.
        return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);
    }



    /// @notice Grants approval to another user to sire with one of your Dragons.
    /// @param _addr The address that will be able to sire with your Dragon. Set to
    ///  address(0) to clear all siring approvals for this Dragon.
    /// @param _sireId A Dragon that you own that _addr will now be able to sire with.
    function approveSiring(address _addr, uint256 _sireId)
    external
    whenNotPaused
    {
        require(_owns(msg.sender, _sireId));
        sireAllowedToAddress[_sireId] = _addr;
    }

    /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only
    ///  be called by the CMO address. (This fee is used to offset the gas cost incurred
    ///  by the autobirth daemon).
    function setAutoBirthFee(uint256 val) external onlyCLevel {
        autoBirthFee = val;
    }

    /// @dev Checks to see if a given Dragon is pregnant and (if so) if the gestation period has passed.
    function _isReadyToGiveBirth(Dragon storage _matron) private view returns (bool) {
        return (_matron.siringWithId != 0);
    }

    /// @notice Checks that a given dragon is able to breed (i.e. it is not pregnant or
    ///  in the middle of a siring cooldown).
    /// @param _dragonId reference the id of the dragon, any user can inquire about it
    function isReadyToBreed(uint256 _dragonId)
    public
    view
    returns (bool)
    {
        require(_dragonId > 0);
        Dragon storage dragon = dragons[_dragonId];
        return _isReadyToBreed(dragon);
    }

    /// @dev Checks whether a dragon is currently pregnant.
    /// @param _dragonId reference the id of the dragon, any user can inquire about it
    function isPregnant(uint256 _dragonId)
    public
    view
    returns (bool)
    {
        require(_dragonId > 0);
        // A dragon is pregnant if and only if this field is set
        return dragons[_dragonId].siringWithId != 0;
    }

    /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT
    /// check ownership permissions (that is up to the caller).
    /// @param _matron A reference to the Dragon struct of the potential matron.
    /// @param _matronId The matron's ID.
    /// @param _sire A reference to the Dragon struct of the potential sire.
    /// @param _sireId The sire's ID
    function _isValidMatingPair(
        Dragon storage _matron,
        uint256 _matronId,
        Dragon storage _sire,
        uint256 _sireId
    )
    private
    view
    returns(bool)
    {
        if(breeding[_matronId] >= BREEDING_LIMIT) {
            return false;
        }

        uint256 sireElement = _sire.dna / 1e34;
        uint256 matronElement = _matron.dna / 1e34;

        if (sireElement != matronElement) {
          return false;
        }

        // A Dragon can't breed with itself!
        if (_matronId == _sireId) {
            return false;
        }

        // Dragons can't breed with their parents.
        if (_matron.matronId == _sireId || _matron.sireId == _sireId) {
            return false;
        }

        if (_sire.matronId == _matronId || _sire.sireId == _matronId) {
            return false;
        }

        // We can short circuit the sibling check (below) if either dragon is first generation (has a matron ID of zero).
        if (_sire.matronId == 0 || _matron.matronId == 0) {
            return true;
        }

        // Dragons can't breed with full or half siblings.
        if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {
            return false;
        }
        if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {
            return false;
        }

        // Everything seems cool! Let's get DTF.
        return true;
    }

    /// @dev Internal check to see if a given sire and matron are a valid mating pair for
    ///  breeding via auction (i.e. skips ownership and siring approval checks).
    function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)
    internal
    view
    returns (bool)
    {
        Dragon storage matron = dragons[_matronId];
        Dragon storage sire = dragons[_sireId];
        return _isValidMatingPair(matron, _matronId, sire, _sireId);
    }

    /// @notice Checks to see if two dragons can breed together, including checks for
    ///  ownership and siring approvals. Does NOT check that both dragons are ready for
    ///  breeding (i.e. breedWith could still fail until the cooldowns are finished).
    ///  TODO: Shouldn't this check pregnancy and cooldowns?!?
    /// @param _matronId The ID of the proposed matron.
    /// @param _sireId The ID of the proposed sire.
    function canBreedWith(uint256 _matronId, uint256 _sireId)
    external
    view
    returns(bool)
    {
        require(_matronId > 0);
        require(_sireId > 0);
        Dragon storage matron = dragons[_matronId];
        Dragon storage sire = dragons[_sireId];
        return _isValidMatingPair(matron, _matronId, sire, _sireId) &&
        _isSiringPermitted(_sireId, _matronId);
    }

    /// @dev Internal utility function to initiate breeding, assumes that all breeding
    ///  requirements have been checked.
    function _breedWith(uint256 _matronId, uint256 _sireId) internal {
        // Grab a reference to the Dragons from storage.
        // Dragon storage sire = dragons[_sireId];
        Dragon storage matron = dragons[_matronId];

        // Mark the matron as pregnant, keeping track of who the sire is.
        matron.siringWithId = uint32(_sireId);

        // Trigger the cooldown for both parents.
        // _triggerCooldown(sire);
        // _triggerCooldown(matron);

        // Clear siring permission for both parents. This may not be strictly necessary but it's likely to avoid confusion!
        delete sireAllowedToAddress[_matronId];
        delete sireAllowedToAddress[_sireId];

        // Every time a dragon gets pregnant, counter is incremented.
        pregnantDragons++;

        // Emit the pregnancy event.
        emit Pregnant(dragonIndexToOwner[_matronId], _matronId, _sireId);
    }

    /// @notice Breed a Dragon you own (as matron) with a sire that you own, or for which you
    ///  have previously been given Siring approval. Will either make your dragon pregnant, or will
    ///  fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()
    /// @param _matronId The ID of the Dragon acting as matron (will end up pregnant if successful)
    /// @param _sireId The ID of the Dragon acting as sire (will begin its siring cooldown if successful)
    function breedWithAuto(uint256 _matronId, uint256 _sireId)
    external
    payable
    whenNotPaused
    {
        // Checks for payment.
        require(msg.value >= autoBirthFee);

        // Caller must own the matron.
        require(_owns(msg.sender, _matronId));

        // Neither sire nor matron are allowed to be on auction during a normal
        // breeding operation, but we don't need to check that explicitly.
        // For matron: The caller of this function can't be the owner of the matron
        //   because the owner of a Dragon on auction is the auction house, and the
        //   auction house will never call breedWith().
        // For sire: Similarly, a sire on auction will be owned by the auction house
        //   and the act of transferring ownership will have cleared any oustanding
        //   siring approval.
        // Thus we don't need to spend gas explicitly checking to see if either dragon
        // is on auction.

        // Check that matron and sire are both owned by caller, or that the sire
        // has given siring permission to caller (i.e. matron's owner).
        // Will fail for _sireId = 0
        require(_isSiringPermitted(_sireId, _matronId));

        // Grab a reference to the potential matron
        Dragon storage matron = dragons[_matronId];

        // Make sure matron isn't pregnant, or in the middle of a siring cooldown
        require(_isReadyToBreed(matron));

        // Grab a reference to the potential sire
        Dragon storage sire = dragons[_sireId];

        // Make sure sire isn't pregnant, or in the middle of a siring cooldown
        require(_isReadyToBreed(sire));

        // Update the breedTime
        matron.breedTime = uint64(now);

        // Test that these dragons are a valid mating pair.
        require(_isValidMatingPair(
                matron,
                _matronId,
                sire,
                _sireId
            ));


        // All checks passed, dragon gets pregnant!
        _breedWith(_matronId, _sireId);
    }

    /// @notice Have a pregnant Dragon give birth!
    /// @param _matronId A Dragon ready to give birth.
    /// @param _dna Dragon's DNA
    /// @param _agility Dragon's agility initial value
    /// @param _strength Dragon's Strenght initial value
    /// @param _intelligence Dragon's Intelligence initial value
    /// @param _runelevel Dragon's Rune Level initial value
    /// @return The Dragon ID of the new dragon.
    /// @dev Looks at a given Dragon and, if pregnant and if the gestation period has passed,
    ///  combines the genes of the two parents to create a new dragon. The new Dragon is assigned
    ///  to the current owner of the matron. Upon successful completion, both the matron and the
    ///  new dragon will be ready to breed again. Note that anyone can call this function (if they
    ///  are willing to pay the gas!), but the new dragon always goes to the mother's owner.
    function giveBirth(uint256 _matronId, uint256 _dna, uint64 _agility, uint64 _strength, uint64 _intelligence, uint64 _runelevel)
    external
    whenNotPaused
    onlyCOO
    returns(uint256)
    {
        // Grab a reference to the matron in storage.
        Dragon storage matron = dragons[_matronId];

        // Check that the dragon is a valid dragon.
        require(matron.birthTime != 0);

        // Check that the matron is pregnant, and that its time has come!
        require(_isReadyToGiveBirth(matron));

        // Grab a reference to the sire in storage.
        uint256 sireId = matron.siringWithId;
        Dragon storage sire = dragons[sireId];

        // Determine the higher generation number of the two parents
        uint32 parentGen = matron.generation;
        if (sire.generation > matron.generation) {
            parentGen = sire.generation;
        }

        // Call the sooper-sekret gene mixing operation.
        uint256 matronId = _matronId;
        uint64 agility = _agility;
        uint64 strength = _strength;
        uint64 intelligence = _intelligence;
        uint64 runelevel = _runelevel;

        uint256 childDNA = _dna;

        // Make the new dragon!
        address owner = dragonIndexToOwner[matronId];
        //uint256 dragonId = _createDragon(_matronId, matron.siringWithId, parentGen + 1, childDNA, _agility, _strength, _intelligence, _runelevel, owner);
        uint256 dragonId = _createDragon(matronId, sireId, parentGen + 1, childDNA, agility, strength, intelligence, runelevel, owner);

        //increment the breeding for the matron
        breeding[matronId]++;

        // Clear the reference to sire from the matron (REQUIRED! Having siringWithId
        // set is what marks a matron as being pregnant.)
        delete matron.siringWithId;

        // Every time a dragon gives birth counter is decremented.
        pregnantDragons--;

        // Send the balance fee to the person who made birth happen.
        //msg.sender.send(autoBirthFee);
        msg.sender.transfer(autoBirthFee);

        // return the new dragon's ID
        return dragonId;
    }

    function getPregnantDragons() external view returns(uint256[] memory pregnantDragonsList) {

        if (pregnantDragons == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](pregnantDragons);
            uint256 totalDragons = totalSupply();
            uint256 resultIndex = 0;

             uint256 dragonId;

            for (dragonId = 1; dragonId <= totalDragons; dragonId++) {
                if (isPregnant(dragonId)) {
                    result[resultIndex] = dragonId;
                    resultIndex++;
                }
            }

            return result;
        }
    }

    function setBreedingLimit(uint32 _value) external onlyCLevel {
        BREEDING_LIMIT = _value;
    }
}

// File: contracts/DragonAuction.sol

pragma solidity ^0.5.10;


/// @title Handles creating auctions for sale and siring of dragons.
/// @author Zynappse Corporation (https://www.zynapse.com)
///  This wrapper of ReverseAuction exists only so that users can create
///  auctions with only one transaction.
contract DragonAuction is DragonBreeding {

    // @notice The auction contract variables are defined in DragonBase to allow
    //  us to refer to them in DragonOwnership to prevent accidental transfers.
    // `saleAuction` refers to the auction for gen0 and p2p sale of dragons.
    // `siringAuction` refers to the auction for siring rights of dragons.

    /// @dev Sets the reference to the sale auction.
    /// @param _address - Address of sale contract.
    function setSaleAuctionAddress(address _address) external onlyCEO {
        SaleClockAuction candidateContract = SaleClockAuction(_address);

        // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117
        require(candidateContract.isSaleClockAuction());

        // Set the new contract address
        saleAuction = candidateContract;
    }

    /// @dev Sets the reference to the siring auction.
    /// @param _address - Address of siring contract.
    function setSiringAuctionAddress(address _address) external onlyCEO {
        SiringClockAuction candidateContract = SiringClockAuction(_address);

        // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117
        require(candidateContract.isSiringClockAuction());

        // Set the new contract address
        siringAuction = candidateContract;
    }

    /// @dev Put a dragon up for auction.
    ///  Does some ownership trickery to create auctions in one tx.
    function createSaleAuction(
        uint256 _dragonId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration
    )
    external
    whenNotPaused
    {
        // Auction contract checks input sizes
        // If dragon is already on any auction, this will throw
        // because it will be owned by the auction contract.
        require(_owns(msg.sender, _dragonId));
        // Ensure the dragon is not pregnant to prevent the auction
        // contract accidentally receiving ownership of the child.
        // NOTE: the dragon IS allowed to be in a cooldown.
        require(!isPregnant(_dragonId));
        _approve(_dragonId, address(saleAuction));
        // Sale auction throws if inputs are invalid and clears
        // transfer and sire approval after escrowing the dragon.
        saleAuction.createAuction(
            _dragonId,
            _startingPrice,
            _endingPrice,
            _duration,
            msg.sender
        );
    }

    /// @dev Put a dragon up for auction to be sire.
    ///  Performs checks to ensure the dragon can be sired, then
    ///  delegates to reverse auction.
    function createSiringAuction(
        uint256 _dragonId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration
    )
    external
    whenNotPaused
    {
        // Auction contract checks input sizes
        // If dragon is already on any auction, this will throw
        // because it will be owned by the auction contract.
        require(_owns(msg.sender, _dragonId));
        require(isReadyToBreed(_dragonId));
        _approve(_dragonId, address(siringAuction));
        // Siring auction throws if inputs are invalid and clears
        // transfer and sire approval after escrowing the dragon.
        siringAuction.createAuction(
            _dragonId,
            _startingPrice,
            _endingPrice,
            _duration,
            msg.sender
        );
    }


    /// @dev Completes a siring auction by bidding.
    ///  Immediately breeds the winning matron with the sire on auction.
    /// @param _sireId - ID of the sire on auction.
    /// @param _matronId - ID of the matron owned by the bidder.
    function bidOnSiringAuction(
        uint256 _sireId,
        uint256 _matronId
    )
    external
    payable
    whenNotPaused
    {
        // Auction contract checks input sizes
        require(_owns(msg.sender, _matronId));
        require(isReadyToBreed(_matronId));
        require(_canBreedWithViaAuction(_matronId, _sireId));

        // Define the current price of the auction.
        uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);
        require(msg.value >= currentPrice + autoBirthFee);

        // Siring auction will throw if the bid fails.
        siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);
        _breedWith(uint32(_matronId), uint32(_sireId));
    }

    /// @dev Transfers the balance of the sale auction contract
    /// to the DragonCore contract. We use two-step withdrawal to
    /// prevent two transfer calls in the auction bid function.
    function withdrawAuctionBalances() external onlyCLevel {
        saleAuction.withdrawBalance();
        siringAuction.withdrawBalance();
    }

    /// @dev Shows the balance of the auction contracts.
    function getAuctionBalances() external view onlyCLevel returns (uint256, uint256) {
        return (
            address(saleAuction).balance,
            address(siringAuction).balance
        );
    }
}

// File: contracts/DragonMinting.sol

pragma solidity ^0.5.10;


/// @title all functions related to creating dragons
contract DragonMinting is DragonAuction {

    /// @dev we can create promo dragons, up to a limit. Only callable by CMO
    /// @param _dna the encoded genes of the dragons to be created, any value is accepted
    /// @param _owner the future owner of the created dragons. Default to contract CMO
    function createPromoDragon(
        uint256 _dna,
        uint64 _agility,
        uint64 _strength,
        uint64 _intelligence,
        uint64 _runelevel,
        address _owner)
        external onlyCLevel {

        address dragonOwner = _owner;
        if (dragonOwner == address(0)) {
            dragonOwner = cmoAddress;
        }

        _createDragon(0, 0, 0, _dna, _agility, _strength, _intelligence, _runelevel, dragonOwner);
    }

    /// @dev Creates a new gen0 dragon with the given dna and
    ///  creates an auction for it.
    function createGen0Auction(
        uint256 _dna,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint64 _agility,
        uint64 _strength,
        uint64 _intelligence,
        uint256 _duration )
        external onlyCLevel {

        //require(gen0CreatedCount < GEN0_CREATION_LIMIT);


        uint256 dragonId = _createDragon(0, 0, 0, _dna, _agility, _strength, _intelligence, 0, address(this));
        _approve(dragonId, address(saleAuction));

        saleAuction.createAuction(
            dragonId,
            _startingPrice,
            _endingPrice,
            _duration,
            address(uint160(address(this)))
        );

        //gen0CreatedCount++;
    }
}

// File: contracts/DragonCore.sol

pragma solidity ^0.5.10;


contract DragonCore is DragonMinting {

    // Set in case the core contract is broken and an upgrade is required
    address public newContractAddress;

    /// @notice Creates the main BlockDragonz smart contract instance.
    constructor () public {
        // Starts paused.
        paused = true;

        // the creator of the contract is the initial CEO
        ceoAddress = msg.sender;

        // the creator of the contract is also the initial CMO
        cmoAddress = msg.sender;

        // the creator of the contract is also the initial CIO
        cioAddress = msg.sender;

        // the creator of the contract is also the initial CFO
        cfoAddress = msg.sender;

        // the creator of the contract is also the initial COO
        cooAddress = msg.sender;

        // ERC-165 Base
        supportedInterfaces[0x01ffc9a7] = true;

        // ERC-721 Base
        supportedInterfaces[0x80ac58cd] = true;

        // ERC-721 Metadata
        supportedInterfaces[0x5b5e139f] = true;

        // ERC-721 Enumerable
        supportedInterfaces[0x780e9d63] = true;

        //ERC-721 Receiver
        supportedInterfaces[0x150b7a02] = true;

        // start with the mythical dragon 0 - so we don't have generation-0 parent issues
        _createDragon(0, 0, 0, uint256(-1), 0,0,0,0,  address(0));
    }

    function setNewAddress(address _newAddress) external onlyCEO whenPaused {
        newContractAddress = _newAddress;
        emit ContractUpgrade(_newAddress);
    }

    /// @notice No tipping!
    /// @dev Reject all Ether from being sent here, unless it's from one of the
    ///  two auction contracts. (Hopefully, we can prevent user accidents.)
    function() external payable {
        require(
            msg.sender == address(saleAuction) ||
            msg.sender == address(siringAuction)
        );
    }
    /// @notice Returns all the relevant information about a specific dragon.
    /// @param _id The ID of the dragon of interest.
    function getDragon(uint256 _id)
    external
    view
    returns (
        uint256 dna,
        uint256 birthTime,
        uint256 breedTime,
        uint256 matronId,
        uint256 sireId,
        uint256 siringWithId,
        uint256 generation,
        uint256 runeLevel,
        uint256 agility,
        uint256 strength,
        uint256 intelligence
    ) {
        Dragon storage dragon = dragons[_id];
        DragonAssets storage dragonAsset = dragonAssets[_id];

        dna = dragon.dna;
        birthTime = uint256(dragon.birthTime);
        breedTime = uint256(dragon.breedTime);
        matronId = uint256(dragon.matronId);
        sireId = uint256(dragon.sireId);
        siringWithId = uint256(dragon.siringWithId);
        generation = uint256(dragon.generation);
        runeLevel = dragonAsset.runeLevel;
        agility = dragonAsset.agility;
        strength = dragonAsset.strength;
        intelligence = dragonAsset.intelligence;
    }

    /// @dev Override unpause so it requires all external contract addresses
    ///  to be set before contract can be unpaused. Also, we can't have
    ///  newContractAddress set either, because then the contract was upgraded.
    /// @notice This is public rather than external so we can call super.unpause
    ///  without using an expensive CALL.
    function unpause() public onlyCEO whenPaused {
        require(address(saleAuction) != address(0));
        require(address(siringAuction) != address(0));
        require(newContractAddress == address(0));

        // Actually unpause the contract.
        super.unpause();
    }

    // @dev Allows the CIO to capture the balance available to the contract.
    function withdrawBalance() external onlyCLevel {
        uint256 balance = address(this).balance;
        // Subtract all the currently pregnant dragons we have, plus 1 of margin.
        uint256 subtractFees = (pregnantDragons + 1) * autoBirthFee;

        if (balance > subtractFees) {
            //cioAddress.send(balance - subtractFees);
            cfoAddress.transfer(balance - subtractFees);
        }
    }

    /// @dev Shows the contract's current balance.
    function getBalance() external view onlyCLevel returns (uint256) {
        return address(this).balance;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newFee","type":"uint256"}],"name":"setUpdateAssetFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cfoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pregnantDragons","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_approved","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"ceoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"dragonAssets","outputs":[{"name":"runeLevel","type":"uint64"},{"name":"agility","type":"uint64"},{"name":"strength","type":"uint64"},{"name":"intelligence","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setSiringAuctionAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_from","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"onERC721Received","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_dragonId","type":"uint256"},{"name":"_rune","type":"uint64"},{"name":"_agility","type":"uint64"},{"name":"_strength","type":"uint64"},{"name":"_intelligence","type":"uint64"}],"name":"updateDragonAsset","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_dragonId","type":"uint256"}],"name":"isPregnant","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newCMO","type":"address"}],"name":"setCMO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"siringAuction","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_newCEO","type":"address"}],"name":"setCEO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_dna","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_agility","type":"uint64"},{"name":"_strength","type":"uint64"},{"name":"_intelligence","type":"uint64"},{"name":"_duration","type":"uint256"}],"name":"createGen0Auction","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":"getPregnantDragons","outputs":[{"name":"pregnantDragonsList","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"dragonId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dragonId","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_duration","type":"uint256"}],"name":"createSaleAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCIO","type":"address"}],"name":"setCIO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"sireAllowedToAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_matronId","type":"uint256"},{"name":"_sireId","type":"uint256"}],"name":"canBreedWith","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dragonId","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_duration","type":"uint256"}],"name":"createSiringAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"val","type":"uint256"}],"name":"setAutoBirthFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_sireId","type":"uint256"}],"name":"approveSiring","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCFO","type":"address"}],"name":"setCFO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"dragonIndexToOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cioAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newContractAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setSaleAuctionAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"setNewAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"dragonIndexToApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dna","type":"uint256"},{"name":"_agility","type":"uint64"},{"name":"_strength","type":"uint64"},{"name":"_intelligence","type":"uint64"},{"name":"_runelevel","type":"uint64"},{"name":"_owner","type":"address"}],"name":"createPromoDragon","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"BREEDING_LIMIT","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"name":"ownerTokens","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cmoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawAuctionBalances","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint32"}],"name":"setBreedingLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cooAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"autoBirthFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"tokenURIPrefix","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_matronId","type":"uint256"},{"name":"_dna","type":"uint256"},{"name":"_agility","type":"uint64"},{"name":"_strength","type":"uint64"},{"name":"_intelligence","type":"uint64"},{"name":"_runelevel","type":"uint64"}],"name":"giveBirth","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_dragonId","type":"uint256"}],"name":"isReadyToBreed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenURISuffix","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getDragon","outputs":[{"name":"dna","type":"uint256"},{"name":"birthTime","type":"uint256"},{"name":"breedTime","type":"uint256"},{"name":"matronId","type":"uint256"},{"name":"sireId","type":"uint256"},{"name":"siringWithId","type":"uint256"},{"name":"generation","type":"uint256"},{"name":"runeLevel","type":"uint256"},{"name":"agility","type":"uint256"},{"name":"strength","type":"uint256"},{"name":"intelligence","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAuctionBalances","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"saleAuction","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"updateAssetFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_sireId","type":"uint256"},{"name":"_matronId","type":"uint256"}],"name":"bidOnSiringAuction","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_matronId","type":"uint256"},{"name":"_sireId","type":"uint256"}],"name":"breedWithAuto","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_dragonId","type":"uint256"},{"name":"_rune","type":"uint256"}],"name":"requestAssetUpdate","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_prefix","type":"string"},{"name":"_suffix","type":"string"}],"name":"setTokenURIAffixes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"matronId","type":"uint256"},{"indexed":false,"name":"sireId","type":"uint256"}],"name":"Pregnant","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"dragonId","type":"uint256"},{"indexed":false,"name":"matronId","type":"uint256"},{"indexed":false,"name":"sireId","type":"uint256"},{"indexed":false,"name":"dna","type":"uint256"},{"indexed":false,"name":"generation","type":"uint32"},{"indexed":false,"name":"runeLevel","type":"uint64"}],"name":"Birth","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_dragonId","type":"uint256"},{"indexed":false,"name":"_rune","type":"uint64"},{"indexed":false,"name":"_agility","type":"uint64"},{"indexed":false,"name":"_strength","type":"uint64"},{"indexed":false,"name":"_intelligence","type":"uint64"}],"name":"DragonAssetsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_dragonId","type":"uint256"}],"name":"DragonAssetRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"}],"name":"ContractUpgrade","type":"event"}]

6004805460ff60a01b1916905560e060405260326080818152906200471c60a0398051620000369160069160209091019062000687565b50604080516020810191829052600090819052620000579160079162000687565b50661c6bf526340000600f5566071afd498d00006012556014805463ffffffff191660031790553480156200008b57600080fd5b5060048054600080546001600160a01b0319908116339081178355600280548316821790556001805483168217815560ff60a01b199094167401000000000000000000000000000000000000000017821681179094556003805490911690931790925560056020527fc01909ce2b517f8cd3a46ae0cfde9179f9b675cf633d3d84c8226585cc73c156805460ff1990811683179091557f072ad3113145b5af48d301e3b9fc3bd1c97c3f26a14f5d44904b71469875631e80548216831790557f3b767bd59d7164fff7ec5b80ca1165d9d6e12ee8656896fac4159b0760bfd9f780548216831790557f32dafcc0428d2ef4307d6da1e032ab9698665546cb7ff0633ca92092b13651e180548216831790557f150b7a020000000000000000000000000000000000000000000000000000000083527f12c5c367f8ba71e59ab2ab375660f9954a1433014a379b64972328607af9c30080549091169091179055620001ff908080600019818080808062000206565b506200078f565b60008963ffffffff168a146200021b57600080fd5b8863ffffffff1689146200022e57600080fd5b8763ffffffff1688146200024157600080fd5b6200024b6200070c565b506040805160e0810182528881526001600160401b0342166020820152600091810182905263ffffffff808d1660608301528b8116608083015260a082019290925290891660c08201526200029f62000748565b6040518060800160405280866001600160401b03168152602001896001600160401b03168152602001886001600160401b03168152602001876001600160401b0316815250905060006001600884908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010160086101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548163ffffffff021916908363ffffffff160217905550505003905081600d600083815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160000160106101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160000160186101000a8154816001600160401b0302191690836001600160401b031602179055509050508063ffffffff168114620004fb57600080fd5b606080840151608080860151865160c080890151604080516001600160a01b038e168152602081018a905263ffffffff9788168183015294871697850197909752938301919091529190921660a08301526001600160401b0389169082015290517fdf8d8992e7e860a8605ceb50aa640d5209227db91bcd9ec915a1d4c56d68a5b99181900360e00190a16200059d600086836001600160e01b03620005ad16565b9c9b505050505050505050505050565b6001600160a01b038083166000818152600a60209081526040808320805460010190558583526009909152902080546001600160a01b031916909117905583161562000641576001600160a01b0383166000908152600a602090815260408083208054600019019055838352600c825280832080546001600160a01b0319908116909155600b909252909120805490911690555b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620006ca57805160ff1916838001178555620006fa565b82800160010185558215620006fa579182015b82811115620006fa578251825591602001919060010190620006dd565b50620007089291506200076f565b5090565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b6200078c91905b8082111562000708576000815560010162000776565b90565b613f7d806200079f6000396000f3fe6080604052600436106104105760003560e01c80635d64aa681161021e578063a9059cbb11610123578063e0bb933b116100ab578063e985e9c51161007a578063e985e9c51461119a578063ed60ade6146111d5578063f7d8c883146111f8578063faa0ae531461121b578063faf421251461123e57610410565b8063e0bb933b146110c2578063e6be9b5614611142578063e6cbe35114611170578063e8de704d1461118557610410565b8063c0ac9983116100f2578063c0ac998314610fed578063c87b56dd14611002578063d1741a8c1461102c578063d3e6f49f14611083578063dbbc853b146110ad57610410565b8063a9059cbb14610ec6578063b047fb5014610eff578063b0c35c0514610f14578063b88d4fde14610f2957610410565b806378c234e0116101a65780638c267b97116101755780638c267b9714610e1c57806391876e5714610e3157806392695a8814610e4657806395d89b4114610e76578063a22cb46514610e8b57610410565b806378c234e014610d435780638368071c14610da65780638456cb5914610dd45780638462151c14610de957610410565b80636af04a57116101ed5780636af04a5714610c6b5780636fbde40d14610c8057806370a0823114610cb35780637158798814610ce657806371f7aaca14610d1957610410565b80635d64aa6814610bed5780635fd8c71014610c175780636059c38414610c2c5780636352211e14610c4157610410565b806323b872dd1161032457806342842e0e116102ac5780634b85fd551161027b5780634b85fd5514610b185780634dfff04f14610b425780634e0a337914610b7b5780634f6ccce714610bae5780635c975abb14610bd857610410565b806342842e0e14610a4c57806346116e6f14610a8257806346d22c7014610aac5780634ad8c93814610adc57610410565b80632e1699d7116102f35780632e1699d71461092a5780632f745c591461098f5780633d7d3f5a146109c85780633f4ba83a14610a04578063416da14514610a1957610410565b806323b872dd1461083357806327d7874c146108695780632a896ece1461089c5780632ba73c15146108f757610410565b8063100b2783116103a757806315437dfb1161037657806315437dfb1461075b57806318160ddd146107ac5780631940a936146107c15780632072863b146107eb57806321717ebf1461081e57610410565b8063100b2783146105fd57806312065fe01461065b57806314001f4c14610670578063150b7a02146106a357610410565b806306fdde03116103e357806306fdde0314610508578063081812fc14610592578063095ea7b3146105bc5780630a0f8168146105e857610410565b806301ffc9a71461043e5780630304b213146104865780630519ce79146104b057806305ea0668146104e1575b6010546001600160a01b031633148061043357506011546001600160a01b031633145b61043c57600080fd5b005b34801561044a57600080fd5b506104726004803603602081101561046157600080fd5b50356001600160e01b031916611309565b604080519115158252519081900360200190f35b34801561049257600080fd5b5061043c600480360360208110156104a957600080fd5b503561132c565b3480156104bc57600080fd5b506104c561139c565b604080516001600160a01b039092168252519081900360200190f35b3480156104ed57600080fd5b506104f66113ab565b60408051918252519081900360200190f35b34801561051457600080fd5b5061051d6113b1565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561055757818101518382015260200161053f565b50505050905090810190601f1680156105845780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561059e57600080fd5b506104c5600480360360208110156105b557600080fd5b50356113d4565b61043c600480360360408110156105d257600080fd5b506001600160a01b038135169060200135611414565b3480156105f457600080fd5b506104c56114cd565b34801561060957600080fd5b506106276004803603602081101561062057600080fd5b50356114dc565b604080516001600160401b039586168152938516602085015291841683830152909216606082015290519081900360800190f35b34801561066757600080fd5b506104f6611516565b34801561067c57600080fd5b5061043c6004803603602081101561069357600080fd5b50356001600160a01b0316611589565b3480156106af57600080fd5b5061073e600480360360808110156106c657600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561070057600080fd5b82018360208201111561071257600080fd5b803590602001918460018302840111600160201b8311171561073357600080fd5b509092509050611636565b604080516001600160e01b03199092168252519081900360200190f35b34801561076757600080fd5b5061043c600480360360a081101561077e57600080fd5b508035906001600160401b03602082013581169160408101358216916060820135811691608001351661165b565b3480156107b857600080fd5b506104f6611862565b3480156107cd57600080fd5b50610472600480360360208110156107e457600080fd5b503561186c565b3480156107f757600080fd5b5061043c6004803603602081101561080e57600080fd5b50356001600160a01b03166118b0565b34801561082a57600080fd5b506104c56118fc565b61043c6004803603606081101561084957600080fd5b506001600160a01b0381358116916020810135909116906040013561190b565b34801561087557600080fd5b5061043c6004803603602081101561088c57600080fd5b50356001600160a01b03166119eb565b3480156108a857600080fd5b5061043c600480360360e08110156108bf57600080fd5b508035906020810135906040810135906001600160401b036060820135811691608081013582169160a0820135169060c00135611a37565b34801561090357600080fd5b5061043c6004803603602081101561091a57600080fd5b50356001600160a01b0316611b5c565b34801561093657600080fd5b5061093f611ba8565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561097b578181015183820152602001610963565b505050509050019250505060405180910390f35b34801561099b57600080fd5b506104f6600480360360408110156109b257600080fd5b506001600160a01b038135169060200135611c54565b3480156109d457600080fd5b5061043c600480360360808110156109eb57600080fd5b5080359060208101359060408101359060600135611cb6565b348015610a1057600080fd5b5061043c611d90565b348015610a2557600080fd5b5061043c60048036036020811015610a3c57600080fd5b50356001600160a01b0316611e07565b61043c60048036036060811015610a6257600080fd5b506001600160a01b03813581169160208101359091169060400135611e53565b348015610a8e57600080fd5b506104c560048036036020811015610aa557600080fd5b5035611e73565b348015610ab857600080fd5b5061047260048036036040811015610acf57600080fd5b5080359060200135611e8e565b348015610ae857600080fd5b5061043c60048036036080811015610aff57600080fd5b5080359060208101359060408101359060600135611f0d565b348015610b2457600080fd5b5061043c60048036036020811015610b3b57600080fd5b5035611fc8565b348015610b4e57600080fd5b5061043c60048036036040811015610b6557600080fd5b506001600160a01b038135169060200135612038565b348015610b8757600080fd5b5061043c60048036036020811015610b9e57600080fd5b50356001600160a01b0316612090565b348015610bba57600080fd5b506104f660048036036020811015610bd157600080fd5b5035611586565b348015610be457600080fd5b506104726120dc565b348015610bf957600080fd5b506104c560048036036020811015610c1057600080fd5b50356120ec565b348015610c2357600080fd5b5061043c612107565b348015610c3857600080fd5b506104c56121c8565b348015610c4d57600080fd5b506104c560048036036020811015610c6457600080fd5b50356121d7565b348015610c7757600080fd5b506104c5612217565b348015610c8c57600080fd5b5061043c60048036036020811015610ca357600080fd5b50356001600160a01b0316612226565b348015610cbf57600080fd5b506104f660048036036020811015610cd657600080fd5b50356001600160a01b03166122d3565b348015610cf257600080fd5b5061043c60048036036020811015610d0957600080fd5b50356001600160a01b03166122ee565b348015610d2557600080fd5b506104c560048036036020811015610d3c57600080fd5b503561236f565b348015610d4f57600080fd5b5061043c600480360360c0811015610d6657600080fd5b5080359060208101356001600160401b03908116916040810135821691606082013581169160808101359091169060a001356001600160a01b031661238a565b348015610db257600080fd5b50610dbb612425565b6040805163ffffffff9092168252519081900360200190f35b348015610de057600080fd5b5061043c612431565b348015610df557600080fd5b5061093f60048036036020811015610e0c57600080fd5b50356001600160a01b03166124c8565b348015610e2857600080fd5b506104c561258f565b348015610e3d57600080fd5b5061043c61259e565b348015610e5257600080fd5b5061043c60048036036020811015610e6957600080fd5b503563ffffffff166126d5565b348015610e8257600080fd5b5061051d61275c565b348015610e9757600080fd5b5061043c60048036036040811015610eae57600080fd5b506001600160a01b038135169060200135151561277d565b348015610ed257600080fd5b5061043c60048036036040811015610ee957600080fd5b506001600160a01b0381351690602001356127f7565b348015610f0b57600080fd5b506104c561288b565b348015610f2057600080fd5b506104f661289a565b61043c60048036036080811015610f3f57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610f7957600080fd5b820183602082011115610f8b57600080fd5b803590602001918460018302840111600160201b83111715610fac57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506128a0945050505050565b348015610ff957600080fd5b5061051d612add565b34801561100e57600080fd5b5061051d6004803603602081101561102557600080fd5b5035612b6b565b34801561103857600080fd5b506104f6600480360360c081101561104f57600080fd5b508035906020810135906001600160401b0360408201358116916060810135821691608082013581169160a0013516612d75565b34801561108f57600080fd5b50610472600480360360208110156110a657600080fd5b5035612f5e565b3480156110b957600080fd5b5061051d612f9b565b3480156110ce57600080fd5b506110ec600480360360208110156110e557600080fd5b5035612ff6565b604080519b8c5260208c019a909a528a8a019890985260608a0196909652608089019490945260a088019290925260c087015260e086015261010085015261012084015261014083015251908190036101600190f35b34801561114e57600080fd5b5061115761319a565b6040805192835260208301919091528051918290030190f35b34801561117c57600080fd5b506104c5613223565b34801561119157600080fd5b506104f6613232565b3480156111a657600080fd5b50610472600480360360408110156111bd57600080fd5b506001600160a01b0381358116916020013516613238565b61043c600480360360408110156111eb57600080fd5b5080359060200135613266565b61043c6004803603604081101561120e57600080fd5b50803590602001356133c3565b61043c6004803603604081101561123157600080fd5b50803590602001356134b7565b34801561124a57600080fd5b5061043c6004803603604081101561126157600080fd5b810190602081018135600160201b81111561127b57600080fd5b82018360208201111561128d57600080fd5b803590602001918460018302840111600160201b831117156112ae57600080fd5b919390929091602081019035600160201b8111156112cb57600080fd5b8201836020820111156112dd57600080fd5b803590602001918460018302840111600160201b831117156112fe57600080fd5b509092509050613539565b6001600160e01b0319811660009081526005602052604090205460ff165b919050565b6000546001600160a01b031633148061134f57506001546001600160a01b031633145b8061136457506002546001600160a01b031633145b8061137957506003546001600160a01b031633145b8061138e57506004546001600160a01b031633145b61139757600080fd5b600f55565b6004546001600160a01b031681565b60135481565b604051806040016040528060078152602001664472616b6f6e7360c81b81525081565b60008181526009602052604081205482906001600160a01b03166113f757600080fd5b50506000908152600b60205260409020546001600160a01b031690565b600454600160a01b900460ff161561142b57600080fd5b6000818152600960205260409020546001600160a01b03163381148061147457506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff165b61147d57600080fd5b6114878284613570565b81836001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000546001600160a01b031681565b600d602052600090815260409020546001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041684565b600080546001600160a01b031633148061153a57506001546001600160a01b031633145b8061154f57506002546001600160a01b031633145b8061156457506003546001600160a01b031633145b8061157957506004546001600160a01b031633145b61158257600080fd5b5030315b90565b6000546001600160a01b031633146115a057600080fd5b6000819050806001600160a01b03166376190f8f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115de57600080fd5b505afa1580156115f2573d6000803e3d6000fd5b505050506040513d602081101561160857600080fd5b505161161357600080fd5b601180546001600160a01b0319166001600160a01b039290921691909117905550565b60006040518080613f2260279139604051908190036027019020979650505050505050565b600454600160a01b900460ff161561167257600080fd5b6003546001600160a01b0316331461168957600080fd5b6000858152600d6020526040902080546001600160401b03908116908616116116b157600080fd5b80546001600160401b03600160401b909104811690851610156116d357600080fd5b80546001600160401b03600160801b909104811690841610156116f557600080fd5b80546001600160401b03600160c01b9091048116908316101561171757600080fd5b61171f613df7565b50604080516080810182526001600160401b03878116825286811660208084019182528783168486019081528784166060860190815260008d8152600d9093528683208651815495519351925167ffffffffffffffff199096169087161767ffffffffffffffff60401b1916600160401b938716939093029290921767ffffffffffffffff60801b1916600160801b91861691909102176001600160c01b0316600160c01b9390941692909202929092179055600f549251919233926108fc82150292818181858888f193505050501580156117ff573d6000803e3d6000fd5b50604080518881526001600160401b0380891660208301528088168284015280871660608301528516608082015290517f98677f77088375bf66a28fd8e22fe9e5bcdf31183e2f80c9cd9b92170df1b11e9181900360a00190a150505050505050565b6008546000190190565b600080821161187a57600080fd5b6008828154811061188757fe5b6000918252602090912060029091020160010154600160c01b900463ffffffff16151592915050565b6000546001600160a01b031633146118c757600080fd5b6001600160a01b0381166118da57600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6011546001600160a01b031681565b600454600160a01b900460ff161561192257600080fd5b6001600160a01b03821661193557600080fd5b6001600160a01b03821630141561194b57600080fd5b6000611956826121d7565b9050836001600160a01b0316816001600160a01b03161461197657600080fd5b6001600160a01b0381163314806119a357506000828152600b60205260409020546001600160a01b031633145b806119d157506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff165b6119da57600080fd5b6119e584848461359e565b50505050565b6000546001600160a01b03163314611a0257600080fd5b6001600160a01b038116611a1557600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331480611a5a57506001546001600160a01b031633145b80611a6f57506002546001600160a01b031633145b80611a8457506003546001600160a01b031633145b80611a9957506004546001600160a01b031633145b611aa257600080fd5b6000611ab860008060008b898989600030613677565b601054909150611ad29082906001600160a01b0316613570565b601054604080516313f5f20560e11b815260048101849052602481018a9052604481018990526064810185905230608482015290516001600160a01b03909216916327ebe40a9160a48082019260009290919082900301818387803b158015611b3a57600080fd5b505af1158015611b4e573d6000803e3d6000fd5b505050505050505050505050565b6000546001600160a01b03163314611b7357600080fd5b6001600160a01b038116611b8657600080fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b606060135460001415611bca5750604080516000815260208101909152611586565b6060601354604051908082528060200260200182016040528015611bf8578160200160208202803883390190505b5090506000611c05611862565b9050600060015b828111611c4857611c1c8161186c565b15611c405780848381518110611c2e57fe5b60209081029190910101526001909101905b600101611c0c565b83945050505050611586565b60008060015b611c62611862565b8111611caa576000818152600960205260409020546001600160a01b0386811691161415611ca25783821415611c9b579150611cb09050565b6001909101905b600101611c5a565b50600080fd5b92915050565b600454600160a01b900460ff1615611ccd57600080fd5b611cd73385613a0b565b611ce057600080fd5b611ce98461186c565b15611cf357600080fd5b601054611d0a9085906001600160a01b0316613570565b601054604080516313f5f20560e11b81526004810187905260248101869052604481018590526064810184905233608482015290516001600160a01b03909216916327ebe40a9160a48082019260009290919082900301818387803b158015611d7257600080fd5b505af1158015611d86573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b03163314611da757600080fd5b600454600160a01b900460ff16611dbd57600080fd5b6010546001600160a01b0316611dd257600080fd5b6011546001600160a01b0316611de757600080fd5b6016546001600160a01b031615611dfd57600080fd5b611e05613a2b565b565b6000546001600160a01b03163314611e1e57600080fd5b6001600160a01b038116611e3157600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b611e6e838383604051806020016040528060008152506128a0565b505050565b600c602052600090815260409020546001600160a01b031681565b6000808311611e9c57600080fd5b60008211611ea957600080fd5b600060088481548110611eb857fe5b90600052602060002090600202019050600060088481548110611ed757fe5b90600052602060002090600202019050611ef382868387613a67565b8015611f045750611f048486613c59565b95945050505050565b600454600160a01b900460ff1615611f2457600080fd5b611f2e3385613a0b565b611f3757600080fd5b611f4084612f5e565b611f4957600080fd5b601154611f609085906001600160a01b0316613570565b601154604080516313f5f20560e11b81526004810187905260248101869052604481018590526064810184905233608482015290516001600160a01b03909216916327ebe40a9160a48082019260009290919082900301818387803b158015611d7257600080fd5b6000546001600160a01b0316331480611feb57506001546001600160a01b031633145b8061200057506002546001600160a01b031633145b8061201557506003546001600160a01b031633145b8061202a57506004546001600160a01b031633145b61203357600080fd5b601255565b600454600160a01b900460ff161561204f57600080fd5b6120593382613a0b565b61206257600080fd5b6000908152600c6020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146120a757600080fd5b6001600160a01b0381166120ba57600080fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b600454600160a01b900460ff1681565b6009602052600090815260409020546001600160a01b031681565b6000546001600160a01b031633148061212a57506001546001600160a01b031633145b8061213f57506002546001600160a01b031633145b8061215457506003546001600160a01b031633145b8061216957506004546001600160a01b031633145b61217257600080fd5b601254601354303191600190910102808211156121c4576004546040516001600160a01b039091169082840380156108fc02916000818181858888f19350505050158015611e6e573d6000803e3d6000fd5b5050565b6001546001600160a01b031681565b60008181526009602052604081205482906001600160a01b03166121fa57600080fd5b50506000908152600960205260409020546001600160a01b031690565b6016546001600160a01b031681565b6000546001600160a01b0316331461223d57600080fd5b6000819050806001600160a01b03166385b861886040518163ffffffff1660e01b815260040160206040518083038186803b15801561227b57600080fd5b505afa15801561228f573d6000803e3d6000fd5b505050506040513d60208110156122a557600080fd5b50516122b057600080fd5b601080546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b03166000908152600a602052604090205490565b6000546001600160a01b0316331461230557600080fd5b600454600160a01b900460ff1661231b57600080fd5b601680546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa4461993059181900360200190a150565b600b602052600090815260409020546001600160a01b031681565b6000546001600160a01b03163314806123ad57506001546001600160a01b031633145b806123c257506002546001600160a01b031633145b806123d757506003546001600160a01b031633145b806123ec57506004546001600160a01b031633145b6123f557600080fd5b806001600160a01b03811661241257506002546001600160a01b03165b611d8660008060008a8a8a8a8a89613677565b60145463ffffffff1681565b6000546001600160a01b031633148061245457506001546001600160a01b031633145b8061246957506002546001600160a01b031633145b8061247e57506003546001600160a01b031633145b8061249357506004546001600160a01b031633145b61249c57600080fd5b600454600160a01b900460ff16156124b357600080fd5b6004805460ff60a01b1916600160a01b179055565b606060006124d5836122d3565b9050806124f2575050604080516000815260208101909152611327565b60608160405190808252806020026020018201604052801561251e578160200160208202803883390190505b509050600061252b611862565b9050600060015b828111612582576000818152600960205260409020546001600160a01b038881169116141561257a578084838151811061256857fe5b60209081029190910101526001909101905b600101612532565b8395505050505050611327565b6002546001600160a01b031681565b6000546001600160a01b03163314806125c157506001546001600160a01b031633145b806125d657506002546001600160a01b031633145b806125eb57506003546001600160a01b031633145b8061260057506004546001600160a01b031633145b61260957600080fd5b601060009054906101000a90046001600160a01b03166001600160a01b0316635fd8c7106040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561265957600080fd5b505af115801561266d573d6000803e3d6000fd5b50505050601160009054906101000a90046001600160a01b03166001600160a01b0316635fd8c7106040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156126c157600080fd5b505af11580156119e5573d6000803e3d6000fd5b6000546001600160a01b03163314806126f857506001546001600160a01b031633145b8061270d57506002546001600160a01b031633145b8061272257506003546001600160a01b031633145b8061273757506004546001600160a01b031633145b61274057600080fd5b6014805463ffffffff191663ffffffff92909216919091179055565b6040518060400160405280600581526020016444524b4e5360d81b81525081565b60408051821515815290516001600160a01b0384169133917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a3336000908152600e602090815260408083206001600160a01b0395909516835293905291909120805460ff1916911515919091179055565b600454600160a01b900460ff161561280e57600080fd5b6001600160a01b03821661282157600080fd5b6001600160a01b03821630141561283757600080fd5b6010546001600160a01b038381169116141561285257600080fd5b6011546001600160a01b038381169116141561286d57600080fd5b6128773382613a0b565b61288057600080fd5b6121c433838361359e565b6003546001600160a01b031681565b60125481565b6001600160a01b0383166128b357600080fd5b6001600160a01b0383163014156128c957600080fd5b6010546001600160a01b03848116911614156128e457600080fd5b6011546001600160a01b03848116911614156128ff57600080fd5b600061290a836121d7565b9050846001600160a01b0316816001600160a01b03161461292a57600080fd5b6001600160a01b03811633148061295757506000838152600b60205260409020546001600160a01b031633145b8061298557506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff165b61298e57600080fd5b61299985858561359e565b833b63ffffffff811615612ad557604051859080602f613ef3823960405190819003602f018120630a85bd0160e11b825233600483018181526001600160a01b038c81166024860152604485018b90526080606486019081528a5160848701528a516001600160e01b031990951696509087169463150b7a02948e938d938d939192909160a40190602085019080838360005b83811015612a44578181015183820152602001612a2c565b50505050905090810190601f168015612a715780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015612a9357600080fd5b505af1158015612aa7573d6000803e3d6000fd5b505050506040513d6020811015612abd57600080fd5b50516001600160e01b03191614612ad357600080fd5b505b505050505050565b6006805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015612b635780601f10612b3857610100808354040283529160200191612b63565b820191906000526020600020905b815481529060010190602001808311612b4657829003601f168201915b505050505081565b60008181526009602052604090205460609082906001600160a01b0316612b9157600080fd5b60408051604e80825260808201909252606090826020820181803883390190505060068054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281529394506000938993603093606093830182828015612c455780601f10612c1a57610100808354040283529160200191612c45565b820191906000526020600020905b815481529060010190602001808311612c2857829003601f168201915b505050505090505b8215612c905784516001850194600a80860495069184830160f81b9188918110612c7357fe5b60200101906001600160f81b031916908160001a90535050612c4d565b6060848251016040519080825280601f01601f191660200182016040528015612cc0576020820181803883390190505b50905060005b8251811015612d1157828181518110612cdb57fe5b602001015160f81c60f81b828281518110612cf257fe5b60200101906001600160f81b031916908160001a905350600101612cc6565b5060005b85811015612d67578681600188030381518110612d2e57fe5b602001015160f81c60f81b828451830181518110612d4857fe5b60200101906001600160f81b031916908160001a905350600101612d15565b509998505050505050505050565b600454600090600160a01b900460ff1615612d8f57600080fd5b6003546001600160a01b03163314612da657600080fd5b600060088881548110612db557fe5b6000918252602090912060029091020160018101549091506001600160401b0316612ddf57600080fd5b612de881613cae565b612df157600080fd5b600181015460088054600160c01b90920463ffffffff16916000919083908110612e1757fe5b6000918252602090912060018086015460029093029091019081015490925063ffffffff600160e01b9283900481169290910416811015612e6657506001810154600160e01b900463ffffffff165b60008b905060008a905060008a905060008a905060008a905060008f905060006009600088815260200190815260200160002060009054906101000a90046001600160a01b031690506000612ecb888c8b60010163ffffffff16868b8b8b8b8a613677565b600089815260156020526040808220805467ffffffffffffffff19811660016001600160401b039283168101909216179091558f01805463ffffffff60c01b1916905560138054600019019055601254905192935033926108fc82150292818181858888f19350505050158015612f46573d6000803e3d6000fd5b509b5050505050505050505050509695505050505050565b6000808211612f6c57600080fd5b600060088381548110612f7b57fe5b90600052602060002090600202019050612f9481613cc4565b9392505050565b6007805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015612b635780601f10612b3857610100808354040283529160200191612b63565b60008060008060008060008060008060008060088d8154811061301557fe5b906000526020600020906002020190506000600d60008f8152602001908152602001600020905081600001549c508160010160009054906101000a90046001600160401b03166001600160401b03169b508160010160089054906101000a90046001600160401b03166001600160401b03169a508160010160109054906101000a900463ffffffff1663ffffffff1699508160010160149054906101000a900463ffffffff1663ffffffff1698508160010160189054906101000a900463ffffffff1663ffffffff16975081600101601c9054906101000a900463ffffffff1663ffffffff1696508060000160009054906101000a90046001600160401b03166001600160401b031695508060000160089054906101000a90046001600160401b03166001600160401b031694508060000160109054906101000a90046001600160401b03166001600160401b031693508060000160189054906101000a90046001600160401b03166001600160401b03169250505091939597999b90929496989a50565b6000805481906001600160a01b03163314806131c057506001546001600160a01b031633145b806131d557506002546001600160a01b031633145b806131ea57506003546001600160a01b031633145b806131ff57506004546001600160a01b031633145b61320857600080fd5b50506010546011546001600160a01b03918216319116319091565b6010546001600160a01b031681565b600f5481565b6001600160a01b039182166000908152600e6020908152604080832093909416825291909152205460ff1690565b600454600160a01b900460ff161561327d57600080fd5b6132873382613a0b565b61329057600080fd5b61329981612f5e565b6132a257600080fd5b6132ac8183613cd9565b6132b557600080fd5b601154604080516362ae87ab60e11b81526004810185905290516000926001600160a01b03169163c55d0f56916024808301926020929190829003018186803b15801561330157600080fd5b505afa158015613315573d6000803e3d6000fd5b505050506040513d602081101561332b57600080fd5b5051601254909150810134101561334157600080fd5b6011546012546040805163454a2ab360e01b81526004810187905290516001600160a01b039093169263454a2ab39234039160248082019260009290919082900301818588803b15801561339457600080fd5b505af11580156133a8573d6000803e3d6000fd5b5050505050611e6e8263ffffffff168463ffffffff16613d24565b600454600160a01b900460ff16156133da57600080fd5b6012543410156133e957600080fd5b6133f33383613a0b565b6133fc57600080fd5b6134068183613c59565b61340f57600080fd5b60006008838154811061341e57fe5b9060005260206000209060020201905061343781613cc4565b61344057600080fd5b60006008838154811061344f57fe5b9060005260206000209060020201905061346881613cc4565b61347157600080fd5b60018201805467ffffffffffffffff60401b1916600160401b426001600160401b0316021790556134a482858386613a67565b6134ad57600080fd5b6119e58484613d24565b600454600160a01b900460ff16156134ce57600080fd5b600f543410156134dd57600080fd5b6000828152600d6020526040902080546001600160401b0316821161350157600080fd5b6040805184815290517f191e0543c66edcea968f62447117864399037ec1d189931eee2ddcbd5d45489d9181900360200190a1505050565b6000546001600160a01b0316331461355057600080fd5b61355c60068585613e1e565b5061356960078383613e1e565b5050505050565b6000918252600b602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b038083166000818152600a60209081526040808320805460010190558583526009909152902080546001600160a01b0319169091179055831615613631576001600160a01b0383166000908152600a602090815260408083208054600019019055838352600c825280832080546001600160a01b0319908116909155600b909252909120805490911690555b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008963ffffffff168a1461368b57600080fd5b8863ffffffff16891461369d57600080fd5b8763ffffffff1688146136af57600080fd5b6136b7613e9c565b506040805160e0810182528881526001600160401b0342166020820152600091810182905263ffffffff808d1660608301528b8116608083015260a082019290925290891660c0820152613709613df7565b6040518060800160405280866001600160401b03168152602001896001600160401b03168152602001886001600160401b03168152602001876001600160401b0316815250905060006001600884908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010160086101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548163ffffffff021916908363ffffffff160217905550505003905081600d600083815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160000160106101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160000160186101000a8154816001600160401b0302191690836001600160401b031602179055509050508063ffffffff16811461396457600080fd5b606080840151608080860151865160c080890151604080516001600160a01b038e168152602081018a905263ffffffff9788168183015294871697850197909752938301919091529190921660a08301526001600160401b0389169082015290517fdf8d8992e7e860a8605ceb50aa640d5209227db91bcd9ec915a1d4c56d68a5b99181900360e00190a16139fb6000868361359e565b9c9b505050505050505050505050565b6000908152600960205260409020546001600160a01b0391821691161490565b6000546001600160a01b03163314613a4257600080fd5b600454600160a01b900460ff16613a5857600080fd5b6004805460ff60a01b19169055565b601454600084815260156020526040812054909163ffffffff166001600160401b0390911610613a9957506000613c51565b825485546e01ed09bead87c0378d8e640000000091829004919004808214613ac657600092505050613c51565b83861415613ad957600092505050613c51565b6001870154600160801b900463ffffffff16841480613b0857506001870154600160a01b900463ffffffff1684145b15613b1857600092505050613c51565b6001850154600160801b900463ffffffff16861480613b4757506001850154600160a01b900463ffffffff1686145b15613b5757600092505050613c51565b6001850154600160801b900463ffffffff161580613b8457506001870154600160801b900463ffffffff16155b15613b9457600192505050613c51565b60018781015490860154600160801b9182900463ffffffff90811692909104161480613bdf575060018088015490860154600160801b900463ffffffff908116600160a01b90920416145b15613bef57600092505050613c51565b60018088015490860154600160a01b900463ffffffff908116600160801b909204161480613c3a575060018781015490860154600160a01b9182900463ffffffff9081169290910416145b15613c4a57600092505050613c51565b6001925050505b949350505050565b60008181526009602052604080822054848352908220546001600160a01b03918216911680821480611f0457506000858152600c60205260409020546001600160a01b03908116908316149250505092915050565b60010154600160c01b900463ffffffff16151590565b60010154600160c01b900463ffffffff161590565b60008060088481548110613ce957fe5b90600052602060002090600202019050600060088481548110613d0857fe5b90600052602060002090600202019050611f0482868387613a67565b600060088381548110613d3357fe5b600091825260208083206001600290930201828101805463ffffffff8816600160c01b0263ffffffff60c01b19909116179055868452600c8252604080852080546001600160a01b0319908116909155878652818620805490911690556013805490940190935586845260098252928290205482516001600160a01b0391909116815290810186905280820185905290519192507f6b4808987a5cecdf67d54ca5dc20664fafca80ef7195097800c12549245ab20d919081900360600190a1505050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613e5f5782800160ff19823516178555613e8c565b82800160010185558215613e8c579182015b82811115613e8c578235825591602001919060010190613e71565b50613e98929150613ed8565b5090565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b61158691905b80821115613e985760008155600101613ede56fe6f6e455243373231526563656976656428616464726573732c616464726573732c75696e743235362c6279746573296f6e455243373231526563656976656428616464726573732c75696e743235362c627974657329a265627a7a72305820a2519486d7e80a0b5f8dc4d89b1b059c0dc278b9f2a407309cb4f51303a42b3864736f6c634300050a003268747470733a2f2f7777772e6472616b6f6e732e696f2f7365727665722f6170692f647261676f6e2f6d657461646174612f

Deployed ByteCode Sourcemap

83928:4367:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85746:11;;-1:-1:-1;;;;;85746:11:0;85724:10;:34;;:87;;-1:-1:-1;85797:13:0;;-1:-1:-1;;;;;85797:13:0;85775:10;:36;85724:87;85702:120;;;;;;83928:4367;16132:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16132:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16132:134:0;-1:-1:-1;;;;;;16132:134:0;;:::i;:::-;;;;;;;;;;;;;;;;;;43311:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43311:105:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43311:105:0;;:::i;2308:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2308:33:0;;;:::i;:::-;;;;-1:-1:-1;;;;;2308:33:0;;;;;;;;;;;;;;61510:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61510:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;47364:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47364:39: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;47364:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56022:156;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56022:156:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56022:156:0;;:::i;55131:614::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;55131:614:0;;;;;;;;:::i;2148:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2148:33:0;;;:::i;39123:53::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39123:53:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39123:53:0;;:::i;:::-;;;;-1:-1:-1;;;;;39123:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88180:112;;8:9:-1;5:2;;;30:1;27;20:12;5:2;88180:112:0;;;:::i;77889:485::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;77889:485:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77889:485:0;-1:-1:-1;;;;;77889:485:0;;:::i;16274:210::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16274:210:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;16274:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;16274:210:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;16274:210:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;16274:210:0;;-1:-1:-1;16274:210:0;-1:-1:-1;16274:210:0;:::i;:::-;;;;-1:-1:-1;;;;;;16274:210:0;;;;;;;;;;;;;;43426:902;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43426:902:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;43426:902:0;;;-1:-1:-1;;;;;43426:902:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;57768:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57768:94:0;;;:::i;65449:247::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65449:247:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65449:247:0;;:::i;4227:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4227:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4227:140:0;-1:-1:-1;;;;;4227:140:0;;:::i;39351:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39351:39:0;;;:::i;56660:976::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;56660:976:0;;;;;;;;;;;;;;;;;:::i;3649:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3649:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3649:140:0;-1:-1:-1;;;;;3649:140:0;;:::i;83129:725::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;83129:725:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;83129:725:0;;;;;;;;;;;;;-1:-1:-1;;;;;83129:725:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;4516:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4516:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4516:140:0;-1:-1:-1;;;;;4516:140:0;;:::i;75715:670::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;75715:670: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;75715:670:0;;;;;;;;;;;;;;;;;60164:442;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60164:442:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;60164:442:0;;;;;;;;:::i;78494:1023::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;78494:1023:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;78494:1023:0;;;;;;;;;;;;;;;;;:::i;87324:286::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;87324:286:0;;;:::i;3938:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3938:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3938:140:0;-1:-1:-1;;;;;3938:140:0;;:::i;52756:155::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;52756:155:0;;;;;;;;;;;;;;;;;:::i;39060:56::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39060:56:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39060:56:0;;:::i;68523:401::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;68523:401:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;68523:401:0;;;;;;;:::i;79685:836::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;79685:836:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;79685:836:0;;;;;;;;;;;;;;;;;:::i;64492:95::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64492:95:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64492:95:0;;:::i;64074:195::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64074:195:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;64074:195:0;;;;;;;;:::i;4805:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4805:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4805:140:0;-1:-1:-1;;;;;4805:140:0;;:::i;59503:107::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59503:107:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;59503:107:0;;:::i;2451:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2451:26:0;;;:::i;38880:54::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38880:54:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38880:54:0;;:::i;87696:424::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;87696:424:0;;;:::i;2188:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2188:33:0;;;:::i;54463:147::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54463:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54463:147:0;;:::i;84049:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;84049:33:0;;;:::i;77295:475::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;77295:475:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77295:475:0;-1:-1:-1;;;;;77295:475:0;;:::i;50270:124::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50270:124:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50270:124:0;-1:-1:-1;;;;;50270:124:0;;:::i;85301:167::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;85301:167:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;85301:167:0;-1:-1:-1;;;;;85301:167:0;;:::i;38996:57::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38996:57:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38996:57:0;;:::i;82561:460::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;82561:460:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;82561:460:0;;;;;;;-1:-1:-1;;;;;82561:460:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;82561:460:0;;:::i;61549:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61549:32:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5406:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5406:83:0;;;:::i;58331:915::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58331:915:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58331:915:0;-1:-1:-1;;;;;58331:915:0;;:::i;2228:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2228:33:0;;;:::i;81705:145::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81705:145:0;;;:::i;76393:103::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;76393:103:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;76393:103:0;;;;:::i;47410:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47410:39:0;;;:::i;45622:203::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45622:203:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45622:203:0;;;;;;;;;;:::i;53299:1024::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53299:1024:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;53299:1024:0;;;;;;;;:::i;2268:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2268:33:0;;;:::i;61412:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61412:38:0;;;:::i;51259:1130::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;51259:1130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;51259:1130:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;51259:1130:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;51259:1130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;51259:1130:0;;-1:-1:-1;51259:1130:0;;-1:-1:-1;;;;;51259:1130:0:i;15810:83::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15810:83:0;;;:::i;45833:1004::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45833:1004:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45833:1004:0;;:::i;73527:2180::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;73527:2180:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;73527:2180:0;;;;;;;;-1:-1:-1;;;;;73527:2180:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;65067:225::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65067:225:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65067:225:0;;:::i;15900:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15900:33:0;;;:::i;85969:990::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;85969:990:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;85969:990:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81916:207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81916:207:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;39309:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39309:35:0;;;:::i;39260:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39260:40:0;;;:::i;45069:150::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45069:150:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45069:150:0;;;;;;;;;;:::i;80777:723::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;80777:723:0;;;;;;;:::i;70505:2095::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;70505:2095:0;;;;;;;:::i;44336:426::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44336:426:0;;;;;;;:::i;48580:173::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48580:173:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;48580:173:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;48580:173:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;48580:173:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;48580:173:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;48580:173:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;48580:173:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;48580:173:0;;-1:-1:-1;48580:173:0;-1:-1:-1;48580:173:0;:::i;16132:134::-;-1:-1:-1;;;;;;16226:32:0;;16202:4;16226:32;;;:19;:32;;;;;;;;16132:134;;;;:::o;43311:105::-;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;43385:14;:23;43311:105::o;2308:33::-;;;-1:-1:-1;;;;;2308:33:0;;:::o;61510:30::-;;;;:::o;47364:39::-;;;;;;;;;;;;;;-1:-1:-1;;;47364:39:0;;;;:::o;56022:156::-;56107:7;39458:28;;;:18;:28;;;;;;56088:8;;-1:-1:-1;;;;;39458:28:0;39450:51;;;;;;-1:-1:-1;;56139:31:0;;;;:21;:31;;;;;;-1:-1:-1;;;;;56139:31:0;;56022:156::o;55131:614::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;55364:13;55380:28;;;:18;:28;;;;;;-1:-1:-1;;;;;55380:28:0;55436:10;55427:19;;;:52;;-1:-1:-1;;;;;;55450:17:0;;;;;;:10;:17;;;;;;;;55468:10;55450:29;;;;;;;;;;55427:52;55419:61;;;;;;55562:29;55571:8;55581:9;55562:8;:29::i;:::-;55728:8;55717:9;-1:-1:-1;;;;;55701:36:0;55710:5;-1:-1:-1;;;;;55701:36:0;;;;;;;;;;;5093:1;55131:614;;:::o;2148:33::-;;;-1:-1:-1;;;;;2148:33:0;;:::o;39123:53::-;;;;;;;;;;;;-1:-1:-1;;;;;39123:53:0;;;;-1:-1:-1;;;39123:53:0;;;;;-1:-1:-1;;;39123:53:0;;;;;-1:-1:-1;;;39123:53:0;;;;:::o;88180:112::-;88236:7;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;-1:-1:-1;88271:4:0;88263:21;3491:1;88180:112;:::o;77889:485::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;77968:36;78026:8;77968:67;;78238:17;-1:-1:-1;;;;;78238:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;78238:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;78238:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;78238:40:0;78230:49;;;;;;78333:13;:33;;-1:-1:-1;;;;;;78333:33:0;-1:-1:-1;;;;;78333:33:0;;;;;;;;;;-1:-1:-1;77889:485:0:o;16274:210::-;16391:6;16423:52;;;;;;;;;;;;;;;;;;;16274:210;-1:-1:-1;;;;;;;16274:210:0:o;43426:902::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;3039:10;;-1:-1:-1;;;;;3039:10:0;3025;:24;3017:33;;;;;;43607:39;43649:23;;;:12;:23;;;;;43701:28;;-1:-1:-1;;;;;43701:28:0;;;43693:36;;;;43685:45;;;;;;43761:26;;-1:-1:-1;;;;;;;;43761:26:0;;;;;43749:38;;;;;43741:47;;;;;;43820:27;;-1:-1:-1;;;;;;;;43820:27:0;;;;;43807:40;;;;;43799:49;;;;;;43884:31;;-1:-1:-1;;;;;;;;43884:31:0;;;;;43867:48;;;;;43859:57;;;;;;43929:32;;:::i;:::-;-1:-1:-1;43964:168:0;;;;;;;;-1:-1:-1;;;;;43964:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44145:23:0;;;:12;:23;;;;;;:38;;;;;;;;;;-1:-1:-1;;44145:38:0;;;;;;;-1:-1:-1;;;;44145:38:0;-1:-1:-1;;;44145:38:0;;;;;;;;;;;-1:-1:-1;;;;44145:38:0;-1:-1:-1;;;44145:38:0;;;;;;;;-1:-1:-1;;;;;44145:38:0;-1:-1:-1;;;44145:38:0;;;;;;;;;;;;;;44214:14;;44194:35;;43964:168;;44194:10;;:35;;;;;;-1:-1:-1;44194:35:0;44214:14;44194:10;:35;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;44245:73:0;;;;;;-1:-1:-1;;;;;44245:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3061:1;;43426:902;;;;;:::o;57768:94::-;57836:7;:14;-1:-1:-1;;57836:18:0;57768:94;:::o;65449:247::-;65524:4;65566:1;65554:9;:13;65546:22;;;;;;65652:7;65660:9;65652:18;;;;;;;;;;;;;;;;;;;;;:31;;;-1:-1:-1;;;65652:31:0;;;;:36;;;65449:247;-1:-1:-1;;65449:247:0:o;4227:140::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;-1:-1:-1;;;;;4304:21:0;;4296:30;;;;;;4339:10;:20;;-1:-1:-1;;;;;;4339:20:0;-1:-1:-1;;;;;4339:20:0;;;;;;;;;;4227:140::o;39351:39::-;;;-1:-1:-1;;;;;39351:39:0;;:::o;56660:976::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;-1:-1:-1;;;;;56854:17:0;;56846:26;;;;;;-1:-1:-1;;;;;57123:20:0;;57138:4;57123:20;;57115:29;;;;;;57306:13;57322:17;57330:8;57322:7;:17::i;:::-;57306:33;;57367:5;-1:-1:-1;;;;;57358:14:0;:5;-1:-1:-1;;;;;57358:14:0;;57350:23;;;;;;-1:-1:-1;;;;;57393:19:0;;57402:10;57393:19;;:68;;-1:-1:-1;57416:31:0;;;;:21;:31;;;;;;-1:-1:-1;;;;;57416:31:0;57451:10;57416:45;57393:68;:101;;;-1:-1:-1;;;;;;57465:17:0;;;;;;:10;:17;;;;;;;;57483:10;57465:29;;;;;;;;;;57393:101;57384:111;;;;;;57597:31;57607:5;57614:3;57619:8;57597:9;:31::i;:::-;5093:1;56660:976;;;:::o;3649:140::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;-1:-1:-1;;;;;3726:21:0;;3718:30;;;;;;3761:10;:20;;-1:-1:-1;;;;;;3761:20:0;-1:-1:-1;;;;;3761:20:0;;;;;;;;;;3649:140::o;83129:725::-;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;83463:16;83482:82;83496:1;83499;83502;83505:4;83511:8;83521:9;83532:13;83547:1;83558:4;83482:13;:82::i;:::-;83602:11;;83463:101;;-1:-1:-1;83575:40:0;;83463:101;;-1:-1:-1;;;;;83602:11:0;83575:8;:40::i;:::-;83628:11;;:185;;;-1:-1:-1;;;83628:185:0;;;;;;;;;;;;;;;;;;;;;;;;;;83795:4;83628:185;;;;;;-1:-1:-1;;;;;83628:11:0;;;;:25;;:185;;;;;:11;;:185;;;;;;;;:11;;:185;;;5:2:-1;;;;30:1;27;20:12;5:2;83628:185:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;83628:185:0;;;;3491:1;83129:725;;;;;;;:::o;4516:140::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;-1:-1:-1;;;;;4593:21:0;;4585:30;;;;;;4628:10;:20;;-1:-1:-1;;;;;;4628:20:0;-1:-1:-1;;;;;4628:20:0;;;;;;;;;;4516:140::o;75715:670::-;75767:36;75822:15;;75841:1;75822:20;75818:560;;;-1:-1:-1;75866:16:0;;;75880:1;75866:16;;;;;;;;75859:23;;75818:560;75915:23;75955:15;;75941:30;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;75941:30:0;;75915:56;;75986:20;76009:13;:11;:13::i;:::-;75986:36;-1:-1:-1;76037:19:0;76127:1;76111:226;76142:12;76130:8;:24;76111:226;;76191:20;76202:8;76191:10;:20::i;:::-;76187:135;;;76258:8;76236:6;76243:11;76236:19;;;;;;;;;;;;;;;;;:30;76289:13;;;;;76187:135;76156:10;;76111:226;;;76360:6;76353:13;;;;;;;;60164:442;60248:16;;60327:1;60310:270;60335:13;:11;:13::i;:::-;60330:1;:18;60310:270;;60374:21;;;;:18;:21;;;;;;-1:-1:-1;;;;;60374:31:0;;;:21;;:31;60370:199;;;60439:6;60430:5;:15;60426:128;;;60477:1;-1:-1:-1;60470:8:0;;-1:-1:-1;60470:8:0;60426:128;60527:7;;;;;60426:128;60350:3;;60310:270;;;;60590:8;;;60164:442;;;;;:::o;78494:1023::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;78880:28;78886:10;78898:9;78880:5;:28::i;:::-;78872:37;;;;;;79127:21;79138:9;79127:10;:21::i;:::-;79126:22;79118:31;;;;;;79188:11;;79160:41;;79169:9;;-1:-1:-1;;;;;79188:11:0;79160:8;:41::i;:::-;79344:11;;:165;;;-1:-1:-1;;;79344:165:0;;;;;;;;;;;;;;;;;;;;;;;;;;79488:10;79344:165;;;;;;-1:-1:-1;;;;;79344:11:0;;;;:25;;:165;;;;;:11;;:165;;;;;;;;:11;;:165;;;5:2:-1;;;;30:1;27;20:12;5:2;79344:165:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;79344:165:0;;;;78494:1023;;;;:::o;87324:286::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;5222:6;;-1:-1:-1;;;5222:6:0;;;;5214:15;;;;;;87396:11;;-1:-1:-1;;;;;87396:11:0;87380:43;;;;;;87450:13;;-1:-1:-1;;;;;87450:13:0;87434:45;;;;;;87498:18;;-1:-1:-1;;;;;87498:18:0;:32;87490:41;;;;;;87587:15;:13;:15::i;:::-;87324:286::o;3938:140::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;-1:-1:-1;;;;;4015:21:0;;4007:30;;;;;;4050:10;:20;;-1:-1:-1;;;;;;4050:20:0;-1:-1:-1;;;;;4050:20:0;;;;;;;;;;3938:140::o;52756:155::-;52861:42;52878:5;52885:3;52890:8;52861:42;;;;;;;;;;;;:16;:42::i;:::-;52756:155;;;:::o;39060:56::-;;;;;;;;;;;;-1:-1:-1;;;;;39060:56:0;;:::o;68523:401::-;68618:4;68660:1;68648:9;:13;68640:22;;;;;;68691:1;68681:7;:11;68673:20;;;;;;68704:21;68728:7;68736:9;68728:18;;;;;;;;;;;;;;;;;;68704:42;;68757:19;68779:7;68787;68779:16;;;;;;;;;;;;;;;;;;68757:38;;68813:52;68832:6;68840:9;68851:4;68857:7;68813:18;:52::i;:::-;:103;;;;;68878:38;68897:7;68906:9;68878:18;:38::i;:::-;68806:110;68523:401;-1:-1:-1;;;;;68523:401:0:o;79685:836::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;80073:28;80079:10;80091:9;80073:5;:28::i;:::-;80065:37;;;;;;80121:25;80136:9;80121:14;:25::i;:::-;80113:34;;;;;;80186:13;;80158:43;;80167:9;;-1:-1:-1;;;;;80186:13:0;80158:8;:43::i;:::-;80346:13;;:167;;;-1:-1:-1;;;80346:167:0;;;;;;;;;;;;;;;;;;;;;;;;;;80492:10;80346:167;;;;;;-1:-1:-1;;;;;80346:13:0;;;;:27;;:167;;;;;:13;;:167;;;;;;;;:13;;:167;;;5:2:-1;;;;30:1;27;20:12;64492:95:0;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;64561:12;:18;64492:95::o;64074:195::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;64186:26;64192:10;64204:7;64186:5;:26::i;:::-;64178:35;;;;;;64224:29;;;;:20;:29;;;;;:37;;-1:-1:-1;;;;;;64224:37:0;-1:-1:-1;;;;;64224:37:0;;;;;;;;;;64074:195::o;4805:140::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;-1:-1:-1;;;;;4882:21:0;;4874:30;;;;;;4917:10;:20;;-1:-1:-1;;;;;;4917:20:0;-1:-1:-1;;;;;4917:20:0;;;;;;;;;;4805:140::o;2451:26::-;;;-1:-1:-1;;;2451:26:0;;;;;:::o;38880:54::-;;;;;;;;;;;;-1:-1:-1;;;;;38880:54:0;;:::o;87696:424::-;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;87934:12;;87911:15;;87780:4;87772:21;;87929:1;87911:19;;;87910:36;87963:22;;;87959:154;;;88058:10;;:43;;-1:-1:-1;;;;;88058:10:0;;;;88078:22;;;88058:43;;;;;:10;:43;:10;:43;88078:22;88058:10;:43;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;87959:154:0;3491:1;;87696:424::o;2188:33::-;;;-1:-1:-1;;;;;2188:33:0;;:::o;54463:147::-;54542:7;39458:28;;;:18;:28;;;;;;54523:8;;-1:-1:-1;;;;;39458:28:0;39450:51;;;;;;-1:-1:-1;;54574:28:0;;;;:18;:28;;;;;;-1:-1:-1;;;;;54574:28:0;;54463:147::o;84049:33::-;;;-1:-1:-1;;;;;84049:33:0;;:::o;77295:475::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;77372:34;77426:8;77372:63;;77638:17;-1:-1:-1;;;;;77638:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;77638:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;77638:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77638:38:0;77630:47;;;;;;77731:11;:31;;-1:-1:-1;;;;;;77731:31:0;-1:-1:-1;;;;;77731:31:0;;;;;;;;;;-1:-1:-1;77295:475:0:o;50270:124::-;-1:-1:-1;;;;;50359:27:0;50326:13;50359:27;;;:19;:27;;;;;;;50270:124::o;85301:167::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;5222:6;;-1:-1:-1;;;5222:6:0;;;;5214:15;;;;;;85384:18;:32;;-1:-1:-1;;;;;85384:32:0;;-1:-1:-1;;;;;;85384:32:0;;;;;;;;85432:28;;;;;;;;;;;;;;;;85301:167;:::o;38996:57::-;;;;;;;;;;;;-1:-1:-1;;;;;38996:57:0;;:::o;82561:460::-;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;82813:6;-1:-1:-1;;;;;82834:25:0;;82830:82;;-1:-1:-1;82890:10:0;;-1:-1:-1;;;;;82890:10:0;82830:82;82924:89;82938:1;82941;82944;82947:4;82953:8;82963:9;82974:13;82989:10;83001:11;82924:13;:89::i;61549:32::-;;;;;;:::o;5406:83::-;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;5468:6;:13;;-1:-1:-1;;;;5468:13:0;-1:-1:-1;;;5468:13:0;;;5406:83::o;58331:915::-;58392:28;58433:18;58454:17;58464:6;58454:9;:17::i;:::-;58433:38;-1:-1:-1;58488:15:0;58484:755;;-1:-1:-1;;58565:16:0;;;58579:1;58565:16;;;;;;;;58558:23;;58484:755;58614:23;58654:10;58640:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;58640:25:0;;58614:51;;58680:20;58703:13;:11;:13::i;:::-;58680:36;-1:-1:-1;58731:19:0;58970:1;58954:244;58985:12;58973:8;:24;58954:244;;59034:28;;;;:18;:28;;;;;;-1:-1:-1;;;;;59034:38:0;;;:28;;:38;59030:153;;;59119:8;59097:6;59104:11;59097:19;;;;;;;;;;;;;;;;;:30;59150:13;;;;;59030:153;58999:10;;58954:244;;;59221:6;59214:13;;;;;;;;;2228:33;;;-1:-1:-1;;;;;2228:33:0;;:::o;81705:145::-;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;81771:11;;;;;;;;;-1:-1:-1;;;;;81771:11:0;-1:-1:-1;;;;;81771:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81771:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;81771:29:0;;;;81811:13;;;;;;;;;-1:-1:-1;;;;;81811:13:0;-1:-1:-1;;;;;81811:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81811:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;76393:103:0;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;76465:14;:23;;-1:-1:-1;;76465:23:0;;;;;;;;;;;;76393:103::o;47410:39::-;;;;;;;;;;;;;;-1:-1:-1;;;47410:39:0;;;;:::o;45622:203::-;45714:47;;;;;;;;;;-1:-1:-1;;;;;45714:47:0;;;45729:10;;45714:47;;;;;;;;;45783:10;45772:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;45772:33:0;;;;;;;;;;;;;:45;;-1:-1:-1;;45772:45:0;;;;;;;;;;45622:203::o;53299:1024::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;-1:-1:-1;;;;;53501:17:0;;53493:26;;;;;;-1:-1:-1;;;;;53770:20:0;;53785:4;53770:20;;53762:29;;;;;;54030:11;;-1:-1:-1;;;;;54015:27:0;;;54030:11;;54015:27;;54007:36;;;;;;54077:13;;-1:-1:-1;;;;;54062:29:0;;;54077:13;;54062:29;;54054:38;;;;;;54160:27;54166:10;54178:8;54160:5;:27::i;:::-;54152:36;;;;;;54279;54289:10;54301:3;54306:8;54279:9;:36::i;2268:33::-;;;-1:-1:-1;;;;;2268:33:0;;:::o;61412:38::-;;;;:::o;51259:1130::-;-1:-1:-1;;;;;51389:17:0;;51381:26;;;;;;-1:-1:-1;;;;;51426:20:0;;51441:4;51426:20;;51418:29;;;;;;51481:11;;-1:-1:-1;;;;;51466:27:0;;;51481:11;;51466:27;;51458:36;;;;;;51528:13;;-1:-1:-1;;;;;51513:29:0;;;51528:13;;51513:29;;51505:38;;;;;;51707:13;51723:17;51731:8;51723:7;:17::i;:::-;51707:33;;51768:5;-1:-1:-1;;;;;51759:14:0;:5;-1:-1:-1;;;;;51759:14:0;;51751:23;;;;;;-1:-1:-1;;;;;51794:19:0;;51803:10;51794:19;;:68;;-1:-1:-1;51817:31:0;;;;:21;:31;;;;;;-1:-1:-1;;;;;51817:31:0;51852:10;51817:45;51794:68;:101;;;-1:-1:-1;;;;;;51866:17:0;;;;;;:10;:17;;;;;;;;51884:10;51866:29;;;;;;;;;;51794:101;51785:111;;;;;;51997:31;52007:5;52014:3;52019:8;51997:9;:31::i;:::-;52095:16;;52137:8;;;;52134:248;;52308:60;;52213:3;;52308:60;;;;;;;;;;;;;;;-1:-1:-1;;;52240:57:0;;52266:10;52240:57;;;;;;-1:-1:-1;;;;;52240:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52240:129:0;;;;-1:-1:-1;52240:25:0;;;;;;52277:5;;52283:8;;52292:4;;52240:57;;;;;;;;;;;;;;-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;52240:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52240:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52240:57:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52240:57:0;-1:-1:-1;;;;;;52240:129:0;;52232:138;;;;;;52134:248;;51259:1130;;;;;;:::o;15810:83::-;;;;;;;;;;;;;;;-1:-1:-1;;15810:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45833:1004::-;39498:1;39458:28;;;:18;:28;;;;;;45915:13;;45896:8;;-1:-1:-1;;;;;39458:28:0;39450:51;;;;;;46000:20;;;45963:2;46000:20;;;;;;;;;45976:21;;45963:2;46000:20;;;21:6:-1;;104:10;46000:20:0;87:34:-1;135:17;;-1:-1;;46169:14:0;46152:32;;;;;;;;-1:-1:-1;;46152:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45976:44;;-1:-1:-1;46031:6:0;;46071:8;;46105:2;;46120:21;;46152:32;;46169:14;46152:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46197:193;46204:16;;46197:193;;46330:13;;46339:3;;;;46268:2;46299:16;;;;46254;;46357:19;;;46346:32;;;46330:8;;:13;;;;;;;;;:48;-1:-1:-1;;;;;46330:48:0;;;;;;;;;46197:193;;;;46402:14;46447:1;46429:8;:15;:19;46419:30;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;46419:30:0;87:34:-1;135:17;;-1:-1;46419:30:0;-1:-1:-1;46402:47:0;-1:-1:-1;46460:6:0;46522:83;46538:8;:15;46534:1;:19;46522:83;;;46582:8;46591:1;46582:11;;;;;;;;;;;;;;;;46575:1;46577;46575:4;;;;;;;;;;;:18;-1:-1:-1;;;;;46575:18:0;;;;;;;;-1:-1:-1;46555:3:0;;46522:83;;;-1:-1:-1;46670:1:0;46661:95;46677:1;46673;:5;46661:95;;;46725:8;46742:1;46738;46734;:5;:9;46725:19;;;;;;;;;;;;;;;;46700:1;46706:8;:15;46702:1;:19;46700:22;;;;;;;;;;;:44;-1:-1:-1;;;;;46700:44:0;;;;;;;;-1:-1:-1;46680:3:0;;46661:95;;;-1:-1:-1;46827:1:0;45833:1004;-1:-1:-1;;;;;;;;;45833:1004:0:o;73527:2180::-;5075:6;;73714:7;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;3039:10;;-1:-1:-1;;;;;3039:10:0;3025;:24;3017:33;;;;;;73794:21;73818:7;73826:9;73818:18;;;;;;;;;;;;;;;;;;;;;73910:16;;;;73818:18;;-1:-1:-1;;;;;;73910:16:0;73902:30;;;;;;74028:27;74048:6;74028:19;:27::i;:::-;74020:36;;;;;;74139:19;;;;74191:7;:15;;-1:-1:-1;;;74139:19:0;;;;;;74122:14;;74191:7;74139:19;;74191:15;;;;;;;;;;;;;;74308:17;;;;;74191:15;;;;;;;74340;;;;74191;;-1:-1:-1;74308:17:0;-1:-1:-1;;;74308:17:0;;;;;;;74340:15;;;;:35;-1:-1:-1;74336:95:0;;;-1:-1:-1;74404:15:0;;;;-1:-1:-1;;;74404:15:0;;;;74336:95;74501:16;74520:9;74501:28;;74540:14;74557:8;74540:25;;74576:15;74594:9;74576:27;;74614:19;74636:13;74614:35;;74660:16;74679:10;74660:29;;74702:16;74721:4;74702:23;;74771:13;74787:18;:28;74806:8;74787:28;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;74787:28:0;74771:44;;74983:16;75002:107;75016:8;75026:6;75034:9;75046:1;75034:13;75002:107;;75049:8;75059:7;75068:8;75078:12;75092:9;75103:5;75002:13;:107::i;:::-;75171:18;;;;:8;:18;;;;;;:20;;-1:-1:-1;;75171:20:0;;;-1:-1:-1;;;;;75171:20:0;;;;;;;;;;;;75357:19;;75350:26;;-1:-1:-1;;;;75350:26:0;;;75457:15;:17;;-1:-1:-1;;75457:17:0;;;75619:12;;75599:33;;74983:126;;-1:-1:-1;75599:10:0;;:33;;;;;;75171:18;75599:33;75619:12;75599:10;:33;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;75691:8:0;-1:-1:-1;;;;;;;;;;;;73527:2180:0;;;;;;;;:::o;65067:225::-;65146:4;65188:1;65176:9;:13;65168:22;;;;;;65201:21;65225:7;65233:9;65225:18;;;;;;;;;;;;;;;;;;65201:42;;65261:23;65277:6;65261:15;:23::i;:::-;65254:30;65067:225;-1:-1:-1;;;65067:225:0:o;15900:33::-;;;;;;;;;;;;;;;-1:-1:-1;;15900:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85969:990;86049:11;86071:17;86099;86127:16;86154:14;86179:20;86210:18;86239:17;86267:15;86293:16;86320:20;86359:21;86383:7;86391:3;86383:12;;;;;;;;;;;;;;;;;;86359:36;;86406:32;86441:12;:17;86454:3;86441:17;;;;;;;;;;;86406:52;;86477:6;:10;;;86471:16;;86518:6;:16;;;;;;;;;;-1:-1:-1;;;;;86518:16:0;-1:-1:-1;;;;;86510:25:0;86498:37;;86566:6;:16;;;;;;;;;;-1:-1:-1;;;;;86566:16:0;-1:-1:-1;;;;;86558:25:0;86546:37;;86613:6;:15;;;;;;;;;;;;86605:24;;86594:35;;86657:6;:13;;;;;;;;;;;;86649:22;;86640:31;;86705:6;:19;;;;;;;;;;;;86697:28;;86682:43;;86757:6;:17;;;;;;;;;;;;86749:26;;86736:39;;86798:11;:21;;;;;;;;;;-1:-1:-1;;;;;86798:21:0;-1:-1:-1;;;;;86786:33:0;;;86840:11;:19;;;;;;;;;;-1:-1:-1;;;;;86840:19:0;-1:-1:-1;;;;;86830:29:0;;;86881:11;:20;;;;;;;;;;-1:-1:-1;;;;;86881:20:0;-1:-1:-1;;;;;86870:31:0;;;86927:11;:24;;;;;;;;;;-1:-1:-1;;;;;86927:24:0;-1:-1:-1;;;;;86912:39:0;;;85969:990;;;;;;;;;;;;;;;:::o;81916:207::-;81980:7;3295:10;;81980:7;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;-1:-1:-1;;82039:11:0;;82082:13;;-1:-1:-1;;;;;82039:11:0;;;82031:28;;82082:13;82074:30;81916:207;;:::o;39309:35::-;;;-1:-1:-1;;;;;39309:35:0;;:::o;39260:40::-;;;;:::o;45069:150::-;-1:-1:-1;;;;;45182:18:0;;;45153:4;45182:18;;;:10;:18;;;;;;;;:29;;;;;;;;;;;;;;;45069:150::o;80777:723::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;80984:28;80990:10;81002:9;80984:5;:28::i;:::-;80976:37;;;;;;81032:25;81047:9;81032:14;:25::i;:::-;81024:34;;;;;;81077:43;81101:9;81112:7;81077:23;:43::i;:::-;81069:52;;;;;;81210:13;;:38;;;-1:-1:-1;;;81210:38:0;;;;;;;;;;81187:20;;-1:-1:-1;;;;;81210:13:0;;:29;;:38;;;;;;;;;;;;;;:13;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;81210:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;81210:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;81210:38:0;81295:12;;81210:38;;-1:-1:-1;81280:27:0;;81267:9;:40;;81259:49;;;;;;81377:13;;81413:12;;81377:58;;;-1:-1:-1;;;81377:58:0;;;;;;;;;;-1:-1:-1;;;;;81377:13:0;;;;:17;;81401:9;:24;;81377:58;;;;;:13;;:58;;;;;;;;81401:24;81377:13;:58;;;5:2:-1;;;;30:1;27;20:12;5:2;81377:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;81377:58:0;;;;;81446:46;81464:9;81446:46;;81483:7;81446:46;;:10;:46::i;70505:2095::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;70679:12;;70666:9;:25;;70658:34;;;;;;70753:28;70759:10;70771:9;70753:5;:28::i;:::-;70745:37;;;;;;71699:38;71718:7;71727:9;71699:18;:38::i;:::-;71691:47;;;;;;71804:21;71828:7;71836:9;71828:18;;;;;;;;;;;;;;;;;;71804:42;;71950:23;71966:6;71950:15;:23::i;:::-;71942:32;;;;;;72038:19;72060:7;72068;72060:16;;;;;;;;;;;;;;;;;;72038:38;;72178:21;72194:4;72178:15;:21::i;:::-;72170:30;;;;;;72246:16;;;:30;;-1:-1:-1;;;;72246:30:0;-1:-1:-1;;;72272:3:0;-1:-1:-1;;;;;72246:30:0;;;;;72358:135;72246:16;72420:9;72448:4;72471:7;72358:18;:135::i;:::-;72350:144;;;;;;72562:30;72573:9;72584:7;72562:10;:30::i;44336:426::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;44481:14;;44468:9;:27;;44460:36;;;;;;44509:39;44551:23;;;:12;:23;;;;;44601:28;;-1:-1:-1;;;;;44601:28:0;44593:36;;44585:45;;;;;;44648:29;;;;;;;;;;;;;;;;;5093:1;44336:426;;:::o;48580:173::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;48686:24;:14;48703:7;;48686:24;:::i;:::-;-1:-1:-1;48721:24:0;:14;48738:7;;48721:24;:::i;:::-;;48580:173;;;;:::o;49963:126::-;50038:31;;;;:21;:31;;;;;;:43;;-1:-1:-1;;;;;;50038:43:0;-1:-1:-1;;;;;50038:43:0;;;;;;;;;49963:126::o;39597:994::-;-1:-1:-1;;;;;39838:24:0;;;;;;;:19;:24;;;;;;;;:26;;;;;;39987:28;;;:18;:28;;;;;:34;;-1:-1:-1;;;;;;39987:34:0;;;;;;40123:19;;;40119:324;;-1:-1:-1;;;;;40159:26:0;;;;;;:19;:26;;;;;;;;:28;;-1:-1:-1;;40159:28:0;;;40283:30;;;:20;:30;;;;;40276:37;;-1:-1:-1;;;;;;40276:37:0;;;;;;40400:21;:31;;;;;;40393:38;;;;;;;40119:324;40574:8;40569:3;-1:-1:-1;;;;;40553:30:0;40562:5;-1:-1:-1;;;;;40553:30:0;;;;;;;;;;;39597:994;;;:::o;41490:1813::-;41792:4;41850:9;41835:26;;41822:9;:39;41814:48;;;;;;41907:7;41892:24;;41881:7;:35;41873:44;;;;;;41966:11;41951:28;;41936:11;:43;41928:52;;;;;;41993:21;;:::i;:::-;-1:-1:-1;42017:267:0;;;;;;;;;;;-1:-1:-1;;;;;42081:3:0;42017:267;;;;;-1:-1:-1;42017:267:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42297:33;;:::i;:::-;42333:173;;;;;;;;42372:10;-1:-1:-1;;;;;42333:173:0;;;;;42406:8;-1:-1:-1;;;;;42333:173:0;;;;;42439:9;-1:-1:-1;;;;;42333:173:0;;;;;42477:13;-1:-1:-1;;;;;42333:173:0;;;;42297:209;;42519:19;42565:1;42541:7;42554;42541:21;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;42541:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42541:21:0;;;;;-1:-1:-1;;;;;42541:21:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42541:21:0;;;;;-1:-1:-1;;;;;42541:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;42519:47;;42607:13;42579:12;:25;42592:11;42579:25;;;;;;;;;;;:41;;;;;;;;;;;;;-1:-1:-1;;;;;42579:41:0;;;;;-1:-1:-1;;;;;42579:41:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42579:41:0;;;;;-1:-1:-1;;;;;42579:41:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42579:41:0;;;;;-1:-1:-1;;;;;42579:41:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42579:41:0;;;;;-1:-1:-1;;;;;42579:41:0;;;;;;;;;42814:11;42799:28;;42784:11;:43;42776:52;;;;;;42954:16;;;;;42994:14;;;;;43024:11;;43050:18;;;;;42879:225;;;-1:-1:-1;;;;;42879:225:0;;;;;;;;;;42946:25;;;;42879:225;;;;42986:23;;;42879:225;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42879:225:0;;;;;;;;;;;;;;;;;43222:42;43240:1;43244:6;43252:11;43222:9;:42::i;:::-;43284:11;41490:1813;-1:-1:-1;;;;;;;;;;;;41490:1813:0:o;48967:148::-;49042:4;49066:28;;;:18;:28;;;;;;-1:-1:-1;;;;;49066:41:0;;;:28;;:41;;48967:148::o;5784:129::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;5222:6;;-1:-1:-1;;;5222:6:0;;;;5214:15;;;;;;5891:6;:14;;-1:-1:-1;;;;5891:14:0;;;5784:129::o;66107:1492::-;66344:14;;66296:4;66321:19;;;:8;:19;;;;;;66296:4;;66344:14;;-1:-1:-1;;;;;66321:19:0;;;:37;66318:81;;-1:-1:-1;66382:5:0;66375:12;;66318:81;66433:9;;66484:11;;66445:4;66433:16;;;;;66484:18;;66519:28;;;66515:71;;66569:5;66562:12;;;;;;66515:71;66661:7;66648:9;:20;66644:65;;;66692:5;66685:12;;;;;;66644:65;66777:16;;;;-1:-1:-1;;;66777:16:0;;;;:27;;;:56;;-1:-1:-1;66808:14:0;;;;-1:-1:-1;;;66808:14:0;;;;:25;;66777:56;66773:101;;;66857:5;66850:12;;;;;;66773:101;66890:14;;;;-1:-1:-1;;;66890:14:0;;;;:27;;;:56;;-1:-1:-1;66921:12:0;;;;-1:-1:-1;;;66921:12:0;;;;:25;;66890:56;66886:101;;;66970:5;66963:12;;;;;;66886:101;67126:14;;;;-1:-1:-1;;;67126:14:0;;;;:19;;:44;;-1:-1:-1;67149:16:0;;;;-1:-1:-1;;;67149:16:0;;;;:21;67126:44;67122:88;;;67194:4;67187:11;;;;;;67122:88;67304:16;;;;;67286:14;;;;-1:-1:-1;;;67304:16:0;;;;;;;;67286:14;;;;;:34;;:70;;-1:-1:-1;67342:14:0;;;;;67324;;;;-1:-1:-1;;;67324:14:0;;67342;67324;;;-1:-1:-1;;;67342:14:0;;;;67324:32;67286:70;67282:115;;;67380:5;67373:12;;;;;;67282:115;67427:16;;;;;67411:12;;;;-1:-1:-1;;;67411:12:0;;67427:16;67411:12;;;-1:-1:-1;;;67427:16:0;;;;67411:32;;:66;;-1:-1:-1;67463:14:0;;;;;67447:12;;;;-1:-1:-1;;;67463:14:0;;;;;;;;67447:12;;;;;:30;67411:66;67407:111;;;67501:5;67494:12;;;;;;67407:111;67587:4;67580:11;;;;66107:1492;;;;;;;:::o;63288:450::-;63375:4;63414:29;;;:18;:29;;;;;;;63474:27;;;;;;;-1:-1:-1;;;;;63414:29:0;;;;63474:27;63657:24;;;;:72;;-1:-1:-1;63685:29:0;;;;:20;:29;;;;;;-1:-1:-1;;;;;63685:29:0;;;:44;;;;63649:81;;;;63288:450;;;;:::o;64701:134::-;64801:20;;;-1:-1:-1;;;64801:20:0;;;;:25;;;64701:134::o;62681:369::-;63016:20;;;-1:-1:-1;;;63016:20:0;;;;:25;;62681:369::o;67780:298::-;67887:4;67909:21;67933:7;67941:9;67933:18;;;;;;;;;;;;;;;;;;67909:42;;67962:19;67984:7;67992;67984:16;;;;;;;;;;;;;;;;;;67962:38;;68018:52;68037:6;68045:9;68056:4;68062:7;68018:18;:52::i;69062:927::-;69248:21;69272:7;69280:9;69272:18;;;;;;;;;;;;;;;;69378:19;69272:18;;;;;69378:19;;;:37;;;;;-1:-1:-1;;;69378:37:0;-1:-1:-1;;;;69378:37:0;;;;;;69687:31;;;:20;:31;;;;;;69680:38;;-1:-1:-1;;;;;;69680:38:0;;;;;;69736:29;;;;;;69729:36;;;;;;;69849:15;:17;;;;;;;;69931:29;;;:18;:29;;;;;;;69922:59;;-1:-1:-1;;;;;69931:29:0;;;;69922:59;;;;;;;;;;;;;;;;69272:18;;-1:-1:-1;69922:59:0;;;;;;;;;;69062:927;;;:::o;83928:4367::-;;;;;;;;;-1:-1:-1;83928:4367:0;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;83928:4367:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;83928:4367:0;;;-1:-1:-1;83928:4367:0;:::i;:::-;;;:::o;:::-;;;;;;;;;-1:-1:-1;83928:4367:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://a2519486d7e80a0b5f8dc4d89b1b059c0dc278b9f2a407309cb4f51303a42b38
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

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.