{
  "_format": "hh-sol-artifact-1",
  "contractName": "NFTMarketplace",
  "sourceName": "contracts/NFTMarketplace.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address payable",
          "name": "_feeRecipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_feePercentage",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "seller",
          "type": "address"
        }
      ],
      "name": "ItemCanceled",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "seller",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        }
      ],
      "name": "ItemListed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "buyer",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "seller",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "marketplaceFee",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "royaltyFee",
          "type": "uint256"
        }
      ],
      "name": "ItemSold",
      "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"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "buyItem",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "royaltyPercentage",
          "type": "uint256"
        }
      ],
      "name": "calculateFees",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "marketplaceFee",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "royaltyFee",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "sellerAmount",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "cancelListing",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "emergencyWithdraw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "feePercentage",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "feeRecipient",
      "outputs": [
        {
          "internalType": "address payable",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "getListing",
      "outputs": [
        {
          "internalType": "address",
          "name": "seller",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "royaltyPercentage",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "royaltyRecipient",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "isListed",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "royaltyPercentage",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "royaltyRecipient",
          "type": "address"
        }
      ],
      "name": "listItem",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "listings",
      "outputs": [
        {
          "internalType": "address",
          "name": "seller",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "royaltyPercentage",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "royaltyRecipient",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "name": "onERC721Received",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "supportedTokenStandards",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "newFeePercentage",
          "type": "uint256"
        }
      ],
      "name": "updateFeePercentage",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address payable",
          "name": "newFeeRecipient",
          "type": "address"
        }
      ],
      "name": "updateFeeRecipient",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "newPrice",
          "type": "uint256"
        }
      ],
      "name": "updatePrice",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "supported",
          "type": "bool"
        }
      ],
      "name": "updateSupportedTokenStandard",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "withdrawBalance",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "stateMutability": "payable",
      "type": "receive"
    }
  ],
  "bytecode": "0x60806040523480156200001157600080fd5b5060405162001afe38038062001afe83398101604081905262000034916200015f565b600160005562000044336200010d565b6001600160a01b038216620000a05760405162461bcd60e51b815260206004820152601560248201527f496e76616c69642066656520726563697069656e74000000000000000000000060448201526064015b60405180910390fd5b6103e8811115620000e35760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b604482015260640162000097565b600280546001600160a01b0319166001600160a01b0393909316929092179091556003556200019b565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080604083850312156200017357600080fd5b82516001600160a01b03811681146200018b57600080fd5b6020939093015192949293505050565b61195380620001ab6000396000f3fe60806040526004361061012d5760003560e01c80638da5cb5b116100ab578063cdb3cd251161006f578063cdb3cd2514610460578063db2e21bc146104a9578063e57d6fb7146104be578063f160d369146104de578063f2fde38b146104fe578063f3fee54a1461051e57600080fd5b80638da5cb5b146103bb5780639f37092a146103d9578063a001ecdd146103ec578063b2ddee0614610410578063cbdb7b8d1461043057600080fd5b80635fd8c710116100f25780635fd8c710146102a75780636cad3fb0146102bc5780637096335b146102dc578063715018a61461031757806388700d1c1461032c57600080fd5b806207df301461013957806301ffc9a7146101d8578063150b7a0214610208578063469048401461024d57806358a72ad01461028557600080fd5b3661013457005b600080fd5b34801561014557600080fd5b5061019b61015436600461165b565b60046020818152600093845260408085209091529183529120805460018201546002830154600384015493909401546001600160a01b0392831694919360ff909216921685565b604080516001600160a01b0396871681526020810195909552921515928401929092526060830152909116608082015260a0015b60405180910390f35b3480156101e457600080fd5b506101f86101f3366004611687565b61053e565b60405190151581526020016101cf565b34801561021457600080fd5b506102346102233660046116b8565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016101cf565b34801561025957600080fd5b5060025461026d906001600160a01b031681565b6040516001600160a01b0390911681526020016101cf565b34801561029157600080fd5b506102a56102a0366004611765565b610575565b005b3480156102b357600080fd5b506102a56105a8565b3480156102c857600080fd5b506102a56102d736600461179e565b610697565b3480156102e857600080fd5b506102fc6102f73660046117b7565b6106e5565b604080519384526020840192909252908201526060016101cf565b34801561032357600080fd5b506102a561073e565b34801561033857600080fd5b5061019b61034736600461165b565b6001600160a01b03918216600090815260046020818152604080842094845293815291839020835160a081018552815486168082526001830154948201859052600283015460ff16151595820186905260038301546060830181905292909301549095166080909501859052909491939091565b3480156103c757600080fd5b506001546001600160a01b031661026d565b6102a56103e736600461165b565b610752565b3480156103f857600080fd5b5061040260035481565b6040519081526020016101cf565b34801561041c57600080fd5b506102a561042b36600461165b565b610c63565b34801561043c57600080fd5b506101f861044b3660046117d9565b60056020526000908152604090205460ff1681565b34801561046c57600080fd5b506101f861047b36600461165b565b6001600160a01b03919091166000908152600460209081526040808320938352929052206002015460ff1690565b3480156104b557600080fd5b506102a5610e2f565b3480156104ca57600080fd5b506102a56104d93660046117f6565b610eec565b3480156104ea57600080fd5b506102a56104f93660046117d9565b610fff565b34801561050a57600080fd5b506102a56105193660046117d9565b611073565b34801561052a57600080fd5b506102a561053936600461182b565b6110ec565b60006301ffc9a760e01b6001600160e01b03198316148061056f5750630a85bd0160e11b6001600160e01b03198316145b92915050565b61057d611541565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6105b0611541565b47806105fc5760405162461bcd60e51b81526020600482015260166024820152754e6f2062616c616e636520746f20776974686472617760501b60448201526064015b60405180910390fd5b6002546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610649576040519150601f19603f3d011682016040523d82523d6000602084013e61064e565b606091505b50509050806106935760405162461bcd60e51b815260206004820152601160248201527015da5d1a191c985dd85b0819985a5b1959607a1b60448201526064016105f3565b5050565b61069f611541565b6103e88111156106e05760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b60448201526064016105f3565b600355565b6000806000612710600354866106fb9190611897565b61070591906118ae565b92506127106107148587611897565b61071e91906118ae565b91508161072b84876118d0565b61073591906118d0565b90509250925092565b610746611541565b610750600061159b565b565b61075a6115ed565b6001600160a01b038083166000908152600460208181526040808420868552825292839020835160a081018552815486168152600182015492810192909252600281015460ff161515938201849052600381015460608301529091015490921660808301526107ff5760405162461bcd60e51b81526020600482015260116024820152704974656d206e6f7420666f722073616c6560781b60448201526064016105f3565b806020015134101561084a5760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b60448201526064016105f3565b6001600160a01b038316600090815260046020908152604080832085845282528220600201805460ff19169055600354908301516127109161088b91611897565b61089591906118ae565b60808301519091506000906001600160a01b0316158015906108bb575060008360600151115b156108e457612710836060015184602001516108d79190611897565b6108e191906118ae565b90505b6000818385602001516108f791906118d0565b61090191906118d0565b6040516323b872dd60e01b8152306004820152336024820152604481018790529091506001600160a01b038716906323b872dd90606401600060405180830381600087803b15801561095257600080fd5b505af1158015610966573d6000803e3d6000fd5b5050600254604051600093506001600160a01b03909116915085908381818185875af1925050503d80600081146109b9576040519150601f19603f3d011682016040523d82523d6000602084013e6109be565b606091505b5050905080610a055760405162461bcd60e51b8152602060048201526013602482015272119959481d1c985b9cd9995c8819985a5b1959606a1b60448201526064016105f3565b8215610ab457600085608001516001600160a01b03168460405160006040518083038185875af1925050503d8060008114610a5c576040519150601f19603f3d011682016040523d82523d6000602084013e610a61565b606091505b5050905080610ab25760405162461bcd60e51b815260206004820152601760248201527f526f79616c7479207472616e73666572206661696c656400000000000000000060448201526064016105f3565b505b84516040516000916001600160a01b03169084908381818185875af1925050503d8060008114610b00576040519150601f19603f3d011682016040523d82523d6000602084013e610b05565b606091505b5050905080610b4e5760405162461bcd60e51b815260206004820152601560248201527414d95b1b195c881c185e5b595b9d0819985a5b1959605a1b60448201526064016105f3565b8560200151341115610bf25760208601516000903390610b6e90346118d0565b604051600081818185875af1925050503d8060008114610baa576040519150601f19603f3d011682016040523d82523d6000602084013e610baf565b606091505b5050905080610bf05760405162461bcd60e51b815260206004820152600d60248201526c1499599d5b990819985a5b1959609a1b60448201526064016105f3565b505b8551602080880151604080516001600160a01b0394851681529283019190915281018790526060810186905233918991908b16907f5478ad3f04f76c56cdccdbf76c58bc9a46a20205d5264da270a05e23ca683ac09060800160405180910390a45050505050506106936001600055565b610c6b6115ed565b6001600160a01b038083166000908152600460208181526040808420868552825292839020835160a081018552815486168152600182015492810192909252600281015460ff16151593820184905260038101546060830152909101549092166080830152610d0e5760405162461bcd60e51b815260206004820152600f60248201526e125d195b481b9bdd081b1a5cdd1959608a1b60448201526064016105f3565b80516001600160a01b03163314610d605760405162461bcd60e51b815260206004820152601660248201527513db9b1e481cd95b1b195c8818d85b8818d85b98d95b60521b60448201526064016105f3565b6001600160a01b038316600081815260046020818152604080842087855290915291829020600201805460ff1916905590516323b872dd60e01b81523091810191909152336024820152604481018490526323b872dd90606401600060405180830381600087803b158015610dd457600080fd5b505af1158015610de8573d6000803e3d6000fd5b50506040513392508491506001600160a01b038616907fc448b641f9d136b2082a1543ddddd8b6f8b86576bc444a187505ea3934bac2f890600090a4506106936001600055565b610e37611541565b476000610e4c6001546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114610e96576040519150601f19603f3d011682016040523d82523d6000602084013e610e9b565b606091505b50509050806106935760405162461bcd60e51b815260206004820152601b60248201527f456d657267656e6379207769746864726177616c206661696c6564000000000060448201526064016105f3565b6001600160a01b03831660009081526004602090815260408083208584529091529020600281015460ff16610f555760405162461bcd60e51b815260206004820152600f60248201526e125d195b481b9bdd081b1a5cdd1959608a1b60448201526064016105f3565b80546001600160a01b03163314610fa75760405162461bcd60e51b81526020600482015260166024820152754f6e6c792073656c6c65722063616e2075706461746560501b60448201526064016105f3565b60008211610ff75760405162461bcd60e51b815260206004820152601f60248201527f5072696365206d7573742062652067726561746572207468616e207a65726f0060448201526064016105f3565b600101555050565b611007611541565b6001600160a01b0381166110515760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081c9958da5c1a595b9d607a1b60448201526064016105f3565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b61107b611541565b6001600160a01b0381166110e05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105f3565b6110e98161159b565b50565b6110f46115ed565b600083116111445760405162461bcd60e51b815260206004820152601f60248201527f5072696365206d7573742062652067726561746572207468616e207a65726f0060448201526064016105f3565b61012c8211156111965760405162461bcd60e51b815260206004820152601860248201527f526f79616c74792070657263656e7420746f6f2068696768000000000000000060448201526064016105f3565b6040516331a9108f60e11b815260048101859052859033906001600160a01b03831690636352211e90602401602060405180830381865afa1580156111df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120391906118e3565b6001600160a01b03161461124b5760405162461bcd60e51b815260206004820152600f60248201526e2737ba103a37b5b2b71037bbb732b960891b60448201526064016105f3565b60405163020604bf60e21b81526004810186905230906001600160a01b0383169063081812fc90602401602060405180830381865afa158015611292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b691906118e3565b6001600160a01b03161480611334575060405163e985e9c560e01b81523360048201523060248201526001600160a01b0382169063e985e9c590604401602060405180830381865afa158015611310573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113349190611900565b6113785760405162461bcd60e51b815260206004820152601560248201527410dbdb9d1c9858dd081b9bdd08185c1c1c9bdd9959605a1b60448201526064016105f3565b6040516323b872dd60e01b8152336004820152306024820152604481018690526001600160a01b038216906323b872dd90606401600060405180830381600087803b1580156113c657600080fd5b505af11580156113da573d6000803e3d6000fd5b505050506040518060a00160405280336001600160a01b03168152602001858152602001600115158152602001848152602001836001600160a01b031681525060046000886001600160a01b03166001600160a01b03168152602001908152602001600020600087815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020160006101000a81548160ff0219169083151502179055506060820151816003015560808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050336001600160a01b031685876001600160a01b03167fb29a3c5d9c9eb8230bd277c54293a0a15e98cd5592a3e0d470fe9ce59fed54f18760405161152791815260200190565b60405180910390a45061153a6001600055565b5050505050565b6001546001600160a01b031633146107505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105f3565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60026000540361163f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105f3565b6002600055565b6001600160a01b03811681146110e957600080fd5b6000806040838503121561166e57600080fd5b823561167981611646565b946020939093013593505050565b60006020828403121561169957600080fd5b81356001600160e01b0319811681146116b157600080fd5b9392505050565b6000806000806000608086880312156116d057600080fd5b85356116db81611646565b945060208601356116eb81611646565b935060408601359250606086013567ffffffffffffffff8082111561170f57600080fd5b818801915088601f83011261172357600080fd5b81358181111561173257600080fd5b89602082850101111561174457600080fd5b9699959850939650602001949392505050565b80151581146110e957600080fd5b6000806040838503121561177857600080fd5b823561178381611646565b9150602083013561179381611757565b809150509250929050565b6000602082840312156117b057600080fd5b5035919050565b600080604083850312156117ca57600080fd5b50508035926020909101359150565b6000602082840312156117eb57600080fd5b81356116b181611646565b60008060006060848603121561180b57600080fd5b833561181681611646565b95602085013595506040909401359392505050565b600080600080600060a0868803121561184357600080fd5b853561184e81611646565b9450602086013593506040860135925060608601359150608086013561187381611646565b809150509295509295909350565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761056f5761056f611881565b6000826118cb57634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561056f5761056f611881565b6000602082840312156118f557600080fd5b81516116b181611646565b60006020828403121561191257600080fd5b81516116b18161175756fea2646970667358221220645f72b3c4810c3296d07297e886e89fab60e273384bde7b791759fb7a32718564736f6c63430008130033",
  "deployedBytecode": "0x60806040526004361061012d5760003560e01c80638da5cb5b116100ab578063cdb3cd251161006f578063cdb3cd2514610460578063db2e21bc146104a9578063e57d6fb7146104be578063f160d369146104de578063f2fde38b146104fe578063f3fee54a1461051e57600080fd5b80638da5cb5b146103bb5780639f37092a146103d9578063a001ecdd146103ec578063b2ddee0614610410578063cbdb7b8d1461043057600080fd5b80635fd8c710116100f25780635fd8c710146102a75780636cad3fb0146102bc5780637096335b146102dc578063715018a61461031757806388700d1c1461032c57600080fd5b806207df301461013957806301ffc9a7146101d8578063150b7a0214610208578063469048401461024d57806358a72ad01461028557600080fd5b3661013457005b600080fd5b34801561014557600080fd5b5061019b61015436600461165b565b60046020818152600093845260408085209091529183529120805460018201546002830154600384015493909401546001600160a01b0392831694919360ff909216921685565b604080516001600160a01b0396871681526020810195909552921515928401929092526060830152909116608082015260a0015b60405180910390f35b3480156101e457600080fd5b506101f86101f3366004611687565b61053e565b60405190151581526020016101cf565b34801561021457600080fd5b506102346102233660046116b8565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016101cf565b34801561025957600080fd5b5060025461026d906001600160a01b031681565b6040516001600160a01b0390911681526020016101cf565b34801561029157600080fd5b506102a56102a0366004611765565b610575565b005b3480156102b357600080fd5b506102a56105a8565b3480156102c857600080fd5b506102a56102d736600461179e565b610697565b3480156102e857600080fd5b506102fc6102f73660046117b7565b6106e5565b604080519384526020840192909252908201526060016101cf565b34801561032357600080fd5b506102a561073e565b34801561033857600080fd5b5061019b61034736600461165b565b6001600160a01b03918216600090815260046020818152604080842094845293815291839020835160a081018552815486168082526001830154948201859052600283015460ff16151595820186905260038301546060830181905292909301549095166080909501859052909491939091565b3480156103c757600080fd5b506001546001600160a01b031661026d565b6102a56103e736600461165b565b610752565b3480156103f857600080fd5b5061040260035481565b6040519081526020016101cf565b34801561041c57600080fd5b506102a561042b36600461165b565b610c63565b34801561043c57600080fd5b506101f861044b3660046117d9565b60056020526000908152604090205460ff1681565b34801561046c57600080fd5b506101f861047b36600461165b565b6001600160a01b03919091166000908152600460209081526040808320938352929052206002015460ff1690565b3480156104b557600080fd5b506102a5610e2f565b3480156104ca57600080fd5b506102a56104d93660046117f6565b610eec565b3480156104ea57600080fd5b506102a56104f93660046117d9565b610fff565b34801561050a57600080fd5b506102a56105193660046117d9565b611073565b34801561052a57600080fd5b506102a561053936600461182b565b6110ec565b60006301ffc9a760e01b6001600160e01b03198316148061056f5750630a85bd0160e11b6001600160e01b03198316145b92915050565b61057d611541565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6105b0611541565b47806105fc5760405162461bcd60e51b81526020600482015260166024820152754e6f2062616c616e636520746f20776974686472617760501b60448201526064015b60405180910390fd5b6002546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610649576040519150601f19603f3d011682016040523d82523d6000602084013e61064e565b606091505b50509050806106935760405162461bcd60e51b815260206004820152601160248201527015da5d1a191c985dd85b0819985a5b1959607a1b60448201526064016105f3565b5050565b61069f611541565b6103e88111156106e05760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b60448201526064016105f3565b600355565b6000806000612710600354866106fb9190611897565b61070591906118ae565b92506127106107148587611897565b61071e91906118ae565b91508161072b84876118d0565b61073591906118d0565b90509250925092565b610746611541565b610750600061159b565b565b61075a6115ed565b6001600160a01b038083166000908152600460208181526040808420868552825292839020835160a081018552815486168152600182015492810192909252600281015460ff161515938201849052600381015460608301529091015490921660808301526107ff5760405162461bcd60e51b81526020600482015260116024820152704974656d206e6f7420666f722073616c6560781b60448201526064016105f3565b806020015134101561084a5760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b60448201526064016105f3565b6001600160a01b038316600090815260046020908152604080832085845282528220600201805460ff19169055600354908301516127109161088b91611897565b61089591906118ae565b60808301519091506000906001600160a01b0316158015906108bb575060008360600151115b156108e457612710836060015184602001516108d79190611897565b6108e191906118ae565b90505b6000818385602001516108f791906118d0565b61090191906118d0565b6040516323b872dd60e01b8152306004820152336024820152604481018790529091506001600160a01b038716906323b872dd90606401600060405180830381600087803b15801561095257600080fd5b505af1158015610966573d6000803e3d6000fd5b5050600254604051600093506001600160a01b03909116915085908381818185875af1925050503d80600081146109b9576040519150601f19603f3d011682016040523d82523d6000602084013e6109be565b606091505b5050905080610a055760405162461bcd60e51b8152602060048201526013602482015272119959481d1c985b9cd9995c8819985a5b1959606a1b60448201526064016105f3565b8215610ab457600085608001516001600160a01b03168460405160006040518083038185875af1925050503d8060008114610a5c576040519150601f19603f3d011682016040523d82523d6000602084013e610a61565b606091505b5050905080610ab25760405162461bcd60e51b815260206004820152601760248201527f526f79616c7479207472616e73666572206661696c656400000000000000000060448201526064016105f3565b505b84516040516000916001600160a01b03169084908381818185875af1925050503d8060008114610b00576040519150601f19603f3d011682016040523d82523d6000602084013e610b05565b606091505b5050905080610b4e5760405162461bcd60e51b815260206004820152601560248201527414d95b1b195c881c185e5b595b9d0819985a5b1959605a1b60448201526064016105f3565b8560200151341115610bf25760208601516000903390610b6e90346118d0565b604051600081818185875af1925050503d8060008114610baa576040519150601f19603f3d011682016040523d82523d6000602084013e610baf565b606091505b5050905080610bf05760405162461bcd60e51b815260206004820152600d60248201526c1499599d5b990819985a5b1959609a1b60448201526064016105f3565b505b8551602080880151604080516001600160a01b0394851681529283019190915281018790526060810186905233918991908b16907f5478ad3f04f76c56cdccdbf76c58bc9a46a20205d5264da270a05e23ca683ac09060800160405180910390a45050505050506106936001600055565b610c6b6115ed565b6001600160a01b038083166000908152600460208181526040808420868552825292839020835160a081018552815486168152600182015492810192909252600281015460ff16151593820184905260038101546060830152909101549092166080830152610d0e5760405162461bcd60e51b815260206004820152600f60248201526e125d195b481b9bdd081b1a5cdd1959608a1b60448201526064016105f3565b80516001600160a01b03163314610d605760405162461bcd60e51b815260206004820152601660248201527513db9b1e481cd95b1b195c8818d85b8818d85b98d95b60521b60448201526064016105f3565b6001600160a01b038316600081815260046020818152604080842087855290915291829020600201805460ff1916905590516323b872dd60e01b81523091810191909152336024820152604481018490526323b872dd90606401600060405180830381600087803b158015610dd457600080fd5b505af1158015610de8573d6000803e3d6000fd5b50506040513392508491506001600160a01b038616907fc448b641f9d136b2082a1543ddddd8b6f8b86576bc444a187505ea3934bac2f890600090a4506106936001600055565b610e37611541565b476000610e4c6001546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114610e96576040519150601f19603f3d011682016040523d82523d6000602084013e610e9b565b606091505b50509050806106935760405162461bcd60e51b815260206004820152601b60248201527f456d657267656e6379207769746864726177616c206661696c6564000000000060448201526064016105f3565b6001600160a01b03831660009081526004602090815260408083208584529091529020600281015460ff16610f555760405162461bcd60e51b815260206004820152600f60248201526e125d195b481b9bdd081b1a5cdd1959608a1b60448201526064016105f3565b80546001600160a01b03163314610fa75760405162461bcd60e51b81526020600482015260166024820152754f6e6c792073656c6c65722063616e2075706461746560501b60448201526064016105f3565b60008211610ff75760405162461bcd60e51b815260206004820152601f60248201527f5072696365206d7573742062652067726561746572207468616e207a65726f0060448201526064016105f3565b600101555050565b611007611541565b6001600160a01b0381166110515760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081c9958da5c1a595b9d607a1b60448201526064016105f3565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b61107b611541565b6001600160a01b0381166110e05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105f3565b6110e98161159b565b50565b6110f46115ed565b600083116111445760405162461bcd60e51b815260206004820152601f60248201527f5072696365206d7573742062652067726561746572207468616e207a65726f0060448201526064016105f3565b61012c8211156111965760405162461bcd60e51b815260206004820152601860248201527f526f79616c74792070657263656e7420746f6f2068696768000000000000000060448201526064016105f3565b6040516331a9108f60e11b815260048101859052859033906001600160a01b03831690636352211e90602401602060405180830381865afa1580156111df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120391906118e3565b6001600160a01b03161461124b5760405162461bcd60e51b815260206004820152600f60248201526e2737ba103a37b5b2b71037bbb732b960891b60448201526064016105f3565b60405163020604bf60e21b81526004810186905230906001600160a01b0383169063081812fc90602401602060405180830381865afa158015611292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b691906118e3565b6001600160a01b03161480611334575060405163e985e9c560e01b81523360048201523060248201526001600160a01b0382169063e985e9c590604401602060405180830381865afa158015611310573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113349190611900565b6113785760405162461bcd60e51b815260206004820152601560248201527410dbdb9d1c9858dd081b9bdd08185c1c1c9bdd9959605a1b60448201526064016105f3565b6040516323b872dd60e01b8152336004820152306024820152604481018690526001600160a01b038216906323b872dd90606401600060405180830381600087803b1580156113c657600080fd5b505af11580156113da573d6000803e3d6000fd5b505050506040518060a00160405280336001600160a01b03168152602001858152602001600115158152602001848152602001836001600160a01b031681525060046000886001600160a01b03166001600160a01b03168152602001908152602001600020600087815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020160006101000a81548160ff0219169083151502179055506060820151816003015560808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050336001600160a01b031685876001600160a01b03167fb29a3c5d9c9eb8230bd277c54293a0a15e98cd5592a3e0d470fe9ce59fed54f18760405161152791815260200190565b60405180910390a45061153a6001600055565b5050505050565b6001546001600160a01b031633146107505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105f3565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60026000540361163f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105f3565b6002600055565b6001600160a01b03811681146110e957600080fd5b6000806040838503121561166e57600080fd5b823561167981611646565b946020939093013593505050565b60006020828403121561169957600080fd5b81356001600160e01b0319811681146116b157600080fd5b9392505050565b6000806000806000608086880312156116d057600080fd5b85356116db81611646565b945060208601356116eb81611646565b935060408601359250606086013567ffffffffffffffff8082111561170f57600080fd5b818801915088601f83011261172357600080fd5b81358181111561173257600080fd5b89602082850101111561174457600080fd5b9699959850939650602001949392505050565b80151581146110e957600080fd5b6000806040838503121561177857600080fd5b823561178381611646565b9150602083013561179381611757565b809150509250929050565b6000602082840312156117b057600080fd5b5035919050565b600080604083850312156117ca57600080fd5b50508035926020909101359150565b6000602082840312156117eb57600080fd5b81356116b181611646565b60008060006060848603121561180b57600080fd5b833561181681611646565b95602085013595506040909401359392505050565b600080600080600060a0868803121561184357600080fd5b853561184e81611646565b9450602086013593506040860135925060608601359150608086013561187381611646565b809150509295509295909350565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761056f5761056f611881565b6000826118cb57634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561056f5761056f611881565b6000602082840312156118f557600080fd5b81516116b181611646565b60006020828403121561191257600080fd5b81516116b18161175756fea2646970667358221220645f72b3c4810c3296d07297e886e89fab60e273384bde7b791759fb7a32718564736f6c63430008130033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
