ETH Price: $2,703.59 (+0.25%)

Token

PositivityOnChain (POC)
 

Overview

Max Total Supply

8 POC

Holders

8

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
XRAY by SABET: Deployer
Balance
1 POC
0x02eb75be1e72e988de64f0088d654d8ea1081e87
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
positivityOnChain

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 13 : positivityOnChain.sol
// SPDX-License-Identifier: MIT
/*
    ____             _ __  _       _ __        ____        ________          _     
   / __ \____  _____(_) /_(_)   __(_) /___  __/ __ \____  / ____/ /_  ____ _(_)___ 
  / /_/ / __ \/ ___/ / __/ / | / / / __/ / / / / / / __ \/ /   / __ \/ __ `/ / __ \
 / ____/ /_/ (__  ) / /_/ /| |/ / / /_/ /_/ / /_/ / / / / /___/ / / / /_/ / / / / /
/_/    \____/____/_/\__/_/ |___/_/\__/\__, /\____/_/ /_/\____/_/ /_/\__,_/_/_/ /_/ 
                                     /____/                                        
*/

pragma solidity ^0.8.16;
 
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import {Base64} from "./libraries/Base64.sol";
 
contract positivityOnChain is ERC721URIStorage, Ownable {
  uint256 private numClaimed = 0;
  
  struct Metadata {
    uint256 orig_score;
    uint256 orig_pos_neg;
    uint256 score;
    uint256 pos_neg;
    string username;
    address minter;
    string gradient;
    bool animated;
    string status;
    Color color;
    string attributesURI;
    string baseURI;
    string SVG;
  }

  struct Color {
    uint256 r1;
    uint256 g1;
    uint256 b1;
    uint256 r2;
    uint256 g2;
    uint256 b2;
  }

  struct Coupon {
    bytes32 r;
    bytes32 s;
    uint8 v;
  }

  mapping(uint256 => Metadata) idToData;
  mapping(string => uint256) userToId;
  mapping(string => bool) alreadyMinted;
  mapping(uint256 => string) updatedURI;
  mapping(uint256 => bool) removed;
  
  string baseSvg1 = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 500"><defs><linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="0%"><stop offset="0%" style="stop-color:rgb(';
  string baseSvg2 = ');stop-opacity:1" /><stop offset="100%" style="stop-color:rgb(';
  string baseSvg3 = ');stop-opacity:1" />';
  string animate_Svg4 = '<animate attributeName="x2" values="100%;0%;100%" dur="10s" repeatCount="indefinite" />';
  string baseSvg5 = '</linearGradient></defs><rect width="100%" height="100%" fill="rgb(232,228,214)" rx="25"/><ellipse cx="175" cy="175" rx="150" ry="150" fill="white"/><ellipse cx="175" cy="175" rx="150" ry="150" fill="url(#grad1)" /><text fill="#ffffff" font-size="55" font-family="Trebuchet MS" x="50%" y="175" dominant-baseline="middle" text-anchor="middle">';

  string baseSvg1_2 = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 500"><defs><radialGradient id="grad1" cx="50%" cy="50%" r="50%" fx="50%" fy="50%"><stop offset="0%" style="stop-color:rgb(';
  string baseSvg2_2 = ');stop-opacity:0" /><stop offset="100%" style="stop-color:rgb(';
  string animate_Svg4_2 = '<animate attributeName="r" values="0%;100%;0%" dur="10s" repeatCount="indefinite" />';
  string baseSvg5_2 = '</radialGradient></defs><rect width="100%" height="100%" fill="rgb(232,228,214)" rx="25"/><ellipse cx="175" cy="175" rx="150" ry="150" fill="white"/><ellipse cx="175" cy="175" rx="150" ry="150" fill="url(#grad1)" /><text font-size="55" font-family="Trebuchet MS" x="50%" y="175" dominant-baseline="middle" text-anchor="middle">';
  
  string postScoreSvg = '</text><text font-size="45" font-family="Trebuchet MS" x="50%" y="80%" dominant-baseline="middle" text-anchor="middle">';

  string lockedSvg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 350 500"><rect width="100%" height="100%" fill="rgb(232,228,214)" rx="25" /><path transform="translate(130, 110)" d="M2.892,56.036h8.959v-1.075V37.117c0-10.205,4.177-19.484,10.898-26.207v-0.009 C29.473,4.177,38.754,0,48.966,0C59.17,0,68.449,4.177,75.173,10.901l0.01,0.009c6.721,6.723,10.898,16.002,10.898,26.207v17.844 v1.075h7.136c1.59,0,2.892,1.302,2.892,2.891v61.062c0,1.589-1.302,2.891-2.892,2.891H2.892c-1.59,0-2.892-1.302-2.892-2.891 V58.927C0,57.338,1.302,56.036,2.892,56.036L2.892,56.036z M26.271,56.036h45.387v-1.075V36.911c0-6.24-2.554-11.917-6.662-16.03 l-0.005,0.004c-4.111-4.114-9.787-6.669-16.025-6.669c-6.241,0-11.917,2.554-16.033,6.665c-4.109,4.113-6.662,9.79-6.662,16.03 v18.051V56.036L26.271,56.036z M49.149,89.448l4.581,21.139l-12.557,0.053l3.685-21.423c-3.431-1.1-5.918-4.315-5.918-8.111 c0-4.701,3.81-8.511,8.513-8.511c4.698,0,8.511,3.81,8.511,8.511C55.964,85.226,53.036,88.663,49.149,89.448L49.149,89.448z"/><text font-size="45" font-family="Trebuchet MS" x="50%" y="80%" dominant-baseline="middle" text-anchor="middle">Token Locked</text></svg>';
  
  address private adminSigner; 

  uint256 private mintPrice = 0.02 ether;
  uint256 private updatePrice = 0.01 ether;

  constructor(address _adminSigner) ERC721 ("PositivityOnChain", "POC") {
    adminSigner = _adminSigner;
  }

  function updateAdminSigner(address _new) public onlyOwner {
    adminSigner = _new;
  }

  function updateSVG(string memory _baseSvg1, string memory _baseSvg2, string memory _baseSvg3, string memory _animate_Svg4, string memory _baseSvg5, string memory _baseSvg1_2, string memory _baseSvg2_2, string memory _animate_Svg4_2, string memory _baseSvg5_2, string memory _postScoreSvg, string memory _lockedSvg) public onlyOwner {
    baseSvg1 = _baseSvg1;
    baseSvg2 = _baseSvg2;
    baseSvg3 = _baseSvg3;
    animate_Svg4 = _animate_Svg4;
    baseSvg5 = _baseSvg5;
    baseSvg1_2 = _baseSvg1_2;
    baseSvg2_2 = _baseSvg2_2;
    animate_Svg4_2 = _animate_Svg4_2;
    baseSvg5_2 = _baseSvg5_2;
    postScoreSvg = _postScoreSvg;
    lockedSvg = _lockedSvg;
  }

  function setColors(uint256 id) internal view returns (Color memory color) {
    uint256 pos_neg = idToData[id].pos_neg;
    uint256 score = idToData[id].score;
    if (pos_neg != 1) {
      if (score >= 500) {
        color.r1 = randRange(205,255,score,id);
        color.g1 = randRange(200,215,score,id);
        color.b1 = randRange(0,30,score,id);
        color.r2 = randRange(188,200,score,id);
        color.g2 = randRange(187,200,score,id);
        color.b2 = randRange(186,200,score,id);
      } else if (score > 200 && score < 500) {
          color.r1 = randRange(150,255,score,id);
          color.g1 = randRange(151,255,score,id);
          color.b1 = randRange(152,255,score,id);
          color.r2 = randRange(149,255,score,id);
          color.g2 = randRange(148,255,score,id);
          color.b2 = randRange(153,255,score,id);
      } else {
          color.r1 = randRange(51,150,score,id);
          color.g1 = randRange(49,149,score,id);
          color.b1 = randRange(52,148,score,id);
          color.r2 = randRange(53,147,score,id);
          color.g2 = randRange(48,146,score,id);
          color.b2 = randRange(57,145,score,id);
      }
    } else {
        if (score >= 200) { 
          color.r1 = randRange(0,5,score,id);
          color.g1 = randRange(1,6,score,id);
          color.b1 = randRange(0,9,score,id);
          color.r2 = randRange(125,150,score,id);
          color.g2 = randRange(0,5,score,id);
          color.b2 = randRange(0,9,score,id);
        } else if (score < 200 && score > 75) {
            color.r1 = randRange(0,50,score,id);
            color.g1 = randRange(1,49,score,id);
            color.b1 = randRange(2,48,score,id);
            color.r2 = randRange(3,47,score,id);
            color.g2 = randRange(4,46,score,id);
            color.b2 = randRange(5,45,score,id);
        } else {
            color.r1 = randRange(50,100,score,id);
            color.g1 = randRange(51,100,score,id);
            color.b1 = randRange(52,100,score,id);
            color.r2 = randRange(53,100,score,id);
            color.g2 = randRange(54,100,score,id);
            color.b2 = randRange(55,100,score,id);
        }
    }
  }
  
  function randRange(uint256 lowerBound, uint256 upperBound, uint256 score, uint256 id) internal view returns (uint256) {
    uint256 randomNumber = uint(keccak256(abi.encodePacked(this, id, score))) % (upperBound - lowerBound + 1);
    return randomNumber += lowerBound;
  }

  function updatePrices(uint256 _mintPrice, uint256 _updatePrice) public onlyOwner {
    mintPrice = _mintPrice;
    updatePrice = _updatePrice;
  }

  function purchase(uint256 score, uint256 pos_neg, string memory username, Coupon memory coupon) public payable {
    //pos_neg: 0 for positive, 1 for negative
    require(!alreadyMinted[username], "Already minted");
    require(msg.value >= mintPrice, "Not enough eth");

    bytes32 digest = keccak256(abi.encode(msg.sender,score,username,pos_neg));
    require(_isVerifiedCoupon(digest, coupon), "Invalid coupon");
    
    mintToken(msg.sender, score, pos_neg, username, msg.sender);
  }
  
  function mintToken(address _to, uint256 score, uint256 pos_neg, string memory username, address _minter) internal {
    uint256 tokenID = numClaimed + 1;
    idToData[tokenID].score = score;
    idToData[tokenID].orig_score = score;
    idToData[tokenID].orig_pos_neg = pos_neg;
    idToData[tokenID].pos_neg = pos_neg;
    idToData[tokenID].username = username;
    idToData[tokenID].minter = _minter;
    userToId[username] = tokenID;
    alreadyMinted[username] = true;
    _safeMint(_to, tokenID);
    numClaimed += 1;
  }

  function _isVerifiedCoupon(bytes32 digest, Coupon memory coupon) internal view returns (bool) {
    address signer = ecrecover(digest, coupon.v, coupon.r, coupon.s);
    require(signer != address(0), "Invalid sig");
    return signer == adminSigner;
  }
  
  function airdrop(address _to, uint256 score, uint256 pos_neg, string memory username) public onlyOwner {
    require(!alreadyMinted[username], "Already minted");
    mintToken(_to, score, pos_neg, username, _to);
  }
  
  function updateToken(uint256 id, uint256 score, uint256 pos_neg, string memory username, Coupon memory coupon) public payable {
    require(msg.value >= updatePrice, "Not enough eth");
    require(ownerOf(id) == msg.sender, "You must currently own this token");
    require(idToData[id].minter == msg.sender, "Must use original minter address");

    bytes32 digest = keccak256(abi.encode(msg.sender,score,username,pos_neg));
    require(_isVerifiedCoupon(digest, coupon), "Invalid coupon");

    if (keccak256(abi.encodePacked((idToData[id].username))) != keccak256(abi.encodePacked((username)))) {
      userToId[idToData[id].username] = 0;
      alreadyMinted[idToData[id].username] = false;
      userToId[username] = id;
      idToData[id].username = username;
      alreadyMinted[username] = true;
    }

    idToData[id].score = score;
    idToData[id].pos_neg = pos_neg;
  }

  function toggleRemove(uint256 id) public onlyOwner {
    removed[id] = !removed[id];
  }

  function adminUpdate(uint256 id, uint256 score, uint256 pos_neg, string memory username, address _minter, uint256 orig_score, uint256 orig_pos_neg) public onlyOwner {
    idToData[id].score = score;
    idToData[id].orig_score = orig_score;
    idToData[id].orig_pos_neg = orig_pos_neg;
    idToData[id].pos_neg = pos_neg;
    idToData[id].minter = _minter;

    if (keccak256(abi.encodePacked((idToData[id].username))) != keccak256(abi.encodePacked((username)))) {
      userToId[idToData[id].username] = 0;
      alreadyMinted[idToData[id].username] = false;
      userToId[username] = id;
      idToData[id].username = username;
      alreadyMinted[username] = true;
    }
  }
  
  function removeUsername(string memory username) public onlyOwner {
    alreadyMinted[username] = false;
    userToId[username] = 0;
  }

  function checkUsername(string memory username) public view returns (bool) {
    return alreadyMinted[username];
  }

  function usernameToScore(string memory username) public view returns (string memory readable_score, uint256 score, uint256 pos_neg, uint256 tokenID) {
    require(userToId[username] > 0, "Username does not have a score");
    score = idToData[userToId[username]].score;
    pos_neg = idToData[userToId[username]].pos_neg;
    tokenID = userToId[username];
    if (pos_neg == 1) {
      readable_score = string.concat('-',Strings.toString(idToData[userToId[username]].score));
    } else {
      readable_score = Strings.toString(idToData[userToId[username]].score);
    }
  }

  function viewMetadata(uint256 id) public view returns (string memory username, string memory score, string memory original_score, address minter, string memory gradient, bool animated, string memory status, Color memory color) {
    require(id < numClaimed + 1 && id != 0, "Token does not exist");
    if (!removed[id]) {
      Metadata memory attributes = getAttributes(id);
      score = Strings.toString(idToData[id].score);
      original_score = Strings.toString(idToData[id].orig_score);
      if (idToData[id].pos_neg == 1) {
        score = string.concat('-',score);
      }
      if (idToData[id].orig_pos_neg == 1) {
        original_score = string.concat('-',original_score);
      }
      username = idToData[id].username;
      minter = idToData[id].minter;
      gradient = attributes.gradient;
      animated = attributes.animated;
      status = attributes.status;
      color = attributes.color;
    } else {
      username = "Token Locked";
    }
  }

  function viewSVG(uint256 id) public view returns (string memory) {
    require(id < numClaimed + 1 && id != 0, "Token does not exist");
    if (!removed[id]) {
      return getAttributes(id).SVG;
    } else {
      return "Token Locked";
    }
  }

  function getAttributes(uint256 id) internal view returns (Metadata memory attributes) {
    uint256 score = idToData[id].score;
    uint256 pos_neg = idToData[id].pos_neg;
    string memory sign = 'positive';
    attributes.gradient = 'linear';
    attributes.status = 'Neutral';
    string memory animate = 'false';
    string memory orig_str_score = Strings.toString(idToData[id].orig_score);
    if (idToData[id].orig_pos_neg == 1) {
      orig_str_score = string.concat('-',orig_str_score);
    }

    string memory str_score = Strings.toString(idToData[id].score);

    if (pos_neg == 0) {
      if (score > 25 && score <= 75) {
        attributes.status = 'Friendly';
      } else if (score > 75 && score <= 115) {
          attributes.status = 'Supportive';
      } else if (score > 115 && score <= 175) {
          attributes.status = 'Kindhearted';
      } else if (score > 175 && score <= 300) {
          attributes.status = 'Compassionate';
      } else if (score > 300 && score <= 500) {
          attributes.status = 'Altruistic';
      } else if (score > 500) {
          attributes.status = 'Loving';
      }
    } else {
      str_score = string.concat('-',str_score);
      sign = 'negative';
      if (score > 25 && score <= 75) {
        attributes.status = 'Stingy';
      } else if (score > 75 && score <= 115) {
          attributes.status = 'Heinous';
      } else if (score > 115 && score <= 175) {
          attributes.status = 'Spiteful';
      } else if (score > 175 && score <= 300) {
          attributes.status = 'Offensive';
      } else if (score > 300 && score <= 500) {
          attributes.status = 'Resentful';
      } else if (score > 500) {
          attributes.status = 'Evil';
      }
    }

    attributes.color = setColors(id);
    
    string memory color1 = string.concat(Strings.toString(attributes.color.r1),',',Strings.toString(attributes.color.g1),',',Strings.toString(attributes.color.b1));
    string memory color2 = string.concat(Strings.toString(attributes.color.r2),',',Strings.toString(attributes.color.g2),',',Strings.toString(attributes.color.b2));
  
    attributes.baseURI = string.concat(baseSvg1, color1, baseSvg2, color2, baseSvg3, baseSvg5);
  
    if (randRange(0,100,score,id) > 85) {
      attributes.baseURI = string.concat(baseSvg1_2, color1, baseSvg2_2, color2, baseSvg3, baseSvg5_2);
      attributes.gradient = 'radial';
      if (randRange(1,101,score,id) > 99) {
        attributes.baseURI = string.concat(baseSvg1_2, color1, baseSvg2_2, color2, baseSvg3, animate_Svg4_2, baseSvg5_2);
        attributes.animated = true;
        animate = 'true';
      }
    } else {
        if (randRange(2,100,score,id) > 97) {
          attributes.baseURI = string.concat(baseSvg1, color1, baseSvg2, color2, baseSvg3, animate_Svg4, baseSvg5);
          attributes.animated = true;
          animate = 'true';
        }
    }

    attributes.SVG = string(abi.encodePacked(attributes.baseURI, str_score, postScoreSvg, attributes.status, "</text></svg>"));

    attributes.attributesURI = string.concat(',"attributes":[{"trait_type":"gradient","value":"',attributes.gradient,'"},{"trait_type":"r1","value":"',Strings.toString(attributes.color.r1),'"},{"trait_type":"g1","value":"',
    Strings.toString(attributes.color.g1),'"},{"trait_type":"b1","value":"',Strings.toString(attributes.color.b1),'"},{"trait_type":"r2","value":"',Strings.toString(attributes.color.r2),'"},{"trait_type":"g2","value":"',
    Strings.toString(attributes.color.g2),'"},{"trait_type":"b2","value":"',Strings.toString(attributes.color.b2),'"},{"trait_type":"status","value":"',attributes.status,'"},{"trait_type":"animated","value":"',animate,'"},{"trait_type":"sign","value":"',sign,'"},{"trait_type":"score","value":"',str_score,'"},{"trait_type":"original score","value":"',orig_str_score,'"}]');
    return attributes;
  }
  
  function tokenURI(uint256 id) public view override returns (string memory) {
    require(id < numClaimed + 1 && id != 0, "Token does not exist");
    if (!removed[id]) {
      string memory user = idToData[id].username;

      Metadata memory attributes = getAttributes(id);
    
      string memory json = Base64.encode(
          bytes(
              string(
                  abi.encodePacked(
                      '{"name": "@',user,'", "description": "Positivity Score for @',user,'", "image": "data:image/svg+xml;base64,',
                      Base64.encode(bytes(attributes.SVG)),'"',attributes.attributesURI,'}'
                  )
              )
          )
      );
    
      return string(abi.encodePacked("data:application/json;base64,", json));
    }
    else {
      string memory json = Base64.encode(
          bytes(
              string(
                  abi.encodePacked(
                      '{"name": "Token Locked", "description": "Unfortunately, this token has been manually locked. Most likely due to a user maliciously trying to create a false score.", "image": "data:image/svg+xml;base64,',
                      Base64.encode(bytes(lockedSvg)),'"}'
                  )
              )
          )
      );
      return string(abi.encodePacked("data:application/json;base64,", json));
    }
  }

  function withdraw() public onlyOwner {
    uint balance = address(this).balance;
    payable(msg.sender).transfer(balance);
  }

  function totalSupply() public view returns(uint256) {
    return numClaimed;
  }
}

File 2 of 13 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 3 of 13 : ERC721URIStorage.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;

import "../ERC721.sol";

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

File 4 of 13 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 5 of 13 : Base64.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)
                )
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)
                )
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)
                )
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

