14.5k txs
15k calls
constructor
constructor(address _usde, address _weth, address[] _assets, (uint8 tokenType, bool isActive, uint128 maxMintPerBlock, uint128 maxRedeemPerBlock)[] _tokenConfig, (uint128 globalMaxMintPerBlock, uint128 globalMaxRedeemPerBlock) _globalConfig, address[] _custodians, address _admin)
functions
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
delegatedSigner
viewfunction delegatedSigner(address, address) view returns (uint8)
encodeOrder
purefunction encodeOrder(tuple order) pure returns (bytes)
getDomainSeparator
viewfunction getDomainSeparator() view returns (bytes32)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
globalConfig
viewfunction globalConfig() view returns (uint128 globalMaxMintPerBlock, uint128 globalMaxRedeemPerBlock)
hashOrder
viewfunction hashOrder(tuple order) view returns (bytes32)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
isApprovedBeneficiary
viewfunction isApprovedBeneficiary(address benefactor, address beneficiary) view returns (bool)
isCustodianAddress
viewfunction isCustodianAddress(address custodian) view returns (bool)
isSupportedAsset
viewfunction isSupportedAsset(address asset) view returns (bool)
isWhitelistedBenefactor
viewfunction isWhitelistedBenefactor(address benefactor) view returns (bool)
owner
viewfunction owner() view returns (address)
stablesDeltaLimit
viewfunction stablesDeltaLimit() view returns (uint128)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
tokenConfig
viewfunction tokenConfig(address) view returns (uint8 tokenType, bool isActive, uint128 maxMintPerBlock, uint128 maxRedeemPerBlock)
totalPerBlock
viewfunction totalPerBlock(uint256) view returns (uint128 mintedPerBlock, uint128 redeemedPerBlock)
totalPerBlockPerAsset
viewfunction totalPerBlockPerAsset(uint256, address) view returns (uint128 mintedPerBlock, uint128 redeemedPerBlock)
usde
viewfunction usde() view returns (address)
verifyNonce
viewfunction verifyNonce(address sender, uint128 nonce) view returns (uint128, uint256, uint256)
verifyOrder
viewfunction verifyOrder(tuple order, tuple signature) view returns (bytes32 taker_order_hash)
verifyRoute
viewfunction verifyRoute(tuple route) view returns (bool)
verifyStablesLimit
viewfunction verifyStablesLimit(uint128 collateralAmount, uint128 usdeAmount, address collateralAsset, uint8 orderType) view returns (bool)
acceptAdmin
nonpayablefunction acceptAdmin()
addCustodianAddress
nonpayablefunction addCustodianAddress(address custodian)
addSupportedAsset
nonpayablefunction addSupportedAsset(address asset, tuple _tokenConfig)
addWhitelistedBenefactor
nonpayablefunction addWhitelistedBenefactor(address benefactor)
confirmDelegatedSigner
nonpayablefunction confirmDelegatedSigner(address _delegatedBy)
disableMintRedeem
nonpayablefunction disableMintRedeem()
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
mint
nonpayablefunction mint(tuple order, tuple route, tuple signature)
mintWETH
nonpayablefunction mintWETH(tuple order, tuple route, tuple signature)
redeem
nonpayablefunction redeem(tuple order, tuple signature)
removeCollateralManagerRole
nonpayablefunction removeCollateralManagerRole(address collateralManager)
removeCustodianAddress
nonpayablefunction removeCustodianAddress(address custodian)
removeDelegatedSigner
nonpayablefunction removeDelegatedSigner(address _removedSigner)
removeMinterRole
nonpayablefunction removeMinterRole(address minter)
removeRedeemerRole
nonpayablefunction removeRedeemerRole(address redeemer)
removeSupportedAsset
nonpayablefunction removeSupportedAsset(address asset)
removeWhitelistedBenefactor
nonpayablefunction removeWhitelistedBenefactor(address benefactor)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address account)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setApprovedBeneficiary
nonpayablefunction setApprovedBeneficiary(address beneficiary, bool status)
setDelegatedSigner
nonpayablefunction setDelegatedSigner(address _delegateTo)
setGlobalMaxMintPerBlock
nonpayablefunction setGlobalMaxMintPerBlock(uint128 _globalMaxMintPerBlock)
setGlobalMaxRedeemPerBlock
nonpayablefunction setGlobalMaxRedeemPerBlock(uint128 _globalMaxRedeemPerBlock)
setMaxMintPerBlock
nonpayablefunction setMaxMintPerBlock(uint128 _maxMintPerBlock, address asset)
setMaxRedeemPerBlock
nonpayablefunction setMaxRedeemPerBlock(uint128 _maxRedeemPerBlock, address asset)
setStablesDeltaLimit
nonpayablefunction setStablesDeltaLimit(uint128 _stablesDeltaLimit)
setTokenType
nonpayablefunction setTokenType(address asset, uint8 tokenType)
transferAdmin
nonpayablefunction transferAdmin(address newAdmin)
transferToCustody
nonpayablefunction transferToCustody(address wallet, address asset, uint128 amount)
events
AdminTransferred
event AdminTransferred(address indexed oldAdmin, address indexed newAdmin)
AdminTransferRequested
event AdminTransferRequested(address indexed oldAdmin, address indexed newAdmin)
AssetAdded
event AssetAdded(address indexed asset)
AssetRemoved
event AssetRemoved(address indexed asset)
BenefactorAdded
event BenefactorAdded(address indexed benefactor)
BenefactorRemoved
event BenefactorRemoved(address indexed benefactor)
BeneficiaryAdded
event BeneficiaryAdded(address indexed benefactor, address indexed beneficiary)
BeneficiaryRemoved
event BeneficiaryRemoved(address indexed benefactor, address indexed beneficiary)
CustodianAddressAdded
event CustodianAddressAdded(address indexed custodian)
CustodianAddressRemoved
event CustodianAddressRemoved(address indexed custodian)
CustodyTransfer
event CustodyTransfer(address indexed wallet, address indexed asset, uint256 amount)
DelegatedSignerAdded
event DelegatedSignerAdded(address indexed signer, address indexed delegator)
DelegatedSignerInitiated
event DelegatedSignerInitiated(address indexed signer, address indexed delegator)
DelegatedSignerRemoved
event DelegatedSignerRemoved(address indexed signer, address indexed delegator)
MaxMintPerBlockChanged
event MaxMintPerBlockChanged(uint256 oldMaxMintPerBlock, uint256 newMaxMintPerBlock, address indexed asset)
MaxRedeemPerBlockChanged
event MaxRedeemPerBlockChanged(uint256 oldMaxRedeemPerBlock, uint256 newMaxRedeemPerBlock, address indexed asset)
Mint
event Mint(string indexed order_id, address indexed benefactor, address indexed beneficiary, address minter, address collateral_asset, uint256 collateral_amount, uint256 usde_amount)
Received
event Received(address, uint256)
Redeem
event Redeem(string indexed order_id, address indexed benefactor, address indexed beneficiary, address redeemer, address collateral_asset, uint256 collateral_amount, uint256 usde_amount)
RoleAdminChanged
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
RoleGranted
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
RoleRevoked
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
TokenTypeSet
event TokenTypeSet(address indexed token, uint256 tokenType)
USDeSet
event USDeSet(address indexed USDe)
errors
BenefactorNotWhitelisted
error BenefactorNotWhitelisted()
BeneficiaryNotApproved
error BeneficiaryNotApproved()
DelegationNotInitiated
error DelegationNotInitiated()
GlobalMaxMintPerBlockExceeded
error GlobalMaxMintPerBlockExceeded()
GlobalMaxRedeemPerBlockExceeded
error GlobalMaxRedeemPerBlockExceeded()
InvalidAddress
error InvalidAddress()
InvalidAdminChange
error InvalidAdminChange()
InvalidAmount
error InvalidAmount()
InvalidAssetAddress
error InvalidAssetAddress()
InvalidBenefactorAddress
error InvalidBenefactorAddress()
InvalidBeneficiaryAddress
error InvalidBeneficiaryAddress()
InvalidCustodianAddress
error InvalidCustodianAddress()
InvalidEIP1271Signature
error InvalidEIP1271Signature()
InvalidEIP712Signature
error InvalidEIP712Signature()
InvalidNonce
error InvalidNonce()
InvalidOrder
error InvalidOrder()
InvalidRoute
error InvalidRoute()
InvalidStablePrice
error InvalidStablePrice()
InvalidUSDeAddress
error InvalidUSDeAddress()
InvalidZeroAddress
error InvalidZeroAddress()
MaxMintPerBlockExceeded
error MaxMintPerBlockExceeded()
MaxRedeemPerBlockExceeded
error MaxRedeemPerBlockExceeded()
NoAssetsProvided
error NoAssetsProvided()
NotPendingAdmin
error NotPendingAdmin()
SignatureExpired
error SignatureExpired()
TransferFailed
error TransferFailed()
UnknownSignatureType
error UnknownSignatureType()
UnsupportedAsset
error UnsupportedAsset()
creation bytecode
0x61010060405234801562000011575f80fd5b5060405162006d0f38038062006d0f833981016040819052620000349162000ca6565b60016003556001600160a01b0387166200006157604051632cacf23760e21b815260040160405180910390fd5b6001600160a01b038616620000895760405163f6b2911f60e01b815260040160405180910390fd5b83515f03620000ab576040516337791ce560e21b815260040160405180910390fd5b84515f03620000cd576040516337791ce560e21b815260040160405180910390fd5b6001600160a01b038116620000f55760405163f6b2911f60e01b815260040160405180910390fd5b6001600160a01b0380881660a0528616608052620001145f3362000422565b84518451146200013757604051630ccd248560e21b815260040160405180910390fd5b5f5b8251816001600160801b031610156200018b576200018283826001600160801b0316815181106200016e576200016e62000d82565b6020026020010151620004b260201b60201c565b60010162000139565b50825160208401516001600160801b03908116600160801b02911617600c555f5b8451816001600160801b031610156200031557600f5f87836001600160801b031681518110620001e057620001e062000d82565b6020908102919091018101516001600160a01b031682528101919091526040015f2054610100900460ff16806200024d57505f6001600160a01b031686826001600160801b0316815181106200023a576200023a62000d82565b60200260200101516001600160a01b0316145b8062000291575060a0516001600160a01b031686826001600160801b0316815181106200027e576200027e62000d82565b60200260200101516001600160a01b0316145b15620002b057604051630ccd248560e21b815260040160405180910390fd5b6200030c86826001600160801b031681518110620002d257620002d262000d82565b602002602001015186836001600160801b031681518110620002f857620002f862000d82565b60200260200101516200055460201b60201c565b600101620001ac565b50336001600160a01b038216146200033357620003335f8262000422565b4660c052620003df604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527fdfc7060bb2e53279833759ad83d246a6016adac9d59a3fc1c0c23c3d495e137e918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60e0526040516001600160a01b038816907f72fb0d31878f6e7247733418a2aeabf201fddda56677167f041e9bb10ffd5c9e905f90a25050505050505062000ed6565b81620004a2576001546040516001600160a01b038084169216907ff8ccb027dfcd135e000e9d45e6cc2d662578a8825d4c45b5e32e0adf67e79ec6905f90a36001546200047a905f906001600160a01b031662000648565b600180546001600160a01b0383166001600160a01b0319918216179091556002805490911690555b620004ae8282620006c6565b5050565b5f620004be8162000764565b6001600160a01b0382161580620004e8575060a0516001600160a01b0316826001600160a01b0316145b80620004fe5750620004fc60078362000773565b155b156200051d5760405163565c062f60e11b815260040160405180910390fd5b6040516001600160a01b038316907ffbd30b5bdd51f5de989170dc23d65aac2de0a6099f5d9d200bc5779d883abcd4905f90a25050565b60408101516001600160801b031615806200057a575060608101516001600160801b0316155b15620005995760405163162908e360e11b815260040160405180910390fd5b600160208083018290526001600160a01b0384165f908152600f90915260409020825181548493839160ff1916908381811115620005db57620005db62000d96565b0217905550602082015181546040840151610100600160901b03199091166101009215159290920262010000600160901b03191691909117620100006001600160801b0392831602178255606090920151600190910180546001600160801b031916919092161790555050565b5f828152602081815260408083206001600160a01b038516845290915290205460ff1615620004ae575f828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b5f828152602081815260408083206001600160a01b038516845290915290205460ff16620004ae575f828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620007203390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b62000770813362000792565b50565b5f62000789836001600160a01b03841662000816565b90505b92915050565b5f828152602081815260408083206001600160a01b038516845290915290205460ff16620004ae57620007c58162000865565b620007d283602062000878565b604051602001620007e592919062000dce565b60408051601f198184030181529082905262461bcd60e51b82526200080d9160040162000e46565b60405180910390fd5b5f8181526001830160205260408120546200085d57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556200078c565b505f6200078c565b60606200078c6001600160a01b03831660145b60605f6200088883600262000e8e565b6200089590600262000ea8565b6001600160401b03811115620008af57620008af62000a52565b6040519080825280601f01601f191660200182016040528015620008da576020820181803683370190505b509050600360fc1b815f81518110620008f757620008f762000d82565b60200101906001600160f81b03191690815f1a905350600f60fb1b8160018151811062000928576200092862000d82565b60200101906001600160f81b03191690815f1a9053505f6200094c84600262000e8e565b6200095990600162000ea8565b90505b6001811115620009da576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811062000991576200099162000d82565b1a60f81b828281518110620009aa57620009aa62000d82565b60200101906001600160f81b03191690815f1a90535060049490941c93620009d28162000ebe565b90506200095c565b508315620007895760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016200080d565b6001600160a01b038116811462000770575f80fd5b805162000a4d8162000a2b565b919050565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b038111828210171562000a8b5762000a8b62000a52565b60405290565b604051601f8201601f191681016001600160401b038111828210171562000abc5762000abc62000a52565b604052919050565b5f6001600160401b0382111562000adf5762000adf62000a52565b5060051b60200190565b5f82601f83011262000af9575f80fd5b8151602062000b1262000b0c8362000ac4565b62000a91565b82815260059290921b8401810191818101908684111562000b31575f80fd5b8286015b8481101562000b5957805162000b4b8162000a2b565b835291830191830162000b35565b509695505050505050565b80516001600160801b038116811462000a4d575f80fd5b5f82601f83011262000b8b575f80fd5b8151602062000b9e62000b0c8362000ac4565b82815260079290921b8401810191818101908684111562000bbd575f80fd5b8286015b8481101562000b59576080818903121562000bdb575f8081fd5b62000be562000a66565b81516002811062000bf5575f8081fd5b815281850151801515811462000c0a575f8081fd5b81860152604062000c1d83820162000b64565b90820152606062000c3083820162000b64565b9082015283529183019160800162000bc1565b5f6040828403121562000c54575f80fd5b604080519081016001600160401b038111828210171562000c795762000c7962000a52565b60405290508062000c8a8362000b64565b815262000c9a6020840162000b64565b60208201525092915050565b5f805f805f805f610100888a03121562000cbe575f80fd5b875162000ccb8162000a2b565b602089015190975062000cde8162000a2b565b60408901519096506001600160401b038082111562000cfb575f80fd5b62000d098b838c0162000ae9565b965060608a015191508082111562000d1f575f80fd5b62000d2d8b838c0162000b7b565b955062000d3e8b60808c0162000c43565b945060c08a015191508082111562000d54575f80fd5b5062000d638a828b0162000ae9565b92505062000d7460e0890162000a40565b905092959891949750929550565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101562000dc657818101518382015260200162000dac565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835162000e0781601785016020880162000daa565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835162000e3a81602884016020880162000daa565b01602801949350505050565b602081525f825180602084015262000e6681604085016020870162000daa565b601f01601f19169190910160400192915050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176200078c576200078c62000e7a565b808201808211156200078c576200078c62000e7a565b5f8162000ecf5762000ecf62000e7a565b505f190190565b60805160a05160c05160e051615ddb62000f345f395f61379401525f61376c01525f81816103ee0152818161105001528181611b050152818161226c01528181612ada0152612c1001525f81816139870152613a5b0152615ddb5ff3fe608060405260043610610331575f3560e01c80637cef7e91116101a7578063af4eca35116100e7578063d901561c11610092578063e2959b6c1161006d578063e2959b6c14610b00578063e3a17ff914610b2c578063ed24911d14610b4b578063fe136c4e14610b5f575f80fd5b8063d901561c14610a75578063dfcf852814610ac2578063e077020214610ae1575f80fd5b8063c5ff38bd116100c2578063c5ff38bd146109fc578063cf9cc76614610a10578063d547741f14610a56575f80fd5b8063af4eca3514610975578063b58f203d14610994578063be4088ee146109b3575f80fd5b806392a3c04f116101525780639be918e61161012d5780639be918e614610886578063a217fddf146108c2578063a693635e146108d5578063a7c1abe014610935575f80fd5b806392a3c04f14610829578063936e22481461084857806396eea75014610867575f80fd5b80638db940e0116101825780638db940e01461074a57806391d148541461076957806392408dc7146107ab575f80fd5b80637cef7e91146106ef5780637cfbc42f1461070e5780638da5cb5b1461072d575f80fd5b806336568abe1161027257806354f1e1261161021d57806375829def116101f857806375829def1461067357806375c890dc146106925780637adb8b86146106b15780637c549c1d146106d0575f80fd5b806354f1e126146106165780636c2cd30f146106355780637274c25c14610654575f80fd5b80634be7a64b1161024d5780634be7a64b146105b9578063532c3f82146105d857806353863613146105f7575f80fd5b806336568abe1461055c57806340e492161461057b5780634ba87af91461059a575f80fd5b806316255c43116102dd5780631f6c7da2116102b85780631f6c7da2146104c3578063248a9ca3146104e25780632da096211461051e5780632f2ff15d1461053d575f80fd5b806316255c43146104665780631c46bc6f146104855780631cf58ff2146104a4575f80fd5b80630fd761e01161030d5780630fd761e0146103dd57806312a4a10e14610428578063157a402814610447575f80fd5b8062d874831461037457806301ffc9a7146103955780630e18b681146103c9575f80fd5b3661037057604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b5f80fd5b34801561037f575f80fd5b5061039361038e3660046151ca565b610bcc565b005b3480156103a0575f80fd5b506103b46103af366004615279565b611221565b60405190151581526020015b60405180910390f35b3480156103d4575f80fd5b506103936112b9565b3480156103e8575f80fd5b506104107f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016103c0565b348015610433575f80fd5b506103936104423660046152ce565b611309565b348015610452575f80fd5b506103936104613660046152ff565b61131d565b348015610471575f80fd5b506103936104803660046152ff565b611403565b348015610490575f80fd5b5061039361049f3660046152ff565b611499565b3480156104af575f80fd5b506103b46104be3660046152ff565b611589565b3480156104ce575f80fd5b506103b46104dd366004615318565b611595565b3480156104ed575f80fd5b506105106104fc36600461534a565b5f9081526020819052604090206001015490565b6040519081526020016103c0565b348015610529575f80fd5b50610393610538366004615361565b611781565b348015610548575f80fd5b506103936105573660046153a1565b61195f565b348015610567575f80fd5b506103936105763660046153a1565b6119b1565b348015610586575f80fd5b506103936105953660046152ff565b6119f3565b3480156105a5575f80fd5b506103936105b43660046152ff565b611a66565b3480156105c4575f80fd5b506103936105d33660046152ff565b611ae8565b3480156105e3575f80fd5b506103936105f23660046152ff565b611bba565b348015610602575f80fd5b506103936106113660046152ff565b611c12565b348015610621575f80fd5b506103936106303660046152ff565b611c88565b348015610640575f80fd5b5061039361064f3660046153c2565b611cdc565b34801561065f575f80fd5b5061039361066e3660046152ff565b611d2a565b34801561067e575f80fd5b5061039361068d3660046152ff565b611d7e565b34801561069d575f80fd5b506103936106ac3660046153db565b611e34565b3480156106bc575f80fd5b506103b46106cb36600461543b565b61247b565b3480156106db575f80fd5b506105106106ea3660046153db565b6124a3565b3480156106fa575f80fd5b50610510610709366004615455565b612a40565b348015610719575f80fd5b506103936107283660046154e3565b612a96565b348015610738575f80fd5b506001546001600160a01b0316610410565b348015610755575f80fd5b506103936107643660046152ff565b612b87565b348015610774575f80fd5b506103b46107833660046153a1565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b3480156107b6575f80fd5b506108006107c536600461534a565b600d6020525f90815260409020546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041682565b604080516fffffffffffffffffffffffffffffffff9384168152929091166020830152016103c0565b348015610834575f80fd5b506103b46108433660046155c7565b612c09565b348015610853575f80fd5b506103936108623660046153c2565b612df5565b348015610872575f80fd5b506103936108813660046151ca565b612e35565b348015610891575f80fd5b506103b46108a03660046152ff565b6001600160a01b03165f908152600f6020526040902054610100900460ff1690565b3480156108cd575f80fd5b506105105f81565b3480156108e0575f80fd5b506108006108ef3660046153a1565b600e60209081525f92835260408084209091529082529020546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041682565b348015610940575f80fd5b50600c54610800906fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041682565b348015610980575f80fd5b5061039361098f3660046153c2565b61329a565b34801561099f575f80fd5b506103936109ae36600461561a565b6132e8565b3480156109be575f80fd5b50600b546109db906fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020016103c0565b348015610a07575f80fd5b506103936133fc565b348015610a1b575f80fd5b50610a49610a2a36600461543b565b600a60209081525f928352604080842090915290825290205460ff1681565b6040516103c0919061567c565b348015610a61575f80fd5b50610393610a703660046153a1565b61342d565b348015610a80575f80fd5b50610a94610a8f366004615696565b613479565b604080516fffffffffffffffffffffffffffffffff90941684526020840192909252908201526060016103c0565b348015610acd575f80fd5b50610393610adc3660046156be565b613547565b348015610aec575f80fd5b50610393610afb3660046152ce565b613651565b348015610b0b575f80fd5b50610b1f610b1a366004615455565b613665565b6040516103c09190615753565b348015610b37575f80fd5b506103b4610b463660046152ff565b61375d565b348015610b56575f80fd5b50610510613769565b348015610b6a575f80fd5b50610bbc610b793660046152ff565b600f6020525f90815260409020805460019091015460ff808316926101008104909116916fffffffffffffffffffffffffffffffff620100009092048216911684565b6040516103c09493929190615775565b610bd4613862565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610bfe816138da565b610c10610120850161010086016153c2565b610c2060e0860160c087016152ff565b6001600160a01b0381165f908152600f60205260408082208151608081019092528054829060ff166001811115610c5957610c5961564f565b6001811115610c6a57610c6a61564f565b8152815460ff61010082041615156020808401919091526fffffffffffffffffffffffffffffffff620100009092048216604084015260019093015416606090910152810151909150610ce9576040517f24a0114400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151435f908152600e60209081528382206001600160a01b0387168352905291909120546fffffffffffffffffffffffffffffffff91821691610d32918691166157dd565b6fffffffffffffffffffffffffffffffff161115610d7c576040517f0fbf0bc900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d8e610120880161010089016153c2565b6fffffffffffffffffffffffffffffffff4381165f908152600d6020526040902054600c549082169116610dc283836157dd565b6fffffffffffffffffffffffffffffffff161115610e0c576040517f1e0c1a7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610e1d60408b0160208c01615806565b6001811115610e2e57610e2e61564f565b14610e65576040517faf61069300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e6f89886124a3565b50610e7988611595565b610eaf576040517f84e505d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ed7610ec260a08b0160808c016152ff565b610ed260808c0160608d016153c2565b6138e7565b610ee96101208a016101008b016153c2565b435f908152600e6020526040812090610f0860e08d0160c08e016152ff565b6001600160a01b0316815260208101919091526040015f9081208054909190610f449084906fffffffffffffffffffffffffffffffff166157dd565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555088610100016020810190610f8e91906153c2565b435f908152600d602052604081208054909190610fbe9084906fffffffffffffffffffffffffffffffff166157dd565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506110468960e001602081019061100a91906153c2565b61101a60e08c0160c08d016152ff565b61102a60a08d0160808e016152ff565b6110348c80615821565b61104160208f018f615821565b613937565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166340c10f1961108560c08c0160a08d016152ff565b6110976101208d016101008e016153c2565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526fffffffffffffffffffffffffffffffff1660248201526044015f604051808303815f87803b158015611104575f80fd5b505af1158015611116573d5f803e3d5ffd5b5061112b9250505060c08a0160a08b016152ff565b6001600160a01b031661114460a08b0160808c016152ff565b6001600160a01b03166111578b80615885565b6040516111659291906158e6565b60405180910390207f29ee92e51cda311463f5c9ef98c54824a4bebe45e689c37da35edc774585d437338d60c00160208101906111a291906152ff565b8e60e00160208101906111b591906153c2565b8f6101000160208101906111c991906153c2565b604080516001600160a01b0395861681529390941660208401526fffffffffffffffffffffffffffffffff9182168385015216606082015290519081900360800190a450505050505061121c6001600355565b505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806112b357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6002546001600160a01b031633146112fd576040517f058d9a1b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113075f33613d15565b565b5f611313816138da565b61121c8383613db4565b6001335f908152600a602090815260408083206001600160a01b038616845290915290205460ff1660028111156113565761135661564f565b1461138d576040517f7b5afc0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f818152600a602090815260408083206001600160a01b038616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166002179055519092917fed6a1f03e365a374bf7e9fe68b09cf74960528af699108cb461241efc5ded90991a350565b5f61140d816138da565b6001600160a01b038216158061142b5750611429600483613e4c565b155b15611462576040517fcc8d45bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b038316907f2fbec2225160ba8b27d83182d706920f1170182d15934f2122fd744049140ae2905f90a25050565b5f6114a3816138da565b6001600160a01b0382165f908152600f6020526040902054610100900460ff166114f9576040517f3334921400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382165f818152600f602052604080822080547fffffffffffffffffffffffffffff00000000000000000000000000000000000016815560010180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f37803e2125c48ee96c38ddf04e826daf335b0e1603579040fd275aba6d06b6fc9190a25050565b5f6112b3600783613e60565b5f806115a46020840184615821565b90506115b08480615821565b9050146115bf57505f92915050565b6115c98380615821565b90505f036115d957505f92915050565b5f5b6115e58480615821565b9050816fffffffffffffffffffffffffffffffff1610156117645761164c61160d8580615821565b836fffffffffffffffffffffffffffffffff1681811061162f5761162f6158f5565b905060200201602081019061164491906152ff565b600790613e60565b15806116a057505f61165e8580615821565b836fffffffffffffffffffffffffffffffff16818110611680576116806158f5565b905060200201602081019061169591906152ff565b6001600160a01b0316145b806116fe57506116b36020850185615821565b826fffffffffffffffffffffffffffffffff168181106116d5576116d56158f5565b90506020020160208101906116ea91906153c2565b6fffffffffffffffffffffffffffffffff16155b1561170c57505f9392505050565b6117196020850185615821565b826fffffffffffffffffffffffffffffffff1681811061173b5761173b6158f5565b905060200201602081019061175091906153c2565b61175a90836157dd565b91506001016115db565b506fffffffffffffffffffffffffffffffff166127101492915050565b611789613862565b7f85e8f2d6819d6b24108062d87ea08f54651bcb8960d98062d3faf96e7873b8b96117b3816138da565b6001600160a01b03841615806117d157506117cf600785613e60565b155b15611808576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffff11111111111111111111111111111111111111126001600160a01b038416016118d9575f846001600160a01b0316836fffffffffffffffffffffffffffffffff166040515f6040518083038185875af1925050503d805f8114611893576040519150601f19603f3d011682016040523d82523d5f602084013e611898565b606091505b50509050806118d3576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506118ff565b6118ff6001600160a01b038416856fffffffffffffffffffffffffffffffff8516613e81565b6040516fffffffffffffffffffffffffffffffff831681526001600160a01b0380851691908616907f90c5d8794dcf7c60ab2d20912d5228389b28f74d32af01e40894a784a90b9ac29060200160405180910390a35061121c6001600355565b5f611969816138da565b82806119a1576040517f6317a0fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119ab8484613d15565b50505050565b81806119e9576040517f6317a0fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61121c8383613f48565b6001600160a01b0381165f818152600a6020908152604080832033808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055519092917f97b59d736dc70ae61c6b68295c19a1311cc4a48cbb9eb25c4dabf18c7f650a8a91a350565b5f611a70816138da565b611a7b600783613fea565b611ab1576040517facb80c5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b038316907f75567811df62a6b68bd5ee394d5808ad7282e19541858be466bc789cad9d4dfb905f90a25050565b5f611af2816138da565b6001600160a01b0382161580611b3957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b80611b4c5750611b4a600783613e4c565b155b15611b83576040517facb80c5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b038316907ffbd30b5bdd51f5de989170dc23d65aac2de0a6099f5d9d200bc5779d883abcd4905f90a25050565b7f3c63e605be3290ab6b04cfc46c6e1516e626d43236b034f09d7ede1d017beb0c611be4816138da565b611c0e7f44ac9762eec3a11893fefb11d028bb3102560094137c3ed4518712475b2577cc83613ffe565b5050565b6001600160a01b0381165f818152600a6020908152604080832033808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055519092917f769c75d94dacde64c18415b5a72f6d26e7f62b356387f8da812c4b0aa66a0f2591a350565b7f3c63e605be3290ab6b04cfc46c6e1516e626d43236b034f09d7ede1d017beb0c611cb2816138da565b611c0e7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a683613ffe565b5f611ce6816138da565b50600c80547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff92909216919091179055565b7f3c63e605be3290ab6b04cfc46c6e1516e626d43236b034f09d7ede1d017beb0c611d54816138da565b611c0e7f85e8f2d6819d6b24108062d87ea08f54651bcb8960d98062d3faf96e7873b8b983613ffe565b5f611d88816138da565b336001600160a01b03831603611dca576040517f6317a0fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03848116918217909255600154604051919216907fefdcbba819467e00b0262c12892dda980bac68580b72178e57a162368b808766905f90a35050565b611e3c613862565b7f44ac9762eec3a11893fefb11d028bb3102560094137c3ed4518712475b2577cc611e66816138da565b611e78610120840161010085016153c2565b611e8860e0850160c086016152ff565b6001600160a01b0381165f908152600f60205260408082208151608081019092528054829060ff166001811115611ec157611ec161564f565b6001811115611ed257611ed261564f565b8152815460ff61010082041615156020808401919091526fffffffffffffffffffffffffffffffff620100009092048216604084015260019093015416606090910152810151909150611f51576040517f24a0114400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060810151435f908152600e602090815260408083206001600160a01b03871684529091529020546fffffffffffffffffffffffffffffffff91821691611faf918691700100000000000000000000000000000000909104166157dd565b6fffffffffffffffffffffffffffffffff161115611ff9576040517f4d4ea7ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61200b610120870161010088016153c2565b435f908152600d6020526040902054600c546fffffffffffffffffffffffffffffffff700100000000000000000000000000000000928390048116929091041661205583836157dd565b6fffffffffffffffffffffffffffffffff16111561209f576040517f7d11424700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016120b160408a0160208b01615806565b60018111156120c2576120c261564f565b146120f9576040517faf61069300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210388886124a3565b5061212761211760a08a0160808b016152ff565b610ed260808b0160608c016153c2565b61213961012089016101008a016153c2565b435f908152600e602052604081209061215860e08c0160c08d016152ff565b6001600160a01b0316815260208101919091526040015f2080546010906121a690849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff166157dd565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550876101000160208101906121f091906153c2565b435f908152600d60205260409020805460109061223490849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff166157dd565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379cc67908960800160208101906122ac91906152ff565b6122be6101208c016101008d016153c2565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526fffffffffffffffffffffffffffffffff1660248201526044015f604051808303815f87803b15801561232b575f80fd5b505af115801561233d573d5f803e3d5ffd5b5061237c925061235691505060c08a0160a08b016152ff565b61236660e08b0160c08c016152ff565b6123776101008c0160e08d016153c2565b614099565b61238c60c0890160a08a016152ff565b6001600160a01b03166123a560a08a0160808b016152ff565b6001600160a01b03166123b88a80615885565b6040516123c69291906158e6565b6040519081900390207f0ea36c5b7b274f8fe58654fe884bb9307dec1899e0312f40ae10d9b3d100cc0c3361240160e08e0160c08f016152ff565b8d60e001602081019061241491906153c2565b8e61010001602081019061242891906153c2565b604080516001600160a01b0395861681529390941660208401526fffffffffffffffffffffffffffffffff9182168385015216606082015290519081900360800190a4505050505050611c0e6001600355565b6001600160a01b0382165f90815260066020526040812061249c9083613e60565b9392505050565b5f6124ad83612a40565b90505f6124bd6020840184615806565b60018111156124ce576124ce61564f565b036125df575f61251e826124e56020860186615885565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061422c92505050565b905061253060a08501608086016152ff565b6001600160a01b0316816001600160a01b031614806125a3575060026001600160a01b0382165f908152600a602052604081209061257460a08801608089016152ff565b6001600160a01b0316815260208101919091526040015f205460ff1660028111156125a1576125a161564f565b145b6125d9576040517fb81d58e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061273e565b60016125ee6020840184615806565b60018111156125ff576125ff61564f565b0361270c577f1626ba7e0000000000000000000000000000000000000000000000000000000061263560a08501608086016152ff565b6001600160a01b0316631626ba7e836126516020870187615885565b6040518463ffffffff1660e01b815260040161266f93929190615922565b602060405180830381865afa15801561268a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126ae9190615975565b7fffffffff000000000000000000000000000000000000000000000000000000001614612707576040517f5d52cbe300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61273e565b6040517f6b46e4d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61275961275160a08501608086016152ff565b600490613e60565b61278f576040517f2107695300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61279f60c0840160a085016152ff565b6001600160a01b03166127b860a08501608086016152ff565b6001600160a01b0316146128405761280a6127d960c0850160a086016152ff565b60065f6127ec60a08801608089016152ff565b6001600160a01b0316815260208101919091526040015f2090613e60565b612840576040517fa121756300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600f8161285460e0870160c088016152ff565b6001600160a01b0316815260208101919091526040015f9081205460ff1691508160018111156128865761288661564f565b03612907576128d161289f610100860160e087016153c2565b6128b1610120870161010088016153c2565b6128c160e0880160c089016152ff565b6108436040890160208a01615806565b612907576040517fc32239d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61291860c0860160a087016152ff565b6001600160a01b031603612958576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612969610100850160e086016153c2565b6fffffffffffffffffffffffffffffffff1615806129a85750612994610120850161010086016153c2565b6fffffffffffffffffffffffffffffffff16155b156129df576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129ef6060850160408601615990565b6effffffffffffffffffffffffffffff16421115612a39576040517f0819bdcd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b5f6112b3612a4c613769565b612a5584613665565b805190602001206040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f612aa0816138da565b6001600160a01b0383165f908152600f6020526040902054610100900460ff1680612ad257506001600160a01b038316155b80612b0e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316145b15612b45576040517f3334921400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b4f838361424e565b6040516001600160a01b038416907f0e3c58ebfb2e7465fbb1c32e6b4f40c3c4f5ca77e8218a386aff8617831260d7905f90a2505050565b5f612b91816138da565b612b9c600483613fea565b612bd2576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b038316907ff0ebdfe9729215cc867dca3785f752df456766a9ce4b178ad1bca9919ca4a650905f90a25050565b5f80612c347f00000000000000000000000000000000000000000000000000000000000000006143d4565b90505f612c40856143d4565b90505f80826fffffffffffffffffffffffffffffffff16846fffffffffffffffffffffffffffffffff1611612c8957612c7984846159be565b612c8490600a615b05565b612c9e565b612c9383856159be565b612c9e90600a615b05565b9050826fffffffffffffffffffffffffffffffff16846fffffffffffffffffffffffffffffffff1611612cda57612cd5818a615b22565b612ce4565b612ce4818a615b75565b91505f886fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff1611612d2157612d1c838a6159be565b612d2b565b612d2b89846159be565b90505f89612d3b61271084615b75565b612d459190615b22565b90505f886001811115612d5a57612d5a61564f565b03612dbb57836fffffffffffffffffffffffffffffffff168a6fffffffffffffffffffffffffffffffff1611612d91576001612dae565b600b546fffffffffffffffffffffffffffffffff90811690821611155b9650505050505050612ded565b896fffffffffffffffffffffffffffffffff16846fffffffffffffffffffffffffffffffff1611612d91576001612dae565b949350505050565b5f612dff816138da565b50600c80546fffffffffffffffffffffffffffffffff928316700100000000000000000000000000000000029216919091179055565b612e3d613862565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6612e67816138da565b612e79610120850161010086016153c2565b612e8960e0860160c087016152ff565b6001600160a01b0381165f908152600f60205260408082208151608081019092528054829060ff166001811115612ec257612ec261564f565b6001811115612ed357612ed361564f565b8152815460ff61010082041615156020808401919091526fffffffffffffffffffffffffffffffff620100009092048216604084015260019093015416606090910152810151909150612f52576040517f24a0114400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080820151435f908152600e60209081528382206001600160a01b0387168352905291909120546fffffffffffffffffffffffffffffffff91821691612f9b918691166157dd565b6fffffffffffffffffffffffffffffffff161115612fe5576040517f0fbf0bc900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ff7610120880161010089016153c2565b6fffffffffffffffffffffffffffffffff4381165f908152600d6020526040902054600c54908216911661302b83836157dd565b6fffffffffffffffffffffffffffffffff161115613075576040517f1e0c1a7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61308660408b0160208c01615806565b60018111156130975761309761564f565b146130ce576040517faf61069300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130d889886124a3565b506130e288611595565b613118576040517f84e505d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61312b610ec260a08b0160808c016152ff565b61313d6101208a016101008b016153c2565b435f908152600e602052604081209061315c60e08d0160c08e016152ff565b6001600160a01b0316815260208101919091526040015f90812080549091906131989084906fffffffffffffffffffffffffffffffff166157dd565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550886101000160208101906131e291906153c2565b435f908152600d6020526040812080549091906132129084906fffffffffffffffffffffffffffffffff166157dd565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506110468960e001602081019061325e91906153c2565b61326e60e08c0160c08d016152ff565b61327e60a08d0160808e016152ff565b6132888c80615821565b61329560208f018f615821565b614440565b5f6132a4816138da565b50600b80547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff92909216919091179055565b801561337557335f9081526006602052604090206133069083613e4c565b61333c576040517fd343d98400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b0383169033907fbb39c36a7502b7256e1a687254146a9a2ea7b146c77cb9e40eb0e2b8793781e1905f90a35050565b335f90815260066020526040902061338d9083613fea565b6133c3576040517fd343d98400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b0383169033907f1a6590bd0cabbfcc7c86bef99e1034054e179905cfcc294598fcd426c0922442905f90a35050565b7f3c63e605be3290ab6b04cfc46c6e1516e626d43236b034f09d7ede1d017beb0c613426816138da565b505f600c55565b5f613437816138da565b828061346f576040517f6317a0fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119ab8484613ffe565b5f805f836fffffffffffffffffffffffffffffffff165f036134c7576040517f756688fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385165f90815260096020908152604080832066ffffffffffffff600889901c16808552925290912054600160ff87161b908082161561353a576040517f756688fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9197919650945092505050565b5f613551816138da565b6001600160a01b0383165f908152600f6020526040902054610100900460ff166135a7576040517f24a0114400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383165f908152600f6020526040902080548391907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600183818111156135f8576135f861564f565b0217905550826001600160a01b03167f82414669d8803616fdb8fe48ecd5b28a500e077ce5cfc4b57066463847aa782483600181111561363a5761363a61564f565b6040519081526020015b60405180910390a2505050565b5f61365b816138da565b61121c8383614625565b60607f0364fb0ceb19d9be21807e255d5221bd3766eb5974667c7c8ab9bc6fd85b2a1d6136928380615885565b6040516136a09291906158e6565b60405180910390208360200160208101906136bb9190615806565b6136cb6060860160408701615990565b6136db60808701606088016153c2565b6136eb60a08801608089016152ff565b6136fb60c0890160a08a016152ff565b61370b60e08a0160c08b016152ff565b61371c6101008b0160e08c016153c2565b61372e6101208c016101008d016153c2565b6040516020016137479a99989796959493929190615ba9565b6040516020818303038152906040529050919050565b5f6112b3600483613e60565b5f7f000000000000000000000000000000000000000000000000000000000000000046036137b657507f000000000000000000000000000000000000000000000000000000000000000090565b61385d604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527fdfc7060bb2e53279833759ad83d246a6016adac9d59a3fc1c0c23c3d495e137e918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b905090565b6002600354036138d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b6002600355565b6138e481336146ba565b50565b5f805f6138f48585613479565b6001600160a01b039097165f9081526009602090815260408083206fffffffffffffffffffffffffffffffff909516835293905291909120951790945550505050565b6001600160a01b0386165f908152600f6020526040902054610100900460ff16158061397f57506001600160a01b03861673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b806139bc57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614155b156139f3576040517f24a0114400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85613a1b6001600160a01b03821687306fffffffffffffffffffffffffffffffff8c16614764565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff891660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024015f604051808303815f87803b158015613aa4575f80fd5b505af1158015613ab6573d5f803e3d5ffd5b505050505f805b6fffffffffffffffffffffffffffffffff8116861115613c16575f6127108686846fffffffffffffffffffffffffffffffff16818110613aff57613aff6158f5565b9050602002016020810190613b1491906153c2565b613b1e908d615b75565b613b289190615b22565b90505f8888846fffffffffffffffffffffffffffffffff16818110613b4f57613b4f6158f5565b9050602002016020810190613b6491906152ff565b6001600160a01b0316826fffffffffffffffffffffffffffffffff166040515f6040518083038185875af1925050503d805f8114613bbd576040519150601f19603f3d011682016040523d82523d5f602084013e613bc2565b606091505b5050905080613bfd576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c0782856157dd565b93508260010192505050613abd565b505f613c22828b6159be565b90506fffffffffffffffffffffffffffffffff811615613d09575f8787613c4a600182615c31565b818110613c5957613c596158f5565b9050602002016020810190613c6e91906152ff565b6001600160a01b0316826fffffffffffffffffffffffffffffffff166040515f6040518083038185875af1925050503d805f8114613cc7576040519150601f19603f3d011682016040523d82523d5f602084013e613ccc565b606091505b5050905080613d07576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b50505050505050505050565b81613daa576001546040516001600160a01b038084169216907ff8ccb027dfcd135e000e9d45e6cc2d662578a8825d4c45b5e32e0adf67e79ec6905f90a3600154613d6a905f906001600160a01b0316613ffe565b600180546001600160a01b0383167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216179091556002805490911690555b611c0e82826147b5565b6001600160a01b0381165f818152600f602090815260409182902080546fffffffffffffffffffffffffffffffff878116620100008181027fffffffffffffffffffffffffffff00000000000000000000000000000000ffff85161790945585519390920416808352928201529092917f13e2041fca7db19db36c1bbb93af5fa29559068bc0e162f0bf34c53945eeae109101613644565b5f61249c836001600160a01b03841661486f565b6001600160a01b0381165f908152600183016020526040812054151561249c565b6040516001600160a01b03831660248201526044810182905261121c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526148bb565b6001600160a01b0381163314613fe0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084016138ca565b611c0e8282613ffe565b5f61249c836001600160a01b0384166149bb565b5f828152602081815260408083206001600160a01b038516845290915290205460ff1615611c0e575f828152602081815260408083206001600160a01b038516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b7fffffffffffffffffffffffff11111111111111111111111111111111111111126001600160a01b038316016141b057806fffffffffffffffffffffffffffffffff16471015614115576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f836001600160a01b0316826fffffffffffffffffffffffffffffffff166040515f6040518083038185875af1925050503d805f8114614170576040519150601f19603f3d011682016040523d82523d5f602084013e614175565b606091505b50509050806119ab576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382165f908152600f6020526040902054610100900460ff16614206576040517f24a0114400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61121c6001600160a01b038316846fffffffffffffffffffffffffffffffff8416613e81565b5f805f6142398585614a9e565b9150915061424681614ae0565b509392505050565b60408101516fffffffffffffffffffffffffffffffff161580614285575060608101516fffffffffffffffffffffffffffffffff16155b156142bc576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160208083018290526001600160a01b0384165f908152600f9091526040902082518154849383917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169083818111156143195761431961564f565b02179055506020820151815460408401517fffffffffffffffffffffffffffff0000000000000000000000000000000000ff909116610100921515929092027fffffffffffffffffffffffffffff00000000000000000000000000000000ffff1691909117620100006fffffffffffffffffffffffffffffffff92831602178255606090920151600190910180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016919092161790555050565b5f80826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015614412573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144369190615c44565b60ff169392505050565b6001600160a01b0386165f908152600f6020526040902054610100900460ff16158061448857506001600160a01b03861673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b156144bf576040517f24a0114400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b855f805b6fffffffffffffffffffffffffffffffff81168611156145a6575f6127108686846fffffffffffffffffffffffffffffffff16818110614505576145056158f5565b905060200201602081019061451a91906153c2565b614524908d615b75565b61452e9190615b22565b9050614591898989856fffffffffffffffffffffffffffffffff16818110614558576145586158f5565b905060200201602081019061456d91906152ff565b6001600160a01b03871691906fffffffffffffffffffffffffffffffff8516614764565b61459b81846157dd565b9250506001016144c3565b505f6145b2828b6159be565b90506fffffffffffffffffffffffffffffffff811615613d0957613d098888886145dd600182615c31565b8181106145ec576145ec6158f5565b905060200201602081019061460191906152ff565b6001600160a01b03861691906fffffffffffffffffffffffffffffffff8516614764565b6001600160a01b0381165f818152600f602090815260409182902060010180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000081166fffffffffffffffffffffffffffffffff888116918217909355845192909116808352928201529092917fd9ee404b97bf8fc636668dbeac99021346d69983ff8571279d36ed5de8e1ae859101613644565b5f828152602081815260408083206001600160a01b038516845290915290205460ff16611c0e576146ea81614c92565b6146f5836020614ca4565b604051602001614706929190615c64565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526138ca91600401615753565b6040516001600160a01b03808516602483015283166044820152606481018290526119ab9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613ec6565b5f828152602081815260408083206001600160a01b038516845290915290205460ff16611c0e575f828152602081815260408083206001600160a01b0385168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561482b3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8181526001830160205260408120546148b457508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556112b3565b505f6112b3565b5f61490f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614ee19092919063ffffffff16565b905080515f148061492f57508080602001905181019061492f9190615ce4565b61121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016138ca565b5f8181526001830160205260408120548015614a95575f6149dd600183615c31565b85549091505f906149f090600190615c31565b9050818114614a4f575f865f018281548110614a0e57614a0e6158f5565b905f5260205f200154905080875f018481548110614a2e57614a2e6158f5565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080614a6057614a60615cff565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506112b3565b5f9150506112b3565b5f808251604103614ad2576020830151604084015160608501515f1a614ac687828585614eef565b94509450505050614ad9565b505f905060025b9250929050565b5f816004811115614af357614af361564f565b03614afb5750565b6001816004811115614b0f57614b0f61564f565b03614b76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016138ca565b6002816004811115614b8a57614b8a61564f565b03614bf1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016138ca565b6003816004811115614c0557614c0561564f565b036138e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016138ca565b60606112b36001600160a01b03831660145b60605f614cb2836002615d2c565b614cbd906002615d43565b67ffffffffffffffff811115614cd557614cd5615487565b6040519080825280601f01601f191660200182016040528015614cff576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110614d3557614d356158f5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110614d9757614d976158f5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f614dd1846002615d2c565b614ddc906001615d43565b90505b6001811115614e78577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110614e1d57614e1d6158f5565b1a60f81b828281518110614e3357614e336158f5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93614e7181615d56565b9050614ddf565b50831561249c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016138ca565b6060612ded84845f85614fca565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115614f2457505f90506003614fc1565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614f75573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b038116614fbb575f60019250925050614fc1565b91505f90505b94509492505050565b60608247101561505c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016138ca565b5f80866001600160a01b031685876040516150779190615d8a565b5f6040518083038185875af1925050503d805f81146150b1576040519150601f19603f3d011682016040523d82523d5f602084013e6150b6565b606091505b50915091506150c7878383876150d2565b979650505050505050565b6060831561515a5782515f03615153576001600160a01b0385163b615153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016138ca565b5081612ded565b612ded838381511561516f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138ca9190615753565b5f61012082840312156151b4575f80fd5b50919050565b5f604082840312156151b4575f80fd5b5f805f606084860312156151dc575f80fd5b833567ffffffffffffffff808211156151f3575f80fd5b6151ff878388016151a3565b94506020860135915080821115615214575f80fd5b615220878388016151ba565b93506040860135915080821115615235575f80fd5b50615242868287016151ba565b9150509250925092565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146138e4575f80fd5b5f60208284031215615289575f80fd5b813561249c8161524c565b80356fffffffffffffffffffffffffffffffff811681146152b3575f80fd5b919050565b80356001600160a01b03811681146152b3575f80fd5b5f80604083850312156152df575f80fd5b6152e883615294565b91506152f6602084016152b8565b90509250929050565b5f6020828403121561530f575f80fd5b61249c826152b8565b5f60208284031215615328575f80fd5b813567ffffffffffffffff81111561533e575f80fd5b612ded848285016151ba565b5f6020828403121561535a575f80fd5b5035919050565b5f805f60608486031215615373575f80fd5b61537c846152b8565b925061538a602085016152b8565b915061539860408501615294565b90509250925092565b5f80604083850312156153b2575f80fd5b823591506152f6602084016152b8565b5f602082840312156153d2575f80fd5b61249c82615294565b5f80604083850312156153ec575f80fd5b823567ffffffffffffffff80821115615403575f80fd5b61540f868387016151a3565b93506020850135915080821115615424575f80fd5b50615431858286016151ba565b9150509250929050565b5f806040838503121561544c575f80fd5b6152e8836152b8565b5f60208284031215615465575f80fd5b813567ffffffffffffffff81111561547b575f80fd5b612ded848285016151a3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b600281106138e4575f80fd5b80356152b3816154b4565b80151581146138e4575f80fd5b80356152b3816154cb565b5f8082840360a08112156154f5575f80fd5b6154fe846152b8565b925060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08201121561552f575f80fd5b506040516080810181811067ffffffffffffffff82111715615578577f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604052615587602085016154c0565b8152615595604085016154d8565b60208201526155a660608501615294565b60408201526155b760808501615294565b6060820152809150509250929050565b5f805f80608085870312156155da575f80fd5b6155e385615294565b93506155f160208601615294565b92506155ff604086016152b8565b9150606085013561560f816154b4565b939692955090935050565b5f806040838503121561562b575f80fd5b615634836152b8565b91506020830135615644816154cb565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60208101600383106156905761569061564f565b91905290565b5f80604083850312156156a7575f80fd5b6156b0836152b8565b91506152f660208401615294565b5f80604083850312156156cf575f80fd5b6156d8836152b8565b91506020830135615644816154b4565b5f5b838110156157025781810151838201526020016156ea565b50505f910152565b5f81518084526157218160208601602086016156e8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61249c602083018461570a565b600281106138e4576138e461564f565b6080810161578286615765565b94815292151560208401526fffffffffffffffffffffffffffffffff91821660408401521660609091015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6fffffffffffffffffffffffffffffffff818116838216019080821115612a3957612a396157b0565b5f60208284031215615816575f80fd5b813561249c816154b4565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615854575f80fd5b83018035915067ffffffffffffffff82111561586e575f80fd5b6020019150600581901b3603821315614ad9575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126158b8575f80fd5b83018035915067ffffffffffffffff8211156158d2575f80fd5b602001915036819003821315614ad9575f80fd5b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b83815260406020820152816040820152818360608301375f818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b5f60208284031215615985575f80fd5b815161249c8161524c565b5f602082840312156159a0575f80fd5b81356effffffffffffffffffffffffffffff8116811461249c575f80fd5b6fffffffffffffffffffffffffffffffff828116828216039080821115612a3957612a396157b0565b600181815b80851115615a4057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615a2657615a266157b0565b80851615615a3357918102915b93841c93908002906159ec565b509250929050565b5f82615a56575060016112b3565b81615a6257505f6112b3565b8160018114615a785760028114615a8257615a9e565b60019150506112b3565b60ff841115615a9357615a936157b0565b50506001821b6112b3565b5060208310610133831016604e8410600b8410161715615ac1575081810a6112b3565b615acb83836159e7565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615afd57615afd6157b0565b029392505050565b5f61249c6fffffffffffffffffffffffffffffffff841683615a48565b5f6fffffffffffffffffffffffffffffffff80841680615b69577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b92169190910492915050565b6fffffffffffffffffffffffffffffffff818116838216028082169190828114615ba157615ba16157b0565b505092915050565b8a8152602081018a90526101408101615bc18a615765565b60408201999099526effffffffffffffffffffffffffffff9790971660608801526fffffffffffffffffffffffffffffffff95861660808801526001600160a01b0394851660a088015292841660c0870152921660e0850152908216610100840152166101209091015292915050565b818103818111156112b3576112b36157b0565b5f60208284031215615c54575f80fd5b815160ff8116811461249c575f80fd5b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f8351615c9b8160178501602088016156e8565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351615cd88160288401602088016156e8565b01602801949350505050565b5f60208284031215615cf4575f80fd5b815161249c816154cb565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b80820281158282048414176112b3576112b36157b0565b808201808211156112b3576112b36157b0565b5f81615d6457615d646157b0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b5f8251615d9b8184602087016156e8565b919091019291505056fea2646970667358221220ea7a5c8643081019a0ddeca8e5c2df01930fc49cbb6f23b89c793fb5f2b9572464736f6c634300081400330000000000000000000000004c9edd5852cd905f086c759e8383e09bff1e68b3000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000001a784379d99db4200000000000000000000000000000000000000000000000001a784379d99db4200000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000003b0aaf6e6fcd4a7ceef8c92c32dfea9e64dc18620000000000000000000000000000000000000000000000000000000000000008000000000000000000000000ae7ab96520de3a18e5e111b5eaab095312d7fe84000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000d5f7838f5c461feff7fe49ea5ebaf7728bb0adfa000000000000000000000000a2e3356610840701bdf5611a53974510ae27e2e1000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000069e10de76676d08000000000000000000000000000000000000000000000000069e10de76676d0800000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000069e10de76676d08000000000000000000000000000000000000000000000000069e10de76676d0800000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000069e10de76676d08000000000000000000000000000000000000000000000000069e10de76676d0800000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000069e10de76676d08000000000000000000000000000000000000000000000000069e10de76676d0800000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000069e10de76676d08000000000000000000000000000000000000000000000000069e10de76676d08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000001a784379d99db4200000000000000000000000000000000000000000000000001a784379d99db420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000001a784379d99db4200000000000000000000000000000000000000000000000001a784379d99db420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000001a784379d99db4200000000000000000000000000000000000000000000000001a784379d99db4200000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000008f0ee0393eae7fc1638bd7860a3fec6a663786ae00000000000000000000000012fdb344e4d195ff6613d0f742a6e38344c8b45500000000000000000000000032b24247cbce7c17b0017a2159a9fa481f401b16