20 txs
82 calls
constructor
constructor(address strategyRegistry, address superAdmin, address[] initialPauseAdmins, address nftDescriptor, address externalFirewall)
functions
balanceOf
viewfunction balanceOf(address owner) view returns (uint256)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
DOMAIN_SEPARATOR
viewfunction DOMAIN_SEPARATOR() view returns (bytes32)
eip712Domain
viewfunction eip712Domain() view returns (bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions)
getApproved
viewfunction getApproved(uint256 tokenId) view returns (address)
getPositionYieldData
viewfunction getPositionYieldData(uint256 positionId) view returns (uint96 strategyId, uint256 positionShares, address[] tokens, uint256[] yieldData, tuple[] yieldLossData)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
getStrategyYieldData
viewfunction getStrategyYieldData(uint96 strategyId) view returns (uint256 totalShares, address[] tokens, uint256[] yieldData, tuple[] yieldLossData)
hasPermission
viewfunction hasPermission(uint256 _positionId, address _account, uint8 _permission) view returns (bool)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
INCREASE_PERMISSION
viewfunction INCREASE_PERMISSION() view returns (uint8)
isApprovedForAll
viewfunction isApprovedForAll(address owner, address operator) view returns (bool)
lastOwnershipChange
viewfunction lastOwnershipChange(uint256 positionId) view returns (uint256 blockNumber)
name
viewfunction name() view returns (string)
nextNonce
viewfunction nextNonce(address owner) view returns (uint256 nextNonce)
NFT_DESCRIPTOR
viewfunction NFT_DESCRIPTOR() view returns (address)
ownerOf
viewfunction ownerOf(uint256 tokenId) view returns (address)
PAUSE_ROLE
viewfunction PAUSE_ROLE() view returns (bytes32)
paused
viewfunction paused() view returns (bool)
position
viewfunction position(uint256 positionId) view returns (address[], uint256[], uint96, address)
positionsStrategy
viewfunction positionsStrategy(uint256 positionId) view returns (uint96 strategyId, address strategy)
STRATEGY_REGISTRY
viewfunction STRATEGY_REGISTRY() view returns (address)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
symbol
viewfunction symbol() view returns (string)
tokenURI
viewfunction tokenURI(uint256 positionId) view returns (string)
totalSupply
viewfunction totalSupply() view returns (uint256)
WITHDRAW_PERMISSION
viewfunction WITHDRAW_PERMISSION() view returns (uint8)
approve
nonpayablefunction approve(address to, uint256 tokenId)
attestedCall
nonpayablefunction attestedCall(tuple attestation, bytes attestationSignature, bytes data) returns (bytes)
createPosition
payablefunction createPosition(uint96 strategyId, address depositToken, uint256 depositAmount, address owner, tuple[] permissions, bytes strategyValidationData, bytes misc) payable returns (uint256, uint256)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
increasePosition
payablefunction increasePosition(uint256 positionId, address depositToken, uint256 depositAmount) payable returns (uint256)
modifyPermissions
nonpayablefunction modifyPermissions(tuple[] _positionPermissions)
pause
payablefunction pause() payable
permissionPermit
nonpayablefunction permissionPermit(tuple[] _permissions, uint256 _deadline, bytes _signature)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
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)
specialWithdraw
payablefunction specialWithdraw(uint256 positionId, uint256 withdrawalCode, uint256[] toWithdraw, bytes withdrawalData, address recipient) payable returns (address[] tokens, uint256[] balanceChanges, address[] actualWithdrawnTokens, uint256[] actualWithdrawnAmounts, bytes result)
transferFrom
nonpayablefunction transferFrom(address from, address to, uint256 tokenId)
unpause
payablefunction unpause() payable
withdraw
payablefunction withdraw(uint256 positionId, address[] tokensToWithdraw, uint256[] intendedWithdraw, address recipient) payable returns (uint256[] withdrawn, uint8[] withdrawalTypes)
events
Approval
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)
ApprovalForAll
event ApprovalForAll(address indexed owner, address indexed operator, bool approved)
EIP712DomainChanged
event EIP712DomainChanged()
ModifiedPermissions
event ModifiedPermissions(uint256 positionId, (address operator, uint8[] permissions)[] permissions)
Paused
event Paused(address account)
PositionCreated
event PositionCreated(uint256 indexed positionId, address indexed owner, uint96 strategyId, address depositedToken, uint256 depositedAmount, uint256 assetsDeposited, (address operator, uint8[] permissions)[] permissions, bytes misc)
PositionIncreased
event PositionIncreased(uint256 indexed positionId, address depositedToken, uint256 depositedAmount, uint256 assetsDeposited)
PositionWithdrawn
event PositionWithdrawn(uint256 indexed positionId, address[] tokens, uint256[] withdrawn, address recipient)
PositionWithdrawnSpecially
event PositionWithdrawnSpecially(uint256 indexed positionId, address[] tokens, uint256[] balanceChanges, address[] actualWithdrawnTokens, uint256[] actualWithdrawnAmounts, bytes result, address recipient)
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)
Transfer
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)
Unpaused
event Unpaused(address account)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
AccountWithoutPermission
error AccountWithoutPermission(uint256 positionId, address account, uint8 permission)
AddressEmptyCode
error AddressEmptyCode(address target)
EnforcedPause
error EnforcedPause()
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)
ExpectedPause
error ExpectedPause()
ExpiredDeadline
error ExpiredDeadline()
FailedCall
error FailedCall()
InsufficientBalance
error InsufficientBalance(uint256 balance, uint256 needed)
InsufficientFunds
error InsufficientFunds()
InvalidPermission
error InvalidPermission(uint8 permission)
InvalidShortString
error InvalidShortString()
InvalidSignature
error InvalidSignature()
InvalidWithdrawInput
error InvalidWithdrawInput()
NotOwner
error NotOwner()
OperationNotSupportedForNativeToken
error OperationNotSupportedForNativeToken()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeCastOverflowedUintDowncast
error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value)
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
StringTooLong
error StringTooLong(string str)
UintOverflowed
error UintOverflowed(uint256 value, uint256 max)
ZeroAmountDeposit
error ZeroAmountDeposit()
ZeroSharesDeposit
error ZeroSharesDeposit()
creation bytecode
0x6101a080604052346105a457616a16803803809161001d82856105db565b833981019060a0818303126105a45780516001600160a01b03811681036105a45761004a602083016105fe565b60408301519092906001600160401b0381116105a45781019380601f860112156105a4578451946001600160401b0386116103ca578560051b906040519661009560208401896105db565b87526020808801928201019283116105a457602001905b8282106105a8575050506060810151906001600160a01b03821682036105a45760800151926001600160a01b03841684036105a457604051906100ee826105c0565b601782527f42616c6d79204561726e204e465420506f736974696f6e000000000000000000602083015260405191610125836105c0565b600483526322a0a92760e11b602084015260405192610143846105c0565b60038452620312e360ec1b602085015281516001600160401b0381116103ca57600154600181811c9116801561059a575b60208210146104b557601f811161054e575b50806020601f82116001146104de575f916104d3575b508160011b915f199060031b1c1916176001555b8051906001600160401b0382116103ca5760025490600182811c921680156104c9575b60208310146104b55781601f84931161045a575b50602090601f83116001146103e9575f926103de575b50508160011b915f199060031b1c1916176002555b61021b8161071c565b61012052610228836108a4565b6101405260208151910120918260e052602081519101209182610100524660a0526040519260208401917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352604085015260608401524660808401523060a084015260a0835260c083019280841060018060401b038511176103ca576102d6936040525190206080523060c05260ff19600e5416600e556001600f55610160938452610180928352610612565b505f5b845181101561030a57600581901b85016020015160019190610303906001600160a01b031661067e565b50016102d9565b507f056e02eadf378bb204991810c69f5fd30d0c5daa999b3432711954755cff9a0080546001600160a01b0319166001600160a01b038516179055604051615fb592909190836109e18439608051836146e4015260a051836147b0015260c051836146b5015260e0518361473301526101005183614759015261012051836120bf015261014051836120e9015251828181610d710152818161184101528181611c910152818161207e0152614b46015251818181610b80015261231d0152f35b634e487b7160e01b5f52604160045260245ffd5b015190505f806101fd565b60025f9081525f805160206169b68339815191529350601f198516905b818110610442575090846001959493921061042a575b505050811b01600255610212565b01515f1960f88460031b161c191690555f808061041c565b92936020600181928786015181550195019301610406565b60025f529091505f805160206169b6833981519152601f840160051c810191602085106104ab575b90601f859493920160051c01905b81811061049d57506101e7565b5f8155849350600101610490565b9091508190610482565b634e487b7160e01b5f52602260045260245ffd5b91607f16916101d3565b90508301515f61019c565b60015f90815292505f805160206169d6833981519152905b601f1983168410610536576001935082601f1981161061051e575b5050811b016001556101b0565b8501515f1960f88460031b161c191690555f80610511565b858101518255602093840193600190920191016104f6565b60015f525f805160206169d6833981519152601f830160051c810160208410610593575b601f830160051c82018110610588575050610186565b5f8155600101610572565b5080610572565b90607f1690610174565b5f80fd5b602080916105b5846105fe565b8152019101906100ac565b604081019081106001600160401b038211176103ca57604052565b601f909101601f19168101906001600160401b038211908210176103ca57604052565b51906001600160a01b03821682036105a457565b6001600160a01b03165f8181525f805160206169f6833981519152602052604090205460ff16610679575f8181525f805160206169f683398151915260205260408120805460ff191660011790553391905f805160206169968339815191528180a4600190565b505f90565b6001600160a01b03165f8181527f2a1c876995cd4a57e905c1e774dbbf9c042071dd6e15eba11379d9c34d645f2760205260409020547f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d919060ff1661071657815f525f60205260405f20815f5260205260405f20600160ff1982541617905533915f805160206169968339815191525f80a4600190565b50505f90565b8051602090818110156107925750601f825111610754578082519201519080831061074657501790565b825f19910360031b1b161790565b60448260405192839163305a27a960e01b83528160048401528051918291826024860152018484015e5f828201840152601f01601f19168101030190fd5b906001600160401b0382116103ca57600754926001938481811c9116801561089a575b838210146104b557601f8111610866575b5081601f841160011461080257509282939183925f946107f7575b50501b915f199060031b1c19161760075560ff90565b015192505f806107e1565b919083601f19811660075f52845f20945f905b8883831061084c5750505010610834575b505050811b0160075560ff90565b01515f1960f88460031b161c191690555f8080610826565b858701518855909601959485019487935090810190610815565b60075f5284601f845f20920160051c820191601f860160051c015b82811061088f5750506107c6565b5f8155018590610881565b90607f16906107b5565b8051602090818110156108ce5750601f825111610754578082519201519080831061074657501790565b906001600160401b0382116103ca57600854926001938481811c911680156109d6575b838210146104b557601f81116109a2575b5081601f841160011461093e57509282939183925f94610933575b50501b915f199060031b1c19161760085560ff90565b015192505f8061091d565b919083601f19811660085f52845f20945f905b888383106109885750505010610970575b505050811b0160085560ff90565b01515f1960f88460031b161c191690555f8080610962565b858701518855909601959485019487935090810190610951565b60085f5284601f845f20920160051c820191601f860160051c015b8281106109cb575050610902565b5f81550185906109bd565b90607f16906108f156fe60a080604052600436101561001c575b50361561001a575f80fd5b005b5f905f3560e01c908163014c09991461367f5750806301ffc9a71461353457806306fdde031461348a578063081812fc1461344d578063095ea7b31461333c5780630cd55abf1461330457806318160ddd146132e2578063222142d014612f1157806323b872dd14612ef9578063248a9ca314612ecd57806328a98ebb14611bfd5780632f2ff15d14612e905780633644e51514612e6d57806336568abe14612e0d578063389ed26714612dd25780633c5343b7146128995780633ec15f551461249f5780633f4ba83a1461242157806342842e0e146123f957806343236d31146123415780634e998e9f146122fd5780635c975abb146122da5780635faf45bd146122be5780636352211e1461228e57806370a082311461221e578063823abfd9146121dd5780638456cb591461218757806384b0196e146120a25780638f75315b1461205e57806391d148541461201457806395c0465a14611fcd57806395d89b4114611eee578063990bb1db14611c19578063a217fddf14611bfd578063a22cb46514611b42578063b3d23ffc14611b18578063b88d4fde14611ab0578063be26a685146117cf578063c84a8b2d14610c35578063c87b56dd14610b2a578063d547741f14610ae9578063e985e9c514610a96578063f41cc8e6146103245763f7a95a9e0361000f57346103215760206003193601126103215761023260043561022881614aea565b8281959394615339565b5094929590508151916001926001810180911161030d57610252906140a2565b9661025c886141e6565b5281835b6102b7575b61029887876001600160a01b03886bffffffffffffffffffffffff6102a68e6040519788976080895260808901906138d0565b90878203602089015261390c565b931660408501521660608301520390f35b81518110156103085760406102cc82846141f3565b5101518482018083116102f4579185949392916102ea86938c6141f3565b5201909192610260565b602485634e487b7160e01b81526011600452fd5b610265565b602483634e487b7160e01b81526011600452fd5b80fd5b5060606003193601126103215761033961385f565b6044359161034636613ad6565b6103536040519182613ab3565b36815281602082019261032157509061039e91365f83375f602036830101525190207fffffffff000000000000000000000000000000000000000000000000000000005f3516614426565b6103aa33600435613f1f565b15610a58576103b7614c9f565b6103bf6150cd565b6103ca600435614aea565b9391906103db818684600435615339565b9350919790955f1981145f14610a5257506001600160a01b03871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8114610a28576020602491604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523360048301525afa908115610885575f916109f6575b50965b87156109cc576001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee036108f2578747106108ba575f8080808b6001600160a01b0387165af16104a36143a5565b50156108905760206105046001600160a01b03935b6040517f688e89c10000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602481018c905294859283915f9183906044820190565b0393165af1918215610885575f9261084d575b5061052283516140a2565b968261052d896141e6565b52610537856141e6565b51610541896141e6565b51906103e8830180841161078457600182018092116107845761056392615d76565b8015610823576105768161057c93614bce565b96614bce565b946bffffffffffffffffffffffff87165f52601060205260405f20556001600160a01b0385116107eb576040516105b281613a27565b6bffffffffffffffffffffffff871681526001600160a01b03861660208201526004355f52601160205260405f20907fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060206bffffffffffffffffffffffff83511692015160601b1617905560015b89518111610798576001600160a01b0361063b82866141f3565b511690805f198101116107845761070e916106595f1983018d6141f3565b51610664838c6141f3565b5161066f848a6141f3565b519060208301928c858551957effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff871496871597610779575b926106d09288926040969584610743575b50505060608401966106cb8a8951936152d7565b615de9565b01916106dd828451613c10565b8c15908161073a575b501561071357505050506106fc90600435615312565b5f5260146020525f6040812055613ebd565b610621565b610727610735959261073092519451613c10565b91600435615312565b615eb7565b613ebd565b9050155f6106e6565b6107719261075c91610757895192876152d7565b6157ba565b5185519061076c8c600435615312565b6158b4565b885f806106b7565b8451151597506106a6565b634e487b7160e01b5f52601160045260245ffd5b602083838b6001600160a01b0360405192168252838201528160408201527fe6f465f75f051a88424472e386594cfdfb99d55d7682d9cd8977ba1d7fce5e5d606060043592a26001600f55604051908152f35b604485604051907f6dfcc65000000000000000000000000000000000000000000000000000000000825260a060048301526024820152fd5b60046040517fcade8d54000000000000000000000000000000000000000000000000000000008152fd5b9091506020813d60201161087d575b8161086960209383613ab3565b810103126108795751905f610517565b5f80fd5b3d915061085c565b6040513d5f823e3d90fd5b60046040517fd6bda275000000000000000000000000000000000000000000000000000000008152fd5b6044884790604051917fcf47918100000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b9060205f604051828101907f23b872dd0000000000000000000000000000000000000000000000000000000082523360248201526001600160a01b03851660448201528b60648201526064815261094881613a5f565b5190826001600160a01b0387165af115610885575f513d6109c357506001600160a01b0382163b155b610989579060206105046001600160a01b03936104b8565b6024826001600160a01b03604051917f5274afe7000000000000000000000000000000000000000000000000000000008352166004820152fd5b60011415610971565b60046040517f3a093b82000000000000000000000000000000000000000000000000000000008152fd5b90506020813d602011610a20575b81610a1160209383613ab3565b8101031261087957515f610456565b3d9150610a04565b60046040517f8c59b85b000000000000000000000000000000000000000000000000000000008152fd5b96610459565b60646040517fb05bc54c00000000000000000000000000000000000000000000000000000000815260043560048201523360248201525f6044820152fd5b503461032157604060031936011261032157610ab0613849565b6040610aba61385f565b926001600160a01b03809316815260066020522091165f52602052602060ff60405f2054166040519015158152f35b503461032157604060031936011261032157610b26600435610b0961385f565b9080845283602052610b21600160408620015461460d565b6147d6565b5080f35b503461032157602060031936011261032157604051907fe9dc6375000000000000000000000000000000000000000000000000000000008252306004830152600435602483015280826044816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa908115610c29578091610bca575b60405160208082528190610bc690820185613824565b0390f35b90503d8082843e610bdb8184613ab3565b820191602081840312610c255780519067ffffffffffffffff8211610c2157019082601f830112156103215750610bc691816020610c1b9351910161436f565b5f610bb0565b8280fd5b5080fd5b604051903d90823e3d90fd5b5060e060031936011261032157610c4a613982565b90610c5361385f565b91610c5c613875565b67ffffffffffffffff91906084358381116117cb57610c7f90369060040161389f565b9460a435858111610c2557610c989036906004016137f6565b97909560c435908111610c2157610cb39036906004016137f6565b9290610cbe36613ad6565b610ccb6040519182613ab3565b82368252610c2157610d1690365f60208301375f60203683010152602081519101207fffffffff000000000000000000000000000000000000000000000000000000005f3516614426565b610d1e614c9f565b610d266150cd565b604051907fa785a2520000000000000000000000000000000000000000000000000000000082526bffffffffffffffffffffffff881660048301526020826024816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa918215610885575f9261179a575b506bffffffffffffffffffffffff88165f52601060205260405f205496604051957fa69a2ad10000000000000000000000000000000000000000000000000000000087525f876004816001600160a01b0388165afa978815610885575f975f99611770575b50610e10896141e6565b5160018101809111610784576103e88b018b1161078457610e36906103e88c0190615bb1565b5087519c8d5f1981011161078457610e505f198f0161408a565b6040519e8f91610e609083613ab3565b5f1901808252610e6f9061408a565b601f1901905f5b8281106117575750505060015b8951811015610f895780610f1c8d8f93610eb38f918f610eab826001600160a01b03926141f3565b5116926141f3565b5191610ebd615785565b95610ef7610ecb84836152d7565b5f52601260205260405f20548060691c916001806cffffffffffffffffffffffffff84821c1693161490565b909491929015610f5f57610f1391610f0e916152d7565b615f16565b9390939461593e565b8452602084015260608301525f6040830152805f19810111610784578f610f5890600193610f4d5f198501836141f3565b525f198301906141f3565b5001610e83565b50507effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff925f9461593e565b508d9a9896979b999c8f6001600160a01b0388163b1561087957610feb915f9160405193849283927fbf9766fe000000000000000000000000000000000000000000000000000000008452336004850152604060248501526044840191613bb8565b0381836001600160a01b038c165af1801561088557611744575b50611011600d54613ebd565b9788600d556001600160a01b0385161561171357885f5260036020526001600160a01b0360405f205416806116c4575b6001600160a01b0386165f52600460205260405f2060018154019055895f52600360205260405f206001600160a01b0387167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055896001600160a01b038716827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4806116b4575b61168357506110e081838a614eca565b6044351961167b5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038d1614610a28576001600160a01b0360208d6024604051809481937f70a08231000000000000000000000000000000000000000000000000000000008352336004840152165afa908115610885575f91611649575b505b80156109cc578c6001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee036115705750804710611538575f808080846001600160a01b038c165af16111a86143a5565b50156108905760208161120b988f5b5f6001600160a01b03604051809d819682957f688e89c100000000000000000000000000000000000000000000000000000000845260048401602090939291936001600160a01b0360408201951681520152565b0393165af1968715610885578e905f98611500575b509961124161123b9b896112348c516140a2565b9d8e6141e6565b526141e6565b5161124b8c6141e6565b51906001810180911161078457611267916103e8840190615d76565b908115610823578161127891614bce565b6bffffffffffffffffffffffff8d165f52601060205260405f20556001600160a01b0381116114c8576001600160a01b038c916bffffffffffffffffffffffff604051936112c585613a27565b168352166020820152895f52601160205260405f20907fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060206bffffffffffffffffffffffff83511692015160601b1617905560015b8c51811161142e576001600160a01b03611335828b6141f3565b511690805f19810111610784578f8d8f8d8f9195610735946113748761136d816113666113f49c5f198301906141f3565b51976141f3565b51926141f3565b519360208101958651967effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff881497881598611423575b926113d889879694610730988a6040966113ee99856113f9575b50505050606084019a6106cb898d51936152d7565b01956113e5828851613c10565b50519551613c10565b92615312565b61131b565b61141a9361140d916107578a5192886152d7565b5161076c8b885193615312565b878a5f806113c3565b8351151598506113a9565b50889750604098947f1e6b7f03e4dd12e1b0d405c0b979022dbd96a49cb92877ab8021ac800f0d7eda946001600160a01b038f6bffffffffffffffffffffffff968f966114b496846114a4946040519b8c9b168b521660208a01528f8901528c606089015260c0608089015260c08801916149b0565b9285840360a08701521697613bb8565b0390a36001600f5582519182526020820152f35b604490604051907f6dfcc65000000000000000000000000000000000000000000000000000000000825260a060048301526024820152fd5b9750506020873d602011611530575b8161151c60209383613ab3565b81010312610879579551958d611241611220565b3d915061150f565b6044904790604051917fcf47918100000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5f6020916040999394959697989951826001600160a01b03858301927f23b872dd0000000000000000000000000000000000000000000000000000000084523360248201528188166044820152886064820152606481526115d081613a5f565b5193165af115610885575f513d61164057506001600160a01b038d163b155b611606579060208161120b9897969594938f6111b7565b60248d6001600160a01b03604051917f5274afe7000000000000000000000000000000000000000000000000000000008352166004820152fd5b600114156115ef565b90506020813d602011611673575b8161166460209383613ab3565b8101031261087957518e61115a565b3d9150611657565b60443561115c565b602490604051907f73c6ac6e0000000000000000000000000000000000000000000000000000000082526004820152fd5b600a6020524360405f20556110d0565b6116fb8a5f52600560205260405f207fffffffffffffffffffffffff00000000000000000000000000000000000000008154169055565b805f52600460205260405f205f198154019055611041565b602490604051907f64a0ae920000000000000000000000000000000000000000000000000000000082526004820152fd5b61174f9198506139ff565b5f968d611005565b6020918282611764615785565b92010152018f90610e76565b9098506117909197503d805f833e6117888183613ab3565b810190614537565b969096975f610e06565b6117bd91925060203d6020116117c4575b6117b58183613ab3565b8101906140d3565b905f610da1565b503d6117ab565b8480fd5b5034610321576020908160031936011261032157600435906117f082614b92565b936001600160a01b03906bffffffffffffffffffffffff604051937fa785a25200000000000000000000000000000000000000000000000000000000855216948560048501526024938281602481877f0000000000000000000000000000000000000000000000000000000000000000165afa908115611a885784929187918291611a93575b506004604051809781937f6ff97f1d000000000000000000000000000000000000000000000000000000008352165afa938415611a88578694611a64575b5083515f1990818101908111611a50576118cd906140a2565b958551828101908111611a3c576118e79098919298614189565b9760019283805b61193d575b8c8c610bc68d61192f8e6119218f8f8f604051998a998a52169088015260a0604088015260a08701906138d0565b90858203606087015261390c565b90838203608085015261399d565b8851811015611a375761195c87611954838c6141f3565b511687615312565b845260148852604084205483820190828211611a245791611a19828e8c8f8f8d8f61199e8f9e9d9c9b8f9b948b916119986119b9975f996141f3565b526141f3565b51169083856040516119af81613a27565b8281520152615312565b916040516119c681613a27565b82815201525f5260158d5260405f208d604051916119e383613a27565b547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116835260f81c9082015261199883836141f3565b5001909192936118ee565b8386634e487b7160e01b81526011600452fd5b6118f3565b602489634e487b7160e01b81526011600452fd5b602488634e487b7160e01b81526011600452fd5b611a819194503d8088833e611a798183613ab3565b810190614163565b925f6118b4565b6040513d88823e3d90fd5b611aaa9150853d87116117c4576117b58183613ab3565b5f611876565b503461032157608060031936011261032157611aca613849565b611ad261385f565b6064359167ffffffffffffffff8311611b145736602384011215611b1457611b07611b11933690602481600401359101613af2565b9160443591614207565b80f35b8380fd5b50346103215760206003193601126103215760406020916004358152600a83522054604051908152f35b503461032157604060031936011261032157611b5c613849565b60243590811515809203610c21576001600160a01b0316908115611bcc57338352600660205260408320825f5260205260405f2060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b602482604051907f5b08ba180000000000000000000000000000000000000000000000000000000082526004820152fd5b5034610321578060031936011261032157602090604051908152f35b503461032157602080600319360112610c2557611c34613982565b6bffffffffffffffffffffffff811692838152601083526040812054916001600160a01b0394604051907fa785a252000000000000000000000000000000000000000000000000000000008252600482015260249085816024818a7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611ee357938093929188958291611ec6575b506004604051809a81937f6ff97f1d000000000000000000000000000000000000000000000000000000008352165afa968715611ebb578397611e9f575b508651905f19918281019081116102f457611d20906140a2565b938851838101908111611e8b57611d3b909691929396614189565b9560019384805b611d89575b8a8a610bc68b8f8c611d6d611d7b926080604051988998895288015260808701906138d0565b90858203604087015261390c565b90838203606085015261399d565b8b51811015611e8657611da884611da0838f6141f3565b5116886152d7565b855260128b52604085205483820190828211611e735791611e67828f8f90828f8f8f8f9e9d8f9a8a829f9e9d97611e6098611998611de994611e04986141f3565b5116905f87604051611dfa81613a27565b82815201526152d7565b5f85604051611e1281613a27565b82815201525f526013845260405f209360405194611e2f86613a27565b547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116865260f81c908501526141f3565b528c6141f3565b50019091929394611d42565b8387634e487b7160e01b81526011600452fd5b611d47565b602482634e487b7160e01b81526011600452fd5b611eb49197503d8085833e611a798183613ab3565b955f611d06565b6040513d85823e3d90fd5b611edd9150883d8a116117c4576117b58183613ab3565b5f611cc8565b6040513d86823e3d90fd5b50346103215780600319360112610321576040516002545f82611f1083613bd8565b91828252602093600190856001821691825f14611fad575050600114611f52575b50611f3e92500383613ab3565b610bc6604051928284938452830190613824565b84915060025f527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace905f915b858310611f95575050611f3e935082010185611f31565b80548389018501528794508693909201918101611f7e565b60ff191685820152611f3e95151560051b8501019250879150611f319050565b50346103215760206003193601126103215760406001600160a01b03611ff4600435614aea565b90506bffffffffffffffffffffffff849392935193168352166020820152f35b5034610321576040600319360112610321576001600160a01b03604061203861385f565b926004358152806020522091165f52602052602060ff60405f2054166040519015158152f35b503461032157806003193601126103215760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461032157806003193601126103215761215a90610bc66120e37f0000000000000000000000000000000000000000000000000000000000000000615103565b9161210d7f000000000000000000000000000000000000000000000000000000000000000061521a565b6121686040519161211d83613a7b565b8383526040519687967f0f00000000000000000000000000000000000000000000000000000000000000885260e0602089015260e0880190613824565b908682036040880152613824565b9146606086015230608086015260a085015283820360c085015261390c565b50806003193601126103215761219b61457b565b6121a36150cd565b600160ff19600e541617600e557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b5034610321576060600319360112610321576121f761385f565b6044359060ff821682036108795760209161221491600435614002565b6040519015158152f35b5034610321576020600319360112610321576001600160a01b03612240613849565b16801561225d578160409160209352600483522054604051908152f35b602482604051907f89c62b640000000000000000000000000000000000000000000000000000000082526004820152fd5b50346103215760206003193601126103215760206122ad6004356143d4565b6001600160a01b0360405191168152f35b5034610321578060031936011261032157602060405160018152f35b5034610321578060031936011261032157602060ff600e54166040519015158152f35b503461032157806003193601126103215760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461032157602080600319360112610c255760043567ffffffffffffffff8111610c215761237490369060040161389f565b835b818110612381578480f35b61238c818385613e8f565b35906001600160a01b0361239f836143d4565b1633036123cf576123c96001926123c36123ba848789613e8f565b88810190613ecb565b91614a9b565b01612376565b60046040517f30cd7471000000000000000000000000000000000000000000000000000000008152fd5b503461032157611b1161240b3661393f565b906040519261241984613a7b565b858452614207565b50806003193601126103215761243561457b565b600e5460ff8116156124755760ff1916600e557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a180f35b60046040517f8dfc202b000000000000000000000000000000000000000000000000000000008152fd5b50346103215760606003193601126103215767ffffffffffffffff600435818111610c21576124d290369060040161389f565b91604435908111611b14576124eb9036906004016137f6565b602493919335421161286f57811561285b5761251061250a8480613e5c565b356143d4565b936001600160a01b038516865260096020526040862080549061253282613ebd565b905561253d846140a2565b875b8581106126d1575091604261260b92612612959460405161257681612568602082018095614e64565b03601f198101835282613ab3565b519020906040519060208201927f0939341519d8488b1c4ba8e12475aebc95fa0e922a6e7750d72a080d50d84e468452604083015260608201526024356080820152608081526125c581613a5f565b5190206125d06146ab565b90604051917f190100000000000000000000000000000000000000000000000000000000000083526002830152602282015220923691613af2565b90856148e4565b156126a757835b818110612624578480f35b61262f818385613e8f565b35908061265b575b6126556001926123c361264b848789613e8f565b6020810190613ecb565b01612619565b6001600160a01b0361266c836143d4565b166001600160a01b03861603156126375760046040517f30cd7471000000000000000000000000000000000000000000000000000000008152fd5b60046040517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6126dc818789613e8f565b6126e96020820182613ecb565b906126f3826140a2565b918c5b81811061277557505050906001929160405161271a81612568602082018095614e64565b5190206040519060208201927f4117385a018374d44b0a1b9c3c6b069440760fd187e9b88bfdbe6f66e0288d6b845235604083015260608201526060815261276181613a43565b51902061276e82856141f3565b520161253f565b8d612781828486613e8f565b908135916001600160a01b0383168303610c25578060206127a3920190613ecb565b9190604051916020830193849291905b80821061283957505050906127d68160019695949303601f198101835282613ab3565b519020604051906001600160a01b0360208301937fd9daa4fe1723edf458fc13a2d7c6e9147a88485b7932c0ada7e0dd16445f0dda855216604083015260608201526060815261282581613a43565b51902061283282876141f3565b52016126f6565b90919260208060019260ff61284d88613974565b1681520194019201906127b3565b602485634e487b7160e01b81526032600452fd5b60046040517ff87d9271000000000000000000000000000000000000000000000000000000008152fd5b5060806003193601126103215760243567ffffffffffffffff8111610c25576128c690369060040161389f565b60449291923567ffffffffffffffff8111610c21576128e990369060040161389f565b906128f2613875565b936128fc36613ad6565b6129096040519182613ab3565b36815281602082019261032157509061295491365f83375f602036830101525190207fffffffff000000000000000000000000000000000000000000000000000000005f3516614426565b61296033600435614c44565b612968614c9f565b612973600435614aea565b90939195612985858389600435615339565b919a93999298909788518414801590612dc8575b612ada576129a836858f614849565b976129c36129b58261408a565b604051608052608051613ab3565b6080515080608051526020608051019060051b82019136831161087957905b828210612db8575050506129f8608051516140a2565b9b5f5b8851811015612b04576001600160a01b0380612a17838c6141f3565b511690612a24838d6141f3565b511603612ada5780612ab8578b905b5f19612a41826080516141f3565b51141580612aa3575b612a79578e612a7282600194612a62826080516141f3565b51908180821091180218926141f3565b52016129fb565b60046040517f356680b7000000000000000000000000000000000000000000000000000000008152fd5b50612ab0816080516141f3565b518210612a4a565b805f19810111610784576040612ad15f1983018d6141f3565b51015190612a33565b60046040517f97bbce98000000000000000000000000000000000000000000000000000000008152fd5b508c9697508a908c8b6001600160a01b03956040519b7f3c5343b7000000000000000000000000000000000000000000000000000000008d528c600435906004015260248d01608090528c8c60848201612b5f908c8961489f565b828103600319016044840152612b749161390c565b898d166064830152038d89831691815a5f948591f19c8d15610885575f9d612ce9575b50905f88926004604051809581937fa69a2ad1000000000000000000000000000000000000000000000000000000008352165afa928315610885577fe9bbd9b78b9f527278ce2df08e6b9672c9d4dda90d7021a29e9f17b231b254839a612c4198612c33988f95978d612c21995f99612cc7575b50612c189036908c614849565b93600435614cda565b6040519460608652606086019161489f565b83810360208501528661390c565b9316604082015280600435930390a26001916001600f55612c6d6040519260408452604084019061390c565b8281036020840152602080835192838152019201905f5b818110612c915784840385f35b9091928351906002821015612cb3579081526020908101930191908501612c84565b634e487b7160e01b5f52602160045260245ffd5b612c18919950612ce0903d805f833e6117888183613ab3565b90509890612c0b565b909c503d805f833e612cfb8183613ab3565b602082828101031261087957815167ffffffffffffffff811161087957818301601f828501011215610879578083015190612d358261408a565b93612d436040519586613ab3565b8285526020850193810160208460051b8484010101116108795792836020838e9897969594950101935b60208460051b82840101018510612d8e5750505050505f909d919250612b97565b90919293809596975051926002841015610879579283528c96959460209081019493019190612d6d565b81358152602091820191016129e2565b5083881415612999565b503461032157806003193601126103215760206040517f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d8152f35b503461032157604060031936011261032157612e2761385f565b336001600160a01b03821603612e4357610b26906004356147d6565b60046040517f6697b232000000000000000000000000000000000000000000000000000000008152fd5b50346103215780600319360112610321576020612e886146ab565b604051908152f35b503461032157604060031936011261032157610b26600435612eb061385f565b9080845283602052612ec8600160408620015461460d565b61462e565b503461032157602060031936011261032157600160406020926004358152808452200154604051908152f35b503461032157611b11612f0b3661393f565b91613c1d565b5060a06003193601126103215760443567ffffffffffffffff8111610c2557612f3e90369060040161389f565b909160643567ffffffffffffffff8111610c2557612f609036906004016137f6565b9290608435926001600160a01b038416840361087957612f7f36613ad6565b612f8c6040519182613ab3565b368152816020820192610321575091612fe061306792613079969594365f83375f602036830101525190207fffffffff000000000000000000000000000000000000000000000000000000005f3516614426565b612fec33600435614c44565b612ff4614c9f565b612fff600435614aea565b915f613012838584600498969835615339565b9e939a929c9196909d6040519a8b9586957f222142d00000000000000000000000000000000000000000000000000000000087526004356004880152602435602488015260a0604488015260a4870191613b7b565b91600319858403016064860152613bb8565b6001600160a01b038b1660848301520381836001600160a01b0388165af1968715610885575f915f945f975f9a613209575b505f6001600160a01b03916004604051809481937fa69a2ad1000000000000000000000000000000000000000000000000000000008352165afa908115610885576131c19d610bc69c8e6119219a6131dd9d6131cf9a613117988b975f996131eb575b50600435614cda565b7e34b143843e14a5149618f84f16bc0a3179dc0bfb8e71ab16e8d83d83485d768a6001600160a01b0361319961318b61317d61316f6131616040519660c0885260c08801906138d0565b86810360208801528961390c565b85810360408701528a6138d0565b84810360608601528b61390c565b83810360808501528c613824565b931660a082015280600435930390a26001600f55604051998a9960a08b5260a08b01906138d0565b9089820360208b015261390c565b9087820360408901526138d0565b908382036080850152613824565b6132009199503d805f833e6117888183613ab3565b9050975f61310e565b93509850955092503d92835f833e6132218483613ab3565b608082858101031261087957815167ffffffffffffffff81116108795761324d908584019084016144d6565b95602083015167ffffffffffffffff811161087957613271908685019085016140f2565b92604081015167ffffffffffffffff811161087957613295908783019083016144d6565b95606082015167ffffffffffffffff811161087957820191818101601f84011215610879576001600160a01b03925f926132d692019060208151910161436f565b989496989a91506130ab565b50346103215780600319360112610321576020612e88600d54600c5490613c10565b50346103215760206003193601126103215760406020916001600160a01b0361332b613849565b168152600983522054604051908152f35b503461032157604060031936011261032157613356613849565b602435613362816143d4565b3315158061343a575b80613410575b6133e05781906001600160a01b03809416938491167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9255f80a45f52600560205260405f20907fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905580f35b60246040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152336004820152fd5b506001600160a01b0381165f52600660205260405f20335f5260205260ff60405f20541615613371565b50336001600160a01b038216141561336b565b5034610321576020600319360112610321576001600160a01b036040602092600435613478816143d4565b50815260058452205416604051908152f35b50346103215780600319360112610321576040515f600182600154926134af84613bd8565b92838352602094856001821691825f14611fad5750506001146134d95750611f3e92500383613ab3565b84915060015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6905f915b85831061351c575050611f3e935082010185611f31565b80548389018501528794508693909201918101613505565b5034610321576020600319360112610321576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103610c2557807f7965db0b0000000000000000000000000000000000000000000000000000000060209214908115613655575b8180156135e6575b5081156135bc575b506040519015158152f35b7f29b3c11500000000000000000000000000000000000000000000000000000000915014826135b1565b9091507f80ac58cd00000000000000000000000000000000000000000000000000000000821490811561362b575b8115613623575b5090836135a9565b90508361361b565b7f5b5e139f0000000000000000000000000000000000000000000000000000000083149150613614565b7f01ffc9a700000000000000000000000000000000000000000000000000000000811491506135a1565b823461087957600319906060823601126108795767ffffffffffffffff90600435828111610879578060040193604081833603011261087957602435848111610879576136d09036906004016137f6565b959094604435908111610879576136eb9036906004016137f6565b9690956001600160a01b037f056e02eadf378bb204991810c69f5fd30d0c5daa999b3432711954755cff9a00541692833b156108795761378f8a9586945f989461378061376f889660248d997fbb40eb0c000000000000000000000000000000000000000000000000000000008a52604060048b0152823560448b01520190613b28565b604060648901526084880191613b7b565b92858403016024860152613bb8565b03925af192831561088557610bc6946137cd946137e1575b5081926137b5913691613af2565b602081519101305af46137c66143a5565b9030614bdb565b604051918291602083526020830190613824565b6137ec9192506139ff565b5f906137b56137a7565b9181601f840112156108795782359167ffffffffffffffff8311610879576020838186019501011161087957565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b600435906001600160a01b038216820361087957565b602435906001600160a01b038216820361087957565b606435906001600160a01b038216820361087957565b35906001600160a01b038216820361087957565b9181601f840112156108795782359167ffffffffffffffff8311610879576020808501948460051b01011161087957565b9081518082526020808093019301915f5b8281106138ef575050505090565b83516001600160a01b0316855293810193928101926001016138e1565b9081518082526020808093019301915f5b82811061392b575050505090565b83518552938101939281019260010161391d565b6003196060910112610879576001600160a01b0390600435828116810361087957916024359081168103610879579060443590565b359060ff8216820361087957565b600435906bffffffffffffffffffffffff8216820361087957565b9081518082526020808093019301915f5b8281106139bc575050505090565b835180517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16865282015160ff1685830152604090940193928101926001016139ae565b67ffffffffffffffff8111613a1357604052565b634e487b7160e01b5f52604160045260245ffd5b6040810190811067ffffffffffffffff821117613a1357604052565b6080810190811067ffffffffffffffff821117613a1357604052565b60a0810190811067ffffffffffffffff821117613a1357604052565b6020810190811067ffffffffffffffff821117613a1357604052565b6060810190811067ffffffffffffffff821117613a1357604052565b90601f601f19910116810190811067ffffffffffffffff821117613a1357604052565b67ffffffffffffffff8111613a1357601f01601f191660200190565b929192613afe82613ad6565b91613b0c6040519384613ab3565b829481845281830111610879578281602093845f960137010152565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561087957016020813591019167ffffffffffffffff8211610879578160051b3603831361087957565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116108795760209260051b809284830137010190565b601f8260209493601f1993818652868601375f8582860101520116010190565b90600182811c92168015613c06575b6020831014613bf257565b634e487b7160e01b5f52602260045260245ffd5b91607f1691613be7565b9190820391821161078457565b916001600160a01b03809216918215613e2c57815f526020936003855260409482865f2054169433151580613d6c575b50848615159182613d1f575b805f5260048452885f2060018154019055815f5260038452885f20817fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055877fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4613d10575b501692838303613cd65750505050565b6064945051927f64283d7b000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b600a905243855f20555f613cc6565b613d56825f52600560205260405f207fffffffffffffffffffffffff00000000000000000000000000000000000000008154169055565b875f5260048452885f205f198154019055613c59565b80613deb575b15613d7d575f613c4d565b868587613db35760249151907f7e2732890000000000000000000000000000000000000000000000000000000082526004820152fd5b90517f177e802f0000000000000000000000000000000000000000000000000000000081523360048201526024810191909152604490fd5b503386148015613e10575b80613d725750845f52600582523384885f20541614613d72565b50855f5260068252865f20335f52825260ff875f205416613df6565b60246040517f64a0ae920000000000000000000000000000000000000000000000000000000081525f6004820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc181360301821215610879570190565b90821015613ea957613ea69160051b810190613e5c565b90565b634e487b7160e01b5f52603260045260245ffd5b5f1981146107845760010190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610879570180359067ffffffffffffffff821161087957602001918160051b3603831361087957565b90613f29826143d4565b6001600160a01b0391821691168114613fb757815f52600b60205260405f20905f5260205260405f206001602060405192613f6384613a27565b549277ffffffffffffffffffffffffffffffffffffffffffffffff8416815201918060c01c83521615159182613f9857505090565b9091505f52600a60205267ffffffffffffffff60405f20549151161190565b5050600190565b90613fc8826143d4565b6001600160a01b0391821691168114613fb757815f52600b60205260405f20905f5260205260405f206002602060405192613f6384613a27565b919061400d836143d4565b6001600160a01b039182169116811461408257825f52600b60205260405f20905f5260205260405f206040519061404382613a27565b54600160ff602077ffffffffffffffffffffffffffffffffffffffffffffffff94858516815201948360c01c8652161b161615159182613f9857505090565b505050600190565b67ffffffffffffffff8111613a135760051b60200190565b906140ac8261408a565b6140b96040519182613ab3565b828152601f196140c9829461408a565b0190602036910137565b9081602091031261087957516001600160a01b03811681036108795790565b9080601f830112156108795781519060209161410d8161408a565b9361411b6040519586613ab3565b81855260208086019260051b82010192831161087957602001905b828210614144575050505090565b81516001600160a01b0381168103610879578152908301908301614136565b9060208282031261087957815167ffffffffffffffff811161087957613ea692016140f2565b906141938261408a565b6040906141a36040519182613ab3565b838152601f196141b3829561408a565b01915f5b8381106141c45750505050565b60209082516141d281613a27565b5f8152825f818301528286010152016141b7565b805115613ea95760200190565b8051821015613ea95760209160051b010190565b91929092614216818585613c1d565b833b614223575b50505050565b6020906001600160a01b038095169461428460405194859384937f150b7a0200000000000000000000000000000000000000000000000000000000988986523360048701521660248501526044840152608060648401526084830190613824565b03815f875af15f9181614312575b506142e157826142a06143a5565b80519190826142da57602482604051907f64a0ae920000000000000000000000000000000000000000000000000000000082526004820152fd5b9050602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000160361171357505f80808061421d565b9091506020813d602011614367575b8161432e60209383613ab3565b8101031261087957517fffffffff000000000000000000000000000000000000000000000000000000008116810361087957905f614292565b3d9150614321565b92919261437b82613ad6565b916143896040519384613ab3565b829481845281830111610879578281602093845f96015e010152565b3d156143cf573d906143b682613ad6565b916143c46040519384613ab3565b82523d5f602084013e565b606090565b805f5260036020526001600160a01b0360405f2054169081156143f5575090565b602490604051907f7e2732890000000000000000000000000000000000000000000000000000000082526004820152fd5b6001600160a01b037f056e02eadf378bb204991810c69f5fd30d0c5daa999b3432711954755cff9a00541690813b156108795760647fffffffff00000000000000000000000000000000000000000000000000000000915f809460405196879586947f89d2174300000000000000000000000000000000000000000000000000000000865233600487015216602485015260448401525af18015610885576144cb5750565b6144d4906139ff565b565b9080601f83011215610879578151906020916144f18161408a565b936144ff6040519586613ab3565b81855260208086019260051b82010192831161087957602001905b828210614528575050505090565b8151815290830190830161451a565b9190916040818403126108795780519267ffffffffffffffff9384811161087957816145649184016140f2565b93602083015190811161087957613ea692016144d6565b335f9081527f2a1c876995cd4a57e905c1e774dbbf9c042071dd6e15eba11379d9c34d645f2760205260409020547f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d9060ff16156145d65750565b604490604051907fe2517d3f0000000000000000000000000000000000000000000000000000000082523360048301526024820152fd5b805f525f60205260405f20335f5260205260ff60405f205416156145d65750565b90815f525f6020526001600160a01b0360405f20911690815f5260205260ff60405f205416155f146146a557815f525f60205260405f20815f5260205260405f20600160ff1982541617905533917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163014806147ad575b15614706577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a0815260c0810181811067ffffffffffffffff821117613a135760405251902090565b507f000000000000000000000000000000000000000000000000000000000000000046146146dd565b90815f525f6020526001600160a01b0360405f20911690815f5260205260ff60405f2054165f146146a557815f525f60205260405f20815f5260205260405f2060ff19815416905533917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b92916148548261408a565b916148626040519384613ab3565b829481845260208094019160051b810192831161087957905b8282106148885750505050565b8380916148948461388b565b81520191019061487b565b9190808252602080920192915f5b8281106148bb575050505090565b9091929382806001926001600160a01b036148d58961388b565b168152019501939291016148ad565b9091813b61491f576148f69192614e90565b506004811015612cb35715918261490c57505090565b6001600160a01b03918216911614919050565b5f91829160405161496d8161256860208201947f1626ba7e00000000000000000000000000000000000000000000000000000000998a87526024840152604060448401526064830190613824565b51915afa9061497a6143a5565b826149a2575b8261498a57505090565b90915060208180518101031261087957602001511490565b915060208251101591614980565b9190918192808352602080930192808260051b8601019483945f915b8483106149dd575050505050505090565b90919293949596601f1982820301835287357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1883603018112156108795790878692016060604092614a49848201936001600160a01b03614a3d8261388b565b16835286810190613b28565b9384919587840152520191905f905b808210614a785750505090806001929901930193019195949392906149cc565b9193806001929460ff614a8a88613974565b168152019401920187939291614a58565b614ae57ff8fe9363cb7d8da4ab3070e588f4081920921d71625d784cd90329f7782171dd9392614acc848285614eca565b60405193849384526040602085015260408401916149b0565b0390a1565b614af390614b92565b90916001600160a01b038092169160206bffffffffffffffffffffffff60248660405194859384927fa785a2520000000000000000000000000000000000000000000000000000000084521660048301527f0000000000000000000000000000000000000000000000000000000000000000165afa908115610885575f91614b79575090565b613ea6915060203d6020116117c4576117b58183613ab3565b906020915f526011825260405f2060405190614bad82613a27565b54906bffffffffffffffffffffffff82169182825260601c93849101529190565b9190820180921161078457565b90614bf0575080511561089057805190602001fd5b81511580614c3b575b614c01575090565b6024906001600160a01b03604051917f9996b315000000000000000000000000000000000000000000000000000000008352166004820152fd5b50803b15614bf9565b90614c4f8183613fbe565b15614c58575050565b906001600160a01b03606492604051927fb05bc54c000000000000000000000000000000000000000000000000000000008452600484015216602482015260016044820152fd5b6002600f5414614cb0576002600f55565b60046040517f3ee5aeb5000000000000000000000000000000000000000000000000000000008152fd5b93614cee614d029492989a9699979a6141e6565b5191614cf9886141e6565b51938987615573565b6001959015949086805b614d1c575b505050505050505050565b88518111614e5f576001600160a01b03614d3682846141f3565b5116905f1981019181831161078457614d52614dfc938c6141f3565b51614d5d838a6141f3565b51614d68848a6141f3565b51926020918c838501918a8c8451947effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861495861596614e54575b86614e2a575b50505083614dc19160608901996106cb888c51936152d7565b604080960191614dd2828451613c10565b81614e21575b5015614e02575050505f935090614df16014928a615312565b845252812055613ebd565b87614d0c565b610730929550614e1a91945061073596519451613c10565b918a615312565b9050155f614dd8565b614e4b93614e3e916107578a8d51936152d7565b5161076c878a5193615312565b8a8c5f80614da8565b895115159650614da2565b614d11565b80516020809201915f5b828110614e7c575050505090565b835185529381019392810192600101614e6e565b8151919060418303614ec057614eb99250602082015190606060408401519301515f1a90615703565b9192909190565b50505f9160029190565b5f52602091600b8352604092835f209167ffffffffffffffff90814316905f5b818110614efb575050505050505050565b614f06818389613e8f565b888136031261087957885190614f1b82613a27565b614f248161388b565b82528681013590868211610879570136601f8201121561087957803590614f4a8261408a565b91614f578c519384613ab3565b808352888084019160051b830101913683116108795789809101915b8383106150b55750840183905250508051614fa85750906001600160a01b0360019251165f528686525f898120555b01614eea565b9692975f9a9194959296999a925f935b89518510156150315760ff614fcd868c6141f3565b51169060c08210156150015777ffffffffffffffffffffffffffffffffffffffffffffffff600180931b1617940193614fb8565b6024828f51907f3ff2c1ac0000000000000000000000000000000000000000000000000000000082526004820152fd5b91999498509594600193509a9996919a7fffffffffffffffff00000000000000000000000000000000000000000000000077ffffffffffffffffffffffffffffffffffffffffffffffff808d519461508886613a27565b1684526001600160a01b038a85019389855251165f528a8a528c5f20935116915160c01b16179055614fa2565b81906150c084613974565b8152019101908990614f73565b60ff600e54166150d957565b60046040517fd93c0665000000000000000000000000000000000000000000000000000000008152fd5b60ff81146151595760ff811690601f821161512f576040519161512583613a27565b8252602082015290565b60046040517fb3512b0c000000000000000000000000000000000000000000000000000000008152fd5b50604051600754815f61516b83613bd8565b808352926020906001908181169081156151f55750600114615196575b5050613ea692500382613ab3565b91509260075f527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688935f925b8284106151dd5750613ea69450505081016020015f80615188565b855487850183015294850194869450928101926151c2565b905060209350613ea695925060ff1991501682840152151560051b8201015f80615188565b60ff811461523c5760ff811690601f821161512f576040519161512583613a27565b50604051600854815f61524e83613bd8565b808352926020906001908181169081156151f55750600114615278575050613ea692500382613ab3565b91509260085f527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3935f925b8284106152bf5750613ea69450505081016020015f80615188565b855487850183015294850194869450928101926152a4565b906001600160a01b03604051916bffffffffffffffffffffffff60208401941684521660408201526040815261530c81613a97565b51902090565b906001600160a01b0360405191602083019384521660408201526040815261530c81613a97565b92906bffffffffffffffffffffffff81165f52602092601060205260409060405f2054946001600160a01b0393604051947fa69a2ad10000000000000000000000000000000000000000000000000000000086525f86600481848298165afa948515610885575f965f96615551575b506153b2866141e6565b519360019460018101809111610784576103e88b01808c11610784576153d8918b615d76565b9a8851995f1994858c019b8c11610784576153f28c61408a565b9b6040519c615401908e613ab3565b808d5261540d9061408a565b601f1901845f8e5b83821061553a5750505050876001905b61543a575b5050505050505050505090919394565b8d8c8c81518410156155325785888c86936154a46154698a61545f886154bc9a6141f3565b51169687936141f3565b5192615473615785565b98615481610ecb85846152d7565b9095919390156155085761549891610f0e916152d7565b919091925b858761593e565b959196908095878b528a01528660608a01528c615a24565b87820152878201908282116154f557916154e68f92838d9c9b9a9998979695611998838f976141f3565b50019091929394959697615425565b60118c634e487b7160e01b5f525260245ffd5b50507effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905f9261549d565b50505061542a565b8282615544615785565b920101520185908e615415565b9095506155699196503d805f833e6117888183613ab3565b959095945f6153a8565b9394909295805f97145f146156af575050835b801561567a5785156156615761559f816155a593614bce565b94614bce565b935b6bffffffffffffffffffffffff80921693848252601060205260408220556001600160a01b0392838611615629577fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929160409182519661560788613a27565b87526020870195881686528152601160205220935116915160601b1617905590565b604486604051907f6dfcc65000000000000000000000000000000000000000000000000000000000825260a060048301526024820152fd5b61566e8161567493613c10565b94613c10565b936155a7565b50505050905f14613ea65760046040517fcade8d54000000000000000000000000000000000000000000000000000000008152fd5b5f9650906103e88301908184116107845760018101809111610784576156d6818385615d76565b9181156156ef576156ea9309151590614bce565b615586565b634e487b7160e01b5f52601260045260245ffd5b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161577a579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610885575f516001600160a01b0381161561577057905f905f90565b505f906001905f90565b5050505f9160039190565b604051906080820182811067ffffffffffffffff821117613a13576040525f6060838281528260208201528260408201520152565b9190917effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081841161587c5760ff831161584457907fff0000000000000000000000000000000000000000000000000000000000000091816040519561581e87613a27565b16855260ff60208601941684525f52601360205260405f20935116915160f81b16179055565b604483604051907f6dfcc650000000000000000000000000000000000000000000000000000000008252600860048301526024820152fd5b604484604051907f6dfcc65000000000000000000000000000000000000000000000000000000000825260f860048301526024820152fd5b9190917effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081841161587c5760ff831161584457907fff0000000000000000000000000000000000000000000000000000000000000091816040519561591887613a27565b16855260ff60208601941684525f52601560205260405f20935116915160f81b16179055565b9391935f93811580615a1b575b8015615a11575b156159ad575050505050505f917effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9160ff81145f1461598d5790565b6001810180911115613ea657634e487b7160e01b5f52601160045260245ffd5b8282939495969792105f146159d757505082916159cd916159d494615d76565b8094615d76565b92565b809392919694979550155f146159ef57505050929190565b91615a01615a0692615a0c9594613c10565b615c3c565b90614bce565b929190565b5060ff8714615952565b5082151561594b565b9291939596949683158015615ba7575b8015615b85575b615b7957615a498285615312565b5f5260146020528760405f2054926cffffffffffffffffffffffffff8460011c16956001808660691c9616145f14615b4e57615a8d91615a8891615312565b615f87565b919091925b8293105f14615b3c575050505090505f935f917effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff915b1590811591615b33575b50615ae0575b50505050905090565b615aeb818784615d76565b9080156156ef57615b1f96615b039309151590614bce565b9180831015615b2957615a0692615b1991613c10565b90615ce4565b805f808080615ad7565b5050505f90614bce565b9050155f615ad1565b615b4892949395615d76565b95615ac7565b5050507effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff885f92615a92565b50505050505050505f90565b50861580615b9e575b8015615a3b575060fe8114615a3b565b50821515615b8e565b5060ff8114615a34565b905f19825f09918215615c305782821115615c185781905f0990805f038116809104600280826003021880830282030280830282030280830282030280830282030280830282030280920290030292600182805f03040190831515900302915f0304170290565b50634e487b715f52156003026011186020526024601cfd5b509050156156ef575f90565b6d314dc6448d9338c15b0a0000000091818302915f1981850993838086109503948086039514615cd65784831115615cbe5790829109815f038216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b5050809250156156ef570490565b90808202905f1981840990828083109203918083039214615d5f576d314dc6448d9338c15b0a000000009082821115615d4d577f1162b7d342a2beeda1c86783f5d5621146f0d483891a49569e11cfda021a434d940990828211900360df1b910360211c170290565b634e487b715f5260116020526024601cfd5b50506d314dc6448d9338c15b0a0000000091500490565b91818302915f1981850993838086109503948086039514615cd65784831115615cbe5790829109815f038216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b909215615eb0576001905b727fffffffffffffffffffffffffffffffffffff808411615e7957506cffffffffffffffffffffffffff8411615e41579060ff915f526012602052169160011b9060691b171760405f2055565b604484604051907f6dfcc650000000000000000000000000000000000000000000000000000000008252606860048301526024820152fd5b83604491604051917f49221a2b00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5f90615df4565b909215615f0f576001905b727fffffffffffffffffffffffffffffffffffff808411615e7957506cffffffffffffffffffffffffff8411615e41579060ff915f526014602052169160011b9060691b171760405f2055565b5f90615ec2565b906020915f83604051615f2881613a27565b82815201525f526013825260405f2060405190615f4482613a27565b54907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908183169283825260f81c94859101528115615f8157509190565b90509190565b906020915f83604051615f9981613a27565b82815201525f526015825260405f2060405190615f4482613a27562f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5aceb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb500000000000000000000000004a3bd5cc16435f27e7b31e44e4e522c0bc413e90000000000000000000000001a00e1e311009e56e3b0b9ed6f86f5ce128a1c0100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000aa2c8c6d099bec1bef626f45cef7506b42b4ad00000000000000000000000000ba529b2254aa5b6885ab2e88d213c22069187f800000000000000000000000000000000000000000000000000000000000000020000000000000000000000001a00e1e311009e56e3b0b9ed6f86f5ce128a1c01000000000000000000000000b86da339b88d9697fa3acc55edd378e002676e01