ETH Price: $1,935.21 (-2.56%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve Offer163339362023-01-04 14:10:591152 days ago1672841459IN
0x674a7819...dB2B4B2A9
0 ETH0.0007484113.6306238
Create Offer163339312023-01-04 14:09:591152 days ago1672841399IN
0x674a7819...dB2B4B2A9
0 ETH0.0024278214.30730901
Buy Offer163338802023-01-04 13:59:471152 days ago1672840787IN
0x674a7819...dB2B4B2A9
0.0002 ETH0.0022856914.88134233
Approve Offer163338692023-01-04 13:57:351152 days ago1672840655IN
0x674a7819...dB2B4B2A9
0 ETH0.0008105714.76277673
Create Offer163210202023-01-02 18:56:351154 days ago1672685795IN
0x674a7819...dB2B4B2A9
0 ETH0.0032609918.98279461
Create Offer163200942023-01-02 15:49:591154 days ago1672674599IN
0x674a7819...dB2B4B2A9
0 ETH0.0029796915.77601427

Latest 2 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer163338802023-01-04 13:59:471152 days ago1672840787
0x674a7819...dB2B4B2A9
0.000196 ETH
Transfer163338802023-01-04 13:59:471152 days ago1672840787
0x674a7819...dB2B4B2A9
0.000004 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

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

Contract Source Code Verified (Exact Match)

Contract Name:
Market

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2022-12-27
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/*
'########::'########:'########::'##::::'##:
 ##.... ##: ##.....:: ##.... ##: ##:::: ##:
 ##:::: ##: ##::::::: ##:::: ##: ##:::: ##:
 ########:: ######::: ########:: ##:::: ##:
 ##.... ##: ##...:::: ##.. ##::: ##:::: ##:
 ##:::: ##: ##::::::: ##::. ##:: ##:::: ##:
 ########:: ########: ##:::. ##:. #######::
........:::........::..:::::..:::.......:::
*/

interface IModule {
  function getModule(uint module_) external view returns (address);
}

/**
 * @notice Connection's interface with Roles SC
 */
interface IRoles {
  function isVerifiedUser(address user_) external returns (bool);
  function isModerator(address user_) external returns (bool);
  function isUser(address user_) external returns (bool);
}

/**
 * @notice Connection's interface with ERC20 SC
 */
interface IERC20 {
  function balanceOf(address account) external view returns (uint256);
  function allowance(address owner, address spender) external view returns (uint256);
  function transferFrom(address from, address to,uint256 amount) external returns (bool);
}

/**
 * @notice Connection's interface with ERC721 SC
 */
interface IERC721 {
  function ownerOf(uint256 tokenId) external view returns (address owner);
  function isApprovedForAll(address owner, address operator) external view returns (bool);
  function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
  function getRoyalties() external view returns (uint);
  function deployer() external view returns (address);
}

/**
 * @notice The interface to implement in the market contract
 */
interface IMarket {
  event OfferCreated(uint256 id, string hiddenId);
  event OfferCompleted(uint id, string hiddenId, address buyer);
  event OfferApproved(uint256 offerId);
  event OfferCancelled(uint256 offerId);
}

/**
 * @notice Paper interface
 */
interface IPaperKeyManager { 
  function register(address _paperKey) external returns (bool);
  function verify( bytes32 _hash, bytes32 _nonce, bytes calldata _signature) external returns (bool);
}

/**
 * @notice Market logic
 */
contract Market is IMarket {
  /**
   * @notice The roles interface
   */
  IRoles rolesContract;

  /**
   * @notice Only-paper interface
   */
  IPaperKeyManager paperKeyManager;

  /**
   * @notice Amount of offers (counter)
   */
  uint256 public offersCount;

  /**
   * @notice List of offers
   */
  mapping(uint256 => Offer) public offersList;

  /**
   * @notice List of actions winners
   */
  mapping(uint256 => address) public auctionWinners;

  /**
   * @notice List of approved offers
   */
  mapping(uint256 => bool) public approvedOffers;

  /**
   * @notice If of valid ERC20 tokens
   */
  mapping(address => bool) public validERC20;

  /**
   * @notice List of ERC721 approved
   */
  mapping(address => bool) public approvedERC721;

  /**
   * @notice Module Manager instance
   */
  IModule moduleManager;

  /**
   * @notice wallet to which royalties will be sent
   */
  address public beruWallet;

  /**
   * @notice percentaje of beru's royalties
   */
  uint public beruRoyalies;
  

  /**
   * @notice Struct created when at leas an ERC721 is put up for { sell / auction }
   * @param info encoded params {} 
   * @param collection  encoded collection's Ids
   * @param tokenId  encoded token's Ids
   * @param collectionAddress array of collectionAddreses 
   * @param paymentToken Token to accept for the listing
   * @param seller The address that sells the NFT (owner or approved)
   */
  struct Offer {
    uint256 info;
    uint256 tokenIds;
    address[] collectionAddresses;
    address paymentToken;
    address seller;
  }

  //! --------------------------------------------------------------------------- EVENTS ---------------------------------------------------------------------------

  /**
   * @notice Event triggered when someone bid in an auction
   */
  event BiddedForAuction(address who, uint256 offerId, uint256 amount, string id);

  /**
   * @notice Fired when an auction winner is changed because the wallet has no funds (or not sufficient)
   */
  event ChangedWinner(uint offerId, address newWinner);

  /**
   * @notice Event triggered when an offer changes status { approved / deprecated }
   */
  event ChangeStatusERC721(address ERC721, address who, bool newStatus);

  /**
   * @notice Event triggered when an offer is activated
   */
  event ApprovedOffer(uint offerId, address who);

  /**
   * @notice Event triggered when an ERC20 address is validated (or not)
   */
  event ERC20Validated(address token, bool valid);

  /**
   * @notice Event triggered when the funds were sent
   */
  event FundsSended(uint256 beruRoyalties , uint256 creatorsRoyalties , uint256 sellerFunds);

  /**
   *@notice Event triggered when the royalties wer sent
   */
  event RoyaltiesSended(address to, uint256 amount);

  /**
   * @notice Event triggered when beruWallet was set
   */
  event BeruWalletSet(address newBeruWallet); 

  /**
   * @notice Event triggered when beruRoyalties was set
  */
  event BeruRoyaliesSet(uint256 newRoyalties);

  /**
   *@notice Event triggered when a minBid was set in an auction
   */
  event MinBidSet(uint256 offerId, uint256 value);

  /**
   * @notice Event triggered when an offer ends with paper
   */
  event PaperOfferCompleted(uint id, string hiddenId, address buyer);

  //! --------------------------------------------------------------------------- MODIFIERS ---------------------------------------------------------------------------

  /**
   * @notice Only offers that are approved or created by a moderator
   * @param offerId_ Offer id to check if approved
   */
  modifier onlyApprovedOffers(uint256 offerId_) {
    require(
      (approvedOffers[offerId_] == true) || 
      (rolesContract.isVerifiedUser(offersList[offerId_].seller)),
      'M101'
    );
    _;
  }

  /**
   *@notice the offer must be active
   *@param offerId_ the offer to check if is active
   */
  modifier onlyActiveOffers(uint256 offerId_) {
    require(isActive(offerId_), 'M113');
    _;
  }

  /**
   * @notice Only a moderator can call
   */
  modifier onlyModerator {
    require(rolesContract.isModerator(msg.sender), 'M120');
    _;
  }

  /**
   * @notice only offer must be an auction
   * @param offerId_ the offer to check if is an auction 
   */
  modifier onlyAuctions(uint256 offerId_) {
    require(isAuction(offerId_), 'M110');
    _;
  }

  /**
   *@notice only Votation Module can call 
   */
  modifier onlyVotationModule {
    require(msg.sender == moduleManager.getModule(3), 'M133');
    _;
  }

  /**
   * @notice only paper modifier
   */
  modifier onlyPaper(bytes32 _hash, bytes32 _nonce, bytes calldata _signature) {
    bool success = paperKeyManager.verify(_hash, _nonce, _signature);
    require(success, 'Failed to verify signature');
    _;
  }

  /**
   * @notice Builder
   * @param module_ Module manager
   */
  constructor(address module_) {
    moduleManager = IModule(module_);
    address roles = moduleManager.getModule(0);
    rolesContract = IRoles(roles);
  }

  /**
   * @notice Function to refresh the addresses used in this contract
   */
  function refresh() public onlyVotationModule {
    address roles = moduleManager.getModule(0);
    rolesContract = IRoles(roles);
  }

  //! --------------------------------------------------------------------------- PAPER -----------------------------------------------------------------------------

  /**
   * @notice only paper register function
   * @param  _paperKey token obtained after register the SC paper in the paper developer dashboard
   */
  function registerPaperKey(address _paperKey) external onlyVotationModule() {
    require(paperKeyManager.register(_paperKey), 'Error registering key');
  }

  /**
   * @notice function to set paperKeyManager
   * @param _paperKeyManagerAddress address from which to instantiate paper key manager
   */
  function setPaperKeyManager(address _paperKeyManagerAddress) public onlyVotationModule() {
    paperKeyManager = IPaperKeyManager(_paperKeyManagerAddress);
  }

  /**
   * @notice Eligibility method
   * @param offerId_ The offer id to check
   */
  function eligibilityMethod(uint offerId_) onlyActiveOffers(offerId_) public view returns (string memory) {
    Offer memory offer = offersList[offerId_];
    uint[] memory tokenIds = getDecodedTokenIds(offerId_);
    for (uint256 i; i < offer.collectionAddresses.length; i++) {
      require(IERC721(offer.collectionAddresses[i]).ownerOf(tokenIds[i]) == offer.seller, 'E413');
      require(IERC721(offer.collectionAddresses[i]).isApprovedForAll(offer.seller, address(this)), 'M118');
    }
    return '';
  }

  /** 
   * @notice function to validate params from a purchase
   * @param offerId_ The offer id to check
   * @param directBuy_ Indicate if is a direct purchase {just for auctions}
   * @param buyer_ the user who used onlyPaper to buy
   */
  function _paperValidateBuyParams(uint256 offerId_, bool directBuy_, address buyer_) internal view {
    Offer memory offer = offersList[offerId_];
    if (isAuction(offerId_) && !directBuy_) {
      require(!validateAuctionTime(offerId_), 'M111');
      require(buyer_ == auctionWinners[offerId_], 'M112');
    }
    if (offer.paymentToken == address(0)) {
      require(msg.value >= getValue(offerId_), 'M114');
    } else {
      require(IERC20(offer.paymentToken).allowance(msg.sender, address(this) ) >= getValue(offerId_),'M115');
    }
  }

  /**
   * @notice Function to transanc all tokens bought to buyer
   * @param offerId_ the user who used onlyPaper to buy
   * @param buyer_ user who bought the 
   */
  function _paperTransactAllTokens(uint256 offerId_, address buyer_) internal  {
    Offer memory offer = offersList[offerId_];
    uint256[] memory auxTokenIds = getDecodedTokenIds(offerId_);
    for (uint256 i = 0; i < offer.collectionAddresses.length; i++) {
      require(IERC721(offer.collectionAddresses[i]).ownerOf(auxTokenIds[i]) == offer.seller , 'E413');
      require(IERC721(offer.collectionAddresses[i]).isApprovedForAll(offer.seller, address(this)), 'M118');
      IERC721(offer.collectionAddresses[i]).safeTransferFrom(offer.seller, buyer_, auxTokenIds[i], 'M135');
    }
  }

  /**
   * @notice Buy offer method modified to use only paper
   * @param offerId_ the offer to buy
   * @param buyer_ the user who used onlyPaper to buy
   * @param directBuy_ this is just for auctions. Indicate if the if is a direct purchase
   * @param hiddenId_ the Offer's fireBase Id.
   * @param nonce_ variable used for onlyPaper methods
   * @param signature_ valiable used for onlyPaper methods
   */
  function buyWithPaper(
    uint256 offerId_,
    address buyer_,
    bool directBuy_, 
    string memory hiddenId_,
    bytes32 nonce_,
    bytes calldata signature_
  ) public payable onlyActiveOffers(offerId_)
    onlyPaper(keccak256(abi.encode(offerId_, buyer_, directBuy_, hiddenId_)), nonce_, signature_)
  {
    _paperValidateBuyParams(offerId_, directBuy_, buyer_);
    setInactive(offerId_);
    _splitFunds(offerId_, getValue(offerId_));
    _paperTransactAllTokens(offerId_, buyer_);
    emit PaperOfferCompleted(offerId_, hiddenId_, buyer_);
  }

  //! --------------------------------------------------------------------------- CREATE OFFER ---------------------------------------------------------------------------

  /**
   * @notice function to validate the params { all params } sent for create an offer
   * @param isAuction_ indicate if the offer is going to be an auction or not
   * @param endTime_ indicate the time when the offer will be end (just if is acution)
   * @param minBid_ Min bid allowed
   * @param tokenIds_ array of token's ids to sell
   * @param value_ Value of the offer
   * @param collectionAddresses_ array of collections's addresses
   * @param paymentToken_ You can ask for USDT, DAI or Matic/Ether
   */
  function _validateCreateParams( 
    bool isAuction_,
    uint48 endTime_,
    uint96 minBid_,
    uint96 value_,
    uint256[] memory tokenIds_,
    address[] memory collectionAddresses_,
    address paymentToken_ 
  ) internal view {
    require (tokenIds_.length == collectionAddresses_.length , 'E806');
    require(tokenIds_.length < 6,'M127');
    require(value_ > 0, 'M102');
    require(isValidERC20(paymentToken_), 'M106');
    if (isAuction_){
      require(endTime_ > block.timestamp + 3600,'M134');
      require(value_ > minBid_, 'M103');
    } 
  }

  /**
   * @notice function to validate the ownership of the tokens of an offer
   * @param tokenIds_ array of token's ids
   * @param collectionAddresses_ array of collecti's addresesss
   * @return flag true if the offer have unapproved collection addresses
   */
  function _validateOwnership(uint256[] memory tokenIds_, address[] memory collectionAddresses_) internal view returns (bool flag) {
    for (uint256 i; i < collectionAddresses_.length; i++) {
      require(IERC721(collectionAddresses_[i]).ownerOf(tokenIds_[i]) == msg.sender, 'E413');
      require(IERC721(collectionAddresses_[i]).isApprovedForAll(msg.sender, address(this)), 'M118');
      if (!approvedERC721[collectionAddresses_[i]] && !flag) flag = true;
    }
  }

  /**
   * @notice Function to create offers 
   * @param isAuction_ If it is auction
   * @param endTime_ time when offers ends (just for auction)
   * @param minBid_ Min bid allowed
   * @param tokenIds_ array of token's ids to sell
   * @param value_ Value of the offer
   * @param collectionAddresses_ array of collections's addresses
   * @param paymentToken_ You can ask for USDT, DAI or Matic/Ether
   * @param hiddenId_ Offre's id in fireBase
   */
  function createOffer(
    bool isAuction_,
    uint48 endTime_,
    uint96 minBid_,
    uint96 value_,
    uint256[] memory tokenIds_,
    address[] memory collectionAddresses_,
    address paymentToken_,
    string memory hiddenId_
  ) public {
    _validateCreateParams(isAuction_, endTime_, minBid_, value_, tokenIds_, collectionAddresses_, paymentToken_);
    bool notApproved = _validateOwnership(tokenIds_, collectionAddresses_);
    if (!notApproved) approvedOffers[offersCount] = true;
    offersList[offersCount] = Offer(
      encodeInfo(isAuction_ ? 1 : 0, endTime_, minBid_, value_),
      encode(tokenIds_),
      collectionAddresses_,
      paymentToken_,
      msg.sender
    );
    emit OfferCreated(offersCount, hiddenId_);
    offersCount++;
  }

  //! --------------------------------------------------------------------------- BUY OFFER ---------------------------------------------------------------------------

  /**
   * @notice function to validate params from a purchase
   * @param offerId_ The offer id to check
   * @param directBuy_ Indicate if is a direct purchase {just for auctions} 
   */
  function _validateBuyParams(uint256 offerId_, bool directBuy_) internal view {
    Offer memory offer = offersList[offerId_];
    if (isAuction(offerId_) && !directBuy_) {
      require(!validateAuctionTime(offerId_), 'M111');
      require(msg.sender == auctionWinners[offerId_], 'M112');
    }
    if (offer.paymentToken == address(0)) {
      require(msg.value >= getValue(offerId_), 'M114');
    } else {
      require(IERC20(offer.paymentToken).allowance(msg.sender, address(this) ) >= getValue(offerId_),'M115');
    }
  }

  /**
   * @notice Function to transanc all tokens bought 
   * @param offerId_ The offer bought
   */
  function _transactAllTokens(uint256 offerId_) internal  {
    Offer memory offer = offersList[offerId_];
    uint256[] memory auxTokenIds = getDecodedTokenIds(offerId_);
    for (uint256 i = 0; i < offer.collectionAddresses.length; i++) {
      require(IERC721(offer.collectionAddresses[i]).ownerOf(auxTokenIds[i]) == offer.seller , 'E413');
      require(IERC721(offer.collectionAddresses[i]).isApprovedForAll(offer.seller, address(this)), 'M118');
      IERC721(offer.collectionAddresses[i]).safeTransferFrom(offer.seller, msg.sender, auxTokenIds[i], '');
    }
  }

  /** 
   * @notice For buying a fixed offer & closing an auction
   * @param offerId_ The offer to buy
   * @param directBuy_ This is just for auctions. Indicate if the if is a direct purchase
   * @param hiddenId_ The Offer's fireBase Id.
   */
  function buyOffer(uint256 offerId_, bool directBuy_, string memory hiddenId_) public payable onlyActiveOffers(offerId_) onlyApprovedOffers(offerId_) {
    _validateBuyParams(offerId_, directBuy_);
    setInactive(offerId_);
    _splitFunds(offerId_,getValue(offerId_)); //* ADDED
    _transactAllTokens(offerId_);
    emit OfferCompleted( offerId_, hiddenId_, msg.sender);
  }
  
  //! --------------------------------------------------------------------------- BID IN AUCTION ---------------------------------------------------------------------------

  /**
   * @notice Function to validate bid parameters to bid in an auction
   * @param offerId_ The auction to check
   * @param value_ The value to chek
   */
  function _validateBidParams(uint256 offerId_, uint256 value_) internal view {
    require((value_ > 0) && (getMinBid(offerId_) < value_), 'M121');
    require(validateAuctionTime(offerId_),'M107');
  }

  /**
   * @notice Function to validate if the msg.sender have enough balance to bid in an auction
   * @param offerId_ The auction to check
   * @param value_ The value to check
   */
  function _validateUserBalance(uint256 offerId_, uint256 value_) internal view {
    uint balance = getActualBalance(msg.sender, offersList[offerId_].paymentToken);
    require(value_ < balance, 'M123');
  }

  /**
   * @notice function that allows to bid in an auction
   * @param offerId_ The auction id
   * @param value_ The value to bid
   */
  function bidForAuction(uint256 offerId_, uint256 value_, string memory id) public onlyActiveOffers(offerId_) onlyApprovedOffers(offerId_) onlyAuctions(offerId_)  {
    _validateBidParams(offerId_, value_);
    _validateUserBalance(offerId_, value_);
    setMinBid(offerId_, value_);
    auctionWinners[offerId_] = msg.sender;
    emit BiddedForAuction(msg.sender, offerId_, value_, id);
  }

  //! ------------------------------------------------------------------------- ROYALTIES --------------------------------------------------------------------------

  /**
   * @notice function to send ERC20 founds
   * @param offerId_ offerId to check
   * @param to_ who will receive the funds
   * @param value_ the amount to send
   */
  function _sendFunds(uint256 offerId_,address to_, uint256 value_) internal {
    if (offersList[offerId_].paymentToken == address(0)) {
      (bool success, ) = payable(to_).call{ value: value_ }("");
      require(success, "M117");
    } else {
      require ( IERC20(offersList[offerId_].paymentToken).transferFrom(
        msg.sender,
        to_,
        value_
      ), 'M120');
    }
  }

  /**
   * @notice Function to transfer royalies to Beru { wallet }
   * @param value_ amount from which the commission percentage is calculated
   * @return toBeru amount tranfered to beru
   */
  function _sendRoyaltiesToBeru(uint256 offerId_, uint256 value_)  internal returns (uint256 toBeru) {
    toBeru = value_ * beruRoyalies / 1000 ; // %<0
    _sendFunds(offerId_,beruWallet,toBeru);
    emit RoyaltiesSended(beruWallet,toBeru);
  }


  /**
   * @notice Function to send royalties to the NFT's creators 
   * @param offerId_ offer involved
   * @param value_  price paid for the offer
   * @return toCreators amount of roayalities transfered to creators
   */
  function _sendRoyaltiesToCreators(uint256 offerId_, uint256 value_)  internal returns (uint256 toCreators) {
    address[] memory collectionAddrees_ = offersList[offerId_].collectionAddresses;
    uint256 aux = value_ / collectionAddrees_.length;
    for(uint i = 0; i < collectionAddrees_.length; i++) {
        IERC721 proxy = IERC721(collectionAddrees_[i]);
        if (proxy.getRoyalties() > 0) {
          uint256 toTransfer = aux * proxy.getRoyalties() /1000;
          _sendFunds(offerId_,proxy.deployer(), toTransfer);
          toCreators += toTransfer;
          emit RoyaltiesSended(proxy.deployer(), toTransfer);
        }
    }
  }

  /**
   * @notice function to send founsd and royalties to collectio's creators, beru and the seller
   * @param offerId_ the offer finished and bought
   * @param value_ price paid for the offer
   */
  function _splitFunds(uint256 offerId_, uint256 value_)  internal {
    uint256 royaltiesToBeru = _sendRoyaltiesToBeru(offerId_,value_);
    uint256 royaltiesToCreators = _sendRoyaltiesToCreators(offerId_,value_);
    uint256 fundsToSeller = value_ - royaltiesToBeru - royaltiesToCreators;
    _sendFunds(offerId_, offersList[offerId_].seller , fundsToSeller);
    emit FundsSended(royaltiesToBeru , royaltiesToCreators , fundsToSeller);
  }

  //! --------------------------------------------------------------------------- Encode  & Decode ---------------------------------------------------------------------------

  /**
   * @notice Function to encode {auction, endtime, min, value} in info's encoded parameter
   * @param isAuction_ True or false 0 / 1 if is auction
   * @param endTime_ time when auctions ends (just for auctions)
   * @param min_ min bid (just for auctions)
   * @param value_ the offer's value for purchase
   * @return finalValue_ the params encoded in a uint
   */
  function encodeInfo(
    uint isAuction_,
    uint48 endTime_,
    uint96 min_,
    uint96 value_
  ) internal pure returns (uint finalValue_) {
    finalValue_ = (1 * (10 ** 75)) + (1 * (10 ** 74)) + (isAuction_ * (10 ** 73)) + (uint(endTime_) * (10 ** 58)) + (uint(min_) * (10 ** 29)) + (value_);
  }

  /**
   * @notice This is made to encode an array of uints and return just a uint
   * @param array_ is an array that has the ids to encode
   * @return aux have the ids encoded
   */
  function encode(uint[] memory array_) public pure returns (uint256 aux) {
    for (uint i; i < array_.length; ++i) {
      aux += array_[i] * (10 ** (i * 15));
    }
    aux += array_.length * 1e75;
  }

  /** 
   * @notice This is made to decode a uint an retunrn an array of ids
   * @param encoded_ This uint has encoded up to 5 ids that correspond to an array
   * @return tokenIds This array have the ids decoded
   */
  function decode(uint encoded_) public pure returns (uint[] memory tokenIds){
    uint amount = (encoded_ / 1e75) % 1e15;
    tokenIds = new uint[](amount); 
    for (uint i; i < amount; ++i){
      tokenIds[i] = (encoded_ / (10 ** (i * 15)) % 1e15);
    }
  }

  //! --------------------------------------------------------------------------- SETTERS ---------------------------------------------------------------------------

  /**
   * @notice validate an ERC721 collection
   * @param erc721_ collection address
   * @param validated_ new status of this ERC721 collection
   */
  function validateERC721(address erc721_, bool validated_) public onlyModerator {
    approvedERC721[erc721_] = validated_;
    emit ChangeStatusERC721(erc721_, msg.sender, validated_);
  }
 
  /**
   * @notice This is made to approve a valid offer
   * @param offerId_ The offer id to validate
   */
  function approveOffer(uint offerId_) public onlyModerator onlyActiveOffers(offerId_) {
    approvedOffers[offerId_] = true;
    emit OfferApproved(offerId_);
  }

  /**
   * @notice function to set status active in an offer
   * @param offerId_ offerId to set active
   */
  function setInactive(uint offerId_) internal { 
    require(isActive(offerId_),'M108');
    offersList[offerId_].info = offersList[offerId_].info - (1 * 1e74);
  }

  /**
   * @notice function to set the minBid in an auction
   * @param offerId_ the offer id to set the minBid
   * @param min_ the value to set
   */
  function setMinBid(uint offerId_, uint min_) internal {
    offersList[offerId_].info = ((offersList[offerId_].info / 1e58) * 1e58 ) + (min_ * 1e29) + (offersList[offerId_].info % 1e29);
    emit MinBidSet(offerId_, min_);
  }

  /**
   * @notice Function to deprecate any active offer
   * @param offerId_ The offer id to deprecate
   */
  function deprecateOffer(uint256 offerId_) public onlyModerator onlyActiveOffers(offerId_)  {
    setInactive(offerId_);
    emit OfferCancelled(offerId_);
  }

  /**
   * @notice Validate an ERC20 token as payment method
   * @param token_ The token address
   * @param validated_ If is validated or not
   */
  function validateERC20(address token_, bool validated_) public onlyVotationModule {
    validERC20[token_] = validated_;
    emit ERC20Validated(token_, validated_);
  }

  /**
   * @notice Function to set {bidder_} as winner of the auction {offerId_}
   * @param offerId_ Offer index
   * @param newWinner_ The consecuent highest bidder of the auction 
   */
  function setWinner(uint256 offerId_, address newWinner_) public onlyModerator {
    (uint256 oldWinnerBalance, uint256 newWinnerBalance) = 
      (
        getActualBalance(auctionWinners[offerId_], offersList[offerId_].paymentToken),
        getActualBalance(newWinner_, offersList[offerId_].paymentToken)
      );
    require(getMinBid(offerId_) > oldWinnerBalance,'M129');
    require(getMinBid(offerId_) <= newWinnerBalance,'M130');
    auctionWinners[offerId_] = newWinner_;
    emit ChangedWinner(offerId_, newWinner_);
  }

  /**
   * @notice function to set Beru Wallet address
   * @param address_ the new address
   */
  function setBeruWallet(address address_) public onlyVotationModule() {
    beruWallet = address_;
    emit BeruWalletSet(address_);
  }

  /**
   * @notice function to set Beru Royalties
   * @param value_ value of the new royalties
   */
  function setBeruRoyalties(uint256 value_) public onlyVotationModule() {
    require(value_<=1000,'M109');
    beruRoyalies = value_;
    emit BeruRoyaliesSet(value_);
  }

//! --------------------------------------------------------------------------- GETTERS ---------------------------------------------------------------------------

  /**
   * @notice function to return the {isActive} encoded in info
   * @param offerId_ the offerId where we get the data
   */
  function isActive(uint offerId_) public view returns (bool) {
    return ((offersList[offerId_].info / 1e74) % 10) == 1 ? true : false;
  }

  /**
   * @notice function to return the {isAuction} encoded in info
   * @param offerId_ the offerId where we get the data
   */
  function isAuction(uint offerId_) public view returns (bool) {
    return ((offersList[offerId_].info / 1e73) % 10) == 1 ? true : false;
  }

  /**
   * @notice function to return the {endTime} encoded in info
   * @param offerId_ the offerId where we get the data
   */
  function getEndTime(uint offerId_) public view returns (uint) {
    return (offersList[offerId_].info / 1e58) % 1e15;
  }

  /**
   * @notice function to return the {minBid} encoded in info
   * @param offerId_ the offerId where we get the data
   */
  function getMinBid(uint offerId_) public view returns (uint) {
    return (offersList[offerId_].info / 1e29) % 1e29;
  }

  /**
   * @notice function to return the {value} encoded in info
   * @param offerId_ the offerId where we get the data
   */
  function getValue(uint offerId_) public view returns (uint) {
    return offersList[offerId_].info % 1e29;
  }

  /**
   * @notice function to return an array of token Ids previusly encoded
   * @param offerId_ the offerId where we get the data
   */
  function getDecodedTokenIds(uint offerId_) public view returns (uint[] memory) {
     return decode(offersList[offerId_].tokenIds);
  }

  /**
   * @notice Validates if an auction is still valid or not
   * @param offerId_ The auction
   * @return valid if it is valid or not
   */
  function validateAuctionTime(uint256 offerId_) public view onlyAuctions(offerId_) returns (bool) {
    return getEndTime(offerId_) > block.timestamp;
  }

  /**
   * @notice Function to check if {token_} is a validERC20 for payment method
   * @param token_ The token address
   * @return bool if {token_} is valid
   */
  function isValidERC20(address token_) public view returns (bool) {
    return validERC20[token_];
  }

  /**
   * @notice Helper function that returns the balance of {who} in {paymentToken} token
   * @param who_ Address to check balance
   * @param paymentToken_ Address of the token to check
   */
  function getActualBalance(address who_, address paymentToken_) public view returns (uint balance) {
    if (paymentToken_ == address(0))
      balance = address(who_).balance;
    else balance = IERC20(paymentToken_).balanceOf(who_);
  }

  /**
   * @notice function to get the encoded collection address uint
   * @param offerId_ offer Id to check
   */
  function getCollectionAddresses(uint256 offerId_) public view returns (address[] memory){
    return offersList[offerId_].collectionAddresses;
  }

}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"module_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"offerId","type":"uint256"},{"indexed":false,"internalType":"address","name":"who","type":"address"}],"name":"ApprovedOffer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newRoyalties","type":"uint256"}],"name":"BeruRoyaliesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newBeruWallet","type":"address"}],"name":"BeruWalletSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"uint256","name":"offerId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"id","type":"string"}],"name":"BiddedForAuction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"ERC721","type":"address"},{"indexed":false,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"ChangeStatusERC721","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"offerId","type":"uint256"},{"indexed":false,"internalType":"address","name":"newWinner","type":"address"}],"name":"ChangedWinner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"valid","type":"bool"}],"name":"ERC20Validated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"beruRoyalties","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"creatorsRoyalties","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellerFunds","type":"uint256"}],"name":"FundsSended","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"offerId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"MinBidSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"offerId","type":"uint256"}],"name":"OfferApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"offerId","type":"uint256"}],"name":"OfferCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"string","name":"hiddenId","type":"string"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"}],"name":"OfferCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"string","name":"hiddenId","type":"string"}],"name":"OfferCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"string","name":"hiddenId","type":"string"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"}],"name":"PaperOfferCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RoyaltiesSended","type":"event"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"approveOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedERC721","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"approvedOffers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctionWinners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beruRoyalies","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beruWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"},{"internalType":"uint256","name":"value_","type":"uint256"},{"internalType":"string","name":"id","type":"string"}],"name":"bidForAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"},{"internalType":"bool","name":"directBuy_","type":"bool"},{"internalType":"string","name":"hiddenId_","type":"string"}],"name":"buyOffer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"},{"internalType":"address","name":"buyer_","type":"address"},{"internalType":"bool","name":"directBuy_","type":"bool"},{"internalType":"string","name":"hiddenId_","type":"string"},{"internalType":"bytes32","name":"nonce_","type":"bytes32"},{"internalType":"bytes","name":"signature_","type":"bytes"}],"name":"buyWithPaper","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"isAuction_","type":"bool"},{"internalType":"uint48","name":"endTime_","type":"uint48"},{"internalType":"uint96","name":"minBid_","type":"uint96"},{"internalType":"uint96","name":"value_","type":"uint96"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"},{"internalType":"address[]","name":"collectionAddresses_","type":"address[]"},{"internalType":"address","name":"paymentToken_","type":"address"},{"internalType":"string","name":"hiddenId_","type":"string"}],"name":"createOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"encoded_","type":"uint256"}],"name":"decode","outputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"deprecateOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"eligibilityMethod","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"array_","type":"uint256[]"}],"name":"encode","outputs":[{"internalType":"uint256","name":"aux","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"who_","type":"address"},{"internalType":"address","name":"paymentToken_","type":"address"}],"name":"getActualBalance","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"getCollectionAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"getDecodedTokenIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"getEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"getMinBid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"getValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"isAuction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"}],"name":"isValidERC20","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"offersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"offersList","outputs":[{"internalType":"uint256","name":"info","type":"uint256"},{"internalType":"uint256","name":"tokenIds","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"address","name":"seller","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refresh","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_paperKey","type":"address"}],"name":"registerPaperKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value_","type":"uint256"}],"name":"setBeruRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"setBeruWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_paperKeyManagerAddress","type":"address"}],"name":"setPaperKeyManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"},{"internalType":"address","name":"newWinner_","type":"address"}],"name":"setWinner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"validERC20","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"validateAuctionTime","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"bool","name":"validated_","type":"bool"}],"name":"validateERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc721_","type":"address"},{"internalType":"bool","name":"validated_","type":"bool"}],"name":"validateERC721","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620041e2380380620041e28339810160408190526200003491620000e0565b600880546001600160a01b0319166001600160a01b038316908117909155604051632afc8b5b60e11b815260006004820181905291906355f916b690602401602060405180830381865afa15801562000091573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000b79190620000e0565b600080546001600160a01b0319166001600160a01b039290921691909117905550620001129050565b600060208284031215620000f357600080fd5b81516001600160a01b03811681146200010b57600080fd5b9392505050565b6140c080620001226000396000f3fe6080604052600436106102045760003560e01c8063746f62da116101185780639c623683116100a0578063b003dd861161006f578063b003dd86146106c7578063bec02acc146106e7578063d171cd1f146106fd578063f5d40e9c1461071d578063f8ac93e81461073d57600080fd5b80639c623683146106375780639d5e0f6b14610657578063a5d7c10a14610687578063ab057b24146106a757600080fd5b80638704f2a3116100e75780638704f2a3146105945780639067b677146105b4578063920e3ef6146105d457806397fb9279146105e757806398a133d01461060757600080fd5b8063746f62da146104cd5780637f21d4981461050657806382afd23b1461052657806382b992d11461054657600080fd5b806341e2ddd81161019b5780635a6ababa1161016a5780635a6ababa1461040d57806360febc8c1461042d57806361a769001461044d5780636477b8621461046d5780636656d7361461048d57600080fd5b806341e2ddd814610397578063440d431e146103b757806344d9bc59146103ca5780634b1c9952146103f757600080fd5b8063300a0109116101d7578063300a01091461030a57806331a472b21461032a578063379cb5a81461034a57806338f081f81461036a57600080fd5b806308f33bc8146102095780630ff4c9161461028d57806329542a87146102bb5780632e7cea3b146102dd575b600080fd5b34801561021557600080fd5b506102596102243660046136d0565b600360208190526000918252604090912080546001820154928201546004909201549092916001600160a01b03908116911684565b6040805194855260208501939093526001600160a01b03918216928401929092521660608201526080015b60405180910390f35b34801561029957600080fd5b506102ad6102a83660046136d0565b610752565b604051908152602001610284565b3480156102c757600080fd5b506102db6102d6366004613727565b61077f565b005b3480156102e957600080fd5b506102fd6102f83660046136d0565b610880565b6040516102849190613760565b34801561031657600080fd5b506102db61032536600461385b565b61089e565b34801561033657600080fd5b506102db6103453660046136d0565b610a60565b34801561035657600080fd5b506102db6103653660046136d0565b610b49565b34801561037657600080fd5b5061038a6103853660046136d0565b610c5d565b60405161028491906138ab565b3480156103a357600080fd5b506102db6103b2366004613a0c565b610ccc565b6102db6103c5366004613ae8565b610e44565b3480156103d657600080fd5b506103ea6103e53660046136d0565b610fb3565b6040516102849190613b71565b34801561040357600080fd5b506102ad600a5481565b34801561041957600080fd5b506102db610428366004613b84565b611256565b34801561043957600080fd5b506102db610448366004613b84565b611341565b34801561045957600080fd5b506102fd6104683660046136d0565b611495565b34801561047957600080fd5b506102db610488366004613727565b611586565b34801561049957600080fd5b506104bd6104a8366004613b84565b60076020526000908152604090205460ff1681565b6040519015158152602001610284565b3480156104d957600080fd5b506104bd6104e8366004613b84565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561051257600080fd5b506102ad6105213660046136d0565b61167f565b34801561053257600080fd5b506104bd6105413660046136d0565b6116b2565b34801561055257600080fd5b5061057c6105613660046136d0565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610284565b3480156105a057600080fd5b506104bd6105af3660046136d0565b611708565b3480156105c057600080fd5b506102ad6105cf3660046136d0565b61173e565b6102db6105e2366004613ba1565b611775565b3480156105f357600080fd5b506104bd6106023660046136d0565b611910565b34801561061357600080fd5b506104bd610622366004613b84565b60066020526000908152604090205460ff1681565b34801561064357600080fd5b506102db610652366004613c71565b611963565b34801561066357600080fd5b506104bd6106723660046136d0565b60056020526000908152604090205460ff1681565b34801561069357600080fd5b506102db6106a23660046136d0565b611b38565b3480156106b357600080fd5b5060095461057c906001600160a01b031681565b3480156106d357600080fd5b506102ad6106e2366004613c96565b611c33565b3480156106f357600080fd5b506102ad60025481565b34801561070957600080fd5b506102ad610718366004613cd3565b611cc6565b34801561072957600080fd5b506102db610738366004613b84565b611d58565b34801561074957600080fd5b506102db611e17565b600081815260036020526040812054610779906c01431e0fae6d7217caa000000090613d17565b92915050565b600054604051637d379c9b60e11b81523360048201526001600160a01b039091169063fa6f3936906024016020604051808303816000875af11580156107c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ed9190613d2b565b6108125760405162461bcd60e51b815260040161080990613d48565b60405180910390fd5b6001600160a01b038216600081815260076020908152604091829020805460ff191685151590811790915582519384523391840191909152908201527fac558f7f1b991d3041da3d99df606555a86818181515e3c63f7494a886c8b1c4906060015b60405180910390a15050565b60008181526003602052604090206001015460609061077990611495565b826108a8816116b2565b6108c45760405162461bcd60e51b815260040161080990613d66565b600084815260056020526040902054849060ff1615156001148061096857506000805482825260036020526040918290206004908101549251633da1c0c360e01b81526001600160a01b0393841691810191909152911690633da1c0c3906024016020604051808303816000875af1158015610944573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109689190613d2b565b61099d5760405162461bcd60e51b8152600401610809906020808252600490820152634d31303160e01b604082015260600190565b846109a781611708565b6109dc5760405162461bcd60e51b81526004016108099060208082526004908201526304d3131360e41b604082015260600190565b6109e68686611f45565b6109f08686611fd3565b6109fa8686612038565b6000868152600460205260409081902080546001600160a01b0319163390811790915590517f90a79438af598e17758907b92be3d0720d36c54a546dddf5d51449a6b71590ba91610a5091899089908990613d84565b60405180910390a1505050505050565b600054604051637d379c9b60e11b81523360048201526001600160a01b039091169063fa6f3936906024016020604051808303816000875af1158015610aaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ace9190613d2b565b610aea5760405162461bcd60e51b815260040161080990613d48565b80610af4816116b2565b610b105760405162461bcd60e51b815260040161080990613d66565b610b198261211f565b6040518281527fc28b4aed030bfacc245c0501326e1beb8c0ef0d60e4edc21067fdeb52da2a7aa90602001610874565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa158015610b92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb69190613dbb565b6001600160a01b0316336001600160a01b031614610be65760405162461bcd60e51b815260040161080990613dd8565b6103e8811115610c215760405162461bcd60e51b8152600401610809906020808252600490820152634d31303960e01b604082015260600190565b600a8190556040518181527f5e1be4f61873c5f31430ca05087ce5163449753ebf46ee14b8e73d5ca0fd616d906020015b60405180910390a150565b600081815260036020908152604091829020600201805483518184028101840190945280845260609392830182828015610cc057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ca2575b50505050509050919050565b610cdb888888888888886121a2565b6000610ce7858561234d565b905080610d0b576002546000908152600560205260409020805460ff191660011790555b6040518060a00160405280610d338b610d25576000610d28565b60015b60ff168b8b8b61253e565b8152602001610d4187611c33565b8152602001858152602001846001600160a01b03168152602001336001600160a01b031681525060036000600254815260200190815260200160002060008201518160000155602082015181600101556040820151816002019080519060200190610dad929190613656565b5060608201516003820180546001600160a01b03199081166001600160a01b03938416179091556080909301516004909201805490931691161790556002546040517f749779d59ba16d7101daa300a293261d1f3e9fb8c21c94b3400676dff2853c7891610e1c918590613df6565b60405180910390a160028054906000610e3483613e25565b9190505550505050505050505050565b82610e4e816116b2565b610e6a5760405162461bcd60e51b815260040161080990613d66565b600084815260056020526040902054849060ff16151560011480610f0e57506000805482825260036020526040918290206004908101549251633da1c0c360e01b81526001600160a01b0393841691810191909152911690633da1c0c3906024016020604051808303816000875af1158015610eea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0e9190613d2b565b610f435760405162461bcd60e51b8152600401610809906020808252600490820152634d31303160e01b604082015260600190565b610f4d85856125ff565b610f568561211f565b610f6885610f6387610752565b612854565b610f71856128ef565b7f3ee363331f5a31fd1065b3e3e953efc486b2e0219f8a0beb22ab1d403c7f0394858433604051610fa493929190613e3e565b60405180910390a15050505050565b606081610fbf816116b2565b610fdb5760405162461bcd60e51b815260040161080990613d66565b6000838152600360209081526040808320815160a0810183528154815260018201548185015260028201805484518187028101870186528181529295939486019383018282801561105557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611037575b505050918352505060038201546001600160a01b0390811660208301526004909201549091166040909101529050600061108e85610880565b905060005b82604001515181101561123d5782608001516001600160a01b0316836040015182815181106110c4576110c4613e6f565b60200260200101516001600160a01b0316636352211e8484815181106110ec576110ec613e6f565b60200260200101516040518263ffffffff1660e01b815260040161111291815260200190565b602060405180830381865afa15801561112f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111539190613dbb565b6001600160a01b0316146111795760405162461bcd60e51b815260040161080990613e85565b8260400151818151811061118f5761118f613e6f565b6020908102919091010151608084015160405163e985e9c560e01b81526001600160a01b03918216600482015230602482015291169063e985e9c590604401602060405180830381865afa1580156111eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120f9190613d2b565b61122b5760405162461bcd60e51b815260040161080990613ea3565b8061123581613e25565b915050611093565b5050604080516020810190915260008152949350505050565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa15801561129f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c39190613dbb565b6001600160a01b0316336001600160a01b0316146112f35760405162461bcd60e51b815260040161080990613dd8565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527fc6bbd7d74968be5628d4b58738837bf02a3770f9c5366f132bbf8524123ca0ea90602001610c52565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa15801561138a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ae9190613dbb565b6001600160a01b0316336001600160a01b0316146113de5760405162461bcd60e51b815260040161080990613dd8565b600154604051632210724360e11b81526001600160a01b03838116600483015290911690634420e486906024016020604051808303816000875af115801561142a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144e9190613d2b565b6114925760405162461bcd60e51b81526020600482015260156024820152744572726f72207265676973746572696e67206b657960581b6044820152606401610809565b50565b6060600066038d7ea4c680006114c47546bf5bb0385045767e0f0ef2e7aa1e517e454637d1dd604b1b85613ec1565b6114ce9190613d17565b90508067ffffffffffffffff8111156114e9576114e96137a4565b604051908082528060200260200182016040528015611512578160200160208202803683370190505b50915060005b8181101561157f5766038d7ea4c6800061153382600f613ed5565b61153e90600a613fd0565b6115489086613ec1565b6115529190613d17565b83828151811061156457611564613e6f565b602090810291909101015261157881613e25565b9050611518565b5050919050565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa1580156115cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f39190613dbb565b6001600160a01b0316336001600160a01b0316146116235760405162461bcd60e51b815260040161080990613dd8565b6001600160a01b038216600081815260066020908152604091829020805460ff19168515159081179091558251938452908301527f3a0328c228c4de35601eca18a96ae5ec86e27fa97d91d41de9993fb588338cea9101610874565b6000818152600360205260408120546c01431e0fae6d7217caa0000000906116a8908290613ec1565b6107799190613d17565b600081815260036020526040812054600a906116e890750e264589a4dcdab14c696963c7eed2dd19410e0b29f9604a1b90613ec1565b6116f29190613d17565b600114611700576000610779565b600192915050565b600081815260036020526040812054600a906116e8907502d4744eba92922375aeaead8e62f6f9050d02cf086560491b90613ec1565b60008181526003602052604081205466038d7ea4c68000906116a8907065f537c675815d9ccdfa7c534fbb224839603a1b90613ec1565b8661177f816116b2565b61179b5760405162461bcd60e51b815260040161080990613d66565b878787876040516020016117b29493929190613fdc565b60408051601f198184030181529082905280516020909101206001546303784b1960e61b835290918691869186916000916001600160a01b039091169063de12c6409061180990889088908890889060040161400e565b6020604051808303816000875af1158015611828573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184c9190613d2b565b90508061189b5760405162461bcd60e51b815260206004820152601a60248201527f4661696c656420746f20766572696679207369676e61747572650000000000006044820152606401610809565b6118a68d8c8e612c1c565b6118af8d61211f565b6118bc8d610f638f610752565b6118c68d8d612e79565b7fbbccc1013329f1c90566ebc070eb4ce3e2ec7617aa3c5c46e8022117be4a76c48d8b8e6040516118f993929190613e3e565b60405180910390a150505050505050505050505050565b60008161191c81611708565b6119515760405162461bcd60e51b81526004016108099060208082526004908201526304d3131360e41b604082015260600190565b4261195b8461173e565b119392505050565b600054604051637d379c9b60e11b81523360048201526001600160a01b039091169063fa6f3936906024016020604051808303816000875af11580156119ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d19190613d2b565b6119ed5760405162461bcd60e51b815260040161080990613d48565b600082815260046020908152604080832054600392839052908320909101548291611a24916001600160a01b039182169116611cc6565b60008581526003602081905260409091200154611a4b9085906001600160a01b0316611cc6565b9150915081611a598561167f565b11611a8f5760405162461bcd60e51b8152600401610809906020808252600490820152634d31323960e01b604082015260600190565b80611a998561167f565b1115611ad05760405162461bcd60e51b81526004016108099060208082526004908201526304d3133360e41b604082015260600190565b60008481526004602090815260409182902080546001600160a01b0319166001600160a01b0387169081179091558251878152918201527f86a3d1ae2fcc062138c4a9c046aa437954430ac76396112c6c1aa34c35fa7b23910160405180910390a150505050565b600054604051637d379c9b60e11b81523360048201526001600160a01b039091169063fa6f3936906024016020604051808303816000875af1158015611b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba69190613d2b565b611bc25760405162461bcd60e51b815260040161080990613d48565b80611bcc816116b2565b611be85760405162461bcd60e51b815260040161080990613d66565b60008281526005602052604090819020805460ff19166001179055517f6f78fd1caac12eab2d3b9b01e740cafd178d3caadcaffa76b103881a24f13501906108749084815260200190565b6000805b8251811015611c9657611c4b81600f613ed5565b611c5690600a613fd0565b838281518110611c6857611c68613e6f565b6020026020010151611c7a9190613ed5565b611c84908361404b565b9150611c8f81613e25565b9050611c37565b508151611cbc907546bf5bb0385045767e0f0ef2e7aa1e517e454637d1dd604b1b613ed5565b610779908261404b565b60006001600160a01b038216611ce757506001600160a01b03821631610779565b6040516370a0823160e01b81526001600160a01b0384811660048301528316906370a0823190602401602060405180830381865afa158015611d2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d51919061405e565b9392505050565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa158015611da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc59190613dbb565b6001600160a01b0316336001600160a01b031614611df55760405162461bcd60e51b815260040161080990613dd8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa158015611e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e849190613dbb565b6001600160a01b0316336001600160a01b031614611eb45760405162461bcd60e51b815260040161080990613dd8565b600854604051632afc8b5b60e11b8152600060048201819052916001600160a01b0316906355f916b690602401602060405180830381865afa158015611efe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f229190613dbb565b600080546001600160a01b0319166001600160a01b039290921691909117905550565b600081118015611f5c575080611f5a8361167f565b105b611f915760405162461bcd60e51b8152600401610809906020808252600490820152634d31323160e01b604082015260600190565b611f9a82611910565b611fcf5760405162461bcd60e51b8152600401610809906020808252600490820152634d31303760e01b604082015260600190565b5050565b600082815260036020819052604082200154611ff99033906001600160a01b0316611cc6565b90508082106120335760405162461bcd60e51b8152600401610809906020808252600490820152634d31323360e01b604082015260600190565b505050565b60008281526003602052604090205461205f906c01431e0fae6d7217caa000000090613d17565b612076826c01431e0fae6d7217caa0000000613ed5565b6000848152600360205260409020546120a4907065f537c675815d9ccdfa7c534fbb224839603a1b90613ec1565b6120c2907065f537c675815d9ccdfa7c534fbb224839603a1b613ed5565b6120cc919061404b565b6120d6919061404b565b6000838152600360209081526040918290209290925580518481529182018390527f86780397f7caa7c8f95178b8088dece6299722a706b3acca977dd807d9b30f7b9101610874565b612128816116b2565b61215d5760405162461bcd60e51b81526004016108099060208082526004908201526309a6260760e31b604082015260600190565b60008181526003602052604090205461219090750e264589a4dcdab14c696963c7eed2dd19410e0b29f9604a1b90614077565b60009182526003602052604090912055565b81518351146121dc5760405162461bcd60e51b815260040161080990602080825260049082015263229c181b60e11b604082015260600190565b60068351106122165760405162461bcd60e51b8152600401610809906020808252600490820152634d31323760e01b604082015260600190565b6000846001600160601b0316116122585760405162461bcd60e51b8152600401610809906020808252600490820152632698981960e11b604082015260600190565b6001600160a01b03811660009081526006602052604090205460ff166122a95760405162461bcd60e51b8152600401610809906020808252600490820152632698981b60e11b604082015260600190565b8615612344576122bb42610e1061404b565b8665ffffffffffff16116122fa5760405162461bcd60e51b815260040161080990602080825260049082015263134c4ccd60e21b604082015260600190565b846001600160601b0316846001600160601b0316116123445760405162461bcd60e51b8152600401610809906020808252600490820152634d31303360e01b604082015260600190565b50505050505050565b6000805b825181101561253757336001600160a01b031683828151811061237657612376613e6f565b60200260200101516001600160a01b0316636352211e86848151811061239e5761239e613e6f565b60200260200101516040518263ffffffff1660e01b81526004016123c491815260200190565b602060405180830381865afa1580156123e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124059190613dbb565b6001600160a01b03161461242b5760405162461bcd60e51b815260040161080990613e85565b82818151811061243d5761243d613e6f565b602090810291909101015160405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c590604401602060405180830381865afa158015612493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b79190613d2b565b6124d35760405162461bcd60e51b815260040161080990613ea3565b600760008483815181106124e9576124e9613e6f565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615801561251b575081155b1561252557600191505b8061252f81613e25565b915050612351565b5092915050565b6000816001600160601b0316836001600160601b03166c01431e0fae6d7217caa000000061256c9190613ed5565b61259265ffffffffffff87167065f537c675815d9ccdfa7c534fbb224839603a1b613ed5565b6125b5887502d4744eba92922375aeaead8e62f6f9050d02cf086560491b613ed5565b6125d890759ba4fcea157d659e4887874997430f8015cb9a7acdb3604a1b61404b565b6125e2919061404b565b6125ec919061404b565b6125f6919061404b565b95945050505050565b6000828152600360209081526040808320815160a0810183528154815260018201548185015260028201805484518187028101870186528181529295939486019383018282801561267957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161265b575b505050918352505060038201546001600160a01b03908116602083015260049092015490911660409091015290506126b083611708565b80156126ba575081155b1561274d576126c883611910565b156126fe5760405162461bcd60e51b8152600401610809906020808252600490820152634d31313160e01b604082015260600190565b6000838152600460205260409020546001600160a01b0316331461274d5760405162461bcd60e51b8152600401610809906020808252600490820152632698989960e11b604082015260600190565b60608101516001600160a01b03166127a05761276883610752565b3410156120335760405162461bcd60e51b815260040161080990602080825260049082015263134c4c4d60e21b604082015260600190565b6127a983610752565b6060820151604051636eb1769f60e11b81523360048201523060248201526001600160a01b039091169063dd62ed3e90604401602060405180830381865afa1580156127f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281d919061405e565b10156120335760405162461bcd60e51b8152600401610809906020808252600490820152634d31313560e01b604082015260600190565b600061286083836131ba565b9050600061286e848461323e565b905060008161287d8486614077565b6128879190614077565b6000868152600360205260409020600401549091506128b19086906001600160a01b031683613501565b60408051848152602081018490529081018290527fcfe457ea910ad7b996f6fb1065ddec0ea7fc6a16148fdf8fb437073ac4bfcd7f90606001610fa4565b6000818152600360209081526040808320815160a0810183528154815260018201548185015260028201805484518187028101870186528181529295939486019383018282801561296957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161294b575b505050918352505060038201546001600160a01b039081166020830152600490920154909116604090910152905060006129a283610880565b905060005b826040015151811015612c165782608001516001600160a01b0316836040015182815181106129d8576129d8613e6f565b60200260200101516001600160a01b0316636352211e848481518110612a0057612a00613e6f565b60200260200101516040518263ffffffff1660e01b8152600401612a2691815260200190565b602060405180830381865afa158015612a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a679190613dbb565b6001600160a01b031614612a8d5760405162461bcd60e51b815260040161080990613e85565b82604001518181518110612aa357612aa3613e6f565b6020908102919091010151608084015160405163e985e9c560e01b81526001600160a01b03918216600482015230602482015291169063e985e9c590604401602060405180830381865afa158015612aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b239190613d2b565b612b3f5760405162461bcd60e51b815260040161080990613ea3565b82604001518181518110612b5557612b55613e6f565b60200260200101516001600160a01b031663b88d4fde846080015133858581518110612b8357612b83613e6f565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152608060648201526000608482015260a401600060405180830381600087803b158015612beb57600080fd5b505af1158015612bff573d6000803e3d6000fd5b505050508080612c0e90613e25565b9150506129a7565b50505050565b6000838152600360209081526040808320815160a08101835281548152600182015481850152600282018054845181870281018701865281815292959394860193830182828015612c9657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612c78575b505050918352505060038201546001600160a01b0390811660208301526004909201549091166040909101529050612ccd84611708565b8015612cd7575082155b15612d6d57612ce584611910565b15612d1b5760405162461bcd60e51b8152600401610809906020808252600490820152634d31313160e01b604082015260600190565b6000848152600460205260409020546001600160a01b03838116911614612d6d5760405162461bcd60e51b8152600401610809906020808252600490820152632698989960e11b604082015260600190565b60608101516001600160a01b0316612dc557612d8884610752565b341015612dc05760405162461bcd60e51b815260040161080990602080825260049082015263134c4c4d60e21b604082015260600190565b612c16565b612dce84610752565b6060820151604051636eb1769f60e11b81523360048201523060248201526001600160a01b039091169063dd62ed3e90604401602060405180830381865afa158015612e1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e42919061405e565b1015612c165760405162461bcd60e51b8152600401610809906020808252600490820152634d31313560e01b604082015260600190565b6000828152600360209081526040808320815160a08101835281548152600182015481850152600282018054845181870281018701865281815292959394860193830182828015612ef357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612ed5575b505050918352505060038201546001600160a01b03908116602083015260049092015490911660409091015290506000612f2c84610880565b905060005b8260400151518110156131b35782608001516001600160a01b031683604001518281518110612f6257612f62613e6f565b60200260200101516001600160a01b0316636352211e848481518110612f8a57612f8a613e6f565b60200260200101516040518263ffffffff1660e01b8152600401612fb091815260200190565b602060405180830381865afa158015612fcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff19190613dbb565b6001600160a01b0316146130175760405162461bcd60e51b815260040161080990613e85565b8260400151818151811061302d5761302d613e6f565b6020908102919091010151608084015160405163e985e9c560e01b81526001600160a01b03918216600482015230602482015291169063e985e9c590604401602060405180830381865afa158015613089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ad9190613d2b565b6130c95760405162461bcd60e51b815260040161080990613ea3565b826040015181815181106130df576130df613e6f565b60200260200101516001600160a01b031663b88d4fde84608001518685858151811061310d5761310d613e6f565b60200260200101516040518463ffffffff1660e01b815260040161316e939291906001600160a01b0393841681529190921660208201526040810191909152608060608201819052600490820152634d31333560e01b60a082015260c00190565b600060405180830381600087803b15801561318857600080fd5b505af115801561319c573d6000803e3d6000fd5b5050505080806131ab90613e25565b915050612f31565b5050505050565b60006103e8600a54836131cd9190613ed5565b6131d79190613ec1565b6009549091506131f29084906001600160a01b031683613501565b600954604080516001600160a01b039092168252602082018390527f7f16a2217b9c8f2f607c1b34d23b08768d256a767230d179b61c1c290095f832910160405180910390a192915050565b60008281526003602090815260408083206002018054825181850281018501909352808352849383018282801561329e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613280575b5050505050905060008151846132b49190613ec1565b905060005b82518110156134f85760008382815181106132d6576132d6613e6f565b602002602001015190506000816001600160a01b03166333df048e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613320573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613344919061405e565b11156134e55760006103e8826001600160a01b03166333df048e6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561338d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133b1919061405e565b6133bb9086613ed5565b6133c59190613ec1565b905061343388836001600160a01b031663d5f394886040518163ffffffff1660e01b8152600401602060405180830381865afa158015613409573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061342d9190613dbb565b83613501565b61343d818761404b565b95507f7f16a2217b9c8f2f607c1b34d23b08768d256a767230d179b61c1c290095f832826001600160a01b031663d5f394886040518163ffffffff1660e01b8152600401602060405180830381865afa15801561349e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c29190613dbb565b604080516001600160a01b039092168252602082018490520160405180910390a1505b50806134f081613e25565b9150506132b9565b50505092915050565b600083815260036020819052604090912001546001600160a01b03166135ad576000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461356e576040519150601f19603f3d011682016040523d82523d6000602084013e613573565b606091505b5050905080612c165760405162461bcd60e51b8152600401610809906020808252600490820152634d31313760e01b604082015260600190565b600083815260036020819052604091829020015490516323b872dd60e01b81523360048201526001600160a01b03848116602483015260448201849052909116906323b872dd906064016020604051808303816000875af1158015613616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061363a9190613d2b565b6120335760405162461bcd60e51b815260040161080990613d48565b8280548282559060005260206000209081019282156136ab579160200282015b828111156136ab57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613676565b506136b79291506136bb565b5090565b5b808211156136b757600081556001016136bc565b6000602082840312156136e257600080fd5b5035919050565b6001600160a01b038116811461149257600080fd5b8035613709816136e9565b919050565b801515811461149257600080fd5b80356137098161370e565b6000806040838503121561373a57600080fd5b8235613745816136e9565b915060208301356137558161370e565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156137985783518352928401929184019160010161377c565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156137e3576137e36137a4565b604052919050565b600082601f8301126137fc57600080fd5b813567ffffffffffffffff811115613816576138166137a4565b613829601f8201601f19166020016137ba565b81815284602083860101111561383e57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561387057600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561389557600080fd5b6138a1868287016137eb565b9150509250925092565b6020808252825182820181905260009190848201906040850190845b818110156137985783516001600160a01b0316835292840192918401916001016138c7565b803565ffffffffffff8116811461370957600080fd5b80356001600160601b038116811461370957600080fd5b600067ffffffffffffffff821115613933576139336137a4565b5060051b60200190565b600082601f83011261394e57600080fd5b8135602061396361395e83613919565b6137ba565b82815260059290921b8401810191818101908684111561398257600080fd5b8286015b8481101561399d5780358352918301918301613986565b509695505050505050565b600082601f8301126139b957600080fd5b813560206139c961395e83613919565b82815260059290921b840181019181810190868411156139e857600080fd5b8286015b8481101561399d5780356139ff816136e9565b83529183019183016139ec565b600080600080600080600080610100898b031215613a2957600080fd5b613a328961371c565b9750613a4060208a016138ec565b9650613a4e60408a01613902565b9550613a5c60608a01613902565b9450608089013567ffffffffffffffff80821115613a7957600080fd5b613a858c838d0161393d565b955060a08b0135915080821115613a9b57600080fd5b613aa78c838d016139a8565b9450613ab560c08c016136fe565b935060e08b0135915080821115613acb57600080fd5b50613ad88b828c016137eb565b9150509295985092959890939650565b600080600060608486031215613afd57600080fd5b833592506020840135613b0f8161370e565b9150604084013567ffffffffffffffff81111561389557600080fd5b6000815180845260005b81811015613b5157602081850181015186830182015201613b35565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611d516020830184613b2b565b600060208284031215613b9657600080fd5b8135611d51816136e9565b600080600080600080600060c0888a031215613bbc57600080fd5b873596506020880135613bce816136e9565b95506040880135613bde8161370e565b9450606088013567ffffffffffffffff80821115613bfb57600080fd5b613c078b838c016137eb565b955060808a0135945060a08a0135915080821115613c2457600080fd5b818a0191508a601f830112613c3857600080fd5b813581811115613c4757600080fd5b8b6020828501011115613c5957600080fd5b60208301945080935050505092959891949750929550565b60008060408385031215613c8457600080fd5b823591506020830135613755816136e9565b600060208284031215613ca857600080fd5b813567ffffffffffffffff811115613cbf57600080fd5b613ccb8482850161393d565b949350505050565b60008060408385031215613ce657600080fd5b8235613cf1816136e9565b91506020830135613755816136e9565b634e487b7160e01b600052601260045260246000fd5b600082613d2657613d26613d01565b500690565b600060208284031215613d3d57600080fd5b8151611d518161370e565b60208082526004908201526304d3132360e41b604082015260600190565b6020808252600490820152634d31313360e01b604082015260600190565b60018060a01b0385168152836020820152826040820152608060608201526000613db16080830184613b2b565b9695505050505050565b600060208284031215613dcd57600080fd5b8151611d51816136e9565b6020808252600490820152634d31333360e01b604082015260600190565b828152604060208201526000613ccb6040830184613b2b565b634e487b7160e01b600052601160045260246000fd5b600060018201613e3757613e37613e0f565b5060010190565b838152606060208201526000613e576060830185613b2b565b905060018060a01b0383166040830152949350505050565b634e487b7160e01b600052603260045260246000fd5b6020808252600490820152634534313360e01b604082015260600190565b60208082526004908201526309a6262760e31b604082015260600190565b600082613ed057613ed0613d01565b500490565b808202811582820484141761077957610779613e0f565b600181815b80851115613f27578160001904821115613f0d57613f0d613e0f565b80851615613f1a57918102915b93841c9390800290613ef1565b509250929050565b600082613f3e57506001610779565b81613f4b57506000610779565b8160018114613f615760028114613f6b57613f87565b6001915050610779565b60ff841115613f7c57613f7c613e0f565b50506001821b610779565b5060208310610133831016604e8410600b8410161715613faa575081810a610779565b613fb48383613eec565b8060001904821115613fc857613fc8613e0f565b029392505050565b6000611d518383613f2f565b8481526001600160a01b03841660208201528215156040820152608060608201819052600090613db190830184613b2b565b84815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f909201601f191601019392505050565b8082018082111561077957610779613e0f565b60006020828403121561407057600080fd5b5051919050565b8181038181111561077957610779613e0f56fea26469706673582212208b92f701e8a7f0fa4fabb279648eb9ffa468792ed84782e9eaa72b93e25ed1a064736f6c634300081100330000000000000000000000002588965c3a09d0b50948ed2635e6e53ec7d790b9