File 6 of 13 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 7 of 13 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 8 of 13 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 9 of 13 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 10 of 13 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 11 of 13 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 12 of 13 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 13 of 13 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

Settings
{
  "viaIR": true,
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_adminSigner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"score","type":"uint256"},{"internalType":"uint256","name":"pos_neg","type":"uint256"},{"internalType":"string","name":"username","type":"string"},{"internalType":"address","name":"_minter","type":"address"},{"internalType":"uint256","name":"orig_score","type":"uint256"},{"internalType":"uint256","name":"orig_pos_neg","type":"uint256"}],"name":"adminUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"score","type":"uint256"},{"internalType":"uint256","name":"pos_neg","type":"uint256"},{"internalType":"string","name":"username","type":"string"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"username","type":"string"}],"name":"checkUsername","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"score","type":"uint256"},{"internalType":"uint256","name":"pos_neg","type":"uint256"},{"internalType":"string","name":"username","type":"string"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct positivityOnChain.Coupon","name":"coupon","type":"tuple"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"username","type":"string"}],"name":"removeUsername","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"toggleRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new","type":"address"}],"name":"updateAdminSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"uint256","name":"_updatePrice","type":"uint256"}],"name":"updatePrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseSvg1","type":"string"},{"internalType":"string","name":"_baseSvg2","type":"string"},{"internalType":"string","name":"_baseSvg3","type":"string"},{"internalType":"string","name":"_animate_Svg4","type":"string"},{"internalType":"string","name":"_baseSvg5","type":"string"},{"internalType":"string","name":"_baseSvg1_2","type":"string"},{"internalType":"string","name":"_baseSvg2_2","type":"string"},{"internalType":"string","name":"_animate_Svg4_2","type":"string"},{"internalType":"string","name":"_baseSvg5_2","type":"string"},{"internalType":"string","name":"_postScoreSvg","type":"string"},{"internalType":"string","name":"_lockedSvg","type":"string"}],"name":"updateSVG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"score","type":"uint256"},{"internalType":"uint256","name":"pos_neg","type":"uint256"},{"internalType":"string","name":"username","type":"string"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct positivityOnChain.Coupon","name":"coupon","type":"tuple"}],"name":"updateToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"username","type":"string"}],"name":"usernameToScore","outputs":[{"internalType":"string","name":"readable_score","type":"string"},{"internalType":"uint256","name":"score","type":"uint256"},{"internalType":"uint256","name":"pos_neg","type":"uint256"},{"internalType":"uint256","name":"tokenID","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"viewMetadata","outputs":[{"internalType":"string","name":"username","type":"string"},{"internalType":"string","name":"score","type":"string"},{"internalType":"string","name":"original_score","type":"string"},{"internalType":"address","name":"minter","type":"address"},{"internalType":"string","name":"gradient","type":"string"},{"internalType":"bool","name":"animated","type":"bool"},{"internalType":"string","name":"status","type":"string"},{"components":[{"internalType":"uint256","name":"r1","type":"uint256"},{"internalType":"uint256","name":"g1","type":"uint256"},{"internalType":"uint256","name":"b1","type":"uint256"},{"internalType":"uint256","name":"r2","type":"uint256"},{"internalType":"uint256","name":"g2","type":"uint256"},{"internalType":"uint256","name":"b2","type":"uint256"}],"internalType":"struct positivityOnChain.Color","name":"color","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"viewSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60803462001c9c57601f19906001600160401b0390601f620079fa3881900391820185168301918483118484101762001bc55780849260209460405283398101031262001c9c57516001600160a01b0380821692909183900362001c9c576200006762001ca1565b9360118552702837b9b4ba34bb34ba3ca7b721b430b4b760791b60208601526200009062001ca1565b946003865262504f4360e81b602087015280519083821162001bc5578190620000bb60005462001cc1565b601f811162001c5b575b50602090601f831160011462001be75760009262001bdb575b50508160011b916000199060031b1c1916176000555b845191821162001bc5576200010b60015462001cc1565b601f811162001b66575b50602090601f831160011462001afc57508192939460009262001af0575b50508160011b916000199060031b1c1916176001555b60075460018060a01b03199133838316176007553391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06000604051a3600060085562000199600e5462001cc1565b601f811162001aa1575b5061019b600e908155600052600080516020620077ba833981519152600080516020620077fa83398151915255600080516020620078da8339815191527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe55600080516020620077da8339815191527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff557f223e3c646566733e3c6c696e6561724772616469656e742069643d22677261647fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c400557f31222078313d223025222079313d223025222078323d2231303025222079323d7fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c401557f223025223e3c73746f70206f66667365743d22302522207374796c653d2273747fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c402556c0dee05ac6ded8dee474e4cec45609b1b7fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c40355600f546200033e9062001cc1565b601f811162001a52575b50607d600f9081556000527f293b73746f702d6f7061636974793a3122202f3e3c73746f70206f6666736574600080516020620079da833981519152557f3d223130302522207374796c653d2273746f702d636f6c6f723a7267622800007f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80355601054620003d69062001cc1565b601f811162001a10575b507f293b73746f702d6f7061636974793a3122202f3e0000000000000000000000286010556200041260115462001cc1565b601f8111620019c1575b5060af60119081556000527f3c616e696d617465206174747269627574654e616d653d227832222076616c756000805160206200785a833981519152557f65733d22313030253b30253b3130302522206475723d223130732220726570657f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c69557f6174436f756e743d22696e646566696e69746522202f3e0000000000000000007f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6a55601254620004ed9062001cc1565b601f811162001972575b506102ad60129081556000527f3c2f6c696e6561724772616469656e743e3c2f646566733e3c726563742077696000805160206200781a833981519152556000805160206200799a8339815191527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3445556000805160206200793a8339815191527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3446556000805160206200791a8339815191527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344755600080516020620078fa8339815191527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344855600080516020620078ba8339815191527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3449557f222066696c6c3d2275726c282367726164312922202f3e3c746578742066696c7fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344a557f6c3d22236666666666662220666f6e742d73697a653d2235352220666f6e742d7fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344b557f66616d696c793d22547265627563686574204d532220783d223530252220793d7fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344c557f223137352220646f6d696e616e742d626173656c696e653d226d6964646c65227fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344d557f20746578742d616e63686f723d226d6964646c65223e000000000000000000007fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344e556013546200078c9062001cc1565b601f811162001923575b506101af6013908155600052600080516020620077ba8339815191526000805160206200789a83398151915255600080516020620078da8339815191527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09155600080516020620077da8339815191527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a092557f223e3c646566733e3c72616469616c4772616469656e742069643d22677261647f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a093557f31222063783d22353025222063793d223530252220723d22353025222066783d7f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a094557f22353025222066793d22353025223e3c73746f70206f66667365743d223025227f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a095557f207374796c653d2273746f702d636f6c6f723a726762280000000000000000007f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09655601454620009419062001cc1565b601f8111620018d4575b50607d60149081556000527f293b73746f702d6f7061636974793a3022202f3e3c73746f70206f66667365746000805160206200797a833981519152557f3d223130302522207374796c653d2273746f702d636f6c6f723a7267622800007fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ed55601554620009d99062001cc1565b601f811162001885575b5060a960159081556000527f3c616e696d617465206174747269627574654e616d653d2272222076616c75656000805160206200783a833981519152557f733d2230253b313030253b302522206475723d223130732220726570656174437f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec476557f6f756e743d22696e646566696e69746522202f3e0000000000000000000000007f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4775560165462000ab49062001cc1565b601f811162001836575b5061028f60169081556000527f3c2f72616469616c4772616469656e743e3c2f646566733e3c72656374207769600080516020620079ba833981519152556000805160206200799a8339815191527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428a556000805160206200793a8339815191527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428b556000805160206200791a8339815191527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428c55600080516020620078fa8339815191527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428d55600080516020620078ba8339815191527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428e557f222066696c6c3d2275726c282367726164312922202f3e3c7465787420666f6e7fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428f557f742d73697a653d2235352220666f6e742d66616d696c793d22547265627563687fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124290557f6574204d532220783d223530252220793d223137352220646f6d696e616e742d7fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124291557f626173656c696e653d226d6964646c652220746578742d616e63686f723d226d7fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242928190556634b2323632911f60c91b7fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124293556017547f6964646c65223e546f6b656e204c6f636b65643c2f746578743e3c2f7376673e9160229162000d649062001cc1565b601f8111620017e7575b5060ef60179081556000527f3c2f746578743e3c7465787420666f6e742d73697a653d2234352220666f6e746000805160206200795a833981519152557f2d66616d696c793d22547265627563686574204d532220783d223530252220797fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c16557f3d223830252220646f6d696e616e742d626173656c696e653d226d6964646c657fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c17557f2220746578742d616e63686f723d226d6964646c65223e0000000000000000007fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c185560185462000e829062001cc1565b601f811162001787575b506108c16018908155600052600080516020620077ba8339815191527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e9081557f30302f737667222076696577426f783d223020302033353020353030223e3c727fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2f557f6563742077696474683d223130302522206865696768743d22313030252220667fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d30557f696c6c3d22726762283233322c3232382c32313429222072783d22323522202f7fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d31557f3e3c70617468207472616e73666f726d3d227472616e736c617465283133302c7fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d32557f20313130292220643d224d322e3839322c35362e30333668382e393539762d317fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d33557f2e3037355633372e31313763302d31302e3230352c342e3137372d31392e34387fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d34557f342c31302e3839382d32362e323037762d302e303039204332392e3437332c347fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d35557f2e3137372c33382e3735342c302c34382e3936362c304335392e31372c302c367fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d36557f382e3434392c342e3137372c37352e3137332c31302e3930316c302e30312c307fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d37557f2e30303963362e3732312c362e3732332c31302e3839382c31362e3030322c317fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d38557f302e3839382c32362e3230377631372e3834342076312e30373568372e3133367fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d39557f63312e35392c302c322e3839322c312e3330322c322e3839322c322e383931767fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d3a557f36312e30363263302c312e3538392d312e3330322c322e3839312d322e3839327fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d3b557f2c322e38393148322e383932632d312e35392c302d322e3839322d312e3330327fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d3c557f2d322e3839322d322e383931205635382e39323743302c35372e3333382c312e7fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d3d557f3330322c35362e3033362c322e3839322c35362e3033364c322e3839322c35367fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d3e557f2e3033367a204d32362e3237312c35362e3033366834352e333837762d312e307fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d3f557f37355633362e39313163302d362e32342d322e3535342d31312e3931372d362e7fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d40557f3636322d31362e3033206c2d302e3030352c302e303034632d342e3131312d347fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d41557f2e3131342d392e3738372d362e3636392d31362e3032352d362e363639632d367fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d42557f2e3234312c302d31312e3931372c322e3535342d31362e3033332c362e3636357fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d43557f632d342e3130392c342e3131332d362e3636322c392e37392d362e3636322c317fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d44557f362e3033207631382e3035315635362e3033364c32362e3237312c35362e30337fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d45557f367a204d34392e3134392c38392e3434386c342e3538312c32312e3133396c2d7fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d46557f31322e3535372c302e3035336c332e3638352d32312e343233632d332e3433317fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d47557f2d312e312d352e3931382d342e3331352d352e3931382d382e3131312063302d7fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d48557f342e3730312c332e38312d382e3531312c382e3531332d382e35313163342e367fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d49557f39382c302c382e3531312c332e38312c382e3531312c382e3531314335352e397fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d4a557f36342c38352e3232362c35332e3033362c38382e3636332c34392e3134392c387fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d4b557f392e3434384c34392e3134392c38392e3434387a222f3e3c7465787420666f6e7fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d4c557f742d73697a653d2234352220666f6e742d66616d696c793d22547265627563687fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d4d557f6574204d532220783d223530252220793d223830252220646f6d696e616e742d7fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d4e557fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d4f91909155015566470de4df820000601a55662386f26fc10000601b556019805491909116919091179055604051615aa2908162001d188239f35b6018600052620017e090601f0160051c7fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e017fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d5162001cfe565b3862000e8c565b60176000526200182f90601f0160051c6000805160206200795a833981519152017fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c1962001cfe565b3862000d6e565b60166000526200187e90601f0160051c600080516020620079ba833981519152017fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512429462001cfe565b3862000abe565b6015600052620018cd90601f0160051c6000805160206200783a833981519152017f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47862001cfe565b38620009e3565b60146000526200191c90601f0160051c6000805160206200797a833981519152017fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ee62001cfe565b386200094b565b60136000526200196b90601f0160051c6000805160206200789a833981519152017f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09762001cfe565b3862000796565b6012600052620019ba90601f0160051c6000805160206200781a833981519152017fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344f62001cfe565b38620004f7565b601160005262001a0990601f0160051c6000805160206200785a833981519152017f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6b62001cfe565b386200041c565b601060005262001a4b90601f0160051c7f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6729081019062001cfe565b38620003e0565b600f60005262001a9a90601f0160051c600080516020620079da833981519152017f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80462001cfe565b3862000348565b600e60005262001ae990601f0160051c600080516020620077fa833981519152017fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c40462001cfe565b38620001a3565b01519050388062000133565b821690600160005260206000209160005b81811062001b4d5750958360019596971062001b33575b505050811b0160015562000149565b015160001960f88460031b161c1916905538808062001b24565b9192602060018192868b01518155019401920162001b0d565b600160005262001bb3907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f850160051c8101916020861062001bba575b601f0160051c019062001cfe565b3862000115565b909150819062001ba5565b634e487b7160e01b600052604160045260246000fd5b015190503880620000de565b60008080526000805160206200787a833981519152938616905b81811062001c42575090846001959493921062001c28575b505050811b01600055620000f4565b015160001960f88460031b161c1916905538808062001c19565b9293602060018192878601518155019501930162001c01565b6000805262001c95906000805160206200787a833981519152601f850160051c8101916020861062001bba57601f0160051c019062001cfe565b38620000c5565b600080fd5b60408051919082016001600160401b0381118382101762001bc557604052565b90600182811c9216801562001cf3575b602083101462001cdd57565b634e487b7160e01b600052602260045260246000fd5b91607f169162001cd1565b81811062001d0a575050565b6000815560010162001cfe56fe60806040526004361015610013575b600080fd5b60003560e01c806301ffc9a71461027f57806302fa6c861461027657806306fdde031461026d578063081812fc14610264578063095ea7b31461025b57806318160ddd146102525780631a8ebf101461024957806323b872dd14610240578063396770f8146102375780633ccfd60b1461022e57806340d5a0ee1461022557806342842e0e1461021c578063435b5d69146102135780636352211e1461020a57806370a0823114610201578063715018a6146101f857806381eee994146101ef5780638da5cb5b146101e657806395d89b41146101dd578063a22cb465146101d4578063a5d87c40146101cb578063ad2d44df146101c2578063b88d4fde146101b9578063c766731e146101b0578063c87b56dd146101a7578063d421d09b1461019e578063e7a37b2b14610195578063e985e9c51461018c578063ef88d7f014610183578063f2fde38b1461017a5763fc5922021461017257600080fd5b61000e6115d7565b5061000e611540565b5061000e61150b565b5061000e6114b9565b5061000e61146d565b5061000e61142b565b5061000e61140b565b5061000e6113b7565b5061000e611357565b5061000e611323565b5061000e611301565b5061000e611214565b5061000e61116e565b5061000e611144565b5061000e610f49565b5061000e610ee4565b5061000e610e41565b5061000e610e22565b5061000e610d85565b5061000e610ce8565b5061000e610b44565b5061000e610a39565b5061000e6109c5565b5061000e61099b565b5061000e61083b565b5061000e61081c565b5061000e61072c565b5061000e6106b9565b5061000e6105d9565b5061000e6104d3565b5061000e61029a565b6001600160e01b031981160361000e57565b503461000e57602036600319011261000e5760206004356102ba81610288565b63ffffffff60e01b166380ac58cd60e01b81149081156102f8575b81156102e7575b506040519015158152f35b6301ffc9a760e01b149050386102dc565b635b5e139f60e01b811491506102d5565b50634e487b7160e01b600052604160045260246000fd5b606081019081106001600160401b0382111761033b57604052565b610343610309565b604052565b602081019081106001600160401b0382111761033b57604052565b604081019081106001600160401b0382111761033b57604052565b608081019081106001600160401b0382111761033b57604052565b90601f801991011681019081106001600160401b0382111761033b57604052565b6020906001600160401b0381116103d7575b601f01601f19160190565b6103df610309565b6103cc565b9291926103f0826103ba565b916103fe6040519384610399565b82948184528183011161000e578281602093846000960137010152565b9080601f8301121561000e57816020610436933591016103e4565b90565b602060031982011261000e57600435906001600160401b03821161000e576104369160040161041b565b60005b8381106104765750506000910152565b8181015183820152602001610466565b9060209161049f81518092818552858086019101610463565b601f01601f1916010190565b90926104c4606093969594608084526080840190610486565b95602083015260408201520152565b503461000e576104e236610439565b6104eb81613254565b54156105835760026105106104ff83613254565b546000526009602052604060002090565b01549061056860036105246104ff84613254565b01549161053081613254565b54906001840361056c57610555600261054e6104ff61055a94613254565b0154613be1565b613b50565b925b604051948594856104ab565b0390f35b600261054e6104ff61057d93613254565b9261055c565b60405162461bcd60e51b815260206004820152601e60248201527f557365726e616d6520646f6573206e6f74206861766520612073636f726500006044820152606490fd5b906020610436928181520190610486565b503461000e576000806003193601126106b657604051908080546105fc8161189e565b8085529160019180831690811561068c5750600114610632575b6105688561062681870382610399565b604051918291826105c8565b80809450527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b82841061067457505050810160200161062682610568610616565b80546020858701810191909152909301928101610659565b8695506105689693506020925061062694915060ff191682840152151560051b8201019293610616565b80fd5b503461000e57602036600319011261000e5760206106d86004356119f0565b6040516001600160a01b039091168152f35b600435906001600160a01b038216820361000e57565b602435906001600160a01b038216820361000e57565b608435906001600160a01b038216820361000e57565b503461000e57604036600319011261000e576107466106ea565b60243561075281611826565b916001600160a01b0380841690821681146107cd576107849361077f913314908115610786575b5061197e565b611eea565b005b6001600160a01b031660009081526005602052604090206107c791506107c09033905b9060018060a01b0316600052602052604060002090565b5460ff1690565b38610779565b60405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608490fd5b503461000e57600036600319011261000e576020600854604051908152f35b503461000e5761016036600319011261000e5760046001600160401b03813581811161000e5761086e903690840161041b565b9060243581811161000e57610886903690850161041b565b60443582811161000e5761089d903690860161041b565b60643583811161000e576108b4903690870161041b565b60843584811161000e576108cb903690880161041b565b60a43585811161000e576108e2903690890161041b565b9060c43586811161000e576108fa9036908a0161041b565b9260e43587811161000e576109129036908b0161041b565b946101043588811161000e5761092b9036908c0161041b565b966101243589811161000e576109449036908d0161041b565b986101443590811161000e576107849b6109609136910161041b565b996120fb565b606090600319011261000e576001600160a01b0390600435828116810361000e5791602435908116810361000e579060443590565b503461000e576107846109ad36610966565b916109c06109bb8433611bbc565b611a82565b611d5c565b503461000e57608036600319011261000e576109df6106ea565b606435906001600160401b03821161000e57610a0261078492369060040161041b565b610a1760018060a01b0360075416331461178b565b610a2d60ff610a258361327a565b5416156132a0565b60443560243583613386565b503461000e576000806003193601126106b657610a6160018060a01b0360075416331461178b565b8080808047818115610a88575b3390f115610a7b57604051f35b610a83611fc1565b604051f35b506108fc610a6e565b96919360a095610adb6101809895610acd610b0998610abf9d9e9d610af5978e6101a0908181520190610486565b8d810360208f015290610486565b908b820360408d0152610486565b91600180891b031660608a015288820360808a0152610486565b9115158487015285820360c0870152610486565b94805160e085015260208101516101008501526040810151610120850152606081015161014085015260808101516101608501520151910152565b503461000e57602036600319011261000e576004356060806000818181610b69613c9b565b93610b75600854611d32565b881080610cdf575b610b8690613ceb565b610ba4610ba06107c08a600052600d602052604060002090565b1590565b15610cca5750505050505050610bb981614678565b90610bd3600261054e836000526009602052604060002090565b91610bf1610beb836000526009602052604060002090565b54613be1565b9060016003610c0a856000526009602052604060002090565b015414610cb3575b9061056891600180610c2e866000526009602052604060002090565b015414610ca3575b610c7c6005610c6e610c5d6004610c57896000526009602052604060002090565b016118d8565b966000526009602052604060002090565b01546001600160a01b031690565b60c082015160e0830151151591610120610100850151940151945b60405198899889610a91565b90610cad90613b50565b90610c36565b9290610cc161056892613b50565b93909150610c12565b61056895969750610cd9613d2e565b96610c97565b50871515610b7d565b503461000e57610784610cfa36610966565b9060405192610d0884610348565b60008452611b19565b606090606319011261000e5760405190610d2a82610320565b6064358252608435602083015260a4358260ff8216820361000e5760400152565b606090608319011261000e5760405190610d6482610320565b608435825260a435602083015260c4358260ff8216820361000e5760400152565b5060c036600319011261000e576044356004356024356001600160401b03831161000e57610dba61078493369060040161041b565b90610e1a610e15610dca36610d11565b610dd860ff610a258761327a565b610de6601a543410156132dd565b6040516020810190610e0d81610dff888a8c338861331a565b03601f198101835282610399565b51902061355b565b613349565b339233613386565b503461000e57602036600319011261000e5760206106d8600435611826565b503461000e57602036600319011261000e576001600160a01b03610e636106ea565b168015610e8c576000526003602052610568604060002054604051918291829190602083019252565b60405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608490fd5b503461000e576000806003193601126106b6576007546001600160a01b03811690610f1033831461178b565b6001600160a01b0319166007556040519082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08284a3f35b5060e036600319011261000e57604435600460643581356024356001600160401b03831161000e57600393610f846110aa943690830161041b565b90610f8e36610d4b565b610f9c601b543410156132dd565b610fb8610fa886611826565b6001600160a01b031633146135ff565b610fea33610fe4610fd86005610c6e8a6000526009602052604060002090565b6001600160a01b031690565b14613655565b61101a610e156040519260208401846110068d898b338661331a565b0394610e0d601f1996878101835282610399565b8161102f866000526009602052604060002090565b0160405161105181611045602082018095613a93565b03848101835282610399565b5190209060405161107760208201928261106b858961323d565b03908101835282610399565b519020036110ae575b50506002611098836000526009602052604060002090565b01556000526009602052604060002090565b0155005b8161112b61113d938360006110da611130966110d48b6000526009602052604060002090565b01613b16565b556111066110fc826110f68b6000526009602052604060002090565b01613b33565b805460ff19169055565b8761111083613254565b55611125886000526009602052604060002090565b01613161565b61327a565b805460ff19166001179055565b3880611080565b503461000e57600036600319011261000e576007546040516001600160a01b039091168152602090f35b503461000e576000806003193601126106b657604051908060018054916111948361189e565b8086529282811690811561068c57506001146111ba576105688561062681870382610399565b92508083527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8284106111fc57505050810160200161062682610568610616565b805460208587018101919091529093019281016111e1565b503461000e57604036600319011261000e5761122e6106ea565b602435801515810361000e576001600160a01b038216913383146112bc578161127961128a9233600052600560205260406000209060018060a01b0316600052602052604060002090565b9060ff801983541691151516179055565b604051901515815233907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190602090a3005b60405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606490fd5b503461000e57602060ff61131761112b36610439565b54166040519015158152f35b503461000e57602036600319011261000e57610568611343600435613d56565b604051918291602083526020830190610486565b503461000e57608036600319011261000e576113716106ea565b611379610700565b606435916001600160401b03831161000e573660238401121561000e576113ad6107849336906024816004013591016103e4565b9160443591611b19565b503461000e57602036600319011261000e576113d16106ea565b6007546001600160a01b0391906113eb908316331461178b565b166bffffffffffffffffffffffff60a01b60195416176019556000604051f35b503461000e57602036600319011261000e576105686113436004356155f9565b503461000e57600061146a61143f36610439565b61145460018060a01b0360075416331461178b565b61145d8161327a565b805460ff19169055613254565b55005b503461000e57602036600319011261000e5761149460018060a01b0360075416331461178b565b6004356000908152600d60205260409020805460ff818116151660ff19909116179055005b503461000e57604036600319011261000e57602060ff6113176114da6106ea565b6114e2610700565b6001600160a01b0391821660009081526005865260408082209290931681526020919091522090565b503461000e57604036600319011261000e5761153260018060a01b0360075416331461178b565b600435601a55602435601b55005b503461000e57602036600319011261000e5761155a6106ea565b6007546001600160a01b0390611573908216331461178b565b81161561158357610784906117d6565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b503461000e5760e036600319011261000e57600480356064356001600160401b03811161000e5761160b903690840161041b565b6116ca611616610716565b61162b60018060a01b0360075416331461178b565b6024356002611644866000526009602052604060002090565b015560a43561165d856000526009602052604060002090565b5560c4356001611677866000526009602052604060002090565b01556044356003611692866000526009602052604060002090565b015560056116aa856000526009602052604060002090565b0180546001600160a01b0319166001600160a01b03909216919091179055565b826116df836000526009602052604060002090565b0160405190816116f3602082018093613a93565b0391611707601f1993848101835282610399565b5190209060405161172160208201928261106b858861323d565b5190200361172b57005b61112b8184611125856000611754610784996110d46111309a6000526009602052604060002090565b556117706110fc846110f6846000526009602052604060002090565b8061177a85613254565b556000526009602052604060002090565b1561179257565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6007549060018060a01b0380911691826bffffffffffffffffffffffff60a01b821617600755167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06000604051a3565b6000908152600260205260409020546001600160a01b031680156118475790565b60405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608490fd5b90600182811c921680156118ce575b60208310146118b857565b634e487b7160e01b600052602260045260246000fd5b91607f16916118ad565b90604051918260008254926118ec8461189e565b90818452600194858116908160001461195b5750600114611918575b505061191692500383610399565b565b9093915060005260209081600020936000915b81831061194357505061191693508201013880611908565b8554888401850152948501948794509183019161192b565b91505061191694506020925060ff191682840152151560051b8201013880611908565b1561198557565b60405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608490fd5b6000818152600260205260409020546001600160a01b031615611a28576000908152600460205260409020546001600160a01b031690565b60405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608490fd5b15611a8957565b60405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608490fd5b60405190602082018281106001600160401b03821117611b0c575b60405260008252565b611b14610309565b611b03565b916119169391611b4093611b306109bb8433611bbc565b611b3b838383611d5c565b6120bf565b611b98565b60809060208152603260208201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60608201520190565b15611b9f57565b60405162461bcd60e51b815280611bb860048201611b45565b0390fd5b6000828152600260205260409020546001600160a01b031615611c5257611be282611826565b9160018060a01b0390818316928285168414948515611c21575b50508315611c0b575b50505090565b611c17919293506119f0565b1614388080611c05565b6001600160a01b0316600090815260056020526040902091945060ff91611c4891906107a9565b5416923880611bfc565b60405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608490fd5b15611cb357565b60405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b50634e487b7160e01b600052601160045260246000fd5b600019810191908211611d2a57565b611916611d04565b9060018201809211611d2a57565b9060028201809211611d2a57565b9060208201809211611d2a57565b90611d6683611826565b6001600160a01b038381169290918216839003611e4157611db5611e1892821694611d92861515611cac565b611d9b87611e94565b6001600160a01b0316600090815260036020526040902090565b611dbf8154611d1b565b90556001600160a01b0381166000908152600360205260409020611de38154611d32565b9055611df9856000526002602052604060002090565b80546001600160a01b0319166001600160a01b03909216919091179055565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000604051a4565b60405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608490fd5b600081815260046020526040812080546001600160a01b03191690556001600160a01b03611ec183611826565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92582604051a4565b600082815260046020526040902080546001600160a01b0319166001600160a01b0383161790556001600160a01b0380611f2384611826565b169116907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256000604051a4565b9081602091031261000e575161043681610288565b610436939260809260018060a01b031682526000602083015260408201528160608201520190610486565b6001600160a01b03918216815291166020820152604081019190915260806060820181905261043692910190610486565b506040513d6000823e3d90fd5b3d15611ff9573d90611fdf826103ba565b91611fed6040519384610399565b82523d6000602084013e565b606090565b909190803b156120b757612030602091600093604051948580948193630a85bd0160e11b998a84523360048501611f65565b03926001600160a01b03165af160009181612087575b5061207957612053611fce565b805190816120745760405162461bcd60e51b815280611bb860048201611b45565b602001fd5b6001600160e01b0319161490565b6120a991925060203d81116120b0575b6120a18183610399565b810190611f50565b9038612046565b503d612097565b505050600190565b92909190823b156120f257612030926020926000604051809681958294630a85bd0160e11b9a8b85523360048601611f90565b50505050600190565b61211060018060a01b0360075416331461178b565b8051906001600160401b03821161227f575b61213682612131600e5461189e565b61228c565b60209081601f84116001146121cd57506121b39661219f6119169e9d9b9761219a6121ae986121bd9f9c966121b89e99896121a99a612195936121a49a6000926121c2575b50508160011b916000199060031b1c191617600e556127bb565b6128b2565b6129a9565b612aa0565b612b97565b612c8e565b612d85565b612e7c565b612f73565b61306a565b01519050388061217b565b600e6000529190601f1984167fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd936000905b8282106122675750506119169e9d9b9761219a6121ae986121bd9f9c966121b89e9960018a6121b39f98936121a49a612195956121a99e61219f9b1061224e575b505050811b01600e556127bb565b015160001960f88460031b161c19169055388080612240565b806001869782949787015181550196019401906121ff565b612287610309565b612122565b601f8111612298575050565b600090600e82527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd906020601f850160051c830194106122f3575b601f0160051c01915b8281106122e857505050565b8181556001016122dc565b90925082906122d3565b601f8111612309575050565b600090600f82527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802906020601f850160051c83019410612364575b601f0160051c01915b82811061235957505050565b81815560010161234d565b9092508290612344565b601f811161237a575050565b600090601082527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672906020601f850160051c830194106123d5575b601f0160051c01915b8281106123ca57505050565b8181556001016123be565b90925082906123b5565b601f81116123eb575050565b600090601182527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68906020601f850160051c83019410612446575b601f0160051c01915b82811061243b57505050565b81815560010161242f565b9092508290612426565b601f811161245c575050565b600090601282527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444906020601f850160051c830194106124b7575b601f0160051c01915b8281106124ac57505050565b8181556001016124a0565b9092508290612497565b601f81116124cd575050565b600090601382527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090906020601f850160051c83019410612528575b601f0160051c01915b82811061251d57505050565b818155600101612511565b9092508290612508565b601f811161253e575050565b600090601482527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec906020601f850160051c83019410612599575b601f0160051c01915b82811061258e57505050565b818155600101612582565b9092508290612579565b601f81116125af575050565b600090601582527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec475906020601f850160051c8301941061260a575b601f0160051c01915b8281106125ff57505050565b8181556001016125f3565b90925082906125ea565b601f8111612620575050565b600090601682527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124289906020601f850160051c8301941061267b575b601f0160051c01915b82811061267057505050565b818155600101612664565b909250829061265b565b601f8111612691575050565b600090601782527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c15906020601f850160051c830194106126ec575b601f0160051c01915b8281106126e157505050565b8181556001016126d5565b90925082906126cc565b601f8111612702575050565b600090601882527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e906020601f850160051c8301941061275d575b601f0160051c01915b82811061275257505050565b818155600101612746565b909250829061273d565b90601f811161277557505050565b600091825260208220906020601f850160051c830194106127b1575b601f0160051c01915b8281106127a657505050565b81815560010161279a565b9092508290612791565b9081516001600160401b0381116128a5575b6127e1816127dc600f5461189e565b6122fd565b602080601f831160011461281d5750819293600092612812575b50508160011b916000199060031b1c191617600f55565b0151905038806127fb565b90601f19831694612850600f6000527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80290565b926000905b87821061288d575050836001959610612874575b505050811b01600f55565b015160001960f88460031b161c19169055388080612869565b80600185968294968601518155019501930190612855565b6128ad610309565b6127cd565b9081516001600160401b03811161299c575b6128d8816128d360105461189e565b61236e565b602080601f83116001146129145750819293600092612909575b50508160011b916000199060031b1c191617601055565b0151905038806128f2565b90601f1983169461294760106000527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67290565b926000905b87821061298457505083600195961061296b575b505050811b01601055565b015160001960f88460031b161c19169055388080612960565b8060018596829496860151815501950193019061294c565b6129a4610309565b6128c4565b9081516001600160401b038111612a93575b6129cf816129ca60115461189e565b6123df565b602080601f8311600114612a0b5750819293600092612a00575b50508160011b916000199060031b1c191617601155565b0151905038806129e9565b90601f19831694612a3e60116000527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6890565b926000905b878210612a7b575050836001959610612a62575b505050811b01601155565b015160001960f88460031b161c19169055388080612a57565b80600185968294968601518155019501930190612a43565b612a9b610309565b6129bb565b9081516001600160401b038111612b8a575b612ac681612ac160125461189e565b612450565b602080601f8311600114612b025750819293600092612af7575b50508160011b916000199060031b1c191617601255565b015190503880612ae0565b90601f19831694612b3560126000527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344490565b926000905b878210612b72575050836001959610612b59575b505050811b01601255565b015160001960f88460031b161c19169055388080612b4e565b80600185968294968601518155019501930190612b3a565b612b92610309565b612ab2565b9081516001600160401b038111612c81575b612bbd81612bb860135461189e565b6124c1565b602080601f8311600114612bf95750819293600092612bee575b50508160011b916000199060031b1c191617601355565b015190503880612bd7565b90601f19831694612c2c60136000527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09090565b926000905b878210612c69575050836001959610612c50575b505050811b01601355565b015160001960f88460031b161c19169055388080612c45565b80600185968294968601518155019501930190612c31565b612c89610309565b612ba9565b9081516001600160401b038111612d78575b612cb481612caf60145461189e565b612532565b602080601f8311600114612cf05750819293600092612ce5575b50508160011b916000199060031b1c191617601455565b015190503880612cce565b90601f19831694612d2360146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec90565b926000905b878210612d60575050836001959610612d47575b505050811b01601455565b015160001960f88460031b161c19169055388080612d3c565b80600185968294968601518155019501930190612d28565b612d80610309565b612ca0565b9081516001600160401b038111612e6f575b612dab81612da660155461189e565b6125a3565b602080601f8311600114612de75750819293600092612ddc575b50508160011b916000199060031b1c191617601555565b015190503880612dc5565b90601f19831694612e1a60156000527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47590565b926000905b878210612e57575050836001959610612e3e575b505050811b01601555565b015160001960f88460031b161c19169055388080612e33565b80600185968294968601518155019501930190612e1f565b612e77610309565b612d97565b9081516001600160401b038111612f66575b612ea281612e9d60165461189e565b612614565b602080601f8311600114612ede5750819293600092612ed3575b50508160011b916000199060031b1c191617601655565b015190503880612ebc565b90601f19831694612f1160166000527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428990565b926000905b878210612f4e575050836001959610612f35575b505050811b01601655565b015160001960f88460031b161c19169055388080612f2a565b80600185968294968601518155019501930190612f16565b612f6e610309565b612e8e565b9081516001600160401b03811161305d575b612f9981612f9460175461189e565b612685565b602080601f8311600114612fd55750819293600092612fca575b50508160011b916000199060031b1c191617601755565b015190503880612fb3565b90601f1983169461300860176000527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c1590565b926000905b87821061304557505083600195961061302c575b505050811b01601755565b015160001960f88460031b161c19169055388080613021565b8060018596829496860151815501950193019061300d565b613065610309565b612f85565b9081516001600160401b038111613154575b6130908161308b60185461189e565b6126f6565b602080601f83116001146130cc57508192936000926130c1575b50508160011b916000199060031b1c191617601855565b0151905038806130aa565b90601f198316946130ff60186000527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e90565b926000905b87821061313c575050836001959610613123575b505050811b01601855565b015160001960f88460031b161c19169055388080613118565b80600185968294968601518155019501930190613104565b61315c610309565b61307c565b91909182516001600160401b038111613230575b61318981613183845461189e565b84612767565b602080601f83116001146131c55750819293946000926131ba575b50508160011b916000199060031b1c1916179055565b0151905038806131a4565b90601f198316956131db85600052602060002090565b926000905b888210613218575050836001959697106131ff575b505050811b019055565b015160001960f88460031b161c191690553880806131f5565b806001859682949686015181550195019301906131e0565b613238610309565b613175565b9061325060209282815194859201610463565b0190565b602061326d918160405193828580945193849201610463565b8101600a81520301902090565b6020613293918160405193828580945193849201610463565b8101600b81520301902090565b156132a757565b60405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b6044820152606490fd5b156132e457565b60405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced040cae8d60931b6044820152606490fd5b9493926060926133449260018060a01b031687526020870152608060408701526080860190610486565b930152565b1561335057565b60405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21031b7bab837b760911b6044820152606490fd5b93926133ef61113092946133ff94600854966001880180981161354e575b6000888152600960205260409020600281018290559081556001810182905560038101919091556133d9908490600490611125565b60056116aa876000526009602052604060002090565b836133f982613254565b5561327a565b60405161340b81610348565b600081526001600160a01b03831691821561350a576000818152600260205260409020546001600160a01b03166134c5578381611b40946134616134b29760018060a01b03166000526003602052604060002090565b61346b8154611d32565b905561348583611df9846000526002602052604060002090565b60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef81604051a4611ffe565b6119166134c0600854611d32565b600855565b60405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606490fd5b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b613556611d04565b6133a4565b608060009160209360ff6040820151169085815191015191604051938452868401526040830152606082015282805260015afa156135f2575b6000516001600160a01b031680156135bf576019546135bb906001600160a01b0316610fd8565b1490565b60405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642073696760a81b6044820152606490fd5b6135fa611fc1565b613594565b1561360657565b60405162461bcd60e51b815260206004820152602160248201527f596f75206d7573742063757272656e746c79206f776e207468697320746f6b656044820152603760f91b6064820152608490fd5b1561365c57565b606460405162461bcd60e51b815260206004820152602060248201527f4d75737420757365206f726967696e616c206d696e74657220616464726573736044820152fd5b601754600092916136b08261189e565b9160019081811690811561371c57506001146136cb57505050565b909192935060176000527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c15906000915b848310613709575050500190565b81816020925485870152019201916136fb565b60ff191683525050811515909102019150565b600e546000929161373f8261189e565b9160019081811690811561371c575060011461375a57505050565b9091929350600e6000527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd906000915b848310613798575050500190565b818160209254858701520192019161378a565b600f54600092916137bb8261189e565b9160019081811690811561371c57506001146137d657505050565b9091929350600f6000527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802906000915b848310613814575050500190565b8181602092548587015201920191613806565b601054600092916138378261189e565b9160019081811690811561371c575060011461385257505050565b909192935060106000527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672906000915b848310613890575050500190565b8181602092548587015201920191613882565b601254600092916138b38261189e565b9160019081811690811561371c57506001146138ce57505050565b909192935060126000527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444906000915b84831061390c575050500190565b81816020925485870152019201916138fe565b6013546000929161392f8261189e565b9160019081811690811561371c575060011461394a57505050565b909192935060136000527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090906000915b848310613988575050500190565b818160209254858701520192019161397a565b601454600092916139ab8261189e565b9160019081811690811561371c57506001146139c657505050565b909192935060146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec906000915b848310613a04575050500190565b81816020925485870152019201916139f6565b60165460009291613a278261189e565b9160019081811690811561371c5750600114613a4257505050565b909192935060166000527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124289906000915b848310613a80575050500190565b8181602092548587015201920191613a72565b600092918154613aa28161189e565b92600191808316908115613afb5750600114613abf575b50505050565b90919293945060005260209081600020906000915b858310613aea5750505050019038808080613ab9565b805485840152918301918101613ad4565b60ff1916845250505081151590910201915038808080613ab9565b6020613b289160405192838092613a93565b600a81520301902090565b6020613b459160405192838092613a93565b600b81520301902090565b9061191660216040518094602d60f81b6020830152613b788151809260208686019101610463565b8101036001810185520183610399565b90613b92826103ba565b613b9f6040519182610399565b8281528092613bb0601f19916103ba565b0190602036910137565b908151811015613bcb570160200190565b634e487b7160e01b600052603260045260246000fd5b8015613c7d576000818181805b613c535750613bfc81613b88565b935b613c085750505090565b613c1190611d1b565b90600a9060308282068101809111613c46575b60f81b6001600160f81b031916841a613c3d8487613bba565b53049081613bfe565b613c4e611d04565b613c24565b91506001600a916000198114613c70575b01910480849291613bee565b613c78611d04565b613c64565b50604051613c8a81610363565b60018152600360fc1b602082015290565b6040519060c082018281106001600160401b03821117613cde575b6040528160a06000918281528260208201528260408201528260608201528260808201520152565b613ce6610309565b613cb6565b15613cf257565b60405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606490fd5b60405190613d3b82610363565b600c82526b151bdad95b88131bd8dad95960a21b6020830152565b60085460018101809111613db3575b811080613daa575b613d7690613ceb565b80600052600d60205260ff6040600020541615600014613da157613d9c61018091614678565b015190565b50610436613d2e565b50801515613d6d565b613dbb611d04565b613d65565b604051906101a082018281106001600160401b03821117613e3b575b6040528161018060009182815282602082015282604082015260609280848301528360808301528060a08301528360c083015260e082015282610100820152613e23613c9b565b61012082015282610140820152826101608201520152565b613e43610309565b613ddc565b60405190613e5582610363565b6008825267706f73697469766560c01b6020830152565b60405190613e7982610363565b60068252653634b732b0b960d11b6020830152565b60405190613e9b82610363565b600782526613995d5d1c985b60ca1b6020830152565b60405190613ebe82610363565b600582526466616c736560d81b6020830152565b60405190613edf82610363565b60088252676e6567617469766560c01b6020830152565b60405190613f0382610363565b6004825263115d9a5b60e21b6020830152565b60405190613f2382610363565b600982526814995cd95b9d199d5b60ba1b6020830152565b60405190613f4882610363565b60098252684f6666656e7369766560b81b6020830152565b60405190613f6d82610363565b600882526714dc1a5d19599d5b60c21b6020830152565b60405190613f9182610363565b60078252664865696e6f757360c81b6020830152565b60405190613fb482610363565b60068252655374696e677960d01b6020830152565b60405190613fd682610363565b60068252654c6f76696e6760d01b6020830152565b60405190613ff882610363565b600a825269416c747275697374696360b01b6020830152565b6040519061401e82610363565b600d82526c436f6d70617373696f6e61746560981b6020830152565b6040519061404782610363565b600b82526a12da5b991a19585c9d195960aa1b6020830152565b6040519061406e82610363565b600a825269537570706f727469766560b01b6020830152565b6040519061409482610363565b6008825267467269656e646c7960c01b6020830152565b60229061191692949360405195826140cd889451809260208088019101610463565b830190600b60fa1b918260208201526140f0825180936020602185019101610463565b0190602182015261410a8251809360208785019101610463565b01036002810185520183610399565b6119169061416061415b6020809695614155614142604051998a9761414f614142838b0161372f565b9182815194859201610463565b016137ab565b01613827565b6138a3565b03601f198101845283610399565b6119169061416061419d6020809695614155614142604051998a97614197614142838b0161391f565b0161399b565b613a17565b9190614142906141c860405194859261415560209586809461414f614142838a0161372f565b91600092601154916141d98361189e565b9260019081811690811561425f5750600114614200575b50505050614160611916926138a3565b909192945060116000527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68906000915b86831061424b575050509201915061416061191638806141f0565b805483860152889550918301918101614230565b60ff1916845250505081151590910201915061416061191638806141f0565b9190614142906142a4604051948592614155602095868094614197614142838a0161391f565b91600092601554916142b58361189e565b9260019081811690811561433b57506001146142dc575b5050505061416061191692613a17565b909192945060156000527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec475906000915b868310614327575050509201915061416061191638806142cc565b80548386015288955091830191810161430c565b60ff1916845250505081151590910201915061416061191638806142cc565b6040519061436782610363565b60048252637472756560e01b6020830152565b6040519061438782610363565b60068252651c98591a585b60d21b6020830152565b99979593919b9a98969492909b6040519c8d809c602082017f2c2261747472696275746573223a5b7b2274726169745f74797065223a22677290527030b234b2b73a1116113b30b63ab2911d1160791b604083015280516051819301916020019161440692610463565b8c0160518101614435907f227d2c7b2274726169745f74797065223a227231222c2276616c7565223a22009052565b6070016144419161323d565b7f227d2c7b2274726169745f74797065223a226731222c2276616c7565223a22008152601f016144709161323d565b7f227d2c7b2274726169745f74797065223a226231222c2276616c7565223a22008152601f0161449f9161323d565b7f227d2c7b2274726169745f74797065223a227232222c2276616c7565223a22008152601f016144ce9161323d565b7f227d2c7b2274726169745f74797065223a226732222c2276616c7565223a22008152601f016144fd9161323d565b7f227d2c7b2274726169745f74797065223a226232222c2276616c7565223a22008152601f0161452c9161323d565b7f227d2c7b2274726169745f74797065223a22737461747573222c2276616c7565815262111d1160e91b60208201526023016145679161323d565b7f227d2c7b2274726169745f74797065223a22616e696d61746564222c2276616c8152643ab2911d1160d91b60208201526025016145a49161323d565b7f227d2c7b2274726169745f74797065223a227369676e222c2276616c7565223a8152601160f91b60208201526021016145dd9161323d565b7f227d2c7b2274726169745f74797065223a2273636f7265222c2276616c7565228152611d1160f11b60208201526022016146179161323d565b7f227d2c7b2274726169745f74797065223a226f726967696e616c2073636f726581526a1116113b30b63ab2911d1160a91b6020820152602b0161465a9161323d565b62227d5d60e81b815203601c19810183526003016119169083610399565b6148c3614683613dc0565b91600261469a826000526009602052604060002090565b01549060036146b3826000526009602052604060002090565b0154906146be613e48565b9060c08601906146cc613e6c565b825261010087016146db613e8e565b81526146e5613eb1565b92886146fe610beb856000526009602052604060002090565b97600180614716876000526009602052604060002090565b015414614ac5575b614737600261054e876000526009602052604060002090565b976149ee5760198111806149e3575b1561493e57614753614087565b84525b61475f85614ad5565b9461479761477561012085019780895251613be1565b614783602089510151613be1565b61479160408a510151613be1565b916140ab565b906147c56147a9606089510151613be1565b6147b760808a510151613be1565b61479160a08b510151613be1565b926101606147d38585614119565b950194855260556147e48383614d48565b11156148f55760639161480c916147fb868661416e565b875261480561437a565b8852614dbd565b116148cc575b505061486061483c915b51610dff614847865161483c6148428d604051988997602089019061323d565b9061323d565b6136a0565b6c1e17ba32bc3a1f1e17b9bb339f60991b8152600d0190565b6101808a01525191614873815151613be1565b614881602083510151613be1565b61488f604084510151613be1565b9061489e606085510151613be1565b926148bb60a06148b2608088510151613be1565b96510151613be1565b95519661439c565b61014082015290565b6148d792965061427e565b8452600160e08a015261483c6148606148ee61435a565b9591614812565b60619161490191614d79565b11614915575b505061486061483c9161481c565b6149209296506141a2565b8452600160e08a015261483c61486061493761435a565b9591614907565b604b8111806149d8575b1561495d57614955614061565b84525b614756565b60738111806149cd575b156149745761495561403a565b60af8111806149c1575b1561498b57614955614011565b61012c8111806149b5575b156149a357614955613feb565b6101f481111561495857614955613fc9565b506101f4811115614996565b5061012c81111561497e565b5060af811115614967565b506073811115614948565b50604b811115614746565b955050946149fb90613b50565b9488614a05613ed2565b956019811180614aba575b15614a1d57614955613fa7565b604b811180614aaf575b15614a3457614955613f84565b6073811180614aa4575b15614a4b57614955613f60565b60af811180614a98575b15614a6257614955613f3b565b61012c811180614a8c575b15614a7a57614955613f16565b6101f481111561495857614955613ef6565b506101f4811115614a6d565b5061012c811115614a55565b5060af811115614a3e565b506073811115614a27565b50604b811115614a10565b97614acf90613b50565b9761471e565b90614ade613c9b565b916003614af5826000526009602052604060002090565b01549060016002614b10836000526009602052604060002090565b01549214614c36576101f4821080614b7b575081614b3182614b74946153e7565b8552614b3d8282615423565b6020860152614b4c828261545f565b6040860152614b5b8282615489565b6060860152614b6a82826154c5565b6080860152615501565b60a0830152565b60c883119081614c2e575b5015614bdd5781614b9a82614b749461527f565b8552614ba682826152bb565b6020860152614bb582826152f7565b6040860152614bc48282615333565b6060860152614bd3828261536f565b60808601526153ab565b81614beb82614b749461514d565b8552614bf78282615177565b6020860152614c0682826151b3565b6040860152614c1582826151dd565b6060860152614c248282615207565b6080860152615243565b905038614b86565b60c8821080614c91575081614c4e82614b7494615093565b8552614c5a82826150bd565b6020860152614c6982826150e7565b6040860152614c788282615111565b6060860152614c878282615093565b60808601526150e7565b80614d3e575b15614ced5781614caa82614b7494614f61565b8552614cb68282614f8b565b6020860152614cc58282614fb5565b6040860152614cd48282614fdf565b6060860152614ce3828261501b565b6080860152615057565b81614cfb82614b7494614df9565b8552614d078282614e35565b6020860152614d168282614e71565b6040860152614d258282614ead565b6060860152614d348282614ee9565b6080860152614f25565b50604b8211614c97565b906065916040519060208201923060601b84526034830152605482015260548152614d728161037e565b5190200690565b906063916040519060208201923060601b84526034830152605482015260548152614da38161037e565b5190200660028101809111614db55790565b610436611d04565b906065916040519060208201923060601b84526034830152605482015260548152614de78161037e565b5190200660018101809111614db55790565b906033916040519060208201923060601b84526034830152605482015260548152614e238161037e565b5190200660328101809111614db55790565b906032916040519060208201923060601b84526034830152605482015260548152614e5f8161037e565b5190200660338101809111614db55790565b906031916040519060208201923060601b84526034830152605482015260548152614e9b8161037e565b5190200660348101809111614db55790565b906030916040519060208201923060601b84526034830152605482015260548152614ed78161037e565b5190200660358101809111614db55790565b90602f916040519060208201923060601b84526034830152605482015260548152614f138161037e565b5190200660368101809111614db55790565b90602e916040519060208201923060601b84526034830152605482015260548152614f4f8161037e565b5190200660378101809111614db55790565b906033916040519060208201923060601b84526034830152605482015260548152614d728161037e565b906031916040519060208201923060601b84526034830152605482015260548152614de78161037e565b90602f916040519060208201923060601b84526034830152605482015260548152614da38161037e565b90602d916040519060208201923060601b845260348301526054820152605481526150098161037e565b5190200660038101809111614db55790565b90602b916040519060208201923060601b845260348301526054820152605481526150458161037e565b5190200660048101809111614db55790565b906029916040519060208201923060601b845260348301526054820152605481526150818161037e565b5190200660058101809111614db55790565b906006916040519060208201923060601b84526034830152605482015260548152614d728161037e565b906006916040519060208201923060601b84526034830152605482015260548152614de78161037e565b90600a916040519060208201923060601b84526034830152605482015260548152614d728161037e565b90601a916040519060208201923060601b8452603483015260548201526054815261513b8161037e565b51902006607d8101809111614db55790565b906064916040519060208201923060601b84526034830152605482015260548152614e5f8161037e565b906065916040519060208201923060601b845260348301526054820152605481526151a18161037e565b5190200660318101809111614db55790565b906061916040519060208201923060601b84526034830152605482015260548152614e9b8161037e565b90605f916040519060208201923060601b84526034830152605482015260548152614ed78161037e565b906063916040519060208201923060601b845260348301526054820152605481526152318161037e565b5190200660308101809111614db55790565b906059916040519060208201923060601b8452603483015260548201526054815261526d8161037e565b5190200660398101809111614db55790565b90606a916040519060208201923060601b845260348301526054820152605481526152a98161037e565b5190200660968101809111614db55790565b906069916040519060208201923060601b845260348301526054820152605481526152e58161037e565b5190200660978101809111614db55790565b906068916040519060208201923060601b845260348301526054820152605481526153218161037e565b5190200660988101809111614db55790565b90606b916040519060208201923060601b8452603483015260548201526054815261535d8161037e565b5190200660958101809111614db55790565b90606c916040519060208201923060601b845260348301526054820152605481526153998161037e565b5190200660948101809111614db55790565b906067916040519060208201923060601b845260348301526054820152605481526153d58161037e565b5190200660998101809111614db55790565b906033916040519060208201923060601b845260348301526054820152605481526154118161037e565b5190200660cd8101809111614db55790565b90600f916040519060208201923060601b8452603483015260548201526054815261544d8161037e565b5190201660c88101809111614db55790565b90601f916040519060208201923060601b84526034830152605482015260548152614d728161037e565b90600d916040519060208201923060601b845260348301526054820152605481526154b38161037e565b5190200660bc8101809111614db55790565b90600e916040519060208201923060601b845260348301526054820152605481526154ef8161037e565b5190200660bb8101809111614db55790565b90600f916040519060208201923060601b8452603483015260548201526054815261552b8161037e565b5190200660ba8101809111614db55790565b60405190600082601854916155518361189e565b808352926001908181169081156155d75750600114615578575b5061191692500383610399565b6018600090815291507fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e5b8483106155bc575061191693505081016020013861556b565b81935090816020925483858a010152019101909185926155a3565b90506020925061191694915060ff191682840152151560051b8201013861556b565b615604600854611d32565b8110806158c4575b61561590613ceb565b61562f610ba06107c083600052600d602052604060002090565b15615794576104366156f361575f836157466157396156696156636004610c5761106b9a6000526009602052604060002090565b93614678565b61483c61572c61014061568061018085015161596f565b9301519261483c604051998a9861483c6156b86156b260208d01600b906a01ec89b985b59488e8808960ae1b81520190565b8361323d565b7f222c20226465736372697074696f6e223a2022506f736974697669747920536381526801bdc9948199bdc88160be1b602082015260290190565b7f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b81526618985cd94d8d0b60ca1b602082015260270190565b601160f91b815260010190565b607d60f81b815260010190565b039161575a601f1993848101835282610399565b61596f565b6040517f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006020820152938491603d830161483c565b5061106b6104366158b661575f6157ac61575a61553d565b61574660405193849261483c6020850160c9907f7b226e616d65223a2022546f6b656e204c6f636b6564222c202264657363726981527f7074696f6e223a2022556e666f7274756e6174656c792c207468697320746f6b60208201527f656e20686173206265656e206d616e75616c6c79206c6f636b65642e204d6f7360408201527f74206c696b656c792064756520746f20612075736572206d616c6963696f757360608201527f6c7920747279696e6720746f2063726561746520612066616c73652073636f7260808201527f652e222c2022696d616765223a2022646174613a696d6167652f7376672b786d60a0820152681b0ed8985cd94d8d0b60ba1b60c08201520190565b61227d60f01b815260020190565b5080151561560c565b6001600160fe1b0381116001166158e5575b60021b90565b6158ed611d04565b6158df565b60405190606082018281106001600160401b03821117615962575b604052604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b61596a610309565b61590d565b8051908115615a625761599361598e61598784611d40565b6003900490565b6158cd565b916159a56159a084611d4e565b613b88565b906159ae6158f2565b92600092602081015b8484811015615a1b5790600491600380910196850101516001603f9080828460121c168b010151918a60ff9384848488600c1c1684010151168585600894868a60061c160101511691831b01821b01901b93168a010151160160e01b8152016159b7565b509350949350506003900680600114615a4e57600214615a3c575b50815290565b603d60f81b6000199091015238615a36565b50613d3d60f01b6001199091015238615a36565b5050610436611ae856fea264697066735822122085e6c1c8ac5b8a7e1a5cdfe4f31e5a3fe405c4d7c627b57ed3951d85d63c90e064736f6c634300081000333c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f32306e594d696e206d656574222076696577426f783d223020302033353020353030bb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fdbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344455f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47531ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56366de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0903d22313735222063793d22313735222072783d22313530222072793d2231353030302f73766722207072657365727665417370656374526174696f3d22784d693d22313530222066696c6c3d227768697465222f3e3c656c6c6970736520637873652063783d22313735222063793d22313735222072783d22313530222072796762283233322c3232382c32313429222072783d223235222f3e3c656c6c6970c624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c15ce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec6474683d223130302522206865696768743d2231303025222066696c6c3d2272d833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242898d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020000000000000000000000005a9fdefaf662aa7b309a83f8a423eed086547091

Deployed Bytecode

0x60806040526004361015610013575b600080fd5b60003560e01c806301ffc9a71461027f57806302fa6c861461027657806306fdde031461026d578063081812fc14610264578063095ea7b31461025b57806318160ddd146102525780631a8ebf101461024957806323b872dd14610240578063396770f8146102375780633ccfd60b1461022e57806340d5a0ee1461022557806342842e0e1461021c578063435b5d69146102135780636352211e1461020a57806370a0823114610201578063715018a6146101f857806381eee994146101ef5780638da5cb5b146101e657806395d89b41146101dd578063a22cb465146101d4578063a5d87c40146101cb578063ad2d44df146101c2578063b88d4fde146101b9578063c766731e146101b0578063c87b56dd146101a7578063d421d09b1461019e578063e7a37b2b14610195578063e985e9c51461018c578063ef88d7f014610183578063f2fde38b1461017a5763fc5922021461017257600080fd5b61000e6115d7565b5061000e611540565b5061000e61150b565b5061000e6114b9565b5061000e61146d565b5061000e61142b565b5061000e61140b565b5061000e6113b7565b5061000e611357565b5061000e611323565b5061000e611301565b5061000e611214565b5061000e61116e565b5061000e611144565b5061000e610f49565b5061000e610ee4565b5061000e610e41565b5061000e610e22565b5061000e610d85565b5061000e610ce8565b5061000e610b44565b5061000e610a39565b5061000e6109c5565b5061000e61099b565b5061000e61083b565b5061000e61081c565b5061000e61072c565b5061000e6106b9565b5061000e6105d9565b5061000e6104d3565b5061000e61029a565b6001600160e01b031981160361000e57565b503461000e57602036600319011261000e5760206004356102ba81610288565b63ffffffff60e01b166380ac58cd60e01b81149081156102f8575b81156102e7575b506040519015158152f35b6301ffc9a760e01b149050386102dc565b635b5e139f60e01b811491506102d5565b50634e487b7160e01b600052604160045260246000fd5b606081019081106001600160401b0382111761033b57604052565b610343610309565b604052565b602081019081106001600160401b0382111761033b57604052565b604081019081106001600160401b0382111761033b57604052565b608081019081106001600160401b0382111761033b57604052565b90601f801991011681019081106001600160401b0382111761033b57604052565b6020906001600160401b0381116103d7575b601f01601f19160190565b6103df610309565b6103cc565b9291926103f0826103ba565b916103fe6040519384610399565b82948184528183011161000e578281602093846000960137010152565b9080601f8301121561000e57816020610436933591016103e4565b90565b602060031982011261000e57600435906001600160401b03821161000e576104369160040161041b565b60005b8381106104765750506000910152565b8181015183820152602001610466565b9060209161049f81518092818552858086019101610463565b601f01601f1916010190565b90926104c4606093969594608084526080840190610486565b95602083015260408201520152565b503461000e576104e236610439565b6104eb81613254565b54156105835760026105106104ff83613254565b546000526009602052604060002090565b01549061056860036105246104ff84613254565b01549161053081613254565b54906001840361056c57610555600261054e6104ff61055a94613254565b0154613be1565b613b50565b925b604051948594856104ab565b0390f35b600261054e6104ff61057d93613254565b9261055c565b60405162461bcd60e51b815260206004820152601e60248201527f557365726e616d6520646f6573206e6f74206861766520612073636f726500006044820152606490fd5b906020610436928181520190610486565b503461000e576000806003193601126106b657604051908080546105fc8161189e565b8085529160019180831690811561068c5750600114610632575b6105688561062681870382610399565b604051918291826105c8565b80809450527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b82841061067457505050810160200161062682610568610616565b80546020858701810191909152909301928101610659565b8695506105689693506020925061062694915060ff191682840152151560051b8201019293610616565b80fd5b503461000e57602036600319011261000e5760206106d86004356119f0565b6040516001600160a01b039091168152f35b600435906001600160a01b038216820361000e57565b602435906001600160a01b038216820361000e57565b608435906001600160a01b038216820361000e57565b503461000e57604036600319011261000e576107466106ea565b60243561075281611826565b916001600160a01b0380841690821681146107cd576107849361077f913314908115610786575b5061197e565b611eea565b005b6001600160a01b031660009081526005602052604090206107c791506107c09033905b9060018060a01b0316600052602052604060002090565b5460ff1690565b38610779565b60405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608490fd5b503461000e57600036600319011261000e576020600854604051908152f35b503461000e5761016036600319011261000e5760046001600160401b03813581811161000e5761086e903690840161041b565b9060243581811161000e57610886903690850161041b565b60443582811161000e5761089d903690860161041b565b60643583811161000e576108b4903690870161041b565b60843584811161000e576108cb903690880161041b565b60a43585811161000e576108e2903690890161041b565b9060c43586811161000e576108fa9036908a0161041b565b9260e43587811161000e576109129036908b0161041b565b946101043588811161000e5761092b9036908c0161041b565b966101243589811161000e576109449036908d0161041b565b986101443590811161000e576107849b6109609136910161041b565b996120fb565b606090600319011261000e576001600160a01b0390600435828116810361000e5791602435908116810361000e579060443590565b503461000e576107846109ad36610966565b916109c06109bb8433611bbc565b611a82565b611d5c565b503461000e57608036600319011261000e576109df6106ea565b606435906001600160401b03821161000e57610a0261078492369060040161041b565b610a1760018060a01b0360075416331461178b565b610a2d60ff610a258361327a565b5416156132a0565b60443560243583613386565b503461000e576000806003193601126106b657610a6160018060a01b0360075416331461178b565b8080808047818115610a88575b3390f115610a7b57604051f35b610a83611fc1565b604051f35b506108fc610a6e565b96919360a095610adb6101809895610acd610b0998610abf9d9e9d610af5978e6101a0908181520190610486565b8d810360208f015290610486565b908b820360408d0152610486565b91600180891b031660608a015288820360808a0152610486565b9115158487015285820360c0870152610486565b94805160e085015260208101516101008501526040810151610120850152606081015161014085015260808101516101608501520151910152565b503461000e57602036600319011261000e576004356060806000818181610b69613c9b565b93610b75600854611d32565b881080610cdf575b610b8690613ceb565b610ba4610ba06107c08a600052600d602052604060002090565b1590565b15610cca5750505050505050610bb981614678565b90610bd3600261054e836000526009602052604060002090565b91610bf1610beb836000526009602052604060002090565b54613be1565b9060016003610c0a856000526009602052604060002090565b015414610cb3575b9061056891600180610c2e866000526009602052604060002090565b015414610ca3575b610c7c6005610c6e610c5d6004610c57896000526009602052604060002090565b016118d8565b966000526009602052604060002090565b01546001600160a01b031690565b60c082015160e0830151151591610120610100850151940151945b60405198899889610a91565b90610cad90613b50565b90610c36565b9290610cc161056892613b50565b93909150610c12565b61056895969750610cd9613d2e565b96610c97565b50871515610b7d565b503461000e57610784610cfa36610966565b9060405192610d0884610348565b60008452611b19565b606090606319011261000e5760405190610d2a82610320565b6064358252608435602083015260a4358260ff8216820361000e5760400152565b606090608319011261000e5760405190610d6482610320565b608435825260a435602083015260c4358260ff8216820361000e5760400152565b5060c036600319011261000e576044356004356024356001600160401b03831161000e57610dba61078493369060040161041b565b90610e1a610e15610dca36610d11565b610dd860ff610a258761327a565b610de6601a543410156132dd565b6040516020810190610e0d81610dff888a8c338861331a565b03601f198101835282610399565b51902061355b565b613349565b339233613386565b503461000e57602036600319011261000e5760206106d8600435611826565b503461000e57602036600319011261000e576001600160a01b03610e636106ea565b168015610e8c576000526003602052610568604060002054604051918291829190602083019252565b60405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608490fd5b503461000e576000806003193601126106b6576007546001600160a01b03811690610f1033831461178b565b6001600160a01b0319166007556040519082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08284a3f35b5060e036600319011261000e57604435600460643581356024356001600160401b03831161000e57600393610f846110aa943690830161041b565b90610f8e36610d4b565b610f9c601b543410156132dd565b610fb8610fa886611826565b6001600160a01b031633146135ff565b610fea33610fe4610fd86005610c6e8a6000526009602052604060002090565b6001600160a01b031690565b14613655565b61101a610e156040519260208401846110068d898b338661331a565b0394610e0d601f1996878101835282610399565b8161102f866000526009602052604060002090565b0160405161105181611045602082018095613a93565b03848101835282610399565b5190209060405161107760208201928261106b858961323d565b03908101835282610399565b519020036110ae575b50506002611098836000526009602052604060002090565b01556000526009602052604060002090565b0155005b8161112b61113d938360006110da611130966110d48b6000526009602052604060002090565b01613b16565b556111066110fc826110f68b6000526009602052604060002090565b01613b33565b805460ff19169055565b8761111083613254565b55611125886000526009602052604060002090565b01613161565b61327a565b805460ff19166001179055565b3880611080565b503461000e57600036600319011261000e576007546040516001600160a01b039091168152602090f35b503461000e576000806003193601126106b657604051908060018054916111948361189e565b8086529282811690811561068c57506001146111ba576105688561062681870382610399565b92508083527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8284106111fc57505050810160200161062682610568610616565b805460208587018101919091529093019281016111e1565b503461000e57604036600319011261000e5761122e6106ea565b602435801515810361000e576001600160a01b038216913383146112bc578161127961128a9233600052600560205260406000209060018060a01b0316600052602052604060002090565b9060ff801983541691151516179055565b604051901515815233907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190602090a3005b60405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606490fd5b503461000e57602060ff61131761112b36610439565b54166040519015158152f35b503461000e57602036600319011261000e57610568611343600435613d56565b604051918291602083526020830190610486565b503461000e57608036600319011261000e576113716106ea565b611379610700565b606435916001600160401b03831161000e573660238401121561000e576113ad6107849336906024816004013591016103e4565b9160443591611b19565b503461000e57602036600319011261000e576113d16106ea565b6007546001600160a01b0391906113eb908316331461178b565b166bffffffffffffffffffffffff60a01b60195416176019556000604051f35b503461000e57602036600319011261000e576105686113436004356155f9565b503461000e57600061146a61143f36610439565b61145460018060a01b0360075416331461178b565b61145d8161327a565b805460ff19169055613254565b55005b503461000e57602036600319011261000e5761149460018060a01b0360075416331461178b565b6004356000908152600d60205260409020805460ff818116151660ff19909116179055005b503461000e57604036600319011261000e57602060ff6113176114da6106ea565b6114e2610700565b6001600160a01b0391821660009081526005865260408082209290931681526020919091522090565b503461000e57604036600319011261000e5761153260018060a01b0360075416331461178b565b600435601a55602435601b55005b503461000e57602036600319011261000e5761155a6106ea565b6007546001600160a01b0390611573908216331461178b565b81161561158357610784906117d6565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b503461000e5760e036600319011261000e57600480356064356001600160401b03811161000e5761160b903690840161041b565b6116ca611616610716565b61162b60018060a01b0360075416331461178b565b6024356002611644866000526009602052604060002090565b015560a43561165d856000526009602052604060002090565b5560c4356001611677866000526009602052604060002090565b01556044356003611692866000526009602052604060002090565b015560056116aa856000526009602052604060002090565b0180546001600160a01b0319166001600160a01b03909216919091179055565b826116df836000526009602052604060002090565b0160405190816116f3602082018093613a93565b0391611707601f1993848101835282610399565b5190209060405161172160208201928261106b858861323d565b5190200361172b57005b61112b8184611125856000611754610784996110d46111309a6000526009602052604060002090565b556117706110fc846110f6846000526009602052604060002090565b8061177a85613254565b556000526009602052604060002090565b1561179257565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6007549060018060a01b0380911691826bffffffffffffffffffffffff60a01b821617600755167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06000604051a3565b6000908152600260205260409020546001600160a01b031680156118475790565b60405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608490fd5b90600182811c921680156118ce575b60208310146118b857565b634e487b7160e01b600052602260045260246000fd5b91607f16916118ad565b90604051918260008254926118ec8461189e565b90818452600194858116908160001461195b5750600114611918575b505061191692500383610399565b565b9093915060005260209081600020936000915b81831061194357505061191693508201013880611908565b8554888401850152948501948794509183019161192b565b91505061191694506020925060ff191682840152151560051b8201013880611908565b1561198557565b60405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608490fd5b6000818152600260205260409020546001600160a01b031615611a28576000908152600460205260409020546001600160a01b031690565b60405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608490fd5b15611a8957565b60405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608490fd5b60405190602082018281106001600160401b03821117611b0c575b60405260008252565b611b14610309565b611b03565b916119169391611b4093611b306109bb8433611bbc565b611b3b838383611d5c565b6120bf565b611b98565b60809060208152603260208201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60608201520190565b15611b9f57565b60405162461bcd60e51b815280611bb860048201611b45565b0390fd5b6000828152600260205260409020546001600160a01b031615611c5257611be282611826565b9160018060a01b0390818316928285168414948515611c21575b50508315611c0b575b50505090565b611c17919293506119f0565b1614388080611c05565b6001600160a01b0316600090815260056020526040902091945060ff91611c4891906107a9565b5416923880611bfc565b60405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608490fd5b15611cb357565b60405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b50634e487b7160e01b600052601160045260246000fd5b600019810191908211611d2a57565b611916611d04565b9060018201809211611d2a57565b9060028201809211611d2a57565b9060208201809211611d2a57565b90611d6683611826565b6001600160a01b038381169290918216839003611e4157611db5611e1892821694611d92861515611cac565b611d9b87611e94565b6001600160a01b0316600090815260036020526040902090565b611dbf8154611d1b565b90556001600160a01b0381166000908152600360205260409020611de38154611d32565b9055611df9856000526002602052604060002090565b80546001600160a01b0319166001600160a01b03909216919091179055565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000604051a4565b60405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608490fd5b600081815260046020526040812080546001600160a01b03191690556001600160a01b03611ec183611826565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92582604051a4565b600082815260046020526040902080546001600160a01b0319166001600160a01b0383161790556001600160a01b0380611f2384611826565b169116907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256000604051a4565b9081602091031261000e575161043681610288565b610436939260809260018060a01b031682526000602083015260408201528160608201520190610486565b6001600160a01b03918216815291166020820152604081019190915260806060820181905261043692910190610486565b506040513d6000823e3d90fd5b3d15611ff9573d90611fdf826103ba565b91611fed6040519384610399565b82523d6000602084013e565b606090565b909190803b156120b757612030602091600093604051948580948193630a85bd0160e11b998a84523360048501611f65565b03926001600160a01b03165af160009181612087575b5061207957612053611fce565b805190816120745760405162461bcd60e51b815280611bb860048201611b45565b602001fd5b6001600160e01b0319161490565b6120a991925060203d81116120b0575b6120a18183610399565b810190611f50565b9038612046565b503d612097565b505050600190565b92909190823b156120f257612030926020926000604051809681958294630a85bd0160e11b9a8b85523360048601611f90565b50505050600190565b61211060018060a01b0360075416331461178b565b8051906001600160401b03821161227f575b61213682612131600e5461189e565b61228c565b60209081601f84116001146121cd57506121b39661219f6119169e9d9b9761219a6121ae986121bd9f9c966121b89e99896121a99a612195936121a49a6000926121c2575b50508160011b916000199060031b1c191617600e556127bb565b6128b2565b6129a9565b612aa0565b612b97565b612c8e565b612d85565b612e7c565b612f73565b61306a565b01519050388061217b565b600e6000529190601f1984167fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd936000905b8282106122675750506119169e9d9b9761219a6121ae986121bd9f9c966121b89e9960018a6121b39f98936121a49a612195956121a99e61219f9b1061224e575b505050811b01600e556127bb565b015160001960f88460031b161c19169055388080612240565b806001869782949787015181550196019401906121ff565b612287610309565b612122565b601f8111612298575050565b600090600e82527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd906020601f850160051c830194106122f3575b601f0160051c01915b8281106122e857505050565b8181556001016122dc565b90925082906122d3565b601f8111612309575050565b600090600f82527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802906020601f850160051c83019410612364575b601f0160051c01915b82811061235957505050565b81815560010161234d565b9092508290612344565b601f811161237a575050565b600090601082527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672906020601f850160051c830194106123d5575b601f0160051c01915b8281106123ca57505050565b8181556001016123be565b90925082906123b5565b601f81116123eb575050565b600090601182527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68906020601f850160051c83019410612446575b601f0160051c01915b82811061243b57505050565b81815560010161242f565b9092508290612426565b601f811161245c575050565b600090601282527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444906020601f850160051c830194106124b7575b601f0160051c01915b8281106124ac57505050565b8181556001016124a0565b9092508290612497565b601f81116124cd575050565b600090601382527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090906020601f850160051c83019410612528575b601f0160051c01915b82811061251d57505050565b818155600101612511565b9092508290612508565b601f811161253e575050565b600090601482527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec906020601f850160051c83019410612599575b601f0160051c01915b82811061258e57505050565b818155600101612582565b9092508290612579565b601f81116125af575050565b600090601582527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec475906020601f850160051c8301941061260a575b601f0160051c01915b8281106125ff57505050565b8181556001016125f3565b90925082906125ea565b601f8111612620575050565b600090601682527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124289906020601f850160051c8301941061267b575b601f0160051c01915b82811061267057505050565b818155600101612664565b909250829061265b565b601f8111612691575050565b600090601782527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c15906020601f850160051c830194106126ec575b601f0160051c01915b8281106126e157505050565b8181556001016126d5565b90925082906126cc565b601f8111612702575050565b600090601882527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e906020601f850160051c8301941061275d575b601f0160051c01915b82811061275257505050565b818155600101612746565b909250829061273d565b90601f811161277557505050565b600091825260208220906020601f850160051c830194106127b1575b601f0160051c01915b8281106127a657505050565b81815560010161279a565b9092508290612791565b9081516001600160401b0381116128a5575b6127e1816127dc600f5461189e565b6122fd565b602080601f831160011461281d5750819293600092612812575b50508160011b916000199060031b1c191617600f55565b0151905038806127fb565b90601f19831694612850600f6000527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80290565b926000905b87821061288d575050836001959610612874575b505050811b01600f55565b015160001960f88460031b161c19169055388080612869565b80600185968294968601518155019501930190612855565b6128ad610309565b6127cd565b9081516001600160401b03811161299c575b6128d8816128d360105461189e565b61236e565b602080601f83116001146129145750819293600092612909575b50508160011b916000199060031b1c191617601055565b0151905038806128f2565b90601f1983169461294760106000527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67290565b926000905b87821061298457505083600195961061296b575b505050811b01601055565b015160001960f88460031b161c19169055388080612960565b8060018596829496860151815501950193019061294c565b6129a4610309565b6128c4565b9081516001600160401b038111612a93575b6129cf816129ca60115461189e565b6123df565b602080601f8311600114612a0b5750819293600092612a00575b50508160011b916000199060031b1c191617601155565b0151905038806129e9565b90601f19831694612a3e60116000527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6890565b926000905b878210612a7b575050836001959610612a62575b505050811b01601155565b015160001960f88460031b161c19169055388080612a57565b80600185968294968601518155019501930190612a43565b612a9b610309565b6129bb565b9081516001600160401b038111612b8a575b612ac681612ac160125461189e565b612450565b602080601f8311600114612b025750819293600092612af7575b50508160011b916000199060031b1c191617601255565b015190503880612ae0565b90601f19831694612b3560126000527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344490565b926000905b878210612b72575050836001959610612b59575b505050811b01601255565b015160001960f88460031b161c19169055388080612b4e565b80600185968294968601518155019501930190612b3a565b612b92610309565b612ab2565b9081516001600160401b038111612c81575b612bbd81612bb860135461189e565b6124c1565b602080601f8311600114612bf95750819293600092612bee575b50508160011b916000199060031b1c191617601355565b015190503880612bd7565b90601f19831694612c2c60136000527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09090565b926000905b878210612c69575050836001959610612c50575b505050811b01601355565b015160001960f88460031b161c19169055388080612c45565b80600185968294968601518155019501930190612c31565b612c89610309565b612ba9565b9081516001600160401b038111612d78575b612cb481612caf60145461189e565b612532565b602080601f8311600114612cf05750819293600092612ce5575b50508160011b916000199060031b1c191617601455565b015190503880612cce565b90601f19831694612d2360146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec90565b926000905b878210612d60575050836001959610612d47575b505050811b01601455565b015160001960f88460031b161c19169055388080612d3c565b80600185968294968601518155019501930190612d28565b612d80610309565b612ca0565b9081516001600160401b038111612e6f575b612dab81612da660155461189e565b6125a3565b602080601f8311600114612de75750819293600092612ddc575b50508160011b916000199060031b1c191617601555565b015190503880612dc5565b90601f19831694612e1a60156000527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47590565b926000905b878210612e57575050836001959610612e3e575b505050811b01601555565b015160001960f88460031b161c19169055388080612e33565b80600185968294968601518155019501930190612e1f565b612e77610309565b612d97565b9081516001600160401b038111612f66575b612ea281612e9d60165461189e565b612614565b602080601f8311600114612ede5750819293600092612ed3575b50508160011b916000199060031b1c191617601655565b015190503880612ebc565b90601f19831694612f1160166000527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428990565b926000905b878210612f4e575050836001959610612f35575b505050811b01601655565b015160001960f88460031b161c19169055388080612f2a565b80600185968294968601518155019501930190612f16565b612f6e610309565b612e8e565b9081516001600160401b03811161305d575b612f9981612f9460175461189e565b612685565b602080601f8311600114612fd55750819293600092612fca575b50508160011b916000199060031b1c191617601755565b015190503880612fb3565b90601f1983169461300860176000527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c1590565b926000905b87821061304557505083600195961061302c575b505050811b01601755565b015160001960f88460031b161c19169055388080613021565b8060018596829496860151815501950193019061300d565b613065610309565b612f85565b9081516001600160401b038111613154575b6130908161308b60185461189e565b6126f6565b602080601f83116001146130cc57508192936000926130c1575b50508160011b916000199060031b1c191617601855565b0151905038806130aa565b90601f198316946130ff60186000527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e90565b926000905b87821061313c575050836001959610613123575b505050811b01601855565b015160001960f88460031b161c19169055388080613118565b80600185968294968601518155019501930190613104565b61315c610309565b61307c565b91909182516001600160401b038111613230575b61318981613183845461189e565b84612767565b602080601f83116001146131c55750819293946000926131ba575b50508160011b916000199060031b1c1916179055565b0151905038806131a4565b90601f198316956131db85600052602060002090565b926000905b888210613218575050836001959697106131ff575b505050811b019055565b015160001960f88460031b161c191690553880806131f5565b806001859682949686015181550195019301906131e0565b613238610309565b613175565b9061325060209282815194859201610463565b0190565b602061326d918160405193828580945193849201610463565b8101600a81520301902090565b6020613293918160405193828580945193849201610463565b8101600b81520301902090565b156132a757565b60405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b6044820152606490fd5b156132e457565b60405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced040cae8d60931b6044820152606490fd5b9493926060926133449260018060a01b031687526020870152608060408701526080860190610486565b930152565b1561335057565b60405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21031b7bab837b760911b6044820152606490fd5b93926133ef61113092946133ff94600854966001880180981161354e575b6000888152600960205260409020600281018290559081556001810182905560038101919091556133d9908490600490611125565b60056116aa876000526009602052604060002090565b836133f982613254565b5561327a565b60405161340b81610348565b600081526001600160a01b03831691821561350a576000818152600260205260409020546001600160a01b03166134c5578381611b40946134616134b29760018060a01b03166000526003602052604060002090565b61346b8154611d32565b905561348583611df9846000526002602052604060002090565b60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef81604051a4611ffe565b6119166134c0600854611d32565b600855565b60405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606490fd5b606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b613556611d04565b6133a4565b608060009160209360ff6040820151169085815191015191604051938452868401526040830152606082015282805260015afa156135f2575b6000516001600160a01b031680156135bf576019546135bb906001600160a01b0316610fd8565b1490565b60405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642073696760a81b6044820152606490fd5b6135fa611fc1565b613594565b1561360657565b60405162461bcd60e51b815260206004820152602160248201527f596f75206d7573742063757272656e746c79206f776e207468697320746f6b656044820152603760f91b6064820152608490fd5b1561365c57565b606460405162461bcd60e51b815260206004820152602060248201527f4d75737420757365206f726967696e616c206d696e74657220616464726573736044820152fd5b601754600092916136b08261189e565b9160019081811690811561371c57506001146136cb57505050565b909192935060176000527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c15906000915b848310613709575050500190565b81816020925485870152019201916136fb565b60ff191683525050811515909102019150565b600e546000929161373f8261189e565b9160019081811690811561371c575060011461375a57505050565b9091929350600e6000527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd906000915b848310613798575050500190565b818160209254858701520192019161378a565b600f54600092916137bb8261189e565b9160019081811690811561371c57506001146137d657505050565b9091929350600f6000527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802906000915b848310613814575050500190565b8181602092548587015201920191613806565b601054600092916138378261189e565b9160019081811690811561371c575060011461385257505050565b909192935060106000527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672906000915b848310613890575050500190565b8181602092548587015201920191613882565b601254600092916138b38261189e565b9160019081811690811561371c57506001146138ce57505050565b909192935060126000527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444906000915b84831061390c575050500190565b81816020925485870152019201916138fe565b6013546000929161392f8261189e565b9160019081811690811561371c575060011461394a57505050565b909192935060136000527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090906000915b848310613988575050500190565b818160209254858701520192019161397a565b601454600092916139ab8261189e565b9160019081811690811561371c57506001146139c657505050565b909192935060146000527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec906000915b848310613a04575050500190565b81816020925485870152019201916139f6565b60165460009291613a278261189e565b9160019081811690811561371c5750600114613a4257505050565b909192935060166000527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124289906000915b848310613a80575050500190565b8181602092548587015201920191613a72565b600092918154613aa28161189e565b92600191808316908115613afb5750600114613abf575b50505050565b90919293945060005260209081600020906000915b858310613aea5750505050019038808080613ab9565b805485840152918301918101613ad4565b60ff1916845250505081151590910201915038808080613ab9565b6020613b289160405192838092613a93565b600a81520301902090565b6020613b459160405192838092613a93565b600b81520301902090565b9061191660216040518094602d60f81b6020830152613b788151809260208686019101610463565b8101036001810185520183610399565b90613b92826103ba565b613b9f6040519182610399565b8281528092613bb0601f19916103ba565b0190602036910137565b908151811015613bcb570160200190565b634e487b7160e01b600052603260045260246000fd5b8015613c7d576000818181805b613c535750613bfc81613b88565b935b613c085750505090565b613c1190611d1b565b90600a9060308282068101809111613c46575b60f81b6001600160f81b031916841a613c3d8487613bba565b53049081613bfe565b613c4e611d04565b613c24565b91506001600a916000198114613c70575b01910480849291613bee565b613c78611d04565b613c64565b50604051613c8a81610363565b60018152600360fc1b602082015290565b6040519060c082018281106001600160401b03821117613cde575b6040528160a06000918281528260208201528260408201528260608201528260808201520152565b613ce6610309565b613cb6565b15613cf257565b60405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606490fd5b60405190613d3b82610363565b600c82526b151bdad95b88131bd8dad95960a21b6020830152565b60085460018101809111613db3575b811080613daa575b613d7690613ceb565b80600052600d60205260ff6040600020541615600014613da157613d9c61018091614678565b015190565b50610436613d2e565b50801515613d6d565b613dbb611d04565b613d65565b604051906101a082018281106001600160401b03821117613e3b575b6040528161018060009182815282602082015282604082015260609280848301528360808301528060a08301528360c083015260e082015282610100820152613e23613c9b565b61012082015282610140820152826101608201520152565b613e43610309565b613ddc565b60405190613e5582610363565b6008825267706f73697469766560c01b6020830152565b60405190613e7982610363565b60068252653634b732b0b960d11b6020830152565b60405190613e9b82610363565b600782526613995d5d1c985b60ca1b6020830152565b60405190613ebe82610363565b600582526466616c736560d81b6020830152565b60405190613edf82610363565b60088252676e6567617469766560c01b6020830152565b60405190613f0382610363565b6004825263115d9a5b60e21b6020830152565b60405190613f2382610363565b600982526814995cd95b9d199d5b60ba1b6020830152565b60405190613f4882610363565b60098252684f6666656e7369766560b81b6020830152565b60405190613f6d82610363565b600882526714dc1a5d19599d5b60c21b6020830152565b60405190613f9182610363565b60078252664865696e6f757360c81b6020830152565b60405190613fb482610363565b60068252655374696e677960d01b6020830152565b60405190613fd682610363565b60068252654c6f76696e6760d01b6020830152565b60405190613ff882610363565b600a825269416c747275697374696360b01b6020830152565b6040519061401e82610363565b600d82526c436f6d70617373696f6e61746560981b6020830152565b6040519061404782610363565b600b82526a12da5b991a19585c9d195960aa1b6020830152565b6040519061406e82610363565b600a825269537570706f727469766560b01b6020830152565b6040519061409482610363565b6008825267467269656e646c7960c01b6020830152565b60229061191692949360405195826140cd889451809260208088019101610463565b830190600b60fa1b918260208201526140f0825180936020602185019101610463565b0190602182015261410a8251809360208785019101610463565b01036002810185520183610399565b6119169061416061415b6020809695614155614142604051998a9761414f614142838b0161372f565b9182815194859201610463565b016137ab565b01613827565b6138a3565b03601f198101845283610399565b6119169061416061419d6020809695614155614142604051998a97614197614142838b0161391f565b0161399b565b613a17565b9190614142906141c860405194859261415560209586809461414f614142838a0161372f565b91600092601154916141d98361189e565b9260019081811690811561425f5750600114614200575b50505050614160611916926138a3565b909192945060116000527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68906000915b86831061424b575050509201915061416061191638806141f0565b805483860152889550918301918101614230565b60ff1916845250505081151590910201915061416061191638806141f0565b9190614142906142a4604051948592614155602095868094614197614142838a0161391f565b91600092601554916142b58361189e565b9260019081811690811561433b57506001146142dc575b5050505061416061191692613a17565b909192945060156000527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec475906000915b868310614327575050509201915061416061191638806142cc565b80548386015288955091830191810161430c565b60ff1916845250505081151590910201915061416061191638806142cc565b6040519061436782610363565b60048252637472756560e01b6020830152565b6040519061438782610363565b60068252651c98591a585b60d21b6020830152565b99979593919b9a98969492909b6040519c8d809c602082017f2c2261747472696275746573223a5b7b2274726169745f74797065223a22677290527030b234b2b73a1116113b30b63ab2911d1160791b604083015280516051819301916020019161440692610463565b8c0160518101614435907f227d2c7b2274726169745f74797065223a227231222c2276616c7565223a22009052565b6070016144419161323d565b7f227d2c7b2274726169745f74797065223a226731222c2276616c7565223a22008152601f016144709161323d565b7f227d2c7b2274726169745f74797065223a226231222c2276616c7565223a22008152601f0161449f9161323d565b7f227d2c7b2274726169745f74797065223a227232222c2276616c7565223a22008152601f016144ce9161323d565b7f227d2c7b2274726169745f74797065223a226732222c2276616c7565223a22008152601f016144fd9161323d565b7f227d2c7b2274726169745f74797065223a226232222c2276616c7565223a22008152601f0161452c9161323d565b7f227d2c7b2274726169745f74797065223a22737461747573222c2276616c7565815262111d1160e91b60208201526023016145679161323d565b7f227d2c7b2274726169745f74797065223a22616e696d61746564222c2276616c8152643ab2911d1160d91b60208201526025016145a49161323d565b7f227d2c7b2274726169745f74797065223a227369676e222c2276616c7565223a8152601160f91b60208201526021016145dd9161323d565b7f227d2c7b2274726169745f74797065223a2273636f7265222c2276616c7565228152611d1160f11b60208201526022016146179161323d565b7f227d2c7b2274726169745f74797065223a226f726967696e616c2073636f726581526a1116113b30b63ab2911d1160a91b6020820152602b0161465a9161323d565b62227d5d60e81b815203601c19810183526003016119169083610399565b6148c3614683613dc0565b91600261469a826000526009602052604060002090565b01549060036146b3826000526009602052604060002090565b0154906146be613e48565b9060c08601906146cc613e6c565b825261010087016146db613e8e565b81526146e5613eb1565b92886146fe610beb856000526009602052604060002090565b97600180614716876000526009602052604060002090565b015414614ac5575b614737600261054e876000526009602052604060002090565b976149ee5760198111806149e3575b1561493e57614753614087565b84525b61475f85614ad5565b9461479761477561012085019780895251613be1565b614783602089510151613be1565b61479160408a510151613be1565b916140ab565b906147c56147a9606089510151613be1565b6147b760808a510151613be1565b61479160a08b510151613be1565b926101606147d38585614119565b950194855260556147e48383614d48565b11156148f55760639161480c916147fb868661416e565b875261480561437a565b8852614dbd565b116148cc575b505061486061483c915b51610dff614847865161483c6148428d604051988997602089019061323d565b9061323d565b6136a0565b6c1e17ba32bc3a1f1e17b9bb339f60991b8152600d0190565b6101808a01525191614873815151613be1565b614881602083510151613be1565b61488f604084510151613be1565b9061489e606085510151613be1565b926148bb60a06148b2608088510151613be1565b96510151613be1565b95519661439c565b61014082015290565b6148d792965061427e565b8452600160e08a015261483c6148606148ee61435a565b9591614812565b60619161490191614d79565b11614915575b505061486061483c9161481c565b6149209296506141a2565b8452600160e08a015261483c61486061493761435a565b9591614907565b604b8111806149d8575b1561495d57614955614061565b84525b614756565b60738111806149cd575b156149745761495561403a565b60af8111806149c1575b1561498b57614955614011565b61012c8111806149b5575b156149a357614955613feb565b6101f481111561495857614955613fc9565b506101f4811115614996565b5061012c81111561497e565b5060af811115614967565b506073811115614948565b50604b811115614746565b955050946149fb90613b50565b9488614a05613ed2565b956019811180614aba575b15614a1d57614955613fa7565b604b811180614aaf575b15614a3457614955613f84565b6073811180614aa4575b15614a4b57614955613f60565b60af811180614a98575b15614a6257614955613f3b565b61012c811180614a8c575b15614a7a57614955613f16565b6101f481111561495857614955613ef6565b506101f4811115614a6d565b5061012c811115614a55565b5060af811115614a3e565b506073811115614a27565b50604b811115614a10565b97614acf90613b50565b9761471e565b90614ade613c9b565b916003614af5826000526009602052604060002090565b01549060016002614b10836000526009602052604060002090565b01549214614c36576101f4821080614b7b575081614b3182614b74946153e7565b8552614b3d8282615423565b6020860152614b4c828261545f565b6040860152614b5b8282615489565b6060860152614b6a82826154c5565b6080860152615501565b60a0830152565b60c883119081614c2e575b5015614bdd5781614b9a82614b749461527f565b8552614ba682826152bb565b6020860152614bb582826152f7565b6040860152614bc48282615333565b6060860152614bd3828261536f565b60808601526153ab565b81614beb82614b749461514d565b8552614bf78282615177565b6020860152614c0682826151b3565b6040860152614c1582826151dd565b6060860152614c248282615207565b6080860152615243565b905038614b86565b60c8821080614c91575081614c4e82614b7494615093565b8552614c5a82826150bd565b6020860152614c6982826150e7565b6040860152614c788282615111565b6060860152614c878282615093565b60808601526150e7565b80614d3e575b15614ced5781614caa82614b7494614f61565b8552614cb68282614f8b565b6020860152614cc58282614fb5565b6040860152614cd48282614fdf565b6060860152614ce3828261501b565b6080860152615057565b81614cfb82614b7494614df9565b8552614d078282614e35565b6020860152614d168282614e71565b6040860152614d258282614ead565b6060860152614d348282614ee9565b6080860152614f25565b50604b8211614c97565b906065916040519060208201923060601b84526034830152605482015260548152614d728161037e565b5190200690565b906063916040519060208201923060601b84526034830152605482015260548152614da38161037e565b5190200660028101809111614db55790565b610436611d04565b906065916040519060208201923060601b84526034830152605482015260548152614de78161037e565b5190200660018101809111614db55790565b906033916040519060208201923060601b84526034830152605482015260548152614e238161037e565b5190200660328101809111614db55790565b906032916040519060208201923060601b84526034830152605482015260548152614e5f8161037e565b5190200660338101809111614db55790565b906031916040519060208201923060601b84526034830152605482015260548152614e9b8161037e565b5190200660348101809111614db55790565b906030916040519060208201923060601b84526034830152605482015260548152614ed78161037e565b5190200660358101809111614db55790565b90602f916040519060208201923060601b84526034830152605482015260548152614f138161037e565b5190200660368101809111614db55790565b90602e916040519060208201923060601b84526034830152605482015260548152614f4f8161037e565b5190200660378101809111614db55790565b906033916040519060208201923060601b84526034830152605482015260548152614d728161037e565b906031916040519060208201923060601b84526034830152605482015260548152614de78161037e565b90602f916040519060208201923060601b84526034830152605482015260548152614da38161037e565b90602d916040519060208201923060601b845260348301526054820152605481526150098161037e565b5190200660038101809111614db55790565b90602b916040519060208201923060601b845260348301526054820152605481526150458161037e565b5190200660048101809111614db55790565b906029916040519060208201923060601b845260348301526054820152605481526150818161037e565b5190200660058101809111614db55790565b906006916040519060208201923060601b84526034830152605482015260548152614d728161037e565b906006916040519060208201923060601b84526034830152605482015260548152614de78161037e565b90600a916040519060208201923060601b84526034830152605482015260548152614d728161037e565b90601a916040519060208201923060601b8452603483015260548201526054815261513b8161037e565b51902006607d8101809111614db55790565b906064916040519060208201923060601b84526034830152605482015260548152614e5f8161037e565b906065916040519060208201923060601b845260348301526054820152605481526151a18161037e565b5190200660318101809111614db55790565b906061916040519060208201923060601b84526034830152605482015260548152614e9b8161037e565b90605f916040519060208201923060601b84526034830152605482015260548152614ed78161037e565b906063916040519060208201923060601b845260348301526054820152605481526152318161037e565b5190200660308101809111614db55790565b906059916040519060208201923060601b8452603483015260548201526054815261526d8161037e565b5190200660398101809111614db55790565b90606a916040519060208201923060601b845260348301526054820152605481526152a98161037e565b5190200660968101809111614db55790565b906069916040519060208201923060601b845260348301526054820152605481526152e58161037e565b5190200660978101809111614db55790565b906068916040519060208201923060601b845260348301526054820152605481526153218161037e565b5190200660988101809111614db55790565b90606b916040519060208201923060601b8452603483015260548201526054815261535d8161037e565b5190200660958101809111614db55790565b90606c916040519060208201923060601b845260348301526054820152605481526153998161037e565b5190200660948101809111614db55790565b906067916040519060208201923060601b845260348301526054820152605481526153d58161037e565b5190200660998101809111614db55790565b906033916040519060208201923060601b845260348301526054820152605481526154118161037e565b5190200660cd8101809111614db55790565b90600f916040519060208201923060601b8452603483015260548201526054815261544d8161037e565b5190201660c88101809111614db55790565b90601f916040519060208201923060601b84526034830152605482015260548152614d728161037e565b90600d916040519060208201923060601b845260348301526054820152605481526154b38161037e565b5190200660bc8101809111614db55790565b90600e916040519060208201923060601b845260348301526054820152605481526154ef8161037e565b5190200660bb8101809111614db55790565b90600f916040519060208201923060601b8452603483015260548201526054815261552b8161037e565b5190200660ba8101809111614db55790565b60405190600082601854916155518361189e565b808352926001908181169081156155d75750600114615578575b5061191692500383610399565b6018600090815291507fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e5b8483106155bc575061191693505081016020013861556b565b81935090816020925483858a010152019101909185926155a3565b90506020925061191694915060ff191682840152151560051b8201013861556b565b615604600854611d32565b8110806158c4575b61561590613ceb565b61562f610ba06107c083600052600d602052604060002090565b15615794576104366156f361575f836157466157396156696156636004610c5761106b9a6000526009602052604060002090565b93614678565b61483c61572c61014061568061018085015161596f565b9301519261483c604051998a9861483c6156b86156b260208d01600b906a01ec89b985b59488e8808960ae1b81520190565b8361323d565b7f222c20226465736372697074696f6e223a2022506f736974697669747920536381526801bdc9948199bdc88160be1b602082015260290190565b7f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b81526618985cd94d8d0b60ca1b602082015260270190565b601160f91b815260010190565b607d60f81b815260010190565b039161575a601f1993848101835282610399565b61596f565b6040517f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006020820152938491603d830161483c565b5061106b6104366158b661575f6157ac61575a61553d565b61574660405193849261483c6020850160c9907f7b226e616d65223a2022546f6b656e204c6f636b6564222c202264657363726981527f7074696f6e223a2022556e666f7274756e6174656c792c207468697320746f6b60208201527f656e20686173206265656e206d616e75616c6c79206c6f636b65642e204d6f7360408201527f74206c696b656c792064756520746f20612075736572206d616c6963696f757360608201527f6c7920747279696e6720746f2063726561746520612066616c73652073636f7260808201527f652e222c2022696d616765223a2022646174613a696d6167652f7376672b786d60a0820152681b0ed8985cd94d8d0b60ba1b60c08201520190565b61227d60f01b815260020190565b5080151561560c565b6001600160fe1b0381116001166158e5575b60021b90565b6158ed611d04565b6158df565b60405190606082018281106001600160401b03821117615962575b604052604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b61596a610309565b61590d565b8051908115615a625761599361598e61598784611d40565b6003900490565b6158cd565b916159a56159a084611d4e565b613b88565b906159ae6158f2565b92600092602081015b8484811015615a1b5790600491600380910196850101516001603f9080828460121c168b010151918a60ff9384848488600c1c1684010151168585600894868a60061c160101511691831b01821b01901b93168a010151160160e01b8152016159b7565b509350949350506003900680600114615a4e57600214615a3c575b50815290565b603d60f81b6000199091015238615a36565b50613d3d60f01b6001199091015238615a36565b5050610436611ae856fea264697066735822122085e6c1c8ac5b8a7e1a5cdfe4f31e5a3fe405c4d7c627b57ed3951d85d63c90e064736f6c63430008100033

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

0000000000000000000000005a9fdefaf662aa7b309a83f8a423eed086547091

-----Decoded View---------------
Arg [0] : _adminSigner (address): 0x5A9fDefaf662aA7B309a83F8a423eeD086547091

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005a9fdefaf662aa7b309a83f8a423eed086547091


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.