{
  "_format": "hh-sol-artifact-1",
  "contractName": "ERC721CWithMutableMinterRoyaltiesInitializable",
  "sourceName": "contracts/examples/erc721c/ERC721CWithMutableMinterRoyalties.sol",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "CreatorTokenBase__InvalidTransferValidatorContract",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "CreatorTokenBase__SetTransferValidatorFirst",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ERC721OpenZeppelinInitializable__AlreadyInitializedERC721",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InitializableOwnable__OwnerAlreadyInitialized",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MutableMinterRoyaltiesInitializable__DefaultMinterRoyaltyFeeAlreadyInitialized",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MutableMinterRoyalties__MinterCannotBeZeroAddress",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MutableMinterRoyalties__MinterHasAlreadyBeenAssignedToTokenId",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MutableMinterRoyalties__OnlyMinterCanChangeRoyaltyFee",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MutableMinterRoyalties__RoyaltyFeeWillExceedSalePrice",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ShouldNotMintToBurnAddress",
      "type": "error"
    },
    {
      "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": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint96",
          "name": "feeNumerator",
          "type": "uint96"
        }
      ],
      "name": "RoyaltySet",
      "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"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "oldValidator",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "newValidator",
          "type": "address"
        }
      ],
      "name": "TransferValidatorUpdated",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DEFAULT_OPERATOR_WHITELIST_ID",
      "outputs": [
        {
          "internalType": "uint120",
          "name": "",
          "type": "uint120"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "DEFAULT_TRANSFER_SECURITY_LEVEL",
      "outputs": [
        {
          "internalType": "enum TransferSecurityLevels",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "DEFAULT_TRANSFER_VALIDATOR",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "FEE_DENOMINATOR",
      "outputs": [
        {
          "internalType": "uint96",
          "name": "",
          "type": "uint96"
        }
      ],
      "stateMutability": "view",
      "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": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "burn",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "defaultRoyaltyFeeNumerator",
      "outputs": [
        {
          "internalType": "uint96",
          "name": "",
          "type": "uint96"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "getApproved",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getPermittedContractReceivers",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getSecurityPolicy",
      "outputs": [
        {
          "components": [
            {
              "internalType": "enum TransferSecurityLevels",
              "name": "transferSecurityLevel",
              "type": "uint8"
            },
            {
              "internalType": "uint120",
              "name": "operatorWhitelistId",
              "type": "uint120"
            },
            {
              "internalType": "uint120",
              "name": "permittedContractReceiversId",
              "type": "uint120"
            }
          ],
          "internalType": "struct CollectionSecurityPolicy",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getTransferValidator",
      "outputs": [
        {
          "internalType": "contract ICreatorTokenTransferValidator",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getWhitelistedOperators",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint96",
          "name": "defaultRoyaltyFeeNumerator_",
          "type": "uint96"
        }
      ],
      "name": "initializeDefaultMinterRoyaltyFee",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "name_",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "symbol_",
          "type": "string"
        }
      ],
      "name": "initializeERC721",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner_",
          "type": "address"
        }
      ],
      "name": "initializeOwner",
      "outputs": [],
      "stateMutability": "nonpayable",
      "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": [
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "isContractReceiverPermitted",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "isOperatorWhitelisted",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        }
      ],
      "name": "isTransferAllowed",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "mint",
      "outputs": [],
      "stateMutability": "nonpayable",
      "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": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "salePrice",
          "type": "uint256"
        }
      ],
      "name": "royaltyInfo",
      "outputs": [
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "royaltyAmount",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "safeMint",
      "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": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "uint96",
          "name": "royaltyFeeNumerator",
          "type": "uint96"
        }
      ],
      "name": "setRoyaltyFee",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "enum TransferSecurityLevels",
          "name": "level",
          "type": "uint8"
        },
        {
          "internalType": "uint120",
          "name": "operatorWhitelistId",
          "type": "uint120"
        },
        {
          "internalType": "uint120",
          "name": "permittedContractReceiversAllowlistId",
          "type": "uint120"
        }
      ],
      "name": "setToCustomSecurityPolicy",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "validator",
          "type": "address"
        },
        {
          "internalType": "enum TransferSecurityLevels",
          "name": "level",
          "type": "uint8"
        },
        {
          "internalType": "uint120",
          "name": "operatorWhitelistId",
          "type": "uint120"
        },
        {
          "internalType": "uint120",
          "name": "permittedContractReceiversAllowlistId",
          "type": "uint120"
        }
      ],
      "name": "setToCustomValidatorAndSecurityPolicy",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "setToDefaultSecurityPolicy",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "transferValidator_",
          "type": "address"
        }
      ],
      "name": "setTransferValidator",
      "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": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "tokenURI",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "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"
    }
  ],
  "bytecode": "0x60806040523480156200001157600080fd5b506040805160208082018352600080835283519182019093529182529062000039336200006d565b81516200004e906001906020850190620000bd565b50805162000064906002906020840190620000bd565b505050620001a0565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620000cb9062000163565b90600052602060002090601f016020900481019282620000ef57600085556200013a565b82601f106200010a57805160ff19168380011785556200013a565b828001600101855582156200013a579182015b828111156200013a5782518255916020019190600101906200011d565b50620001489291506200014c565b5090565b5b808211156200014857600081556001016200014d565b600181811c908216806200017857607f821691505b602082108114156200019a57634e487b7160e01b600052602260045260246000fd5b50919050565b6132e380620001b06000396000f3fe608060405234801561001057600080fd5b50600436106102c85760003560e01c80636c3b86991161017b578063b88d4fde116100d8578063d147c97a1161008c578063e985e9c511610071578063e985e9c5146105f2578063f2fde38b1461062e578063fd762d921461064157600080fd5b8063d147c97a146105d6578063d73792a9146105e957600080fd5b8063be537f43116100bd578063be537f43146105a6578063c87b56dd146105bb578063d007af5c146105ce57600080fd5b8063b88d4fde14610580578063b98e14f41461059357600080fd5b806395d89b411161012f578063a144819411610114578063a144819414610547578063a22cb4651461055a578063a9fc664e1461056d57600080fd5b806395d89b411461052c5780639d645a441461053457600080fd5b8063715018a611610160578063715018a6146105005780638c5f36bb146105085780638da5cb5b1461051b57600080fd5b80636c3b8699146104d757806370a08231146104df57600080fd5b80632e8da829116102295780634ef62253116101dd5780635d4c1d46116101c25780635d4c1d461461048957806361347162146104b15780636352211e146104c457600080fd5b80634ef6225314610447578063521f5e6a1461045a57600080fd5b806342842e0e1161020e57806342842e0e1461040c57806342966c681461041f578063495c8bf91461043257600080fd5b80632e8da829146103e657806340c10f19146103f957600080fd5b8063098144d4116102805780631c33b328116102655780631c33b3281461038c57806323b872dd146103a15780632a55205a146103b457600080fd5b8063098144d4146103635780631b25b0771461037957600080fd5b806306fdde03116102b157806306fdde0314610326578063081812fc1461033b578063095ea7b31461034e57600080fd5b806301463546146102cd57806301ffc9a714610303575b600080fd5b6102e671721c310194ccfc01e523fc93c9cccfa2a0ac81565b6040516001600160a01b0390911681526020015b60405180910390f35b610316610311366004612a69565b610654565b60405190151581526020016102fa565b61032e610665565b6040516102fa9190612ade565b6102e6610349366004612af1565b6106f7565b61036161035c366004612b1f565b61071e565b005b60095461010090046001600160a01b03166102e6565b610316610387366004612b4b565b610873565b610394600181565b6040516102fa9190612bb8565b6103616103af366004612bc6565b610917565b6103c76103c2366004612c07565b61099e565b604080516001600160a01b0390931683526020830191909152016102fa565b6103166103f4366004612c29565b610a38565b610361610407366004612b1f565b610b73565b61036161041a366004612bc6565b610b81565b61036161042d366004612af1565b610b9c565b61043a610ba8565b6040516102fa9190612c46565b610361610455366004612cb4565b610ce8565b600a546bffffffffffffffffffffffff165b6040516bffffffffffffffffffffffff90911681526020016102fa565b610491600181565b6040516effffffffffffffffffffffffffffff90911681526020016102fa565b6103616104bf366004612d0a565b610dcf565b6102e66104d2366004612af1565b610f66565b610361610fcb565b6104f26104ed366004612c29565b6110c3565b6040519081526020016102fa565b61036161115d565b610361610516366004612c29565b611171565b6000546001600160a01b03166102e6565b61032e6111d3565b610316610542366004612c29565b6111e2565b610361610555366004612b1f565b6112ca565b610361610568366004612d58565b6112d4565b61036161057b366004612c29565b6112df565b61036161058e366004612e30565b61144e565b6103616105a1366004612eb0565b6114d6565b6105ae611531565b6040516102fa9190612ecb565b61032e6105c9366004612af1565b611604565b61043a611677565b6103616105e4366004612f2f565b611750565b61046c61271081565b610316610600366004612f93565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b61036161063c366004612c29565b6117ac565b61036161064f366004612fc1565b611830565b600061065f82611954565b92915050565b6060600780546106749061301d565b80601f01602080910402602001604051908101604052809291908181526020018280546106a09061301d565b80156106ed5780601f106106c2576101008083540402835291602001916106ed565b820191906000526020600020905b8154815290600101906020018083116106d057829003601f168201915b5050505050905090565b600061070282611992565b506000908152600560205260409020546001600160a01b031690565b600061072982610f66565b9050806001600160a01b0316836001600160a01b031614156107b85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b03821614806107f257506001600160a01b038116600090815260066020908152604080832033845290915290205460ff165b6108645760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016107af565b61086e83836119f6565b505050565b60095460009061010090046001600160a01b03161561090c5760095460405163050bf71960e31b81526001600160a01b038681166004830152858116602483015284811660448301526101009092049091169063285fb8c89060640160006040518083038186803b1580156108e757600080fd5b505afa9250505080156108f8575060015b61090457506000610910565b506001610910565b5060015b9392505050565b6109213382611a71565b6109935760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f7665640000000000000000000000000000000000000060648201526084016107af565b61086e838383611af0565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff169282019290925282916109ff57600a546bffffffffffffffffffffffff1660208201525b8051602082015161271090610a22906bffffffffffffffffffffffff168761306e565b610a2c919061308d565b92509250509250929050565b60095460009061010090046001600160a01b031615610b6b57600954604051635caaa2a960e11b81523060048201526101009091046001600160a01b03169063d72dde5e90829063b95545529060240160606040518083038186803b158015610aa057600080fd5b505afa158015610ab4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad891906130af565b602001516040516001600160e01b031960e084901b1681526effffffffffffffffffffffffffffff90911660048201526001600160a01b03851660248201526044015b60206040518083038186803b158015610b3357600080fd5b505afa158015610b47573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065f9190613121565b506000919050565b610b7d8282611d0b565b5050565b61086e8383836040518060200160405280600081525061144e565b610ba581611d1f565b50565b60095460609061010090046001600160a01b031615610cd557600954604051635caaa2a960e11b81523060048201526101009091046001600160a01b031690633fe5df9990829063b95545529060240160606040518083038186803b158015610c1057600080fd5b505afa158015610c24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4891906130af565b602001516040516001600160e01b031960e084901b1681526effffffffffffffffffffffffffffff90911660048201526024015b60006040518083038186803b158015610c9457600080fd5b505afa158015610ca8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cd0919081019061313e565b905090565b5060408051600081526020810190915290565b6127106bffffffffffffffffffffffff82161115610d19576040516316fc4d9760e01b815260040160405180910390fd5b6000828152600b6020526040902080546001600160a01b03163314610d6a576040517f130e6cf200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80546001600160a01b0316600160a01b6bffffffffffffffffffffffff8416908102919091178255604051908152339084907f93c3d3c02f3e5b8ff28a98e2ff5dc3d9395f4f02af3a830c3789c8af25420253906020015b60405180910390a3505050565b610dd7611d31565b60095461010090046001600160a01b031680610e1f576040517f39ffc7ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051630368065360e61b81526001600160a01b0382169063da0194c090610e4d90309088906004016131f0565b600060405180830381600087803b158015610e6757600080fd5b505af1158015610e7b573d6000803e3d6000fd5b5050604051631182550160e11b81523060048201526effffffffffffffffffffffffffffff861660248201526001600160a01b0384169250632304aa029150604401600060405180830381600087803b158015610ed757600080fd5b505af1158015610eeb573d6000803e3d6000fd5b505060405163235d10c560e21b81523060048201526effffffffffffffffffffffffffffff851660248201526001600160a01b0384169250638d74431491506044015b600060405180830381600087803b158015610f4857600080fd5b505af1158015610f5c573d6000803e3d6000fd5b5050505050505050565b6000818152600360205260408120546001600160a01b03168061065f5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e204944000000000000000060448201526064016107af565b610fd3611d31565b610fee71721c310194ccfc01e523fc93c9cccfa2a0ac6112df565b604051630368065360e61b815271721c310194ccfc01e523fc93c9cccfa2a0ac9063da0194c0906110269030906001906004016131f0565b600060405180830381600087803b15801561104057600080fd5b505af1158015611054573d6000803e3d6000fd5b5050604051631182550160e11b81523060048201526001602482015271721c310194ccfc01e523fc93c9cccfa2a0ac9250632304aa029150604401600060405180830381600087803b1580156110a957600080fd5b505af11580156110bd573d6000803e3d6000fd5b50505050565b60006001600160a01b0382166111415760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e6572000000000000000000000000000000000000000000000060648201526084016107af565b506001600160a01b031660009081526004602052604090205490565b611165611d35565b61116f6000611d8f565b565b6000546001600160a01b03161515806111935750600054600160a01b900460ff165b156111ca576040517f69fe088700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba581611d8f565b6060600880546106749061301d565b60095460009061010090046001600160a01b031615610b6b57600954604051635caaa2a960e11b81523060048201526101009091046001600160a01b031690639445f53090829063b95545529060240160606040518083038186803b15801561124a57600080fd5b505afa15801561125e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128291906130af565b60409081015190516001600160e01b031960e084901b1681526effffffffffffffffffffffffffffff90911660048201526001600160a01b0385166024820152604401610b1b565b610b7d8282611dec565b610b7d338383611e06565b6112e7611d31565b60006001600160a01b0382163b15611375576040516301ffc9a760e01b8152600060048201526001600160a01b038316906301ffc9a79060240160206040518083038186803b15801561133957600080fd5b505afa925050508015611369575060408051601f3d908101601f1916820190925261136691810190613121565b60015b61137257611375565b90505b6001600160a01b0382161580159061138b575080155b156113c2576040517f32483afb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600954604080516001600160a01b036101009093048316815291841660208301527fcc5dc080ff977b3c3a211fa63ab74f90f658f5ba9d3236e92c8f59570f442aac910160405180910390a150600980546001600160a01b03909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b6114583383611a71565b6114ca5760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f7665640000000000000000000000000000000000000060648201526084016107af565b6110bd84848484611ecd565b6114de611d31565b600c5460ff161561151b576040517fd01e4bd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c805460ff19166001179055610ba581611f56565b604080516060810182526000808252602082018190529181019190915260095461010090046001600160a01b0316156115e357600954604051635caaa2a960e11b81523060048201526101009091046001600160a01b03169063b95545529060240160606040518083038186803b1580156115ab57600080fd5b505afa1580156115bf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd091906130af565b50604080516060810182526000808252602082018190529181019190915290565b606061160f82611992565b600061162660408051602081019091526000815290565b905060008151116116465760405180602001604052806000815250610910565b8061165084611fc6565b60405160200161166192919061320d565b6040516020818303038152906040529392505050565b60095460609061010090046001600160a01b031615610cd557600954604051635caaa2a960e11b81523060048201526101009091046001600160a01b0316906317e94a6c90829063b95545529060240160606040518083038186803b1580156116df57600080fd5b505afa1580156116f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171791906130af565b60409081015190516001600160e01b031960e084901b1681526effffffffffffffffffffffffffffff9091166004820152602401610c7c565b611758611d31565b60095460ff1615611795576040517fc7a92d9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009805460ff19166001179055610b7d8282612070565b6117b4611d35565b6001600160a01b0381166111ca5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107af565b611838611d31565b611841846112df565b604051630368065360e61b81526001600160a01b0385169063da0194c09061186f90309087906004016131f0565b600060405180830381600087803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b5050604051631182550160e11b81523060048201526effffffffffffffffffffffffffffff851660248201526001600160a01b0387169250632304aa029150604401600060405180830381600087803b1580156118f957600080fd5b505af115801561190d573d6000803e3d6000fd5b505060405163235d10c560e21b81523060048201526effffffffffffffffffffffffffffff841660248201526001600160a01b0387169250638d7443149150604401610f2e565b60006001600160e01b031982167f2a55205a00000000000000000000000000000000000000000000000000000000148061065f575061065f82612097565b6000818152600360205260409020546001600160a01b0316610ba55760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e204944000000000000000060448201526064016107af565b6000818152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091558190611a3882610f66565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611a7d83610f66565b9050806001600160a01b0316846001600160a01b03161480611ac457506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80611ae85750836001600160a01b0316611add846106f7565b6001600160a01b0316145b949350505050565b826001600160a01b0316611b0382610f66565b6001600160a01b031614611b675760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016107af565b6001600160a01b038216611be25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016107af565b611bef83838360016120d5565b826001600160a01b0316611c0282610f66565b6001600160a01b031614611c665760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016107af565b6000818152600560209081526040808320805473ffffffffffffffffffffffffffffffffffffffff199081169091556001600160a01b0387811680865260048552838620805460001901905590871680865283862080546001019055868652600390945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a461086e8383836001612103565b611d15828261212a565b610b7d8282612259565b611d2881612409565b610ba5816124c3565b61116f5b6000546001600160a01b0316331461116f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107af565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610b7d828260405180602001604052806000815250612530565b816001600160a01b0316836001600160a01b03161415611e685760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107af565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101610dc2565b611ed8848484611af0565b611ee4848484846125b9565b6110bd5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107af565b6127106bffffffffffffffffffffffff82161115611f87576040516316fc4d9760e01b815260040160405180910390fd5b600a80547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff92909216919091179055565b60606000611fd38361271c565b600101905060008167ffffffffffffffff811115611ff357611ff3612d91565b6040519080825280601f01601f19166020018201604052801561201d576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461206357612068565b612027565b509392505050565b81516120839060079060208501906129ba565b50805161086e9060089060208401906129ba565b60006001600160e01b031982167f86455d2800000000000000000000000000000000000000000000000000000000148061065f575061065f826127fe565b60005b818110156120fc576120f485856120ef848761323c565b612880565b6001016120d8565b5050505050565b60005b818110156120fc57612122858561211d848761323c565b6128dc565b600101612106565b6001600160a01b03821661216a576040517fddc3fc8700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600b60205260409020546001600160a01b0316156121b9576040517f3b2a1e5500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006121d2600a546bffffffffffffffffffffffff1690565b6040805180820182526001600160a01b038681168083526bffffffffffffffffffffffff858116602080860182815260008b8152600b835288902096519051909316600160a01b0292909416919091179093559251918252929350909184917f93c3d3c02f3e5b8ff28a98e2ff5dc3d9395f4f02af3a830c3789c8af254202539101610dc2565b6001600160a01b0382166122af5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107af565b6000818152600360205260409020546001600160a01b0316156123145760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107af565b6123226000838360016120d5565b6000818152600360205260409020546001600160a01b0316156123875760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107af565b6001600160a01b0382166000818152600460209081526040808320805460010190558483526003909152808220805473ffffffffffffffffffffffffffffffffffffffff19168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4610b7d600083836001612103565b600061241482610f66565b90506124248160008460016120d5565b61242d82610f66565b6000838152600560209081526040808320805473ffffffffffffffffffffffffffffffffffffffff199081169091556001600160a01b0385168085526004845282852080546000190190558785526003909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4610b7d816000846001612103565b6000818152600b60205260408120819055817f93c3d3c02f3e5b8ff28a98e2ff5dc3d9395f4f02af3a830c3789c8af2542025361250d600a546bffffffffffffffffffffffff1690565b6040516bffffffffffffffffffffffff909116815260200160405180910390a350565b61253a8383611d0b565b61254760008484846125b9565b61086e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107af565b60006001600160a01b0384163b1561271157604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906125fd903390899088908890600401613254565b602060405180830381600087803b15801561261757600080fd5b505af1925050508015612647575060408051601f3d908101601f1916820190925261264491810190613290565b60015b6126f7573d808015612675576040519150601f19603f3d011682016040523d82523d6000602084013e61267a565b606091505b5080516126ef5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107af565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611ae8565b506001949350505050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612765577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310612791576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106127af57662386f26fc10000830492506010015b6305f5e10083106127c7576305f5e100830492506008015b61271083106127db57612710830492506004015b606483106127ed576064830492506002015b600a831061065f5760010192915050565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061286157506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061065f57506301ffc9a760e01b6001600160e01b031983161461065f565b6001600160a01b03838116159083161581801561289a5750805b156128b857604051635cbd944160e01b815260040160405180910390fd5b81156128c4575b6120fc565b80156128cf576128bf565b6120fc338686863461292a565b6001600160a01b0383811615908316158180156128f65750805b1561291457604051635cbd944160e01b815260040160405180910390fd5b811561291f576128bf565b80156128bf576128bf565b60095461010090046001600160a01b0316156120fc5760095460405163050bf71960e31b81526001600160a01b038781166004830152868116602483015285811660448301526101009092049091169063285fb8c89060640160006040518083038186803b15801561299b57600080fd5b505afa1580156129af573d6000803e3d6000fd5b505050505050505050565b8280546129c69061301d565b90600052602060002090601f0160209004810192826129e85760008555612a2e565b82601f10612a0157805160ff1916838001178555612a2e565b82800160010185558215612a2e579182015b82811115612a2e578251825591602001919060010190612a13565b50612a3a929150612a3e565b5090565b5b80821115612a3a5760008155600101612a3f565b6001600160e01b031981168114610ba557600080fd5b600060208284031215612a7b57600080fd5b813561091081612a53565b60005b83811015612aa1578181015183820152602001612a89565b838111156110bd5750506000910152565b60008151808452612aca816020860160208601612a86565b601f01601f19169290920160200192915050565b6020815260006109106020830184612ab2565b600060208284031215612b0357600080fd5b5035919050565b6001600160a01b0381168114610ba557600080fd5b60008060408385031215612b3257600080fd5b8235612b3d81612b0a565b946020939093013593505050565b600080600060608486031215612b6057600080fd5b8335612b6b81612b0a565b92506020840135612b7b81612b0a565b91506040840135612b8b81612b0a565b809150509250925092565b60078110612bb457634e487b7160e01b600052602160045260246000fd5b9052565b6020810161065f8284612b96565b600080600060608486031215612bdb57600080fd5b8335612be681612b0a565b92506020840135612bf681612b0a565b929592945050506040919091013590565b60008060408385031215612c1a57600080fd5b50508035926020909101359150565b600060208284031215612c3b57600080fd5b813561091081612b0a565b6020808252825182820181905260009190848201906040850190845b81811015612c875783516001600160a01b031683529284019291840191600101612c62565b50909695505050505050565b80356bffffffffffffffffffffffff81168114612caf57600080fd5b919050565b60008060408385031215612cc757600080fd5b82359150612cd760208401612c93565b90509250929050565b60078110610ba557600080fd5b6effffffffffffffffffffffffffffff81168114610ba557600080fd5b600080600060608486031215612d1f57600080fd5b8335612d2a81612ce0565b92506020840135612d3a81612ced565b91506040840135612b8b81612ced565b8015158114610ba557600080fd5b60008060408385031215612d6b57600080fd5b8235612d7681612b0a565b91506020830135612d8681612d4a565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612dd057612dd0612d91565b604052919050565b600067ffffffffffffffff831115612df257612df2612d91565b612e05601f8401601f1916602001612da7565b9050828152838383011115612e1957600080fd5b828260208301376000602084830101529392505050565b60008060008060808587031215612e4657600080fd5b8435612e5181612b0a565b93506020850135612e6181612b0a565b925060408501359150606085013567ffffffffffffffff811115612e8457600080fd5b8501601f81018713612e9557600080fd5b612ea487823560208401612dd8565b91505092959194509250565b600060208284031215612ec257600080fd5b61091082612c93565b6000606082019050612ede828451612b96565b60208301516effffffffffffffffffffffffffffff8082166020850152806040860151166040850152505092915050565b600082601f830112612f2057600080fd5b61091083833560208501612dd8565b60008060408385031215612f4257600080fd5b823567ffffffffffffffff80821115612f5a57600080fd5b612f6686838701612f0f565b93506020850135915080821115612f7c57600080fd5b50612f8985828601612f0f565b9150509250929050565b60008060408385031215612fa657600080fd5b8235612fb181612b0a565b91506020830135612d8681612b0a565b60008060008060808587031215612fd757600080fd5b8435612fe281612b0a565b93506020850135612ff281612ce0565b9250604085013561300281612ced565b9150606085013561301281612ced565b939692955090935050565b600181811c9082168061303157607f821691505b6020821081141561305257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561308857613088613058565b500290565b6000826130aa57634e487b7160e01b600052601260045260246000fd5b500490565b6000606082840312156130c157600080fd5b6040516060810181811067ffffffffffffffff821117156130e4576130e4612d91565b60405282516130f281612ce0565b8152602083015161310281612ced565b6020820152604083015161311581612ced565b60408201529392505050565b60006020828403121561313357600080fd5b815161091081612d4a565b6000602080838503121561315157600080fd5b825167ffffffffffffffff8082111561316957600080fd5b818501915085601f83011261317d57600080fd5b81518181111561318f5761318f612d91565b8060051b91506131a0848301612da7565b81815291830184019184810190888411156131ba57600080fd5b938501935b838510156131e457845192506131d483612b0a565b82825293850193908501906131bf565b98975050505050505050565b6001600160a01b0383168152604081016109106020830184612b96565b6000835161321f818460208801612a86565b835190830190613233818360208801612a86565b01949350505050565b6000821982111561324f5761324f613058565b500190565b60006001600160a01b038087168352808616602084015250836040830152608060608301526132866080830184612ab2565b9695505050505050565b6000602082840312156132a257600080fd5b815161091081612a5356fea26469706673582212204c98636ef5958d2abc54a3d035b547b1e9e920edd4cb1b91ba304bd6499d654564736f6c63430008090033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102c85760003560e01c80636c3b86991161017b578063b88d4fde116100d8578063d147c97a1161008c578063e985e9c511610071578063e985e9c5146105f2578063f2fde38b1461062e578063fd762d921461064157600080fd5b8063d147c97a146105d6578063d73792a9146105e957600080fd5b8063be537f43116100bd578063be537f43146105a6578063c87b56dd146105bb578063d007af5c146105ce57600080fd5b8063b88d4fde14610580578063b98e14f41461059357600080fd5b806395d89b411161012f578063a144819411610114578063a144819414610547578063a22cb4651461055a578063a9fc664e1461056d57600080fd5b806395d89b411461052c5780639d645a441461053457600080fd5b8063715018a611610160578063715018a6146105005780638c5f36bb146105085780638da5cb5b1461051b57600080fd5b80636c3b8699146104d757806370a08231146104df57600080fd5b80632e8da829116102295780634ef62253116101dd5780635d4c1d46116101c25780635d4c1d461461048957806361347162146104b15780636352211e146104c457600080fd5b80634ef6225314610447578063521f5e6a1461045a57600080fd5b806342842e0e1161020e57806342842e0e1461040c57806342966c681461041f578063495c8bf91461043257600080fd5b80632e8da829146103e657806340c10f19146103f957600080fd5b8063098144d4116102805780631c33b328116102655780631c33b3281461038c57806323b872dd146103a15780632a55205a146103b457600080fd5b8063098144d4146103635780631b25b0771461037957600080fd5b806306fdde03116102b157806306fdde0314610326578063081812fc1461033b578063095ea7b31461034e57600080fd5b806301463546146102cd57806301ffc9a714610303575b600080fd5b6102e671721c310194ccfc01e523fc93c9cccfa2a0ac81565b6040516001600160a01b0390911681526020015b60405180910390f35b610316610311366004612a69565b610654565b60405190151581526020016102fa565b61032e610665565b6040516102fa9190612ade565b6102e6610349366004612af1565b6106f7565b61036161035c366004612b1f565b61071e565b005b60095461010090046001600160a01b03166102e6565b610316610387366004612b4b565b610873565b610394600181565b6040516102fa9190612bb8565b6103616103af366004612bc6565b610917565b6103c76103c2366004612c07565b61099e565b604080516001600160a01b0390931683526020830191909152016102fa565b6103166103f4366004612c29565b610a38565b610361610407366004612b1f565b610b73565b61036161041a366004612bc6565b610b81565b61036161042d366004612af1565b610b9c565b61043a610ba8565b6040516102fa9190612c46565b610361610455366004612cb4565b610ce8565b600a546bffffffffffffffffffffffff165b6040516bffffffffffffffffffffffff90911681526020016102fa565b610491600181565b6040516effffffffffffffffffffffffffffff90911681526020016102fa565b6103616104bf366004612d0a565b610dcf565b6102e66104d2366004612af1565b610f66565b610361610fcb565b6104f26104ed366004612c29565b6110c3565b6040519081526020016102fa565b61036161115d565b610361610516366004612c29565b611171565b6000546001600160a01b03166102e6565b61032e6111d3565b610316610542366004612c29565b6111e2565b610361610555366004612b1f565b6112ca565b610361610568366004612d58565b6112d4565b61036161057b366004612c29565b6112df565b61036161058e366004612e30565b61144e565b6103616105a1366004612eb0565b6114d6565b6105ae611531565b6040516102fa9190612ecb565b61032e6105c9366004612af1565b611604565b61043a611677565b6103616105e4366004612f2f565b611750565b61046c61271081565b610316610600366004612f93565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b61036161063c366004612c29565b6117ac565b61036161064f366004612fc1565b611830565b600061065f82611954565b92915050565b6060600780546106749061301d565b80601f01602080910402602001604051908101604052809291908181526020018280546106a09061301d565b80156106ed5780601f106106c2576101008083540402835291602001916106ed565b820191906000526020600020905b8154815290600101906020018083116106d057829003601f168201915b5050505050905090565b600061070282611992565b506000908152600560205260409020546001600160a01b031690565b600061072982610f66565b9050806001600160a01b0316836001600160a01b031614156107b85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b03821614806107f257506001600160a01b038116600090815260066020908152604080832033845290915290205460ff165b6108645760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016107af565b61086e83836119f6565b505050565b60095460009061010090046001600160a01b03161561090c5760095460405163050bf71960e31b81526001600160a01b038681166004830152858116602483015284811660448301526101009092049091169063285fb8c89060640160006040518083038186803b1580156108e757600080fd5b505afa9250505080156108f8575060015b61090457506000610910565b506001610910565b5060015b9392505050565b6109213382611a71565b6109935760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f7665640000000000000000000000000000000000000060648201526084016107af565b61086e838383611af0565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff169282019290925282916109ff57600a546bffffffffffffffffffffffff1660208201525b8051602082015161271090610a22906bffffffffffffffffffffffff168761306e565b610a2c919061308d565b92509250509250929050565b60095460009061010090046001600160a01b031615610b6b57600954604051635caaa2a960e11b81523060048201526101009091046001600160a01b03169063d72dde5e90829063b95545529060240160606040518083038186803b158015610aa057600080fd5b505afa158015610ab4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad891906130af565b602001516040516001600160e01b031960e084901b1681526effffffffffffffffffffffffffffff90911660048201526001600160a01b03851660248201526044015b60206040518083038186803b158015610b3357600080fd5b505afa158015610b47573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065f9190613121565b506000919050565b610b7d8282611d0b565b5050565b61086e8383836040518060200160405280600081525061144e565b610ba581611d1f565b50565b60095460609061010090046001600160a01b031615610cd557600954604051635caaa2a960e11b81523060048201526101009091046001600160a01b031690633fe5df9990829063b95545529060240160606040518083038186803b158015610c1057600080fd5b505afa158015610c24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4891906130af565b602001516040516001600160e01b031960e084901b1681526effffffffffffffffffffffffffffff90911660048201526024015b60006040518083038186803b158015610c9457600080fd5b505afa158015610ca8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cd0919081019061313e565b905090565b5060408051600081526020810190915290565b6127106bffffffffffffffffffffffff82161115610d19576040516316fc4d9760e01b815260040160405180910390fd5b6000828152600b6020526040902080546001600160a01b03163314610d6a576040517f130e6cf200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80546001600160a01b0316600160a01b6bffffffffffffffffffffffff8416908102919091178255604051908152339084907f93c3d3c02f3e5b8ff28a98e2ff5dc3d9395f4f02af3a830c3789c8af25420253906020015b60405180910390a3505050565b610dd7611d31565b60095461010090046001600160a01b031680610e1f576040517f39ffc7ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051630368065360e61b81526001600160a01b0382169063da0194c090610e4d90309088906004016131f0565b600060405180830381600087803b158015610e6757600080fd5b505af1158015610e7b573d6000803e3d6000fd5b5050604051631182550160e11b81523060048201526effffffffffffffffffffffffffffff861660248201526001600160a01b0384169250632304aa029150604401600060405180830381600087803b158015610ed757600080fd5b505af1158015610eeb573d6000803e3d6000fd5b505060405163235d10c560e21b81523060048201526effffffffffffffffffffffffffffff851660248201526001600160a01b0384169250638d74431491506044015b600060405180830381600087803b158015610f4857600080fd5b505af1158015610f5c573d6000803e3d6000fd5b5050505050505050565b6000818152600360205260408120546001600160a01b03168061065f5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e204944000000000000000060448201526064016107af565b610fd3611d31565b610fee71721c310194ccfc01e523fc93c9cccfa2a0ac6112df565b604051630368065360e61b815271721c310194ccfc01e523fc93c9cccfa2a0ac9063da0194c0906110269030906001906004016131f0565b600060405180830381600087803b15801561104057600080fd5b505af1158015611054573d6000803e3d6000fd5b5050604051631182550160e11b81523060048201526001602482015271721c310194ccfc01e523fc93c9cccfa2a0ac9250632304aa029150604401600060405180830381600087803b1580156110a957600080fd5b505af11580156110bd573d6000803e3d6000fd5b50505050565b60006001600160a01b0382166111415760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e6572000000000000000000000000000000000000000000000060648201526084016107af565b506001600160a01b031660009081526004602052604090205490565b611165611d35565b61116f6000611d8f565b565b6000546001600160a01b03161515806111935750600054600160a01b900460ff165b156111ca576040517f69fe088700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ba581611d8f565b6060600880546106749061301d565b60095460009061010090046001600160a01b031615610b6b57600954604051635caaa2a960e11b81523060048201526101009091046001600160a01b031690639445f53090829063b95545529060240160606040518083038186803b15801561124a57600080fd5b505afa15801561125e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128291906130af565b60409081015190516001600160e01b031960e084901b1681526effffffffffffffffffffffffffffff90911660048201526001600160a01b0385166024820152604401610b1b565b610b7d8282611dec565b610b7d338383611e06565b6112e7611d31565b60006001600160a01b0382163b15611375576040516301ffc9a760e01b8152600060048201526001600160a01b038316906301ffc9a79060240160206040518083038186803b15801561133957600080fd5b505afa925050508015611369575060408051601f3d908101601f1916820190925261136691810190613121565b60015b61137257611375565b90505b6001600160a01b0382161580159061138b575080155b156113c2576040517f32483afb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600954604080516001600160a01b036101009093048316815291841660208301527fcc5dc080ff977b3c3a211fa63ab74f90f658f5ba9d3236e92c8f59570f442aac910160405180910390a150600980546001600160a01b03909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b6114583383611a71565b6114ca5760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f7665640000000000000000000000000000000000000060648201526084016107af565b6110bd84848484611ecd565b6114de611d31565b600c5460ff161561151b576040517fd01e4bd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c805460ff19166001179055610ba581611f56565b604080516060810182526000808252602082018190529181019190915260095461010090046001600160a01b0316156115e357600954604051635caaa2a960e11b81523060048201526101009091046001600160a01b03169063b95545529060240160606040518083038186803b1580156115ab57600080fd5b505afa1580156115bf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd091906130af565b50604080516060810182526000808252602082018190529181019190915290565b606061160f82611992565b600061162660408051602081019091526000815290565b905060008151116116465760405180602001604052806000815250610910565b8061165084611fc6565b60405160200161166192919061320d565b6040516020818303038152906040529392505050565b60095460609061010090046001600160a01b031615610cd557600954604051635caaa2a960e11b81523060048201526101009091046001600160a01b0316906317e94a6c90829063b95545529060240160606040518083038186803b1580156116df57600080fd5b505afa1580156116f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171791906130af565b60409081015190516001600160e01b031960e084901b1681526effffffffffffffffffffffffffffff9091166004820152602401610c7c565b611758611d31565b60095460ff1615611795576040517fc7a92d9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009805460ff19166001179055610b7d8282612070565b6117b4611d35565b6001600160a01b0381166111ca5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107af565b611838611d31565b611841846112df565b604051630368065360e61b81526001600160a01b0385169063da0194c09061186f90309087906004016131f0565b600060405180830381600087803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b5050604051631182550160e11b81523060048201526effffffffffffffffffffffffffffff851660248201526001600160a01b0387169250632304aa029150604401600060405180830381600087803b1580156118f957600080fd5b505af115801561190d573d6000803e3d6000fd5b505060405163235d10c560e21b81523060048201526effffffffffffffffffffffffffffff841660248201526001600160a01b0387169250638d7443149150604401610f2e565b60006001600160e01b031982167f2a55205a00000000000000000000000000000000000000000000000000000000148061065f575061065f82612097565b6000818152600360205260409020546001600160a01b0316610ba55760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e204944000000000000000060448201526064016107af565b6000818152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091558190611a3882610f66565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611a7d83610f66565b9050806001600160a01b0316846001600160a01b03161480611ac457506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80611ae85750836001600160a01b0316611add846106f7565b6001600160a01b0316145b949350505050565b826001600160a01b0316611b0382610f66565b6001600160a01b031614611b675760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016107af565b6001600160a01b038216611be25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016107af565b611bef83838360016120d5565b826001600160a01b0316611c0282610f66565b6001600160a01b031614611c665760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016107af565b6000818152600560209081526040808320805473ffffffffffffffffffffffffffffffffffffffff199081169091556001600160a01b0387811680865260048552838620805460001901905590871680865283862080546001019055868652600390945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a461086e8383836001612103565b611d15828261212a565b610b7d8282612259565b611d2881612409565b610ba5816124c3565b61116f5b6000546001600160a01b0316331461116f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107af565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610b7d828260405180602001604052806000815250612530565b816001600160a01b0316836001600160a01b03161415611e685760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107af565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101610dc2565b611ed8848484611af0565b611ee4848484846125b9565b6110bd5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107af565b6127106bffffffffffffffffffffffff82161115611f87576040516316fc4d9760e01b815260040160405180910390fd5b600a80547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff92909216919091179055565b60606000611fd38361271c565b600101905060008167ffffffffffffffff811115611ff357611ff3612d91565b6040519080825280601f01601f19166020018201604052801561201d576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461206357612068565b612027565b509392505050565b81516120839060079060208501906129ba565b50805161086e9060089060208401906129ba565b60006001600160e01b031982167f86455d2800000000000000000000000000000000000000000000000000000000148061065f575061065f826127fe565b60005b818110156120fc576120f485856120ef848761323c565b612880565b6001016120d8565b5050505050565b60005b818110156120fc57612122858561211d848761323c565b6128dc565b600101612106565b6001600160a01b03821661216a576040517fddc3fc8700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600b60205260409020546001600160a01b0316156121b9576040517f3b2a1e5500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006121d2600a546bffffffffffffffffffffffff1690565b6040805180820182526001600160a01b038681168083526bffffffffffffffffffffffff858116602080860182815260008b8152600b835288902096519051909316600160a01b0292909416919091179093559251918252929350909184917f93c3d3c02f3e5b8ff28a98e2ff5dc3d9395f4f02af3a830c3789c8af254202539101610dc2565b6001600160a01b0382166122af5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107af565b6000818152600360205260409020546001600160a01b0316156123145760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107af565b6123226000838360016120d5565b6000818152600360205260409020546001600160a01b0316156123875760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107af565b6001600160a01b0382166000818152600460209081526040808320805460010190558483526003909152808220805473ffffffffffffffffffffffffffffffffffffffff19168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4610b7d600083836001612103565b600061241482610f66565b90506124248160008460016120d5565b61242d82610f66565b6000838152600560209081526040808320805473ffffffffffffffffffffffffffffffffffffffff199081169091556001600160a01b0385168085526004845282852080546000190190558785526003909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4610b7d816000846001612103565b6000818152600b60205260408120819055817f93c3d3c02f3e5b8ff28a98e2ff5dc3d9395f4f02af3a830c3789c8af2542025361250d600a546bffffffffffffffffffffffff1690565b6040516bffffffffffffffffffffffff909116815260200160405180910390a350565b61253a8383611d0b565b61254760008484846125b9565b61086e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107af565b60006001600160a01b0384163b1561271157604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906125fd903390899088908890600401613254565b602060405180830381600087803b15801561261757600080fd5b505af1925050508015612647575060408051601f3d908101601f1916820190925261264491810190613290565b60015b6126f7573d808015612675576040519150601f19603f3d011682016040523d82523d6000602084013e61267a565b606091505b5080516126ef5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107af565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611ae8565b506001949350505050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612765577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310612791576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106127af57662386f26fc10000830492506010015b6305f5e10083106127c7576305f5e100830492506008015b61271083106127db57612710830492506004015b606483106127ed576064830492506002015b600a831061065f5760010192915050565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061286157506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061065f57506301ffc9a760e01b6001600160e01b031983161461065f565b6001600160a01b03838116159083161581801561289a5750805b156128b857604051635cbd944160e01b815260040160405180910390fd5b81156128c4575b6120fc565b80156128cf576128bf565b6120fc338686863461292a565b6001600160a01b0383811615908316158180156128f65750805b1561291457604051635cbd944160e01b815260040160405180910390fd5b811561291f576128bf565b80156128bf576128bf565b60095461010090046001600160a01b0316156120fc5760095460405163050bf71960e31b81526001600160a01b038781166004830152868116602483015285811660448301526101009092049091169063285fb8c89060640160006040518083038186803b15801561299b57600080fd5b505afa1580156129af573d6000803e3d6000fd5b505050505050505050565b8280546129c69061301d565b90600052602060002090601f0160209004810192826129e85760008555612a2e565b82601f10612a0157805160ff1916838001178555612a2e565b82800160010185558215612a2e579182015b82811115612a2e578251825591602001919060010190612a13565b50612a3a929150612a3e565b5090565b5b80821115612a3a5760008155600101612a3f565b6001600160e01b031981168114610ba557600080fd5b600060208284031215612a7b57600080fd5b813561091081612a53565b60005b83811015612aa1578181015183820152602001612a89565b838111156110bd5750506000910152565b60008151808452612aca816020860160208601612a86565b601f01601f19169290920160200192915050565b6020815260006109106020830184612ab2565b600060208284031215612b0357600080fd5b5035919050565b6001600160a01b0381168114610ba557600080fd5b60008060408385031215612b3257600080fd5b8235612b3d81612b0a565b946020939093013593505050565b600080600060608486031215612b6057600080fd5b8335612b6b81612b0a565b92506020840135612b7b81612b0a565b91506040840135612b8b81612b0a565b809150509250925092565b60078110612bb457634e487b7160e01b600052602160045260246000fd5b9052565b6020810161065f8284612b96565b600080600060608486031215612bdb57600080fd5b8335612be681612b0a565b92506020840135612bf681612b0a565b929592945050506040919091013590565b60008060408385031215612c1a57600080fd5b50508035926020909101359150565b600060208284031215612c3b57600080fd5b813561091081612b0a565b6020808252825182820181905260009190848201906040850190845b81811015612c875783516001600160a01b031683529284019291840191600101612c62565b50909695505050505050565b80356bffffffffffffffffffffffff81168114612caf57600080fd5b919050565b60008060408385031215612cc757600080fd5b82359150612cd760208401612c93565b90509250929050565b60078110610ba557600080fd5b6effffffffffffffffffffffffffffff81168114610ba557600080fd5b600080600060608486031215612d1f57600080fd5b8335612d2a81612ce0565b92506020840135612d3a81612ced565b91506040840135612b8b81612ced565b8015158114610ba557600080fd5b60008060408385031215612d6b57600080fd5b8235612d7681612b0a565b91506020830135612d8681612d4a565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612dd057612dd0612d91565b604052919050565b600067ffffffffffffffff831115612df257612df2612d91565b612e05601f8401601f1916602001612da7565b9050828152838383011115612e1957600080fd5b828260208301376000602084830101529392505050565b60008060008060808587031215612e4657600080fd5b8435612e5181612b0a565b93506020850135612e6181612b0a565b925060408501359150606085013567ffffffffffffffff811115612e8457600080fd5b8501601f81018713612e9557600080fd5b612ea487823560208401612dd8565b91505092959194509250565b600060208284031215612ec257600080fd5b61091082612c93565b6000606082019050612ede828451612b96565b60208301516effffffffffffffffffffffffffffff8082166020850152806040860151166040850152505092915050565b600082601f830112612f2057600080fd5b61091083833560208501612dd8565b60008060408385031215612f4257600080fd5b823567ffffffffffffffff80821115612f5a57600080fd5b612f6686838701612f0f565b93506020850135915080821115612f7c57600080fd5b50612f8985828601612f0f565b9150509250929050565b60008060408385031215612fa657600080fd5b8235612fb181612b0a565b91506020830135612d8681612b0a565b60008060008060808587031215612fd757600080fd5b8435612fe281612b0a565b93506020850135612ff281612ce0565b9250604085013561300281612ced565b9150606085013561301281612ced565b939692955090935050565b600181811c9082168061303157607f821691505b6020821081141561305257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561308857613088613058565b500290565b6000826130aa57634e487b7160e01b600052601260045260246000fd5b500490565b6000606082840312156130c157600080fd5b6040516060810181811067ffffffffffffffff821117156130e4576130e4612d91565b60405282516130f281612ce0565b8152602083015161310281612ced565b6020820152604083015161311581612ced565b60408201529392505050565b60006020828403121561313357600080fd5b815161091081612d4a565b6000602080838503121561315157600080fd5b825167ffffffffffffffff8082111561316957600080fd5b818501915085601f83011261317d57600080fd5b81518181111561318f5761318f612d91565b8060051b91506131a0848301612da7565b81815291830184019184810190888411156131ba57600080fd5b938501935b838510156131e457845192506131d483612b0a565b82825293850193908501906131bf565b98975050505050505050565b6001600160a01b0383168152604081016109106020830184612b96565b6000835161321f818460208801612a86565b835190830190613233818360208801612a86565b01949350505050565b6000821982111561324f5761324f613058565b500190565b60006001600160a01b038087168352808616602084015250836040830152608060608301526132866080830184612ab2565b9695505050505050565b6000602082840312156132a257600080fd5b815161091081612a5356fea26469706673582212204c98636ef5958d2abc54a3d035b547b1e9e920edd4cb1b91ba304bd6499d654564736f6c63430008090033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
