0 txs
40.9k calls
constructor
constructor(address _factory, address _aiOracle, address _randOracle, address _oracleGasEstimator)
functions
AIGC_TYPE
viewfunction AIGC_TYPE() view returns (string)
aigcDataOf
viewfunction aigcDataOf(uint256 tokenId) view returns (bytes)
aiOracle
viewfunction aiOracle() view returns (address)
balanceOf
viewfunction balanceOf(address owner) view returns (uint256)
basePrompt
viewfunction basePrompt() view returns (string)
contractURI
viewfunction contractURI() view returns (string)
DEFAULT_IMAGE_URL
viewfunction DEFAULT_IMAGE_URL() view returns (string)
description
viewfunction description() view returns (string)
estimateMaxRevealFee
viewfunction estimateMaxRevealFee(uint256 num) view returns (tuple)
estimateRevealFee
viewfunction estimateRevealFee(uint256 num) view returns (tuple)
factory
viewfunction factory() view returns (address)
getApproved
viewfunction getApproved(uint256 tokenId) view returns (address)
getTokenIdsByRequestId
viewfunction getTokenIdsByRequestId(bytes32 requestId) view returns (uint256[])
isApprovedForAll
viewfunction isApprovedForAll(address owner, address operator) view returns (bool)
isFinalized
viewfunction isFinalized(uint256 requestId) view returns (bool)
modelId
viewfunction modelId() view returns (uint256)
name
viewfunction name() view returns (string)
nsfw
viewfunction nsfw() view returns (bool)
operator
viewfunction operator() view returns (address)
oracleGasEstimator
viewfunction oracleGasEstimator() view returns (address)
owner
viewfunction owner() view returns (address)
ownerOf
viewfunction ownerOf(uint256 tokenId) view returns (address)
promptToTokenId
viewfunction promptToTokenId(bytes prompt) view returns (uint256)
PROOF_TYPE
viewfunction PROOF_TYPE() view returns (string)
RAND_ORACLE_MODEL_ID
viewfunction RAND_ORACLE_MODEL_ID() view returns (uint256)
randOracle
viewfunction randOracle() view returns (address)
requestIdToDelegateCaller
viewfunction requestIdToDelegateCaller(bytes32 requestId) view returns (address)
requestIdToTokenIds
viewfunction requestIdToTokenIds(bytes32 requestId, uint256) view returns (uint256)
royaltyInfo
viewfunction royaltyInfo(uint256 tokenId, uint256 salePrice) view returns (address, uint256)
seedOf
viewfunction seedOf(uint256 tokenId) view returns (uint256)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
symbol
viewfunction symbol() view returns (string)
tokenIdToAIOracleRequestId
viewfunction tokenIdToAIOracleRequestId(uint256 tokenId) view returns (uint256)
tokenURI
viewfunction tokenURI(uint256 tokenId) view returns (string)
totalSupply
viewfunction totalSupply() view returns (uint256)
verify
viewfunction verify(bytes prompt, bytes aigcData, bytes) view returns (bool)
activate
nonpayablefunction activate(uint256 _totalSupply, address _defaultNFTOwner, address _operator)
addAigcData
nonpayablefunction addAigcData(uint256 tokenId, bytes prompt, bytes aigcData, bytes proof)
aiOracleCallback
nonpayablefunction aiOracleCallback(uint256 aiOracleRequestId, bytes output, bytes callbackData)
approve
nonpayablefunction approve(address to, uint256 tokenId)
awaitRandOracle
nonpayablefunction awaitRandOracle(uint256 randOracleRequestId, uint256 output, bytes callbackData)
initialize
nonpayablefunction initialize(address _owner, string prompt, bytes metadataInitializer, uint256 _modelId, uint96 _royaltyFeeBps)
renounceOwnership
nonpayablefunction renounceOwnership()
retryRequestAIOracle
payablefunction retryRequestAIOracle(bytes32 requestId) payable
reveal
payablefunction reveal(uint256[] tokenIds, address delegateCaller) payable
safeTransferFrom
nonpayablefunction safeTransferFrom(address from, address to, uint256 tokenId, bytes data)
safeTransferFrom
nonpayablefunction safeTransferFrom(address from, address to, uint256 tokenId)
setApprovalForAll
nonpayablefunction setApprovalForAll(address operator, bool approved)
setDefaultRoyalty
nonpayablefunction setDefaultRoyalty(address receiver, uint96 feeNumerator)
transferFrom
nonpayablefunction transferFrom(address from, address to, uint256 tokenId)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
update
nonpayablefunction update(bytes prompt, bytes aigcData)
events
AigcData
event AigcData(uint256 indexed tokenId, bytes indexed prompt, bytes aigcData, bytes proof)
Approval
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)
ApprovalForAll
event ApprovalForAll(address indexed owner, address indexed operator, bool approved)
BatchMetadataUpdate
event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId)
CallAIOracle
event CallAIOracle(bytes32 indexed requestId, uint256 aiOracleRequestId, address delegateCaller)
ConsecutiveTransfer
event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed fromAddress, address indexed toAddress)
ContractURIUpdated
event ContractURIUpdated()
Initialized
event Initialized(uint64 version)
MetadataUpdate
event MetadataUpdate(uint256 _tokenId)
NewRevealRequest
event NewRevealRequest(bytes32 indexed requestId, uint256 randOracleRequestId, address delegateCaller)
NotRequestAIOracle
event NotRequestAIOracle(bytes32 indexed requestId, address delegateCaller)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
Transfer
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)
Update
event Update(uint256 indexed tokenId, bytes indexed prompt, bytes indexed aigcData)
errors
AddressEmptyCode
error AddressEmptyCode(address target)
AddressInsufficientBalance
error AddressInsufficientBalance(address account)
AigcDataExists
error AigcDataExists()
AlreadyActivated
error AlreadyActivated()
EmptyArray
error EmptyArray()
EmptyPrompt
error EmptyPrompt()
ERC2981InvalidDefaultRoyalty
error ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator)
ERC2981InvalidDefaultRoyaltyReceiver
error ERC2981InvalidDefaultRoyaltyReceiver(address receiver)
ERC2981InvalidTokenRoyalty
error ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator)
ERC2981InvalidTokenRoyaltyReceiver
error ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver)
ERC721IncorrectOwner
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner)
ERC721InsufficientApproval
error ERC721InsufficientApproval(address operator, uint256 tokenId)
ERC721InvalidApprover
error ERC721InvalidApprover(address approver)
ERC721InvalidOperator
error ERC721InvalidOperator(address operator)
ERC721InvalidOwner
error ERC721InvalidOwner(address owner)
ERC721InvalidReceiver
error ERC721InvalidReceiver(address receiver)
ERC721InvalidSender
error ERC721InvalidSender(address sender)
ERC721NonexistentToken
error ERC721NonexistentToken(uint256 tokenId)
FailedInnerCall
error FailedInnerCall()
InsufficientBalance
error InsufficientBalance()
InsufficientRevealFee
error InsufficientRevealFee()
InvalidAIOracleCallback
error InvalidAIOracleCallback()
InvalidCIDLength
error InvalidCIDLength()
InvalidDataLength
error InvalidDataLength()
InvalidInitialization
error InvalidInitialization()
InvalidRandOracleCallback
error InvalidRandOracleCallback()
InvalidRandOracleRequestId
error InvalidRandOracleRequestId()
InvalidRequestId
error InvalidRequestId()
InvalidSeedRange
error InvalidSeedRange()
InvalidTokenId
error InvalidTokenId()
InvalidTotalSupply
error InvalidTotalSupply()
NotInitializing
error NotInitializing()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
RequestAlreadyProcessed
error RequestAlreadyProcessed()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
StringsInsufficientHexLength
error StringsInsufficientHexLength(uint256 value, uint256 length)
UnauthorizedCallbackSource
error UnauthorizedCallbackSource(address expected, address found)
UnauthorizedCaller
error UnauthorizedCaller()
UnauthorizedRandOracleCallbackSrouce
error UnauthorizedRandOracleCallbackSrouce(address expected, address found)
WrongAIOracleCallback
error WrongAIOracleCallback()
ZeroAddress
error ZeroAddress()
creation bytecode
0x610100346101fd57601f61510138819003918201601f19168301916001600160401b03831184841017610201578084926080946040528339810103126101fd5780516001600160a01b038116908190036101fd5760208201516001600160a01b03811681036101fd576040830151926001600160a01b03841684036101fd5760600151926001600160a01b038416918285036101fd5760805260a05281156101ee57156101ee5760c05260e0525f5160206150e15f395f51905f525460ff8160401c166101df576002600160401b03196001600160401b03821601610189575b604051614ecb9081610216823960805181818161080c01528181610e2601528181610e8b015281816117ba01528181611d920152818161217c015281816139030152613cd8015260a0518181816115150152818161222f015281816139930152614182015260c05181818161070001528181611cc301526125d6015260e0518181816106b50152818161163701528181611f3f0152818161254e01528181612c2a01526131400152f35b6001600160401b0319166001600160401b039081175f5160206150e15f395f51905f52556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f6100df565b63f92ee8a960e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a71461035457806304634d8d1461034f57806306fdde031461034a578063081812fc14610345578063095ea7b3146103405780630d2115ae1461033b578063122d1bad1461033657806318160ddd1461033157806323b872dd1461032c578063286f9e9c146103275780632a55205a1461032257806331b221cd1461031d57806333727c4d146103185780633f37dce21461031357806342842e0e1461030e57806343cdaad21461030957806351db35eb14610304578063570ca735146102ff578063574d52a5146102fa5780636352211e146102f55780636c6a4e9c146102f057806370a08231146102eb578063715018a6146102e65780637284e416146102e157806382829f74146102dc5780638d141db8146102d75780638da5cb5b146102d25780638dc7f7df146102cd57806395d89b41146102c85780639def5824146102c3578063a22cb465146102be578063a93cff56146102b9578063aa2e084e146102b4578063aea30507146102af578063b0347814146102aa578063b40e16e3146102a5578063b88d4fde146102a0578063bc8c7df21461029b578063bdaeb4ac14610296578063c3b1802b14610291578063c45a01551461028c578063c87b56dd14610287578063cf99a79a14610282578063dba743c81461027d578063de8f50a114610278578063e36298d714610273578063e8a3d4851461026e578063e985e9c514610269578063ef26078e14610264578063ef53b6cb1461025f578063f2fde38b1461025a5763f9a951cd14610255575f80fd5b612697565b61266a565b6124ff565b6123df565b61239a565b61225e565b61221a565b6120ae565b611ead565b611e92565b611cf2565b611cae565b611ae9565b611a86565b611a6b565b6119f2565b6119c8565b611764565b6116e8565b611695565b611622565b611574565b6114dd565b6113c2565b611383565b61133b565b6112cb565b611268565b61124d565b6111e6565b611193565b611161565b611134565b61110f565b6110e7565b6110cd565b6110b1565b611088565b610f50565b610e55565b610e11565b610d4b565b610d30565b610cb8565b610c6f565b610c54565b610668565b610580565b610525565b6104f6565b610471565b61036f565b6001600160e01b031981160361036b57565b5f80fd5b3461036b57602036600319011261036b576103d960043561038f81610359565b63ffffffff60e01b166380ac58cd60e01b8114908115610439575b8115610410575b81156103ff575b81156103ee575b81156103dd575b5060405190151581529081906020820190565b0390f35b63e8a3d48560e01b1490505f6103c6565b631f9bee7160e11b811491506103bf565b6338162ad360e11b811491506103b8565b905063152a902d60e11b81148015610429575b906103b1565b506301ffc9a760e01b8114610423565b635b5e139f60e01b811491506103aa565b6001600160a01b0381160361036b57565b608435906001600160601b038216820361036b57565b3461036b57604036600319011261036b5760043561048e8161044a565b6024356001600160601b038116810361036b576104b2916104ad6137b0565b6137e3565b005b5f91031261036b57565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9060206104f39281815201906104be565b90565b3461036b575f36600319011261036b576103d9610511610a5b565b6040519182916020835260208301906104be565b3461036b57602036600319011261036b57602061056e60043561054781613890565b505f9081525f516020614e365f395f51905f5260205260409020546001600160a01b031690565b6040516001600160a01b039091168152f35b3461036b57604036600319011261036b5760043561059d8161044a565b602435906105aa82613890565b33151580610655575b80610644575b610631576104b2926106129181906001600160a01b0385811691167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9255f80a45f525f516020614e365f395f51905f5260205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b63a9fbf51f60e01b5f523360045260245ffd5b5061064f338261372b565b156105b9565b506001600160a01b0381163314156105b3565b3461036b57602036600319011261036b576004356106846126c1565b506106906002546109ce565b604051631c32dab160e11b815260048101839052602481018290526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190602081604481875afa90811561092f575f916109af575b50604051632c73f39f60e11b8152917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169190602084600481865afa93841561092f5761075a60209361ffff6107959761076b945f91610998575b501690612747565b6001600160401b0361271091160490565b95604051808096819463179f342960e21b8352896004840160209093929193604081019481520152565b03915afa91821561092f575f92610963575b506020600491604051928380926356af0a7160e01b82525afa801561092f576108089261ffff61075a926107e3945f9161093457501690612747565b926101005f5460405180948192631b4d85a560e21b8352600483019190602083019252565b03817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561092f576103d9945f935f936108f1575b505f936001600160a01b0384166108cc575b509061087861087261087e9361089f96976138ce565b91613967565b90612817565b92610887610ccf565b93845260208401526001600160a01b03166040830152565b604080518251815260208084015190820152918101516001600160a01b0316908201529081906060820190565b61089f945061087261087e93926108e688610878946127da565b96509293505061085c565b9092506109179193506101003d8111610928575b61090f8183610a3a565b81019061276f565b50979550505050905092915f61084a565b503d610905565b61270e565b610956915060203d60201161095c575b61094e8183610a3a565b810190612719565b5f610752565b503d610944565b6004919250610989602091823d8411610991575b6109818183610a3a565b8101906126ef565b9291506107a7565b503d610977565b6109569150873d891161095c5761094e8183610a3a565b6109c8915060203d602011610991576109818183610a3a565b5f6106ef565b90600182811c921680156109fc575b60208310146109e857565b634e487b7160e01b5f52602260045260245ffd5b91607f16916109dd565b634e487b7160e01b5f52604160045260245ffd5b604081019081106001600160401b03821117610a3557604052565b610a06565b90601f801991011681019081106001600160401b03821117610a3557604052565b604051905f825f516020614df65f395f51905f525491610a7a836109ce565b8083529260018116908115610b0b5750600114610aa0575b610a9e92500383610a3a565b565b505f516020614df65f395f51905f525f90815290917f37c58c799b6609234b945e882912ee9ad34948a1dfaa20a97485e1a7752bbf815b818310610aef575050906020610a9e92820101610a92565b6020919350806001915483858901015201910190918492610ad7565b60209250610a9e94915060ff191682840152151560051b820101610a92565b604051905f8260025491610b3d836109ce565b8083529260018116908115610b0b5750600114610b6057610a9e92500383610a3a565b5060025f90815290917f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b818310610ba3575050906020610a9e92820101610a92565b6020919350806001915483858901015201910190918492610b8b565b604051905f8260015491610bd2836109ce565b8083529260018116908115610b0b5750600114610bf557610a9e92500383610a3a565b5060015f90815290917fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b818310610c38575050906020610a9e92820101610a92565b6020919350806001915483858901015201910190918492610c20565b3461036b575f36600319011261036b576103d9610511610b2a565b3461036b575f36600319011261036b576020600354604051908152f35b606090600319011261036b57600435610ca48161044a565b90602435610cb18161044a565b9060443590565b3461036b576104b2610cc936610c8c565b91612824565b60405190610a9e606083610a3a565b6001600160401b038111610a3557601f01601f191660200190565b60405190610d08602083610a3a565b5f8252565b60405190610d1c604083610a3a565b6005825264696d61676560d81b6020830152565b3461036b575f36600319011261036b576103d9610511610d0d565b3461036b57604036600319011261036b57600435602435905f527fdaedc9ab023613a7caf35e703657e986ccfad7e3eb0af93a2853f8d65dd86b01602052610d9560405f206129d2565b80519091906001600160a01b031615610df4575b612710610dc7610dd8926001600160601b03602086015116906127da565b92519204916001600160a01b031690565b604080516001600160a01b039290921682526020820192909252f35b9050610dd8612710610dc7610e0761298d565b9392505050610da9565b3461036b575f36600319011261036b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461036b57602036600319011261036b576040516333727c4d60e01b815260048035908201526020816024816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa801561092f576103d9915f91610ed0575060405190151581529081906020820190565b610ef2915060203d602011610ef8575b610eea8183610a3a565b8101906129f7565b5f6103c6565b503d610ee0565b929192610f0b82610cde565b91610f196040519384610a3a565b82948184528183011161036b578281602093845f960137010152565b9080601f8301121561036b578160206104f393359101610eff565b3461036b57604036600319011261036b576004356001600160401b03811161036b57610f80903690600401610f35565b6024356001600160401b03811161036b57610f9f903690600401610f35565b303303611079577ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790611019611009604051602081610fde8189611666565b60078152030190205494855f52600d602052610ffd8460405f206139ce565b60405191828092611666565b0390209160405191828092611666565b03902060405191847fd77aab0eeab3a3cbdac072fcdbc34709b18d6c4af91f7869c71cbbb13d71a6b95f80a4828152602090a11561105357005b7fa5d4097edda6d87cb9329af83fb3712ef77eeb13738ffe43cc35a4ce305ad9625f80a1005b635c427cd960e01b5f5260045ffd5b3461036b576104b261109936610c8c565b90604051926110a9602085610a3a565b5f8452612f31565b3461036b575f36600319011261036b5760205f54604051908152f35b3461036b575f36600319011261036b5760206040515f8152f35b3461036b575f36600319011261036b576004546040516001600160a01b039091168152602090f35b3461036b575f36600319011261036b57602060ff60045460a01c166040519015158152f35b3461036b57602036600319011261036b57602061056e600435613890565b9081602091031261036b573590565b3461036b57602036600319011261036b576004355f52600b602052602060018060a01b0360405f205416604051908152f35b3461036b57602036600319011261036b576004356111b08161044a565b6001600160a01b038116156111d3576111ca602091612a22565b54604051908152f35b6322718ad960e21b5f525f60045260245ffd5b3461036b575f36600319011261036b576111fe6137b0565b5f516020614e165f395f51905f5280546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461036b575f36600319011261036b576103d9610511610bbf565b3461036b57602036600319011261036b576004355f526008602052602060405f2054604051908152f35b60206040818301928281528451809452019201905f5b8181106112b55750505090565b82518452602093840193909201916001016112a8565b3461036b57602036600319011261036b576004355f52600960205260405f206040519081602082549182815201915f5260205f20905f5b818110611325576103d98561131981870382610a3a565b60405191829182611292565b8254845260209093019260019283019201611302565b3461036b575f36600319011261036b575f516020614e165f395f51905f52546040516001600160a01b039091168152602090f35b634e487b7160e01b5f52603260045260245ffd5b3461036b57604036600319011261036b57600435602435905f52600960205260405f2090815481101561036b576020915f52815f200154604051908152f35b3461036b575f36600319011261036b576040515f5f516020614e765f395f51905f52546113ee816109ce565b808452906001811690811561148c5750600114611422575b6103d98361141681850382610a3a565b604051918291826104e2565b5f516020614e765f395f51905f525f9081527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e939250905b80821061147257509091508101602001611416611406565b91926001816020925483858801015201910190929161145a565b60ff191660208086019190915291151560051b840190910191506114169050611406565b9181601f8401121561036b578235916001600160401b03831161036b576020838186019501011161036b57565b3461036b57606036600319011261036b576004356024356044356001600160401b03811161036b576115139036906004016114b0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169390929033859003611553576104b29450612b57565b8463789ad5fb60e11b5f526004523360245260445ffd5b8015150361036b57565b3461036b57604036600319011261036b576004356115918161044a565b60243561159d8161156a565b6001600160a01b03821691821561160f576115d0906115bb33612a5a565b9060018060a01b03165f5260205260405f2090565b9015159060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b82630b61174360e31b5f5260045260245ffd5b3461036b575f36600319011261036b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b805191908290602001825e015f815290565b602061168a9160405192838092611666565b600781520301902090565b3461036b57602036600319011261036b576004356001600160401b03811161036b576116d760206116cb81933690600401610f35565b60405192838092611666565b600781520301902054604051908152f35b3461036b57608036600319011261036b576004356024356001600160401b03811161036b5761171b903690600401610f35565b906044356001600160401b03811161036b5761173b903690600401610f35565b606435926001600160401b03841161036b5761175e6104b2943690600401610f35565b92612de6565b3461036b57606036600319011261036b576004356024356001600160401b03811161036b576117979036906004016114b0565b91906044356001600160401b03811161036b576117b89036906004016114b0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316338190036119b257506117fe8261180c92611811940190611152565b5f52600960205260405f2090565b612a92565b9283519283156119a35761183661182786612b23565b515f52600a60205260405f2090565b54036119945761184591613e68565b918251820361198557611856610b2a565b905f5b83811061186257005b61186c8183612b35565b519061188a611883835f52600860205260405f2090565b5485613f66565b916118a86118a0825f52600d60205260405f2090565b5460ff161590565b15611920576118b78288612b35565b51926118c1610cf9565b91303b1561036b576118e95f93604051968794859463aea3050760e01b865260048601612ef5565b038183305af191821561092f57600192611906575b505b01611859565b806119145f61191a93610a3a565b806104b4565b5f6118fe565b5061192b8187612b35565b5191303b1561036b57604051631f9bee7160e11b8152925f9184918291611956919060048401612ed0565b038183305af191821561092f57600192611971575b50611900565b806119145f61197f93610a3a565b5f61196b565b632ec7434360e21b5f5260045ffd5b63ed7f2fd360e01b5f5260045ffd5b6302e8145360e61b5f5260045ffd5b63432e033760e11b5f526004523360245260445ffd5b3461036b57602036600319011261036b576004355f52600d6020526103d961051160405f20613fcd565b3461036b57608036600319011261036b57600435611a0f8161044a565b60243590611a1c8261044a565b604435606435926001600160401b03841161036b57611a426104b2943690600401610f35565b92612f31565b60405190611a57604083610a3a565b6005825264199c985d5960da1b6020830152565b3461036b575f36600319011261036b576103d9610511611a48565b604036600319011261036b576004356001600160401b03811161036b573660238201121561036b578060040135906001600160401b03821161036b573660248360051b8301011161036b576104b2916024803592611ae38461044a565b016130d9565b3461036b5760a036600319011261036b57600435611b068161044a565b6024356001600160401b03811161036b57611b259036906004016114b0565b6044929192356001600160401b03811161036b57611b479036906004016114b0565b60643591611b5361045b565b935f516020614e565f395f51905f5254966001600160401b03611b91611b84611b808b60ff9060401c1690565b1590565b996001600160401b031690565b1680159081611ca6575b6001149081611c9c575b159081611c93575b50611c8457611bf09688611be760016001600160401b03195f516020614e565f395f51905f525416175f516020614e565f395f51905f5255565b611c4f5761349c565b611bf657005b611c2060ff60401b195f516020614e565f395f51905f5254165f516020614e565f395f51905f5255565b604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b611c7f600160401b60ff60401b195f516020614e565f395f51905f525416175f516020614e565f395f51905f5255565b61349c565b63f92ee8a960e01b5f5260045ffd5b9050155f611bad565b303b159150611ba5565b899150611b9b565b3461036b575f36600319011261036b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461036b57602036600319011261036b57600435600354811015611e175761141681611d2c6118a06103d9945f52600d60205260405f2090565b15611def57611dd8611d4d611d3f611e26565b611d47610cf9565b906143a7565b91611d60815f52600860205260405f2090565b5490611d84611d7f611d70610d0d565b925f52600d60205260405f2090565b613fcd565b611d8c611a48565b90611dbf7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661449f565b92611dca5f54614553565b94611dd3610b2a565b6146a9565b90611de1610a5b565b611de9610bbf565b906147bb565b611dd8611d4d611e12611e0d611d7f855f52600d60205260405f2090565b6136dc565b611d3f565b6307ed98ed60e31b5f5260045ffd5b60405190611e35608083610a3a565b6042825261706960f01b6060837f697066733a2f2f6261666b7265696477686773766462356e367871656b6d717560208201527f696f68667a35707a63653777616678776b74716a6b6d346c326971336f61367160408201520152565b3461036b575f36600319011261036b576103d9610511611e26565b602036600319011261036b57600435611ed161180c825f52600960205260405f2090565b9081519081156119a357611eed815f52600c60205260405f2090565b546119a357611efe61182784612b23565b5461209f57611f3b6020611f136002546109ce565b60405163179f342960e21b815260048101869052602481019190915291829081906044820190565b03817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561092f575f91612080575b50611f8281846138ce565b90611fa5611f98845f52600b60205260405f2090565b546001600160a01b031690565b92611fb3611b808486613a3a565b61207157611fd2611fc387612b23565b515f52600860205260405f2090565b54611fe8611fc3611fe288612b49565b89612b35565b5493611ffc611ff78884612817565b612b49565b85036120625761203f9561203a61201761202c978a95613add565b94604051978891602083019190602083019252565b03601f198101885287610a3a565b613c5f565b5f5b82811061204a57005b808261205b61182760019488612b35565b5501612041565b6370ba188760e01b5f5260045ffd5b631e9acf1760e31b5f5260045ffd5b612099915060203d602011610991576109818183610a3a565b5f611f77565b6329af1d3160e21b5f5260045ffd5b3461036b57606036600319011261036b576004356001600160401b03811161036b576120de9036906004016114b0565b6024356001600160401b03811161036b576120fd9036906004016114b0565b91604435906001600160401b03821161036b576121789461212561212c9336906004016114b0565b5050613712565b54906020612158611d7f612148855f52600a60205260405f2090565b54945f52600d60205260405f2090565b92604051809681926333727c4d60e01b8352600483019190602083019252565b03817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa92831561092f576103d9945f946121f9575b50836121d4575b50506040519115158252509081906020820190565b6121e19293503691610eff565b602081519101209060208151910120145f80806121bf565b61221391945060203d602011610ef857610eea8183610a3a565b925f6121b8565b3461036b575f36600319011261036b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461036b575f36600319011261036b575f8052600d6020527f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ee5460ff16612353576103d96114166122fd61234e60026040516122bb602082610a3a565b5f81525b6123376122ca610a5b565b91600d61231d6122d8610bbf565b6013604051998a97693d913730b6b2911d101160b11b60208a0152602a890190611666565b72111610113232b9b1b934b83a34b7b7111d101160691b81520190611666565b6c1116101134b6b0b3b2911d101160991b81520190611666565b61227d60f01b815203601d19810184520182610a3a565b614ae8565b5f8052600d6020526103d96114166122fd61234e6002612395611e0d7f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ee613fcd565b6122bf565b3461036b57604036600319011261036b57602060ff6123d36004356123be8161044a565b6115bb602435916123ce8361044a565b612a5a565b54166040519015158152f35b3461036b57606036600319011261036b576004356024356123ff8161044a565b6044359061240c8261044a565b82156124f0576001600160a01b0381169283156124e1576001600160a01b038316156124e1576003546124d2576124cd6124bd82611ff75f969561249288976124757fdeaa91b6123d068f5821d0fb0678463d1a8a6079fe8af5de3ce5e896dcf9133d98600355565b60018060a01b03166001600160601b0360a01b6004541617600455565b600580546001600160a01b0319166001600160a01b0383161790556001600160801b03831690614833565b6040519081529081906020820190565b0390a4005b63ef65161f60e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b6334bbd58560e01b5f5260045ffd5b3461036b57602036600319011261036b5760043561251b6126c1565b506125276002546109ce565b604051631c32dab160e11b8152600481018390526024810182905291906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016602084604481845afa93841561092f575f94612642575b5060405163179f342960e21b815260048101849052602481019290925260209082908180604481015b03915afa90811561092f575f91612623575b506040516356af0a7160e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa801561092f576108089261ffff61075a926107e3945f9161093457501690612747565b61263c915060203d602011610991576109818183610a3a565b5f6125c0565b6020919450916126616125ae93833d8511610991576109818183610a3a565b94915091612585565b3461036b57602036600319011261036b576104b260043561268a8161044a565b6126926137b0565b61373f565b3461036b57602036600319011261036b576004355f52600a602052602060405f2054604051908152f35b60405190606082018281106001600160401b03821117610a35576040525f6040838281528260208201520152565b9081602091031261036b57516001600160401b038116810361036b5790565b6040513d5f823e3d90fd5b9081602091031261036b575161ffff8116810361036b5790565b634e487b7160e01b5f52601160045260245ffd5b906001600160401b03809116911602906001600160401b03821691820361276a57565b612733565b91908261010091031261036b5781519160208101519160408201519160608101516127998161044a565b9160808201519160a08101519160e060c08301516127b68161044a565b9201516104f38161156a565b600281901b91906001600160fe1b0381160361276a57565b8181029291811591840414171561276a57565b906004820180921161276a57565b906002820180921161276a57565b906001820180921161276a57565b9190820180921161276a57565b6001600160a01b0382169291831561297a57826128408161484d565b943361296a575b6001600160a01b0386169261289d908461294c575b61286581612a22565b60018154019055610612845f527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260405f2090565b827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a46128e6611b808460ff6001918060081c5f526006602052161b60405f205416151590565b612926575b6001600160a01b038216036128ff57505050565b6364283d7b60e01b5f526001600160a01b039081166004526024919091521660445260645ffd5b612947838060081c5f526006602052600160ff60405f2092161b8154179055565b6128eb565b612955846148c6565b61295e88612a22565b80545f1901905561285c565b612975823388614b2d565b612847565b633250574960e11b5f525f60045260245ffd5b6040519061299a82610a1a565b7fdaedc9ab023613a7caf35e703657e986ccfad7e3eb0af93a2853f8d65dd86b00546001600160a01b038116835260a01c6020830152565b906040516129df81610a1a565b91546001600160a01b038116835260a01c6020830152565b9081602091031261036b57516104f38161156a565b612a1c9060405191828092611666565b03902090565b6001600160a01b03165f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793036020526040902090565b6001600160a01b03165f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020526040902090565b90604051918281549182825260208201905f5260205f20925f5b818110612ac1575050610a9e92500383610a3a565b8454835260019485019487945060209093019201612aac565b6001600160401b038111610a355760051b60200190565b90612afb82612ada565b612b086040519182610a3a565b8281528092612b19601f1991612ada565b0190602036910137565b805115612b305760200190565b61136f565b8051821015612b305760209160051b010190565b5f1981019190821161276a57565b91612b659193810190611152565b91612b7b61180c845f52600960205260405f2090565b9081519283156119a357612b97855f52600c60205260405f2090565b5403612dd7575f848152600c602052604081205560408051602081018681524292820192909252612bd581606081015b03601f198101835282610a3a565b5190201891612be381612af1565b5f5b828110612daa575050612c266020612bfe6002546109ce565b60405163179f342960e21b815260048101859052602481019190915291829081906044820190565b03817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561092f575f91612d8b575b50612c6d81836138ce565b90612c83611f98875f52600b60205260405f2090565b94612c91611b808488613a3a565b612d485790612cb182612cab611ff787612ce09796612817565b90613add565b8460405193612cda85612ccc8c602083019190602083019252565b03601f198101875286610a3a565b88613c5f565b915f5b828110612d30575050604080519283526001600160a01b039093166020830152507fb69d9663d7cafb017e81cb24f87c0ca7043d4e392ceef01df6be47c2a77ed6ca91819081015b0390a2565b8084612d4161182760019486612b35565b5501612ce3565b50506040516001600160a01b039094168452507f1609dd4502bc567d6fa9727697af7b54715ea188186a6fc35a0d367163822bbb92915081905060208101612d2b565b612da4915060203d602011610991576109818183610a3a565b5f612c62565b80612db760019287612817565b80612dc28386612b35565b52612dd0611fc38388612b35565b5501612be5565b63067bdaff60e51b5f5260045ffd5b929030330361107957835f52600d60205260ff60405f205416612ec1578391612e558284612e347f65deac95b53ba76b9cdc6cf446af81731e1218c91eaf9811a95d28bde23b893e95611678565b55612e5086612e4b875f52600d60205260405f2090565b6139ce565b612a0c565b93612e6560405192839283612ed0565b0390a36040518181527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790602090a115612e9b57565b7fa5d4097edda6d87cb9329af83fb3712ef77eeb13738ffe43cc35a4ce305ad9625f80a1565b6310836f6760e31b5f5260045ffd5b9091612ee76104f3936040845260408401906104be565b9160208184039101526104be565b92612f156104f39593612f239386526080602087015260808601906104be565b9084820360408601526104be565b9160608184039101526104be565b909291612f3f818584612824565b833b612f4c575b50505050565b602091612f6e6040519485938493630a85bd0160e11b8552336004860161406c565b03815f6001600160a01b0387165af15f9181612ffb575b50612fbf5750612f9361409d565b8051919082612fb857633250574960e11b5f526001600160a01b03821660045260245ffd5b9050602001fd5b6001600160e01b03191663757a42ff60e11b01612fe057505f808080612f46565b633250574960e11b5f526001600160a01b031660045260245ffd5b61301e91925060203d602011613025575b6130168183610a3a565b810190614057565b905f612f85565b503d61300c565b602080825281018390526001600160fb1b03831161036b5760409260051b809284830137010190565b818110613060575050565b5f8155600101613055565b906001600160401b038311610a3557600160401b8311610a355781548383558084106130bd575b50905f5260205f205f5b8381106130a95750505050565b60019060208435940193818401550161309c565b6130d390835f528460205f209182019101613055565b5f613092565b6004549092906001600160a01b0316330361107957811561332557604051602081019061310b81612bc786888661302c565b5190209261311a6002546109ce565b60405163179f342960e21b81526004810185905260248101829052906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690602083604481855afa90811561092f576131896020926131b3955f91613308575b50886138ce565b926040518080968194631c32dab160e11b83528b6004840160209093929193604081019481520152565b03915afa91821561092f575f926132e7575b506131d96131d283613967565b9182612817565b34106132d85761323a916040519161320a836131fc8a6020830160209181520190565b03601f198101855284610a3a565b60405192613232846132248b602083019190602083019252565b03601f198101865285610a3a565b309187614117565b9081156132c9577f9b9b391103f687e8dae1e4248840b5391bbd3f381b8b7b099d54114675d570f89361327e91613279875f52600960205260405f2090565b61306b565b61329482610612865f52600b60205260405f2090565b806132a7855f52600c60205260405f2090565b55604080519182526001600160a01b0390921660208201529081908101612d2b565b6331434ee760e11b5f5260045ffd5b631e76390f60e21b5f5260045ffd5b61330191925060203d602011610991576109818183610a3a565b905f6131c5565b61331f9150843d8611610991576109818183610a3a565b5f613182565b63521299a960e01b5f5260045ffd5b90601f8211613341575050565b610a9e915f516020614df65f395f51905f525f5260205f20906020601f840160051c83019310613379575b601f0160051c0190613055565b909150819061336c565b9190601f811161339257505050565b610a9e925f5260205f20906020601f840160051c8301931061337957601f0160051c0190613055565b91906001600160401b038111610a35576133e1816133da6002546109ce565b6002613383565b5f601f821160011461341f57819061340f93945f92613414575b50508160011b915f199060031b1c19161790565b600255565b013590505f806133fb565b60025f52601f198216937f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace915f5b868110613484575083600195961061346b575b505050811b01600255565b01355f19600384901b60f8161c191690555f8080613460565b9092602060018192868601358155019401910161344d565b9594939290926134aa614aa0565b6134b2614aa0565b6134ba614aa0565b6134c38761373f565b81019060808183031261036b5780356001600160401b03811161036b57826134ec918301610f35565b9160208201356001600160401b03811161036b578161350c918401610f35565b9060408301356001600160401b03811161036b5760609161352e918501610f35565b9201359261353b8461156a565b613543614aa0565b61354b614aa0565b8051906001600160401b038211610a355761357c826135775f516020614df65f395f51905f52546109ce565b613334565b602090601f831160011461363557926135b7836135ef9796946135cb946135d0975f9261362a5750508160011b915f199060031b1c19161790565b5f516020614df65f395f51905f52556141bd565b6142d0565b6004805460ff60a01b191691151560a01b60ff60a01b16919091179055565b801561361b576135fe916133bb565b5f556001600160601b038116613612575050565b610a9e916137e3565b63b8a7f21960e01b5f5260045ffd5b015190505f806133fb565b5f516020614df65f395f51905f525f52601f19831691907f37c58c799b6609234b945e882912ee9ad34948a1dfaa20a97485e1a7752bbf81925f5b8181106136c45750936135cb936135d09693600193836135ef9b9a98106136ac575b505050811b015f516020614df65f395f51905f52556141bd565b01515f1960f88460031b161c191690555f8080613692565b92936020600181928786015181550195019301613670565b90610a9e6137049260405193849166697066733a2f2f60c81b60208401526027830190611666565b03601f198101845283610a3a565b6020908260405193849283378101600781520301902090565b60ff916115bb61373a92612a5a565b541690565b6001600160a01b0316801561379d575f516020614e165f395f51905f5280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b631e4fbdf760e01b5f525f60045260245ffd5b5f516020614e165f395f51905f52546001600160a01b031633036137d057565b63118cdaa760e01b5f523360045260245ffd5b906001600160601b0316906127108211613877576001600160a01b038116156138645760209160405191613818604084610a3a565b6001600160a01b039081168352928201819052905160a09190911b6001600160a01b0319169116177fdaedc9ab023613a7caf35e703657e986ccfad7e3eb0af93a2853f8d65dd86b0055565b635b6cc80560e11b5f525f60045260245ffd5b50636f483d0960e01b5f5260045261271060245260445ffd5b6138998161484d565b906001600160a01b038216156138ad575090565b637e27328960e01b5f5260045260245ffd5b9081602091031261036b575190565b5f54604051635170b6af60e01b815260048101919091526001600160401b0392909216602483015260448201526020816064817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561092f575f9161393e575090565b6104f3915060203d602011613960575b6139588183610a3a565b8101906138bf565b503d61394e565b604051631b3170cd60e31b81525f60048201526001600160401b039190911660248201526020816044817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561092f575f9161393e575090565b81518060081b60ff17925f9060fe831115613a16575b90835f526020805f20915b8181850101518160051c840155019083821015613a0f57602090916139ef565b5050505055565b935050601f928381015160081b82179380831115613a3457906139e4565b50505055565b6001600160a01b03811615613a4f5731101590565b5047101590565b6002545f9291613a65826109ce565b9160018116908115613acb5750600114613a7d575050565b60025f90815292935090917f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b838210613ab75750500190565b600181602092548486015201910190613aaa565b60ff1916825250811515909102019150565b6104f390613b5c928082145f14613b6a5750613b1f613afe612bc792614553565b604051661139b2b2b2111d60c91b6020820152928391602783015b90611666565b6040516b2dbd91383937b6b83a111d1160a11b6020820152928391612bc79190613b19613b4e602c8601613a56565b61088b60f21b815260020190565b617d5d60f01b815260020190565b613bcc90612bc7613bbf613b89613b83613bb296614553565b93614553565b6040516d22736565645f72616e6765223a5b60901b6020820152958694613b199190602e870183565b600b60fa1b815260010190565b605d60f81b815260010190565b613b1f565b906003821015613bde5752565b634e487b7160e01b5f52602160045260245ffd5b969590610a9e95613c27613c4a9560e097956001600160401b03948c5260208c015261010060408c01526101008b01906104be565b6001600160a01b0390941660608a015216608088015286820360a08801526104be565b93613c5860c082015f613bd1565b015f613bd1565b93949391926001600160a01b0390921691908215613cb657505f602094613ca182549160405198899788968795636bfa485f60e11b8752309260048801613bf2565b03925af190811561092f575f9161393e575090565b5f54604051631b4d85a560e21b81526004810191909152946001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016935061010086602481875afa801561092f576020968587925f925f91613d6f575b506001600160a01b03169182613d53575b50505050613ca15f54916040519889978896879563204b4a7d60e11b8752309260048801613bf2565b613d6693613d60916127da565b916148f4565b845f8581613d2a565b9050613d8b9192506101003d81116109285761090f8183610a3a565b509695505050509050915f613d19565b9060041161036b5790600490565b9093929384831161036b57841161036b578101920390565b356001600160e01b0319811692919060048210613ddc575050565b6001600160e01b031960049290920360031b82901b16169150565b90613e0182612ada565b613e0e6040519182610a3a565b8281528092613e1f601f1991612ada565b01905f5b828110613e2f57505050565b806060602080938501015201613e23565b90613e4a82610cde565b613e576040519182610a3a565b8281528092612b19601f1991610cde565b9160048210613f4d5763ffffffff613e92613e8c613e868587613d9b565b90613dc1565b60e01c90565b1692613e9d84613df7565b925f60045b63ffffffff82169087821015613f5c57613ebb816127ed565b8410613f4d57613ee4613ede613e8c613e86613ed6856127ed565b85898b613da9565b916127ed565b9163ffffffff8216613ef68185612817565b8610613f3e5783613f2f8389613f28613f35968e60019963ffffffff9b613f1c8a613e40565b95016020860137612b35565b528b612b35565b50612817565b92011690613ea2565b630601a0fb60e51b5f5260045ffd5b630dfe930960e41b5f5260045ffd5b5050505050915090565b60016104f391613fb7613f7b613fa195614553565b60096040519687946a3d91383937b6b83a111d1160a91b6020870152602b860190611666565b6811161139b2b2b2111d60b91b81520190611666565b607d60f81b815203601e19810184520182610a3a565b9060405191602083018154908160081c915f9160ff8083160361402f575b505090915f526020805f20915b8060051c8301548282880101520190828210156140185790602090613ff8565b50506040905b80845283015f602082015201604052565b81905260ff1692601f925090508183111561404d5791905f80613feb565b505060409061401e565b9081602091031261036b57516104f381610359565b6001600160a01b0391821681529116602082015260408101919091526080606082018190526104f3929101906104be565b3d156140c7573d906140ae82610cde565b916140bc6040519384610a3a565b82523d5f602084013e565b606090565b906104f39492936140f36001600160401b03925f855260a0602086015260a08501906104be565b6001600160a01b0390951660408401521660608201528083036080909101526104be565b602094936001600160a01b03909116929091831561415c57505f9061413c3485614a54565b613ca160405197889687958694639ed2228960e01b8652600486016140cc565b925061417e6040519687958694859463066c41f360e11b8652600486016140cc565b03917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561092f575f9161393e575090565b9081516001600160401b038111610a35576141fc816141e95f516020614e765f395f51905f52546109ce565b5f516020614e765f395f51905f52613383565b602092601f821160011461423c5761422b929382915f9261362a5750508160011b915f199060031b1c19161790565b5f516020614e765f395f51905f5255565b5f516020614e765f395f51905f525f52601f198216937ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e915f5b8681106142b857508360019596106142a0575b505050811b015f516020614e765f395f51905f5255565b01515f1960f88460031b161c191690555f8080614289565b91926020600181928685015181550194019201614276565b9081516001600160401b038111610a35576142f7816142f06001546109ce565b6001613383565b602092601f821160011461432b57614326929382915f9261362a5750508160011b915f199060031b1c19161790565b600155565b60015f52601f198216937fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6915f5b86811061438f5750836001959610614377575b505050811b01600155565b01515f1960f88460031b161c191690555f808061436c565b91926020600181928685015181550194019201614359565b805115159082511515918080614498575b6144425761441357506143ce57506104f3610cf9565b6040517030b734b6b0ba34b7b72fbab936111d101160791b6020820152906104f3908290612bc7906144039060318401613b19565b631116101160e11b815260040190565b6040516834b6b0b3b2911d101160b91b602082015292506104f391508290612bc7906144039060298401613b19565b506040516834b6b0b3b2911d101160b91b6020820152926104f392508391612bc79161440391613b1990614477906029870183565b741116101130b734b6b0ba34b7b72fbab936111d101160591b815260150190565b50826143b8565b6001600160a01b0316806144bb6144b660286127fb565b613e40565b9160306144c784612b23565b53825160011015612b3057607860218401536144e36028612809565b6001811161450b57506144f4575090565b63e22e27eb60e01b5f52600452601460245260445ffd5b90600f81166010811015612b305761454e91614548916f181899199a1a9b1b9c1cb0b131b232b360811b901a6145418588614acb565b5360041c90565b91614adc565b6144e3565b805f9172184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b821015614686575b806d04ee2d6d415b85acef8100000000600a92101561466a575b662386f26fc10000811015614655575b6305f5e100811015614643575b612710811015614633575b6064811015614624575b1015614619575b61460460216145d960018501613e40565b938401015b5f1901916f181899199a1a9b1b9c1cb0b131b232b360811b600a82061a8353600a900490565b80156146145761460490916145de565b505090565b6001909101906145c8565b600290606490049301926145c1565b60049061271090049301926145b7565b6008906305f5e10090049301926145ac565b601090662386f26fc10000900493019261459f565b6020906d04ee2d6d415b85acef8100000000900493019261458f565b506040915072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8104614575565b9492906146b99096949296614553565b9560405196879669383937b6b83a111d101160b11b6020890152602a88016146e091611666565b6a01116101139b2b2b2111d160ad1b8152600b016146fd91611666565b6f16101130b4b3b1afba3cb832911d101160811b815260100161471f91611666565b701116101130b4b3b1afb230ba30911d101160791b815260110161474291611666565b7111161011383937b7b32fba3cb832911d101160711b815260120161476691611666565b6f11161011383937bb34b232b9111d101160811b815260100161478891611666565b6e1116101136b7b232b624b2111d101160891b8152600f016147a991611666565b03601f19810182526104f39082610a3a565b6002906123376104f395613b196147fa96600461482261234e9860136040519b8c99693d913730b6b2911d101160b11b60208c0152602a8b0190611666565b631116101160e11b81526e3232b9b1b934b83a34b7b7111d101160891b858201520190611666565b631116101160e11b81520190611666565b6148446001600160801b0391612a22565b91168154019055565b600354811015611e17576148788160ff6001918060081c5f526006602052161b60405f205416151590565b156148b6575f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260409020546001600160a01b031690565b506005546001600160a01b031690565b6148e4905f525f516020614e365f395f51905f5260205260405f2090565b80546001600160a01b0319169055565b604051636eb1769f60e11b81523060048201526001600160a01b038084166024830152929390926020908490604490829086165afa92831561092f575f93614a33575b50820180921161276a5760405163095ea7b360e01b602082019081526001600160a01b03851660248301526044820193909352916149ab9061497c8460648101613224565b83516001600160a01b038416915f91829182855af19061499a61409d565b82614a01575b50816149fa57501590565b6149b457505050565b60405163095ea7b360e01b60208201526001600160a01b0390931660248401525f6044840152610a9e926149f5906149ef8160648101612bc7565b82614d2d565b614d2d565b3b15919050565b80519192508115918215614a19575b5050905f6149a0565b614a2c92506020809183010191016129f7565b5f80614a10565b614a4d91935060203d602011613960576139588183610a3a565b915f614937565b814710614a8d575f918291829182916001600160a01b03165af1614a7661409d565b5015614a7e57565b630a12f52160e11b5f5260045ffd5b63cd78605960e01b5f523060045260245ffd5b60ff5f516020614e565f395f51905f525460401c1615614abc57565b631afcd79f60e31b5f5260045ffd5b908151811015612b30570160200190565b801561276a575f190190565b6104f3614af7612bc792614c4b565b6040519283917f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006020840152603d830190611666565b6001600160a01b038216918215159081614b83575b5015614b4d57505050565b6001600160a01b0316614b6e57637e27328960e01b5f52600482905260245ffd5b63177e802f60e01b5f5260045260245260445ffd5b6001600160a01b038316841491508115614bd1575b508015614ba6575b5f614b42565b505f8381525f516020614e365f395f51905f5260205260409020546001600160a01b03168214614ba0565b60ff9150614be2906115bb84612a5a565b54165f614b98565b60405190614bf9606083610a3a565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b90815115614d2357614c5b614bea565b91614c7b6144b6614c76614c6f84516127fb565b6003900490565b6127c2565b90602082019080815182019560208701908151925f83525b888110614cd55750506003939495965052510680600114614cc357600214614cb9575090565b603d905f19015390565b50603d90815f19820153600119015390565b600360049199969901986001603f8b5182828260121c16870101518453828282600c1c16870101518385015382828260061c1687010151600285015316840101516003820153019497614c93565b90506104f3610cf9565b5f80614d559260018060a01b03169360208151910182865af1614d4e61409d565b9083614da6565b8051908115159182614d8b575b5050614d6b5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b614d9e92506020809183010191016129f7565b155f80614d62565b90614dbb5750805115614a7e57805190602001fd5b81511580614dec575b614dcc575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b15614dc456fe80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793009016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079304f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079301a264697066735822122094f0c3d823050e83f8af2455e1e98bf6c217ab3bbec993a7dad81fe9fe3cc80364736f6c634300081c0033f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00000000000000000000000000020e7fc3d7482bc62c089f9c90e029e3b5eb123e0000000000000000000000000a0f4321214bb6c7811dd8a71cf587bdaf03f0a0000000000000000000000000e9e31fb334210274ba5b9c69872c6fe9bb2b12000000000000000000000000001c005665bf072724c542194b11c80b8d3a757055