Deployed Bytecode

0x6080604052600436106102045760003560e01c8063746f62da116101185780639c623683116100a0578063b003dd861161006f578063b003dd86146106c7578063bec02acc146106e7578063d171cd1f146106fd578063f5d40e9c1461071d578063f8ac93e81461073d57600080fd5b80639c623683146106375780639d5e0f6b14610657578063a5d7c10a14610687578063ab057b24146106a757600080fd5b80638704f2a3116100e75780638704f2a3146105945780639067b677146105b4578063920e3ef6146105d457806397fb9279146105e757806398a133d01461060757600080fd5b8063746f62da146104cd5780637f21d4981461050657806382afd23b1461052657806382b992d11461054657600080fd5b806341e2ddd81161019b5780635a6ababa1161016a5780635a6ababa1461040d57806360febc8c1461042d57806361a769001461044d5780636477b8621461046d5780636656d7361461048d57600080fd5b806341e2ddd814610397578063440d431e146103b757806344d9bc59146103ca5780634b1c9952146103f757600080fd5b8063300a0109116101d7578063300a01091461030a57806331a472b21461032a578063379cb5a81461034a57806338f081f81461036a57600080fd5b806308f33bc8146102095780630ff4c9161461028d57806329542a87146102bb5780632e7cea3b146102dd575b600080fd5b34801561021557600080fd5b506102596102243660046136d0565b600360208190526000918252604090912080546001820154928201546004909201549092916001600160a01b03908116911684565b6040805194855260208501939093526001600160a01b03918216928401929092521660608201526080015b60405180910390f35b34801561029957600080fd5b506102ad6102a83660046136d0565b610752565b604051908152602001610284565b3480156102c757600080fd5b506102db6102d6366004613727565b61077f565b005b3480156102e957600080fd5b506102fd6102f83660046136d0565b610880565b6040516102849190613760565b34801561031657600080fd5b506102db61032536600461385b565b61089e565b34801561033657600080fd5b506102db6103453660046136d0565b610a60565b34801561035657600080fd5b506102db6103653660046136d0565b610b49565b34801561037657600080fd5b5061038a6103853660046136d0565b610c5d565b60405161028491906138ab565b3480156103a357600080fd5b506102db6103b2366004613a0c565b610ccc565b6102db6103c5366004613ae8565b610e44565b3480156103d657600080fd5b506103ea6103e53660046136d0565b610fb3565b6040516102849190613b71565b34801561040357600080fd5b506102ad600a5481565b34801561041957600080fd5b506102db610428366004613b84565b611256565b34801561043957600080fd5b506102db610448366004613b84565b611341565b34801561045957600080fd5b506102fd6104683660046136d0565b611495565b34801561047957600080fd5b506102db610488366004613727565b611586565b34801561049957600080fd5b506104bd6104a8366004613b84565b60076020526000908152604090205460ff1681565b6040519015158152602001610284565b3480156104d957600080fd5b506104bd6104e8366004613b84565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561051257600080fd5b506102ad6105213660046136d0565b61167f565b34801561053257600080fd5b506104bd6105413660046136d0565b6116b2565b34801561055257600080fd5b5061057c6105613660046136d0565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610284565b3480156105a057600080fd5b506104bd6105af3660046136d0565b611708565b3480156105c057600080fd5b506102ad6105cf3660046136d0565b61173e565b6102db6105e2366004613ba1565b611775565b3480156105f357600080fd5b506104bd6106023660046136d0565b611910565b34801561061357600080fd5b506104bd610622366004613b84565b60066020526000908152604090205460ff1681565b34801561064357600080fd5b506102db610652366004613c71565b611963565b34801561066357600080fd5b506104bd6106723660046136d0565b60056020526000908152604090205460ff1681565b34801561069357600080fd5b506102db6106a23660046136d0565b611b38565b3480156106b357600080fd5b5060095461057c906001600160a01b031681565b3480156106d357600080fd5b506102ad6106e2366004613c96565b611c33565b3480156106f357600080fd5b506102ad60025481565b34801561070957600080fd5b506102ad610718366004613cd3565b611cc6565b34801561072957600080fd5b506102db610738366004613b84565b611d58565b34801561074957600080fd5b506102db611e17565b600081815260036020526040812054610779906c01431e0fae6d7217caa000000090613d17565b92915050565b600054604051637d379c9b60e11b81523360048201526001600160a01b039091169063fa6f3936906024016020604051808303816000875af11580156107c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ed9190613d2b565b6108125760405162461bcd60e51b815260040161080990613d48565b60405180910390fd5b6001600160a01b038216600081815260076020908152604091829020805460ff191685151590811790915582519384523391840191909152908201527fac558f7f1b991d3041da3d99df606555a86818181515e3c63f7494a886c8b1c4906060015b60405180910390a15050565b60008181526003602052604090206001015460609061077990611495565b826108a8816116b2565b6108c45760405162461bcd60e51b815260040161080990613d66565b600084815260056020526040902054849060ff1615156001148061096857506000805482825260036020526040918290206004908101549251633da1c0c360e01b81526001600160a01b0393841691810191909152911690633da1c0c3906024016020604051808303816000875af1158015610944573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109689190613d2b565b61099d5760405162461bcd60e51b8152600401610809906020808252600490820152634d31303160e01b604082015260600190565b846109a781611708565b6109dc5760405162461bcd60e51b81526004016108099060208082526004908201526304d3131360e41b604082015260600190565b6109e68686611f45565b6109f08686611fd3565b6109fa8686612038565b6000868152600460205260409081902080546001600160a01b0319163390811790915590517f90a79438af598e17758907b92be3d0720d36c54a546dddf5d51449a6b71590ba91610a5091899089908990613d84565b60405180910390a1505050505050565b600054604051637d379c9b60e11b81523360048201526001600160a01b039091169063fa6f3936906024016020604051808303816000875af1158015610aaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ace9190613d2b565b610aea5760405162461bcd60e51b815260040161080990613d48565b80610af4816116b2565b610b105760405162461bcd60e51b815260040161080990613d66565b610b198261211f565b6040518281527fc28b4aed030bfacc245c0501326e1beb8c0ef0d60e4edc21067fdeb52da2a7aa90602001610874565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa158015610b92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb69190613dbb565b6001600160a01b0316336001600160a01b031614610be65760405162461bcd60e51b815260040161080990613dd8565b6103e8811115610c215760405162461bcd60e51b8152600401610809906020808252600490820152634d31303960e01b604082015260600190565b600a8190556040518181527f5e1be4f61873c5f31430ca05087ce5163449753ebf46ee14b8e73d5ca0fd616d906020015b60405180910390a150565b600081815260036020908152604091829020600201805483518184028101840190945280845260609392830182828015610cc057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ca2575b50505050509050919050565b610cdb888888888888886121a2565b6000610ce7858561234d565b905080610d0b576002546000908152600560205260409020805460ff191660011790555b6040518060a00160405280610d338b610d25576000610d28565b60015b60ff168b8b8b61253e565b8152602001610d4187611c33565b8152602001858152602001846001600160a01b03168152602001336001600160a01b031681525060036000600254815260200190815260200160002060008201518160000155602082015181600101556040820151816002019080519060200190610dad929190613656565b5060608201516003820180546001600160a01b03199081166001600160a01b03938416179091556080909301516004909201805490931691161790556002546040517f749779d59ba16d7101daa300a293261d1f3e9fb8c21c94b3400676dff2853c7891610e1c918590613df6565b60405180910390a160028054906000610e3483613e25565b9190505550505050505050505050565b82610e4e816116b2565b610e6a5760405162461bcd60e51b815260040161080990613d66565b600084815260056020526040902054849060ff16151560011480610f0e57506000805482825260036020526040918290206004908101549251633da1c0c360e01b81526001600160a01b0393841691810191909152911690633da1c0c3906024016020604051808303816000875af1158015610eea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0e9190613d2b565b610f435760405162461bcd60e51b8152600401610809906020808252600490820152634d31303160e01b604082015260600190565b610f4d85856125ff565b610f568561211f565b610f6885610f6387610752565b612854565b610f71856128ef565b7f3ee363331f5a31fd1065b3e3e953efc486b2e0219f8a0beb22ab1d403c7f0394858433604051610fa493929190613e3e565b60405180910390a15050505050565b606081610fbf816116b2565b610fdb5760405162461bcd60e51b815260040161080990613d66565b6000838152600360209081526040808320815160a0810183528154815260018201548185015260028201805484518187028101870186528181529295939486019383018282801561105557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611037575b505050918352505060038201546001600160a01b0390811660208301526004909201549091166040909101529050600061108e85610880565b905060005b82604001515181101561123d5782608001516001600160a01b0316836040015182815181106110c4576110c4613e6f565b60200260200101516001600160a01b0316636352211e8484815181106110ec576110ec613e6f565b60200260200101516040518263ffffffff1660e01b815260040161111291815260200190565b602060405180830381865afa15801561112f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111539190613dbb565b6001600160a01b0316146111795760405162461bcd60e51b815260040161080990613e85565b8260400151818151811061118f5761118f613e6f565b6020908102919091010151608084015160405163e985e9c560e01b81526001600160a01b03918216600482015230602482015291169063e985e9c590604401602060405180830381865afa1580156111eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120f9190613d2b565b61122b5760405162461bcd60e51b815260040161080990613ea3565b8061123581613e25565b915050611093565b5050604080516020810190915260008152949350505050565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa15801561129f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c39190613dbb565b6001600160a01b0316336001600160a01b0316146112f35760405162461bcd60e51b815260040161080990613dd8565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527fc6bbd7d74968be5628d4b58738837bf02a3770f9c5366f132bbf8524123ca0ea90602001610c52565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa15801561138a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ae9190613dbb565b6001600160a01b0316336001600160a01b0316146113de5760405162461bcd60e51b815260040161080990613dd8565b600154604051632210724360e11b81526001600160a01b03838116600483015290911690634420e486906024016020604051808303816000875af115801561142a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144e9190613d2b565b6114925760405162461bcd60e51b81526020600482015260156024820152744572726f72207265676973746572696e67206b657960581b6044820152606401610809565b50565b6060600066038d7ea4c680006114c47546bf5bb0385045767e0f0ef2e7aa1e517e454637d1dd604b1b85613ec1565b6114ce9190613d17565b90508067ffffffffffffffff8111156114e9576114e96137a4565b604051908082528060200260200182016040528015611512578160200160208202803683370190505b50915060005b8181101561157f5766038d7ea4c6800061153382600f613ed5565b61153e90600a613fd0565b6115489086613ec1565b6115529190613d17565b83828151811061156457611564613e6f565b602090810291909101015261157881613e25565b9050611518565b5050919050565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa1580156115cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f39190613dbb565b6001600160a01b0316336001600160a01b0316146116235760405162461bcd60e51b815260040161080990613dd8565b6001600160a01b038216600081815260066020908152604091829020805460ff19168515159081179091558251938452908301527f3a0328c228c4de35601eca18a96ae5ec86e27fa97d91d41de9993fb588338cea9101610874565b6000818152600360205260408120546c01431e0fae6d7217caa0000000906116a8908290613ec1565b6107799190613d17565b600081815260036020526040812054600a906116e890750e264589a4dcdab14c696963c7eed2dd19410e0b29f9604a1b90613ec1565b6116f29190613d17565b600114611700576000610779565b600192915050565b600081815260036020526040812054600a906116e8907502d4744eba92922375aeaead8e62f6f9050d02cf086560491b90613ec1565b60008181526003602052604081205466038d7ea4c68000906116a8907065f537c675815d9ccdfa7c534fbb224839603a1b90613ec1565b8661177f816116b2565b61179b5760405162461bcd60e51b815260040161080990613d66565b878787876040516020016117b29493929190613fdc565b60408051601f198184030181529082905280516020909101206001546303784b1960e61b835290918691869186916000916001600160a01b039091169063de12c6409061180990889088908890889060040161400e565b6020604051808303816000875af1158015611828573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184c9190613d2b565b90508061189b5760405162461bcd60e51b815260206004820152601a60248201527f4661696c656420746f20766572696679207369676e61747572650000000000006044820152606401610809565b6118a68d8c8e612c1c565b6118af8d61211f565b6118bc8d610f638f610752565b6118c68d8d612e79565b7fbbccc1013329f1c90566ebc070eb4ce3e2ec7617aa3c5c46e8022117be4a76c48d8b8e6040516118f993929190613e3e565b60405180910390a150505050505050505050505050565b60008161191c81611708565b6119515760405162461bcd60e51b81526004016108099060208082526004908201526304d3131360e41b604082015260600190565b4261195b8461173e565b119392505050565b600054604051637d379c9b60e11b81523360048201526001600160a01b039091169063fa6f3936906024016020604051808303816000875af11580156119ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d19190613d2b565b6119ed5760405162461bcd60e51b815260040161080990613d48565b600082815260046020908152604080832054600392839052908320909101548291611a24916001600160a01b039182169116611cc6565b60008581526003602081905260409091200154611a4b9085906001600160a01b0316611cc6565b9150915081611a598561167f565b11611a8f5760405162461bcd60e51b8152600401610809906020808252600490820152634d31323960e01b604082015260600190565b80611a998561167f565b1115611ad05760405162461bcd60e51b81526004016108099060208082526004908201526304d3133360e41b604082015260600190565b60008481526004602090815260409182902080546001600160a01b0319166001600160a01b0387169081179091558251878152918201527f86a3d1ae2fcc062138c4a9c046aa437954430ac76396112c6c1aa34c35fa7b23910160405180910390a150505050565b600054604051637d379c9b60e11b81523360048201526001600160a01b039091169063fa6f3936906024016020604051808303816000875af1158015611b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba69190613d2b565b611bc25760405162461bcd60e51b815260040161080990613d48565b80611bcc816116b2565b611be85760405162461bcd60e51b815260040161080990613d66565b60008281526005602052604090819020805460ff19166001179055517f6f78fd1caac12eab2d3b9b01e740cafd178d3caadcaffa76b103881a24f13501906108749084815260200190565b6000805b8251811015611c9657611c4b81600f613ed5565b611c5690600a613fd0565b838281518110611c6857611c68613e6f565b6020026020010151611c7a9190613ed5565b611c84908361404b565b9150611c8f81613e25565b9050611c37565b508151611cbc907546bf5bb0385045767e0f0ef2e7aa1e517e454637d1dd604b1b613ed5565b610779908261404b565b60006001600160a01b038216611ce757506001600160a01b03821631610779565b6040516370a0823160e01b81526001600160a01b0384811660048301528316906370a0823190602401602060405180830381865afa158015611d2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d51919061405e565b9392505050565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa158015611da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc59190613dbb565b6001600160a01b0316336001600160a01b031614611df55760405162461bcd60e51b815260040161080990613dd8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa158015611e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e849190613dbb565b6001600160a01b0316336001600160a01b031614611eb45760405162461bcd60e51b815260040161080990613dd8565b600854604051632afc8b5b60e11b8152600060048201819052916001600160a01b0316906355f916b690602401602060405180830381865afa158015611efe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f229190613dbb565b600080546001600160a01b0319166001600160a01b039290921691909117905550565b600081118015611f5c575080611f5a8361167f565b105b611f915760405162461bcd60e51b8152600401610809906020808252600490820152634d31323160e01b604082015260600190565b611f9a82611910565b611fcf5760405162461bcd60e51b8152600401610809906020808252600490820152634d31303760e01b604082015260600190565b5050565b600082815260036020819052604082200154611ff99033906001600160a01b0316611cc6565b90508082106120335760405162461bcd60e51b8152600401610809906020808252600490820152634d31323360e01b604082015260600190565b505050565b60008281526003602052604090205461205f906c01431e0fae6d7217caa000000090613d17565b612076826c01431e0fae6d7217caa0000000613ed5565b6000848152600360205260409020546120a4907065f537c675815d9ccdfa7c534fbb224839603a1b90613ec1565b6120c2907065f537c675815d9ccdfa7c534fbb224839603a1b613ed5565b6120cc919061404b565b6120d6919061404b565b6000838152600360209081526040918290209290925580518481529182018390527f86780397f7caa7c8f95178b8088dece6299722a706b3acca977dd807d9b30f7b9101610874565b612128816116b2565b61215d5760405162461bcd60e51b81526004016108099060208082526004908201526309a6260760e31b604082015260600190565b60008181526003602052604090205461219090750e264589a4dcdab14c696963c7eed2dd19410e0b29f9604a1b90614077565b60009182526003602052604090912055565b81518351146121dc5760405162461bcd60e51b815260040161080990602080825260049082015263229c181b60e11b604082015260600190565b60068351106122165760405162461bcd60e51b8152600401610809906020808252600490820152634d31323760e01b604082015260600190565b6000846001600160601b0316116122585760405162461bcd60e51b8152600401610809906020808252600490820152632698981960e11b604082015260600190565b6001600160a01b03811660009081526006602052604090205460ff166122a95760405162461bcd60e51b8152600401610809906020808252600490820152632698981b60e11b604082015260600190565b8615612344576122bb42610e1061404b565b8665ffffffffffff16116122fa5760405162461bcd60e51b815260040161080990602080825260049082015263134c4ccd60e21b604082015260600190565b846001600160601b0316846001600160601b0316116123445760405162461bcd60e51b8152600401610809906020808252600490820152634d31303360e01b604082015260600190565b50505050505050565b6000805b825181101561253757336001600160a01b031683828151811061237657612376613e6f565b60200260200101516001600160a01b0316636352211e86848151811061239e5761239e613e6f565b60200260200101516040518263ffffffff1660e01b81526004016123c491815260200190565b602060405180830381865afa1580156123e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124059190613dbb565b6001600160a01b03161461242b5760405162461bcd60e51b815260040161080990613e85565b82818151811061243d5761243d613e6f565b602090810291909101015160405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c590604401602060405180830381865afa158015612493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b79190613d2b565b6124d35760405162461bcd60e51b815260040161080990613ea3565b600760008483815181106124e9576124e9613e6f565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615801561251b575081155b1561252557600191505b8061252f81613e25565b915050612351565b5092915050565b6000816001600160601b0316836001600160601b03166c01431e0fae6d7217caa000000061256c9190613ed5565b61259265ffffffffffff87167065f537c675815d9ccdfa7c534fbb224839603a1b613ed5565b6125b5887502d4744eba92922375aeaead8e62f6f9050d02cf086560491b613ed5565b6125d890759ba4fcea157d659e4887874997430f8015cb9a7acdb3604a1b61404b565b6125e2919061404b565b6125ec919061404b565b6125f6919061404b565b95945050505050565b6000828152600360209081526040808320815160a0810183528154815260018201548185015260028201805484518187028101870186528181529295939486019383018282801561267957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161265b575b505050918352505060038201546001600160a01b03908116602083015260049092015490911660409091015290506126b083611708565b80156126ba575081155b1561274d576126c883611910565b156126fe5760405162461bcd60e51b8152600401610809906020808252600490820152634d31313160e01b604082015260600190565b6000838152600460205260409020546001600160a01b0316331461274d5760405162461bcd60e51b8152600401610809906020808252600490820152632698989960e11b604082015260600190565b60608101516001600160a01b03166127a05761276883610752565b3410156120335760405162461bcd60e51b815260040161080990602080825260049082015263134c4c4d60e21b604082015260600190565b6127a983610752565b6060820151604051636eb1769f60e11b81523360048201523060248201526001600160a01b039091169063dd62ed3e90604401602060405180830381865afa1580156127f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281d919061405e565b10156120335760405162461bcd60e51b8152600401610809906020808252600490820152634d31313560e01b604082015260600190565b600061286083836131ba565b9050600061286e848461323e565b905060008161287d8486614077565b6128879190614077565b6000868152600360205260409020600401549091506128b19086906001600160a01b031683613501565b60408051848152602081018490529081018290527fcfe457ea910ad7b996f6fb1065ddec0ea7fc6a16148fdf8fb437073ac4bfcd7f90606001610fa4565b6000818152600360209081526040808320815160a0810183528154815260018201548185015260028201805484518187028101870186528181529295939486019383018282801561296957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161294b575b505050918352505060038201546001600160a01b039081166020830152600490920154909116604090910152905060006129a283610880565b905060005b826040015151811015612c165782608001516001600160a01b0316836040015182815181106129d8576129d8613e6f565b60200260200101516001600160a01b0316636352211e848481518110612a0057612a00613e6f565b60200260200101516040518263ffffffff1660e01b8152600401612a2691815260200190565b602060405180830381865afa158015612a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a679190613dbb565b6001600160a01b031614612a8d5760405162461bcd60e51b815260040161080990613e85565b82604001518181518110612aa357612aa3613e6f565b6020908102919091010151608084015160405163e985e9c560e01b81526001600160a01b03918216600482015230602482015291169063e985e9c590604401602060405180830381865afa158015612aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b239190613d2b565b612b3f5760405162461bcd60e51b815260040161080990613ea3565b82604001518181518110612b5557612b55613e6f565b60200260200101516001600160a01b031663b88d4fde846080015133858581518110612b8357612b83613e6f565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152608060648201526000608482015260a401600060405180830381600087803b158015612beb57600080fd5b505af1158015612bff573d6000803e3d6000fd5b505050508080612c0e90613e25565b9150506129a7565b50505050565b6000838152600360209081526040808320815160a08101835281548152600182015481850152600282018054845181870281018701865281815292959394860193830182828015612c9657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612c78575b505050918352505060038201546001600160a01b0390811660208301526004909201549091166040909101529050612ccd84611708565b8015612cd7575082155b15612d6d57612ce584611910565b15612d1b5760405162461bcd60e51b8152600401610809906020808252600490820152634d31313160e01b604082015260600190565b6000848152600460205260409020546001600160a01b03838116911614612d6d5760405162461bcd60e51b8152600401610809906020808252600490820152632698989960e11b604082015260600190565b60608101516001600160a01b0316612dc557612d8884610752565b341015612dc05760405162461bcd60e51b815260040161080990602080825260049082015263134c4c4d60e21b604082015260600190565b612c16565b612dce84610752565b6060820151604051636eb1769f60e11b81523360048201523060248201526001600160a01b039091169063dd62ed3e90604401602060405180830381865afa158015612e1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e42919061405e565b1015612c165760405162461bcd60e51b8152600401610809906020808252600490820152634d31313560e01b604082015260600190565b6000828152600360209081526040808320815160a08101835281548152600182015481850152600282018054845181870281018701865281815292959394860193830182828015612ef357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612ed5575b505050918352505060038201546001600160a01b03908116602083015260049092015490911660409091015290506000612f2c84610880565b905060005b8260400151518110156131b35782608001516001600160a01b031683604001518281518110612f6257612f62613e6f565b60200260200101516001600160a01b0316636352211e848481518110612f8a57612f8a613e6f565b60200260200101516040518263ffffffff1660e01b8152600401612fb091815260200190565b602060405180830381865afa158015612fcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff19190613dbb565b6001600160a01b0316146130175760405162461bcd60e51b815260040161080990613e85565b8260400151818151811061302d5761302d613e6f565b6020908102919091010151608084015160405163e985e9c560e01b81526001600160a01b03918216600482015230602482015291169063e985e9c590604401602060405180830381865afa158015613089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ad9190613d2b565b6130c95760405162461bcd60e51b815260040161080990613ea3565b826040015181815181106130df576130df613e6f565b60200260200101516001600160a01b031663b88d4fde84608001518685858151811061310d5761310d613e6f565b60200260200101516040518463ffffffff1660e01b815260040161316e939291906001600160a01b0393841681529190921660208201526040810191909152608060608201819052600490820152634d31333560e01b60a082015260c00190565b600060405180830381600087803b15801561318857600080fd5b505af115801561319c573d6000803e3d6000fd5b5050505080806131ab90613e25565b915050612f31565b5050505050565b60006103e8600a54836131cd9190613ed5565b6131d79190613ec1565b6009549091506131f29084906001600160a01b031683613501565b600954604080516001600160a01b039092168252602082018390527f7f16a2217b9c8f2f607c1b34d23b08768d256a767230d179b61c1c290095f832910160405180910390a192915050565b60008281526003602090815260408083206002018054825181850281018501909352808352849383018282801561329e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613280575b5050505050905060008151846132b49190613ec1565b905060005b82518110156134f85760008382815181106132d6576132d6613e6f565b602002602001015190506000816001600160a01b03166333df048e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613320573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613344919061405e565b11156134e55760006103e8826001600160a01b03166333df048e6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561338d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133b1919061405e565b6133bb9086613ed5565b6133c59190613ec1565b905061343388836001600160a01b031663d5f394886040518163ffffffff1660e01b8152600401602060405180830381865afa158015613409573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061342d9190613dbb565b83613501565b61343d818761404b565b95507f7f16a2217b9c8f2f607c1b34d23b08768d256a767230d179b61c1c290095f832826001600160a01b031663d5f394886040518163ffffffff1660e01b8152600401602060405180830381865afa15801561349e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c29190613dbb565b604080516001600160a01b039092168252602082018490520160405180910390a1505b50806134f081613e25565b9150506132b9565b50505092915050565b600083815260036020819052604090912001546001600160a01b03166135ad576000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461356e576040519150601f19603f3d011682016040523d82523d6000602084013e613573565b606091505b5050905080612c165760405162461bcd60e51b8152600401610809906020808252600490820152634d31313760e01b604082015260600190565b600083815260036020819052604091829020015490516323b872dd60e01b81523360048201526001600160a01b03848116602483015260448201849052909116906323b872dd906064016020604051808303816000875af1158015613616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061363a9190613d2b565b6120335760405162461bcd60e51b815260040161080990613d48565b8280548282559060005260206000209081019282156136ab579160200282015b828111156136ab57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613676565b506136b79291506136bb565b5090565b5b808211156136b757600081556001016136bc565b6000602082840312156136e257600080fd5b5035919050565b6001600160a01b038116811461149257600080fd5b8035613709816136e9565b919050565b801515811461149257600080fd5b80356137098161370e565b6000806040838503121561373a57600080fd5b8235613745816136e9565b915060208301356137558161370e565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156137985783518352928401929184019160010161377c565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156137e3576137e36137a4565b604052919050565b600082601f8301126137fc57600080fd5b813567ffffffffffffffff811115613816576138166137a4565b613829601f8201601f19166020016137ba565b81815284602083860101111561383e57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561387057600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561389557600080fd5b6138a1868287016137eb565b9150509250925092565b6020808252825182820181905260009190848201906040850190845b818110156137985783516001600160a01b0316835292840192918401916001016138c7565b803565ffffffffffff8116811461370957600080fd5b80356001600160601b038116811461370957600080fd5b600067ffffffffffffffff821115613933576139336137a4565b5060051b60200190565b600082601f83011261394e57600080fd5b8135602061396361395e83613919565b6137ba565b82815260059290921b8401810191818101908684111561398257600080fd5b8286015b8481101561399d5780358352918301918301613986565b509695505050505050565b600082601f8301126139b957600080fd5b813560206139c961395e83613919565b82815260059290921b840181019181810190868411156139e857600080fd5b8286015b8481101561399d5780356139ff816136e9565b83529183019183016139ec565b600080600080600080600080610100898b031215613a2957600080fd5b613a328961371c565b9750613a4060208a016138ec565b9650613a4e60408a01613902565b9550613a5c60608a01613902565b9450608089013567ffffffffffffffff80821115613a7957600080fd5b613a858c838d0161393d565b955060a08b0135915080821115613a9b57600080fd5b613aa78c838d016139a8565b9450613ab560c08c016136fe565b935060e08b0135915080821115613acb57600080fd5b50613ad88b828c016137eb565b9150509295985092959890939650565b600080600060608486031215613afd57600080fd5b833592506020840135613b0f8161370e565b9150604084013567ffffffffffffffff81111561389557600080fd5b6000815180845260005b81811015613b5157602081850181015186830182015201613b35565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611d516020830184613b2b565b600060208284031215613b9657600080fd5b8135611d51816136e9565b600080600080600080600060c0888a031215613bbc57600080fd5b873596506020880135613bce816136e9565b95506040880135613bde8161370e565b9450606088013567ffffffffffffffff80821115613bfb57600080fd5b613c078b838c016137eb565b955060808a0135945060a08a0135915080821115613c2457600080fd5b818a0191508a601f830112613c3857600080fd5b813581811115613c4757600080fd5b8b6020828501011115613c5957600080fd5b60208301945080935050505092959891949750929550565b60008060408385031215613c8457600080fd5b823591506020830135613755816136e9565b600060208284031215613ca857600080fd5b813567ffffffffffffffff811115613cbf57600080fd5b613ccb8482850161393d565b949350505050565b60008060408385031215613ce657600080fd5b8235613cf1816136e9565b91506020830135613755816136e9565b634e487b7160e01b600052601260045260246000fd5b600082613d2657613d26613d01565b500690565b600060208284031215613d3d57600080fd5b8151611d518161370e565b60208082526004908201526304d3132360e41b604082015260600190565b6020808252600490820152634d31313360e01b604082015260600190565b60018060a01b0385168152836020820152826040820152608060608201526000613db16080830184613b2b565b9695505050505050565b600060208284031215613dcd57600080fd5b8151611d51816136e9565b6020808252600490820152634d31333360e01b604082015260600190565b828152604060208201526000613ccb6040830184613b2b565b634e487b7160e01b600052601160045260246000fd5b600060018201613e3757613e37613e0f565b5060010190565b838152606060208201526000613e576060830185613b2b565b905060018060a01b0383166040830152949350505050565b634e487b7160e01b600052603260045260246000fd5b6020808252600490820152634534313360e01b604082015260600190565b60208082526004908201526309a6262760e31b604082015260600190565b600082613ed057613ed0613d01565b500490565b808202811582820484141761077957610779613e0f565b600181815b80851115613f27578160001904821115613f0d57613f0d613e0f565b80851615613f1a57918102915b93841c9390800290613ef1565b509250929050565b600082613f3e57506001610779565b81613f4b57506000610779565b8160018114613f615760028114613f6b57613f87565b6001915050610779565b60ff841115613f7c57613f7c613e0f565b50506001821b610779565b5060208310610133831016604e8410600b8410161715613faa575081810a610779565b613fb48383613eec565b8060001904821115613fc857613fc8613e0f565b029392505050565b6000611d518383613f2f565b8481526001600160a01b03841660208201528215156040820152608060608201819052600090613db190830184613b2b565b84815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f909201601f191601019392505050565b8082018082111561077957610779613e0f565b60006020828403121561407057600080fd5b5051919050565b8181038181111561077957610779613e0f56fea26469706673582212208b92f701e8a7f0fa4fabb279648eb9ffa468792ed84782e9eaa72b93e25ed1a064736f6c63430008110033

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

0000000000000000000000002588965c3a09d0b50948ed2635e6e53ec7d790b9

-----Decoded View---------------
Arg [0] : module_ (address): 0x2588965C3a09D0b50948Ed2635E6E53EC7D790b9

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000002588965c3a09d0b50948ed2635e6e53ec7d790b9


Deployed Bytecode Sourcemap

2180:27475:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2506:43;;;;;;;;;;-1:-1:-1;2506:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2506:43:0;;;;;;;;;;;430:25:1;;;486:2;471:18;;464:34;;;;-1:-1:-1;;;;;572:15:1;;;552:18;;;545:43;;;;624:15;619:2;604:18;;597:43;417:3;402:19;2506:43:0;;;;;;;;27938:112;;;;;;;;;;-1:-1:-1;27938:112:0;;;;;:::i;:::-;;:::i;:::-;;;797:25:1;;;785:2;770:18;27938:112:0;651:177:1;23509:191:0;;;;;;;;;;-1:-1:-1;23509:191:0;;;;;:::i;:::-;;:::i;:::-;;28199:137;;;;;;;;;;-1:-1:-1;28199:137:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18237:396::-;;;;;;;;;;-1:-1:-1;18237:396:0;;;;;:::i;:::-;;:::i;24783:161::-;;;;;;;;;;-1:-1:-1;24783:161:0;;;;;:::i;:::-;;:::i;26374:174::-;;;;;;;;;;-1:-1:-1;26374:174:0;;;;;:::i;:::-;;:::i;29502:148::-;;;;;;;;;;-1:-1:-1;29502:148:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14104:785::-;;;;;;;;;;-1:-1:-1;14104:785:0;;;;;:::i;:::-;;:::i;16746:382::-;;;;;;:::i;:::-;;:::i;8487:517::-;;;;;;;;;;-1:-1:-1;8487:517:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3214:24::-;;;;;;;;;;;;;;;;26124:138;;;;;;;;;;-1:-1:-1;26124:138:0;;;;;:::i;:::-;;:::i;7917:157::-;;;;;;;;;;-1:-1:-1;7917:157:0;;;;;:::i;:::-;;:::i;22910:265::-;;;;;;;;;;-1:-1:-1;22910:265:0;;;;;:::i;:::-;;:::i;25105:172::-;;;;;;;;;;-1:-1:-1;25105:172:0;;;;;:::i;:::-;;:::i;2923:46::-;;;;;;;;;;-1:-1:-1;2923:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9172:14:1;;9165:22;9147:41;;9135:2;9120:18;2923:46:0;9007:187:1;28824:103:0;;;;;;;;;;-1:-1:-1;28824:103:0;;;;;:::i;:::-;-1:-1:-1;;;;;28903:18:0;28883:4;28903:18;;;:10;:18;;;;;;;;;28824:103;27679:122;;;;;;;;;;-1:-1:-1;27679:122:0;;;;;:::i;:::-;;:::i;26855:141::-;;;;;;;;;;-1:-1:-1;26855:141:0;;;;;:::i;:::-;;:::i;2608:49::-;;;;;;;;;;-1:-1:-1;2608:49:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;2608:49:0;;;;;;-1:-1:-1;;;;;9363:32:1;;;9345:51;;9333:2;9318:18;2608:49:0;9199:203:1;27137:142:0;;;;;;;;;;-1:-1:-1;27137:142:0;;;;;:::i;:::-;;:::i;27418:123::-;;;;;;;;;;-1:-1:-1;27418:123:0;;;;;:::i;:::-;;:::i;11018:571::-;;;;;;:::i;:::-;;:::i;28492:155::-;;;;;;;;;;-1:-1:-1;28492:155:0;;;;;:::i;:::-;;:::i;2822:42::-;;;;;;;;;;-1:-1:-1;2822:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;25477:539;;;;;;;;;;-1:-1:-1;25477:539:0;;;;;:::i;:::-;;:::i;2716:46::-;;;;;;;;;;-1:-1:-1;2716:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;23820:164;;;;;;;;;;-1:-1:-1;23820:164:0;;;;;:::i;:::-;;:::i;3123:25::-;;;;;;;;;;-1:-1:-1;3123:25:0;;;;-1:-1:-1;;;;;3123:25:0;;;22472:207;;;;;;;;;;-1:-1:-1;22472:207:0;;;;;:::i;:::-;;:::i;2430:26::-;;;;;;;;;;;;;;;;29135:241;;;;;;;;;;-1:-1:-1;29135:241:0;;;;;:::i;:::-;;:::i;8229:161::-;;;;;;;;;;-1:-1:-1;8229:161:0;;;;;:::i;:::-;;:::i;7449:136::-;;;;;;;;;;;;;:::i;27938:112::-;27992:4;28012:20;;;:10;:20;;;;;:25;:32;;28040:4;;28012:32;:::i;:::-;28005:39;27938:112;-1:-1:-1;;27938:112:0:o;23509:191::-;6403:13;;:37;;-1:-1:-1;;;6403:37:0;;6429:10;6403:37;;;9345:51:1;-1:-1:-1;;;;;6403:13:0;;;;:25;;9318:18:1;;6403:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6395:54;;;;-1:-1:-1;;;6395:54:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;23595:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;;;;:36;;-1:-1:-1;;23595:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;23643:51;;12743:34:1;;;23671:10:0::1;12793:18:1::0;;;12786:43;;;;12845:18;;;12838:50;23643:51:0::1;::::0;12693:2:1;12678:18;23643:51:0::1;;;;;;;;23509:191:::0;;:::o;28199:137::-;28300:20;;;;:10;:20;;;;;:29;;;28263:13;;28293:37;;:6;:37::i;18237:396::-;18336:8;6264:18;6273:8;6264;:18::i;:::-;6256:35;;;;-1:-1:-1;;;6256:35:0;;;;;;;:::i;:::-;5954:24:::1;::::0;;;:14:::1;:24;::::0;;;;;18365:8;;5954:24:::1;;:32;;:24:::0;:32:::1;::::0;5953:105:::1;;-1:-1:-1::0;6000:13:0::1;::::0;;6029:20;;;:10:::1;:20;::::0;;;;;;:27:::1;::::0;;::::1;::::0;6000:57;;-1:-1:-1;;;6000:57:0;;-1:-1:-1;;;;;6029:27:0;;::::1;6000:57:::0;;::::1;9345:51:1::0;;;;6000:13:0;::::1;::::0;:28:::1;::::0;9318:18:1;;6000:57:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5937:143;;;;-1:-1:-1::0;;;5937:143:0::1;;;;;;13433:2:1::0;13415:21;;;13472:1;13452:18;;;13445:29;-1:-1:-1;;;13505:2:1;13490:18;;13483:34;13549:2;13534:18;;13231:327;5937:143:0::1;18388:8:::2;6641:19;6651:8;6641:9;:19::i;:::-;6633:36;;;;-1:-1:-1::0;;;6633:36:0::2;;;;;;13765:2:1::0;13747:21;;;13804:1;13784:18;;;13777:29;-1:-1:-1;;;13837:2:1;13822:18;;13815:34;13881:2;13866:18;;13563:327;6633:36:0::2;18406::::3;18425:8;18435:6;18406:18;:36::i;:::-;18449:38;18470:8;18480:6;18449:20;:38::i;:::-;18494:27;18504:8;18514:6;18494:9;:27::i;:::-;18528:24;::::0;;;:14:::3;:24;::::0;;;;;;:37;;-1:-1:-1;;;;;;18528:37:0::3;18555:10;18528:37:::0;;::::3;::::0;;;18577:50;;::::3;::::0;::::3;::::0;18543:8;;18616:6;;18624:2;;18577:50:::3;:::i;:::-;;;;;;;;6087:1:::2;6298::::1;18237:396:::0;;;;:::o;24783:161::-;6403:13;;:37;;-1:-1:-1;;;6403:37:0;;6429:10;6403:37;;;9345:51:1;-1:-1:-1;;;;;6403:13:0;;;;:25;;9318:18:1;;6403:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6395:54;;;;-1:-1:-1;;;6395:54:0;;;;;;;:::i;:::-;24863:8:::1;6264:18;6273:8;6264;:18::i;:::-;6256:35;;;;-1:-1:-1::0;;;6256:35:0::1;;;;;;;:::i;:::-;24881:21:::2;24893:8;24881:11;:21::i;:::-;24914:24;::::0;797:25:1;;;24914:24:0::2;::::0;785:2:1;770:18;24914:24:0::2;651:177:1::0;26374:174:0;6804:13;;:26;;-1:-1:-1;;;6804:26:0;;6828:1;6804:26;;;797:25:1;-1:-1:-1;;;;;6804:13:0;;;;:23;;770:18:1;;6804:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6790:40:0;:10;-1:-1:-1;;;;;6790:40:0;;6782:57;;;;-1:-1:-1;;;6782:57:0;;;;;;;:::i;:::-;26467:4:::1;26459:6;:12;;26451:28;;;;-1:-1:-1::0;;;26451:28:0::1;;;;;;15341:2:1::0;15323:21;;;15380:1;15360:18;;;15353:29;-1:-1:-1;;;15413:2:1;15398:18;;15391:34;15457:2;15442:18;;15139:327;26451:28:0::1;26486:12;:21:::0;;;26519:23:::1;::::0;797:25:1;;;26519:23:0::1;::::0;785:2:1;770:18;26519:23:0::1;;;;;;;;26374:174:::0;:::o;29502:148::-;29604:20;;;;:10;:20;;;;;;;;;:40;;29597:47;;;;;;;;;;;;;;;;;29573:16;;29597:47;;;29604:40;29597:47;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29597:47:0;;;;;;;;;;;;;;;;;;;;;;;29502:148;;;:::o;14104:785::-;14364:108;14386:10;14398:8;14408:7;14417:6;14425:9;14436:20;14458:13;14364:21;:108::i;:::-;14479:16;14498:51;14517:9;14528:20;14498:18;:51::i;:::-;14479:70;;14561:11;14556:52;;14589:11;;14574:27;;;;:14;:27;;;;;:34;;-1:-1:-1;;14574:34:0;14604:4;14574:34;;;14556:52;14641:174;;;;;;;;14655:57;14666:10;:18;;14683:1;14666:18;;;14679:1;14666:18;14655:57;;14686:8;14696:7;14705:6;14655:10;:57::i;:::-;14641:174;;;;14721:17;14728:9;14721:6;:17::i;:::-;14641:174;;;;14747:20;14641:174;;;;14776:13;-1:-1:-1;;;;;14641:174:0;;;;;14798:10;-1:-1:-1;;;;;14641:174:0;;;;14615:10;:23;14626:11;;14615:23;;;;;;;;;;;:200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;14615:200:0;;;;;;;;;-1:-1:-1;;;;;;14615:200:0;;;-1:-1:-1;;;;;14615:200:0;;;;;;;;;;;;;;;;;;;;;;;;;;14840:11;;14827:36;;;;;;14853:9;;14827:36;:::i;:::-;;;;;;;;14870:11;:13;;;:11;:13;;;:::i;:::-;;;;;;14357:532;14104:785;;;;;;;;:::o;16746:382::-;16856:8;6264:18;6273:8;6264;:18::i;:::-;6256:35;;;;-1:-1:-1;;;6256:35:0;;;;;;;:::i;:::-;5954:24:::1;::::0;;;:14:::1;:24;::::0;;;;;16885:8;;5954:24:::1;;:32;;:24:::0;:32:::1;::::0;5953:105:::1;;-1:-1:-1::0;6000:13:0::1;::::0;;6029:20;;;:10:::1;:20;::::0;;;;;;:27:::1;::::0;;::::1;::::0;6000:57;;-1:-1:-1;;;6000:57:0;;-1:-1:-1;;;;;6029:27:0;;::::1;6000:57:::0;;::::1;9345:51:1::0;;;;6000:13:0;::::1;::::0;:28:::1;::::0;9318:18:1;;6000:57:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5937:143;;;;-1:-1:-1::0;;;5937:143:0::1;;;;;;13433:2:1::0;13415:21;;;13472:1;13452:18;;;13445:29;-1:-1:-1;;;13505:2:1;13490:18;;13483:34;13549:2;13534:18;;13231:327;5937:143:0::1;16902:40:::2;16921:8;16931:10;16902:18;:40::i;:::-;16949:21;16961:8;16949:11;:21::i;:::-;16977:40;16989:8;16998:18;17007:8;16998;:18::i;:::-;16977:11;:40::i;:::-;17034:28;17053:8;17034:18;:28::i;:::-;17074:48;17090:8;17100:9;17111:10;17074:48;;;;;;;;:::i;:::-;;;;;;;;6298:1:::1;16746:382:::0;;;;:::o;8487:517::-;8577:13;8546:8;6264:18;6273:8;6264;:18::i;:::-;6256:35;;;;-1:-1:-1;;;6256:35:0;;;;;;;:::i;:::-;8599:18:::1;8620:20:::0;;;:10:::1;:20;::::0;;;;;;;8599:41;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;;8620:20;;8599:41;;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;8599:41:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;-1:-1:-1::0;;;8599:41:0;;;-1:-1:-1;;8599:41:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;8599:41:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;8599:41:0::1;8672:28;8691:8:::0;8672:18:::1;:28::i;:::-;8647:53;;8712:9;8707:276;8727:5;:25;;;:32;8723:1;:36;8707:276;;;8845:5;:12;;;-1:-1:-1::0;;;;;8783:74:0::1;8791:5;:25;;;8817:1;8791:28;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;8783:45:0::1;;8829:8;8838:1;8829:11;;;;;;;;:::i;:::-;;;;;;;8783:58;;;;;;;;;;;;;797:25:1::0;;785:2;770:18;;651:177;8783:58:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8783:74:0::1;;8775:91;;;;-1:-1:-1::0;;;8775:91:0::1;;;;;;;:::i;:::-;8891:5;:25;;;8917:1;8891:28;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;8938:12:::1;::::0;::::1;::::0;8883:83:::1;::::0;-1:-1:-1;;;8883:83:0;;-1:-1:-1;;;;;17126:15:1;;;8883:83:0::1;::::0;::::1;17108:34:1::0;8960:4:0::1;17158:18:1::0;;;17151:43;8883:54:0;::::1;::::0;::::1;::::0;17043:18:1;;8883:83:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8875:100;;;;-1:-1:-1::0;;;8875:100:0::1;;;;;;;:::i;:::-;8761:3:::0;::::1;::::0;::::1;:::i;:::-;;;;8707:276;;;-1:-1:-1::0;;8989:9:0::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;8989:9:0;;;8487:517;-1:-1:-1;;;;8487:517:0:o;26124:138::-;6804:13;;:26;;-1:-1:-1;;;6804:26:0;;6828:1;6804:26;;;797:25:1;-1:-1:-1;;;;;6804:13:0;;;;:23;;770:18:1;;6804:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6790:40:0;:10;-1:-1:-1;;;;;6790:40:0;;6782:57;;;;-1:-1:-1;;;6782:57:0;;;;;;;:::i;:::-;26200:10:::1;:21:::0;;-1:-1:-1;;;;;;26200:21:0::1;-1:-1:-1::0;;;;;26200:21:0;::::1;::::0;;::::1;::::0;;;26233:23:::1;::::0;9345:51:1;;;26233:23:0::1;::::0;9333:2:1;9318:18;26233:23:0::1;9199:203:1::0;7917:157:0;6804:13;;:26;;-1:-1:-1;;;6804:26:0;;6828:1;6804:26;;;797:25:1;-1:-1:-1;;;;;6804:13:0;;;;:23;;770:18:1;;6804:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6790:40:0;:10;-1:-1:-1;;;;;6790:40:0;;6782:57;;;;-1:-1:-1;;;6782:57:0;;;;;;;:::i;:::-;8007:15:::1;::::0;:35:::1;::::0;-1:-1:-1;;;8007:35:0;;-1:-1:-1;;;;;9363:32:1;;;8007:35:0::1;::::0;::::1;9345:51:1::0;8007:15:0;;::::1;::::0;:24:::1;::::0;9318:18:1;;8007:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7999:69;;;::::0;-1:-1:-1;;;7999:69:0;;17739:2:1;7999:69:0::1;::::0;::::1;17721:21:1::0;17778:2;17758:18;;;17751:30;-1:-1:-1;;;17797:18:1;;;17790:51;17858:18;;7999:69:0::1;17537:345:1::0;7999:69:0::1;7917:157:::0;:::o;22910:265::-;22962:22;22992:11;23026:4;23007:15;-1:-1:-1;;;23007:8:0;:15;:::i;:::-;23006:24;;;;:::i;:::-;22992:38;;23059:6;23048:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23048:18:0;;23037:29;;23079:6;23074:96;23091:6;23087:1;:10;23074:96;;;23157:4;23146:6;:1;23150:2;23146:6;:::i;:::-;23139:14;;:2;:14;:::i;:::-;23127:27;;:8;:27;:::i;:::-;:34;;;;:::i;:::-;23112:8;23121:1;23112:11;;;;;;;;:::i;:::-;;;;;;;;;;:50;23099:3;;;:::i;:::-;;;23074:96;;;;22985:190;22910:265;;;:::o;25105:172::-;6804:13;;:26;;-1:-1:-1;;;6804:26:0;;6828:1;6804:26;;;797:25:1;-1:-1:-1;;;;;6804:13:0;;;;:23;;770:18:1;;6804:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6790:40:0;:10;-1:-1:-1;;;;;6790:40:0;;6782:57;;;;-1:-1:-1;;;6782:57:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25194:18:0;::::1;;::::0;;;:10:::1;:18;::::0;;;;;;;;:31;;-1:-1:-1;;25194:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;25237:34;;19727:51:1;;;19794:18;;;19787:50;25237:34:0::1;::::0;19700:18:1;25237:34:0::1;19559:284:1::0;27679:122:0;27734:4;27755:20;;;:10;:20;;;;;:25;27791:4;;27755:32;;27791:4;;27755:32;:::i;:::-;27754:41;;;;:::i;26855:141::-;26909:4;26931:20;;;:10;:20;;;;;:25;26967:2;;26931:32;;-1:-1:-1;;;26959:4:0;26931:32;:::i;:::-;26930:39;;;;:::i;:::-;26974:1;26929:46;:61;;26985:5;26929:61;;;26978:4;26922:68;26855:141;-1:-1:-1;;26855:141:0:o;27137:142::-;27192:4;27214:20;;;:10;:20;;;;;:25;27250:2;;27214:32;;-1:-1:-1;;;27242:4:0;27214:32;:::i;27418:123::-;27474:4;27495:20;;;:10;:20;;;;;:25;27531:4;;27495:32;;-1:-1:-1;;;27523:4:0;27495:32;:::i;11018:571::-;11227:8;6264:18;6273:8;6264;:18::i;:::-;6256:35;;;;-1:-1:-1;;;6256:35:0;;;;;;;:::i;:::-;11273:8:::1;11283:6;11291:10;11303:9;11262:51;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;11262:51:0;;::::1;::::0;;;;;;;11252:62;;11262:51:::1;11252:62:::0;;::::1;::::0;7006:15:::1;::::0;-1:-1:-1;;;7006:49:0;;11252:62;;11316:6;;11324:10;;;;6991:12:::1;::::0;-1:-1:-1;;;;;7006:15:0;;::::1;::::0;:22:::1;::::0;:49:::1;::::0;11252:62;;11316:6;;11324:10;;;;7006:49:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6991:64;;7070:7;7062:46;;;::::0;-1:-1:-1;;;7062:46:0;;21064:2:1;7062:46:0::1;::::0;::::1;21046:21:1::0;21103:2;21083:18;;;21076:30;21142:28;21122:18;;;21115:56;21188:18;;7062:46:0::1;20862:350:1::0;7062:46:0::1;11346:53:::2;11370:8;11380:10;11392:6;11346:23;:53::i;:::-;11406:21;11418:8;11406:11;:21::i;:::-;11434:41;11446:8;11456:18;11465:8;11456;:18::i;11434:41::-;11482;11506:8;11516:6;11482:23;:41::i;:::-;11535:48;11555:8;11565:9;11576:6;11535:48;;;;;;;;:::i;:::-;;;;;;;;6984:138:::1;6298:1;;;;11018:571:::0;;;;;;;;:::o;28492:155::-;28583:4;28564:8;6641:19;6651:8;6641:9;:19::i;:::-;6633:36;;;;-1:-1:-1;;;6633:36:0;;;;;;13765:2:1;13747:21;;;13804:1;13784:18;;;13777:29;-1:-1:-1;;;13837:2:1;13822:18;;13815:34;13881:2;13866:18;;13563:327;6633:36:0;28626:15:::1;28603:20;28614:8;28603:10;:20::i;:::-;:38;::::0;28492:155;-1:-1:-1;;;28492:155:0:o;25477:539::-;6403:13;;:37;;-1:-1:-1;;;6403:37:0;;6429:10;6403:37;;;9345:51:1;-1:-1:-1;;;;;6403:13:0;;;;:25;;9318:18:1;;6403:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6395:54;;;;-1:-1:-1;;;6395:54:0;;;;;;;:::i;:::-;25563:24:::1;25653::::0;;;:14:::1;:24;::::0;;;;;;;;25679:10:::1;:20:::0;;;;;;;:33;;::::1;::::0;25563:24;;25636:77:::1;::::0;-1:-1:-1;;;;;25653:24:0;;::::1;::::0;25679:33:::1;25636:16;:77::i;:::-;25753:20;::::0;;;:10:::1;:20;::::0;;;;;;;:33:::1;::::0;25724:63:::1;::::0;25741:10;;-1:-1:-1;;;;;25753:33:0::1;25724:16;:63::i;:::-;25562:234;;;;25833:16;25811:19;25821:8;25811:9;:19::i;:::-;:38;25803:54;;;;-1:-1:-1::0;;;25803:54:0::1;;;;;;21419:2:1::0;21401:21;;;21458:1;21438:18;;;21431:29;-1:-1:-1;;;21491:2:1;21476:18;;21469:34;21535:2;21520:18;;21217:327;25803:54:0::1;25895:16;25872:19;25882:8;25872:9;:19::i;:::-;:39;;25864:55;;;;-1:-1:-1::0;;;25864:55:0::1;;;;;;21751:2:1::0;21733:21;;;21790:1;21770:18;;;21763:29;-1:-1:-1;;;21823:2:1;21808:18;;21801:34;21867:2;21852:18;;21549:327;25864:55:0::1;25926:24;::::0;;;:14:::1;:24;::::0;;;;;;;;:37;;-1:-1:-1;;;;;;25926:37:0::1;-1:-1:-1::0;;;;;25926:37:0;::::1;::::0;;::::1;::::0;;;25975:35;;22055:25:1;;;22096:18;;;22089:60;25975:35:0::1;::::0;22028:18:1;25975:35:0::1;;;;;;;25555:461;;25477:539:::0;;:::o;23820:164::-;6403:13;;:37;;-1:-1:-1;;;6403:37:0;;6429:10;6403:37;;;9345:51:1;-1:-1:-1;;;;;6403:13:0;;;;:25;;9318:18:1;;6403:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6395:54;;;;-1:-1:-1;;;6395:54:0;;;;;;;:::i;:::-;23895:8:::1;6264:18;6273:8;6264;:18::i;:::-;6256:35;;;;-1:-1:-1::0;;;6256:35:0::1;;;;;;;:::i;:::-;23912:24:::2;::::0;;;:14:::2;:24;::::0;;;;;;:31;;-1:-1:-1;;23912:31:0::2;23939:4;23912:31;::::0;;23955:23;::::2;::::0;::::2;::::0;23927:8;797:25:1;;785:2;770:18;;651:177;22472:207:0;22531:11;22556:6;22551:89;22568:6;:13;22564:1;:17;22551:89;;;22624:6;:1;22628:2;22624:6;:::i;:::-;22617:14;;:2;:14;:::i;:::-;22604:6;22611:1;22604:9;;;;;;;;:::i;:::-;;;;;;;:28;;;;:::i;:::-;22597:35;;;;:::i;:::-;;-1:-1:-1;22583:3:0;;;:::i;:::-;;;22551:89;;;-1:-1:-1;22653:13:0;;:20;;-1:-1:-1;;;22653:20:0;:::i;:::-;22646:27;;;;:::i;29135:241::-;29219:12;-1:-1:-1;;;;;29244:27:0;;29240:130;;-1:-1:-1;;;;;;29290:21:0;;;29240:130;;;29333:37;;-1:-1:-1;;;29333:37:0;;-1:-1:-1;;;;;9363:32:1;;;29333:37:0;;;9345:51:1;29333:31:0;;;;;9318:18:1;;29333:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29323:47;29135:241;-1:-1:-1;;;29135:241:0:o;8229:161::-;6804:13;;:26;;-1:-1:-1;;;6804:26:0;;6828:1;6804:26;;;797:25:1;-1:-1:-1;;;;;6804:13:0;;;;:23;;770:18:1;;6804:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6790:40:0;:10;-1:-1:-1;;;;;6790:40:0;;6782:57;;;;-1:-1:-1;;;6782:57:0;;;;;;;:::i;:::-;8325:15:::1;:59:::0;;-1:-1:-1;;;;;;8325:59:0::1;-1:-1:-1::0;;;;;8325:59:0;;;::::1;::::0;;;::::1;::::0;;8229:161::o;7449:136::-;6804:13;;:26;;-1:-1:-1;;;6804:26:0;;6828:1;6804:26;;;797:25:1;-1:-1:-1;;;;;6804:13:0;;;;:23;;770:18:1;;6804:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6790:40:0;:10;-1:-1:-1;;;;;6790:40:0;;6782:57;;;;-1:-1:-1;;;6782:57:0;;;;;;;:::i;:::-;7517:13:::1;::::0;:26:::1;::::0;-1:-1:-1;;;7517:26:0;;7501:13:::1;7517:26;::::0;::::1;797:25:1::0;;;7501:13:0;-1:-1:-1;;;;;7517:13:0::1;::::0;:23:::1;::::0;770:18:1;;7517:26:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7550:13;:29:::0;;-1:-1:-1;;;;;;7550:29:0::1;-1:-1:-1::0;;;;;7550:29:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;7449:136:0:o;17478:204::-;17579:1;17570:6;:10;17569:46;;;;;17608:6;17586:19;17596:8;17586:9;:19::i;:::-;:28;17569:46;17561:63;;;;-1:-1:-1;;;17561:63:0;;;;;;22871:2:1;22853:21;;;22910:1;22890:18;;;22883:29;-1:-1:-1;;;22943:2:1;22928:18;;22921:34;22987:2;22972:18;;22669:327;17561:63:0;17639:29;17659:8;17639:19;:29::i;:::-;17631:45;;;;-1:-1:-1;;;17631:45:0;;;;;;23203:2:1;23185:21;;;23242:1;23222:18;;;23215:29;-1:-1:-1;;;23275:2:1;23260:18;;23253:34;23319:2;23304:18;;23001:327;17631:45:0;17478:204;;:::o;17878:209::-;17963:12;18007:20;;;:10;:20;;;;;;;:33;;17978:63;;17995:10;;-1:-1:-1;;;;;18007:33:0;17978:16;:63::i;:::-;17963:78;;18065:7;18056:6;:16;18048:33;;;;-1:-1:-1;;;18048:33:0;;;;;;23535:2:1;23517:21;;;23574:1;23554:18;;;23547:29;-1:-1:-1;;;23607:2:1;23592:18;;23585:34;23651:2;23636:18;;23333:327;18048:33:0;17956:131;17878:209;;:::o;24433:229::-;24586:20;;;;:10;:20;;;;;:25;:32;;24614:4;;24586:32;:::i;:::-;24570:11;:4;24577;24570:11;:::i;:::-;24524:20;;;;:10;:20;;;;;:25;:32;;-1:-1:-1;;;24552:4:0;24524:32;:::i;:::-;24523:41;;-1:-1:-1;;;24523:41:0;:::i;:::-;24522:60;;;;:::i;:::-;:97;;;;:::i;:::-;24494:20;;;;:10;:20;;;;;;;;;:125;;;;24631:25;;23839::1;;;23880:18;;;23873:34;;;24631:25:0;;23812:18:1;24631:25:0;23665:248:1;24104:166:0;24165:18;24174:8;24165;:18::i;:::-;24157:34;;;;-1:-1:-1;;;24157:34:0;;;;;;24120:2:1;24102:21;;;24159:1;24139:18;;;24132:29;-1:-1:-1;;;24192:2:1;24177:18;;24170:34;24236:2;24221:18;;23918:327;24157:34:0;24226:20;;;;:10;:20;;;;;:25;:38;;-1:-1:-1;;;24255:8:0;24226:38;:::i;:::-;24198:20;;;;:10;:20;;;;;;:66;24104:166::o;12299:579::-;12577:20;:27;12557:9;:16;:47;12548:66;;;;-1:-1:-1;;;12548:66:0;;;;;;24585:2:1;24567:21;;;24624:1;24604:18;;;24597:29;-1:-1:-1;;;24657:2:1;24642:18;;24635:34;24701:2;24686:18;;24383:327;12548:66:0;12648:1;12629:9;:16;:20;12621:36;;;;-1:-1:-1;;;12621:36:0;;;;;;24917:2:1;24899:21;;;24956:1;24936:18;;;24929:29;-1:-1:-1;;;24989:2:1;24974:18;;24967:34;25033:2;25018:18;;24715:327;12621:36:0;12681:1;12672:6;-1:-1:-1;;;;;12672:10:0;;12664:27;;;;-1:-1:-1;;;12664:27:0;;;;;;25249:2:1;25231:21;;;25288:1;25268:18;;;25261:29;-1:-1:-1;;;25321:2:1;25306:18;;25299:34;25365:2;25350:18;;25047:327;12664:27:0;-1:-1:-1;;;;;28903:18:0;;28883:4;28903:18;;;:10;:18;;;;;;;;12698:44;;;;-1:-1:-1;;;12698:44:0;;;;;;25581:2:1;25563:21;;;25620:1;25600:18;;;25593:29;-1:-1:-1;;;25653:2:1;25638:18;;25631:34;25697:2;25682:18;;25379:327;12698:44:0;12753:10;12749:123;;;12792:22;:15;12810:4;12792:22;:::i;:::-;12781:8;:33;;;12773:49;;;;-1:-1:-1;;;12773:49:0;;;;;;25913:2:1;25895:21;;;25952:1;25932:18;;;25925:29;-1:-1:-1;;;25985:2:1;25970:18;;25963:34;26029:2;26014:18;;25711:327;12773:49:0;12848:7;-1:-1:-1;;;;;12839:16:0;:6;-1:-1:-1;;;;;12839:16:0;;12831:33;;;;-1:-1:-1;;;12831:33:0;;;;;;26245:2:1;26227:21;;;26284:1;26264:18;;;26257:29;-1:-1:-1;;;26317:2:1;26302:18;;26295:34;26361:2;26346:18;;26043:327;12831:33:0;12299:579;;;;;;;:::o;13156:474::-;13274:9;13297;13292:333;13312:20;:27;13308:1;:31;13292:333;;;13421:10;-1:-1:-1;;;;;13363:68:0;13371:20;13392:1;13371:23;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;13363:40:0;;13404:9;13414:1;13404:12;;;;;;;;:::i;:::-;;;;;;;13363:54;;;;;;;;;;;;;797:25:1;;785:2;770:18;;651:177;13363:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13363:68:0;;13355:85;;;;-1:-1:-1;;;13355:85:0;;;;;;;:::i;:::-;13465:20;13486:1;13465:23;;;;;;;;:::i;:::-;;;;;;;;;;;13457:76;;-1:-1:-1;;;13457:76:0;;13507:10;13457:76;;;17108:34:1;13527:4:0;17158:18:1;;;17151:43;-1:-1:-1;;;;;13457:49:0;;;;;;17043:18:1;;13457:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13449:93;;;;-1:-1:-1;;;13449:93:0;;;;;;;:::i;:::-;13556:14;:39;13571:20;13592:1;13571:23;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;13556:39:0;;;;;;;;;;;-1:-1:-1;13556:39:0;;;;13555:40;:49;;;;;13600:4;13599:5;13555:49;13551:66;;;13613:4;13606:11;;13551:66;13341:3;;;;:::i;:::-;;;;13292:333;;;;13156:474;;;;:::o;21967:309::-;22097:16;22263:6;-1:-1:-1;;;;;22136:134:0;22240:4;-1:-1:-1;;;;;22235:10:0;22249:8;22235:23;;;;:::i;:::-;22203:27;:14;;;-1:-1:-1;;;22203:27:0;:::i;:::-;22175:23;:10;-1:-1:-1;;;22175:23:0;:::i;:::-;22136:63;;-1:-1:-1;;;22136:63:0;:::i;:::-;:95;;;;:::i;:::-;:123;;;;:::i;:::-;:134;;;;:::i;:::-;22122:148;21967:309;-1:-1:-1;;;;;21967:309:0:o;15260:539::-;15344:18;15365:20;;;:10;:20;;;;;;;;15344:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15365:20;;15344:41;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15344:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;15344:41:0;;;-1:-1:-1;;15344:41:0;;;;-1:-1:-1;;;;;15344:41:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15396:19:0;15406:8;15396:9;:19::i;:::-;:34;;;;;15420:10;15419:11;15396:34;15392:168;;;15450:29;15470:8;15450:19;:29::i;:::-;15449:30;15441:47;;;;-1:-1:-1;;;15441:47:0;;;;;;26577:2:1;26559:21;;;26616:1;26596:18;;;26589:29;-1:-1:-1;;;26649:2:1;26634:18;;26627:34;26693:2;26678:18;;26375:327;15441:47:0;15519:24;;;;:14;:24;;;;;;-1:-1:-1;;;;;15519:24:0;15505:10;:38;15497:55;;;;-1:-1:-1;;;15497:55:0;;;;;;26909:2:1;26891:21;;;26948:1;26928:18;;;26921:29;-1:-1:-1;;;26981:2:1;26966:18;;26959:34;27025:2;27010:18;;26707:327;15497:55:0;15570:18;;;;-1:-1:-1;;;;;15570:32:0;15566:228;;15634:18;15643:8;15634;:18::i;:::-;15621:9;:31;;15613:48;;;;-1:-1:-1;;;15613:48:0;;;;;;27241:2:1;27223:21;;;27280:1;27260:18;;;27253:29;-1:-1:-1;;;27313:2:1;27298:18;;27291:34;27357:2;27342:18;;27039:327;15566:228:0;15760:18;15769:8;15760;:18::i;:::-;15699;;;;15692:64;;-1:-1:-1;;;15692:64:0;;15729:10;15692:64;;;17108:34:1;15749:4:0;17158:18:1;;;17151:43;-1:-1:-1;;;;;15692:36:0;;;;;;17043:18:1;;15692:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:86;;15684:102;;;;-1:-1:-1;;;15684:102:0;;;;;;27573:2:1;27555:21;;;27612:1;27592:18;;;27585:29;-1:-1:-1;;;27645:2:1;27630:18;;27623:34;27689:2;27674:18;;27371:327;20955:446:0;21027:23;21053:37;21074:8;21083:6;21053:20;:37::i;:::-;21027:63;;21097:27;21127:41;21152:8;21161:6;21127:24;:41::i;:::-;21097:71;-1:-1:-1;21175:21:0;21097:71;21199:24;21208:15;21199:6;:24;:::i;:::-;:46;;;;:::i;:::-;21273:20;;;;:10;:20;;;;;:27;;;21175:70;;-1:-1:-1;21252:65:0;;21263:8;;-1:-1:-1;;;;;21273:27:0;21175:70;21252:10;:65::i;:::-;21329:66;;;27905:25:1;;;27961:2;27946:18;;27939:34;;;27989:18;;;27982:34;;;21329:66:0;;27893:2:1;27878:18;21329:66:0;27703:319:1;15912:575:0;15975:18;15996:20;;;:10;:20;;;;;;;;15975:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15996:20;;15975:41;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15975:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;15975:41:0;;;-1:-1:-1;;15975:41:0;;;;-1:-1:-1;;;;;15975:41:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15975:41:0;16054:28;16073:8;16054:18;:28::i;:::-;16023:59;;16094:9;16089:393;16113:5;:25;;;:32;16109:1;:36;16089:393;;;16234:5;:12;;;-1:-1:-1;;;;;16169:77:0;16177:5;:25;;;16203:1;16177:28;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;16169:45:0;;16215:11;16227:1;16215:14;;;;;;;;:::i;:::-;;;;;;;16169:61;;;;;;;;;;;;;797:25:1;;785:2;770:18;;651:177;16169:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;16169:77:0;;16161:95;;;;-1:-1:-1;;;16161:95:0;;;;;;;:::i;:::-;16281:5;:25;;;16307:1;16281:28;;;;;;;;:::i;:::-;;;;;;;;;;;16328:12;;;;16273:83;;-1:-1:-1;;;16273:83:0;;-1:-1:-1;;;;;17126:15:1;;;16273:83:0;;;17108:34:1;16350:4:0;17158:18:1;;;17151:43;16273:54:0;;;;;17043:18:1;;16273:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16265:100;;;;-1:-1:-1;;;16265:100:0;;;;;;;:::i;:::-;16382:5;:25;;;16408:1;16382:28;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;16374:54:0;;16429:5;:12;;;16443:10;16455:11;16467:1;16455:14;;;;;;;;:::i;:::-;;;;;;;;;;;16374:100;;-1:-1:-1;;;;;;16374:100:0;;;;;;;-1:-1:-1;;;;;28350:15:1;;;16374:100:0;;;28332:34:1;28402:15;;;;28382:18;;;28375:43;28434:18;;;28427:34;28497:3;28477:18;;;28470:31;-1:-1:-1;28517:19:1;;;28510:30;28557:19;;16374:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16147:3;;;;;:::i;:::-;;;;16089:393;;;;15968:519;;15912:575;:::o;9259:556::-;9364:18;9385:20;;;:10;:20;;;;;;;;9364:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9385:20;;9364:41;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9364:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;9364:41:0;;;-1:-1:-1;;9364:41:0;;;;-1:-1:-1;;;;;9364:41:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9416:19:0;9426:8;9416:9;:19::i;:::-;:34;;;;;9440:10;9439:11;9416:34;9412:164;;;9470:29;9490:8;9470:19;:29::i;:::-;9469:30;9461:47;;;;-1:-1:-1;;;9461:47:0;;;;;;26577:2:1;26559:21;;;26616:1;26596:18;;;26589:29;-1:-1:-1;;;26649:2:1;26634:18;;26627:34;26693:2;26678:18;;26375:327;9461:47:0;9535:24;;;;:14;:24;;;;;;-1:-1:-1;;;;;9525:34:0;;;9535:24;;9525:34;9517:51;;;;-1:-1:-1;;;9517:51:0;;;;;;26909:2:1;26891:21;;;26948:1;26928:18;;;26921:29;-1:-1:-1;;;26981:2:1;26966:18;;26959:34;27025:2;27010:18;;26707:327;9517:51:0;9586:18;;;;-1:-1:-1;;;;;9586:32:0;9582:228;;9650:18;9659:8;9650;:18::i;:::-;9637:9;:31;;9629:48;;;;-1:-1:-1;;;9629:48:0;;;;;;27241:2:1;27223:21;;;27280:1;27260:18;;;27253:29;-1:-1:-1;;;27313:2:1;27298:18;;27291:34;27357:2;27342:18;;27039:327;9629:48:0;9582:228;;;9776:18;9785:8;9776;:18::i;:::-;9715;;;;9708:64;;-1:-1:-1;;;9708:64:0;;9745:10;9708:64;;;17108:34:1;9765:4:0;17158:18:1;;;17151:43;-1:-1:-1;;;;;9708:36:0;;;;;;17043:18:1;;9708:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:86;;9700:102;;;;-1:-1:-1;;;9700:102:0;;;;;;27573:2:1;27555:21;;;27612:1;27592:18;;;27585:29;-1:-1:-1;;;27645:2:1;27630:18;;27623:34;27689:2;27674:18;;27371:327;9995:596:0;10079:18;10100:20;;;:10;:20;;;;;;;;10079:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10100:20;;10079:41;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10079:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;10079:41:0;;;-1:-1:-1;;10079:41:0;;;;-1:-1:-1;;;;;10079:41:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10079:41:0;10158:28;10177:8;10158:18;:28::i;:::-;10127:59;;10198:9;10193:393;10217:5;:25;;;:32;10213:1;:36;10193:393;;;10338:5;:12;;;-1:-1:-1;;;;;10273:77:0;10281:5;:25;;;10307:1;10281:28;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;10273:45:0;;10319:11;10331:1;10319:14;;;;;;;;:::i;:::-;;;;;;;10273:61;;;;;;;;;;;;;797:25:1;;785:2;770:18;;651:177;10273:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10273:77:0;;10265:95;;;;-1:-1:-1;;;10265:95:0;;;;;;;:::i;:::-;10385:5;:25;;;10411:1;10385:28;;;;;;;;:::i;:::-;;;;;;;;;;;10432:12;;;;10377:83;;-1:-1:-1;;;10377:83:0;;-1:-1:-1;;;;;17126:15:1;;;10377:83:0;;;17108:34:1;10454:4:0;17158:18:1;;;17151:43;10377:54:0;;;;;17043:18:1;;10377:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10369:100;;;;-1:-1:-1;;;10369:100:0;;;;;;;:::i;:::-;10486:5;:25;;;10512:1;10486:28;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;10478:54:0;;10533:5;:12;;;10547:6;10555:11;10567:1;10555:14;;;;;;;;:::i;:::-;;;;;;;10478:100;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28910:15:1;;;28892:34;;28962:15;;;;28957:2;28942:18;;28935:43;29009:2;28994:18;;28987:34;;;;29057:3;29052:2;29037:18;;29030:31;;;29098:1;29077:19;;;29070:30;-1:-1:-1;;;28872:3:1;29116:19;;29109:35;29176:3;29161:19;;28587:599;10478:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10251:3;;;;;:::i;:::-;;;;10193:393;;;;10072:519;;9995:596;;:::o;19598:248::-;19681:14;19737:4;19722:12;;19713:6;:21;;;;:::i;:::-;:28;;;;:::i;:::-;19776:10;;19704:37;;-1:-1:-1;19756:38:0;;19767:8;;-1:-1:-1;;;;;19776:10:0;19704:37;19756:10;:38::i;:::-;19822:10;;19806:34;;;-1:-1:-1;;;;;19822:10:0;;;29365:51:1;;29447:2;29432:18;;29425:34;;;19806::0;;29338:18:1;19806:34:0;;;;;;;19598:248;;;;:::o;20085:656::-;20172:18;20237:20;;;:10;:20;;;;;;;;:40;;20199:78;;;;;;;;;;;;;;;;;20172:18;;20199:78;;20237:40;20199:78;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20199:78:0;;;;;;;;;;;;;;;;;;;;;;;20284:11;20307:18;:25;20298:6;:34;;;;:::i;:::-;20284:48;;20343:6;20339:397;20359:18;:25;20355:1;:29;20339:397;;;20402:13;20426:18;20445:1;20426:21;;;;;;;;:::i;:::-;;;;;;;20402:46;;20486:1;20463:5;-1:-1:-1;;;;;20463:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:24;20459:270;;;20502:18;20551:4;20529:5;-1:-1:-1;;;;;20529:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20523:26;;:3;:26;:::i;:::-;:32;;;;:::i;:::-;20502:53;;20568:49;20579:8;20588:5;-1:-1:-1;;;;;20588:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20606:10;20568;:49::i;:::-;20630:24;20644:10;20630:24;;:::i;:::-;;;20672:45;20688:5;-1:-1:-1;;;;;20688:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20672:45;;;-1:-1:-1;;;;;29383:32:1;;;29365:51;;29447:2;29432:18;;29425:34;;;29338:18;20672:45:0;;;;;;;20489:240;20459:270;-1:-1:-1;20386:3:0;;;;:::i;:::-;;;;20339:397;;;;20192:549;;20085:656;;;;:::o;18987:404::-;19118:1;19073:20;;;:10;:20;;;;;;;;:33;;-1:-1:-1;;;;;19073:33:0;19069:317;;19132:12;19158:3;-1:-1:-1;;;;;19150:17:0;19176:6;19150:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19131:57;;;19205:7;19197:24;;;;-1:-1:-1;;;19197:24:0;;;;;;29882:2:1;29864:21;;;29921:1;29901:18;;;29894:29;-1:-1:-1;;;29954:2:1;29939:18;;29932:34;29998:2;29983:18;;29680:327;19069:317:0;19261:20;;;;:10;:20;;;;;;;;;:33;;19254:115;;-1:-1:-1;;;19254:115:0;;19319:10;19254:115;;;30252:34:1;-1:-1:-1;;;;;30322:15:1;;;30302:18;;;30295:43;30354:18;;;30347:34;;;19261:33:0;;;;19254:54;;30187:18:1;;19254:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19244:134;;;;-1:-1:-1;;;19244:134:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:180:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;833:131::-;-1:-1:-1;;;;;908:31:1;;898:42;;888:70;;954:1;951;944:12;969:134;1037:20;;1066:31;1037:20;1066:31;:::i;:::-;969:134;;;:::o;1108:118::-;1194:5;1187:13;1180:21;1173:5;1170:32;1160:60;;1216:1;1213;1206:12;1231:128;1296:20;;1325:28;1296:20;1325:28;:::i;1364:382::-;1429:6;1437;1490:2;1478:9;1469:7;1465:23;1461:32;1458:52;;;1506:1;1503;1496:12;1458:52;1545:9;1532:23;1564:31;1589:5;1564:31;:::i;:::-;1614:5;-1:-1:-1;1671:2:1;1656:18;;1643:32;1684:30;1643:32;1684:30;:::i;:::-;1733:7;1723:17;;;1364:382;;;;;:::o;1751:632::-;1922:2;1974:21;;;2044:13;;1947:18;;;2066:22;;;1893:4;;1922:2;2145:15;;;;2119:2;2104:18;;;1893:4;2188:169;2202:6;2199:1;2196:13;2188:169;;;2263:13;;2251:26;;2332:15;;;;2297:12;;;;2224:1;2217:9;2188:169;;;-1:-1:-1;2374:3:1;;1751:632;-1:-1:-1;;;;;;1751:632:1:o;2388:127::-;2449:10;2444:3;2440:20;2437:1;2430:31;2480:4;2477:1;2470:15;2504:4;2501:1;2494:15;2520:275;2591:2;2585:9;2656:2;2637:13;;-1:-1:-1;;2633:27:1;2621:40;;2691:18;2676:34;;2712:22;;;2673:62;2670:88;;;2738:18;;:::i;:::-;2774:2;2767:22;2520:275;;-1:-1:-1;2520:275:1:o;2800:531::-;2843:5;2896:3;2889:4;2881:6;2877:17;2873:27;2863:55;;2914:1;2911;2904:12;2863:55;2950:6;2937:20;2976:18;2972:2;2969:26;2966:52;;;2998:18;;:::i;:::-;3042:55;3085:2;3066:13;;-1:-1:-1;;3062:27:1;3091:4;3058:38;3042:55;:::i;:::-;3122:2;3113:7;3106:19;3168:3;3161:4;3156:2;3148:6;3144:15;3140:26;3137:35;3134:55;;;3185:1;3182;3175:12;3134:55;3250:2;3243:4;3235:6;3231:17;3224:4;3215:7;3211:18;3198:55;3298:1;3273:16;;;3291:4;3269:27;3262:38;;;;3277:7;2800:531;-1:-1:-1;;;2800:531:1:o;3336:458::-;3423:6;3431;3439;3492:2;3480:9;3471:7;3467:23;3463:32;3460:52;;;3508:1;3505;3498:12;3460:52;3544:9;3531:23;3521:33;;3601:2;3590:9;3586:18;3573:32;3563:42;;3656:2;3645:9;3641:18;3628:32;3683:18;3675:6;3672:30;3669:50;;;3715:1;3712;3705:12;3669:50;3738;3780:7;3771:6;3760:9;3756:22;3738:50;:::i;:::-;3728:60;;;3336:458;;;;;:::o;3799:658::-;3970:2;4022:21;;;4092:13;;3995:18;;;4114:22;;;3941:4;;3970:2;4193:15;;;;4167:2;4152:18;;;3941:4;4236:195;4250:6;4247:1;4244:13;4236:195;;;4315:13;;-1:-1:-1;;;;;4311:39:1;4299:52;;4406:15;;;;4371:12;;;;4347:1;4265:9;4236:195;;4462:167;4529:20;;4589:14;4578:26;;4568:37;;4558:65;;4619:1;4616;4609:12;4634:179;4701:20;;-1:-1:-1;;;;;4750:38:1;;4740:49;;4730:77;;4803:1;4800;4793:12;4818:183;4878:4;4911:18;4903:6;4900:30;4897:56;;;4933:18;;:::i;:::-;-1:-1:-1;4978:1:1;4974:14;4990:4;4970:25;;4818:183::o;5006:662::-;5060:5;5113:3;5106:4;5098:6;5094:17;5090:27;5080:55;;5131:1;5128;5121:12;5080:55;5167:6;5154:20;5193:4;5217:60;5233:43;5273:2;5233:43;:::i;:::-;5217:60;:::i;:::-;5311:15;;;5397:1;5393:10;;;;5381:23;;5377:32;;;5342:12;;;;5421:15;;;5418:35;;;5449:1;5446;5439:12;5418:35;5485:2;5477:6;5473:15;5497:142;5513:6;5508:3;5505:15;5497:142;;;5579:17;;5567:30;;5617:12;;;;5530;;5497:142;;;-1:-1:-1;5657:5:1;5006:662;-1:-1:-1;;;;;;5006:662:1:o;5673:737::-;5727:5;5780:3;5773:4;5765:6;5761:17;5757:27;5747:55;;5798:1;5795;5788:12;5747:55;5834:6;5821:20;5860:4;5884:60;5900:43;5940:2;5900:43;:::i;5884:60::-;5978:15;;;6064:1;6060:10;;;;6048:23;;6044:32;;;6009:12;;;;6088:15;;;6085:35;;;6116:1;6113;6106:12;6085:35;6152:2;6144:6;6140:15;6164:217;6180:6;6175:3;6172:15;6164:217;;;6260:3;6247:17;6277:31;6302:5;6277:31;:::i;:::-;6321:18;;6359:12;;;;6197;;6164:217;;6415:1158;6591:6;6599;6607;6615;6623;6631;6639;6647;6700:3;6688:9;6679:7;6675:23;6671:33;6668:53;;;6717:1;6714;6707:12;6668:53;6740:26;6756:9;6740:26;:::i;:::-;6730:36;;6785:37;6818:2;6807:9;6803:18;6785:37;:::i;:::-;6775:47;;6841:37;6874:2;6863:9;6859:18;6841:37;:::i;:::-;6831:47;;6897:37;6930:2;6919:9;6915:18;6897:37;:::i;:::-;6887:47;;6985:3;6974:9;6970:19;6957:33;7009:18;7050:2;7042:6;7039:14;7036:34;;;7066:1;7063;7056:12;7036:34;7089:61;7142:7;7133:6;7122:9;7118:22;7089:61;:::i;:::-;7079:71;;7203:3;7192:9;7188:19;7175:33;7159:49;;7233:2;7223:8;7220:16;7217:36;;;7249:1;7246;7239:12;7217:36;7272:63;7327:7;7316:8;7305:9;7301:24;7272:63;:::i;:::-;7262:73;;7354:39;7388:3;7377:9;7373:19;7354:39;:::i;:::-;7344:49;;7446:3;7435:9;7431:19;7418:33;7402:49;;7476:2;7466:8;7463:16;7460:36;;;7492:1;7489;7482:12;7460:36;;7515:52;7559:7;7548:8;7537:9;7533:24;7515:52;:::i;:::-;7505:62;;;6415:1158;;;;;;;;;;;:::o;7578:519::-;7662:6;7670;7678;7731:2;7719:9;7710:7;7706:23;7702:32;7699:52;;;7747:1;7744;7737:12;7699:52;7783:9;7770:23;7760:33;;7843:2;7832:9;7828:18;7815:32;7856:28;7878:5;7856:28;:::i;:::-;7903:5;-1:-1:-1;7959:2:1;7944:18;;7931:32;7986:18;7975:30;;7972:50;;;8018:1;8015;8008:12;8102:423;8144:3;8182:5;8176:12;8209:6;8204:3;8197:19;8234:1;8244:162;8258:6;8255:1;8252:13;8244:162;;;8320:4;8376:13;;;8372:22;;8366:29;8348:11;;;8344:20;;8337:59;8273:12;8244:162;;;8248:3;8451:1;8444:4;8435:6;8430:3;8426:16;8422:27;8415:38;8514:4;8507:2;8503:7;8498:2;8490:6;8486:15;8482:29;8477:3;8473:39;8469:50;8462:57;;;8102:423;;;;:::o;8530:220::-;8679:2;8668:9;8661:21;8642:4;8699:45;8740:2;8729:9;8725:18;8717:6;8699:45;:::i;8755:247::-;8814:6;8867:2;8855:9;8846:7;8842:23;8838:32;8835:52;;;8883:1;8880;8873:12;8835:52;8922:9;8909:23;8941:31;8966:5;8941:31;:::i;9407:1200::-;9529:6;9537;9545;9553;9561;9569;9577;9630:3;9618:9;9609:7;9605:23;9601:33;9598:53;;;9647:1;9644;9637:12;9598:53;9683:9;9670:23;9660:33;;9743:2;9732:9;9728:18;9715:32;9756:31;9781:5;9756:31;:::i;:::-;9806:5;-1:-1:-1;9863:2:1;9848:18;;9835:32;9876:30;9835:32;9876:30;:::i;:::-;9925:7;-1:-1:-1;9983:2:1;9968:18;;9955:32;10006:18;10036:14;;;10033:34;;;10063:1;10060;10053:12;10033:34;10086:50;10128:7;10119:6;10108:9;10104:22;10086:50;:::i;:::-;10076:60;;10183:3;10172:9;10168:19;10155:33;10145:43;;10241:3;10230:9;10226:19;10213:33;10197:49;;10271:2;10261:8;10258:16;10255:36;;;10287:1;10284;10277:12;10255:36;10325:8;10314:9;10310:24;10300:34;;10372:7;10365:4;10361:2;10357:13;10353:27;10343:55;;10394:1;10391;10384:12;10343:55;10434:2;10421:16;10460:2;10452:6;10449:14;10446:34;;;10476:1;10473;10466:12;10446:34;10521:7;10516:2;10507:6;10503:2;10499:15;10495:24;10492:37;10489:57;;;10542:1;10539;10532:12;10489:57;10573:2;10569;10565:11;10555:21;;10595:6;10585:16;;;;;9407:1200;;;;;;;;;;:::o;10612:315::-;10680:6;10688;10741:2;10729:9;10720:7;10716:23;10712:32;10709:52;;;10757:1;10754;10747:12;10709:52;10793:9;10780:23;10770:33;;10853:2;10842:9;10838:18;10825:32;10866:31;10891:5;10866:31;:::i;10932:348::-;11016:6;11069:2;11057:9;11048:7;11044:23;11040:32;11037:52;;;11085:1;11082;11075:12;11037:52;11125:9;11112:23;11158:18;11150:6;11147:30;11144:50;;;11190:1;11187;11180:12;11144:50;11213:61;11266:7;11257:6;11246:9;11242:22;11213:61;:::i;:::-;11203:71;10932:348;-1:-1:-1;;;;10932:348:1:o;11285:388::-;11353:6;11361;11414:2;11402:9;11393:7;11389:23;11385:32;11382:52;;;11430:1;11427;11420:12;11382:52;11469:9;11456:23;11488:31;11513:5;11488:31;:::i;:::-;11538:5;-1:-1:-1;11595:2:1;11580:18;;11567:32;11608:33;11567:32;11608:33;:::i;11678:127::-;11739:10;11734:3;11730:20;11727:1;11720:31;11770:4;11767:1;11760:15;11794:4;11791:1;11784:15;11810:112;11842:1;11868;11858:35;;11873:18;;:::i;:::-;-1:-1:-1;11907:9:1;;11810:112::o;11927:245::-;11994:6;12047:2;12035:9;12026:7;12022:23;12018:32;12015:52;;;12063:1;12060;12053:12;12015:52;12095:9;12089:16;12114:28;12136:5;12114:28;:::i;12177:327::-;12379:2;12361:21;;;12418:1;12398:18;;;12391:29;-1:-1:-1;;;12451:2:1;12436:18;;12429:34;12495:2;12480:18;;12177:327::o;12899:::-;13101:2;13083:21;;;13140:1;13120:18;;;13113:29;-1:-1:-1;;;13173:2:1;13158:18;;13151:34;13217:2;13202:18;;12899:327::o;13895:461::-;14157:1;14153;14148:3;14144:11;14140:19;14132:6;14128:32;14117:9;14110:51;14197:6;14192:2;14181:9;14177:18;14170:34;14240:6;14235:2;14224:9;14220:18;14213:34;14283:3;14278:2;14267:9;14263:18;14256:31;14091:4;14304:46;14345:3;14334:9;14330:19;14322:6;14304:46;:::i;:::-;14296:54;13895:461;-1:-1:-1;;;;;;13895:461:1:o;14551:251::-;14621:6;14674:2;14662:9;14653:7;14649:23;14645:32;14642:52;;;14690:1;14687;14680:12;14642:52;14722:9;14716:16;14741:31;14766:5;14741:31;:::i;14807:327::-;15009:2;14991:21;;;15048:1;15028:18;;;15021:29;-1:-1:-1;;;15081:2:1;15066:18;;15059:34;15125:2;15110:18;;14807:327::o;15471:291::-;15648:6;15637:9;15630:25;15691:2;15686;15675:9;15671:18;15664:30;15611:4;15711:45;15752:2;15741:9;15737:18;15729:6;15711:45;:::i;15767:127::-;15828:10;15823:3;15819:20;15816:1;15809:31;15859:4;15856:1;15849:15;15883:4;15880:1;15873:15;15899:135;15938:3;15959:17;;;15956:43;;15979:18;;:::i;:::-;-1:-1:-1;16026:1:1;16015:13;;15899:135::o;16039:388::-;16244:6;16233:9;16226:25;16287:2;16282;16271:9;16267:18;16260:30;16207:4;16307:45;16348:2;16337:9;16333:18;16325:6;16307:45;:::i;:::-;16299:53;;16417:1;16413;16408:3;16404:11;16400:19;16392:6;16388:32;16383:2;16372:9;16368:18;16361:60;16039:388;;;;;;:::o;16432:127::-;16493:10;16488:3;16484:20;16481:1;16474:31;16524:4;16521:1;16514:15;16548:4;16545:1;16538:15;16564:327;16766:2;16748:21;;;16805:1;16785:18;;;16778:29;-1:-1:-1;;;16838:2:1;16823:18;;16816:34;16882:2;16867:18;;16564:327::o;17205:::-;17407:2;17389:21;;;17446:1;17426:18;;;17419:29;-1:-1:-1;;;17479:2:1;17464:18;;17457:34;17523:2;17508:18;;17205:327::o;17887:120::-;17927:1;17953;17943:35;;17958:18;;:::i;:::-;-1:-1:-1;17992:9:1;;17887:120::o;18012:168::-;18085:9;;;18116;;18133:15;;;18127:22;;18113:37;18103:71;;18154:18;;:::i;18185:422::-;18274:1;18317:5;18274:1;18331:270;18352:7;18342:8;18339:21;18331:270;;;18411:4;18407:1;18403:6;18399:17;18393:4;18390:27;18387:53;;;18420:18;;:::i;:::-;18470:7;18460:8;18456:22;18453:55;;;18490:16;;;;18453:55;18569:22;;;;18529:15;;;;18331:270;;;18335:3;18185:422;;;;;:::o;18612:806::-;18661:5;18691:8;18681:80;;-1:-1:-1;18732:1:1;18746:5;;18681:80;18780:4;18770:76;;-1:-1:-1;18817:1:1;18831:5;;18770:76;18862:4;18880:1;18875:59;;;;18948:1;18943:130;;;;18855:218;;18875:59;18905:1;18896:10;;18919:5;;;18943:130;18980:3;18970:8;18967:17;18964:43;;;18987:18;;:::i;:::-;-1:-1:-1;;19043:1:1;19029:16;;19058:5;;18855:218;;19157:2;19147:8;19144:16;19138:3;19132:4;19129:13;19125:36;19119:2;19109:8;19106:16;19101:2;19095:4;19092:12;19088:35;19085:77;19082:159;;;-1:-1:-1;19194:19:1;;;19226:5;;19082:159;19273:34;19298:8;19292:4;19273:34;:::i;:::-;19343:6;19339:1;19335:6;19331:19;19322:7;19319:32;19316:58;;;19354:18;;:::i;:::-;19392:20;;18612:806;-1:-1:-1;;;18612:806:1:o;19423:131::-;19483:5;19512:36;19539:8;19533:4;19512:36;:::i;19848:471::-;20057:25;;;-1:-1:-1;;;;;20118:32:1;;20113:2;20098:18;;20091:60;20194:14;;20187:22;20182:2;20167:18;;20160:50;20246:3;20241:2;20226:18;;20219:31;;;-1:-1:-1;;20267:46:1;;20293:19;;20285:6;20267:46;:::i;20324:533::-;20537:6;20526:9;20519:25;20580:6;20575:2;20564:9;20560:18;20553:34;20623:2;20618;20607:9;20603:18;20596:30;20662:6;20657:2;20646:9;20642:18;20635:34;20720:6;20712;20706:3;20695:9;20691:19;20678:49;20777:1;20747:22;;;20771:3;20743:32;;;20736:43;;;;20840:2;20819:15;;;-1:-1:-1;;20815:29:1;20800:45;20796:55;;20324:533;-1:-1:-1;;;20324:533:1:o;22160:125::-;22225:9;;;22246:10;;;22243:36;;;22259:18;;:::i;22290:184::-;22360:6;22413:2;22401:9;22392:7;22388:23;22384:32;22381:52;;;22429:1;22426;22419:12;22381:52;-1:-1:-1;22452:16:1;;22290:184;-1:-1:-1;22290:184:1:o;24250:128::-;24317:9;;;24338:11;;;24335:37;;;24352:18;;:::i

Swarm Source

ipfs://8b92f701e8a7f0fa4fabb279648eb9ffa468792ed84782e9eaa72b93e25ed1a0

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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